高分求读取主板系列号的BCB源码。
或控件也行,但必须是在BCB5下能正常使用。 问题点数:200、回复次数:40Top
1 楼wyb_star(孤星)回复于 2001-11-18 10:33:18 得分 10
主板的序列就在内存中0xfec71处,不过只能在98下取出,2000不允许对这段内存进行操作,
所以取不出来!
不知道还有什么办法可以在2000下取出来!
Top
2 楼zzzsssccc(今天正为明天后悔)回复于 2001-11-18 13:29:10 得分 0
关注Top
3 楼liulynx(可能我能力不够,但我会尽力)回复于 2001-11-18 14:14:23 得分 0
请教wyb_star(孤星),加载主板的序列于内存中的时间和机理,主板的序列是存在BIOS中吗?Top
4 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-18 14:38:34 得分 0
f000:ec71,我看的是delphi的程序,不知bcb中怎么读取这段内存地址的数据?好像必需的用SectionSelector?!Top
5 楼cobi(我是小新)回复于 2001-11-18 14:45:39 得分 0
无法帮你找到这方面的内容,只有其他硬件信息的程序Top
6 楼pms(高山流水)回复于 2001-11-18 15:08:42 得分 0
或者能读取硬盘硬件系列号(非格式化后的卷标系列号)的控件或BCB源码也行。前几日从这里:http://home.online.tj.cn/user/dandy/ 下载了读取硬盘系列号控件和读取主板、CPU系列号控件,但我经试用后发现,读取主板、CPU系列号控件在Windows 2000和Windows 98下都不能正常使用,都会出现:EAccessViolation错误;而读取硬盘系列号控件在Windows 2000下能正常使用,而在Windows 98下不能正常使用。我写信给作者也没有回音。不知哪位delphi高手能将这两个控件修正一下?Top
7 楼wyb_star(孤星)回复于 2001-11-18 17:03:44 得分 0
to juqiang(巫山云雨方枪枪):
C++:$fec71
Pascal:0xfec71
该结束了吧!Top
8 楼wyb_star(孤星)回复于 2001-11-18 17:04:27 得分 10
写反了,是
pascal:$fec71
C++:0xfec71
Top
9 楼cobi(我是小新)回复于 2001-11-18 19:38:42 得分 20
char volname[255],filename[100];//buffer[512];
DWORD sno,maxl,fileflag ;
if (!(GetVolumeInformation(“G:”, volname,255,&sno,&maxl,&fileflag,filename,100)))
//如果返回值为假
Memo1→Lines→Add (“G驱中没有发现光盘”);
else
//如果返回值为真
{Memo1→Lines→Add (“G驱中光盘卷标为:”+String(volname));
Memo1→Lines→Add (“G驱中光盘序号为:”+String(sno));
void __fastcall TForm1::Button10Click(TObject *Sender)
{
/*GUID guid;
char address[30];
if(CoCreateGuid(&guid)!=S_OK)
ShowMessage("Error");
else
{
sprintf(address,
"%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X",
guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3],
guid.Data4[4],guid.Data4[5],guid.Data4[6],guid.Data4[7]);
address[25] ='\0';
ShowMessage(address);
} */
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
AnsiString MachineName;
char NetName[50];
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios( &ncb );
if (uRetCode!=0)
ShowMessage("网卡初始化失败!");
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
memset(ncb.ncb_callname,' ',NCBNAMSZ);
MachineName=Edit1->Text.UpperCase();
strncpy(ncb.ncb_callname,MachineName.c_str(),MachineName.Length());
ncb.ncb_buffer = (char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &ncb );
if ( uRetCode == 0 )
{
AnsiString Address;
int i;
Address="";
for(i=0;i<6;i++)
{
Address+=IntToHex((int)Adapter.adapt.adapter_address[i],2);
}
ShowMessage(Address);
}
}
//---------------------------------------------------------------------------
cpuid用汇编,但是只有p3才有,以前的是"genie intel"之类的.Top
10 楼pms(高山流水)回复于 2001-11-18 20:18:24 得分 0
to cobi(我是小新,我只有5岁):
你这代码,好象不对吧?我不要磁盘的卷标系列号,要的是硬盘的出厂系列号。另外,我要的是主板的系列号,而不是网卡的系列号。Top
11 楼pms(高山流水)回复于 2001-11-18 22:18:42 得分 0
看来这里越来越冷清了!高手也越来越少了!Top
12 楼pms(高山流水)回复于 2001-11-18 23:59:41 得分 0
转个地方看看。Top
13 楼knf(CTO-首席打字员)回复于 2001-11-19 00:02:51 得分 0
记得回来Top
14 楼pms(高山流水)回复于 2001-11-19 00:25:06 得分 0
好的!Top
15 楼CityHost(市长)回复于 2001-11-19 10:30:27 得分 0
DDK行Top
16 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-19 10:45:15 得分 10
我昨天找了一下,WindowManagement可以,你搜索msdn,找wmi就可以,我有时间尝试一下。Top
17 楼pms(高山流水)回复于 2001-11-19 13:04:04 得分 0
to juqiang(巫山云雨方枪枪)
我找不到什么啊?能不能再具体告知?谢谢!Top
18 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-19 14:33:40 得分 30
我贴上wmi例子:取硬盘各种参数的程序(包含硬盘序列号)。但是定义的PerfClass,我无法找到类似于“MSDiskDriver_PerformanceData”的声明(好像放到dll里面了)。查找msdn,这是个连接(关于主板的)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/us_prov_0pf6.asp
下面是取硬盘参数的代码:(你可能的需要安装wmi的sdk,我down了一个,8M多)
//***************************************************************************
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// File: dpdetail.cpp
//
// Description:
// This file implements the DiskPerfDetails() routine which
// demonstrates how to enumerate properties for the DiskPerf
// class and instances.
//
// Part of : WMIDiskPerf
//
// History:
//
//***************************************************************************
#include <wbemidl.h>
#include <stdio.h>
void ShowPropInfo( IWbemClassObject *pInst );
char PropListHeader[] =
"DiskPerf Property Descriptions:\n\n"
"WMI Data ID\tProperty\tDescription\n"
"======================================="
"=======================================\n"
"";
//==============================================================================
//
// DiskPerfDetails( IWbemServices * pIWbemServices )
//
//==============================================================================
void DiskPerfDetails( IWbemServices * pIWbemServices )
{
HRESULT hr;
long lLower, lUpper, lCount;
SAFEARRAY *psaNames = NULL;
BSTR PropName = NULL;
VARIANT vVal;
ULONG uReturned;
IEnumWbemClassObject *pEnum = NULL;
IWbemClassObject *pPerfData = NULL;
IWbemClassObject *pPerfInst = NULL;
IWbemQualifierSet *pQualSet = NULL;
VariantInit( &vVal );
// Alloc class name string for DiskPerf
BSTR PerfClass = SysAllocString( L"MSDiskDriver_PerformanceData" );
// Get the Descriptions for the WMIDataId properties in the Embedded class.
// Here the object info for the Class - MSDiskDriver_PerformanceData is
// retrieved and displayed.
// Collect object information for PerfClass
hr = pIWbemServices->GetObject( PerfClass,
0L,
NULL,
&pPerfData,
NULL );
SysFreeString( PerfClass );
if ( hr == WBEM_NO_ERROR )
{
// show the property description list header
printf( PropListHeader );
// Load up a safearray of property names
if ( ( pPerfData->GetNames( NULL,
WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY,
NULL,
&psaNames ) ) == WBEM_NO_ERROR )
{
// Get the upper and lower bounds of the Names array
if ( ( hr = SafeArrayGetLBound( psaNames, 1, &lLower ) ) == S_OK )
{
hr = SafeArrayGetUBound( psaNames, 1, &lUpper );
}
if ( hr != S_OK )
{
printf( "Problem with property name array.\n" );
}
else
{
BSTR WmiQual = SysAllocString( L"WmiDataId" );
BSTR DescQual = SysAllocString( L"Description" );
UINT uWmiId;
for ( lCount = lLower; lCount <= lUpper; lCount++ )
{
// get the property name for this element
if ( ( SafeArrayGetElement( psaNames,
&lCount,
&PropName)) == S_OK )
{
if ( ( pPerfData->GetPropertyQualifierSet( PropName, &pQualSet ) ) == WBEM_NO_ERROR )
{
// check to see if the property is a WMI data Item and save its description
// these are the DiskPerf counters
if ( ( pQualSet->Get( WmiQual, 0L, &vVal, NULL ) ) == WBEM_NO_ERROR )
{
uWmiId = vVal.lVal;
VariantClear( &vVal );
if ( ( pQualSet->Get( DescQual, 0L, &vVal, NULL ) ) == WBEM_NO_ERROR )
{
wprintf( L"( %d )\t\t%s\t%s\n", uWmiId, PropName, vVal.bstrVal );
VariantClear( &vVal );
}
}
pQualSet->Release( );
pQualSet = NULL;
}
SysFreeString( PropName );
}
}
SysFreeString( WmiQual );
SysFreeString( DescQual );
}
SafeArrayDestroy( psaNames );
}
pPerfData->Release( );
}
// Now that the data class info is displayed, go get the values for all the
// disk instances
PerfClass = SysAllocString( L"MSDiskDriver_Performance" );
// Create enumerator for all disk instances
hr = pIWbemServices->CreateInstanceEnum( PerfClass,
WBEM_FLAG_SHALLOW,
NULL,
&pEnum );
SysFreeString( PerfClass );
if ( hr == WBEM_NO_ERROR )
{
while ( pEnum->Next( INFINITE,
1,
&pPerfInst,
&uReturned ) == WBEM_NO_ERROR )
{
// Explicitly get the properties of InstanceName and Active state
// Get the Instance Name string
PropName = SysAllocString( L"InstanceName" );
if ( ( pPerfInst->Get( PropName,
0L,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
wprintf( L"\n%s\n", vVal.bstrVal );
VariantClear( &vVal );
}
// Get Active status boolean
PropName = wcscpy( PropName, L"Active" );
if ( ( pPerfInst->Get( PropName,
0L,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
wprintf( L"\t%s\t\t= %s\n", PropName, vVal.boolVal ? L"TRUE" : L"FALSE" );
VariantClear( &vVal );
}
// Get the performance data embedded object
PropName = wcscpy( PropName, L"PerfData" );
if ( ( pPerfInst->Get( PropName,
0L,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
if ( vVal.punkVal->QueryInterface( IID_IWbemClassObject,
(PVOID *) &pPerfData ) == S_OK )
{
// display the WMI data item from this instance
ShowPropInfo( pPerfData );
pPerfData->Release( );
}
VariantClear( &vVal );
}
SysFreeString( PropName );
pPerfInst->Release( );
}
pEnum->Release( );
}
else
{
printf( "Can't enumerate DiskPerf instances!\n" );
}
}
// Display property names and values for an instance.
void ShowPropInfo( IWbemClassObject *pInst )
{
HRESULT hr;
VARIANT vVal;
BSTR PropName;
if ( pInst )
{
hr = pInst->BeginEnumeration( WBEM_FLAG_LOCAL_ONLY );
while ( hr == WBEM_NO_ERROR )
{
if ( ( hr = pInst->Next( 0, &PropName,
&vVal,
NULL, NULL ) ) == WBEM_NO_ERROR )
{
switch( vVal.vt )
{
case VT_I4:
{
wprintf( L"\t%s\t= %d\n", PropName, vVal.lVal );
}
break;
case VT_BSTR:
{
wprintf( L"\t%s\t= %s\n", PropName, vVal.bstrVal );
}
break;
default:
{
wprintf( L"\t%s\t= NULL\n", PropName );
}
break;
}
VariantClear( &vVal );
SysFreeString( PropName );
}
}
pInst->EndEnumeration( );
}
}
Top
19 楼pms(高山流水)回复于 2001-11-19 14:57:37 得分 0
谢谢juqiang(巫山云雨方枪枪),你能不能告诉我wmi在哪下载吗?Top
20 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-19 15:04:24 得分 10
sdk for WMI:
http://download.microsoft.com/download/platformsdk/sdkx86/1.5/NT45/EN-US/wmisdk.exe
安装后的samples\vc\WMIDiskPerf目录下,有上面的程序,用vc6打开就可以了。M$说所有wmi的应用只能用vc6或更高版本进行,我没试验过CBuilder是否可以?我以前用ADSI建立虚拟目录(CBuilder3)就不可以。Top
21 楼pms(高山流水)回复于 2001-11-19 22:09:47 得分 0
CBuilder不行?唉,我空欢喜一场。Top
22 楼lubing317(天行者)回复于 2001-11-20 00:15:01 得分 0
不知所云Top
23 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-20 08:29:09 得分 0
hope M$ can help us!Top
24 楼pms(高山流水)回复于 2001-11-20 20:31:07 得分 0
还是转回来吧。Top
25 楼knf(CTO-首席打字员)回复于 2001-11-20 20:33:25 得分 0
这篇贴子转来转去都到了csdn的首页了,呵呵Top
26 楼wx_zzm()回复于 2001-11-22 21:15:25 得分 30
试试下面的代码,读取硬盘系列号的,我在VC6下调试通过。
void ReadIDE()
{
int al;
int i;
WORD pw[256];
char sn[21];
while((al=_inp(0x1F7))>=0x80) ;
_outp(0x1F6,0xA0);
al=WaitIde();
if((al&0x50)!=0x50) return;
_outp(0x1F6,0xA0);
_outp(0x1F7,0xEC);
al=WaitIde();
if((al&0x58)!=0x58) return;
for(i=0;i< 256;i++)
pw[i]=_inpw(0x1F0);
for(i=10;i<20;i++)
{
sn[(i-10)*2+0]=(char)(pw[i]>>8);
sn[(i-10)*2+1]=(char)pw[i];
}
sn[20]=0;
}Top
27 楼wx_zzm()回复于 2001-11-23 12:14:15 得分 0
补充一下:
上面的WaitIde 即while((al=_inp(0x1F7))>=0x80) ;
Top
28 楼knf(CTO-首席打字员)回复于 2001-11-23 12:32:52 得分 0
我看不懂:(Top
29 楼yxgsb(浪子小管)回复于 2001-11-23 12:57:03 得分 10
机器底层信息最好用汇编解决,我推荐一个办法:你知道,很多主板刷新程序如AworD Flash都能读出主板序列号,你找一个AworD Flash程序,然后反汇编,到http://asm.yeah.net下一个EXE2ASM程序,再解读程序看其中的办法!!!!Top
30 楼ggyy(带着一堆光棍找朋友!)回复于 2001-11-23 12:59:55 得分 10
在我们编写的程序中常常要和硬件打交道,那么如何在程序中确定系统中是否有该 设备,它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需 简单地利用几个API函数,硬件的问题并不神秘。下面就让我们一起看看在C++ Build er中是如何检测硬件的。
1. 检测CPU的型号
先让我们从最简单的做起,看一看自己的CPU型号。首先,在C++ Builder中画 出图1所示的窗体,在下面的几个例子中我们将一直使用这个窗体作示范,它包括一个用 来激活测试的Button和一个用来显示结果的Memo。我们可以用GetSystemInfo这个API获 得CPU的型号。将下列代码添加到Button的Click事件里就可以了:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//获得CPU型号
SYSTEM_INFO systeminfo;
GetSystemInfo (&systeminfo);
Memo1→Lines→Add(“您的CPU类型是:”+String( systeminfo.dwProcessorTy pe ));
}
运行它,点击Test试试,CPU型号出来了吧!
2.检测内存状态
获得内存状态的方法和CPU型号差不多,只是他用到的是另外一个API:GlobalMe moryStatus。其中,成员dwTotalPhys用来获得物理内存总量,而dwAvailPhys顾名思义 是有效物理内存的意思。我们只要把下面几行代码加到上面程序的后面就可以了(不用 重做,下同):
//获得内存状态
MEMORYSTATUS memory;
memory.dwLength =sizeof(memory); //初始化
memory.dwLength =sizeof(memory); //初始化
GlobalMemoryStatus(&memory);
Memo1→Lines→Add(“您的物理内存是(Mb):”+String(int(memory.dwTotalPh ys /1024/1024)));
Memo1→Lines→Add(“其中可用内存是(Kb):”+String(int( memory. /1024)) );
怎么样,看出点门道了么?两段程序的格式几乎一模一样,其实,GetSystemInf o和GlobalMemoryStatus还可以获得许多其他有关CPU和内存的信息,就按照上面的格式 去套就行了,更详细的资料可以去看C++ Builder4的Help。
3. 检测可用硬盘空间
好了,经过前面两个简单问题的热身,我们来处理一个稍微复杂的问题:我们知 道安装程序大都有一个检测硬盘空间的过程,那么这是怎么实现的呢?他用到的是 API函 数GetDiskFreeSpace,这个函数输入一个参数:目标盘的路径;返回四个参数,依次是 每簇的扇区数、每扇区的字节数、空闲的簇数、总簇数。假如我们需要检测C盘的总容量 和可用容量,那么可以把以下代码加到上面的程序中:
//获得C盘可用空间
DWORD sector,byte,cluster,free;
long int freespace,totalspace;
GetDiskFreeSpace(“C:”,&sector,&byte,&free,&cluster); //获得返回参 数
totalspace=int(cluster)*int(byte)*int(sector)/1024/1024; //计算总容量 freespace=int(free)*int(byte)*int(sector)/1024/1024; //计算可用空间
Memo1→Lines→Add(“C盘总空间(Mb):”+String(totalspace));
Memo1→Lines→Add(“C盘可用空间(Mb):”+String(freespace));
怎么样?现在可以自己做安装程序了吧!
4. 检测CD-ROM
我们在编写程序时常常需要读取CD-ROM,可是究竟哪一个盘符是光驱呢?有人是 桓雠谭枪馇兀坑腥耸? 将最后一个盘符当作光驱的,但是当遇到双光驱或者MO的情况时常常会出错。其实这个 问题用一个API来解决并不困难,这就是:GetDriveType(),这个函数返回一个0~6之间 的值,依次代表:0—未知盘、1—不存在、2—可移动磁盘、3—固定磁盘、4—网络磁盘 、5—CD-ROM、6—内存虚拟盘。因此我们可以添加下面代码来寻找CD-ROM:
// 获得CD-ROM信息
UINT type;
char name;
for (name=‘C’;name<=‘Z’;name++) //循环检测A~Z
{ type = GetDriveType((String(name)+String(‘:’)).c_str()); //获得磁 盘类型
if (type==5)
Memo1→Lines→Add(“您的光驱盘符为:”+String(name));
}
得到光驱盘符之后我们可以进一步利用API函数GetVolumeInformation检测光驱中 是否有光盘,这个函数如果成功调用,会得到磁盘的卷标序列号等信息;如果调用失败 则可知光驱中无光盘,程序如下://检测光盘(假设光驱为G:)
char volname[255],filename[100];//buffer[512];
DWORD sno,maxl,fileflag ;
if (!(GetVolumeInformation(“G:”, volname,255,&sno,&maxl,&fileflag ,filename,100)))
//如果返回值为假
Memo1→Lines→Add (“G驱中没有发现光盘”);
else
//如果返回值为真
{Memo1→Lines→Add (“G驱中光盘卷标为:”+String(volname));
Memo1→Lines→Add (“G驱中光盘序号为:”+String(sno));
}
5. 检测声卡配置
在编制多媒体程序时,我们常常会用到声音文件,而当这些程序在没有配置声卡 的机器上运行时,我们应该给出必要的警告。对于声卡的检测,可以分别通过waveOutG etNumDevs()和midiOutGetNumDevs()检测波形设备和MIDI设备,再利用waveOutGetDevC aps()和midiOutGetDevCaps()获得声音设备的细节资料。将下面一段代码加入上面的程 序即可,但要注意将#include 添至程序首部:
//检测声卡
int wavedevice,mididevice;
WAVEOUTCAPS wavecap;
MIDIOUTCAPS midicap;
wavedevice=(int)waveOutGetNumDevs(); //波形设备信息 mididevice=(int)midiOutGetNumDevs(); // MIDI设备信息 mididevice=(int)midiOutGetNumDevs(); // MIDI设备信息
if (wavedevice==0)
Memo1→Lines→Add (“没有发现波形设备”);
else
{waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS));
Memo1→Lines→Add (“当前波形设备:”+String(wavecap.szPname));
}
if (mididevice==0)
Memo1→Lines→Add (“没有发现MIDI设备”);
else
{midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS));
Memo19→Lines→Add (“当前MIDI设备:”+String(midicap.szPname));
}
6. 检测显示器信息
编写和图形图像有关的程序时常常需要检测显示器的分辨率和色深,最后我们来 看看这个问题的解决办法。分辨率的求法很简单,直接调用Screen对象的属性就行了。 而要求色深则要利用API函数GetDeviceCaps获得每像素的比特数和色彩的页面数,然后 计算2的“每像素的比特数”次幂即得色彩的梯度数,再计算“色彩的梯度数”的“色彩 的页面数”次幂即得色深。由于该段绦蛴玫搅嗣菰怂悖砸堑眉由希nclude , 程序如下:
//检测显示器
int tcs;
long int bpp,cp,tc;
Memo1→Lines→Add (“当前分辨率为:”+String(Screen→Width)+“*”+S tring(Screen→Height));
bpp=GetDeviceCaps(Form1→Canvas→Handle ,BITSPIXEL);
bpp=GetDeviceCaps(Form1→Canvas→Handle ,BITSPIXEL);
tcs=pow(2,bpp); //计算色彩的梯度数
cp= GetDeviceCaps(Form1→Canvas→Handle,PLANES);
tc= pow(tcs,cp); //计算色深
Memo1→Lines→Add(“当前色深为:”+String(tc));
好了,现在在让我们点击一下Test吧,硬件情况尽收眼底(图2)!其实本文所涉 及的API函数的功能不止这些,大家下去可以查一查Win32 API手册,或者直接在C++ Builder 4中察看Help。相信自己开发一个硬件检测软件也不是难事哦!
以上程序均在Windows98中文版、C++ Builder 4中调试通过,如果大家在硬件 检测方面有什么问题,请与本文作者探讨,AlexYoung@263.net。(西安 杨洪辰)
Top
31 楼ggyy(带着一堆光棍找朋友!)回复于 2001-11-23 13:00:31 得分 10
一、以前的DOS版要读、写、格式化第0轨的第1个磁区,程式大致如下:
char buffer[512];
reg.x.dx=0 ; /* for drive A *
reg.x.cx=0x0001 /* for boot sector */
reg.x.bx=FP_OFF(buffer);
sreg.es=FP_SEG(buffer);
resg.x.ax=0x0201; /* 02 for Read, 03 for Write ,05 for Format */
int86x(0x13,®,®,&sreg);
那麽在windows 下转换为呼叫 DeviceIoControl 以便格式化、读取、写入该磁轨,DIOC_REGISTERS 这struct 在套上 DOS 下 Int21对HDD或FDD 的各项参数如要格式化是Int21也是有, 但Windows下也另有提供。
l#pragma pack(push, 1)
struct DIOC_REGISTERS {
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
};
#pragma pack(pop)
sDiskImageInfo->hDevice = ::CreateFile("\\\\.\\vwin32", 0, 0, NULL, 0,
FILE_FLAG_DELETE_ON_CLOSE, NULL);
if( sDiskImageInfo->hDevice == INVALID_HANDLE_VALUE)
bRunNext = false;
// Reset Floppy Disk
reg.reg_EBX = 0;
reg.reg_EAX = 0x0000; // IOCTL for block devices
reg.reg_EDX = sDiskImageInfo->Driver;
reg.reg_EDI = 0; reg.reg_ESI= 0;
reg.reg_Flags = 0x0001; // assume error (carry flag is set)
dwResult = ::DeviceIoControl( sDiskImageInfo->hDevice,
VWIN32_DIOC_DOS_INT13,
®, sizeof(DIOC_REGISTERS), ®,
sizeof(DIOC_REGISTERS), &cb, 0);
// Seek Floppy
reg.reg_EBX = 0;
reg.reg_EAX = 0x0C00; // IOCTL for block devices
reg.reg_ECX = ( sDiskImageInfo->nC << 8) | sDiskImageInfo->nS;
reg.reg_EDX = ( sDiskImageInfo->nH << 8) | sDiskImageInfo->Driver;
reg.reg_EDI = 0;
reg.reg_ESI= 0;
reg.reg_Flags = 0x0001; // assume error (carry flag is set)
dwResult = ::DeviceIoControl( sDiskImageInfo->hDevice,
VWIN32_DIOC_DOS_INT13,
®, sizeof(DIOC_REGISTERS), ®,
sizeof(DIOC_REGISTERS), &cb, 0);
// Read Floppy
R_CreateDiskImageFile:
reg.reg_EBX = 0;
reg.reg_EAX = 0x0200 | 0x01; // IOCTL for block devices
reg.reg_ECX = ( sDiskImageInfo->nC << 8) | sDiskImageInfo->nS;
reg.reg_EDX = ( sDiskImageInfo->nH << 8) | sDiskImageInfo->Driver;
reg.reg_EBX = (DWORD) &m_Buf;
reg.reg_EDI = 0;
reg.reg_ESI= 0;
reg.reg_Flags = 0x0001; // assume error (carry flag is set)
dwResult = ::DeviceIoControl( hDevice, VWIN32_DIOC_DOS_INT13,
®, sizeof(DIOC_REGISTERS), ®,
sizeof(DIOC_REGISTERS), &cb, 0);
if (!dwResult || (reg.reg_Flags & 0x0001))
{
}
Top
32 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-23 17:50:25 得分 0
各位老大!醒醒!!上面的程序基本上没有能在win2000下运行的。M$早就把这些底层的东西封起来了。我现在用C#中的ManagementClass好像可以找到。或者用sdk的WMI接口也可以。哪位用C#试验一下?Top
33 楼zshuc(小巧的PE)回复于 2001-11-26 16:47:26 得分 0
作个记号!Top
34 楼gloom(苍狗白云)回复于 2002-01-18 21:25:12 得分 0
关注Top
35 楼fenglingdu(风陵渡)回复于 2002-01-19 01:14:27 得分 0
新手学习....Top
36 楼actinia(海葵)回复于 2002-01-19 01:43:39 得分 0
呵呵,我也学学,不过好象没有真正切入主题耶!Top
37 楼Adayuer(饭碗饭碗饭碗你在哪里?)回复于 2002-01-19 04:07:44 得分 0
俺也关注Top
38 楼fiveyes(天才的剽窃如羚羊挂角无迹可寻)回复于 2002-01-19 09:03:58 得分 0
咦,主板这玩意那么多厂商和芯片组,他们也遵循一个统一的标准来在ROM中保留一个唯一的编号吗?那么这个标准是什么呢?有没有这么个标准呢?Top
39 楼luo73(梦中编程)回复于 2002-02-22 10:19:53 得分 0
关注
Top
40 楼xiao_niao(小鸟)回复于 2002-02-22 13:59:49 得分 50
http://www.csdn.net/expert/topic/486/486908.xmlTop




