subject_23295.htm

来自「一些关于vc的问答」· HTM 代码 · 共 30 行

HTM
30
字号
<p>
序号:23295 发表者:xiaodao13 发表日期:2002-12-03 09:26:40
<br>主题:读硬件ID (硬盘)的程序?????????????
<br>内容:大家好,我是刚学汇编语言的毛小伙子,我现在有个问题想向大家请教一下,我编的读硬件(硬盘)ID 的程序只能在WIN9X工作,和读出硬盘的正确ID,请问如何使读硬件ID (硬盘)的程序能在WIN9X和WIN2000和WINXP正常工作,并能读出硬盘的正确ID????秉着向大家学习的精神,我能否提一个过份的要求,请您把大家硬件ID 的程序的源程序发给我,或贴出来,好吗???多谢,多谢!!!!xiaodao13@21cn.com
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:高扬 回复日期:2002-12-03 12:11:54
<br>内容:直接从RING3获取硬盘序列号 <BR><BR>--------------------------------------- <BR>  通常情况下,我们通过0XEC命令对IDE端口进行监测.获取硬盘信息. <BR>一般情况下,我们就写个VXD或者DRIVER来完成.但是现在,通过MS的S.M.A.R.T.接口,我们可以直接从RING3调用API DeviceIoControl()来获取硬盘信息.<BR>  <BR>下面乃是我的例程: <BR><BR>  另外,也有编译好的版本供大家平时使用.欢迎下载. <BR>*注:在WIN98SE,WINDOWS ME中,S.M.A.R.T并不缺省安装.请将SMARTVSD.VXD拷贝到%SYSTEM%\IOSUBSYS目录下. <BR>在WINDOWS2000下,由于非ADMINISTRATORS组的用户对硬盘连GENERIC_READ的权限也没有,所以请以ADMINISTRATOR登录后使用. <BR>/*+++ <BR>HDID.CPP <BR>Written by Lu Lin <BR>http://lu0.126.com <BR>2000.11.3 <BR>---*/ <BR>#include &lt;windows.h&gt; <BR>#include &lt;iostream.h&gt; <BR>#include &lt;stdio.h&gt; <BR><BR>#define DFP_GET_VERSION 0x00074080 <BR>#define DFP_SEND_DRIVE_COMMAND 0x0007c084 <BR>#define DFP_RECEIVE_DRIVE_DATA 0x0007c088 <BR><BR>#pragma pack(1) <BR>typedef struct _GETVERSIONOUTPARAMS { <BR>BYTE bVersion; // Binary driver version. <BR>BYTE bRevision; // Binary driver revision. <BR>BYTE bReserved; // Not used. <BR>BYTE bIDEDeviceMap; // Bit map of IDE devices. <BR>DWORD fCapabilities; // Bit mask of driver capabilities. <BR>DWORD dwReserved[4]; // For future use. <BR>} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS; <BR><BR>typedef struct _IDEREGS { <BR>BYTE bFeaturesReg; // Used for specifying SMART "commands". <BR>BYTE bSectorCountReg; // IDE sector count register <BR>BYTE bSectorNumberReg; // IDE sector number register <BR>BYTE bCylLowReg; // IDE low order cylinder value <BR>BYTE bCylHighReg; // IDE high order cylinder value <BR>BYTE bDriveHeadReg; // IDE drive/head register <BR>BYTE bCommandReg; // Actual IDE command. <BR>BYTE bReserved; // reserved for future use. Must be zero. <BR>} IDEREGS, *PIDEREGS, *LPIDEREGS; <BR><BR>typedef struct _SENDCMDINPARAMS { <BR>DWORD cBufferSize; // Buffer size in bytes <BR>IDEREGS irDriveRegs; // Structure with drive register values. <BR>BYTE bDriveNumber; // Physical drive number to send <BR>// command to (0,1,2,3). <BR>BYTE bReserved[3]; // Reserved for future expansion. <BR>DWORD dwReserved[4]; // For future use. <BR>//BYTE bBuffer[1]; // Input buffer. <BR>} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; <BR><BR>typedef struct _DRIVERSTATUS { <BR>BYTE bDriverError; // Error code from driver, <BR>// or 0 if no error. <BR>BYTE bIDEStatus; // Contents of IDE Error register. <BR>// Only valid when bDriverError <BR>// is SMART_IDE_ERROR. <BR>BYTE bReserved[2]; // Reserved for future expansion. <BR>DWORD dwReserved[2]; // Reserved for future expansion. <BR>} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS; <BR><BR>typedef struct _SENDCMDOUTPARAMS { <BR>DWORD cBufferSize; // Size of bBuffer in bytes <BR>DRIVERSTATUS DriverStatus; // Driver status structure. <BR>BYTE bBuffer[512]; // Buffer of arbitrary length <BR>// in which to store the data read from the drive. <BR>} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; <BR><BR>typedef struct _IDSECTOR { <BR>USHORT wGenConfig; <BR>USHORT wNumCyls; <BR>USHORT wReserved; <BR>USHORT wNumHeads; <BR>USHORT wBytesPerTrack; <BR>USHORT wBytesPerSector; <BR>USHORT wSectorsPerTrack; <BR>USHORT wVendorUnique[3]; <BR>CHAR sSerialNumber[20]; <BR>USHORT wBufferType; <BR>USHORT wBufferSize; <BR>USHORT wECCSize; <BR>CHAR sFirmwareRev[8]; <BR>CHAR sModelNumber[40]; <BR>USHORT wMoreVendorUnique; <BR>USHORT wDoubleWordIO; <BR>USHORT wCapabilities; <BR>USHORT wReserved1; <BR>USHORT wPIOTiming; <BR>USHORT wDMATiming; <BR>USHORT wBS; <BR>USHORT wNumCurrentCyls; <BR>USHORT wNumCurrentHeads; <BR>USHORT wNumCurrentSectorsPerTrack; <BR>ULONG ulCurrentSectorCapacity; <BR>USHORT wMultSectorStuff; <BR>ULONG ulTotalAddressableSectors; <BR>USHORT wSingleWordDMA; <BR>USHORT wMultiWordDMA; <BR>BYTE bReserved[128]; <BR>} IDSECTOR, *PIDSECTOR; <BR><BR>/*+++ <BR>Global vars <BR>---*/ <BR>GETVERSIONOUTPARAMS vers; <BR>SENDCMDINPARAMS in; <BR>SENDCMDOUTPARAMS out; <BR>HANDLE h; <BR>DWORD i; <BR>BYTE j; <BR><BR>void CopyRight(){ <BR>cerr&lt;&lt;endl&lt;&lt;"HDD identifier v1.0 for WIN95/98/Me/NT/2000. written by Lu Lin"&lt;&lt;endl; <BR>cerr&lt;&lt;"For more information, please visit Inside Programming: http://lu0.126.com"&lt;&lt;endl; <BR>cerr&lt;&lt;"2000.11.3"&lt;&lt;endl&lt;&lt;endl; <BR>} <BR>VOID ChangeByteOrder(PCHAR szString, USHORT uscStrSize) <BR>{ <BR><BR>USHORT i; <BR>CHAR temp; <BR><BR>for (i = 0; i &lt; uscStrSize; i+=2) <BR>{ <BR>temp = szString[i]; <BR>szString[i] = szString[i+1]; <BR>szString[i+1] = temp; <BR>} <BR>} <BR><BR>void DetectIDE(BYTE bIDEDeviceMap){ <BR>if (bIDEDeviceMap&amp;1){ <BR>if (bIDEDeviceMap&amp;16){ <BR>cout&lt;&lt;"ATAPI device is attached to primary controller, drive 0."&lt;&lt;endl; <BR>}else{ <BR>cout&lt;&lt;"IDE device is attached to primary controller, drive 0."&lt;&lt;endl; <BR>} <BR>} <BR>if (bIDEDeviceMap&amp;2){ <BR>if (bIDEDeviceMap&amp;32){ <BR>cout&lt;&lt;"ATAPI device is attached to primary controller, drive 1."&lt;&lt;endl; <BR>}else{ <BR>cout&lt;&lt;"IDE device is attached to primary controller, drive 1."&lt;&lt;endl; <BR>} <BR>} <BR>if (bIDEDeviceMap&amp;4){ <BR>if (bIDEDeviceMap&amp;64){ <BR>cout&lt;&lt;"ATAPI device is attached to secondary controller, drive 0."&lt;&lt;endl; <BR>}else{ <BR>cout&lt;&lt;"IDE device is attached to secondary controller, drive 0."&lt;&lt;endl; <BR>} <BR>} <BR>if (bIDEDeviceMap&amp;8){ <BR>if (bIDEDeviceMap&amp;128){ <BR>cout&lt;&lt;"ATAPI device is attached to secondary controller, drive 1."&lt;&lt;endl; <BR>}else{ <BR>cout&lt;&lt;"IDE device is attached to secondary controller, drive 1."&lt;&lt;endl; <BR>} <BR>} <BR>} <BR><BR>void hdid9x(){ <BR>ZeroMemory(&amp;vers,sizeof(vers)); <BR>//We start in 95/98/Me <BR>h=CreateFile("\\\\.\\Smartvsd",0,0,0,CREATE_NEW,0,0); <BR>if (!h){ <BR>cout&lt;&lt;"open smartvsd.vxd failed"&lt;&lt;endl; <BR>exit(0); <BR>} <BR><BR>if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&amp;vers,sizeof(vers),&amp;i,0)){ <BR>cout&lt;&lt;"DeviceIoControl failed:DFP_GET_VERSION"&lt;&lt;endl; <BR>CloseHandle(h); <BR>return; <BR>} <BR>//If IDE identify command not supported, fails <BR>if (!(vers.fCapabilities&amp;1)){ <BR>cout&lt;&lt;"Error: IDE identify command not supported."; <BR>CloseHandle(h); <BR>return; <BR>} <BR>//Display IDE drive number detected <BR>DetectIDE(vers.bIDEDeviceMap); <BR>//Identify the IDE drives <BR>for (j=0;j&lt;4;j++){ <BR>PIDSECTOR phdinfo; <BR>char s[41]; <BR><BR>ZeroMemory(&amp;in,sizeof(in)); <BR>ZeroMemory(&amp;out,sizeof(out)); <BR>if (j&amp;1){ <BR>in.irDriveRegs.bDriveHeadReg=0xb0; <BR>}else{ <BR>in.irDriveRegs.bDriveHeadReg=0xa0; <BR>} <BR>if (vers.fCapabilities&amp;(16&gt;&gt;j)){ <BR>//We don't detect a ATAPI device. <BR>cout&lt;&lt;"Drive "&lt;&lt;(int)(j+1)&lt;&lt;" is a ATAPI device, we don't detect it"&lt;&lt;endl; <BR>continue; <BR>}else{ <BR>in.irDriveRegs.bCommandReg=0xec; <BR>} <BR>in.bDriveNumber=j; <BR>in.irDriveRegs.bSectorCountReg=1; <BR>in.irDriveRegs.bSectorNumberReg=1; <BR>in.cBufferSize=512; <BR>if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&amp;in,sizeof(in),&amp;out,sizeof(out),&amp;i,0)){ <BR>cout&lt;&lt;"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"&lt;&lt;endl; <BR>CloseHandle(h); <BR>return; <BR>} <BR>phdinfo=(PIDSECTOR)out.bBuffer; <BR>memcpy(s,phdinfo-&gt;sModelNumber,40); <BR>s[40]=0; <BR>ChangeByteOrder(s,40); <BR>cout&lt;&lt;endl&lt;&lt;"Module Number:"&lt;&lt;s&lt;&lt;endl; <BR>memcpy(s,phdinfo-&gt;sFirmwareRev,8); <BR>s[8]=0; <BR>ChangeByteOrder(s,8); <BR>cout&lt;&lt;"\tFirmware rev:"&lt;&lt;s&lt;&lt;endl; <BR>memcpy(s,phdinfo-&gt;sSerialNumber,20); <BR>s[20]=0; <BR>ChangeByteOrder(s,20); <BR>cout&lt;&lt;"\tSerial Number:"&lt;&lt;s&lt;&lt;endl; <BR>cout&lt;&lt;"\tCapacity:"&lt;&lt;phdinfo-&gt;ulTotalAddressableSectors/2/1024&lt;&lt;"M"&lt;&lt;endl&lt;&lt;endl; <BR>} <BR><BR>//Close handle before quit <BR>CloseHandle(h); <BR>CopyRight(); <BR><BR>} <BR><BR>void hdidnt(){ <BR>char hd[80]; <BR>PIDSECTOR phdinfo; <BR>char s[41]; <BR><BR>ZeroMemory(&amp;vers,sizeof(vers)); <BR>//We start in NT/Win2000 <BR>for (j=0;j&lt;4;j++){ <BR>sprintf(hd,"\\\\.\\PhysicalDrive%d",j); <BR>h=CreateFile(hd,GENERIC_READ|GENERIC_WRITE, <BR>FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); <BR>if (!h){ <BR>continue; <BR>} <BR>if (!DeviceIoControl(h,DFP_GET_VERSION,0,0,&amp;vers,sizeof(vers),&amp;i,0)){ <BR>CloseHandle(h); <BR>continue; <BR>} <BR>//If IDE identify command not supported, fails <BR>if (!(vers.fCapabilities&amp;1)){ <BR>cout&lt;&lt;"Error: IDE identify command not supported."; <BR>CloseHandle(h); <BR>return; <BR>} <BR>//Identify the IDE drives <BR>ZeroMemory(&amp;in,sizeof(in)); <BR>ZeroMemory(&amp;out,sizeof(out)); <BR>if (j&amp;1){ <BR>in.irDriveRegs.bDriveHeadReg=0xb0; <BR>}else{ <BR>in.irDriveRegs.bDriveHeadReg=0xa0; <BR>} <BR>if (vers.fCapabilities&amp;(16&gt;&gt;j)){ <BR>//We don't detect a ATAPI device. <BR>cout&lt;&lt;"Drive "&lt;&lt;(int)(j+1)&lt;&lt;" is a ATAPI device, we don't detect it"&lt;&lt;endl; <BR>continue; <BR>}else{ <BR>in.irDriveRegs.bCommandReg=0xec; <BR>} <BR>in.bDriveNumber=j; <BR>in.irDriveRegs.bSectorCountReg=1; <BR>in.irDriveRegs.bSectorNumberReg=1; <BR>in.cBufferSize=512; <BR>if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&amp;in,sizeof(in),&amp;out,sizeof(out),&amp;i,0)){ <BR>cout&lt;&lt;"DeviceIoControl failed:DFP_RECEIVE_DRIVE_DATA"&lt;&lt;endl; <BR>CloseHandle(h); <BR>return; <BR>} <BR>phdinfo=(PIDSECTOR)out.bBuffer; <BR>memcpy(s,phdinfo-&gt;sModelNumber,40); <BR>s[40]=0; <BR>ChangeByteOrder(s,40); <BR>cout&lt;&lt;endl&lt;&lt;"Module Number:"&lt;&lt;s&lt;&lt;endl; <BR>memcpy(s,phdinfo-&gt;sFirmwareRev,8); <BR>s[8]=0; <BR>ChangeByteOrder(s,8); <BR>cout&lt;&lt;"\tFirmware rev:"&lt;&lt;s&lt;&lt;endl; <BR>memcpy(s,phdinfo-&gt;sSerialNumber,20); <BR>s[20]=0; <BR>ChangeByteOrder(s,20); <BR>cout&lt;&lt;"\tSerial Number:"&lt;&lt;s&lt;&lt;endl; <BR>cout&lt;&lt;"\tCapacity:"&lt;&lt;phdinfo-&gt;ulTotalAddressableSectors/2/1024&lt;&lt;"M"&lt;&lt;endl&lt;&lt;endl; <BR>CloseHandle(h); <BR>} <BR>CopyRight(); <BR>} <BR><BR>void main(){ <BR>OSVERSIONINFO VersionInfo; <BR><BR>ZeroMemory(&amp;VersionInfo,sizeof(VersionInfo)); <BR>VersionInfo.dwOSVersionInfoSize=sizeof(VersionInfo); <BR>GetVersionEx(&amp;VersionInfo); <BR><BR>switch (VersionInfo.dwPlatformId){ <BR>case VER_PLATFORM_WIN32s: <BR>cout&lt;&lt;"Win32s is not supported by this programm."&lt;&lt;endl; <BR>return; <BR>case VER_PLATFORM_WIN32_WINDOWS: <BR>hdid9x(); <BR>return; <BR>case VER_PLATFORM_WIN32_NT: <BR>hdidnt(); <BR>return; <BR>} <BR>} <BR><BR> <BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:高扬 回复日期:2002-12-03 12:13:16
<br>内容:这就是硬盘格式化时得到的序列号,每次格式化后的值是不一样的<BR>和逻辑盘没什么联系<BR>每个逻辑盘的序列号都不一样<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwIDESerial;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CString str;<BR>&nbsp;&nbsp;&nbsp;&nbsp;GetVolumeInformation("C:\\",NULL,NULL,&amp;dwIDESerial,NULL,NULL,NULL,NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;str.Format( "硬盘序列号: %X - %X",HIWORD(dwIDESerial),LOWORD(dwIDESerial));<BR>&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(str);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiaodao13 回复日期:2002-12-03 12:31:48
<br>内容:多谢您了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:高扬 回复日期:2002-12-03 13:13:56
<br>内容:那给分我啊!没分我会没动力的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?