205 lines
3.8 KiB
C
205 lines
3.8 KiB
C
|
/*++
|
|||
|
|
|||
|
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.
|
|||
|
|
|||
|
// @@BEGIN_DDKSPLIT
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Brian Andrew [BrianAn] 04-Mar-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
// @@END_DDKSPLIT
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "CdProcs.h"
|
|||
|
|
|||
|
//
|
|||
|
// The Bug check file id for this module
|
|||
|
//
|
|||
|
|
|||
|
#define BugCheckFileId (CDFS_BUG_CHECK_DEVCTRL)
|
|||
|
|
|||
|
//
|
|||
|
// Local support routines
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CdDevCtrlCompletionRoutine (
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp,
|
|||
|
IN PVOID Contxt
|
|||
|
);
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text(PAGE, CdCommonDevControl)
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
CdCommonDevControl (
|
|||
|
IN PIRP_CONTEXT IrpContext,
|
|||
|
IN 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;
|
|||
|
|
|||
|
PVOID TargetBuffer = NULL;
|
|||
|
|
|||
|
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 PVOID Contxt
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
//
|
|||
|
// Add the hack-o-ramma to fix formats.
|
|||
|
//
|
|||
|
|
|||
|
if (Irp->PendingReturned) {
|
|||
|
|
|||
|
IoMarkIrpPending( Irp );
|
|||
|
}
|
|||
|
|
|||
|
return STATUS_SUCCESS;
|
|||
|
|
|||
|
UNREFERENCED_PARAMETER( DeviceObject );
|
|||
|
UNREFERENCED_PARAMETER( Contxt );
|
|||
|
}
|
|||
|
|