EtwpAddMicroarchitecturalPmcToPmcGroup
NTSTATUS __stdcall EtwpAddMicroarchitecturalPmcToPmcGroup(INT64 a1, UINT8 *a2){
UINT8 *v2;
__int64 v4;
__int64 v5;
UINT64 v7;
VOID **PoolWithTag;
int v9;
int CpuVendor;
UINT64 CreateOptions;
UINT64 CreateOptionsa;
UINT64 CreateOptionsb;
UINT64 CreateOptionsc;
UINT64 CreateOptionsd;
UINT64 CreateOptionse;
UINT64 CreateOptionsf;
UINT64 CreateOptionsg;
_UNICODE_STRING DestinationString;
_OBJECT_ATTRIBUTES ObjectAttributes;
int Data;
VOID *KeyHandle;
v2 = a2 + 184;
*(&ObjectAttributes.Length + 1) = 0;
v4 = -1i64;
*(&ObjectAttributes.Attributes + 1) = 0;
KeyHandle = 0i64;
v5 = -1i64;
Data = 0;
DestinationString = 0i64;
do
++v5;
while( *(_WORD *)&v2[2 * v5] );
if( (unsigned int)v5 >= 0xFF )
return -1073741820;
do
++v4;
while( *(_WORD *)(a1 + 2 * v4) );
v7 = (unsigned int)(2 * v4 + 512);
PoolWithTag = ExAllocatePoolWithTag(1ui64, v7, 1350005829i64);
RtlStringCbPrintfW((WCHAR *)PoolWithTag, (unsigned int)v7, (WCHAR *)L"%ws\\%ws");
RtlInitUnicodeString(&DestinationString, (PCWSTR)PoolWithTag);
LODWORD(CreateOptions) = 0;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v9 = ZwCreateKey(&KeyHandle, 0x20006ui64, &ObjectAttributes, 0i64, 0i64, CreateOptions, 0i64);
if( v9 >= 0 )
{
RtlInitUnicodeString(&DestinationString, L"Interval");
LODWORD(CreateOptionsa) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, a2 + 8, CreateOptionsa);
if( v9 >= 0 )
{
CpuVendor = KiGetCpuVendor();
if( (unsigned int)(CpuVendor - 1) > 1 )
{
LABEL_17:
v9 = -1073741822;
goto LABEL_18;
}
Data = *a2;
RtlInitUnicodeString(&DestinationString, L"Event");
LODWORD(CreateOptionsb) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsb);
if( v9 >= 0 )
{
if( (unsigned int)(CpuVendor - 1) <= 1 )
{
Data = a2[1];
RtlInitUnicodeString(&DestinationString, L"Unit");
LODWORD(CreateOptionsc) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsc);
if( v9 >= 0 && CpuVendor == 2 )
{
Data = a2[2];
RtlInitUnicodeString(&DestinationString, L"CMask");
LODWORD(CreateOptionsd) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsd);
if( v9 >= 0 )
{
Data = a2[3];
RtlInitUnicodeString(&DestinationString, L"CMaskInvert");
LODWORD(CreateOptionse) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionse);
if( v9 >= 0 )
{
Data = a2[4];
RtlInitUnicodeString(&DestinationString, L"AnyThread");
LODWORD(CreateOptionsf) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsf);
if( v9 >= 0 )
{
Data = a2[5];
RtlInitUnicodeString(&DestinationString, L"EdgeDetect");
LODWORD(CreateOptionsg) = 4;
v9 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsg);
}
}
}
}
goto LABEL_18;
}
goto LABEL_17;
}
}
}
LABEL_18:
ExFreePoolWithTag(PoolWithTag, 0x50777445u);
return v9;
}Referenced by:
EtwpAddMicroarchitecturalPmcToRegistry