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.