VfThunkApplyDriverAddedThunks
VOID __fastcall VfThunkApplyDriverAddedThunks(_KLDR_DATA_TABLE_ENTRY *DataTableEntry, UINT64 Length, UINT64 Alignment){
void *v3;
__int64 v4;
UINT64 *v5;
UINT64 v6;
__int64 *AllSpecialTables;
__int64 v8;
__int64 v9;
int v10;
UINT64 v11;
v3 = (void *)*((_QWORD *)DataTableEntry + 6);
LODWORD(v11) = 0;
LODWORD(v4) = RtlImageDirectoryEntryToData(v3, 1u, 0xCu, &v11);
v5 = (UINT64 *)v4;
if( v4 )
{
v6 = (unsigned int)v11 >> 3;
AllSpecialTables = ViThunkFindAllSpecialTables(v4, v6);
if( (_DWORD)v6 )
{
do
{
if( !AllSpecialTables )
goto LABEL_8;
v8 = *AllSpecialTables;
LODWORD(v9) = 0;
if( !*AllSpecialTables )
goto LABEL_8;
do
{
v10 = ViThunkReplaceImportEntry((LIST_ENTRY *)(v8 + 24), v5);
if( v10 == 1 )
break;
v9 = (unsigned int)(v9 + 1);
v8 = AllSpecialTables[v9];
}
while( v8 );
if( !v10 )
LABEL_8:
ViThunkReplaceImportEntry(&ViVerifierDriverAddedThunkListHead, v5);
++v5;
--v6;
}
while( v6 );
}
if( AllSpecialTables )
ExFreePoolWithTag(AllSpecialTables, 0);
}
}Referenced by:
ViDriverReApplyVerifierForAll