IopBuildFullDriverPath
NTSTATUS __stdcall IopBuildFullDriverPath(UNICODE_STRING *KeyName, PVOID KeyHandle, UNICODE_STRING *FullPath){
WCHAR v6;
WCHAR v7;
WCHAR v8;
WCHAR v9;
WCHAR v10;
int appended;
NTSTATUS RegistryValue;
WCHAR v13;
PVOID v14;
unsigned int v15;
wchar_t *v16;
unsigned __int16 Length;
unsigned int v18;
CHAR *Pool_1;
WCHAR v21;
UNICODE_STRING v22;
UNICODE_STRING String2;
UNICODE_STRING Source;
struct _UNICODE_STRING DestinationString;
UNICODE_STRING String1;
UNICODE_STRING v27;
UNICODE_STRING v28;
UNICODE_STRING v29;
PVOID P;
*(_QWORD *)&String1.Length = 1703960i64;
*(_QWORD *)&v27.Length = 2359330i64;
String1.Buffer = L"\\SystemRoot\\";
v27.Buffer = L"System32\\Drivers\\";
DestinationString = 0i64;
Source = 0i64;
v28 = 0i64;
String2 = 0i64;
v29 = 0i64;
RtlInitUnicodeString(FullPath, 0i64, (WCHAR)FullPath);
RtlInitUnicodeString(&DestinationString, 0i64, v6);
RtlInitUnicodeString(&Source, 0i64, v7);
RtlInitUnicodeString(&v28, 0i64, v8);
RtlInitUnicodeString(&String2, 0i64, v9);
RtlInitUnicodeString(&v29, 0i64, v10);
P = 0i64;
appended = IopQueryRegistryKeySystemPath(KeyHandle, &DestinationString);
if( appended < 0 )
goto LABEL_16;
RegistryValue = IopGetRegistryValue(KeyHandle, (PWCHAR)L"ImagePath", 0x100ui64, (KEY_VALUE_FULL_INFORMATION **)&P);
v14 = P;
if( RegistryValue < 0 || (v15 = *((_DWORD *)P + 3), v15 < 2) )
{
Source = DestinationString;
v22 = *KeyName;
v28 = v27;
String2 = v22;
RtlInitUnicodeString(&v29, L".SYS", v13);
Length = String2.Length;
}
else
{
if( v15 > 0xFFFF )
goto LABEL_20;
v16 = (wchar_t *)((char *)P + *((unsigned int *)P + 2));
String2.MaximumLength = *((_DWORD *)P + 3);
Length = v15 - 2;
String2.Buffer = v16;
String2.Length = v15 - 2;
if( *v16 == 92 )
{
if( (unsigned __int8)RtlPrefixUnicodeString(&String1, (INT64 *)&String2) )
{
Length -= 24;
Source = DestinationString;
String2.Length = Length;
String2.Buffer = v16 + 12;
}
else
{
RtlInitUnicodeString(&Source, 0i64, v21);
}
}
else
{
Source = DestinationString;
}
}
v18 = Source.Length + 2 + v28.Length + v29.Length + Length;
if( v18 <= 0xFFFF )
{
FullPath->MaximumLength = v18;
FullPath->Length = 0;
Pool_1 = IopVerifierExAllocatePool_1(PagedPool, (unsigned __int16)v18);
FullPath->Buffer = (wchar_t *)Pool_1;
if( Pool_1 )
{
appended = RtlAppendUnicodeStringToString(FullPath, &Source);
if( appended >= 0 )
{
appended = RtlAppendUnicodeStringToString(FullPath, &v28);
if( appended >= 0 )
{
appended = RtlAppendUnicodeStringToString(FullPath, &String2);
if( appended >= 0 )
{
appended = RtlAppendUnicodeStringToString(FullPath, &v29);
if( appended >= 0 )
FullPath->Buffer[(unsigned __int64)FullPath->Length >> 1] = 0;
}
}
}
}
else
{
appended = -1073741670;
}
goto LABEL_14;
}
LABEL_20:
appended = -2147483643;
LABEL_14:
if( v14 )
ExFreePoolWithTag(v14, 0);
LABEL_16:
RtlFreeAnsiString(&DestinationString);
return appended;
}Referenced by:
IopLoadDriver
PiNormalizeDeviceText
PpCheckInDriverDatabase