PiDrvDbResolveKeyFilePaths
INT64 __stdcall PiDrvDbResolveKeyFilePaths(HANDLE Handle){
WCHAR v1;
int Node;
WCHAR v4;
unsigned __int16 Length;
wchar_t *Buffer;
unsigned __int64 v7;
const WCHAR *v8;
int v9;
INT64 v10;
int NodeSystemRoot;
UNICODE_STRING *v12;
struct _UNICODE_STRING DestinationString;
UNICODE_STRING String2;
UNICODE_STRING *a2;
a2 = 0i64;
DestinationString = 0i64;
String2 = 0i64;
RtlInitUnicodeString(&DestinationString, 0i64, v1);
Node = IopQueryRegistryKeySystemPath(Handle, &DestinationString);
if( Node >= 0 )
{
Length = DestinationString.Length;
Buffer = DestinationString.Buffer;
if( DestinationString.Length >= 2u )
{
v7 = (unsigned __int64)DestinationString.Length >> 1;
if( DestinationString.Buffer[v7 - 1] == 92 )
{
DestinationString.Buffer[v7 - 1] = 0;
Buffer = DestinationString.Buffer;
Length = DestinationString.Length - 2;
DestinationString.Length -= 2;
}
}
if( Length <= 0x1Cu
|| !(unsigned __int8)RtlPrefixUnicodeString((PVOID)&PiDrvDbDriverStoresRoot, (INT64 *)&DestinationString)
|| (v8 = Buffer + 14, Buffer[13] != 92) )
{
v8 = L"SYSTEM";
}
RtlInitUnicodeString(&String2, v8, v4);
Node = PiDrvDbFindNode(&String2);
if( Node >= 0 )
{
if( (MEMORY[0x1EC] & 1) != 0 )
{
v9 = CmIsStateSeparationEnabled() ? 2 : 0;
NodeSystemRoot = PiDrvDbGetNodeSystemRoot(v10, &a2);
v12 = a2;
if( NodeSystemRoot < 0 )
v12 = 0i64;
Node = PiDrvDbResolveFilePathKeyValues((INT64)Handle, (unsigned __int8)v9 + 1, &DestinationString, v12);
}
else
{
Node = 0;
}
}
}
RtlFreeAnsiString(&DestinationString);
return(unsigned int)Node;
}Referenced by:
PiDevCfgInitResolveContext