Windows 2000 と XP で違う GDI 周りの処理

win32k.sys の HeapVidMemAllocAligned や VidMemFree の動作を見てて気づいたのだけど、XPと2000でgdi32 周りの処理が全然違うことが判明

Windows 2000が自前でこれらの関数を処理してるのに対して、XPは
dxg.sys と言うドライバをロードして、そこからドライバの関数ポインタに直接飛んでいる

          call    jmp_Dxapi.sys!_DxApiGetVersion@0
          push    SWCBF99F924_drivers_dxg_sys
          call    EngLoadImage
          test    eax,eax
          mov    [LBF9B2BCC],eax
          jz     LBF8A3B7C
          push    SSZBF99F90C_DxDdStartupDxGraphics
          push    eax
          call    EngFindImageProcAddress
          push    SSZBF99F8F4_DxDdCleanupDxGraphics
          push    [LBF9B2BCC]
          mov    [LBF9B2BD0],eax
          call    EngFindImageProcAddress
          mov    ecx,[LBF9B2BD0]
          test    ecx,ecx
          mov    [LBF9B2BD4],eax
          jz     LBF8A3B83
          test    eax,eax
          jz     LBF8A3B83
          push    [ebp+1Ch]
          mov    eax,[LBF9A85E8]
          push    LBF9B2BD8
          mov    [ebp-08h],eax
          lea    eax,[ebp-18h]
          push    eax
          push    0000000Ch
          lea    eax,[ebp-0Ch]
          push    eax
          push    0000000Ch
          mov    dword ptr [ebp-0Ch],00050001h
          mov    dword ptr [ebp-04h],LBF9A8490
          call    ecx
          mov    esi,eax
          test    esi,esi
          jl     LBF8A3B88
          mov    eax,[ebp-10h]
          mov    [LBF9B2BC8],eax
          xor    eax,eax

詳しく解説すると
dxg.sys の DxDdStartupDxGraphics を呼び出すと、関数ポインタの構造体のアドレスが返って来て、
アドレス+ 関数番号 x4 をコールすると利用できるようになってるようだ ・ω・

NtGdiDdAddAttachedSurface
NtGdiDdColorControl
NtGdiDdWaitForVerticalBlank
NtGdiDvpCanCreateVideoPort
NtGdiDvpColorControl
NtGdiDvpCreateVideoPort
NtGdiDvpDestroyVideoPort
NtGdiDvpFlipVideoPort
NtGdiDvpGetVideoPortBandwidth
NtGdiDvpGetVideoPortField
NtGdiDvpGetVideoPortFlipStatus
NtGdiDvpGetVideoPortInputFormats
NtGdiDvpGetVideoPortLine
NtGdiDvpGetVideoPortOutputFormats
NtGdiDvpGetVideoPortConnectInfo
NtGdiDvpGetVideoSignalStatus
NtGdiDvpUpdateVideoPort
NtGdiDvpWaitForVideoPortSync
NtGdiDvpAcquireNotification
NtGdiDvpReleaseNotification
NtGdiDxgGenericThunk

辺りがざっくりドライバに飛んでて面白い・ω・

実際のコード

 LBF93D010: (NtGdiDvpGetVideoPortField)
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    eax,[LBF9B2BC8]
          pop    ebp
          jmp    [eax+000001FCh]
          nop
          nop
          nop
          nop
          nop
 LBF93D026: (NtGdiDvpGetVideoPortFlipStatus)
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    eax,[LBF9B2BC8]
          pop    ebp
          jmp    [eax+00000204h]
          Align    4
 LBF93D03C: (NtGdiDvpGetVideoPortInputFormats)
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          mov    eax,[LBF9B2BC8]
          pop    ebp
          jmp    [eax+0000020Ch]

こんな感じ

一応解説しておくと、 gdi32.dll が win32k.sys のラッパーみたいになっている ・ω・

おすすめ

コメントを残す

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