ExpExpandResourceOwnerTable
VOID __stdcall ExpExpandResourceOwnerTable(_ERESOURCE *Resource, _KLOCK_QUEUE_HANDLE *LockHandle){
_OWNER_ENTRY *OwnerTable;
unsigned int TableSize;
unsigned __int64 v6;
unsigned int v7;
VOID **PoolWithTag;
_OWNER_ENTRY *v9;
OwnerTable = Resource->OwnerTable;
if( OwnerTable )
{
TableSize = OwnerTable->TableSize;
v7 = TableSize + 4;
if( TableSize + 4 < TableSize )
return;
v6 = 16i64 * v7;
if( v6 > 0xFFFFFFFF )
return;
}
else
{
TableSize = 0;
LODWORD(v6) = 48;
v7 = 3;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
__writecr8(LockHandle->OldIrql);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)v6, 1632920914i64);
v9 = (_OWNER_ENTRY *)PoolWithTag;
if( PoolWithTag )
{
memset(&PoolWithTag[2 * TableSize], 0i64, 16 * (v7 - TableSize));
KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
if( OwnerTable == Resource->OwnerTable && (!OwnerTable || TableSize == OwnerTable->_bf_0) )
{
memmove(v9, OwnerTable, 16 * TableSize);
v9->_bf_0 = v7;
Resource->OwnerTable = v9;
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
__writecr8(LockHandle->OldIrql);
if( OwnerTable )
ExFreePoolWithTag(OwnerTable, 0);
if( !TableSize )
LOBYTE(TableSize) = 1;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
__writecr8(LockHandle->OldIrql);
ExFreePoolWithTag(v9, 0);
}
}
else
{
KeDelayExecutionThread(0, 0, &ExShortTime);
}
KeGetCurrentThread()->SchedulerApc.SpareByte0 = TableSize;
KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
}Referenced by:
ExpAcquireResourceSharedLite
ExpFindCurrentThread
ExpFindEmptyEntry