DrvDbCreateDatabaseNode
NTSTATUS __stdcall DrvDbCreateDatabaseNode(
_DRVDB_CONTEXT *pDrvDbCtx,
WCHAR *DatabaseNodeId,
INT64 a3,
WCHAR *a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
_QWORD *v8;
int v10;
VOID **v13;
WCHAR *PoolWithTag;
VOID **v15;
HPNPCTX *v16;
INT64 v17;
INT64 v18;
VOID **v19;
int v20;
bool v21;
__int64 v23;
UINT64 v24;
_UNICODE_STRING *v25;
VOID **v26;
VOID ***v27;
void *v28;
UINT64 dwFlags;
INT64 pszFormat;
VOID **Disposition;
UINT64 *v32;
VOID *ObjectBaseKey;
UINT64 v34;
v8 = (_QWORD *)a8;
ObjectBaseKey = 0i64;
LODWORD(v34) = 0;
v10 = a3;
*(_QWORD *)a8 = 0i64;
v13 = 0i64;
if( a4 )
{
PoolWithTag = a4;
}
else
{
v23 = -1i64;
do
++v23;
while( DatabaseNodeId[v23] );
v24 = (unsigned int)(2 * v23 + 68);
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(1ui64, v24, 1111770192i64);
if( !PoolWithTag )
goto LABEL_25;
v32 = (UINT64 *)DatabaseNodeId;
Disposition = (VOID **)L"\\REGISTRY\\MACHINE";
LODWORD(dwFlags) = 2048;
v20 = RtlStringCchPrintfExW(PoolWithTag, v24 >> 1, 0i64, 0i64, dwFlags, (WCHAR *)L"%ws\\%ws\\%ws");
if( v20 < 0 )
goto LABEL_13;
}
v15 = ExAllocatePoolWithTag(1ui64, 0xA0ui64, 1111770192i64);
v13 = v15;
if( !v15 )
{
LABEL_25:
v20 = -1073741801;
goto LABEL_13;
}
memset(v15, 0i64, 0xA0u);
*((_DWORD *)v13 + 15) = pDrvDbCtx[2];
*((_DWORD *)v13 + 14) = a5;
v13[9] = (VOID *)a6;
v13[10] = (VOID *)a7;
*((_DWORD *)v13 + 16) = 0x10000;
*((_DWORD *)v13 + 8) = v10;
if( RtlCreateUnicodeString((INT64)(v13 + 2), (INT8 *)DatabaseNodeId)
&& RtlCreateUnicodeString((INT64)(v13 + 5), (INT8 *)PoolWithTag) )
{
v19 = ExAllocatePoolWithTag(0x200ui64, 0x68ui64, 1111770192i64);
v13[18] = v19;
if( v19 )
{
v20 = ExInitializeResourceLite((INT64)v19);
if( v20 < 0 )
{
ExFreePoolWithTag(v13[18], 0);
v13[18] = 0i64;
}
}
else
{
v20 = -1073741670;
}
if( v20 >= 0 )
{
v16 = (HPNPCTX *)*((_QWORD *)pDrvDbCtx + 3);
if( *(_DRVDB_CONTEXT **)v16 != pDrvDbCtx + 4 )
goto LABEL_40;
v21 = (a5 & 0x10) == 0;
*v13 = pDrvDbCtx + 4;
v13[1] = v16;
*(_QWORD *)v16 = v13;
*((_QWORD *)pDrvDbCtx + 3) = v13;
if( v21
|| (v25 = (_UNICODE_STRING *)*((_QWORD *)pDrvDbCtx + 4)) == 0i64
|| (v20 = DrvDbOpenObjectRegKey(
pDrvDbCtx,
v25,
DRVDB_BASE_KEY_TYPE_NODES,
DatabaseNodeId,
0x2000000,
1u,
&ObjectBaseKey,
&v34),
v20 >= 0)
&& ((_DWORD)v34 != 1
|| (LODWORD(Disposition) = *((unsigned __int16 *)v13 + 20) + 2,
LODWORD(dwFlags) = 18,
v20 = DrvDbSetDriverDatabaseMappedProperty(
(_UNICODE_STRING **)pDrvDbCtx,
DatabaseNodeId,
ObjectBaseKey,
(_DEVPROPKEY *)&DEVPKEY_DriverDatabase_RegistryPath,
dwFlags,
(UINT8 *)v13[6],
(UINT64)Disposition),
v20 >= 0)) )
{
*v8 = v13;
v13 = 0i64;
}
}
}
else
{
v20 = -1073741670;
}
LABEL_13:
if( ObjectBaseKey )
PnpCtxRegCloseKey(v16, ObjectBaseKey, v17, v18, dwFlags, pszFormat, (INT64)Disposition, (INT64)v32);
if( v13 )
{
v26 = (VOID **)*v13;
if( !*v13 )
{
LABEL_37:
v28 = v13[18];
if( v28 )
{
ExDeleteResourceLite((UINT64)v13[18]);
ExFreePoolWithTag(v28, 0);
}
RtlFreeAnsiString((_UNICODE_STRING *)v13 + 1);
RtlFreeAnsiString((_UNICODE_STRING *)(v13 + 5));
ExFreePoolWithTag(v13, 0);
goto LABEL_16;
}
if( v26[1] == v13 )
{
v27 = (VOID ***)v13[1];
if( *v27 == v13 )
{
*v27 = v26;
v26[1] = v27;
goto LABEL_37;
}
}
LABEL_40:
__fastfail(3u);
}
LABEL_16:
if( PoolWithTag && PoolWithTag != a4 )
ExFreePoolWithTag(PoolWithTag, 0);
return v20;
}Referenced by:
DrvDbOpenContext
DrvDbOpenDriverDatabaseRegKey
DrvDbRegisterDatabase