PiRearrangeDeviceInstances
VOID __stdcall PiRearrangeDeviceInstances(PVOID ServiceEnumHandle, UINT64 InstanceCount, UINT64 InstanceDeleted){
int v3;
int v4;
signed __int64 v6;
PVOID v7;
signed __int64 v8;
PVOID v9;
NTSTRSAFE_PCWSTR pszFormat;
__int64 v11;
NTSTRSAFE_PWSTR ppszDestEnd;
struct _UNICODE_STRING ValueName;
UINT64 dwFlags;
PVOID P;
__int128 KeyInformation[3];
wchar_t pszDest[12];
*(_DWORD *)(&ValueName.MaximumLength + 1) = 0;
LODWORD(dwFlags) = 0;
P = 0i64;
v3 = InstanceDeleted;
v4 = InstanceCount;
memset(KeyInformation, 0, sizeof(KeyInformation));
ZwQueryKey(ServiceEnumHandle, KeyFullInformation, KeyInformation, 0x30ui64, &dwFlags);
ppszDestEnd = pszDest;
RtlStringCchPrintfExW(pszDest, 0xAui64, &ppszDestEnd, 0i64, 0i64, L"%u", v4);
v6 = ppszDestEnd - pszDest;
ValueName.MaximumLength = 20;
if( (_DWORD)v6 == -1 )
ValueName.Length = 20;
else
ValueName.Length = 2 * v6;
ValueName.Buffer = pszDest;
if( IopGetRegistryValue(ServiceEnumHandle, pszDest, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P) >= 0 )
{
ZwDeleteValueKey(ServiceEnumHandle, &ValueName);
LODWORD(v11) = v3;
ppszDestEnd = pszDest;
RtlStringCchPrintfExW(pszDest, 0xAui64, &ppszDestEnd, 0i64, 0i64, L"%u", v11);
ValueName.MaximumLength = 20;
v8 = ppszDestEnd - pszDest;
if( (_DWORD)v8 == -1 )
ValueName.Length = 20;
else
ValueName.Length = 2 * v8;
v9 = P;
ValueName.Buffer = pszDest;
LODWORD(pszFormat) = *((_DWORD *)P + 3);
ZwSetValueKey(ServiceEnumHandle, &ValueName, 0i64, 1ui64, (char *)P + *((unsigned int *)P + 2), (UINT64)pszFormat);
ExFreePoolWithTag(v9, 0);
v7 = 0i64;
}
else
{
v7 = P;
}
if( v7 )
ExFreePoolWithTag(v7, 0);
}Referenced by:
PiProcessDriverInstance