@@ -197,45 +197,58 @@ USBHUB_DispatchPower(
197
197
{
198
198
PIO_STACK_LOCATION IoStack ;
199
199
PHUB_DEVICE_EXTENSION DeviceExtension ;
200
-
200
+ NTSTATUS Status ;
201
201
IoStack = IoGetCurrentIrpStackLocation (Irp );
202
202
DeviceExtension = DeviceObject -> DeviceExtension ;
203
- DPRINT1 ("Power Function %x\n" , IoStack -> MinorFunction );
204
203
205
- if (DeviceExtension -> Common .IsFDO )
204
+ Status = IoAcquireRemoveLock (& DeviceExtension -> Common .RemoveLock , Irp );
205
+ if (!NT_SUCCESS (Status ))
206
206
{
207
- PoStartNextPowerIrp ( Irp ) ;
208
- IoSkipCurrentIrpStackLocation (Irp );
209
- return PoCallDriver ( DeviceExtension -> LowerDeviceObject , Irp ) ;
207
+ Irp -> IoStatus . Status = Status ;
208
+ IoCompleteRequest (Irp , IO_NO_INCREMENT );
209
+ return Status ;
210
210
}
211
211
212
- if (IoStack -> MinorFunction == IRP_MN_SET_POWER )
213
- {
214
- PoStartNextPowerIrp (Irp );
215
- Irp -> IoStatus .Status = STATUS_SUCCESS ;
216
- IoCompleteRequest (Irp , IO_NO_INCREMENT );
217
- return STATUS_SUCCESS ;
212
+ DPRINT1 ("Power Function %x\n" , IoStack -> MinorFunction );
218
213
219
- }
220
- else if (IoStack -> MinorFunction == IRP_MN_QUERY_POWER )
214
+ if (DeviceExtension -> Common .IsFDO )
221
215
{
222
216
PoStartNextPowerIrp (Irp );
223
- Irp -> IoStatus . Status = STATUS_SUCCESS ;
224
- IoCompleteRequest ( Irp , IO_NO_INCREMENT );
225
- return STATUS_SUCCESS ;
226
-
217
+ IoSkipCurrentIrpStackLocation ( Irp ) ;
218
+ Status = PoCallDriver ( DeviceExtension -> LowerDeviceObject , Irp );
219
+ IoReleaseRemoveLock ( & DeviceExtension -> Common . RemoveLock , Irp ) ;
220
+ return Status ;
227
221
}
228
- else if (IoStack -> MinorFunction == IRP_MN_WAIT_WAKE )
222
+
223
+ switch (IoStack -> MinorFunction )
229
224
{
230
- PoStartNextPowerIrp (Irp );
231
- Irp -> IoStatus .Status = STATUS_SUCCESS ;
232
- IoCompleteRequest (Irp , IO_NO_INCREMENT );
233
- return STATUS_SUCCESS ;
225
+ case IRP_MN_SET_POWER :
226
+ {
227
+ DPRINT ("IRP_MN_SET_POWER\n" );
228
+ break ;
229
+ }
230
+ case IRP_MN_QUERY_POWER :
231
+ {
232
+ DPRINT ("IRP_MN_QUERY_POWER\n" );
233
+ break ;
234
+ }
235
+ case IRP_MN_WAIT_WAKE :
236
+ {
237
+ DPRINT ("IRP_MN_WAIT_WAKE\n" );
238
+ break ;
239
+ }
240
+ default :
241
+ {
242
+ DPRINT1 ("PDO IRP_MJ_POWER / unknown minor function 0x%lx\n" , IoStack -> MinorFunction );
243
+ IoCompleteRequest (Irp , IO_NO_INCREMENT );
244
+ return Irp -> IoStatus .Status ;
245
+ }
234
246
}
235
247
236
248
PoStartNextPowerIrp (Irp );
237
249
Irp -> IoStatus .Status = STATUS_SUCCESS ;
238
250
IoCompleteRequest (Irp , IO_NO_INCREMENT );
251
+ IoReleaseRemoveLock (& DeviceExtension -> Common .RemoveLock , Irp );
239
252
return STATUS_SUCCESS ;
240
253
}
241
254
0 commit comments