FastMutex 의 동작방식

FastMutex 는 초기화 시에 count 값이 1으로 설정되고 동기화를 위한 동기 Event 하나를 생성한다. Acuier 하게 되면 Count 값이 1 감소하고 이 값이 0 이면 Mutex 를 얻게되고 0 이 아닐 경우 Wait 에서 대기하게 된다. Release 에서는 Count 값을 1 증가 시킨다.
typedef struct _FAST_MUTEX {

#define FM_LOCK_BIT          0x1 // Actual lock bit, 1 = Unlocked, 0 = Locked
#define FM_LOCK_BIT_V        0x0 // Lock bit as a bit number
#define FM_LOCK_WAITER_WOKEN 0x2 // A single waiter has been woken to acquire this lock
#define FM_LOCK_WAITER_INC   0x4 // Increment value to change the waiters count

    volatile LONG Count;
    PKTHREAD Owner;
    ULONG Contention;
    KEVENT Gate;
    ULONG OldIrql;
} FAST_MUTEX, *PFAST_MUTEX;

VOID
FORCEINLINE
ExInitializeFastMutex (
    __out PFAST_MUTEX FastMutex
    )
{
FastMutex->Count = FM_LOCK_BIT;
    FastMutex->Owner = NULL;
    FastMutex->Contention = 0;
KeInitializeEvent(&FastMutex->Gate, SynchronizationEvent, FALSE);
    return;
}
3: kd> uf ExAcquireFastMutex
hal!ExAcquireFastMutex [..\..\halmps\i386\mpspin.asm @ 401]:
  401 80065600 a18000feff      mov     eax,dword ptr ds:[FFFE0080h]
  404 80065605 c7058000feff3d000000 mov dword ptr ds:[0FFFE0080h],3Dh
  406 8006560f f0ff09         lock dec dword ptr [ecx]
  407 80065612 7419           je      hal!ExAcquireFastMutex+0x2d (8006562d)

hal!ExAcquireFastMutex+0x14 [..\..\halmps\i386\mpspin.asm @ 409]:
  409 80065614 ff4108          inc     dword ptr [ecx+8]
  412 80065617 51              push    ecx
  413 80065618 50              push    eax
  414 80065619 83c10c          add     ecx,0Ch
  415 8006561c 6a00            push    0
  415 8006561e 6a00            push    0
  415 80065620 6a00            push    0
  415 80065622 6a00            push    0
  415 80065624 51              push    ecx
  415 80065625 ff1574230680    call    dword ptr [hal!_imp__KeWaitForSingleObject (80062374)]
  416 8006562b 58              pop     eax
  417 8006562c 59              pop     ecx

hal!ExAcquireFastMutex+0x2d [..\..\halmps\i386\mpspin.asm @ 421]:
  421 8006562d 88411c          mov     byte ptr [ecx+1Ch],al
  430 80065630 896104          mov     dword ptr [ecx+4],esp
  431 80065633 c3              ret
3: kd> uf ExReleaseFastMutex
hal!ExReleaseFastMutex [..\..\halmps\i386\mpspin.asm @ 458]:
  458 80065634 33c0            xor     eax,eax
  461 80065636 8a411c          mov     al,byte ptr [ecx+1Ch]
  463 80065639 f0830101        lock add dword ptr [ecx],1
  464 8006563d 7802            js      hal!ExReleaseFastMutex+0xd (80065641)

hal!ExReleaseFastMutex+0xb [..\..\halmps\i386\mpspin.asm @ 465]:
  465 8006563f 750e            jne     hal!ExReleaseFastMutex+0x1b (8006564f)

hal!ExReleaseFastMutex+0xd [..\..\halmps\i386\mpspin.asm @ 468]:
  468 80065641 83c10c          add     ecx,0Ch
  469 80065644 50              push    eax
  470 80065645 6a00            push    0
  470 80065647 51              push    ecx
  470 80065648 ff1570230680    call    dword ptr [hal!_imp__KeSetEventBoostPriority (80062370)]
  471 8006564e 58              pop     eax

hal!ExReleaseFastMutex+0x1b [..\..\halmps\i386\mpspin.asm @ 474]:
  474 8006564f a38000feff      mov     dword ptr ds:[FFFE0080h],eax
  475 80065654 8b0d8000feff    mov     ecx,dword ptr ds:[0FFFE0080h]
  482 8006565a c3              ret