ExUnregisterExtension

VOID __stdcall ExUnregisterExtension(_EX_HOST *Host){
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v3; 
  _BYTE *v4; 
  _BYTE *v5; 
  void(__fastcall *v6)(__int64, _QWORD); 
  void(__fastcall *v7)(__int64, _QWORD); 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v3 = (_EX_PUSH_LOCK *)(Host + 18);
  v4 = KeAbPreAcquire(Host + 18, 0i64, 0i64);
  v5 = v4;
  if( _interlockedbittestandset64((volatile signed __int32 *)v3, 0i64) )
    ExfAcquirePushLockExclusiveEx(v3, v4, v3);
  if( v5 )
    v5[26] |= 1u;
  v6 = (void(__fastcall *)(__int64, _QWORD))*((_QWORD *)Host + 6);
  if( v6 )
    v6(2i64, *((_QWORD *)Host + 7));
  ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)Host + 8);
  v7 = (void(__fastcall *)(__int64, _QWORD))*((_QWORD *)Host + 6);
  *((_QWORD *)Host + 10) = 0i64;
  if( v7 )
    v7(3i64, *((_QWORD *)Host + 7));
  if( (_InterlockedExchangeAdd64(&v3->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v3);
  KeAbPostRelease(v3);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  ExpDereferenceHost(Host);
}

Referenced by:

No references.