ReactOS 0.4.16-dev-329-g9223134
devctrl.c
Go to the documentation of this file.
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
33NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
37 _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt
38 );
39
40#ifdef ALLOC_PRAGMA
41#pragma alloc_text(PAGE, CdCommonDevControl)
42#endif
43
44
47 _Inout_ PIRP_CONTEXT IrpContext,
49 )
50
51/*++
52
53Routine Description:
54
55Arguments:
56
57Return Value:
58
59--*/
60
61{
63
65 PFCB Fcb;
66 PCCB Ccb;
67
69 PIO_STACK_LOCATION NextIrpSp;
70
71 PAGED_CODE();
72
73 //
74 // Extract and decode the file object.
75 //
76
78
79 TypeOfOpen = CdDecodeFileObject( IrpContext,
81 &Fcb,
82 &Ccb );
83
84 //
85 // The only type of opens we accept are user volume opens.
86 //
87
89
92 }
93
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
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
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
176NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
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
191 }
192
193 return STATUS_SUCCESS;
194
196 UNREFERENCED_PARAMETER( Contxt );
197}
198
199
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
LONG NTSTATUS
Definition: precomp.h:26
VOID CdCompleteRequest(_Inout_opt_ PIRP_CONTEXT IrpContext, _Inout_opt_ PIRP Irp, _In_ NTSTATUS Status)
Definition: cddata.c:914
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN TypeOfOpen
Definition: cdprocs.h:589
VOID CdVerifyVcb(_In_ PIRP_CONTEXT IrpContext, _Inout_ PVCB Vcb)
Definition: verfysup.c:411
@ UserVolumeOpen
Definition: cdprocs.h:575
_In_ PFCB Fcb
Definition: cdprocs.h:159
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
Definition: cdprocs.h:592
enum _TYPE_OF_OPEN TYPE_OF_OPEN
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
IO_COMPLETION_ROUTINE CdDevCtrlCompletionRoutine
Definition: devctrl.c:30
NTSTATUS CdCommonDevControl(_Inout_ PIRP_CONTEXT IrpContext, _Inout_ PIRP Irp)
Definition: devctrl.c:46
Status
Definition: gdiplustypes.h:25
IoMarkIrpPending(Irp)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
#define _Inout_
Definition: no_sal2.h:162
#define _In_reads_opt_(s)
Definition: no_sal2.h:222
#define _In_
Definition: no_sal2.h:158
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
struct _CDROM_DISK_DATA * PCDROM_DISK_DATA
#define IOCTL_CDROM_DISK_TYPE
Definition: ntddcdrm.h:70
struct _CDROM_DISK_DATA CDROM_DISK_DATA
#define IOCTL_CDROM_READ_TOC
Definition: ntddcdrm.h:34
#define IoCallDriver
Definition: irp.c:1225
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
Definition: cdstruc.h:1067
Definition: cdstruc.h:902
PVCB Vcb
Definition: cdstruc.h:933
union _IO_STACK_LOCATION::@1581 Parameters
struct _IO_STACK_LOCATION::@1581::@1582 DeviceIoControl
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
ULONG DiskFlags
Definition: cdstruc.h:640
#define NTAPI
Definition: typedefs.h:36
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695