@@ -123,6 +123,33 @@ FowardUrbToRootHub(
123
123
return STATUS_PENDING ;
124
124
}
125
125
126
+ BOOLEAN
127
+ IsValidPDO (
128
+ IN PDEVICE_OBJECT DeviceObject )
129
+ {
130
+ ULONG Index ;
131
+ PHUB_DEVICE_EXTENSION HubDeviceExtension ;
132
+ PHUB_CHILDDEVICE_EXTENSION ChildDeviceExtension ;
133
+
134
+
135
+ ChildDeviceExtension = (PHUB_CHILDDEVICE_EXTENSION )DeviceObject -> DeviceExtension ;
136
+ ASSERT (ChildDeviceExtension -> Common .IsFDO == FALSE);
137
+ HubDeviceExtension = (PHUB_DEVICE_EXTENSION )ChildDeviceExtension -> ParentDeviceObject -> DeviceExtension ;
138
+
139
+ for (Index = 0 ; Index < USB_MAXCHILDREN ; Index ++ )
140
+ {
141
+ if (HubDeviceExtension -> ChildDeviceObject [Index ] == DeviceObject )
142
+ {
143
+ /* PDO exists */
144
+ return TRUE;
145
+ }
146
+ }
147
+
148
+ /* invalid pdo */
149
+ return FALSE;
150
+ }
151
+
152
+
126
153
NTSTATUS
127
154
USBHUB_PdoHandleInternalDeviceControl (
128
155
IN PDEVICE_OBJECT DeviceObject ,
@@ -154,6 +181,15 @@ USBHUB_PdoHandleInternalDeviceControl(
154
181
HubDeviceExtension = (PHUB_DEVICE_EXTENSION )ChildDeviceExtension -> ParentDeviceObject -> DeviceExtension ;
155
182
RootHubDeviceObject = HubDeviceExtension -> RootHubPhysicalDeviceObject ;
156
183
184
+ if (!IsValidPDO (DeviceObject ))
185
+ {
186
+ DPRINT1 ("[USBHUB] Request for removed device object %p\n" , DeviceObject );
187
+ Irp -> IoStatus .Status = STATUS_DEVICE_NOT_CONNECTED ;
188
+ Irp -> IoStatus .Information = 0 ;
189
+ IoCompleteRequest (Irp , IO_NO_INCREMENT );
190
+ return STATUS_DEVICE_NOT_CONNECTED ;
191
+ }
192
+
157
193
switch (Stack -> Parameters .DeviceIoControl .IoControlCode )
158
194
{
159
195
case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO :
0 commit comments