PiDrvDbRegisterNode
INT64 __stdcall PiDrvDbRegisterNode(WCHAR *Name, UINT64 Flags){
WCHAR v2;
const WCHAR *v3;
unsigned int v4;
const WCHAR *v6;
WCHAR *PoolWithTag;
char v8;
INT64 v9;
int Node;
unsigned __int16 *v11;
int v12;
UINT64 v13;
WCHAR *v14;
UINT8 v15;
int v16;
int v17;
INT64 v18;
WCHAR v20;
wchar_t *v21;
CHAR *UnicodeSubstring;
unsigned __int16 i;
UNICODE_STRING String2;
struct _UNICODE_STRING DestinationString;
struct _UNICODE_STRING v26;
PVOID P;
P = 0i64;
v4 = Flags;
v6 = v3;
String2 = 0i64;
PoolWithTag = 0i64;
v8 = 0;
DestinationString = 0i64;
v26 = 0i64;
RtlInitUnicodeString(&DestinationString, 0i64, v2);
Node = PiDrvDbCreateNode(Name, v4, v9, v6, (INT64 *)&P);
v11 = (unsigned __int16 *)P;
v12 = Node;
if( Node < 0 )
goto LABEL_9;
if( (*((_DWORD *)P + 16) & 1) != 0 )
{
v17 = v4 & 8;
}
else
{
v13 = *((unsigned __int16 *)P + 16) + 32i64;
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v13, 0x62647050ui64);
if( !PoolWithTag )
{
v12 = -1073741670;
goto LABEL_9;
}
RtlStringCchPrintfW(PoolWithTag, v13 >> 1, (WCHAR *)L"%wZ\\%ws");
v12 = v16;
if( v16 < 0 )
goto LABEL_9;
v17 = v4 & 8;
v12 = DrvDbRegisterDatabase(v14, Name, v15, PoolWithTag);
if( v12 < 0 )
goto LABEL_9;
v8 = 1;
}
if( !v17 )
{
LABEL_8:
v11 = 0i64;
goto LABEL_9;
}
v12 = PnpSetObjectProperty(
PiPnpRtlCtx,
*((_QWORD *)v11 + 3),
7u,
*((_QWORD *)v11 + 9),
0i64,
(__int64)DEVPKEY_DriverDatabase_FilePath,
18,
*((_QWORD *)v11 + 7),
(unsigned int)v11[24] + 2,
0);
if( v12 >= 0 )
{
v21 = (wchar_t *)*((_QWORD *)v11 + 7);
String2.Buffer = v21;
RtlInitUnicodeString(&v26, L"\\System32\\config\\", v20);
UnicodeSubstring = RtlFindUnicodeSubstring(v11 + 24, &v26.Length, 1);
if( UnicodeSubstring )
{
i = 2 * ((__int64)(unsigned int)((_DWORD)UnicodeSubstring - *((_DWORD *)v11 + 14)) >> 1);
}
else
{
String2.Length = v11[24];
for( i = String2.Length; i > 2u; String2.Length = i )
{
if( v21[((unsigned __int64)i >> 1) - 1] == 92 )
break;
i -= 2;
}
if( i <= 2u || v21[((unsigned __int64)i >> 1) - 1] != 92 )
goto LABEL_25;
i -= 2;
}
String2.Length = i;
LABEL_25:
String2.MaximumLength = i;
if( (int)PiDrvDbQuerySystemPathWin32(&String2, &DestinationString) < 0 )
{
v12 = 0;
goto LABEL_8;
}
v12 = PnpSetObjectProperty(
PiPnpRtlCtx,
*((_QWORD *)v11 + 3),
7u,
*((_QWORD *)v11 + 9),
0i64,
(__int64)DEVPKEY_DriverDatabase_SystemPath,
18,
(__int64)DestinationString.Buffer,
(unsigned int)DestinationString.Length + 2,
0);
if( v12 >= 0 )
goto LABEL_8;
}
LABEL_9:
RtlFreeAnsiString(&DestinationString);
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
if( v11 )
{
if( v8 )
DrvDbUnregisterDatabase(v18, Name);
PiDrvDbDestroyNode((CHAR *)v11);
}
return(unsigned int)v12;
}Referenced by:
PiDrvDbInit
PiDrvDbRegisterNodeCallback