ExReleaseResourceForThreadLite

VOID __stdcall ExReleaseResourceForThreadLite(_ERESOURCE *Resource, UINT64 CurrentThread){
  __int16 v4; 
  unsigned __int8 v5; 
  _ETHREAD *v6; 
  unsigned __int16 Flag; 
  unsigned __int8 CurrentIrql; 
  _ETHREAD *v9; 
  INT64 v10[2]; 
  __int64 v11; 

  if( (Resource->Flag & 0x41) == 1 )
    KeBugCheckEx(0x1C6u, (PVOID)0xF, Resource, 0i64, 0i64);
  v4 = Resource->Flag & 1;
  if( v4 )
  {
    CurrentIrql = KeGetCurrentIrql();
    v9 = (_ETHREAD *)KeGetCurrentThread();
    if( CurrentIrql > 2u )
      KeBugCheckEx(0x1C6u, 0i64, (PVOID)CurrentIrql, (PVOID)2, 0i64);
    if( !CurrentIrql && (v9->Tcb._bf_0 & 0x400) == 0 && !v9->Tcb.WaitBlock[3].SpareLong )
      KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
  }
  if( v4 )
  {
    if( (struct _KTHREAD *)CurrentThread != KeGetCurrentThread() )
      KeBugCheckEx(0x1C6u, (PVOID)0x11, Resource, (PVOID)CurrentThread, 0i64);
    ExpFastResourceLegacyRelease(Resource);
  }
  else
  {
    v10[0] = 0i64;
    v10[1] = (INT64)&Resource->SpinLock;
    v5 = KeGetCurrentIrql();
    __writecr8(2ui64);
    v11 = v5;
    if( _InterlockedExchange64((volatile __int64 *)&Resource->SpinLock, (__int64)v10) )
      KxWaitForLockOwnerShip((INT64)v10);
    v6 = (_ETHREAD *)KeGetCurrentThread();
    Flag = Resource->Flag;
    if( ((Flag & 1) != 0 || *(&WheapDeferredInternalLogsEventLock + 740))
      && (CurrentThread & 3) != 3
      && (_ETHREAD *)CurrentThread != v6 )
    {
      KeBugCheckEx(0x16Eu, Resource, v6, (PVOID)CurrentThread, 0i64);
    }
    if( (Flag & 0x80u) != 0 )
      ExpReleaseResourceExclusiveForThreadLite(Resource, (PVOID)CurrentThread);
    else
      ExpReleaseResourceSharedForThreadLite(Resource, (PVOID)CurrentThread);
  }
}

Referenced by:

CcUnpinDataForThread