DrvDbGetDriverDatabaseMappedProperty
NTSTATUS __stdcall DrvDbGetDriverDatabaseMappedProperty(
_DRVDB_CONTEXT *pDrvDbCtx,
WCHAR *DatabaseNodeId,
VOID *ObjectBaseKey,
_DEVPROPKEY *PropertyKey,
UINT64 *PropertyType,
UINT8 *PropertyBuffer,
UINT64 BufferSize,
UINT64 *PropertySize){
int RegValueMappedProperty;
_DRVDB_NODE *v12;
int v13;
__int64 v14;
unsigned int pid;
unsigned int v16;
char *v17;
_QWORD *v18;
const _DRVDB_PROPERTY_REG_VALUE_MAP *v19;
_DEVPROPKEY **v20;
unsigned int v21;
_DEVPROPKEY *v22;
_UNICODE_STRING **v23;
NTSTATUS v24;
VOID *v25;
__int64 v27;
__int64 v28;
size_t v29;
NTSTATUS v30;
unsigned int v31;
__int64 v32;
UINT8 *v33;
bool v34;
__int64 v35;
__int64 v36;
char v37;
__int64 v38;
__int64 v39;
__int64 v40;
__int64(**v41)[3];
unsigned int v42;
__int64(*v43)[3];
__int64 v44;
UINT64 *Disposition;
_DRVDB_NODE *DatabaseNode;
VOID *PropertyRegValue;
PropertyRegValue = 0i64;
DatabaseNode = 0i64;
*(_DWORD *)PropertyType = 0;
*(_DWORD *)PropertySize = 0;
RegValueMappedProperty = 0;
v12 = 0i64;
v13 = wcsicmp(DatabaseNodeId, L"*");
v14 = 0i64;
if( !v13 )
{
RegValueMappedProperty = -1073741637;
goto LABEL_23;
}
pid = PropertyKey->pid;
if( pid == 2 )
{
v27 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_NODE;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_NODE )
v27 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x5008C7D4C8250077i64;
if( !v27 )
{
*(_DWORD *)PropertyType = 18;
v28 = -1i64;
do
++v28;
while( DatabaseNodeId[v28] );
v29 = 2 * v28 + 2;
*(_DWORD *)PropertySize = v29;
if( PropertyBuffer && (unsigned int)BufferSize >= v29 )
{
memmove(PropertyBuffer, DatabaseNodeId, v29);
goto LABEL_23;
}
goto LABEL_41;
}
}
v16 = 0;
v17 = (char *)&stru_140C00F40 + 7472;
do
{
v18 = *(_QWORD **)v17;
if( *(_DWORD *)(*(_QWORD *)v17 + 16i64) == pid )
{
v14 = *v18 - *(_QWORD *)&PropertyKey->fmtid.Data1;
if( *v18 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
v14 = v18[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
if( !v14 )
{
v30 = DrvDbFindDatabaseNode(pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
RegValueMappedProperty = v30;
if( v30 < 0 )
goto LABEL_23;
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 )
goto LABEL_23;
v33 = PropertyBuffer;
*(_DWORD *)PropertyType = 17;
*(_DWORD *)PropertySize = 1;
if( PropertyBuffer && (_DWORD)BufferSize )
{
v34 = *((_QWORD *)DatabaseNode + 11) != 0i64;
LABEL_65:
*v33 = -v34;
goto LABEL_23;
}
goto LABEL_41;
case 6u:
v35 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Selected;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Selected )
v35 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v35 )
goto LABEL_23;
*(_DWORD *)PropertyType = 17;
*(_DWORD *)PropertySize = 1;
if( PropertyBuffer && (_DWORD)BufferSize )
{
*PropertyBuffer = (*((_QWORD *)pDrvDbCtx + 5) != (_QWORD)DatabaseNode) - 1;
goto LABEL_23;
}
goto LABEL_41;
case 7u:
v36 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Disabled;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Disabled )
v36 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v36 )
goto LABEL_23;
v33 = PropertyBuffer;
*(_DWORD *)PropertyType = 17;
*(_DWORD *)PropertySize = 1;
if( !PropertyBuffer || !(_DWORD)BufferSize )
goto LABEL_41;
v37 = DatabaseNode[14] & 4;
break;
case 0xBu:
v38 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_AccessMask;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_AccessMask )
v38 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v38 )
goto LABEL_23;
*(_DWORD *)PropertyType = 7;
*(_DWORD *)PropertySize = 4;
if( PropertyBuffer && (unsigned int)BufferSize >= 4 )
{
*(_DWORD *)PropertyBuffer = pDrvDbCtx[3];
goto LABEL_23;
}
goto LABEL_41;
case 0xFu:
v39 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_LoadStatus;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_LoadStatus )
v39 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v39 )
goto LABEL_23;
*(_DWORD *)PropertyType = 24;
*(_DWORD *)PropertySize = 4;
if( PropertyBuffer && (unsigned int)BufferSize >= 4 )
{
*(_DWORD *)PropertyBuffer = DatabaseNode[38];
goto LABEL_23;
}
goto LABEL_41;
case 0x17u:
v40 = *(_QWORD *)&PropertyKey->fmtid.Data1 - DEVPKEY_DriverDatabase_Extended;
if( *(_QWORD *)&PropertyKey->fmtid.Data1 == DEVPKEY_DriverDatabase_Extended )
v40 = *(_QWORD *)PropertyKey->fmtid.Data4 + 0x4524B8338B5D1E6Ci64;
if( v40 )
goto LABEL_23;
v33 = PropertyBuffer;
*(_DWORD *)PropertyType = 17;
*(_DWORD *)PropertySize = 1;
if( !PropertyBuffer || !(_DWORD)BufferSize )
{
LABEL_41:
RegValueMappedProperty = -1073741789;
goto LABEL_23;
}
v37 = DatabaseNode[14] & 0x10;
break;
default:
goto LABEL_23;
}
v34 = v37 != 0;
goto LABEL_65;
}
}
++v16;
v17 += 8;
}
while( v16 < 7 );
v19 = 0i64;
v20 = &off_140001FC0;
v21 = 0;
while( 1 )
{
v22 = *v20;
if( (*v20)->pid == pid )
{
v14 = *(_QWORD *)&v22->fmtid.Data1 - *(_QWORD *)&PropertyKey->fmtid.Data1;
if( *(_QWORD *)&v22->fmtid.Data1 == *(_QWORD *)&PropertyKey->fmtid.Data1 )
v14 = *(_QWORD *)v22->fmtid.Data4 - *(_QWORD *)PropertyKey->fmtid.Data4;
if( !v14 )
break;
}
++v21;
v20 += 5;
if( v21 >= 0xC )
goto LABEL_14;
}
v14 = 5i64 * v21;
v19 = (const _DRVDB_PROPERTY_REG_VALUE_MAP *)&(&off_140001FC0)[5 * v21];
LABEL_14:
if( v19 )
{
v23 = (_UNICODE_STRING **)pDrvDbCtx;
LABEL_16:
if( ObjectBaseKey && (!v12 || (v12[14] & 0x10) == 0)
|| (!v12 || (v12[14] & 0x10) == 0 ? (v24 = DrvDbOpenDriverDatabaseRegKey(
v23,
DatabaseNodeId,
1ui64,
0,
&PropertyRegValue,
0i64)) : (v24 = DrvDbOpenObjectRegKey(
(_DRVDB_CONTEXT *)v23,
v23[4],
DRVDB_BASE_KEY_TYPE_NODES,
DatabaseNodeId,
1,
0,
&PropertyRegValue,
0i64)),
RegValueMappedProperty = v24,
v24 >= 0) )
{
v25 = ObjectBaseKey;
if( PropertyRegValue )
v25 = PropertyRegValue;
LODWORD(Disposition) = BufferSize;
RegValueMappedProperty = DrvDbGetRegValueMappedProperty(
(VOID *)v14,
v25,
v19,
(UINT8 *)PropertyType,
PropertyBuffer,
(UINT64)Disposition,
PropertySize);
}
}
else
{
v19 = 0i64;
v41 = &off_140009A30;
v42 = 0;
while( 1 )
{
v43 = *v41;
if( LODWORD((**v41)[2]) == pid )
{
v44 = (*v43)[0] - *(_QWORD *)&PropertyKey->fmtid.Data1;
if( (*v43)[0] == *(_QWORD *)&PropertyKey->fmtid.Data1 )
v44 = (*v43)[1] - *(_QWORD *)PropertyKey->fmtid.Data4;
if( !v44 )
break;
}
++v42;
v41 += 5;
if( v42 >= 4 )
goto LABEL_94;
}
v19 = (const _DRVDB_PROPERTY_REG_VALUE_MAP *)(&off_140009A30 + 5 * v42);
LABEL_94:
if( v19 )
{
v23 = (_UNICODE_STRING **)pDrvDbCtx;
RegValueMappedProperty = DrvDbFindDatabaseNode(pDrvDbCtx, DatabaseNodeId, &DatabaseNode);
if( RegValueMappedProperty >= 0 )
{
v12 = DatabaseNode;
goto LABEL_16;
}
}
else
{
RegValueMappedProperty = -1073741802;
}
}
LABEL_23:
if( PropertyRegValue )
ZwClose((_HANDLE)PropertyRegValue);
return RegValueMappedProperty;
}Referenced by:
DrvDbDispatchDriverDatabase
DrvDbLoadDatabaseNode