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.