📄 ntldr磁盘操作及相关函数分析.mht
字号:
=A3=CA=BD=B6=D1=D5=BB=D6=D0<SPAN style=3D"DISPLAY: none"> T=10hP$r4?A=20
</SPAN> <BR>; =BD=AB (bp) =
=D6=B8=CF=F2=B2=CE=CA=FD=E8=E5=B5=C4=B5=D7=B2=BF=A3=AC=D2=B2=BE=CD=CA=C7=CB=
=B5=D6=B8=CF=F2 GetSectorFrame=20
=
=B5=C4=B5=D7=B2=BF=A3=AC=BC=B4=B4=AB=C8=EB=B5=C4=D7=EE=BA=F3=D2=BB=B8=F6=B2=
=CE=CA=FD<SPAN style=3D"DISPLAY: none"> :5I=10=05J=0F3r0=20
</SPAN> <BR>;<SPAN style=3D"DISPLAY: none"> u=04{[=0E=163`A%=20
</SPAN> <BR> push bp<SPAN =
style=3D"DISPLAY: none">=20
=1C=06X=1Bb1;=133B </SPAN> <BR> mov =
bp,sp<SPAN=20
style=3D"DISPLAY: none"> 0=10=17=04-0c=1CyF =
</SPAN> <BR> add=20
bp,2<SPAN style=3D"DISPLAY: none"> =
+L*%=01-=10=16\&=20
</SPAN> <BR>;<SPAN style=3D"DISPLAY: none"> )=12=16a=14RYVn.=20
</SPAN> <BR>; =
=C8=E7=B9=FB=C4=E3=C4=DC=C0=ED=BD=E2BIOS=CF=B5=CD=B3=D6=D0=B6=CF=B5=F7=D3=
=C3 int 13 (Diskette BIOS=20
=
Service)=A3=AC=C4=E3=BE=CD=C4=DC=CB=B3=C0=FB=B5=C4=C0=ED=BD=E2=CF=C2<SPAN=
style=3D"DISPLAY: none"> >,=12/D=10`2X=20
</SPAN> <BR>; =
=C3=E6=B5=C4=B4=FA=C2=EB=B5=C4=BA=AC=D2=E5=A3=AC=CB=F9=D2=D4=CE=D2=B2=BB=D4=
=D9=C1=D0=B3=F6=B4=FA=C2=EB=B5=C4=CF=EA=CF=B8=BD=E2=CA=CD=A3=AC=C4=E3=BF=C9=
=D2=D4=B2=CE=D5=D5=B2=CE=BF=BC=D7=CA=C1=CF=D6=D0=B5=C4=A1=B6BIOS=CF=B5=CD=
=B3=D6=D0=B6=CF=B5=F7=D3=C3=A1=B7=D6=D0<SPAN=20
style=3D"DISPLAY: none"> M40JV=05=08X! </SPAN> <BR>; =
=B5=C4=B2=BF=B7=D6=D5=C2=BD=DA=A1=A3<SPAN=20
style=3D"DISPLAY: none"> ;=1D=02=1F=10%=13(} =
</SPAN> <BR> mov =20
eax,[bp].BufferPointer ;pointer to =A1=B0Disk =
Base=20
Table=A1=B1<SPAN style=3D"DISPLAY: none"> =1C.x6D2n5W=16 =
</SPAN> <BR> =20
mov bx,ax<SPAN style=3D"DISPLAY: none"> =
=06`h+m`=03F&G=20
</SPAN> <BR> and bx,0fh<SPAN=20
style=3D"DISPLAY: none"> i=16{u=1Ak=0E&=15=1A =
</SPAN> <BR> shr=20
eax,4<SPAN style=3D"DISPLAY: none"> 3=1B=16`{ vDN=20
</SPAN> <BR> mov es,ax<SPAN=20
style=3D"DISPLAY: none"> c5I=06 F=1F5@a </SPAN> <BR> =
mov=20
cx,word ptr [bp].TrackNumber<SPAN style=3D"DISPLAY: =
none">=20
O[l/=3D=1B]=15tj </SPAN> <BR> xchg =
ch,cl<SPAN=20
style=3D"DISPLAY: none"> K+=04Q=03=1B*{ > =
</SPAN> <BR> shl=20
cl,6<SPAN style=3D"DISPLAY: none"> 1' =06E4=14=089=20
</SPAN> <BR> add cl,byte ptr=20
[bp].SectorNumber<SPAN style=3D"DISPLAY: none"> ~=0FEp3=14z-_s=20
</SPAN> <BR> mov ah,byte ptr=20
[bp].FunctionNumber<SPAN style=3D"DISPLAY: none"> _SKqjUPR=03=0E=20
</SPAN> <BR> mov al,byte ptr=20
[bp].NumberOfSectors<SPAN style=3D"DISPLAY: none"> =1DZ\ =
]=19&] =12=20
</SPAN> <BR> mov dh,byte ptr=20
[bp].HeadNumber<SPAN style=3D"DISPLAY: none"> ~=07HKw@x5F=20
</SPAN> <BR> mov dl,byte ptr=20
[bp].DriveNumber<SPAN style=3D"DISPLAY: none"> =02Wx\^K5:N\=20
</SPAN> <BR>;<SPAN style=3D"DISPLAY: none"> .F=08 ~"=08@{j=20
</SPAN> <BR>; =B8=C3GetSector()=BA=AF=CA=FD=CA=C7=D2=BB=B8=F6 =
=B9=AB=B9=B2=BA=AF=CA=FD=A3=AC=CB=F9=D2=D4=B0=FC=BA=AC=C1=CB=C8=FD=B8=F6B=
IOS int 13 =D6=D0=B6=CF=B9=A6=C4=DC=B5=F7=D3=C3=A1=A3<SPAN=20
style=3D"DISPLAY: none"> c|A}7C~=18F< </SPAN> <BR>;<SPAN=20
style=3D"DISPLAY: none"> Up=0E?)?;;~( </SPAN> <BR> =
cmp=20
dl,1 ;=B1=C8=BD=CF=CA=C7=B7=F1=CA=C7 Floppy =
=B4=C5=C5=CC<SPAN style=3D"DISPLAY: none"> + =1A=20
Pi.=124 </SPAN> <BR> jne gs3<SPAN=20
style=3D"DISPLAY: none"> c=1D%e&~I+ =1D =
</SPAN> <BR> cmp=20
ah,4 =
;=B1=C8=BD=CF=CA=C7=B7=F1=CA=C7=B9=A6=C4=DC=B5=F7=D3=C3int 13 0x4 =
(Verify Disk Sectors)<SPAN=20
style=3D"DISPLAY: none"> )R=1F:P"=04%=1AB </SPAN> <BR> =
jg =20
gs3<SPAN style=3D"DISPLAY: none"> =04{fDAN=03J+E =
</SPAN> <BR> =20
cmp ah,0 =
;=B1=C8=BD=CF=CA=C7=B7=F1=CA=C7=B9=A6=C4=DC=B5=F7=D3=C3int 13 0x0 (Reset =
Disk=20
System)<SPAN style=3D"DISPLAY: none"> 5,Z=11<.W|<}=20
</SPAN> <BR> je gs1<SPAN=20
style=3D"DISPLAY: none"> [ T=03^=041=01N </SPAN> <BR> =
cmp =20
ah,2 =
;=B1=C8=BD=CF=CA=C7=B7=F1=CA=C7=B9=A6=C4=DC=B5=F7=D3=C3int 13 0x2 (Read =
Disk Sectors)<SPAN=20
style=3D"DISPLAY: none"> `&=04=10=1CV=15=19=1E =
</SPAN> <BR> jl=20
gs3<SPAN style=3D"DISPLAY: none"> ;H=1B2jTX*=14=3D=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">ZlIe& LVHl=20
</SPAN> <BR>gs1: ;=B8=B4=CE=BB=B4=C5=C5=CC<SPAN =
style=3D"DISPLAY: none">=20
5q:|eb]4=10_ </SPAN> <BR>;<SPAN style=3D"DISPLAY: none"> =
=1F=18=18=02~g|]^=20
</SPAN> <BR>; We need to point the BIOS disk-table vector to =
our own=20
table for this<SPAN style=3D"DISPLAY: none"> \=152Aj;uX(=1C =
</SPAN> <BR>;=20
drive.<SPAN style=3D"DISPLAY: none"> !=16.=15;BxeQ =
</SPAN> <BR>;<SPAN=20
style=3D"DISPLAY: none"> kGTG' =10p=035 </SPAN> <BR> =
push=20
es<SPAN style=3D"DISPLAY: none"> j=19Xc=04xh\1" =
</SPAN> <BR> =20
push bx<SPAN style=3D"DISPLAY: none"> =
N|=111">=17=194t=20
</SPAN> <BR> push di<SPAN =
style=3D"DISPLAY: none">=20
}C0=08n+.2"K </SPAN> <BR><SPAN style=3D"DISPLAY: =
none">=3D.=1FSnl}1W{=20
</SPAN> <BR> push 0<SPAN =
style=3D"DISPLAY: none">=20
d=12=1FQ=01ogbA </SPAN> <BR> pop es<SPAN=20
style=3D"DISPLAY: none"> =13/9#=07b=0Erf=3D </SPAN> <BR><SPAN =
style=3D"DISPLAY: none">o=1CMTdDc=1A: </SPAN> <BR> =
mov =20
di, offset DGROUP:_RomDiskBasePointer<SPAN style=3D"DISPLAY: =
none"> i=20
&1=0F=11 Nl </SPAN> <BR><SPAN style=3D"DISPLAY: =
none">=17A5 \<-sTm=20
</SPAN> <BR>; DISK_TABLE_VECTOR equ 01Eh =
*=20
4<SPAN style=3D"DISPLAY: none"> 1Xvs =15 tIG </SPAN> <BR>; =
01Eh *=20
=
4=A3=A80000=A3=BA0078h=A3=A9=D6=B8=CF=F2=B5=C4=CA=C7BIOS=D6=D0=B6=CF=CF=F2=
=C1=BFint =
1e,=B8=C3=D6=D0=B6=CF=CF=F2=C1=BF=D6=B8=CF=F2=C1=CB=B4=C5=C5=CC=B2=CE=CA=FD=
=B1=ED<SPAN style=3D"DISPLAY: none">=20
>A=1Fnj;-f=12=13 </SPAN> <BR>;=20
=
=CF=C2=C3=E6=B5=C4=B4=FA=C2=EB=B5=C4=D2=E2=CB=BC=BE=CD=C7=E5=B3=FE=C3=F7=C1=
=CB=C1=CB=A3=AC=BD=AB=B4=C5=C5=CC=B2=CE=CA=FD=B1=ED=B8=B4=D6=C6=B3=F6=C0=B4=
=A3=AC=BD=AB=CE=D2=C3=C7=B5=C4=B4=C5=C5=CC=B2=CE=CA=FD=B1=ED_DiskBaseTabl=
e=D7=B0=C8=EB=B5=BD<SPAN=20
style=3D"DISPLAY: none"> ' P}%@@|&=14 </SPAN> <BR>;=20
=
0000:0078=B4=A6=A3=AC=D4=DA=B8=B4=CE=BB=B4=C5=C5=CC=BA=F3=A3=AC=D4=D9=BD=AB=
=D4=AD=CA=BC=B5=C4=D2=D1=BE=AD=B8=B4=D6=C6=B3=F6=B5=C4=B4=C5=C5=CC=B2=CE=CA=
=FD=B1=ED=D7=B0=C8=EB=B5=BD_DiskBaseTable=D6=D0,=D5=E2=D1=F9=D7=F6=B5=C4<=
SPAN=20
style=3D"DISPLAY: none"> B=1E<|i' =1FE] </SPAN> <BR>;=20
=
=BA=C3=B4=A6=CA=C7=B1=DC=C3=E2=CE=D2=C3=C7=B2=D9=D7=F7=D4=AD=CA=BC=B5=C4=B4=
=C5=C5=CC=B2=CE=CA=FD=B1=ED=A3=AC=D4=AD=CA=BC=B5=C4=B4=C5=C5=CC=B2=CE=CA=FD=
=B1=ED=C4=E3=BF=C9=D2=D4=B2=CE=BF=BC=A1=B6=B6=D4ntldr=B5=C4=B7=B4=BB=E3=B1=
=E0=B7=D6=CE=F6=A1=B7<SPAN style=3D"DISPLAY: none">=20
=03=0E{=1B=109=0F =1Ac </SPAN> <BR> mov =20
bx,es:[DISK_TABLE_VECTOR]<SPAN style=3D"DISPLAY: none"> =
F=17d#=14=19t=0E:a=20
</SPAN> <BR> mov [di],bx<SPAN=20
style=3D"DISPLAY: none"> =10b35E=1Bo`IT </SPAN> <BR> =
mov=20
bx,es:[DISK_TABLE_VECTOR+2]<SPAN style=3D"DISPLAY: none"> =
}NL)3[5gd`=20
</SPAN> <BR> mov [di+2],bx<SPAN=20
style=3D"DISPLAY: none"> =17=08t=07[Z=13Z}=01 =
</SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">=08&RzD.t/EG </SPAN> <BR>;Public=20
_DiskBaseTable =
=CE=D2=C3=C7=D7=D4=BC=BA=D6=D8=D0=C2=B6=A8=D2=E5=C1=CB=B4=C5=C5=CC=B2=CE=CA=
=FD=B1=ED<SPAN style=3D"DISPLAY: none">=20
"=05=06=0E?K5G7' </SPAN> <BR>;_DiskBaseTable equ =
$<SPAN=20
style=3D"DISPLAY: none"> ZGG]=03ac9Qk </SPAN> <BR>; =
SpecifyBytes=20
dw 0<SPAN style=3D"DISPLAY: none"> .dk<\P(#(} =
</SPAN> <BR>; =20
WaitTime db 0<SPAN style=3D"DISPLAY: none"> =
@:8=15=11=0E>;"e=20
</SPAN> <BR>; SectorLength db 0<SPAN style=3D"DISPLAY: =
none">=20
Z=17PlI=10=15&7=03 </SPAN> <BR>; LastSector =
db 0<SPAN=20
style=3D"DISPLAY: none"> N=10z}=06DX.r=02 </SPAN> <BR>; =
SecGapLength=20
db 0<SPAN style=3D"DISPLAY: none"> =02h7k gh%=11 =
</SPAN> <BR>; =20
DataTransfer db 0<SPAN style=3D"DISPLAY: none"> c%[=06A Y=11) =
</SPAN> <BR>;=20
TrackGapLength db 0<SPAN style=3D"DISPLAY: none"> X =
M^=3Dg4x}P=20
</SPAN> <BR>; DataValue db 0<SPAN=20
style=3D"DISPLAY: none"> h2=03=02P=10yb]* </SPAN> <BR>; =
HeadSettle=20
db 0<SPAN style=3D"DISPLAY: none"> F^=0FE_=1C-V=01m =
</SPAN> <BR>;=20
StartupTime db 0<SPAN style=3D"DISPLAY: none"> =
=07bCjQ=1Dh5~=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">+M#=10;}b=06=15K=20
</SPAN> <BR> mov bx,offset=20
DGROUP:_DiskBaseTable<SPAN style=3D"DISPLAY: none"> z0MM =05528=20
</SPAN> <BR> mov =
es:[DISK_TABLE_VECTOR],bx<SPAN=20
style=3D"DISPLAY: none"> -a04M=15:}| </SPAN> <BR> =
mov =20
bx,ds<SPAN style=3D"DISPLAY: none"> =1A1d=08g=15=03@=3D=08 =
</SPAN> <BR> =20
mov es:[DISK_TABLE_VECTOR+2],bx<SPAN =
style=3D"DISPLAY: none">=20
=11X/Q)&z{=14! </SPAN> <BR><SPAN style=3D"DISPLAY: =
none">f=03%#Y=19N/F=14=20
</SPAN> <BR> pop di<SPAN =
style=3D"DISPLAY: none">=20
43E=18WFnHDv </SPAN> <BR> pop bx<SPAN=20
style=3D"DISPLAY: none"> =11nvB@c=1B=18=01# =
</SPAN> <BR> pop=20
es<SPAN style=3D"DISPLAY: none"> +=19=19E5p{ Yp =
</SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">=02S36 =06E=01j, </SPAN> <BR>; =
BIOS_DISK_INTERRUPT=20
equ 13h =B9=A6=C4=DC=BA=C5ah=3D0<SPAN =
style=3D"DISPLAY: none"> '5go\"=20
iE=19 </SPAN> <BR> int =
BIOS_DISK_INTERRUPT<SPAN=20
style=3D"DISPLAY: none"> :0(cd=3D=08MxE </SPAN> <BR> =
=20
<SPAN style=3D"DISPLAY: none">mtiZ9U +7=1D =
</SPAN> <BR> =20
push es<SPAN style=3D"DISPLAY: none"> _A^ ~m`%1N=20
</SPAN> <BR> push bx<SPAN =
style=3D"DISPLAY: none">=20
=17 b ZtMQea </SPAN> <BR> push di<SPAN=20
style=3D"DISPLAY: none"> +v~S>{P!y1 </SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">XB=11=16m&?=10=1D. =
</SPAN> <BR> push=20
0<SPAN style=3D"DISPLAY: none"> <?>S tj'bb=20
</SPAN> <BR> pop es<SPAN =
style=3D"DISPLAY: none">=20
{=13)8E=117Q=08 </SPAN> <BR><SPAN style=3D"DISPLAY: =
none">=1AXW;oxZ1t&=20
</SPAN> <BR> mov di, offset=20
DGROUP:_RomDiskBasePointer<SPAN style=3D"DISPLAY: none"> =
Rqko:a=06e=07X=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">=14=03 gz>sFcv=20
</SPAN> <BR> mov bx, [di]<SPAN=20
style=3D"DISPLAY: none"> =1F#=02Ejo</p </SPAN> <BR> =
mov=20
es:[DISK_TABLE_VECTOR],bx<SPAN style=3D"DISPLAY: none"> =
Pi>=03=17d=083f=20
</SPAN> <BR> mov bx, [di+2]<SPAN=20
style=3D"DISPLAY: none"> }=04>=1C5slKv </SPAN> <BR> =
mov=20
es:[DISK_TABLE_VECTOR+2],bx<SPAN style=3D"DISPLAY: none"> =
=16=08 C=08_=16=1BEn=20
</SPAN> <BR><SPAN style=3D"DISPLAY: =
none">Pu=08m=02=13=05I=1Ft=20
</SPAN> <BR> pop di<SPAN =
style=3D"DISPLAY: none"> y=20
=1Cu=038=0F2o=1F </SPAN> <BR> pop bx<SPAN =
style=3D"DISPLAY: none"> =06G=13=18bnoB: </SPAN> <BR> =
pop =20
es<SPAN style=3D"DISPLAY: none"> $zhP=11a=17y|y =
</SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">F=15 zn1W=13;l </SPAN> <BR> =
jc =20
gs5 ;=C8=E7=B9=FBint 13 ah=3D0 =
=B3=F6=B4=ED=A3=AC=D4=F2=BD=F8=CE=BB=B1=EA=D6=BECF=3D1=A3=AC=B4=ED=CE=F3=D0=
=C5=CF=A2=B4=E6=B7=C5=D4=DAah=D6=D0<SPAN=20
style=3D"DISPLAY: none"> 7=05X`=1Dv~!Nt </SPAN> <BR> =
xor=20
eax,eax<SPAN style=3D"DISPLAY: none"> So=13 b=1BAr^}=20
</SPAN> <BR> jmp short gs5<SPAN=20
style=3D"DISPLAY: none"> g=1B =08>e)=13hP =
</SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">}=10=0F1cO=19=15h=06 =
</SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">%=02<[u=08=05S#=1E =
</SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">=14=17]_w7smz* </SPAN> <BR>gs3:<SPAN=20
style=3D"DISPLAY: none"> +0tQ=1Al=1A=07=16m </SPAN> <BR><SPAN =
style=3D"DISPLAY: none">d.c0W=15|RQc </SPAN> <BR>;<SPAN=20
style=3D"DISPLAY: none"> Fd=08=18}2+=1B@{ </SPAN> <BR>; =
=B5=F7=D3=C3bios =D6=D0=B6=CF=B5=F7=D3=C3=B6=C1=C8=A1=C9=C8=C7=F8<SPAN=20
style=3D"DISPLAY: none"> =131=08NT=14v2=01=11 =
</SPAN> <BR>;<SPAN=20
style=3D"DISPLAY: none"> =06vNR-=0F p </SPAN> <BR>if 0<SPAN=20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -