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.