DrvDbOpenDriverDatabaseRegKey
__int64 __fastcall DrvDbOpenDriverDatabaseRegKey(
const UNICODE_STRING **a1,
const WCHAR *a2,
ACCESS_MASK a3,
char a4,
void **a5,
_DWORD *a6){
char v10;
int DatabaseNode;
int v12;
_ETHREAD *CurrentThread;
INT64 v14;
__int64 v15;
INT64 v17;
INT64 v18[2];
v18[0] = 0i64;
v10 = 0;
if( wcsicmp(a2, L"*") )
{
DatabaseNode = DrvDbFindDatabaseNode((__int64)a1, a2, (const UNICODE_STRING **)v18);
v12 = DatabaseNode;
if( DatabaseNode == -1073741772 )
{
if( !a4 )
return(unsigned int)v12;
LODWORD(v17) = 16;
v12 = DrvDbCreateDatabaseNode((INT64)a1, a2, 0i64, 0i64, v17, 0i64, 0i64, (CHAR **)v18);
if( v12 < 0 )
return(unsigned int)v12;
v10 = 1;
}
else if( DatabaseNode < 0 )
{
return(unsigned int)v12;
}
}
else
{
v18[0] = (INT64)a1[4];
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v14 = v18[0];
ExAcquireResourceExclusiveLite(*(ERESOURCE **)(v18[0] + 144), 1u);
if( (*(_DWORD *)(v14 + 56) & 1) != 0 || (v12 = DrvDbLoadDatabaseNode((__int64)a1, v14), v12 >= 0) )
{
if( *a1 )
v15 = *(_QWORD *)&(*a1)[14].Length;
else
v15 = 0i64;
v12 = SysCtxRegOpenKey(v15, *(char **)(v14 + 88), 0i64, 0, a3, a5);
if( (*(_DWORD *)(v14 + 56) & 1) == 0 )
DrvDbUnloadDatabaseNode((INT64)a1, v14);
if( v12 >= 0 && a6 )
*a6 = 2;
}
ExReleaseResourceLite(*(PERESOURCE *)(v14 + 144));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v12 < 0 && v10 )
DrvDbDestroyDatabaseNode((INT64)a1, (VOID ***)v18[0]);
return(unsigned int)v12;
}Referenced by:
DrvDbDispatchDriverDatabase
DrvDbGetDriverDatabaseMappedProperty
DrvDbGetDriverDatabaseMappedPropertyKeys
DrvDbSetDriverDatabaseMappedProperty