📄 在win9x-nt下获取硬盘物理序列号.mht
字号:
=
bIsDiskExist;<BR> switch(n=
Drive=20
/=20
=
2)<BR> {<BR> &n=
bsp; case=20
0: dwBaseAddress =3D 0x01F0;=20
=
break;<BR> &nb=
sp; case=20
1: dwBaseAddress =3D 0x0170;=20
=
break;<BR> &nb=
sp; case=20
2: dwBaseAddress =3D 0x01E8;=20
=
break;<BR> &nb=
sp; case=20
3: dwBaseAddress =3D 0x0168;=20
=
break;<BR> }<BR><BR> =
btMasterSlave=20
=3D (BYTE)(((nDrive % 2) =3D=3D 0) ? 0xA0 :=20
=
0xB0);<BR><BR> //=20
=
=BD=F8=C8=EBRing0<BR> bIsI=
DEExist =3D=20
=
false;<BR> bIsDiskExist=20
=3D=20
=
false;<BR> ZeroMemory(wOut=
Data,=20
=
sizeof(wOutData));<BR><BR>  =
;ReadPhysicalDriveOnW9X_Ring0(false,=20
dwBaseAddress,=20
=
btMasterSlave,<BR> &=
nbsp; bIsIDEExist,=20
bIsDiskExist,=20
=
wOutData);<BR><BR> if(bIsI=
DEExist=20
&&=20
=
bIsDiskExist)<BR> {<BR>&nb=
sp; DWOR=
D=20
=
dwDiskData[256];<BR>  =
; char szSerialNumber[21];<BR> &nb=
sp; char =
szModelNumber[41];<BR><BR>  =
; for(int=20
k=3D0; k < 256;=20
=
k++)<BR>  =
; dwDiskData[k]=20
=3D=20
=
wOutData[k];<BR><BR>  =
; //=20
=
=C8=A1=CF=B5=C1=D0=BA=C5<BR> &nb=
sp; ZeroMemory(szSerialNumber,=20
=
sizeof(szSerialNumber));<BR> &nb=
sp; strcpy(szSerialNumber,=20
ConvertToString(dwDiskData, 10,=20
=
19));<BR><BR> =
//=20
=
=C8=A1=C4=A3=D0=CD=BA=C5<BR> &nb=
sp; ZeroMemory(szModelNumber,=20
=
sizeof(szModelNumber));<BR> &nbs=
p; strcpy(szModelNumber,=20
ConvertToString(dwDiskData, 27,=20
=
46));<BR><BR> =
pSerList->Add(szSerialNumber);<BR> =
pModeList->Add(szModel=
Number);<BR> }<BR> &n=
bsp; }<BR> SetPriorityClass(GetCurrentP=
rocess(),=20
=
NORMAL_PRIORITY_CLASS);<BR>}<BR>//---------------------------------------=
------------------------------------<BR>//=20
ReadPhysicalDriveOnW9X_Ring0()<BR>//<BR>// dwBaseAddress =3D =
IDE(0,1,2,3) : 1F0h, 170h, 1E8h, 168h<BR>// btMasterSlave =
=3D=20
Master(0xA0) Or=20
=
Slave(0xB0)<BR>//--------------------------------------------------------=
-------------------<BR>void=20
__fastcall ReadPhysicalDriveOnW9X_Ring0(bool bIsFirst, WORD=20
=
dwBaseAddress,<BR> BYTE=20
btMasterSlave, bool &bIsIDEExist, bool =
&bIsDiskExist, WORD=20
=
*pOutData)<BR>{<BR> BYTE btIDTR1[6];<BR=
> DWORD=20
dwOldExceptionHook;<BR> const int=20
nHookExceptionNo =3D=20
=
5;<BR><BR> BYTE btIsIDEExist =3D=20
0;<BR> BYTE btIsDiskExist =
=3D=20
=
0;<BR> WORD wOutDataBuf[256];<BR><BR>&n=
bsp; BYTE btIsFirst=20
=3D (BYTE)bIsFirst;<BR><BR> const =
BYTE btBit00=20
=3D 0x01;<BR> // const BYTE btBit02 =
=3D=20
0x04;<BR> const BYTE btBit06 =3D=20
0x40;<BR> const BYTE btBit07 =3D=20
0x80;<BR> // const BYTE =
btERR =3D=20
btBit00;<BR> const BYTE btBusy =3D=20
btBit07;<BR> const BYTE=20
btAtaCmd =3D =
0xEC;<BR> const=20
BYTE btAtapiCmd =3D=20
=
0xA1;<BR><BR> __asm<BR> {<B=
R> //=20
=
=B1=D8=D0=EB=CF=C8=D6=B4=D0=D0=D5=E2=CC=F5=D3=EF=BE=E4<BR> &nb=
sp; JMP=20
=
EnterRing0<BR><BR> //=20
=
=B6=A8=D2=E5=B9=FD=B3=CC<BR> &nb=
sp;//=20
=
=B5=C8=B4=FDIDE=C9=E8=B1=B8=D6=B1=B5=BD=C6=E4=B2=BB=CE=AA=C3=A6=CE=AA=D6=B9=
<BR> WaitWhileBusy=20
=
proc<BR><BR> MOV &nbs=
p;EBX,=20
=
100000<BR> MOV =
DX,=20
=
dwBaseAddress<BR> ADD =
; DX,=20
=
7<BR><BR> LoopWhileBusy:<B=
R><BR> DEC EBX<=
BR> CMP EBX,=20
=
0<BR> JZ =
Timeout<BR> in =
AL,=20
DX<BR> TEST =
AL,=20
=
btBusy<BR> JNZ =
LoopWhileBusy<BR> JMP =
; DriveReady<BR><BR> =
//=20
=
=B3=AC=CA=B1=A3=AC=D6=B1=BD=D3=CD=CB=B3=F6<BR> &nb=
sp; Timeout:<BR> &nbs=
p; JMP LeaveRing0<BR> =
DriveReady:<BR> &nbs=
p;RET<BR> ENDP =
//=20
End of WaitWhileBusy=20
=
Procedure<BR><BR> //=20
=
=C9=E8=D6=C3=D6=F7=C5=CC=BA=CD=B4=D3=C5=CC=B1=EA=D6=BE<BR> &nb=
sp; SelectDevice=20
=
proc<BR><BR> MOV &nbs=
p;DX,=20
=
dwBaseAddress<BR> ADD =
; DX,=20
=
6<BR> MOV AL,=20
=
btMasterSlave<BR><BR> out&=
nbsp; DX,=20
=
AL<BR> RET<BR><BR> &n=
bsp; ENDP //=20
End of SelectDevice=20
=
Procedure<BR><BR> //=20
=
=CF=F2IDE=C9=E8=B1=B8=B7=A2=CB=CD=B4=E6=C8=A1=D6=B8=C1=EE<BR> =
SendCmd=20
=
proc<BR><BR> MOV DX,=20
=
dwBaseAddress<BR> ADD=20
DX, 7<BR> MOV =
AL, BL=20
//=20
=
BL=CA=C7=D6=F7=B4=D3=C5=CC=B1=EA=CA=B6=A3=AC=D4=DA=B9=FD=B3=CC=CD=E2=C9=E8=
=D6=C3<BR> out=20
DX,=20
=
AL<BR> RET<BR> =
ENDP //=20
End of SendCmd=20
=
Procedure<BR><BR> //=20
=
Ring0=B4=FA=C2=EB<BR> Ring=
0Proc:<BR> PUSHAD<BR> =
; //=20
=
=B2=E9=D1=AFIDE=C9=E8=B1=B8=CA=C7=B7=F1=B4=E6=D4=DA<BR> =
MOV=20
DX,=20
=
dwBaseAddress<BR> ADD=20
DX,=20
=
7<BR> in AL,DX<=
BR><BR> //=20
=
=B5=B1AL=B5=C4=D6=B5=CA=C70xFF=BB=F2=D5=DF0x7F=CA=B1=A3=ACIDE=C9=E8=B1=B8=
=B2=BB=B4=E6=D4=DA=A3=AC=D5=E2=CA=B1=BA=F2=D6=B1=BD=D3=B7=B5=BB=D8<BR>&nb=
sp; CMP=20
=
AL,0xFF<BR> JZ =
LeaveRing0<BR> CMP=20
AL,=20
=
0x7F<BR> JZ Lea=
veRing0<BR><BR> //=20
=
=C9=E8=D6=C3IDE=C9=E8=B1=B8=B4=E6=D4=DA=B1=EA=D6=BE<BR> =
MOV=20
btIsIDEExist,=20
1<BR><BR> //=20
=
=B2=E9=D1=AFIDE=C9=E8=B1=B8=C9=CF=B5=C4=C7=FD=B6=AF=C6=F7=CA=C7=B7=F1=B4=E6=
=D4=DA=A3=A8=D3=D0IDE=B2=E5=B2=DB=D4=DA=D6=F7=B0=E5=C9=CF=A3=AC=B5=AB=CA=C7=
=C8=B4=B2=BB=D2=BB=B6=A8=D3=D0=D3=B2=C5=CC=B2=E5=D4=DA=C9=CF=C3=E6=A3=A9<=
BR> CALL=20
=
WaitWhileBusy<BR> CALL=20
=
SelectDevice<BR><BR> //=20
=
=C8=E7=B9=FB=CA=C7=B5=DA=D2=BB=B4=CE=B5=F7=D3=C3=A3=AC=D4=F2=D6=B1=BD=D3=B7=
=B5=BB=D8=A3=AC=B7=F1=D4=F2=D6=B4=D0=D0=CF=C2=D0=D0=D3=EF=BE=E4=CA=B1=BB=E1=
=B3=F6=CF=D6=C0=B6=C6=C1<BR> &nb=
sp;CMP btIsFirst,=20
=
1<BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -