HAL.DLL の KeAcquire/KeRelease 関数 InStackQueuedSpinLock

Windows 2000で KeAcquireInStackQueuedSpinLock と KeReleaseInStackQueuedSpinLock をエミュレーションする手法についてメモ。


KeAcquireInStackQueuedSpinLock と KeAcquireQueuedSpinLock
のXPのコードは以下のとおり

 KeAcquireInStackQueuedSpinLock:
          push    00000002h
          pop    eax
          push    [FFDFF024h]
          mov    [FFDFF024h],al
          pop    eax
          mov    [edx+08h],al
          retn

 KeAcquireQueuedSpinLock:
          push    00000002h
          pop    eax
          push    [FFDFF024h]
          mov    [FFDFF024h],al
          pop    eax
          retn

違いは1箇所だけ。

一方、KeReleaseInStackQueuedSpinLock とKeReleaseQueuedSpinLock のXPのコードは以下のとおり

 KeReleaseInStackQueuedSpinLock:
          movzx    edx,[ecx+08h]
 KeReleaseQueuedSpinLock:
          pushfd
          cli
          xor    ecx,ecx
          mov    [FFDFF024h],dl
          mov    cl,dl
          mov    edx,[FFDFF028h]
          and    edx,[L80010E64+ecx*4]
          jnz    L80017B61
          popfd
          retn

同様に違いは1箇所だけ。

つまり。

      call KeAcquireInStackQueuedSpinLock

      call KeReleaseInStackQueuedSpinLock

のようなコードは次のように置換できる。

      call KeAcquireQueuedSpinLock
          mov    [edx+08h],al

          movzx    edx,[ecx+08h]
      call KeReleaseQueuedSpinLock

おすすめ

コメントを残す

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