DrvDbCreateDatabaseNode
INT64 __fastcall DrvDbCreateDatabaseNode(
INT64 a1,
const WCHAR *a2,
INT64 a3,
CHAR *a4,
INT64 a5,
INT64 a6,
INT64 arg30,
CHAR **arg38){
CHAR **v8;
int v10;
_QWORD *v13;
WCHAR *PoolWithTag;
_QWORD *v15;
_QWORD *v16;
UINT64 v17;
INT64 v18;
struct _ERESOURCE *v19;
int v20;
bool v21;
UINT64 *v22;
__int64 v24;
UINT64 v25;
int v26;
const UNICODE_STRING *v27;
__int64 v28;
_QWORD *v29;
void *v30;
VOID *dwFlags;
INT64 a7[2];
INT64 a8;
v8 = arg38;
a7[0] = 0i64;
LODWORD(a8) = 0;
v10 = a3;
*arg38 = 0i64;
v13 = 0i64;
if( a4 )
{
PoolWithTag = (WCHAR *)a4;
}
else
{
v24 = -1i64;
do
++v24;
while( a2[v24] );
v25 = (unsigned int)(2 * v24 + 68);
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, v25, 0x42444450ui64);
if( !PoolWithTag )
goto LABEL_25;
LODWORD(dwFlags) = 2048;
RtlStringCchPrintfExW(PoolWithTag, v25 >> 1, 0i64, 0i64, (UINT64)dwFlags, L"%ws\\%ws\\%ws");
v20 = v26;
if( v26 < 0 )
goto LABEL_13;
}
v15 = ExAllocatePoolWithTag(PagedPool, 0xA0ui64, 0x42444450ui64);
v13 = v15;
if( !v15 )
{
LABEL_25:
v20 = -1073741801;
goto LABEL_13;
}
memset((INT64)v15, 0i64);
*((_DWORD *)v13 + 15) = *(_DWORD *)(a1 + 8);
*((_DWORD *)v13 + 14) = a5;
v13[9] = a6;
v13[10] = arg30;
*((_DWORD *)v13 + 16) = 0x10000;
*((_DWORD *)v13 + 8) = v10;
if( RtlCreateUnicodeString((UNICODE_STRING *)v13 + 1, (PWCHAR)a2)
&& RtlCreateUnicodeString((UNICODE_STRING *)(v13 + 5), PoolWithTag) )
{
v19 = (struct _ERESOURCE *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x68ui64, 0x42444450ui64);
v13[18] = v19;
if( v19 )
{
v20 = ExInitializeResourceLite(v19);
if( v20 < 0 )
{
ExFreePoolWithTag((PVOID)v13[18], 0);
v13[18] = 0i64;
}
}
else
{
v20 = -1073741670;
}
if( v20 >= 0 )
{
v16 = *(_QWORD **)(a1 + 24);
if( *v16 != a1 + 16 )
goto LABEL_40;
v21 = (a5 & 0x10) == 0;
*v13 = a1 + 16;
v13[1] = v16;
*v16 = v13;
*(_QWORD *)(a1 + 24) = v13;
if( v21
|| (v27 = *(const UNICODE_STRING **)(a1 + 32)) == 0i64
|| (LODWORD(dwFlags) = 0x2000000,
v20 = DrvDbOpenObjectRegKey(
(INT64 *)a1,
v27,
1i64,
(WCHAR *)a2,
(INT64)dwFlags,
1,
(INT64)a7,
(INT64)&a8,
0i64),
v20 >= 0)
&& ((_DWORD)a8 != 1
|| (v20 = DrvDbSetDriverDatabaseMappedProperty(
a1,
a2,
(void *)a7[0],
(__int64)&DEVPKEY_DriverDatabase_RegistryPath,
18,
(int *)v13[6],
(unsigned int)*((unsigned __int16 *)v13 + 20) + 2),
v20 >= 0)) )
{
*v8 = (CHAR *)v13;
v13 = 0i64;
}
}
}
else
{
v20 = -1073741670;
}
LABEL_13:
v22 = (UINT64 *)a7[0];
if( a7[0] )
PnpCtxRegCloseKey((__int64)v16, (void *)a7[0]);
if( v13 )
{
v28 = *v13;
if( !*v13 )
{
LABEL_37:
v30 = (void *)v13[18];
if( v30 )
{
ExDeleteResourceLite(v13[18], v22, v17, v18, dwFlags);
ExFreePoolWithTag(v30, 0);
}
RtlFreeAnsiString((_UNICODE_STRING *)v13 + 1);
RtlFreeAnsiString((_UNICODE_STRING *)(v13 + 5));
ExFreePoolWithTag(v13, 0);
goto LABEL_16;
}
if( *(_QWORD **)(v28 + 8) == v13 )
{
v29 = (_QWORD *)v13[1];
if( (_QWORD *)*v29 == v13 )
{
*v29 = v28;
*(_QWORD *)(v28 + 8) = v29;
goto LABEL_37;
}
}
LABEL_40:
__fastfail(3u);
}
LABEL_16:
if( PoolWithTag && PoolWithTag != (WCHAR *)a4 )
ExFreePoolWithTag(PoolWithTag, 0);
return(unsigned int)v20;
}Referenced by:
DrvDbOpenContext
DrvDbOpenDriverDatabaseRegKey
DrvDbRegisterDatabase