PsQueryProcessCommandLine
NTSTATUS __stdcall PsQueryProcessCommandLine(
PVOID Process,
_UNICODE_STRING *ProcessCommandLineBuffer,
UINT64 ProcessCommandLineBufferLength,
INT64 PreviousMode,
INT64 ReturnLength){
__int64 v7;
__int64 *v8;
__int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
NTSTATUS v14;
unsigned __int64 v15;
unsigned int v16;
int v17;
UINT8 v19;
__int128 FromAddress;
UINT64 NumberOfBytesRead;
_EX_RUNDOWN_REF *RunRef;
__int64 v23;
__int64 v24;
_KAPC_STATE ApcState;
unsigned int v26;
CHAR v27;
v27 = PreviousMode;
v26 = ProcessCommandLineBufferLength;
memset(&ApcState, 0, sizeof(ApcState));
NumberOfBytesRead = 0i64;
RunRef = (_EX_RUNDOWN_REF *)((char *)Process + 1112);
v19 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)Process + 139);
if( v19 )
{
FromAddress = 0i64;
KiStackAttachProcess(Process, 0i64, &ApcState);
v7 = 0i64;
v8 = (__int64 *)*((_QWORD *)Process + 176);
if( v8 )
v7 = *v8;
if( v7 )
{
v23 = *(unsigned int *)(v7 + 16);
v13 = *(_QWORD *)(v23 + 64);
LODWORD(FromAddress) = v13;
v12 = v13 >> 16;
v11 = HIDWORD(v13);
*((_QWORD *)&FromAddress + 1) = HIDWORD(v13);
v14 = 0;
}
else
{
v9 = *((_QWORD *)Process + 170);
v24 = v9;
if( v9 )
{
v10 = *(_QWORD *)(v9 + 32) + 112i64;
if( v10 >= 0x7FFFFFFF0000i64 )
v10 = 0x7FFFFFFF0000i64;
LODWORD(FromAddress) = *(_DWORD *)v10;
v11 = *(_QWORD *)(v10 + 8);
*((_QWORD *)&FromAddress + 1) = v11;
LOWORD(v12) = HIWORD(*(_DWORD *)v10);
LOWORD(v13) = *(_DWORD *)v10;
v14 = 0;
}
else
{
v14 = -1073741275;
v11 = 0i64;
LOWORD(v12) = 0;
LOWORD(v13) = 0;
}
}
if( WORD1(FromAddress) )
{
if( (BYTE8(FromAddress) & 1) != 0 )
ExRaiseDatatypeMisalignment();
v15 = v11 + (unsigned __int16)v12;
if( v15 > 0x7FFFFFFF0000i64 || v15 < v11 )
MEMORY[0x7FFFFFFF0000] = 0;
}
KiUnstackDetachProcess(&ApcState, 0i64);
if( v14 >= 0 )
{
if( !(_WORD)v13
|| (unsigned __int16)v13 > (unsigned __int16)v12
|| (FromAddress & 1) != 0
|| (BYTE2(FromAddress) & 1) != 0
|| !v11 )
{
v14 = -1073741275;
}
else
{
v16 = (unsigned __int16)v12 + 16;
if( ReturnLength )
*(_DWORD *)ReturnLength = v16;
if( v26 < v16 )
{
v14 = -1073741820;
}
else
{
ProcessCommandLineBuffer->Length = v13;
ProcessCommandLineBuffer->MaximumLength = v12;
if( (_WORD)v12 )
ProcessCommandLineBuffer->Buffer = &ProcessCommandLineBuffer[1].Length;
else
ProcessCommandLineBuffer->Buffer = 0i64;
MmCopyVirtualMemory(
(_EPROCESS *)Process,
*((const VOID **)&FromAddress + 1),
KeGetCurrentThread()->ApcState.Process,
&ProcessCommandLineBuffer[1],
WORD1(FromAddress),
v27,
&NumberOfBytesRead);
v14 = v17;
if( v17 >= 0 )
v14 = 0;
}
}
}
}
else
{
v14 = -1073741558;
}
if( v19 )
ExReleaseRundownProtection(RunRef);
return v14;
}Referenced by:
NtQueryInformationProcess
SeAuditProcessCreation