IoCancelFileOpen

VOID __stdcall IoCancelFileOpen(_DEVICE_OBJECT *DeviceObject, _FILE_OBJECT *FileObject){
  bool v2; 
  UINT64 v5; 
  UINT8 v6; 
  UINT8 v7; 
  _IRP *IrpMustSucceed; 
  _ETHREAD *CurrentThread; 
  __int64 v10; 
  UINT64 v11; 
  UINT8 v12; 
  UINT8 v13; 
  IRP *v14; 
  struct _KEVENT Event; 
  v2 = (FileObject->Flags & 0x40000) == 0;
  memset(&Event, 0, sizeof(Event));
  if( !v2 )
    KeBugCheckEx(0xE8u, (ULONG_PTR)FileObject, (ULONG_PTR)DeviceObject, 0i64, 0i64);
  KeInitializeEvent(&Event, SynchronizationEvent, 0);
  if( (FileObject->Flags & 0x4000000) == 0 )
    KeResetEvent(&FileObject->Event, v5, v6, v7, v14);
  IrpMustSucceed = IopAllocateIrpMustSucceed(DeviceObject, *((_BYTE *)DeviceObject + 76));
  *((_QWORD *)IrpMustSucceed + 24) = FileObject;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *((_QWORD *)IrpMustSucceed + 11) = 0i64;
  *((_QWORD *)IrpMustSucceed + 19) = CurrentThread;
  *((_QWORD *)IrpMustSucceed + 9) = (char *)IrpMustSucceed + 48;
  v10 = *((_QWORD *)IrpMustSucceed + 23);
  *((_BYTE *)IrpMustSucceed + 64) = 0;
  *((_QWORD *)IrpMustSucceed + 10) = &Event;
  *((_DWORD *)IrpMustSucceed + 4) = 1028;
  *(_BYTE *)(v10 - 72) = 18;
  *(_QWORD *)(v10 - 24) = FileObject;
  IopQueueThreadIrp(IrpMustSucceed);
  if( PoCallDriver(DeviceObject, IrpMustSucceed) == 259 )
    KeWaitForSingleObject(&Event, UserRequest, 0, 0, 0i64);
  IopDequeueIrpFromThread(IrpMustSucceed);
  IoFreeIrp(IrpMustSucceed);
  KeResetEvent(&FileObject->Event, v11, v12, v13, v14);
  FileObject->Flags |= 0x200000u;
  if( FileObject->FileObjectExtension )
    IopCloseFileObjectExtension(FileObject);
}

Referenced by:

IopParseDevice