[CDFS_NEW] -> [CDFS] No old driver, thus no new driver
[reactos.git] / drivers / filesystems / cdfs / devctrl.c
diff --git a/drivers/filesystems/cdfs/devctrl.c b/drivers/filesystems/cdfs/devctrl.c
new file mode 100644 (file)
index 0000000..4d0a70a
--- /dev/null
@@ -0,0 +1,199 @@
+/*++
+
+Copyright (c) 1989-2000 Microsoft Corporation
+
+Module Name:
+
+    DevCtrl.c
+
+Abstract:
+
+    This module implements the File System Device Control routines for Cdfs
+    called by the dispatch driver.
+
+
+--*/
+
+#include "cdprocs.h"
+
+//
+//  The Bug check file id for this module
+//
+
+#define BugCheckFileId                   (CDFS_BUG_CHECK_DEVCTRL)
+
+//
+//  Local support routines
+//
+
+//  Tell prefast this is a completion routine
+IO_COMPLETION_ROUTINE CdDevCtrlCompletionRoutine;
+
+NTSTATUS
+NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
+CdDevCtrlCompletionRoutine (
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _In_ PIRP Irp,
+    _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt
+    );
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text(PAGE, CdCommonDevControl)
+#endif
+
+\f
+NTSTATUS
+CdCommonDevControl (
+    _Inout_ PIRP_CONTEXT IrpContext,
+    _Inout_ PIRP Irp
+    )
+
+/*++
+
+Routine Description:
+
+Arguments:
+
+Return Value:
+
+--*/
+
+{
+    NTSTATUS Status;
+
+    TYPE_OF_OPEN TypeOfOpen;
+    PFCB Fcb;
+    PCCB Ccb;
+
+    PIO_STACK_LOCATION IrpSp;
+    PIO_STACK_LOCATION NextIrpSp;
+
+    PAGED_CODE();
+
+    //
+    //  Extract and decode the file object.
+    //
+
+    IrpSp = IoGetCurrentIrpStackLocation( Irp );
+
+    TypeOfOpen = CdDecodeFileObject( IrpContext,
+                                     IrpSp->FileObject,
+                                     &Fcb,
+                                     &Ccb );
+
+    //
+    //  The only type of opens we accept are user volume opens.
+    //
+
+    if (TypeOfOpen != UserVolumeOpen) {
+
+        CdCompleteRequest( IrpContext, Irp, STATUS_INVALID_PARAMETER );
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_READ_TOC) {
+
+        //
+        //  Verify the Vcb in this case to detect if the volume has changed.
+        //
+
+        CdVerifyVcb( IrpContext, Fcb->Vcb );
+
+    //
+    //  Handle the case of the disk type ourselves.
+    //
+
+    } else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_DISK_TYPE) {
+
+        //
+        //  Verify the Vcb in this case to detect if the volume has changed.
+        //
+
+        CdVerifyVcb( IrpContext, Fcb->Vcb );
+
+        //
+        //  Check the size of the output buffer.
+        //
+
+        if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof( CDROM_DISK_DATA )) {
+
+            CdCompleteRequest( IrpContext, Irp, STATUS_BUFFER_TOO_SMALL );
+            return STATUS_BUFFER_TOO_SMALL;
+        }
+
+        //
+        //  Copy the data from the Vcb.
+        //
+
+        ((PCDROM_DISK_DATA) Irp->AssociatedIrp.SystemBuffer)->DiskData = Fcb->Vcb->DiskFlags;
+
+        Irp->IoStatus.Information = sizeof( CDROM_DISK_DATA );
+        CdCompleteRequest( IrpContext, Irp, STATUS_SUCCESS );
+        return STATUS_SUCCESS;
+    }
+
+    //
+    //  Get the next stack location, and copy over the stack parameter
+    //  information.
+    //
+
+    NextIrpSp = IoGetNextIrpStackLocation( Irp );
+
+    *NextIrpSp = *IrpSp;
+
+    //
+    //  Set up the completion routine
+    //
+
+    IoSetCompletionRoutine( Irp,
+                            CdDevCtrlCompletionRoutine,
+                            NULL,
+                            TRUE,
+                            TRUE,
+                            TRUE );
+
+    //
+    //  Send the request.
+    //
+
+    Status = IoCallDriver( IrpContext->Vcb->TargetDeviceObject, Irp );
+
+    //
+    //  Cleanup our Irp Context.  The driver has completed the Irp.
+    //
+
+    CdCompleteRequest( IrpContext, NULL, STATUS_SUCCESS );
+
+    return Status;
+}
+
+\f
+//
+//  Local support routine
+//
+
+NTSTATUS
+NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
+CdDevCtrlCompletionRoutine (
+    _In_ PDEVICE_OBJECT DeviceObject,
+    _In_ PIRP Irp,
+    _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt
+    )
+
+{
+    //
+    //  Add the hack-o-ramma to fix formats.
+    //
+
+    if (Irp->PendingReturned) {
+
+        IoMarkIrpPending( Irp );
+    }
+
+    return STATUS_SUCCESS;
+
+    UNREFERENCED_PARAMETER( DeviceObject );
+    UNREFERENCED_PARAMETER( Contxt );
+}
+
+