summaryrefslogtreecommitdiff
path: root/filesys/cdfs/devctrl.c
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /filesys/cdfs/devctrl.c
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'filesys/cdfs/devctrl.c')
-rw-r--r--filesys/cdfs/devctrl.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/filesys/cdfs/devctrl.c b/filesys/cdfs/devctrl.c
new file mode 100644
index 00000000..ce120f56
--- /dev/null
+++ b/filesys/cdfs/devctrl.c
@@ -0,0 +1,197 @@
+/*++
+
+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
+CdDevCtrlCompletionRoutine (
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ PIRP Irp,
+ _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt
+ );
+
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text(PAGE, CdCommonDevControl)
+#endif
+
+
+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;
+}
+
+
+//
+// Local support routine
+//
+
+NTSTATUS
+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 );
+}
+
+