MiCompactServiceTable
_VERIFIER_TRIAGE_RULE *__fastcall MiCompactServiceTable(
_VERIFIER_TRIAGE_RULE *Rules,
UINT64 RulesSize,
UINT64 CrashCode){
VOID *ExportedRoutineByName;
_DWORD *v5;
VOID *v6;
VOID *v7;
_DWORD *v8;
VOID *v9;
unsigned int v10;
unsigned int NumberOfBytes;
ExportedRoutineByName = RtlFindExportedRoutineByName(*(VOID **)&Rules[6], (INT8 *)"W32pServiceTable");
if( !ExportedRoutineByName )
return(_VERIFIER_TRIAGE_RULE *)3221225594i64;
v5 = RtlFindExportedRoutineByName(*(VOID **)&Rules[6], (INT8 *)"W32pServiceLimit");
if( !v5 )
return(_VERIFIER_TRIAGE_RULE *)3221225594i64;
v6 = RtlFindExportedRoutineByName(*(VOID **)&Rules[6], (INT8 *)"W32pArgumentTable");
if( !v6 )
return(_VERIFIER_TRIAGE_RULE *)3221225594i64;
v7 = RtlFindExportedRoutineByName(*(VOID **)&Rules[6], (INT8 *)"W32pServiceTableFilter");
if( !v7 )
return(_VERIFIER_TRIAGE_RULE *)3221225594i64;
v8 = RtlFindExportedRoutineByName(*(VOID **)&Rules[6], (INT8 *)"W32pServiceLimitFilter");
if( !v8 )
return(_VERIFIER_TRIAGE_RULE *)3221225594i64;
v9 = RtlFindExportedRoutineByName(*(VOID **)&Rules[6], (INT8 *)"W32pArgumentTableFilter");
if( !v9 )
return(_VERIFIER_TRIAGE_RULE *)3221225594i64;
v10 = 4 * *v5;
MiSetImageProtection((_KLDR_DATA_TABLE_ENTRY *)Rules, ExportedRoutineByName, v10, 4ui64);
NumberOfBytes = 4 * *v8;
MiSetImageProtection((_KLDR_DATA_TABLE_ENTRY *)Rules, v7, NumberOfBytes, 4ui64);
KeCompactServiceTable(v7, v9, (unsigned int)*v8, 3ui64, *(_QWORD *)&Rules[6]);
KeCompactServiceTable(ExportedRoutineByName, v6, (unsigned int)*v5, 1ui64, *(_QWORD *)&Rules[6]);
if( *(_QWORD *)&MiSectionControlArea(*(_SECTION **)&Rules[14])[1].gap8[8] )
{
MiSetImageProtection((_KLDR_DATA_TABLE_ENTRY *)Rules, ExportedRoutineByName, v10, 0x100ui64);
MiSetImageProtection((_KLDR_DATA_TABLE_ENTRY *)Rules, v7, NumberOfBytes, 0x100ui64);
}
return 0i64;
}Referenced by:
MmLoadSystemImageEx