📄 csdn技术中心 实战deviceiocontrol 之四:获取硬盘的详细信息.mht
字号:
USHORT wReserved82[<SPAN class=3Dnum>6</SPAN>]; <SPAN =
class=3Drem>// WORD 82-87: =B1=A3=C1=F4</SPAN>
<SPAN class=3Dkey>struct</SPAN> {
USHORT Mode0:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD0 (16.7Mb/s)</SPAN>
USHORT Mode1:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD1 (25Mb/s)</SPAN>
USHORT Mode2:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD2 (33Mb/s)</SPAN>
USHORT Mode3:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD3 (44Mb/s)</SPAN>
USHORT Mode4:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD4 (66Mb/s)</SPAN>
USHORT Mode5:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD5 (100Mb/s)</SPAN>
USHORT Mode6:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD6 (133Mb/s)</SPAN>
USHORT Mode7:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D6=A7=B3=D6=C4=A3=CA=BD7 (166Mb/s) ???</SPAN>
USHORT Mode0Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD0</SPAN>
USHORT Mode1Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD1</SPAN>
USHORT Mode2Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD2</SPAN>
USHORT Mode3Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD3</SPAN>
USHORT Mode4Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD4</SPAN>
USHORT Mode5Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD5</SPAN>
USHORT Mode6Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD6</SPAN>
USHORT Mode7Sel:<SPAN class=3Dnum>1</SPAN>; <SPAN =
class=3Drem>// 1=3D=D2=D1=D1=A1=D4=F1=C4=A3=CA=BD7</SPAN>
} wUltraDMA; <SPAN class=3Drem>// WORD 88: =
Ultra DMA=D6=A7=B3=D6=C4=DC=C1=A6</SPAN>
USHORT wReserved89[<SPAN class=3Dnum>167</SPAN>]; <SPAN =
class=3Drem>// WORD 89-255</SPAN>
} IDINFO, *PIDINFO;
=20
<SPAN class=3Drem>// =
SCSI=C7=FD=B6=AF=CB=F9=D0=E8=B5=C4=CA=E4=C8=EB=CA=E4=B3=F6=B9=B2=D3=C3=B5=
=C4=BD=E1=B9=B9</SPAN>
<SPAN class=3Dkey>typedef</SPAN> <SPAN class=3Dkey>struct</SPAN> =
_SRB_IO_CONTROL
{
ULONG HeaderLength; <SPAN class=3Drem>// =
=CD=B7=B3=A4=B6=C8</SPAN>
UCHAR Signature[<SPAN class=3Dnum>8</SPAN>]; <SPAN =
class=3Drem>// =CC=D8=D5=F7=C3=FB=B3=C6</SPAN>
ULONG Timeout; <SPAN class=3Drem>// =
=B3=AC=CA=B1=CA=B1=BC=E4</SPAN>
ULONG ControlCode; <SPAN class=3Drem>// =
=BF=D8=D6=C6=C2=EB</SPAN>
ULONG ReturnCode; <SPAN class=3Drem>// =
=B7=B5=BB=D8=C2=EB</SPAN>
ULONG Length; <SPAN class=3Drem>// =
=BB=BA=B3=E5=C7=F8=B3=A4=B6=C8</SPAN>
} SRB_IO_CONTROL, *PSRB_IO_CONTROL;
</CODE></PRE>
<P =
class=3Dbhw98>=D0=E8=D2=AA=D2=FD=C6=F0=D7=A2=D2=E2=B5=C4=CA=C7IDINFO=B5=DA=
57-58 WORD=20
=
(CHS=BF=C9=D1=B0=D6=B7=B5=C4=C9=C8=C7=F8=CA=FD)=A3=AC=D2=F2=CE=AA=B2=BB=C2=
=FA=D7=E332=CE=BB=B6=D4=C6=EB=B5=C4=D2=AA=C7=F3=A3=AC=B2=BB=BF=C9=B6=A8=D2=
=E5=CE=AA=D2=BB=B8=F6ULONG=D7=D6=B6=CE=A1=A3Lynn=20
=
McGuire=B5=C4=B3=CC=D0=F2=C0=EF=D5=FD=CA=C7=D3=C9=D3=DA=B6=A8=D2=E5=CE=AA=
=D2=BB=B8=F6ULONG=D7=D6=B6=CE=A3=AC=B5=BC=D6=C2=B8=C3=BD=E1=B9=B9=B2=BB=BF=
=C9=D3=C3=A1=A3=20
<P =
class=3Dbhw98>=D2=D4=CF=C2=CA=C7=BA=CB=D0=C4=B4=FA=C2=EB=A3=BA <PRE =
class=3Dbhw98><CODE class=3Dbhw98><SPAN class=3Drem>// =
=B4=F2=BF=AA=C9=E8=B1=B8</SPAN>
<SPAN class=3Drem>// filename: =
=C9=E8=B1=B8=B5=C4=A1=B0=CE=C4=BC=FE=C3=FB=A1=B1(=C9=E8=B1=B8=C2=B7=BE=B6=
)</SPAN>
HANDLE OpenDevice(LPCTSTR filename)
{
HANDLE hDevice;
=20
<SPAN class=3Drem>// =B4=F2=BF=AA=C9=E8=B1=B8</SPAN>
hDevice =3D ::CreateFile(filename, <SPAN class=3Drem>// =
=CE=C4=BC=FE=C3=FB</SPAN>
GENERIC_READ | GENERIC_WRITE, <SPAN class=3Drem>// =
=B6=C1=D0=B4=B7=BD=CA=BD</SPAN>
FILE_SHARE_READ | FILE_SHARE_WRITE, <SPAN class=3Drem>// =
=B9=B2=CF=ED=B7=BD=CA=BD</SPAN>
NULL, <SPAN class=3Drem>// =
=C4=AC=C8=CF=B5=C4=B0=B2=C8=AB=C3=E8=CA=F6=B7=FB</SPAN>
OPEN_EXISTING, <SPAN class=3Drem>// =
=B4=B4=BD=A8=B7=BD=CA=BD</SPAN>
<SPAN class=3Dnum>0</SPAN>, <SPAN =
class=3Drem>// =B2=BB=D0=E8=C9=E8=D6=C3=CE=C4=BC=FE=CA=F4=D0=D4</SPAN>
NULL); <SPAN class=3Drem>// =
=B2=BB=D0=E8=B2=CE=D5=D5=C4=A3=B0=E5=CE=C4=BC=FE</SPAN>
=20
<SPAN class=3Dkey>return</SPAN> hDevice;
}
=20
<SPAN class=3Drem>// =CF=F2=C7=FD=B6=AF=B7=A2=A1=B0IDENTIFY =
DEVICE=A1=B1=C3=FC=C1=EE=A3=AC=BB=F1=B5=C3=C9=E8=B1=B8=D0=C5=CF=A2</SPAN>=
<SPAN class=3Drem>// hDevice: =C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
<SPAN class=3Drem>// pIdInfo: =
=C9=E8=B1=B8=D0=C5=CF=A2=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
BOOL IdentifyDevice(HANDLE hDevice, PIDINFO pIdInfo)
{
PSENDCMDINPARAMS pSCIP; <SPAN class=3Drem>// =
=CA=E4=C8=EB=CA=FD=BE=DD=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
PSENDCMDOUTPARAMS pSCOP; <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
DWORD dwOutBytes; <SPAN class=3Drem>// =
IOCTL=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
BOOL bResult; <SPAN class=3Drem>// =
IOCTL=B7=B5=BB=D8=D6=B5</SPAN>
=20
<SPAN class=3Drem>// =
=C9=EA=C7=EB=CA=E4=C8=EB/=CA=E4=B3=F6=CA=FD=BE=DD=BD=E1=B9=B9=BF=D5=BC=E4=
</SPAN>
pSCIP =3D (PSENDCMDINPARAMS)::GlobalAlloc(LMEM_ZEROINIT, <SPAN =
class=3Dkey>sizeof</SPAN>(SENDCMDINPARAMS) - <SPAN =
class=3Dnum>1</SPAN>);
pSCOP =3D (PSENDCMDOUTPARAMS)::GlobalAlloc(LMEM_ZEROINIT, <SPAN =
class=3Dkey>sizeof</SPAN>(SENDCMDOUTPARAMS) + <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO) - <SPAN class=3Dnum>1</SPAN>);
=20
<SPAN class=3Drem>// =
=D6=B8=B6=A8ATA/ATAPI=C3=FC=C1=EE=B5=C4=BC=C4=B4=E6=C6=F7=D6=B5</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bFeaturesReg =3D 0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bSectorCountReg =3D =
0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bSectorNumberReg =3D =
0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bCylLowReg =3D 0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bCylHighReg =3D 0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bDriveHeadReg =3D =
0;</SPAN>
pSCIP->irDriveRegs.bCommandReg =3D IDE_ATA_IDENTIFY;
=20
<SPAN class=3Drem>// =
=D6=B8=B6=A8=CA=E4=C8=EB/=CA=E4=B3=F6=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8=B4=F3=
=D0=A1</SPAN>
pSCIP->cBufferSize =3D <SPAN class=3Dnum>0</SPAN>;
pSCOP->cBufferSize =3D <SPAN class=3Dkey>sizeof</SPAN>(IDINFO);
=20
<SPAN class=3Drem>// IDENTIFY DEVICE</SPAN>
bResult =3D ::DeviceIoControl(hDevice, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
DFP_RECEIVE_DRIVE_DATA, <SPAN class=3Drem>// =
=D6=B8=B6=A8IOCTL</SPAN>
pSCIP, <SPAN class=3Dkey>sizeof</SPAN>(SENDCMDINPARAMS) - <SPAN =
class=3Dnum>1</SPAN>, <SPAN class=3Drem>// =
=CA=E4=C8=EB=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
pSCOP, <SPAN class=3Dkey>sizeof</SPAN>(SENDCMDOUTPARAMS) + <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO) - <SPAN class=3Dnum>1</SPAN>, <SPAN =
class=3Drem>// =CA=E4=B3=F6=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
&dwOutBytes, <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN class=3Drem>// =
=D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
<SPAN class=3Drem>// =
=B8=B4=D6=C6=C9=E8=B1=B8=B2=CE=CA=FD=BD=E1=B9=B9</SPAN>
::memcpy(pIdInfo, pSCOP->bBuffer, <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO));
=20
<SPAN class=3Drem>// =
=CA=CD=B7=C5=CA=E4=C8=EB/=CA=E4=B3=F6=CA=FD=BE=DD=BF=D5=BC=E4</SPAN>
::GlobalFree(pSCOP);
::GlobalFree(pSCIP);
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
=20
<SPAN class=3Drem>// =CF=F2SCSI =
MINI-PORT=C7=FD=B6=AF=B7=A2=A1=B0IDENTIFY =
DEVICE=A1=B1=C3=FC=C1=EE=A3=AC=BB=F1=B5=C3=C9=E8=B1=B8=D0=C5=CF=A2</SPAN>=
<SPAN class=3Drem>// hDevice: =C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
<SPAN class=3Drem>// pIdInfo: =
=C9=E8=B1=B8=D0=C5=CF=A2=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
BOOL IdentifyDeviceAsScsi(HANDLE hDevice, <SPAN class=3Dkey>int</SPAN> =
nDrive, PIDINFO pIdInfo)
{
PSENDCMDINPARAMS pSCIP; <SPAN class=3Drem>// =
=CA=E4=C8=EB=CA=FD=BE=DD=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
PSENDCMDOUTPARAMS pSCOP; <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
PSRB_IO_CONTROL pSRBIO; <SPAN class=3Drem>// =
SCSI=CA=E4=C8=EB=CA=E4=B3=F6=CA=FD=BE=DD=BD=E1=B9=B9=D6=B8=D5=EB</SPAN>
DWORD dwOutBytes; <SPAN class=3Drem>// =
IOCTL=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
BOOL bResult; <SPAN class=3Drem>// =
IOCTL=B7=B5=BB=D8=D6=B5</SPAN>
=20
<SPAN class=3Drem>// =
=C9=EA=C7=EB=CA=E4=C8=EB/=CA=E4=B3=F6=CA=FD=BE=DD=BD=E1=B9=B9=BF=D5=BC=E4=
</SPAN>
pSRBIO =3D (PSRB_IO_CONTROL)::GlobalAlloc(LMEM_ZEROINIT,
<SPAN class=3Dkey>sizeof</SPAN>(SRB_IO_CONTROL) + <SPAN =
class=3Dkey>sizeof</SPAN>(SENDCMDOUTPARAMS) + <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO) - <SPAN class=3Dnum>1</SPAN>);
pSCIP =3D (PSENDCMDINPARAMS)((<SPAN class=3Dkey>char</SPAN> *)pSRBIO =
+ <SPAN class=3Dkey>sizeof</SPAN>(SRB_IO_CONTROL));
pSCOP =3D (PSENDCMDOUTPARAMS)((<SPAN class=3Dkey>char</SPAN> =
*)pSRBIO + <SPAN class=3Dkey>sizeof</SPAN>(SRB_IO_CONTROL));
=20
<SPAN class=3Drem>// =
=CC=EE=B3=E4=CA=E4=C8=EB/=CA=E4=B3=F6=CA=FD=BE=DD</SPAN>
pSRBIO->HeaderLength =3D <SPAN =
class=3Dkey>sizeof</SPAN>(SRB_IO_CONTROL);
pSRBIO->Timeout =3D <SPAN class=3Dnum>10000</SPAN>;
pSRBIO->Length =3D <SPAN =
class=3Dkey>sizeof</SPAN>(SENDCMDOUTPARAMS) + <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO) - <SPAN class=3Dnum>1</SPAN>;
pSRBIO->ControlCode =3D IOCTL_SCSI_MINIPORT_IDENTIFY;
::strncpy ((<SPAN class=3Dkey>char</SPAN> *)pSRBIO->Signature, =
<SPAN class=3Dstr>"SCSIDISK"</SPAN>, <SPAN class=3Dnum>8</SPAN>);
=20
<SPAN class=3Drem>// =
=D6=B8=B6=A8ATA/ATAPI=C3=FC=C1=EE=B5=C4=BC=C4=B4=E6=C6=F7=D6=B5</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bFeaturesReg =3D 0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bSectorCountReg =3D =
0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bSectorNumberReg =3D =
0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bCylLowReg =3D 0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bCylHighReg =3D 0;</SPAN>
<SPAN class=3Drem>// pSCIP->irDriveRegs.bDriveHeadReg =3D =
0;</SPAN>
pSCIP->irDriveRegs.bCommandReg =3D IDE_ATA_IDENTIFY;
pSCIP->bDriveNumber =3D nDrive;
=20
<SPAN class=3Drem>// IDENTIFY DEVICE</SPAN>
bResult =3D ::DeviceIoControl(hDevice, <SPAN class=3Drem>// =
=C9=E8=B1=B8=BE=E4=B1=FA</SPAN>
IOCTL_SCSI_MINIPORT, <SPAN class=3Drem>// =
=D6=B8=B6=A8IOCTL</SPAN>
pSRBIO, <SPAN class=3Dkey>sizeof</SPAN>(SRB_IO_CONTROL) + <SPAN =
class=3Dkey>sizeof</SPAN>(SENDCMDINPARAMS) - <SPAN class=3Dnum>1</SPAN>, =
<SPAN class=3Drem>// =
=CA=E4=C8=EB=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
pSRBIO, <SPAN class=3Dkey>sizeof</SPAN>(SRB_IO_CONTROL) + <SPAN =
class=3Dkey>sizeof</SPAN>(SENDCMDOUTPARAMS) + <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO) - <SPAN class=3Dnum>1</SPAN>, <SPAN =
class=3Drem>// =CA=E4=B3=F6=CA=FD=BE=DD=BB=BA=B3=E5=C7=F8</SPAN>
&dwOutBytes, <SPAN class=3Drem>// =
=CA=E4=B3=F6=CA=FD=BE=DD=B3=A4=B6=C8</SPAN>
(LPOVERLAPPED)NULL); <SPAN class=3Drem>// =
=D3=C3=CD=AC=B2=BDI/O</SPAN>
=20
<SPAN class=3Drem>// =
=B8=B4=D6=C6=C9=E8=B1=B8=B2=CE=CA=FD=BD=E1=B9=B9</SPAN>
::memcpy(pIdInfo, pSCOP->bBuffer, <SPAN =
class=3Dkey>sizeof</SPAN>(IDINFO));
=20
<SPAN class=3Drem>// =
=CA=CD=B7=C5=CA=E4=C8=EB/=CA=E4=B3=F6=CA=FD=BE=DD=BF=D5=BC=E4</SPAN>
::GlobalFree(pSRBIO);
=20
<SPAN class=3Dkey>return</SPAN> bResult;
}
=20
<SPAN class=3Drem>// =
=BD=AB=B4=AE=D6=D0=B5=C4=D7=D6=B7=FB=C1=BD=C1=BD=B5=DF=B5=B9</SPAN>
<SPAN class=3Drem>// =
=D4=AD=D2=F2=CA=C7ATA/ATAPI=D6=D0=B5=C4WORD=A3=AC=D3=EBWindows=B2=C9=D3=C3=
=B5=C4=D7=D6=BD=DA=CB=B3=D0=F2=CF=E0=B7=B4</SPAN>
<SPAN class=3Drem>// =
=C7=FD=B6=AF=B3=CC=D0=F2=D6=D0=D2=D1=BE=AD=BD=AB=CA=D5=B5=BD=B5=C4=CA=FD=BE=
=DD=C8=AB=B2=BF=B7=B4=B9=FD=C0=B4=A3=AC=CE=D2=C3=C7=C0=B4=B8=F6=B8=BA=B8=BA=
=B5=C3=D5=FD</SPAN>
<SPAN class=3Dkey>void</SPAN> AdjustString(<SPAN =
class=3Dkey>char</SPAN>* str, <SPAN class=3Dkey>int</SPAN> len)
{
<SPAN class=3Dkey>char</SPAN> ch;
<SPAN class=3Dkey>int</SPAN> i;
=20
<SPAN class=3Drem>// =C1=BD=C1=BD=B5=DF=B5=B9</SPAN>
<SPAN class=3Dkey>for</SPAN> (i =3D <SPAN class=3Dnum>0</SPAN>; i =
< len; i +=3D <SPAN class=3Dnum>2</SPAN>)
{
ch =3D str[i];
str[i] =3D str[i + <SPAN class=3Dnum>1</SPAN>];
str[i + <SPAN class=3Dnum>1</SPAN>] =3D ch;
}
=20
<SPAN class=3Drem>// =
=C8=F4=CA=C7=D3=D2=B6=D4=C6=EB=B5=C4=A3=AC=B5=F7=D5=FB=CE=AA=D7=F3=B6=D4=C6=
=EB (=C8=A5=B5=F4=D7=F3=B1=DF=B5=C4=BF=D5=B8=F1)</SPAN>
i =3D <SPAN class=3Dnum>0</SPAN>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -