EtwQueryProcessTelemetryInfo
NTSTATUS __fastcall EtwQueryProcessTelemetryInfo(_EPROCESS *Process, VOID *Address, UINT64 Length, CHAR a4, INT64 a5){
INT64 v5;
int v8;
_OBJECT_NAME_INFORMATION *ImageFileName;
VOID *v10;
int v11;
unsigned int v12;
size_t v13;
_EPROCESS *v14;
__int64 v15;
__int64 v16;
char *v17;
_OBJECT_NAME_INFORMATION *v18;
char *v19;
char *v20;
char *v21;
UINT64 RequiredLength;
char ProcessInfoFlags[12];
_UNICODE_STRING CommandLine;
_DWORD *v27;
_OBJECT_NAME_INFORMATION *v28;
VOID *v29;
_EPROCESS *v30;
char PackageInfo[408];
_KAPC_STATE ApcState;
char UserSid[80];
v5 = (unsigned int)Length;
v30 = Process;
v27 = (_DWORD *)a5;
memset(&ApcState, 0, sizeof(ApcState));
memset(PackageInfo, 0i64, sizeof(PackageInfo));
memset(UserSid, 0i64, 0x44u);
LODWORD(RequiredLength) = 0;
CommandLine = 0i64;
v8 = 0;
*(_QWORD *)&ProcessInfoFlags[4] = 0i64;
ImageFileName = (_OBJECT_NAME_INFORMATION *)&EmptyUnicodeString;
if( Process->SeAuditProcessCreationInfo.ImageFileName )
ImageFileName = Process->SeAuditProcessCreationInfo.ImageFileName;
v28 = ImageFileName;
v10 = PsReferencePrimaryToken(Process);
v29 = v10;
*(_DWORD *)ProcessInfoFlags = 0;
EtwpQueryTokenPackageInfo(v10, (_ETW_PACKAGE_IDENTITY *)PackageInfo, (UINT64 *)ProcessInfoFlags);
v11 = SeQueryUserSidToken(v10, UserSid, 0x44ui64, &RequiredLength);
if( v11 >= 0 )
{
if( PsAcquireProcessExitSynchronization(Process) >= 0 )
{
KiStackAttachProcess(Process, 0i64, &ApcState);
EtwpQueryProcessOtherInfo(Process, (_ETW_OTHER_PROCESS_INFO *)&ProcessInfoFlags[4]);
EtwpQueryProcessCommandLine(Process, &CommandLine);
KiUnstackDetachProcess(&ApcState, 0i64);
ExReleaseRundownProtection(&Process->RundownProtect);
v8 = *(_DWORD *)&ProcessInfoFlags[4];
}
v12 = RequiredLength
+ 100
+ *(_DWORD *)PackageInfo
+ *(_DWORD *)&PackageInfo[8]
+ *(_WORD *)ImageFileName
+ CommandLine.Length;
v13 = v12;
if( v27 )
*v27 = v12;
if( a4 )
ProbeForWrite((UINT64)Address, v5, 4i64);
if( v12 >= (unsigned int)v5 )
v13 = v5;
memset(Address, 0i64, v13);
if( (unsigned int)v5 < 0x60 )
{
v11 = -1073741820;
HIDWORD(RequiredLength) = -1073741820;
}
else
{
*(_DWORD *)Address = 96;
*((_DWORD *)Address + 1) = Process->UniqueProcessId;
*((_QWORD *)Address + 1) = PsGetProcessStartKey((INT64)Process);
*((_QWORD *)Address + 2) = Process->CreateTime.QuadPart;
*((_QWORD *)Address + 3) = Process->CreateInterruptTime;
*((_QWORD *)Address + 4) = Process->CreateUnbiasedInterruptTime;
*((_QWORD *)Address + 5) = Process->SequenceNumber;
LODWORD(v15) = MmGetSessionCreateTime(v14);
*((_QWORD *)Address + 6) = v15;
*((_DWORD *)Address + 14) = PsGetProcessSessionId((INT64)Process);
*((_DWORD *)Address + 15) = KUSER_SHARED_DATA.BootId;
*((_DWORD *)Address + 16) = v8;
*((_DWORD *)Address + 17) = *(_DWORD *)&ProcessInfoFlags[8];
if( (unsigned int)v5 >= v12 )
{
*((_DWORD *)Address + 18) = 96;
v16 = (unsigned int)RequiredLength;
memmove((char *)Address + 96, UserSid, RequiredLength);
v17 = (char *)Address + v16 + 96;
*((_DWORD *)Address + 19) = v16 + 96;
v18 = v28;
memmove(v17, *((const VOID **)v28 + 1), *(_WORD *)v28);
v19 = &v17[*(_WORD *)v18 + 2];
*((_DWORD *)Address + 20) = (_DWORD)v19 - (_DWORD)Address;
memmove(v19, &PackageInfo[16], *(size_t *)PackageInfo);
v20 = &v19[*(_QWORD *)PackageInfo];
*((_DWORD *)Address + 21) = (_DWORD)v20 - (_DWORD)Address;
memmove(v20, &PackageInfo[272], *(size_t *)&PackageInfo[8]);
v21 = &v20[*(_QWORD *)&PackageInfo[8]];
*((_DWORD *)Address + 22) = (_DWORD)v21 - (_DWORD)Address;
memmove(v21, CommandLine.Buffer, CommandLine.Length);
v11 = 0;
}
else
{
v11 = -2147483643;
HIDWORD(RequiredLength) = -2147483643;
}
}
}
if( CommandLine.Buffer )
ExFreePoolWithTag(CommandLine.Buffer, 0);
if( v10 )
ObFastDereferenceObject(&Process->Token, v10);
return v11;
}Referenced by:
NtQueryInformationProcess