IopDeleteFile

VOID __stdcall IopDeleteFile(VOID *Object){
  const WCHAR *v1; 
  INT64 v3; 
  _DEVICE_OBJECT *v4; 
  int v5; 
  _DEVICE_OBJECT *v6; 
  _DEVICE_OBJECT *v7; 
  _IRP *IrpMustSucceed; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  __int64 v10; 
  _DEVICE_OBJECT *v11; 
  char v12; 
  PVOID *v13; 
  __int128 v14; 
  __int128 Objecta; 
  __int64 v16; 

  v3 = *((_QWORD *)Object + 1);
  v4 = 0i64;
  Objecta = 0i64;
  v16 = 0i64;
  v14 = 0i64;
  if( v3 )
  {
    v5 = *((_DWORD *)Object + 20);
    if( (v5 & 0x800) != 0 )
    {
      LODWORD(v6) = IoGetAttachedDevice(v3);
    }
    else
    {
      LODWORD(v6) = IoGetRelatedDeviceObject((INT64)Object);
      v5 = *((_DWORD *)Object + 20);
    }
    v7 = v6;
    if( (v5 & 0x240000) == 0 )
      IopCloseFile(0i64, Object, 1ui64, (UINT8 *)1);
    KeInitializeEvent((INT64)&Objecta, 1, 0);
    if( (*((_DWORD *)Object + 20) & 0x4000000) == 0 )
      KeResetEvent((_KEVENT *)((char *)Object + 152));
    IrpMustSucceed = IopAllocateIrpMustSucceed(v7, v7->StackSize);
    CurrentStackLocation = IrpMustSucceed->Tail.CurrentStackLocation;
    CurrentStackLocation[-1].MajorFunction = 2;
    CurrentStackLocation[-1].FileObject = (_FILE_OBJECT *)Object;
    IrpMustSucceed->UserIosb = (_IO_STATUS_BLOCK *)&v14;
    IrpMustSucceed->UserEvent = (_KEVENT *)&Objecta;
    IrpMustSucceed->Tail.OriginalFileObject = (_FILE_OBJECT *)Object;
    IrpMustSucceed->Tail.Thread = (_ETHREAD *)KeGetCurrentThread();
    IrpMustSucceed->AssociatedIrp.MasterIrp = 0i64;
    IrpMustSucceed->Flags = 1028;
    IopQueueThreadIrp(IrpMustSucceed);
    v10 = *((_QWORD *)Object + 2);
    if( v10 )
    {
      if( (*((_DWORD *)Object + 20) & 0x800) == 0 )
      {
        IopDecrementVpbRefCount(*((_VPB **)Object + 2), 1u);
        v4 = *(_DEVICE_OBJECT **)(v10 + 8);
        if( v4 )
          IopIncrementDeviceObjectRefCount(*(_DEVICE_OBJECT **)(v10 + 8), 1u);
      }
    }
    v11 = (_DEVICE_OBJECT *)*((_QWORD *)Object + 1);
    if( (v11->Flags & 0x400) != 0 )
    {
      IopDecrementDeviceObjectRefCount(v11, 1u);
      v12 = 1;
    }
    else
    {
      v12 = 0;
    }
    if( IofCallDriver((UINT64)v7, (UINT64)IrpMustSucceed) == 259 )
      KeWaitForSingleObject((UINT64)&Objecta, 0, 0, 0, 0i64);
    IrpMustSucceed->Tail.Thread = (_ETHREAD *)KeGetCurrentThread();
    IopDequeueIrpFromThread(IrpMustSucceed);
    IoFreeIrp(IrpMustSucceed);
    if( *((_WORD *)Object + 44) )
      ExFreePoolWithTag(*((PVOID *)Object + 12), 0);
    v13 = (PVOID *)*((_QWORD *)Object + 22);
    if( v13 )
    {
      if( v13[2] )
        KeBugCheckEx(0x18u, Object, v13, (PVOID)0x80, v13[2]);
      HalPutDmaAdapter((PADAPTER_OBJECT)*v13);
      ExFreePoolWithTag(*((PVOID *)Object + 22), 0);
    }
    if( *((_QWORD *)Object + 26) )
      FsRtlPTeardownPerFileObjectContexts((_FILE_OBJECT *)Object);
    if( !v12 )
      IopDecrementDeviceObjectRef(*((_DEVICE_OBJECT **)Object + 1), 0, (unsigned __int8)~*((char *)Object - 21) >> 7);
    if( v4 && v10 )
      IopDecrementDeviceObjectRef(v4, 0, (unsigned __int8)~*((char *)Object - 21) >> 7);
  }
  if( *((_QWORD *)Object + 26) )
    IopDeleteFileObjectExtension((_UNICODE_STRING *)Object, v1);
}

Referenced by:

No references.