DrvDbSetDriverDatabaseMappedProperty
__int64 __fastcall DrvDbSetDriverDatabaseMappedProperty(
__int64 a1,
const wchar_t *a2,
void *a3,
__int64 a4,
int a5,
int *SourceString,
ULONG a7){
int DatabaseNode;
INT64 v11;
int v12;
__int64 v13;
int v14;
unsigned int v15;
__int64 **v16;
__int64 *v17;
__int64(**v18)[3];
__int64(**v19)[3];
unsigned int v20;
__int64(*v21)[3];
HANDLE v22;
int v23;
__int64 v25;
__int64 v26;
int v27;
unsigned int v28;
__int64 v29;
int v30;
__int64 v31;
_ETHREAD *v32;
__int64 v33;
int v34;
struct _ERESOURCE *v35;
__int64 v36;
__int64 v37;
__int64 v38;
__int64(**v39)[3];
unsigned int v40;
__int64(*v41)[3];
__int64 v42;
__int64 v43;
_ETHREAD *CurrentThread;
INT64 v45;
struct _UNICODE_STRING v46;
INT64 a5a;
INT64 v48;
__int64(**v49)[3];
HANDLE Handle;
struct _UNICODE_STRING DestinationString;
Handle = 0i64;
v48 = 0i64;
DatabaseNode = 0;
v11 = 0i64;
DestinationString = 0i64;
v12 = wcsicmp(a2, L"*");
v14 = *(_DWORD *)(a4 + 16);
if( v12 )
{
if( v14 == 2 )
{
v29 = *(_QWORD *)a4 - DEVPKEY_NODE;
if( *(_QWORD *)a4 == DEVPKEY_NODE )
v29 = *(_QWORD *)(a4 + 8) + 0x5008C7D4C8250077i64;
if( !v29 )
{
LABEL_50:
DatabaseNode = -1073741790;
goto LABEL_24;
}
}
v15 = 0;
v16 = off_140C02C70;
while( 1 )
{
v17 = *v16;
if( *((_DWORD *)*v16 + 4) == v14 )
{
v13 = *v17 - *(_QWORD *)a4;
if( *v17 == *(_QWORD *)a4 )
v13 = v17[1] - *(_QWORD *)(a4 + 8);
if( !v13 )
break;
}
++v15;
++v16;
if( v15 >= 7 )
{
v49 = 0i64;
v18 = &off_140001FC0;
v19 = 0i64;
v20 = 0;
while( 1 )
{
v21 = *v18;
if( LODWORD((**v18)[2]) == v14 )
{
v13 = (*v21)[0] - *(_QWORD *)a4;
if( (*v21)[0] == *(_QWORD *)a4 )
v13 = (*v21)[1] - *(_QWORD *)(a4 + 8);
if( !v13 )
break;
}
++v20;
v18 += 5;
if( v20 >= 0xC )
goto LABEL_14;
}
v13 = 5i64 * v20;
v19 = &off_140001FC0 + 5 * v20;
v49 = v19;
LABEL_14:
if( v19 )
goto LABEL_15;
v49 = 0i64;
v39 = &off_140009A30;
v19 = 0i64;
v40 = 0;
while( 1 )
{
v41 = *v39;
if( LODWORD((**v39)[2]) == v14 )
{
v42 = (*v41)[0] - *(_QWORD *)a4;
if( (*v41)[0] == *(_QWORD *)a4 )
v42 = (*v41)[1] - *(_QWORD *)(a4 + 8);
if( !v42 )
break;
}
++v40;
v39 += 5;
if( v40 >= 4 )
goto LABEL_105;
}
v19 = &off_140009A30 + 5 * v40;
v49 = v19;
LABEL_105:
if( !v19 )
{
DatabaseNode = -1073741802;
goto LABEL_24;
}
DatabaseNode = DrvDbFindDatabaseNode(a1, a2, (const UNICODE_STRING **)&v48);
if( DatabaseNode >= 0 )
{
v11 = v48;
if( (*(_DWORD *)(v48 + 56) & 0x10) == 0 )
goto LABEL_50;
LABEL_15:
if( a5 != *((_DWORD *)v19 + 2) && a5 )
{
LABEL_111:
DatabaseNode = -1073741811;
goto LABEL_24;
}
if( (v22 = a3) != 0i64 && (!v11 || (*(_DWORD *)(v11 + 56) & 0x10) == 0)
|| (!v11 || (*(_DWORD *)(v11 + 56) & 0x10) == 0 ? (v23 = DrvDbOpenDriverDatabaseRegKey(
(const UNICODE_STRING **)a1,
a2,
2u,
0,
&Handle,
0i64)) : (LODWORD(a5a) = 2,
v23 = DrvDbOpenObjectRegKey(
(INT64 *)a1,
*(const UNICODE_STRING **)(a1 + 32),
1i64,
(WCHAR *)a2,
a5a,
0,
(INT64)&Handle,
0i64,
0i64)),
DatabaseNode = v23,
v23 >= 0) )
{
if( Handle )
v22 = Handle;
DatabaseNode = DrvDbSetRegValueMappedProperty(v13, v22, (__int64)v49, a5, SourceString, a7);
if( DatabaseNode >= 0 && v11 && (*(_DWORD *)(v11 + 56) & 0x10) != 0 && *(_DWORD *)(a4 + 16) == 14 )
{
v43 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_RegistryPath;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_RegistryPath )
v43 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( !v43 && a5 )
{
if( a7 < 2 || !SourceString || *((_WORD *)SourceString + ((unsigned __int64)a7 >> 1) - 1) )
goto LABEL_111;
if( !RtlCreateUnicodeString(&DestinationString, (PWCHAR)SourceString) )
{
DatabaseNode = -1073741670;
goto LABEL_24;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v45 = v48;
ExAcquireResourceExclusiveLite(*(ERESOURCE **)(v48 + 144), 1u);
RtlFreeAnsiString((_UNICODE_STRING *)(v45 + 40));
v46 = DestinationString;
*(_DWORD *)(v45 + 32) = 0;
*(struct _UNICODE_STRING *)(v45 + 40) = v46;
v35 = *(struct _ERESOURCE **)(v45 + 144);
goto LABEL_129;
}
}
}
}
goto LABEL_24;
}
}
DatabaseNode = DrvDbFindDatabaseNode(a1, a2, (const UNICODE_STRING **)&v48);
if( DatabaseNode < 0 )
goto LABEL_24;
v30 = *(_DWORD *)(a4 + 16);
switch( v30 )
{
case 5:
v31 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Loaded;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Loaded )
v31 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( !v31 )
{
if( a5 != 17 || a7 != 1 || !SourceString )
goto LABEL_111;
if( (*(_DWORD *)(v48 + 56) & 1) != 0 )
goto LABEL_50;
v32 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v32 + 242);
v33 = v48;
ExAcquireResourceExclusiveLite(*(ERESOURCE **)(v48 + 144), 1u);
if( *(_BYTE *)SourceString == 0xFF )
v34 = DrvDbLoadDatabaseNode(a1, v33);
else
v34 = DrvDbUnloadDatabaseNode(a1, v33);
v35 = *(struct _ERESOURCE **)(v33 + 144);
DatabaseNode = v34;
LABEL_129:
ExReleaseResourceLite(v35);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
goto LABEL_24;
}
goto LABEL_24;
case 6:
v36 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Selected;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Selected )
v36 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( !v36 )
{
if( a5 != 17 || a7 != 1 || !SourceString )
goto LABEL_111;
if( *(_BYTE *)SourceString == 0xFF )
{
*(_QWORD *)(a1 + 40) = v48;
}
else if( v48 == *(_QWORD *)(a1 + 40) || !v48 )
{
*(_QWORD *)(a1 + 40) = 0i64;
}
}
goto LABEL_24;
case 7:
v37 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Disabled;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Disabled )
v37 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( !v37 )
{
if( a5 != 17 || a7 != 1 || !SourceString )
goto LABEL_111;
if( *(_BYTE *)SourceString == 0xFF )
*(_DWORD *)(v48 + 56) |= 4u;
else
*(_DWORD *)(v48 + 56) &= ~4u;
}
goto LABEL_24;
}
if( v30 != 11 )
goto LABEL_24;
v38 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_AccessMask;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_AccessMask )
v38 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( v38 )
goto LABEL_24;
if( a5 != 7 || a7 != 4 || !SourceString )
goto LABEL_111;
if( v48 != *(_QWORD *)(a1 + 32) )
goto LABEL_50;
v27 = *SourceString;
goto LABEL_44;
}
if( v14 != 6 )
{
if( v14 == 11 )
{
v26 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_AccessMask;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_AccessMask )
v26 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( !v26 )
{
if( a5 != 7 || a7 != 4 || !SourceString )
goto LABEL_111;
v27 = *SourceString;
LABEL_44:
v28 = v27 & 0xD0000000;
*(_DWORD *)(a1 + 12) = v28;
if( v28 == 0x10000000 )
*(_DWORD *)(a1 + 12) = -805306368;
goto LABEL_24;
}
}
LABEL_46:
DatabaseNode = -1073741637;
goto LABEL_24;
}
v25 = *(_QWORD *)a4 - DEVPKEY_DriverDatabase_Selected;
if( *(_QWORD *)a4 == DEVPKEY_DriverDatabase_Selected )
v25 = *(_QWORD *)(a4 + 8) + 0x4524B8338B5D1E6Ci64;
if( v25 )
goto LABEL_46;
if( a5 != 17 || a7 != 1 || !SourceString )
goto LABEL_111;
if( *(_BYTE *)SourceString == 0xFF )
*(_QWORD *)(a1 + 40) = 0i64;
LABEL_24:
if( Handle )
ZwClose(Handle);
return(unsigned int)DatabaseNode;
}Referenced by:
DrvDbCreateDatabaseNode
DrvDbDispatchDriverDatabase
DrvDbInitializeDatabaseNodeVersion