Критическая секция в режиме ядра
От: z.s.s Россия  
Дата: 18.08.04 06:46
Оценка:
Как можно организовать критическую секцию ?

к примеру в отладчике 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
... И будет Вам счастье !!! ...
Re: Критическая секция в режиме ядра
От: TarasCo  
Дата: 18.08.04 08:17
Оценка:
Здравствуйте, 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)
Да пребудет с тобою сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.