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