ExReleaseResourceAndLeaveCriticalRegion

VOID __stdcall ExReleaseResourceAndLeaveCriticalRegion(_ERESOURCE *Resource){
  __int16 v2; 
  _ETHREAD *v3; 
  void *v4; 
  _ETHREAD *v5; 
  _ETHREAD *v6; 
  bool v7; 
  unsigned __int8 CurrentIrql; 
  _ETHREAD *CurrentThread; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  if( (Resource->Flag & 0x41) == 1 )
    KeBugCheckEx(0x1C6u, (PVOID)0xF, Resource, 0i64, 0i64);
  v2 = Resource->Flag & 1;
  if( v2 )
  {
    CurrentIrql = KeGetCurrentIrql();
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( CurrentIrql > 2u )
      KeBugCheckEx(0x1C6u, 0i64, (PVOID)CurrentIrql, (PVOID)2, 0i64);
    if( !CurrentIrql && (CurrentThread->Tcb._bf_0 & 0x400) == 0 && !CurrentThread->Tcb.WaitBlock[3].SpareLong )
      KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
  }
  if( v2 )
  {
    ExpFastResourceLegacyRelease(Resource);
  }
  else
  {
    v3 = (_ETHREAD *)KeGetCurrentThread();
    memset(&LockHandle, 0, sizeof(LockHandle));
    KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, &LockHandle);
    if( ExpResourceEnforcesOwnershipTransfer((INT64)Resource) && ((unsigned __int8)v3 & 3) != 3 && v3 != v5 )
      KeBugCheckEx(0x16Eu, Resource, v5, v3, 0i64);
    if( (Resource->ReservedLowFlags & 0x80u) == 0 )
      ExpReleaseResourceSharedForThreadLite(v4, v3);
    else
      ExpReleaseResourceExclusiveForThreadLite(v4, v3);
  }
  v6 = (_ETHREAD *)KeGetCurrentThread();
  v7 = v6->Tcb.KernelApcDisable++ == -1;
  if( v7
    && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v6->Tcb.ApcState.ApcListHead[0].Flink != &v6->Tcb.152
    && !v6->Tcb.SpecialApcDisable )
  {
    KiCheckForKernelApcDelivery();
  }
}

Referenced by:

No references.