DrvDbSetDriverDatabaseMappedProperty
NTSTATUS __stdcall DrvDbSetDriverDatabaseMappedProperty(
_UNICODE_STRING **pDrvDbCtx,
WCHAR *DatabaseNodeId,
VOID *ObjectBaseKey,
_DEVPROPKEY *PropertyKey,
UINT64 PropertyType,
UINT8 *PropertyBuffer,
UINT64 PropertySize){
int v10;
_DRVDB_NODE *v11;
int v12;
__int64 v13;
unsigned int pid;
unsigned int v15;
char *v16;
_QWORD *v17;
_DEVPROPKEY **v18;
__int64(**v19)[3];
unsigned int v20;
_DEVPROPKEY *v21;
_DRVDB_PROPERTY_REG_VALUE_MAP *v22;
NTSTATUS v23;
__int64 v25;
__int64 v26;
int v27;
unsigned int v28;
__int64 v29;
INT64 v30;
unsigned int v31;
__int64 v32;
_ETHREAD *v33;
_DRVDB_NODE *v34;
NTSTATUS v35;
_ERESOURCE *v36;
__int64 v37;
__int64 v38;
__int64 v39;
__int64(**v40)[3];
unsigned int v41;
__int64(*v42)[3];
__int64 v43;
__int64 v44;
INT64 v45;
_ETHREAD *CurrentThread;
_DRVDB_NODE *v47;
_UNICODE_STRING v48;
_DRVDB_NODE *DatabaseNode;
UINT64 v50;
VOID *Handle;
_UNICODE_STRING DestinationString;
Handle = 0i64;
DatabaseNode = 0i64;
v10 = 0;
v11 = 0i64;
DestinationString = 0i64;
v12 = wcsicmp(DatabaseNodeId, L"*");
pid = PropertyKey->pid;
if( v12 )
{
if( pid == 2 )
{
v29 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_NODE;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_NODE )
v29 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x5008C7D4C8250077i64;
if( !v29 )
{
LABEL_50:
v10 = -1073741790;
goto LABEL_24;
}
}
v15 = 0;
v16 = (char *)&stru_140C00F40 + 7472;
while( 1 )
{
v17 = *(_QWORD **)v16;
if( *(_DWORD *)(*(_QWORD *)v16 + 16i64) == pid )
{
v13 = *v17 - *(_QWORD *)&PropertyKey->fmtid.Data1;
if( *v17 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
v13 = v17[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
if( !v13 )
break;
}
++v15;
v16 += 8;
if( v15 >= 7 )
{
v50 = 0i64;
v18 = &off_140001FC0;
v19 = 0i64;
v20 = 0;
while( 1 )
{
v21 = *v18;
if( (*v18)->pid == pid )
{
v13 = *(_QWORD *)&v21->fmtid.Data1 - *(_QWORD *)&PropertyKey->fmtid.Data1;
if( *(_QWORD *)&v21->fmtid.Data1 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
v13 = *(_QWORD *)v21->fmtid.Data4 - *(_QWORD *)PropertyKey->fmtid.Data4;
if( !v13 )
break;
}
++v20;
v18 += 5;
if( v20 >= 0xC )
goto LABEL_14;
}
v13 = 5i64 * v20;
v19 = (__int64(**)[3])&(&off_140001FC0)[5 * v20];
v50 = (UINT64)v19;
LABEL_14:
if( v19 )
goto LABEL_15;
v50 = 0i64;
v40 = &off_140009A30;
v19 = 0i64;
v41 = 0;
while( 1 )
{
v42 = *v40;
if( LODWORD((**v40)[2]) == pid )
{
v43 = (*v42)[0] - *(_QWORD *)&PropertyKey->fmtid.Data1;
if( (*v42)[0] == *(_QWORD *)&PropertyKey->fmtid.Data1 )
v43 = (*v42)[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
if( !v43 )
break;
}
++v41;
v40 += 5;
if( v41 >= 4 )
goto LABEL_105;
}
v19 = &off_140009A30 + 5 * v41;
v50 = (UINT64)v19;
LABEL_105:
if( !v19 )
{
v10 = -1073741802;
goto LABEL_24;
}
v10 = DrvDbFindDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
if( v10 >= 0 )
{
v11 = DatabaseNode;
if( (DatabaseNode[14] & 0x10) == 0 )
goto LABEL_50;
LABEL_15:
if( (_DWORD)PropertyType != *((_DWORD *)v19 + 2) && (_DWORD)PropertyType )
{
LABEL_111:
v10 = -1073741811;
goto LABEL_24;
}
if( (v22 = (_DRVDB_PROPERTY_REG_VALUE_MAP *)ObjectBaseKey) != 0i64 && (!v11 || (v11[14] & 0x10) == 0)
|| (!v11 || (v11[14] & 0x10) == 0 ? (v23 = DrvDbOpenDriverDatabaseRegKey(
pDrvDbCtx,
DatabaseNodeId,
2ui64,
0,
&Handle,
0i64)) : (v23 = DrvDbOpenObjectRegKey(
(_DRVDB_CONTEXT *)pDrvDbCtx,
pDrvDbCtx[4],
DRVDB_BASE_KEY_TYPE_NODES,
DatabaseNodeId,
2,
0,
&Handle,
0i64)),
v10 = v23,
v23 >= 0) )
{
if( Handle )
v22 = (_DRVDB_PROPERTY_REG_VALUE_MAP *)Handle;
v10 = DrvDbSetRegValueMappedProperty(
(VOID *)v13,
v22,
v50,
(UINT8 *)(unsigned int)PropertyType,
(UINT64)PropertyBuffer);
if( v10 >= 0 && v11 && (v11[14] & 0x10) != 0 && PropertyKey->pid == 14 )
{
v44 = *(_QWORD *)&PropertyKey->fmtid.Data1 - *(_QWORD *)&DEVPKEY_DriverDatabase_RegistryPath.fmtid.Data1;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == *(_QWORD *)&DEVPKEY_DriverDatabase_RegistryPath.fmtid.Data1 )
v44 = *(_QWORD *)PropertyKey->fmtid.Data4 - *(_QWORD *)DEVPKEY_DriverDatabase_RegistryPath.fmtid.Data4;
if( !v44 && (_DWORD)PropertyType )
{
if( (unsigned int)PropertySize < 2
|| !PropertyBuffer
|| *(_WORD *)&PropertyBuffer[2 * ((unsigned __int64)(unsigned int)PropertySize >> 1) - 2] )
{
goto LABEL_111;
}
if( !RtlCreateUnicodeString((INT64)&DestinationString, (INT8 *)PropertyBuffer) )
{
v10 = -1073741670;
goto LABEL_24;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v47 = DatabaseNode;
ExAcquireResourceExclusiveLite(*((_QWORD *)DatabaseNode + 18), 1, v45);
RtlFreeAnsiString((_UNICODE_STRING *)(v47 + 10));
v48 = DestinationString;
v47[8] = 0;
*(_UNICODE_STRING *)(v47 + 10) = v48;
v36 = (_ERESOURCE *)*((_QWORD *)v47 + 18);
goto LABEL_129;
}
}
}
}
goto LABEL_24;
}
}
v10 = DrvDbFindDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
if( v10 < 0 )
goto LABEL_24;
v31 = PropertyKey->pid;
switch( v31 )
{
case 5u:
v32 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Loaded;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Loaded )
v32 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( !v32 )
{
if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
goto LABEL_111;
if( (DatabaseNode[14] & 1) != 0 )
goto LABEL_50;
v33 = (_ETHREAD *)KeGetCurrentThread();
--v33->Tcb.KernelApcDisable;
v34 = DatabaseNode;
ExAcquireResourceExclusiveLite(*((_QWORD *)DatabaseNode + 18), 1, v30);
if( *PropertyBuffer == 0xFF )
v35 = DrvDbLoadDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, v34);
else
v35 = DrvDbUnloadDatabaseNode((_DRVDB_CONTEXT *)pDrvDbCtx, v34);
v36 = (_ERESOURCE *)*((_QWORD *)v34 + 18);
v10 = v35;
LABEL_129:
ExReleaseResourceLite(v36);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
goto LABEL_24;
}
goto LABEL_24;
case 6u:
v37 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Selected;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Selected )
v37 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( !v37 )
{
if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
goto LABEL_111;
if( *PropertyBuffer == 0xFF )
{
pDrvDbCtx[5] = (_UNICODE_STRING *)DatabaseNode;
}
else if( DatabaseNode == (_DRVDB_NODE *)pDrvDbCtx[5] || !DatabaseNode )
{
pDrvDbCtx[5] = 0i64;
}
}
goto LABEL_24;
case 7u:
v38 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Disabled;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Disabled )
v38 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( !v38 )
{
if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
goto LABEL_111;
if( *PropertyBuffer == 0xFF )
DatabaseNode[14] |= 4u;
else
DatabaseNode[14] &= ~4u;
}
goto LABEL_24;
}
if( v31 != 11 )
goto LABEL_24;
v39 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_AccessMask;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_AccessMask )
v39 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v39 )
goto LABEL_24;
if( (_DWORD)PropertyType != 7 || (_DWORD)PropertySize != 4 || !PropertyBuffer )
goto LABEL_111;
if( DatabaseNode != (_DRVDB_NODE *)pDrvDbCtx[4] )
goto LABEL_50;
v27 = *(_DWORD *)PropertyBuffer;
goto LABEL_44;
}
if( pid != 6 )
{
if( pid == 11 )
{
v26 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_AccessMask;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_AccessMask )
v26 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( !v26 )
{
if( (_DWORD)PropertyType != 7 || (_DWORD)PropertySize != 4 || !PropertyBuffer )
goto LABEL_111;
v27 = *(_DWORD *)PropertyBuffer;
LABEL_44:
v28 = v27 & 0xD0000000;
*((_DWORD *)pDrvDbCtx + 3) = v28;
if( v28 == 0x10000000 )
*((_DWORD *)pDrvDbCtx + 3) = -805306368;
goto LABEL_24;
}
}
LABEL_46:
v10 = -1073741637;
goto LABEL_24;
}
v25 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Selected;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Selected )
v25 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v25 )
goto LABEL_46;
if( (_DWORD)PropertyType != 17 || (_DWORD)PropertySize != 1 || !PropertyBuffer )
goto LABEL_111;
if( *PropertyBuffer == 0xFF )
pDrvDbCtx[5] = 0i64;
LABEL_24:
if( Handle )
ZwClose((_HANDLE)Handle);
return v10;
}Referenced by:
DrvDbCreateDatabaseNode
DrvDbDispatchDriverDatabase
DrvDbInitializeDatabaseNodeVersion