reactos/drivers/filesystems/btrfs/fsctl.c

539 lines
17 KiB
C
Raw Normal View History

/* Copyright (c) Mark Harmstone 2016
*
* This file is part of WinBtrfs.
*
* WinBtrfs is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public Licence as published by
* the Free Software Foundation, either version 3 of the Licence, or
* (at your option) any later version.
*
* WinBtrfs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public Licence for more details.
*
* You should have received a copy of the GNU Lesser General Public Licence
* along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
#include "btrfs_drv.h"
#include "btrfsioctl.h"
#ifndef FSCTL_CSV_CONTROL
#define FSCTL_CSV_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 181, METHOD_BUFFERED, FILE_ANY_ACCESS)
#endif
static NTSTATUS get_file_ids(PFILE_OBJECT FileObject, void* data, ULONG length) {
btrfs_get_file_ids* bgfi;
fcb* fcb;
if (length < sizeof(btrfs_get_file_ids))
return STATUS_BUFFER_OVERFLOW;
if (!FileObject)
return STATUS_INVALID_PARAMETER;
fcb = FileObject->FsContext;
if (!fcb)
return STATUS_INVALID_PARAMETER;
bgfi = data;
bgfi->subvol = fcb->subvol->id;
bgfi->inode = fcb->inode;
bgfi->top = fcb->Vcb->root_fcb == fcb ? TRUE : FALSE;
return STATUS_SUCCESS;
}
NTSTATUS fsctl_request(PDEVICE_OBJECT DeviceObject, PIRP Irp, UINT32 type, BOOL user) {
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS Status;
switch (type) {
case FSCTL_REQUEST_OPLOCK_LEVEL_1:
WARN("STUB: FSCTL_REQUEST_OPLOCK_LEVEL_1\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_REQUEST_OPLOCK_LEVEL_2:
WARN("STUB: FSCTL_REQUEST_OPLOCK_LEVEL_2\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_REQUEST_BATCH_OPLOCK:
WARN("STUB: FSCTL_REQUEST_BATCH_OPLOCK\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_OPLOCK_BREAK_ACKNOWLEDGE:
WARN("STUB: FSCTL_OPLOCK_BREAK_ACKNOWLEDGE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_OPBATCH_ACK_CLOSE_PENDING:
WARN("STUB: FSCTL_OPBATCH_ACK_CLOSE_PENDING\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_OPLOCK_BREAK_NOTIFY:
WARN("STUB: FSCTL_OPLOCK_BREAK_NOTIFY\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_LOCK_VOLUME:
WARN("STUB: FSCTL_LOCK_VOLUME\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_UNLOCK_VOLUME:
WARN("STUB: FSCTL_UNLOCK_VOLUME\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_DISMOUNT_VOLUME:
WARN("STUB: FSCTL_DISMOUNT_VOLUME\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_IS_VOLUME_MOUNTED:
WARN("STUB: FSCTL_IS_VOLUME_MOUNTED\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_IS_PATHNAME_VALID:
WARN("STUB: FSCTL_IS_PATHNAME_VALID\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_MARK_VOLUME_DIRTY:
WARN("STUB: FSCTL_MARK_VOLUME_DIRTY\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_RETRIEVAL_POINTERS:
WARN("STUB: FSCTL_QUERY_RETRIEVAL_POINTERS\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_COMPRESSION:
WARN("STUB: FSCTL_GET_COMPRESSION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_COMPRESSION:
WARN("STUB: FSCTL_SET_COMPRESSION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_BOOTLOADER_ACCESSED:
WARN("STUB: FSCTL_SET_BOOTLOADER_ACCESSED\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_OPLOCK_BREAK_ACK_NO_2:
WARN("STUB: FSCTL_OPLOCK_BREAK_ACK_NO_2\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_INVALIDATE_VOLUMES:
WARN("STUB: FSCTL_INVALIDATE_VOLUMES\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_FAT_BPB:
WARN("STUB: FSCTL_QUERY_FAT_BPB\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_REQUEST_FILTER_OPLOCK:
WARN("STUB: FSCTL_REQUEST_FILTER_OPLOCK\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_FILESYSTEM_GET_STATISTICS:
WARN("STUB: FSCTL_FILESYSTEM_GET_STATISTICS\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_NTFS_VOLUME_DATA:
WARN("STUB: FSCTL_GET_NTFS_VOLUME_DATA\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_NTFS_FILE_RECORD:
WARN("STUB: FSCTL_GET_NTFS_FILE_RECORD\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_VOLUME_BITMAP:
WARN("STUB: FSCTL_GET_VOLUME_BITMAP\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_RETRIEVAL_POINTERS:
WARN("STUB: FSCTL_GET_RETRIEVAL_POINTERS\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_MOVE_FILE:
WARN("STUB: FSCTL_MOVE_FILE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_IS_VOLUME_DIRTY:
WARN("STUB: FSCTL_IS_VOLUME_DIRTY\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_ALLOW_EXTENDED_DASD_IO:
WARN("STUB: FSCTL_ALLOW_EXTENDED_DASD_IO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_FIND_FILES_BY_SID:
WARN("STUB: FSCTL_FIND_FILES_BY_SID\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_OBJECT_ID:
WARN("STUB: FSCTL_SET_OBJECT_ID\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_OBJECT_ID:
WARN("STUB: FSCTL_GET_OBJECT_ID\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_DELETE_OBJECT_ID:
WARN("STUB: FSCTL_DELETE_OBJECT_ID\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_REPARSE_POINT:
Status = set_reparse_point(DeviceObject, Irp);
break;
case FSCTL_GET_REPARSE_POINT:
Status = get_reparse_point(DeviceObject, IrpSp->FileObject, Irp->AssociatedIrp.SystemBuffer,
IrpSp->Parameters.DeviceIoControl.OutputBufferLength, &Irp->IoStatus.Information);
break;
case FSCTL_DELETE_REPARSE_POINT:
WARN("STUB: FSCTL_DELETE_REPARSE_POINT\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_ENUM_USN_DATA:
WARN("STUB: FSCTL_ENUM_USN_DATA\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SECURITY_ID_CHECK:
WARN("STUB: FSCTL_SECURITY_ID_CHECK\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_READ_USN_JOURNAL:
WARN("STUB: FSCTL_READ_USN_JOURNAL\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_OBJECT_ID_EXTENDED:
WARN("STUB: FSCTL_SET_OBJECT_ID_EXTENDED\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_CREATE_OR_GET_OBJECT_ID:
WARN("STUB: FSCTL_CREATE_OR_GET_OBJECT_ID\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_SPARSE:
WARN("STUB: FSCTL_SET_SPARSE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_ZERO_DATA:
WARN("STUB: FSCTL_SET_ZERO_DATA\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_ALLOCATED_RANGES:
WARN("STUB: FSCTL_QUERY_ALLOCATED_RANGES\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_ENABLE_UPGRADE:
WARN("STUB: FSCTL_ENABLE_UPGRADE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_ENCRYPTION:
WARN("STUB: FSCTL_SET_ENCRYPTION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_ENCRYPTION_FSCTL_IO:
WARN("STUB: FSCTL_ENCRYPTION_FSCTL_IO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_WRITE_RAW_ENCRYPTED:
WARN("STUB: FSCTL_WRITE_RAW_ENCRYPTED\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_READ_RAW_ENCRYPTED:
WARN("STUB: FSCTL_READ_RAW_ENCRYPTED\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_CREATE_USN_JOURNAL:
WARN("STUB: FSCTL_CREATE_USN_JOURNAL\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_READ_FILE_USN_DATA:
WARN("STUB: FSCTL_READ_FILE_USN_DATA\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_WRITE_USN_CLOSE_RECORD:
WARN("STUB: FSCTL_WRITE_USN_CLOSE_RECORD\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_EXTEND_VOLUME:
WARN("STUB: FSCTL_EXTEND_VOLUME\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_USN_JOURNAL:
WARN("STUB: FSCTL_QUERY_USN_JOURNAL\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_DELETE_USN_JOURNAL:
WARN("STUB: FSCTL_DELETE_USN_JOURNAL\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_MARK_HANDLE:
WARN("STUB: FSCTL_MARK_HANDLE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SIS_COPYFILE:
WARN("STUB: FSCTL_SIS_COPYFILE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SIS_LINK_FILES:
WARN("STUB: FSCTL_SIS_LINK_FILES\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_RECALL_FILE:
WARN("STUB: FSCTL_RECALL_FILE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_READ_FROM_PLEX:
WARN("STUB: FSCTL_READ_FROM_PLEX\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_FILE_PREFETCH:
WARN("STUB: FSCTL_FILE_PREFETCH\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
#if WIN32_WINNT >= 0x0600
case FSCTL_MAKE_MEDIA_COMPATIBLE:
WARN("STUB: FSCTL_MAKE_MEDIA_COMPATIBLE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_DEFECT_MANAGEMENT:
WARN("STUB: FSCTL_SET_DEFECT_MANAGEMENT\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_SPARING_INFO:
WARN("STUB: FSCTL_QUERY_SPARING_INFO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_ON_DISK_VOLUME_INFO:
WARN("STUB: FSCTL_QUERY_ON_DISK_VOLUME_INFO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_VOLUME_COMPRESSION_STATE:
WARN("STUB: FSCTL_SET_VOLUME_COMPRESSION_STATE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_MODIFY_RM:
WARN("STUB: FSCTL_TXFS_MODIFY_RM\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_QUERY_RM_INFORMATION:
WARN("STUB: FSCTL_TXFS_QUERY_RM_INFORMATION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_ROLLFORWARD_REDO:
WARN("STUB: FSCTL_TXFS_ROLLFORWARD_REDO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_ROLLFORWARD_UNDO:
WARN("STUB: FSCTL_TXFS_ROLLFORWARD_UNDO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_START_RM:
WARN("STUB: FSCTL_TXFS_START_RM\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_SHUTDOWN_RM:
WARN("STUB: FSCTL_TXFS_SHUTDOWN_RM\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_READ_BACKUP_INFORMATION:
WARN("STUB: FSCTL_TXFS_READ_BACKUP_INFORMATION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_WRITE_BACKUP_INFORMATION:
WARN("STUB: FSCTL_TXFS_WRITE_BACKUP_INFORMATION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_CREATE_SECONDARY_RM:
WARN("STUB: FSCTL_TXFS_CREATE_SECONDARY_RM\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_GET_METADATA_INFO:
WARN("STUB: FSCTL_TXFS_GET_METADATA_INFO\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_GET_TRANSACTED_VERSION:
WARN("STUB: FSCTL_TXFS_GET_TRANSACTED_VERSION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_SAVEPOINT_INFORMATION:
WARN("STUB: FSCTL_TXFS_SAVEPOINT_INFORMATION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_CREATE_MINIVERSION:
WARN("STUB: FSCTL_TXFS_CREATE_MINIVERSION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_TRANSACTION_ACTIVE:
WARN("STUB: FSCTL_TXFS_TRANSACTION_ACTIVE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_ZERO_ON_DEALLOCATION:
WARN("STUB: FSCTL_SET_ZERO_ON_DEALLOCATION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_REPAIR:
WARN("STUB: FSCTL_SET_REPAIR\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_GET_REPAIR:
WARN("STUB: FSCTL_GET_REPAIR\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_WAIT_FOR_REPAIR:
WARN("STUB: FSCTL_WAIT_FOR_REPAIR\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_INITIATE_REPAIR:
WARN("STUB: FSCTL_INITIATE_REPAIR\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_CSC_INTERNAL:
WARN("STUB: FSCTL_CSC_INTERNAL\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SHRINK_VOLUME:
WARN("STUB: FSCTL_SHRINK_VOLUME\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_SET_SHORT_NAME_BEHAVIOR:
WARN("STUB: FSCTL_SET_SHORT_NAME_BEHAVIOR\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_DFSR_SET_GHOST_HANDLE_STATE:
WARN("STUB: FSCTL_DFSR_SET_GHOST_HANDLE_STATE\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES:
WARN("STUB: FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_LIST_TRANSACTIONS:
WARN("STUB: FSCTL_TXFS_LIST_TRANSACTIONS\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_QUERY_PAGEFILE_ENCRYPTION:
WARN("STUB: FSCTL_QUERY_PAGEFILE_ENCRYPTION\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_RESET_VOLUME_ALLOCATION_HINTS:
WARN("STUB: FSCTL_RESET_VOLUME_ALLOCATION_HINTS\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_TXFS_READ_BACKUP_INFORMATION2:
WARN("STUB: FSCTL_TXFS_READ_BACKUP_INFORMATION2\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
case FSCTL_CSV_CONTROL:
WARN("STUB: FSCTL_CSV_CONTROL\n");
Status = STATUS_NOT_IMPLEMENTED;
break;
#endif
case FSCTL_BTRFS_GET_FILE_IDS:
Status = get_file_ids(IrpSp->FileObject, map_user_buffer(Irp), IrpSp->Parameters.DeviceIoControl.OutputBufferLength);
break;
default:
WARN("unknown control code %x (DeviceType = %x, Access = %x, Function = %x, Method = %x)\n",
IrpSp->Parameters.FileSystemControl.FsControlCode, (IrpSp->Parameters.FileSystemControl.FsControlCode & 0xff0000) >> 16,
(IrpSp->Parameters.FileSystemControl.FsControlCode & 0xc000) >> 14, (IrpSp->Parameters.FileSystemControl.FsControlCode & 0x3ffc) >> 2,
IrpSp->Parameters.FileSystemControl.FsControlCode & 0x3);
Status = STATUS_NOT_IMPLEMENTED;
break;
}
return Status;
}