ExEnableHandleTracing
VOID __fastcall ExEnableHandleTracing(_HANDLE_TABLE *HandleTable, UINT64 Slots){
unsigned int v2;
int i;
__int64 v5;
__int64 v6;
__int64 v7;
_EPROCESS *QuotaProcess;
VOID **PoolWithTag;
_HANDLE_TRACE_DEBUG_INFO *v10;
_ETHREAD *CurrentThread;
_HANDLE_TRACE_DEBUG_INFO *DebugInfo;
v2 = Slots;
if( (_DWORD)Slots )
{
if( (unsigned int)Slots >= ExHandleTraceDbMinStacks )
{
if( (unsigned int)Slots > ExHandleTraceDbMaxStacks )
v2 = ExHandleTraceDbMaxStacks;
}
else
{
v2 = ExHandleTraceDbMinStacks;
}
for( i = v2 - 1; (i & v2) != 0; v2 = i + 1 )
i = v2 | (v2 - 1);
}
else
{
v2 = ExHandleTraceDbDefaultStacks;
}
v5 = 160i64 * v2 + 80;
MmGetMaximumNonPagedPoolInBytes((INT64)HandleTable, _InterlockedExchangeAdd(&ExpTotalTraceBuffers, v2));
if( 160 * v7 > (unsigned __int64)(5 * v6) >> 4
|| (QuotaProcess = HandleTable->QuotaProcess) != 0i64
&& PsChargeProcessNonPagedPoolQuota(HandleTable->QuotaProcess, v5) < 0 )
{
_InterlockedExchangeAdd(&ExpTotalTraceBuffers, -v2);
return;
}
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v5, 1685348943i64);
v10 = (_HANDLE_TRACE_DEBUG_INFO *)PoolWithTag;
if( !PoolWithTag )
{
_InterlockedExchangeAdd(&ExpTotalTraceBuffers, -v2);
if( QuotaProcess )
PsReturnProcessNonPagedPoolQuota(QuotaProcess, v5);
return;
}
memset(PoolWithTag, 0i64, v5);
v10->TableSize = v2;
v10->RefCount = 1;
v10->CloseCompactionLock.Owner = 0i64;
v10->CloseCompactionLock.Contention = 0;
v10->CloseCompactionLock.Count = 1;
KeInitializeEvent((INT64)&v10->CloseCompactionLock.gap14[4], 1, 0);
if( QuotaProcess )
LOBYTE(HandleTable->Flags) |= 1u;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&HandleTable->HandleTableLock, 0i64);
DebugInfo = HandleTable->DebugInfo;
HandleTable->DebugInfo = v10;
if( DebugInfo )
{
if( (DebugInfo->BitMaskFlags & 8) == 0 )
goto LABEL_25;
goto LABEL_24;
}
if( (HandleTable->Flags & 2) != 0 )
LABEL_24:
v10->BitMaskFlags = 8;
LABEL_25:
LOBYTE(HandleTable->Flags) |= 2u;
if( (_InterlockedExchangeAdd64(&HandleTable->HandleTableLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&HandleTable->HandleTableLock);
KeAbPostRelease(&HandleTable->HandleTableLock);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
if( DebugInfo )
ExDereferenceHandleDebugInfo(HandleTable, DebugInfo);
}Referenced by:
PsSetProcessHandleTracingInformation