1 /*++ 2 3 Copyright (c) 1989-2000 Microsoft Corporation 4 5 Module Name: 6 7 DevCtrl.c 8 9 Abstract: 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 30 IO_COMPLETION_ROUTINE CdDevCtrlCompletionRoutine; 31 32 NTSTATUS 33 NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */ 34 CdDevCtrlCompletionRoutine ( 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 45 NTSTATUS 46 CdCommonDevControl ( 47 _Inout_ PIRP_CONTEXT IrpContext, 48 _Inout_ PIRP Irp 49 ) 50 51 /*++ 52 53 Routine Description: 54 55 Arguments: 56 57 Return 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 175 NTSTATUS 176 NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */ 177 CdDevCtrlCompletionRoutine ( 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 200