KsepDbGetDriverShimsInternal
NTSTATUS __stdcall KsepDbGetDriverShimsInternal(VOID *hSDB, INT64 a2, INT64 a3, VOID *a4, INT64 a5, INT64 a6, INT64 a7){
_KSE_SHIM_INFO *Paged;
_DWORD *v8;
const WCHAR *v10;
UINT64 v11;
unsigned int DatabaseMatch;
int SdbString;
_DB *v15;
unsigned int FirstTag;
__int64 v17;
unsigned int NextTag;
__int64 i;
unsigned int v20;
unsigned int v21;
__int64 v22;
unsigned int v23;
unsigned int v24;
unsigned int v25;
unsigned int v26;
_DB *ppdb[2];
_GUID result;
UINT64 ptiWhich;
Paged = 0i64;
v8 = (_DWORD *)a7;
v10 = *(const WCHAR **)(a3 + 8);
ppdb[0] = 0i64;
*(_QWORD *)a6 = 0i64;
v11 = (unsigned int)a5;
LODWORD(ptiWhich) = 0;
*v8 = 0;
DatabaseMatch = SdbGetDatabaseMatchEx(hSDB, 0i64, v10, a4, a4, v11, (tagSDBBMACHINEINFO *)a2);
if( !DatabaseMatch
|| !SdbTagRefToTagID(hSDB, DatabaseMatch, ppdb, &ptiWhich)
|| (v15 = ppdb[0], (FirstTag = SdbFindFirstTag(ppdb[0], (unsigned int)ptiWhich, 0x7026u)) == 0) )
{
SdbString = -1073741275;
LABEL_3:
KsepDbFreeDriverShims(Paged, (unsigned int)*v8);
return SdbString;
}
LODWORD(v17) = 0;
do
{
FirstTag = SdbFindNextTag(v15, (unsigned int)ptiWhich, FirstTag);
v17 = (unsigned int)(v17 + 1);
}
while( FirstTag );
*v8 = v17;
Paged = (_KSE_SHIM_INFO *)KsepPoolAllocatePaged(80 * v17);
if( !Paged )
{
SdbString = -1073741801;
goto LABEL_3;
}
NextTag = SdbFindFirstTag(v15, (unsigned int)ptiWhich, 0x7026u);
for( i = 0i64; ; i = (unsigned int)(i + 1) )
{
v26 = NextTag;
if( !NextTag )
break;
if( (unsigned int)i < *v8 )
{
v20 = SdbFindFirstTag(v15, NextTag, 0x9010u);
if( v20 )
{
*(_OWORD *)ppdb = 0i64;
*(_GUID *)&Paged[20 * i] = *SdbReadGUIDTag(&result, v15, v20, (_GUID *)ppdb);
}
v21 = SdbFindFirstTag(v15, v26, 0x6001u);
v22 = 20 * i;
if( v21 )
{
SdbString = KsepDbGetSdbString(v15, v21, (_UNICODE_STRING *)&Paged[v22 + 4]);
if( SdbString < 0 )
goto LABEL_3;
}
v23 = SdbFindFirstTag(v15, v26, 0x6003u);
if( v23 )
{
SdbString = KsepDbGetSdbString(v15, v23, (_UNICODE_STRING *)&Paged[v22 + 8]);
if( SdbString < 0 )
goto LABEL_3;
}
v24 = SdbFindFirstTag(v15, v26, 0x4017u);
if( v24 )
Paged[v22 + 16] = SdbReadDWORDTag(v15, v24, 0);
v25 = SdbFindFirstTag(v15, v26, 0x6008u);
if( v25 )
{
SdbString = KsepDbGetSdbString(v15, v25, (_UNICODE_STRING *)&Paged[v22 + 12]);
if( SdbString < 0 )
goto LABEL_3;
}
Paged[v22 + 17] = 1;
}
NextTag = SdbFindNextTag(v15, (unsigned int)ptiWhich, v26);
}
SdbString = 0;
*(_QWORD *)a6 = Paged;
return SdbString;
}Referenced by:
KsepDbGetDriverShims