ExReleaseResourceAndLeaveCriticalRegion

VOID __stdcall ExReleaseResourceAndLeaveCriticalRegion(PERESOURCE Resource){
  __int16 v2; 
  ULONG_PTR v3; 
  void *v4; 
  ULONG_PTR v5; 
  _ETHREAD *v6; 
  bool v7; 
  unsigned __int8 CurrentIrql; 
  _ETHREAD *CurrentThread; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  if( (Resource->Flag & 0x41) == 1 )
    KeBugCheckEx(0x1C6u, 0xFui64, (ULONG_PTR)Resource, 0i64, 0i64);
  v2 = Resource->Flag & 1;
  if( v2 )
  {
    CurrentIrql = KeGetCurrentIrql();
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( CurrentIrql > 2u )
      KeBugCheckEx(0x1C6u, 0i64, CurrentIrql, 2ui64, 0i64);
    if( !CurrentIrql && (*((_DWORD *)CurrentThread + 29) & 0x400) == 0 && !*((_DWORD *)CurrentThread + 121) )
      KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
  }
  if( v2 )
  {
    ExpFastResourceLegacyRelease(Resource);
  }
  else
  {
    v3 = (ULONG_PTR)KeGetCurrentThread();
    memset(&LockHandle, 0, sizeof(LockHandle));
    KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, &LockHandle);
    if( ExpResourceEnforcesOwnershipTransfer((INT64)Resource) && (v3 & 3) != 3 && v3 != v5 )
      KeBugCheckEx(0x16Eu, (ULONG_PTR)Resource, v5, v3, 0i64);
    if( (Resource->ReservedLowFlags & 0x80u) == 0 )
      ExpReleaseResourceSharedForThreadLite(v4, (PVOID)v3);
    else
      ExpReleaseResourceExclusiveForThreadLite(v4, (PVOID)v3);
  }
  v6 = (_ETHREAD *)KeGetCurrentThread();
  v7 = (*((_WORD *)v6 + 242))++ == 0xFFFF;
  if( v7 && *((_ETHREAD **)v6 + 19) != (_ETHREAD *)((char *)v6 + 152) && !*((_WORD *)v6 + 243) )
    KiCheckForKernelApcDelivery();
}

Referenced by:

No references.