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