PiProcessDriverInstance
__int64 __fastcall PiProcessDriverInstance(const UNICODE_STRING *a1, _UNICODE_STRING *a2, char *a3){
int DevInstMatch;
NTSTRSAFE_PWSTR v6;
wchar_t *Buffer;
char v8;
wchar_t *v9;
UINT8 *v10;
unsigned __int64 Length;
unsigned __int64 v12;
UINT8 *PoolWithTag;
signed __int64 v14;
bool v16;
UINT64 v17;
NTSTRSAFE_PCWSTR pszFormat;
NTSTRSAFE_PCWSTR pszFormata;
NTSTRSAFE_PCWSTR pszFormatb;
UINT64 Data;
struct _UNICODE_STRING ValueName;
UINT64 v23;
NTSTRSAFE_PWSTR ppszDestEnd;
struct _UNICODE_STRING UnicodeString;
wchar_t pszDest[12];
LODWORD(Data) = 0;
LODWORD(v23) = 0;
ppszDestEnd = 0i64;
UnicodeString = 0i64;
ValueName = 0i64;
DevInstMatch = PipOpenServiceEnumKeys(a2, 0xF003Fui64, 0i64, (PVOID *)&ppszDestEnd, 1u);
if( DevInstMatch >= 0 )
{
v6 = ppszDestEnd;
DevInstMatch = PiFindDevInstMatch(ppszDestEnd, (UNICODE_STRING *)a1, &Data, &UnicodeString, &v23);
if( DevInstMatch < 0 )
{
LABEL_17:
ZwClose(v6);
return(unsigned int)DevInstMatch;
}
Buffer = UnicodeString.Buffer;
v8 = *a3;
if( UnicodeString.Buffer )
{
if( v8 )
{
LABEL_14:
if( Buffer )
RtlFreeAnsiString(&UnicodeString);
goto LABEL_16;
}
ZwDeleteValueKey(v6, &UnicodeString);
v16 = (_DWORD)Data == 1;
v17 = (unsigned int)(Data - 1);
LODWORD(Data) = Data - 1;
if( !v16 )
PiRearrangeDeviceInstances(v6, v17, (unsigned int)v23);
}
else
{
if( !v8 )
{
LABEL_16:
DevInstMatch = 0;
goto LABEL_17;
}
v9 = a1->Buffer;
v10 = 0i64;
Length = a1->Length;
v12 = Length >> 1;
if( v9[(Length >> 1) - 1] )
{
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(
(_POOL_TYPE)(LODWORD(UnicodeString.Buffer) + 1),
Length + 2,
0x20207050ui64);
v10 = PoolWithTag;
if( PoolWithTag )
{
memmove(PoolWithTag, (UINT8 *)v9, (unsigned int)Length);
LODWORD(Length) = Length + 2;
*(_WORD *)&v10[2 * v12] = 0;
v9 = (wchar_t *)v10;
}
}
ppszDestEnd = pszDest;
RtlStringCchPrintfExW(pszDest, 0xAui64, &ppszDestEnd, 0i64, 0i64, L"%u", Data);
v14 = ppszDestEnd - pszDest;
ValueName.MaximumLength = 20;
if( (_DWORD)v14 == -1 )
ValueName.Length = 20;
else
ValueName.Length = 2 * v14;
LODWORD(pszFormata) = Length;
ValueName.Buffer = pszDest;
ZwSetValueKey(v6, &ValueName, 0i64, 1ui64, v9, (UINT64)pszFormata);
if( v10 )
ExFreePoolWithTag(v10, 0);
LODWORD(Data) = Data + 1;
}
*(_DWORD *)&ValueName.Length = 786442;
ValueName.Buffer = (wchar_t *)&stru_1407D01E0.Xmm8;
LODWORD(pszFormat) = 4;
ZwSetValueKey(v6, &ValueName, 0i64, 4ui64, &Data, (UINT64)pszFormat);
LODWORD(pszFormatb) = 4;
ValueName.Buffer = (wchar_t *)&stru_1407D01E0.Xmm15;
*(_DWORD *)&ValueName.Length = 1703960;
ZwSetValueKey(v6, &ValueName, 0i64, 4ui64, &Data, (UINT64)pszFormatb);
Buffer = UnicodeString.Buffer;
goto LABEL_14;
}
return(unsigned int)DevInstMatch;
}Referenced by:
No references.