Как можно организовать критическую секцию ?
к примеру в отладчике SoftIce это выглядит так
KeEnterCriticalRegion
mov eax, fs:[0x00000124]
dec dword ptr [eax + 0x000000D4]
ret
KeLeaveCriticalRegion
mov eax, fs:[0x00000124]
inc dword ptr [eax + 0x000000D4]
jnz _Ret
lea ecx, [eax + 0x34]
cmp [ecx], ecx
jnz RtlNumberOfClearBits + 0x08C5
ret
... И будет Вам счастье !!! ...
Здравствуйте, z.s.s, Вы писали:
ZSS>Как можно организовать критическую секцию ?
ZSS>к примеру в отладчике SoftIce это выглядит так
ZSS>KeEnterCriticalRegion
ZSS>ZSS>mov eax, fs:[0x00000124]
ZSS>dec dword ptr [eax + 0x000000D4]
ZSS>ret
ZSS>
ZSS>KeLeaveCriticalRegion
ZSS>ZSS>mov eax, fs:[0x00000124]
ZSS>inc dword ptr [eax + 0x000000D4]
ZSS>jnz _Ret
ZSS>lea ecx, [eax + 0x34]
ZSS>cmp [ecx], ecx
ZSS>jnz RtlNumberOfClearBits + 0x08C5
ZSS>ret
ZSS>
На сколько я знаю
KeEnterCriticalRegion
просто запрещает доставку APC потоку, но не защищает ресурсы.
Критическая секция это спинлок + семафор (что то типа этого).
В режиме ядра в роли критических секций можно использовать мьютексы (KeInitializeMutex)
или быстрые мьютексы ExInitializeFastMutex
При этом следует помнить, что если данные доступны на IRQL >= DISPATCH_LEVEL, использовать мьютексы и функции ожидания нельзя — следует использовать спин-локи (KeInitializeSpinLock) или KeSynchronizeExecution (для синхронизации с IRQL > DISPATCH_LEVEL)