PiDrvDbQuerySystemPathWin32
NTSTATUS __stdcall PiDrvDbQuerySystemPathWin32(PCUNICODE_STRING String2, PUNICODE_STRING StringOut){
_ADAPTER_OBJECT *v4;
_UNICODE_STRING *v5;
NTSTATUS v6;
NTSTATUS Node;
NTSTATUS FileDosDeviceName;
unsigned __int16 Length;
unsigned __int16 v10;
unsigned __int16 v11;
wchar_t *Buffer;
wchar_t *v13;
unsigned __int16 v14;
bool v15;
unsigned __int16 v16;
unsigned __int64 v17;
wchar_t *v18;
int v19;
int v20;
_UNICODE_STRING *v21;
UINT64 ShareAccess;
UINT64 OpenOptions;
_UNICODE_STRING DestinationString;
PVOID Object;
_UNICODE_STRING v27;
_UNICODE_STRING String2a;
_UNICODE_STRING *v29;
_UNICODE_STRING Source;
_OBJECT_ATTRIBUTES ObjectAttributes;
_IO_STATUS_BLOCK IoStatusBlock;
__int64 v33[14];
int v34;
_UNICODE_STRING *StringIn;
VOID *FileHandle;
*(&ObjectAttributes.Length + 1) = 0;
*(&ObjectAttributes.Attributes + 1) = 0;
FileHandle = 0i64;
StringIn = 0i64;
Object = 0i64;
IoStatusBlock = 0i64;
v4 = 0i64;
v34 = 0;
v5 = 0i64;
v29 = 0i64;
String2a = 0i64;
DestinationString = 0i64;
v27 = 0i64;
Source = 0i64;
RtlInitUnicodeString(StringOut, 0i64);
RtlInitUnicodeString(&DestinationString, 0i64);
RtlInitUnicodeString(&v27, 0i64);
LODWORD(OpenOptions) = 33;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)String2;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
LODWORD(ShareAccess) = 3;
if( ZwOpenFile(&FileHandle, 0x100080ui64, &ObjectAttributes, &IoStatusBlock, ShareAccess, OpenOptions) >= 0 )
{
Object = 0i64;
v6 = ObReferenceObjectByHandle(FileHandle, 0x80ui64, (_OBJECT_TYPE *)IoFileObjectType, 0, &Object, 0i64);
v4 = (_ADAPTER_OBJECT *)Object;
Node = v6;
if( v6 >= 0 )
{
FileDosDeviceName = IoQueryFileDosDeviceName((_FILE_OBJECT *)Object, (_OBJECT_NAME_INFORMATION **)&StringIn);
v5 = StringIn;
Node = FileDosDeviceName;
if( FileDosDeviceName >= 0 )
Node = RtlDuplicateUnicodeString(1ui64, StringIn, StringOut);
}
goto LABEL_39;
}
Length = String2->Length;
if( String2->Length >= 0x16u && (unsigned __int8)RtlPrefixUnicodeString(&PiDrvDbSystemRootNt, String2, 1u) )
{
RtlInitUnicodeString(&String2a, L"SYSTEM");
v10 = String2->Length;
if( String2->Length > 0x18u && String2->Buffer[11] == 92 )
{
v27.Buffer = String2->Buffer + 11;
v11 = v10 - 22;
LABEL_18:
v27.Length = v11;
v27.MaximumLength = v11 + 2;
goto LABEL_21;
}
}
else if( Length > 0x1Cu
&& (unsigned __int8)RtlPrefixUnicodeString(&PiDrvDbDriverStoresRoot, String2, 1u)
&& (Buffer = String2->Buffer, Buffer[13] == 92) )
{
v13 = Buffer + 14;
v14 = 0;
v15 = Buffer[14] == 92;
String2a.Buffer = Buffer + 14;
if( !v15 )
{
do
{
if( !v13[v14] )
break;
++v14;
}
while( v13[v14] != 92 );
}
v16 = 2 * v14;
v17 = (unsigned __int64)v16 >> 1;
String2a.Length = v16;
String2a.MaximumLength = v16;
v18 = &v13[v17];
if( *v18 == 92 )
{
v27.Buffer = &v13[v17];
v11 = Length - 2 * (v18 - Buffer);
goto LABEL_18;
}
}
else
{
RtlInitUnicodeString(&String2a, L"SYSTEM");
}
v11 = v27.Length;
LABEL_21:
Node = PiDrvDbFindNode(&String2a);
if( Node < 0 )
goto LABEL_39;
v19 = *((_DWORD *)Object + 16);
if( (v19 & 1) != 0 )
{
RtlInitUnicodeString(&Source, L"C:\\Windows");
DestinationString.MaximumLength = v11 + Source.Length + 2;
DestinationString.Buffer = (wchar_t *)ExpAllocateStringRoutine(DestinationString.MaximumLength);
if( !DestinationString.Buffer )
goto LABEL_24;
Node = RtlAppendUnicodeStringToString(&DestinationString, &Source);
if( Node < 0 )
goto LABEL_39;
if( InitIsWinPEMode )
{
memset(v33, 0i64, sizeof(v33));
LODWORD(v33[4]) = 0x4000000;
LODWORD(v33[1]) = 292;
v33[2] = (__int64)L"InstRootDrive";
v33[3] = (__int64)&v34;
LOBYTE(v20) = RtlpQueryRegistryValues((_KTRAP_FRAME *)2, (_KEXCEPTION_FRAME *)&stru_1407D2340);
Node = v20;
if( v20 < 0 || (unsigned int)(v34 - 65) > 0x19 )
{
Node = 0;
*DestinationString.Buffer = 88;
}
else
{
*DestinationString.Buffer = v34;
}
}
}
else
{
if( (v19 & 8) == 0 )
{
Node = -1073741275;
goto LABEL_39;
}
Node = PiDrvDbGetNodeSystemRoot((__int64)Object, &v29);
if( Node < 0 )
goto LABEL_39;
v21 = v29;
DestinationString.MaximumLength = v29->Length + v11 + 2;
DestinationString.Buffer = (wchar_t *)ExpAllocateStringRoutine(DestinationString.MaximumLength);
if( !DestinationString.Buffer )
{
LABEL_24:
Node = -1073741670;
goto LABEL_39;
}
Node = RtlAppendUnicodeStringToString(&DestinationString, v21);
if( Node < 0 )
goto LABEL_39;
}
if( v11 <= 2u || (Node = RtlAppendUnicodeStringToString(&DestinationString, &v27), Node >= 0) )
{
*StringOut = DestinationString;
RtlInitUnicodeString(&DestinationString, 0i64);
}
LABEL_39:
RtlFreeAnsiString(&DestinationString);
if( v5 )
ExFreePoolWithTag(v5, 0);
if( v4 )
HalPutDmaAdapter(v4);
if( FileHandle )
ZwClose((_HANDLE)FileHandle);
return Node;
}Referenced by:
PiDrvDbRegisterNode
PiDrvDbResolveFilePathKeyValues