VfDriverUnloadImage
void __fastcall VfDriverUnloadImage(_KLDR_DATA_TABLE_ENTRY *DataTableEntry){
unsigned int v2;
VOID *v3;
PVOID *v4;
PVOID *v5;
PVOID *v6;
PVOID *v7;
if( (unsigned int)VfIsVerifierEnabled() )
{
v2 = *((_DWORD *)DataTableEntry + 16);
v3 = (VOID *)*((_QWORD *)DataTableEntry + 6);
VfDeadlockDeleteMemoryRange(v3, v2);
VfRemLockDeleteMemoryRange(v3, v2);
}
if( ViActiveVerifierThunks )
{
ViThunkRemoveImportEntry(&ViVerifierDriverAddedThunkListHead, (__int64)DataTableEntry);
v4 = (PVOID *)ViVerifierDriverAddedSpecialThunkListHead;
while( v4 != &ViVerifierDriverAddedSpecialThunkListHead )
{
ViThunkRemoveImportEntry((_QWORD **)v4 + 3, (__int64)DataTableEntry);
v5 = (PVOID *)*v4;
if( v4[3] == v4 + 3 )
{
if( v5[1] != v4 || (v6 = (PVOID *)v4[1], *v6 != v4) )
__fastfail(3u);
*v6 = v5;
v7 = v4;
v5[1] = v6;
v4 = (PVOID *)*v4;
ExFreePoolWithTag(v7, 0);
--ViVerifierSpecialThunkTables;
}
else
{
v4 = (PVOID *)*v4;
}
}
}
VfTargetDriversRemove((__int64)DataTableEntry);
if( (*((_DWORD *)DataTableEntry + 26) & 0x2000000) != 0 )
VfSuspectDriversUnloadCallback(DataTableEntry);
}Referenced by:
MiUnloadSystemImage