Windows 2000 の ProductSuite 内部解析
NTKRNLPA.EXE の解析結果
オフセット 0047814C に ProductType の値をwchar_t 文字列で格納(12バイト目から)
(MmIsThisAnNtAsSystem で読み出せる)
オフセット 00484C08 に データ値を格納
レジストリの値から判断(ただし、頭の2文字しか見ていない)
WinNT 1
LanmanNT 2
ServerNT 3
0xFFDF0264(NtProductType)に値が格納される
00470090:MaximumIncrement
PhysicalPageSize バグ?代入されない
00485AD8:NumberOfPhysicalPages
00475C34:LowestPhysicalPage
004852B4:HighestPhysicalPage;
AllocationGranularity=0x10000 固定
LowestUserAddress=0x10000 固定
00485BB4:HighestUserAddress
00477220:ActiveProcessors
00477230:NumberProcessors
00477270:IsDynamicMemory
オフセット 00477B20 に ProductSuite の値をwchar_t 文字列で格納
オフセット 00476EA8 に データ値を格納
Small Business の場合 bit0(1)
Small Business(Restricted) の場合 bit5(0x20)
Enterprise の場合 bit1(2)
CommunicationServer の場合 bit3(8)
BackOffice の場合 bit2(4)
Terminal Server の場合 bit4(0x10)
Embedded NT の場合 bit6(0x40)
DataCenter の場合 bit7(0x80)
Personal(Home Edition) の場合 bit9(0x200)
Server Appliance の場合 bit10(0x400)
が格納される
さらに、Terminal Server の場合、値を 0 が 0xFFDF02D0(SuiteMask) に格納され
それ以外の場合は bit8 が1になって 0xFFDF02D0 に値が格納される
Server Appliance の場合は 9
DataCenter の場合は 12
それ以外の場合は 4
のパラメータが渡されて、起動画面が選択されてる気がする (VidBitBlt がコールされる)
L004167A0 の関数で指定したビットが有効かチェックしている.
メモリの上限を決めてるようなっぽいのが次の箇所 0x004852B4 に認識したメモリサイズが入っているっぽい...とおもったけど、HotAddMemoryの設定なので惜しかった
L0055CE19: cmp HotAddMemory,1 mov [ebp-14h],esi jnz L0055CE6E push ISDataCenter call CheckProductSuit cmp al,01h jnz L0055CE37 mov eax,00FFFFFFh // 16 M x 4k = 64G ? jmp L0055CE58 L0055CE37: cmp dword ptr [L00484C08],00690057h jz L0055CE53 push ISSERVER call CheckProductSuit cmp al,01h mov eax,001FFFFFh // 2M x 4k = 8G ? jz L0055CE58 L0055CE53: mov eax,000FFFFFh // 1M x 4k =4G ? L0055CE58: cmp [L00485AE0],esi mov [L00485B98],eax jnz L0055CE78 mov dword ptr [ebp-14h],00000001h jmp L0055CE78 |
Professionalで設定したらフリーズしてしまったでござる
SUB_L0055B14E: push ebp mov ebp,esp sub esp,00000010h cmp byte ptr [L00477314],01h jz L0055B2E9 push edi mov edi,[ebp+08h] push esi push ebx mov esi,00100000h// 1 M x 4k = 4G mov byte ptr [L00477314],01h mov ebx,[edi+64h] push ISDataCenter mov [ebp-0Ch],esi mov dword ptr [ebp+08h],00800000h call CheckProductSuit cmp al,01h jnz L0055B1A2 test ebx,ebx jnz L0055B196 mov esi,00800000h// 8 M x 4k = 32G jmp L0055B1D1 L0055B196: mov eax,00400000h// 4 M x 4k = 16G mov esi,eax mov [ebp+08h],eax jmp L0055B1D1 L0055B1A2: cmp dword ptr [L00484C08],00690057h jz L0055B1CB push ISSERVER call CheckProductSuit cmp al,01h jnz L0055B1CB test ebx,ebx mov esi,00200000h// 2 M x 4k = 8G jz L0055B1D1 mov dword ptr [ebp+08h],00400000h jmp L0055B1D1 L0055B1CB: mov [ebp+08h],esi mov esi,[ebp-0Ch] L0055B1D1: mov eax,[edi+08h] xor ebx,ebx add edi,00000008h mov [ebp-04h],ebx mov [ebp-08h],edi |
で、それっぽいのがこっち.
試しに esi,00010000h//64k x4k =256M にしてみる
256Mしか認識できなくなったので成功したような気がする
>Personal の場合 bit9(0x200)
Personal は Professional でしょうか?
>>1
Home Edition ですね