ExUnregisterExtension
void __fastcall ExUnregisterExtension(__int64 a1){
_ETHREAD *CurrentThread;
UINT64 *v3;
_BYTE *v4;
_BYTE *v5;
void(__fastcall *v6)(__int64, _QWORD);
void(__fastcall *v7)(__int64, _QWORD);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v3 = (UINT64 *)(a1 + 72);
LODWORD(v4) = KeAbPreAcquire((PVOID)(a1 + 72), 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))(a1 + 48);
if( v6 )
v6(2i64, *(_QWORD *)(a1 + 56));
ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)(a1 + 64));
v7 = *(void(__fastcall **)(__int64, _QWORD))(a1 + 48);
*(_QWORD *)(a1 + 80) = 0i64;
if( v7 )
v7(3i64, *(_QWORD *)(a1 + 56));
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v3, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)v3);
KeAbPostRelease(v3);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
ExpDereferenceHost((volatile INT32 *)a1);
}Referenced by:
No references.