VfInitializeBranchTracing
NTSTATUS __stdcall VfInitializeBranchTracing(){
int v1;
__int64 v2;
VOID **PoolWithTag;
_QWORD *v4;
__int64 v5;
PVOID *v6;
int v7;
if( (MmVerifierData & 0x8000000) == 0 )
return -1073741822;
if( VfBTSInitialized )
return -1073740758;
if( !(unsigned int)ViIsBTSSupported() )
return -1073740759;
memset(VfBTSDataManagementArea, 0i64, sizeof(VfBTSDataManagementArea));
if( (_DWORD)ViVerifyBTSBufferSize )
v1 = 24 * ViVerifyBTSBufferSize;
else
v1 = 240000;
LODWORD(ViVerifyBTSBufferSize) = v1;
v2 = 0i64;
if( (_DWORD)KeNumberProcessors_0 )
{
while( (unsigned int)v2 < 0x500 )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x58ui64, 1834177602i64);
VfBTSDataManagementArea[v2] = (__int64)PoolWithTag;
if( !PoolWithTag )
goto LABEL_15;
*(_QWORD *)VfBTSDataManagementArea[v2] = ExAllocatePoolWithTag(
0x200ui64,
(unsigned int)ViVerifyBTSBufferSize,
1649628226i64);
v4 = (_QWORD *)VfBTSDataManagementArea[v2];
if( !*v4 )
goto LABEL_15;
v4[1] = *v4;
*(_QWORD *)(VfBTSDataManagementArea[v2] + 24) = 0i64;
*(_QWORD *)(VfBTSDataManagementArea[v2] + 16) = *(_QWORD *)VfBTSDataManagementArea[v2]
+ (unsigned int)ViVerifyBTSBufferSize
+ 1i64;
v5 = VfBTSDataManagementArea[v2];
v2 = (unsigned int)(v2 + 1);
*(_QWORD *)(v5 + 80) = 0i64;
if( (unsigned int)v2 >= (unsigned int)KeNumberProcessors_0 )
goto LABEL_14;
}
return -1073740759;
}
LABEL_14:
if( !(unsigned int)ViSetupBTSPerProcNoEnable() )
{
LABEL_15:
if( (unsigned int)v2 < 0x500 )
{
do
{
v6 = (PVOID *)VfBTSDataManagementArea[v2];
if( v6 )
{
if( *v6 )
{
ExFreePoolWithTag(*v6, 0x62535442u);
*(_QWORD *)VfBTSDataManagementArea[v2] = 0i64;
v6 = (PVOID *)VfBTSDataManagementArea[v2];
}
ExFreePoolWithTag(v6, 0x6D535442u);
VfBTSDataManagementArea[v2] = 0i64;
}
v7 = v2;
v2 = (unsigned int)(v2 - 1);
}
while( v7 );
}
return -1073740759;
}
VfBTSInitialized = 1;
return 0;
}Referenced by:
VfNotifyVerifierOfEvent