ExReinitializeResourceLite

NTSTATUS __stdcall ExReinitializeResourceLite(_ERESOURCE *Resource){
  _OWNER_ENTRY *OwnerTable; 
  int v3; 
  unsigned __int64 OwnerThread; 
  __int32 v5; 
  unsigned int TableSize; 
  unsigned int v8; 
  _OWNER_ENTRY *v9; 
  unsigned __int32 v10; 
  _ETHREAD *v11; 
  __int32 bf_0; 

  if( (Resource->ReservedLowFlags & 1) != 0 )
    KeBugCheckEx(0x1C6u, (PVOID)0xE, Resource, 0i64, 0i64);
  OwnerTable = Resource->OwnerTable;
  v3 = 0;
  if( OwnerTable )
  {
    TableSize = OwnerTable->TableSize;
    v8 = 1;
    v9 = Resource->OwnerTable;
    v10 = TableSize;
    if( TableSize > 1 )
    {
      do
      {
        v11 = ExpOwnerEntryToThread(++v9);
        if( v11 )
        {
          ++v3;
          if( ExpResourceEnforcesOwnershipTransfer((INT64)Resource)
            && (v9->_bf_0 & 2) == 0
            && v11 != (_ETHREAD *)KeGetCurrentThread() )
          {
            KeBugCheckEx(0x16Eu, Resource, KeGetCurrentThread(), v11, (PVOID)3);
          }
          bf_0 = v9->_bf_0;
          if( (bf_0 & 1) != 0 )
          {
            PsBoostThreadIoEx(v11, 1u, 0, 0i64);
            bf_0 = v9->_bf_0;
          }
          if( (bf_0 & 4) != 0 )
          {
            PsBoostThreadIoQoS(v11, 1ui64);
            bf_0 = v9->_bf_0;
          }
          if( (bf_0 & 2) != 0 )
            ObDereferenceObjectDeferDeleteWithTag((UINT64)v11, 1953261124i64);
        }
        ++v8;
      }
      while( v8 < TableSize );
      v10 = OwnerTable->TableSize;
    }
    memset(&OwnerTable[1], 0i64, 16 * (v10 - 1));
  }
  OwnerThread = Resource->OwnerEntry.OwnerThread;
  v5 = Resource->OwnerEntry._bf_0;
  if( (v5 & 2) != 0 )
  {
    OwnerThread &= 0xFFFFFFFFFFFFFFFCui64;
  }
  else if( (OwnerThread & 3) != 0 )
  {
    goto LABEL_14;
  }
  if( OwnerThread )
  {
    if( ((Resource->ReservedLowFlags & 1) != 0 || *(&WheapDeferredInternalLogsEventLock + 740))
      && (Resource->OwnerEntry._bf_0 & 2) == 0
      && (struct _KTHREAD *)OwnerThread != KeGetCurrentThread() )
    {
      KeBugCheckEx(0x16Eu, Resource, KeGetCurrentThread(), (PVOID)OwnerThread, (PVOID)4);
    }
    if( (v5 & 1) != 0 )
    {
      PsBoostThreadIoEx((_ETHREAD *)OwnerThread, 1u, 0, 0i64);
      v5 = Resource->OwnerEntry._bf_0;
    }
    if( (v5 & 4) != 0 )
    {
      PsBoostThreadIoQoS((_ETHREAD *)OwnerThread, 1ui64);
      v5 = Resource->OwnerEntry._bf_0;
    }
    if( (v5 & 2) != 0 )
      ObDereferenceObjectDeferDeleteWithTag(OwnerThread, 1953261124i64);
  }
LABEL_14:
  *(_DWORD *)&Resource->ActiveCount = 0;
  *(_QWORD *)&Resource->ActiveEntries = 0i64;
  *(_OWORD *)&Resource->SharedWaiters = 0i64;
  Resource->OwnerEntry = 0i64;
  *(_QWORD *)&Resource->NumberOfSharedWaiters = 0i64;
  __incgsdword(0x865Cu);
  return 0;
}

Referenced by:

No references.