EmClientRuleDeregisterNotification

VOID __stdcall EmClientRuleDeregisterNotification(VOID *NotificationHandle){
  __int64 i; 
  _QWORD *v3; 
  __int64 v4; 
  _QWORD *v5; 

  if( NotificationHandle )
  {
    ExAcquirePushLockExclusiveEx(&EmpDatabaseLock, 0i64);
    for( i = 0i64; (unsigned int)i < *((_DWORD *)NotificationHandle + 4); *(_QWORD *)(v4 + 8) = v5 )
    {
      _InterlockedAdd(*(volatile signed __int32 **)(*((_QWORD *)NotificationHandle + 1) + 40 * i), 0xFFFFFFFF);
      v3 = (_QWORD *)(*((_QWORD *)NotificationHandle + 1) + 8 * (5 * i + 3));
      v4 = *v3;
      if( *(_QWORD **)(*v3 + 8i64) != v3 || (v5 = (_QWORD *)v3[1], (_QWORD *)*v5 != v3) )
        __fastfail(3u);
      *v5 = v4;
      i = (unsigned int)(i + 1);
    }
    if( *(_QWORD *)NotificationHandle )
      HalPutDmaAdapter(*(PADAPTER_OBJECT *)NotificationHandle);
    ExFreePoolWithTag(*((PVOID *)NotificationHandle + 1), 0x6C634D45u);
    ExFreePoolWithTag(NotificationHandle, 0x6C634D45u);
    if( (_InterlockedExchangeAdd64(&EmpDatabaseLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&EmpDatabaseLock);
    KeAbPostRelease(&EmpDatabaseLock);
  }
}

Referenced by:

No references.