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: |
違いは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] |
Comments