EtwpSetPmcProfileSource
NTSTATUS __stdcall EtwpSetPmcProfileSource(_KPROFILE_SOURCE *Source, UINT64 Count){
NTSTATUS v2;
__int64 v3;
__int64 v5;
_KPROFILE *v6;
VOID *v8;
_KPROFILE_SOURCE v9;
v2 = 0;
v3 = (unsigned int)Count;
if( !(_DWORD)Count || (unsigned int)Count > EtwpMaxProfilingSources )
return -1073741811;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 2368, 0, 0, 0, 0i64);
if( *(&ExBootDevicesRemovedEvent + 325) )
{
ExFreePoolWithTag(*(&ExBootDevicesRemovedEvent + 325), 0);
*(&ExBootDevicesRemovedEvent + 325) = 0i64;
*(&ExBootDevicesRemovedEvent + 648) = 0;
}
v5 = v3;
*(&ExBootDevicesRemovedEvent + 325) = ExAllocatePoolWithTag(0x200ui64, 248 * v3, 1484223557i64);
v6 = (_KPROFILE *)*(&ExBootDevicesRemovedEvent + 325);
if( *(&ExBootDevicesRemovedEvent + 325) )
{
*(&ExBootDevicesRemovedEvent + 648) = v3;
if( (_DWORD)v3 )
{
do
{
KeInitializeProfileCallback(
v6,
EtwpPmcInterrupt,
(_KTRAP_FRAME *)*(unsigned int *)Source,
(VOID *)*(unsigned int *)Source,
v8,
v9);
v6 += 62;
++Source;
--v5;
}
while( v5 );
}
}
else
{
v2 = -1073741801;
}
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 2368), 0);
return v2;
}Referenced by:
EtwSetPerformanceTraceInformation