EtwpAddMicroarchitecturalPmcToPmcGroup
INT64 __fastcall EtwpAddMicroarchitecturalPmcToPmcGroup(INT64 a1, UINT8 *a2){
UINT8 *v2;
__int64 v4;
__int64 v5;
UINT64 v7;
WCHAR *PoolWithTag;
WCHAR v9;
NTSTATUS v10;
WCHAR v11;
int CpuVendor;
WCHAR v13;
WCHAR v14;
WCHAR v15;
WCHAR v16;
WCHAR v17;
WCHAR v18;
UINT64 CreateOptions;
UINT64 CreateOptionsa;
UINT64 CreateOptionsb;
UINT64 CreateOptionsc;
UINT64 CreateOptionsd;
UINT64 CreateOptionse;
UINT64 CreateOptionsf;
UINT64 CreateOptionsg;
struct _UNICODE_STRING DestinationString;
struct _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 3221225476i64;
do
++v4;
while( *(_WORD *)(a1 + 2 * v4) );
v7 = (unsigned int)(2 * v4 + 512);
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v7, 0x50777445ui64);
RtlStringCbPrintfW(PoolWithTag, (unsigned int)v7, (WCHAR *)L"%ws\\%ws");
RtlInitUnicodeString(&DestinationString, PoolWithTag, v9);
LODWORD(CreateOptions) = 0;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v10 = ZwCreateKey(&KeyHandle, 0x20006ui64, &ObjectAttributes, 0i64, 0i64, CreateOptions, 0i64);
if( v10 >= 0 )
{
RtlInitUnicodeString(&DestinationString, L"Interval", v11);
LODWORD(CreateOptionsa) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, a2 + 8, CreateOptionsa);
if( v10 >= 0 )
{
CpuVendor = KiGetCpuVendor();
if( (unsigned int)(CpuVendor - 1) > 1 )
{
LABEL_17:
v10 = -1073741822;
goto LABEL_18;
}
Data = *a2;
RtlInitUnicodeString(&DestinationString, L"Event", v13);
LODWORD(CreateOptionsb) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsb);
if( v10 >= 0 )
{
if( (unsigned int)(CpuVendor - 1) <= 1 )
{
Data = a2[1];
RtlInitUnicodeString(&DestinationString, L"Unit", v14);
LODWORD(CreateOptionsc) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsc);
if( v10 >= 0 && CpuVendor == 2 )
{
Data = a2[2];
RtlInitUnicodeString(&DestinationString, L"CMask", v15);
LODWORD(CreateOptionsd) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsd);
if( v10 >= 0 )
{
Data = a2[3];
RtlInitUnicodeString(&DestinationString, L"CMaskInvert", v16);
LODWORD(CreateOptionse) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionse);
if( v10 >= 0 )
{
Data = a2[4];
RtlInitUnicodeString(&DestinationString, L"AnyThread", v17);
LODWORD(CreateOptionsf) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsf);
if( v10 >= 0 )
{
Data = a2[5];
RtlInitUnicodeString(&DestinationString, L"EdgeDetect", v18);
LODWORD(CreateOptionsg) = 4;
v10 = ZwSetValueKey(KeyHandle, &DestinationString, 0i64, 4ui64, &Data, CreateOptionsg);
}
}
}
}
goto LABEL_18;
}
goto LABEL_17;
}
}
}
LABEL_18:
ExFreePoolWithTag(PoolWithTag, 0x50777445u);
return(unsigned int)v10;
}Referenced by:
EtwpAddMicroarchitecturalPmcToRegistry