ViFilterDeviceUsageNotificationCompletion

NTSTATUS __stdcall ViFilterDeviceUsageNotificationCompletion(_DEVICE_OBJECT *DeviceObject, _IRP *Irp, VOID *Context){
  char *DeviceExtension; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  unsigned __int64 v7; 
  int v8; 
  int v9; 
  __int64 v10; 

  if( Irp->PendingReturned )
    Irp->Tail.CurrentStackLocation->Control |= 1u;
  DeviceExtension = (char *)DeviceObject->DeviceExtension;
  if( Irp->IoStatus.Status >= 0 )
  {
    CurrentStackLocation = Irp->Tail.CurrentStackLocation;
    v7 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)DeviceExtension + 11);
    v8 = *((_DWORD *)DeviceExtension + 24);
    if( LOBYTE(CurrentStackLocation->Parameters.SecurityContext) )
    {
      *((_DWORD *)DeviceExtension + 24) = v8 + 1;
      if( !v8 )
        DeviceObject->Flags &= ~0x2000u;
    }
    else
    {
      v9 = v8 - 1;
      *((_DWORD *)DeviceExtension + 24) = v9;
      if( !v9 )
      {
        v10 = *((_QWORD *)DeviceExtension + 1);
        DeviceObject->Flags |= *(_DWORD *)(v10 + 48) & 0x2000;
      }
    }
    _InterlockedAnd64((volatile signed __int64 *)DeviceExtension + 11, 0i64);
    __writecr8(v7);
  }
  IoReleaseRemoveLockEx((PIO_REMOVE_LOCK)(DeviceExtension + 32), Irp, 0x20u);
  return 0;
}

Referenced by:

No references.