2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: drivers/multimedia/portcls/irp.c
5 * PURPOSE: Port Class driver / IRP Handling
6 * PROGRAMMER: Andrew Greenwood
17 A safe place for IRPs to be bounced to, if no handler has been
18 set. Whether this is a good idea or not...?
25 IN PDEVICE_OBJECT DeviceObject
,
28 NTSTATUS status
= STATUS_NOT_SUPPORTED
;
30 Irp
->IoStatus
.Status
= STATUS_NOT_SUPPORTED
;
31 Irp
->IoStatus
.Information
= 0;
32 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
34 DPRINT1("IRP Stub called\n");
41 Handles IRP_MJ_CREATE, which occurs when someone wants to make use of
47 IN PDEVICE_OBJECT DeviceObject
,
50 DPRINT1("PortClsCreate called\n");
54 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
55 Irp
->IoStatus
.Information
= 0;
56 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
58 return STATUS_SUCCESS
;
64 Used for things like IRP_MN_START_DEVICE
69 IN PDEVICE_OBJECT DeviceObject
,
73 PCExtension
* portcls_ext
;
74 PIO_STACK_LOCATION irp_stack
;
76 DPRINT1("PortClsPnp called\n");
78 portcls_ext
= (PCExtension
*) DeviceObject
->DeviceExtension
;
79 irp_stack
= IoGetCurrentIrpStackLocation(Irp
);
84 if IRP_MN_START_DEVICE, call the driver's customer start device routine.
85 Before we do so, we must create a ResourceList to pass to the Start
88 if ( irp_stack
->MinorFunction
== IRP_MN_START_DEVICE
)
90 IResourceList
* resource_list
;
91 DPRINT("IRP_MN_START_DEVICE\n");
93 /* Create the resource list */
94 status
= PcNewResourceList(
98 irp_stack
->Parameters
.StartDevice
.AllocatedResourcesTranslated
,
99 irp_stack
->Parameters
.StartDevice
.AllocatedResources
);
101 if ( ! NT_SUCCESS(status
) )
103 DPRINT("PcNewResourceList failed [0x%8x]\n", status
);
104 Irp
->IoStatus
.Status
= status
;
105 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
110 /* Assign the resource list to our extension */
111 portcls_ext
->resources
= resource_list
;
113 ASSERT(portcls_ext
->StartDevice
);
115 /* Call the StartDevice routine */
116 DPRINT("Calling StartDevice at 0x%8p\n", portcls_ext
->StartDevice
);
117 status
= portcls_ext
->StartDevice(DeviceObject
, Irp
, resource_list
);
119 if ( ! NT_SUCCESS(status
) )
121 DPRINT("StartDevice returned a failure code [0x%8x]\n", status
);
122 resource_list
->lpVtbl
->Release(resource_list
);
124 Irp
->IoStatus
.Status
= status
;
125 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
130 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
131 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
133 else if ( irp_stack
->MinorFunction
== IRP_MN_REMOVE_DEVICE
)
135 DPRINT("IRP_MN_REMOVE_DEVICE\n");
137 portcls_ext
->resources
->lpVtbl
->Release(portcls_ext
->resources
);
139 IoDeleteDevice(DeviceObject
);
141 /* Do not complete? */
142 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
145 return STATUS_SUCCESS
;
149 Power management. Handles IRP_MJ_POWER
155 IN PDEVICE_OBJECT DeviceObject
,
158 DPRINT1("PortClsPower called\n");
162 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
163 Irp
->IoStatus
.Information
= 0;
164 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
166 return STATUS_SUCCESS
;
170 System control. Handles IRP_MJ_SYSTEM_CONTROL
176 IN PDEVICE_OBJECT DeviceObject
,
179 DPRINT1("PortClsSysControl called\n");
183 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
184 Irp
->IoStatus
.Information
= 0;
185 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
187 return STATUS_SUCCESS
;
192 ==========================================================================
194 ==========================================================================
198 Drivers may implement their own IRP handlers. If a driver decides to let
199 PortCls handle the IRP, it can do so by calling this.
203 IN PDEVICE_OBJECT DeviceObject
,
206 PIO_STACK_LOCATION irp_stack
;
208 DPRINT("PcDispatchIrp called - handling IRP in PortCls\n");
210 irp_stack
= IoGetCurrentIrpStackLocation(Irp
);
212 switch ( irp_stack
->MajorFunction
)
216 return PortClsCreate(DeviceObject
, Irp
);
219 return PortClsPnp(DeviceObject
, Irp
);
222 return PortClsPower(DeviceObject
, Irp
);
224 case IRP_MJ_SYSTEM_CONTROL
:
225 return PortClsSysControl(DeviceObject
, Irp
);
230 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_CLOSE
);
231 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_DEVICE_CONTROL
);
232 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_FLUSH_BUFFERS
);
233 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_QUERY_SECURITY
);
234 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_READ
);
235 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_SET_SECURITY
);
236 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_WRITE
);
243 /* If we reach here, we just complete the IRP */
244 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
245 Irp
->IoStatus
.Information
= 0;
246 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
248 return STATUS_SUCCESS
;
256 IN PDEVICE_OBJECT DeviceObject
,
261 return STATUS_UNSUCCESSFUL
;
268 PcForwardIrpSynchronous(
269 IN PDEVICE_OBJECT DeviceObject
,
273 return STATUS_UNSUCCESSFUL
;