📄 ntldr内存初始化、分配、操作及相关函数分析.mht
字号:
</SPAN> <BR><SPAN style=3D"DISPLAY: none">XC=14!Wh =1D x=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">ek\n; K&2G=20
</SPAN> <BR> =A1=FD<SPAN =
style=3D"DISPLAY: none">=20
*=15>)L7 rt =
</SPAN> <BR>Address:00100000(00100000~007FFFFF)Size:7M;=20
Type:ARR<SPAN style=3D"DISPLAY: none"> =
5=14S?=05D^=05L=12=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">p/=175=07zx)y0=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">I fr@*m,Hq=20
=
</SPAN> <BR>Sumain.c=D6=D0=B0=FC=BA=ACosLoader=B5=C4=D3=B3=C9=E4=B2=BF=
=B7=D6=A3=BA<SPAN style=3D"DISPLAY: none">=20
=3Dshw[1G1=17=1E </SPAN> <BR><SPAN style=3D"DISPLAY: =
none">=17=02 =1C=1EL$Nul=20
</SPAN> <BR>CurrentEntry =3D MemoryDescriptorList;<SPAN=20
style=3D"DISPLAY: none"> =13!j=1D_qs=04=1Ev </SPAN> <BR><SPAN =
style=3D"DISPLAY: none">j:=10=01zzV/[h </SPAN> <BR>// =
=C6=E4=CA=B5=D5=E2=B8=F6=D1=AD=BB=B7=CC=E5=D2=AA=BA=CD=CF=C2=C3=E6=B5=C4 =
if=20
=
=C5=D0=B6=CF=D3=EF=BE=E4=BA=CF=C6=F0=C0=B4=C0=ED=BD=E2=B2=C5=CB=E3=C7=E5=B3=
=FE=A3=AC=D4=DA=D4=AD=C0=B4=B5=C4=B4=FA=C2=EB=D6=D0=CE=D2=BF=B4=B5=BD=CB=FB=
=C3=C7=B1=BB=B7=D6=BF=AA=A3=AC=CB=F9=D2=D4=BE=F5//=20
=
=B5=C3=D5=E2=B5=C4=B4=FA=C2=EB=D3=D0=B5=E3=BB=AD=C9=DF=CC=ED=D7=E3=B5=C4=D2=
=E2=CB=BC=A3=AC=C6=E4=CA=B5=B2=BB=C8=BB=A3=AC=D1=AD=BB=B7=D5=D2=B5=BD=D7=EE=
=BA=F3=D2=BB=B8=F6=C4=DA=B4=E6=C3=E8=CA=F6=B7=FB=BF=E9=A3=AC=C8=BB=BA=F3=B6=
=D4=CB=FB=BD=F8=D0=D0=C5=D0=B6=CF=A3=AC=D2=D4=B2=E9=BF=B4// =
=C4=E3=B5=C4=B5=E7=C4=D4=CA=C7=B7=F1=D6=BB=D3=D0640K=B5=C4=C4=DA=B4=E6=A1=
=A3<SPAN=20
style=3D"DISPLAY: none"> Z=17i^7i=19EY </SPAN> <BR> =
while=20
((CurrentEntry->BlockBase !=3D 0) &&<SPAN =
style=3D"DISPLAY: none">=20
t]b.^6kg>9 </SPAN> <BR> =20
(CurrentEntry->BlockSize !=3D 0)) {<SPAN style=3D"DISPLAY: =
none">=20
O-=1FG&k=15NE </SPAN> <BR> =
CurrentEntry++;<SPAN=20
style=3D"DISPLAY: none"> m8ICP=14>#QX </SPAN> <BR> =
}<SPAN=20
style=3D"DISPLAY: none"> O=1F=05=15=05 =1E=16P^ =
</SPAN> <BR> if=20
((CurrentEntry->BlockBase =3D=3D 0) &&<SPAN =
style=3D"DISPLAY: none">=20
9d=19=1D_k"}A^ </SPAN> <BR> =
(CurrentEntry->BlockSize <=20
(ULONG)512 * (ULONG)1024)) {<SPAN style=3D"DISPLAY: none"> =
{R[=1E=05zu+=3DV=20
</SPAN> <BR> =
//=C8=E7=B9=FB=C4=E3=B5=C4=BB=FA=C6=F7=D5=E6=B5=C4=D6=BB=D3=D0640K=C4=
=DA=B4=E6=A3=AC=B2=BB=BA=C3=D2=E2=CB=BC=A3=AC=D5=E6=B5=C4=B8=C3=BB=BB=B5=E7=
=C4=D4=C1=CB<SPAN=20
style=3D"DISPLAY: none"> 6r=13Ug`b=0E;{ </SPAN> <BR> =
=20
BlPrint(SU_NO_LOW_MEMORY,CurrentEntry->BlockSize/1024);<SPAN=20
style=3D"DISPLAY: none"> 60I1C1Lc<=06 </SPAN> <BR> =
while=20
(1) {<SPAN style=3D"DISPLAY: none"> c"=037P2%soG =
</SPAN> <BR> =20
}<SPAN style=3D"DISPLAY: none"> [*VVH{Z8=0E=0E =
</SPAN> <BR> =20
}<SPAN style=3D"DISPLAY: none"> nBP.B{f8L? </SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">_!}j=3D]!=08`( </SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">@;=18~=16=10s?=01H </SPAN> <BR> =
//<SPAN=20
style=3D"DISPLAY: none"> [FMv=14J=10 Ll </SPAN> <BR>//=20
=
=C8=B7=B1=A3=D4=DA=C4=DA=B4=E6=C3=E8=CA=F6=B7=FB=B1=ED=C3=E8=CA=F6=B5=C4=C4=
=DA=B4=E6=D6=D0=C8=B7=CA=B5=C4=DC=C8=DD=C4=C9=CF=C2 osloader image<SPAN =
style=3D"DISPLAY: none">=20
?7(qw=14=1Cc{D </SPAN> <BR>//<SPAN style=3D"DISPLAY: none"> =
*=14piy6of=14=20
</SPAN> <BR> //=20
=
=C6=E4=CA=B5=D5=E2=C0=EF=B2=C5=CA=C7=CE=D2=B6=AF=D3=C3bochs=B5=F7=CA=D4=C6=
=F7=B5=C4=D5=E6=D5=FD=D4=AD=D2=F2=A3=AC=C0=ED=D3=C9=BA=DC=BC=F2=B5=A5=A3=AC=
=CE=D2=B6=D4=D5=E2=C0=EF=B5=C4=B5=D8=D6=B7=B8=D0=B5=BD=BA=DC=C0=A7=BB=F3=A3=
=AC=C3=BB=D3=D0=D4=DA=C6=E4=CB=FB// =
=B5=C4=B4=FA=C2=EB=D6=D0=D5=D2=B5=BD=B9=D8=D3=DA edata=20
=
=B5=C4=CA=B2=C3=B4=B8=B3=D6=B5=B2=D9=D7=F7=A3=A8=B3=FD=C1=CBsu.asm=D6=D0=A3=
=A9=A3=AC=CB=F9=D2=D4=CE=D2=B2=BB=C4=DC=C8=B7=B6=A8osloader=B5=C4=BC=D3=D4=
=D8=CE=BB=D6=C3=B5=BD//=20
=
=B5=D7=CA=C7=D4=DA=C4=C4=C0=EF=A3=A8=CA=B5=D4=DA=CA=C7=D5=D2=B2=BB=B5=BD=D2=
=BB=B5=E3=CF=E0=B9=D8=B5=C4=D7=CA=C1=CF=A3=AC=D2=F2=B6=F8=B3=F6=BA=EC=D5=EE=
=B7=A2=B8=DF=C9=D5=B2=A1=C1=CB=A3=AC=B2=EE=B5=E3=BE=CD GAME =
OVER=C1=CB=A3=A9=A1=A3<SPAN=20
style=3D"DISPLAY: none"> I=10cKDbs!ea </SPAN> <BR>//<SPAN=20
style=3D"DISPLAY: none"> =08bFf#jGB=18$ </SPAN> <BR> // =
=
=D2=D4=CF=C2=CA=C7bochs=B5=F7=CA=D4=B3=F6=B5=C4=D6=B8=C1=EE=B4=FA=C2=EB=A3=
=BA<SPAN style=3D"DISPLAY: none"> w=03~`Ig=01=16 '=20
</SPAN> <BR> // mov ax,word ptr ds:0x1e00 ; =
ax=3D0x0000=20
=A8KImageBase<SPAN style=3D"DISPLAY: none"> '_Z=04=15/-#\4 =
</SPAN> <BR> =20
// mov dx,word ptr ds:0x1e02 ; dx=3D0x0030 =A8J<SPAN=20
style=3D"DISPLAY: none"> !j`=15=18-.\t=16 </SPAN> <BR> =
// mov word ptr=20
ss:[bp+0xffea],ax<SPAN style=3D"DISPLAY: none"> =174^v=16G< =
=12=1F=20
</SPAN> <BR> // mov word ptr ss:[bp+0xffec],dx<SPAN=20
style=3D"DISPLAY: none"> 15{=1D=14$$=11|S </SPAN> <BR> =
// mov cx,word=20
ptr ds:0x1e1c ; cx=3D0x1000 =A8KImageSize<SPAN =
style=3D"DISPLAY: none">=20
qY&I'=05hh=0FP </SPAN> <BR> // mov bx,word ptr =
ds:0x1e1e =20
; bx=3D0x0006 =A8J<SPAN style=3D"DISPLAY: none"> 6=15AI=1CD.=08E(=20
</SPAN> <BR> // mov word ptr ss:[bp+0xffe6],cx<SPAN=20
style=3D"DISPLAY: none"> oj=0Eh_eA=04=11=05 =
</SPAN> <BR> // mov word ptr=20
ss:[bp+0xffe8],bx<SPAN style=3D"DISPLAY: none"> C8*=12LJ`uL5=20
</SPAN> <BR> // mov word ptr ds:0x1680,ax =
=A8KOsLoaderBase<SPAN=20
style=3D"DISPLAY: none"> =02Y|?L&R=13wg =
</SPAN> <BR> // mov word=20
ptr ds:0x1682,dx =A8J<SPAN style=3D"DISPLAY: none"> %NvP%L8d Q=20
</SPAN> <BR> // add ax,word ptr ds:0x1e44 ;=20
ax=3D0xf000<SPAN style=3D"DISPLAY: none"> =16=072&ee=04@"b=20
</SPAN> <BR> // adc dx,word ptr ds:0x1e46 ;=20
dx=3D0x0032<SPAN style=3D"DISPLAY: none"> i=1D=3D.=1A=0FG*X =
</SPAN> <BR> //=20
mov word ptr ds:0x1684,ax =A8KOsLoaderExports<SPAN =
style=3D"DISPLAY: none">=20
i=03M!Isk 4 </SPAN> <BR> // mov word ptr ds:0x1686,dx =
=A8J<SPAN=20
style=3D"DISPLAY: none"> 4Z,Uv=03pg6S </SPAN> <BR> =
//<SPAN=20
style=3D"DISPLAY: none"> =1F{gX".=1BzY_ </SPAN> <BR> // =
=
=CE=D2=B2=BB=C4=DC=C8=B7=B6=A8OptionalHeader=D5=E2=CC=F5=B4=FA=C2=EB=D4=DA=
=B7=B4=BB=E3=B1=E0=B3=F6=B5=C4=D6=B8=C1=EE=D6=D0=B5=C4=CE=BB=D6=C3=A3=AC=CE=
=D2=D2=B2=C3=BB=D3=D0=D5=D2=B5=BD=BA=CD=D5=E2=CC=F5=B4=FA=C2=EB=CF=E0=B9=D8=
=B5=C4=D6=B8<SPAN=20
style=3D"DISPLAY: none"> [=1B=1Cu bM>cO </SPAN> <BR>// =
=C1=EE=A3=AC=CB=F9=D2=D4=D4=DA=D5=E2=C0=EF=CE=D2=D3=D0=D2=BB=B8=F6=B2=C2=B2=
=E2=A3=AC=BC=B4=20
ntldr =
=BE=AD=B9=FD=B1=E0=D2=EB=D3=C5=BB=AF=D2=D4=BA=F3=A3=ACosloader =B5=C4 =
Standard fields =BA=CD NT <SPAN=20
style=3D"DISPLAY: none">v7=1A=18)=13g=1B` </SPAN> <BR>// =
additional fields=20
=
=B1=BB=B7=C5=D4=DA=C1=CB=B9=CC=B6=A8=B5=C4=CE=BB=D6=C3=A3=AC=CE=D2=C3=C7=BF=
=C9=D2=D4=BF=B4=B5=BD ImageBase =CA=C7 NT additional fields =
=B5=C4=B5=DA//=20
=
=D2=BB=B8=F6=D7=D6=B6=CE=A3=AC=D4=DAbochs=B5=F7=CA=D4=B3=F6=B5=C4=B4=FA=C2=
=EB=D6=D0=D6=B1=BD=D3=B7=C3=CE=CAds:0x1e00=B4=A6=B5=C3=C0=B4=A1=A3<SPAN =
style=3D"DISPLAY: none">=20
8sR@fg<ZzP </SPAN> <BR>// =
=B8=C3=B4=A6=C8=E7=B9=FB=B2=BB=CA=C7=CC=AB=C3=F7=C1=CB=A3=AC=C4=E3=BF=C9=D2=
=D4=B2=CE=D5=D5=D2=BB=CF=C2 _IMAGE_OPTIONAL_HEADER=20
=B5=C4=BD=E1=B9=B9=B6=A8=D2=E5=A3=A8winnt.h=A3=A9=A1=A3<SPAN =
style=3D"DISPLAY: none"> E|=15}N;u1%0=20
</SPAN> <BR>//<SPAN style=3D"DISPLAY: none"> *p;&U=0E-2Ci =
</SPAN> <BR> OptionalHeader =3D=20
(PIMAGE_OPTIONAL_HEADER)((PUCHAR)&edata +=20
sizeof(IMAGE_FILE_HEADER));<SPAN style=3D"DISPLAY: none"> =
qSWi#j)=1Bm=20
</SPAN> <BR> ImageBase =3D =
OptionalHeader->ImageBase;<SPAN=20
style=3D"DISPLAY: none"> V=18T=1Fd)vT+h </SPAN> <BR> =
ImageSize =3D=20
OptionalHeader->SizeOfImage;<SPAN style=3D"DISPLAY: none"> =
Fv=06FHUxj@$=20
</SPAN> <BR> OsLoaderBase =3D ImageBase;<SPAN=20
style=3D"DISPLAY: none"> )=16EUq=18=03t]=1E =
</SPAN> <BR>OsLoaderExports =3D=20
ImageBase +=20
=
OptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAdd=
ress;<SPAN=20
style=3D"DISPLAY: none"> keh=15=01DjOU=18 =
</SPAN> <BR>CurrentEntry =3D=20
MemoryDescriptorList;<SPAN style=3D"DISPLAY: none"> g< -Tf.|NC=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">L@y=0FR=07|9v(=20
</SPAN> <BR>while (ImageSize > 0) {<SPAN style=3D"DISPLAY: =
none">=20
wkO_?o"pqo </SPAN> <BR> //=20
=
=D5=E2=B8=F6=D1=AD=BB=B7=CC=E5=BF=B4=CB=C6=B8=B4=D4=D3=A3=AC=C6=E4=CA=B5=CB=
=FB=D2=AA=D7=F6=B5=C4=CA=C2=C7=E9=BA=DC=BC=F2=B5=A5=A3=AC=BC=B4=BC=EC=D1=E9=
=CE=D2=C3=C7=C7=B0=C3=E6=CB=F9=BB=AD=B5=C4=C4=DA=B4=E6=C3=E8=CA=F6=B7=FB=C1=
=B4=B1=ED=D6=D0=CA=C7=B7=F1=D3=D0// =
=D7=E3=B9=BB=B5=C4=C4=DA=B4=E6=BF=E9=C4=DC=B0=FC=BA=AC=CE=D2=C3=C7=D2=AA=BC=
=D3=D4=D8=B5=C4=20
osloader<SPAN style=3D"DISPLAY: none"> yO{ XpF3F=1D =
</SPAN> <BR> =20
while (CurrentEntry->BlockSize !=3D 0) {<SPAN=20
style=3D"DISPLAY: none"> =1D. Kj3oI/r </SPAN> <BR> =
=20
BlockEnd =3D CurrentEntry->BlockBase +=20
CurrentEntry->BlockSize;<SPAN style=3D"DISPLAY: none"> =
j~MF=1FT#[O=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">vUQ=11n=10 g0!=20
</SPAN> <BR> if=20
((CurrentEntry->BlockBase <=3D ImageBase) &&<SPAN=20
style=3D"DISPLAY: none"> AhP=17V.=14n=11s </SPAN> <BR> =
=20
(BlockEnd > ImageBase)) {<SPAN style=3D"DISPLAY: =
none">=20
iZ=12OLId=049 </SPAN> <BR><SPAN style=3D"DISPLAY: =
none">=08LG9Jh ogI=20
</SPAN> <BR> //<SPAN=20
style=3D"DISPLAY: none"> >T=3DR8_hvuj </SPAN> <BR> =
=20
// this descriptor at least partially contains a =
chunk<SPAN=20
style=3D"DISPLAY: none"> VT=14lQc&*[p </SPAN> <BR> =
=20
// of the osloader.<SPAN style=3D"DISPLAY: =
none"> z=0F=20
,=18) D<=1B </SPAN> <BR> =
//<SPAN=20
style=3D"DISPLAY: none"> .K]{=04lv/=16 </SPAN> <BR> =
=20
if (BlockEnd-ImageBase > ImageSize) {<SPAN=20
style=3D"DISPLAY: none"> a&6=14Vj=1BfO </SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">M'=1C'B| 9s~ </SPAN> <BR> =
=20
ImageSize =3D 0; // =
=C8=E7=B9=FB=D3=D0=D7=E3=B9=BB=B5=C4=C4=DA=B4=E6=BF=E9=A3=AC=C4=C7=C3=B4=CE=
=D2=C3=C7=BD=AB ImageSzie=20
=D6=C30=A3=AC=D2=D4=B4=CB=D7=F7=CE=AA=D1=E9// =
=D6=A4=B1=EA=D6=BE<SPAN style=3D"DISPLAY: none"> =1C:`=04V9=150|f=20
</SPAN> <BR> } else {<SPAN=20
style=3D"DISPLAY: none"> GC=1E4we v=02=04 </SPAN> <BR> =
=20
ImageSize -=3D (BlockEnd-ImageBase);<SPAN=20
style=3D"DISPLAY: none"> @TF=1B=03i- </SPAN> <BR> =
=20
ImageBase =3D BlockEnd;<SPAN =
style=3D"DISPLAY: none">=20
Z>=04% 8cZa$ </SPAN> <BR> =
}<SPAN=20
style=3D"DISPLAY: none"> 2 =14Bk+=02rc=03 </SPAN> <BR><SPAN=20
style=3D"DISPLAY: none">=13V-/ g:Bo] </SPAN> <BR> =
=20
//<SPAN style=3D"DISPLAY: none"> XIzQ(T=13Fj-=20
</SPAN> <BR> // look for =
remaining=20
part (if any) of osloader<SPAN style=3D"DISPLAY: none"> V,z=07=1D =
< =1E=20
</SPAN> <BR> //<SPAN=20
style=3D"DISPLAY: none"> < Q=1BhU=06Lof </SPAN> <BR> =
=20
CurrentEntry =3D MemoryDescriptorList;<SPAN=20
style=3D"DISPLAY: none"> =0EhGE=1DSt=1Au </SPAN> <BR> =
=20
break;<SPAN style=3D"DISPLAY: none"> }D=05`,vQh=11o=20
</SPAN> <BR> }<SPAN =
style=3D"DISPLAY: none">=20
K=1B6h=1CtN7=02c </SPAN> <BR> =20
CurrentEntry++;<SPAN style=3D"DISPLAY: none"> n[?=10=1D,=12G !=20
</SPAN> <BR> }<SPAN style=3D"DISPLAY: none"> =
=0Fb;2=07RSE.@=20
</SPAN> <BR> if (CurrentEntry->BlockSize =
=3D=3D 0) {<SPAN=20
style=3D"DISPLAY: none"> u=05p-\=1BR9M </SPAN> <BR> =
=20
break;<SPAN style=3D"DISPLAY: none"> v3&\=01=04tV=045=20
</SPAN> <BR> }<SPAN style=3D"DISPLAY: none"> =
x=0F=13 ;*iu.8=20
</SPAN> <BR> }<SPAN style=3D"DISPLAY: none"> =
Gt_Uc=1Dp7=11O=20
</SPAN> <BR><SPAN style=3D"DISPLAY: none">.n);*5t%g=13=20
</SPAN> <BR> if (ImageSize > 0) { // =
=C8=E7=B9=FB=CE=D2=C3=C7=B5=C4 ImageSize=20
=
=D1=E9=D6=A4=B1=EA=D6=BE=D2=C0=C8=BB=B2=BB=CE=AA0=A3=AC=C4=C7=C3=B4=B4=F2=
=D3=A1=B3=F6=B4=ED=D0=C5=CF=A2<SPAN style=3D"DISPLAY: none"> =
mQhH=0E=17=08UR=20
</SPAN> <BR> //<SPAN style=3D"DISPLAY: none"> =
p:2P+=08rt A=20
</SPAN> <BR> // We could not relocate the =
osloader to=20
high memory. Error out<SPAN style=3D"DISPLAY: none"> =08+#=19 =
=15%Q=17=1B=20
</SPAN> <BR> // and display the memory map.<SPAN =
style=3D"DISPLAY: none"> E3bpH =1Ebb </SPAN> <BR> =
//<SPAN=20
style=3D"DISPLAY: none"> k2>Z=04rq64T </SPAN> <BR> =
=20
BlPrint(SU_NO_EXTENDED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -