ExpExpandResourceOwnerTable
VOID __stdcall ExpExpandResourceOwnerTable(ERESOURCE *Resource, KLOCK_QUEUE_HANDLE *LockHandle){
_OWNER_ENTRY *OwnerTable;
unsigned int TableSize;
unsigned __int64 v6;
unsigned int v7;
UINT8 *PoolWithTag;
UINT8 *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 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)v6, 0x61546552ui64);
v9 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)&PoolWithTag[16 * TableSize], 0i64);
KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
if( OwnerTable == Resource->OwnerTable && (!OwnerTable || TableSize == OwnerTable->TableSize) )
{
memmove(v9, (UINT8 *)OwnerTable, 16i64 * TableSize);
*((_DWORD *)v9 + 2) = v7;
Resource->OwnerTable = (_OWNER_ENTRY *)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);
}
*((_BYTE *)KeGetCurrentThread() + 649) = TableSize;
KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
}Referenced by:
ExpAcquireResourceSharedLite
ExpFindCurrentThread
ExpFindEmptyEntry