FsRtlReleaseFileForModWrite
VOID __stdcall FsRtlReleaseFileForModWrite(PFILE_OBJECT FileObject, _ERESOURCE *ResourceToRelease){
int v3;
_FS_FILTER_CTRL *v4;
char v5;
_DEVICE_OBJECT *v6;
_DEVICE_OBJECT *v7;
_DEVICE_OBJECT *v8;
_DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag;
_DRIVER_OBJECT *DriverObject;
_FAST_IO_DISPATCH *FastIoDispatch;
_FS_FILTER_CALLBACKS *FsFilterCallbacks;
_ERESOURCE *v13;
NTSTATUS v14;
int v15;
int(__fastcall *ReleaseForModWrite)(_FILE_OBJECT *, _ERESOURCE *, _DEVICE_OBJECT *);
_DRIVER_OBJECT *v17;
char v18;
UINT8 BaseFsFailedOp[4];
PERESOURCE Resource;
_DEVICE_OBJECT *DeviceObject;
_FS_FILTER_CTRL FsFilterCtrl[144];
Resource = ResourceToRelease;
memset(FsFilterCtrl, 0i64, 0x238u);
v3 = 0;
v4 = FsFilterCtrl;
*(_DWORD *)BaseFsFailedOp = 0;
v18 = 0;
v5 = 0;
LODWORD(v6) = IoGetRelatedDeviceObject((INT64)FileObject);
DeviceObject = v6;
LODWORD(v7) = IoGetBaseFileSystemDeviceObject((INT64)FileObject);
DeviceAttachmentBaseRefWithTag = v7;
DriverObject = v7->DriverObject;
FastIoDispatch = DriverObject->FastIoDispatch;
FsFilterCallbacks = DriverObject->DriverExtension->FsFilterCallbacks;
if( FsFilterCallbacks
&& (FsFilterCallbacks->SizeOfFsFilterCallbacks >= 0x60 && FsFilterCallbacks->PreReleaseForModifiedPageWriter
|| FsFilterCallbacks->SizeOfFsFilterCallbacks >= 0x68 && FsFilterCallbacks->PostReleaseForModifiedPageWriter) )
{
v5 = 1;
}
if( DeviceObject == DeviceAttachmentBaseRefWithTag && !v5 )
{
v13 = Resource;
v4 = 0i64;
goto LABEL_11;
}
FsFilterCtrlInit(FsFilterCtrl, 0xFCu, DeviceObject, v8, FileObject, 0);
v13 = Resource;
*(_QWORD *)&FsFilterCtrl[6] = Resource;
v14 = FsFilterPerformCallbacks(FsFilterCtrl, 0, 1u, BaseFsFailedOp);
v15 = 0;
v3 = v14;
if( v14 >= 0 )
{
if( v14 )
{
if( v14 != 294 )
v15 = v14;
v3 = v15;
LABEL_23:
if( v3 >= 0 )
goto LABEL_24;
goto LABEL_36;
}
FileObject = *(PFILE_OBJECT *)&FsFilterCtrl[4];
if( (FsFilterCtrl[16] & 4) != 0 )
{
DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(
*(_DEVICE_OBJECT **)&FsFilterCtrl[2],
0x746C6644ui64);
v18 = 1;
v17 = DeviceAttachmentBaseRefWithTag->DriverObject;
FastIoDispatch = v17->FastIoDispatch;
FsFilterCallbacks = v17->DriverExtension->FsFilterCallbacks;
}
LABEL_11:
if( !FsFilterCallbacks
|| (FsFilterCallbacks->SizeOfFsFilterCallbacks < 0x60 || !FsFilterCallbacks->PreReleaseForModifiedPageWriter)
&& (FsFilterCallbacks->SizeOfFsFilterCallbacks < 0x68 || !FsFilterCallbacks->PostReleaseForModifiedPageWriter) )
{
if( FastIoDispatch
&& FastIoDispatch->SizeOfFastIoDispatch >= 0xD0
&& (ReleaseForModWrite = FastIoDispatch->ReleaseForModWrite) != 0i64 )
{
v3 = ReleaseForModWrite(FileObject, v13, DeviceAttachmentBaseRefWithTag);
}
else
{
v3 = -1073741808;
}
*(_DWORD *)BaseFsFailedOp |= 1u;
}
if( v18 )
ObfDereferenceObjectWithTag(DeviceAttachmentBaseRefWithTag, 0x746C6644ui64);
goto LABEL_23;
}
LABEL_36:
if( (BaseFsFailedOp[0] & 1) != 0 )
{
ExReleaseResourceLite(v13);
v3 = 0;
}
LABEL_24:
if( v4 )
{
if( *((_WORD *)v4 + 37) )
FsFilterPerformCompletionCallbacks(FsFilterCtrl, (unsigned int)v3);
if( (FsFilterCtrl[16] & 1) != 0 )
FsFilterFreeCompletionStack(FsFilterCtrl);
}
}Referenced by:
MiGatherMappedPages
MiWriteComplete