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.