Something went wrong. Try again.
Reactos
Something went wrong. Try again.
4.1 kB · 199 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200/*++
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 routineIO_COMPLETION_ROUTINE CdDevCtrlCompletionRoutine;
NTSTATUSNTAPI /* 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
NTSTATUSCdCommonDevControl ( _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//
NTSTATUSNTAPI /* 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 );}