Reactos
at listview 199 lines 4.1 kB view raw
1/*++ 2 3Copyright (c) 1989-2000 Microsoft Corporation 4 5Module Name: 6 7 DevCtrl.c 8 9Abstract: 10 11 This module implements the File System Device Control routines for Cdfs 12 called by the dispatch driver. 13 14 15--*/ 16 17#include "cdprocs.h" 18 19// 20// The Bug check file id for this module 21// 22 23#define BugCheckFileId (CDFS_BUG_CHECK_DEVCTRL) 24 25// 26// Local support routines 27// 28 29// Tell prefast this is a completion routine 30IO_COMPLETION_ROUTINE CdDevCtrlCompletionRoutine; 31 32NTSTATUS 33NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */ 34CdDevCtrlCompletionRoutine ( 35 _In_ PDEVICE_OBJECT DeviceObject, 36 _In_ PIRP Irp, 37 _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt 38 ); 39 40#ifdef ALLOC_PRAGMA 41#pragma alloc_text(PAGE, CdCommonDevControl) 42#endif 43 44 45NTSTATUS 46CdCommonDevControl ( 47 _Inout_ PIRP_CONTEXT IrpContext, 48 _Inout_ PIRP Irp 49 ) 50 51/*++ 52 53Routine Description: 54 55Arguments: 56 57Return Value: 58 59--*/ 60 61{ 62 NTSTATUS Status; 63 64 TYPE_OF_OPEN TypeOfOpen; 65 PFCB Fcb; 66 PCCB Ccb; 67 68 PIO_STACK_LOCATION IrpSp; 69 PIO_STACK_LOCATION NextIrpSp; 70 71 PAGED_CODE(); 72 73 // 74 // Extract and decode the file object. 75 // 76 77 IrpSp = IoGetCurrentIrpStackLocation( Irp ); 78 79 TypeOfOpen = CdDecodeFileObject( IrpContext, 80 IrpSp->FileObject, 81 &Fcb, 82 &Ccb ); 83 84 // 85 // The only type of opens we accept are user volume opens. 86 // 87 88 if (TypeOfOpen != UserVolumeOpen) { 89 90 CdCompleteRequest( IrpContext, Irp, STATUS_INVALID_PARAMETER ); 91 return STATUS_INVALID_PARAMETER; 92 } 93 94 if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_READ_TOC) { 95 96 // 97 // Verify the Vcb in this case to detect if the volume has changed. 98 // 99 100 CdVerifyVcb( IrpContext, Fcb->Vcb ); 101 102 // 103 // Handle the case of the disk type ourselves. 104 // 105 106 } else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_CDROM_DISK_TYPE) { 107 108 // 109 // Verify the Vcb in this case to detect if the volume has changed. 110 // 111 112 CdVerifyVcb( IrpContext, Fcb->Vcb ); 113 114 // 115 // Check the size of the output buffer. 116 // 117 118 if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof( CDROM_DISK_DATA )) { 119 120 CdCompleteRequest( IrpContext, Irp, STATUS_BUFFER_TOO_SMALL ); 121 return STATUS_BUFFER_TOO_SMALL; 122 } 123 124 // 125 // Copy the data from the Vcb. 126 // 127 128 ((PCDROM_DISK_DATA) Irp->AssociatedIrp.SystemBuffer)->DiskData = Fcb->Vcb->DiskFlags; 129 130 Irp->IoStatus.Information = sizeof( CDROM_DISK_DATA ); 131 CdCompleteRequest( IrpContext, Irp, STATUS_SUCCESS ); 132 return STATUS_SUCCESS; 133 } 134 135 // 136 // Get the next stack location, and copy over the stack parameter 137 // information. 138 // 139 140 NextIrpSp = IoGetNextIrpStackLocation( Irp ); 141 142 *NextIrpSp = *IrpSp; 143 144 // 145 // Set up the completion routine 146 // 147 148 IoSetCompletionRoutine( Irp, 149 CdDevCtrlCompletionRoutine, 150 NULL, 151 TRUE, 152 TRUE, 153 TRUE ); 154 155 // 156 // Send the request. 157 // 158 159 Status = IoCallDriver( IrpContext->Vcb->TargetDeviceObject, Irp ); 160 161 // 162 // Cleanup our Irp Context. The driver has completed the Irp. 163 // 164 165 CdCompleteRequest( IrpContext, NULL, STATUS_SUCCESS ); 166 167 return Status; 168} 169 170 171// 172// Local support routine 173// 174 175NTSTATUS 176NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */ 177CdDevCtrlCompletionRoutine ( 178 _In_ PDEVICE_OBJECT DeviceObject, 179 _In_ PIRP Irp, 180 _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt 181 ) 182 183{ 184 // 185 // Add the hack-o-ramma to fix formats. 186 // 187 188 if (Irp->PendingReturned) { 189 190 IoMarkIrpPending( Irp ); 191 } 192 193 return STATUS_SUCCESS; 194 195 UNREFERENCED_PARAMETER( DeviceObject ); 196 UNREFERENCED_PARAMETER( Contxt ); 197} 198 199