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 にしてみる
lm
256Mしか認識できなくなったので成功したような気がする

関連サイト:
Windows OSでサポートされている最大物理メモリ・サイズは? - @IT

おすすめ

2件のフィードバック

  1. より:

    >Personal の場合 bit9(0x200)
    Personal は Professional でしょうか?

  2. 黒翼猫 より:

    >>1
    Home Edition ですね

黒翼猫 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です