Changeset 79334 in vbox for trunk/src/VBox/HostDrivers/VBoxUSB
- Timestamp:
- Jun 25, 2019 4:16:07 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 131562
- Location:
- trunk/src/VBox/HostDrivers/VBoxUSB/win/mon
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbFlt.cpp
r79000 r79334 47 47 #include <devguid.h> 48 48 49 /*50 * Note: Must match the VID & PID in the USB driver .inf file!!51 */52 /*53 BusQueryDeviceID USB\Vid_80EE&Pid_CAFE54 BusQueryInstanceID 255 BusQueryHardwareIDs USB\Vid_80EE&Pid_CAFE&Rev_010056 BusQueryHardwareIDs USB\Vid_80EE&Pid_CAFE57 BusQueryCompatibleIDs USB\Class_ff&SubClass_00&Prot_0058 BusQueryCompatibleIDs USB\Class_ff&SubClass_0059 BusQueryCompatibleIDs USB\Class_ff60 */61 62 #define szBusQueryDeviceId L"USB\\Vid_80EE&Pid_CAFE"63 #define szBusQueryHardwareIDs L"USB\\Vid_80EE&Pid_CAFE&Rev_0100\0USB\\Vid_80EE&Pid_CAFE\0\0"64 #define szBusQueryCompatibleIDs L"USB\\Class_ff&SubClass_00&Prot_00\0USB\\Class_ff&SubClass_00\0USB\\Class_ff\0\0"65 66 #define szDeviceTextDescription L"VirtualBox USB"67 68 /* Possible USB bus driver names. */69 static LPWSTR lpszStandardControllerName[1] =70 {71 L"\\Driver\\usbhub",72 };73 49 74 50 /* -
trunk/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
r79311 r79334 171 171 } 172 172 173 void vboxUsbDbgPrintUnicodeString(PUNICODE_STRING pUnicodeString)174 {175 RT_NOREF1(pUnicodeString);176 Log(("%.*ls", pUnicodeString->Length / 2, pUnicodeString->Buffer));177 }178 179 173 /** 180 174 * Send IRP_MN_QUERY_DEVICE_RELATIONS … … 240 234 LOG(("IoCallDriver returned %x", Status)); 241 235 return Status; 242 }243 244 RT_C_DECLS_BEGIN245 /* these two come from IFS Kit, which is not included in 2K DDK we use,246 * although they are documented and exported in ntoskrnl,247 * and both should be present for >= XP according to MSDN */248 NTKERNELAPI249 NTSTATUS250 ObQueryNameString(251 __in PVOID Object,252 __out_bcount_opt(Length) POBJECT_NAME_INFORMATION ObjectNameInfo,253 __in ULONG Length,254 __out PULONG ReturnLength255 );256 257 NTKERNELAPI258 PDEVICE_OBJECT259 IoGetLowerDeviceObject(260 __in PDEVICE_OBJECT DeviceObject261 );262 263 RT_C_DECLS_END264 265 typedef DECLCALLBACK(VOID) FNVBOXUSBDEVNAMEMATCHER(PDEVICE_OBJECT pDo, PUNICODE_STRING pName, PVOID pvMatcher);266 typedef FNVBOXUSBDEVNAMEMATCHER *PFNVBOXUSBDEVNAMEMATCHER;267 268 static NTSTATUS vboxUsbObjCheckName(PDEVICE_OBJECT pDo, PFNVBOXUSBDEVNAMEMATCHER pfnMatcher, PVOID pvMatcher)269 {270 union271 {272 OBJECT_NAME_INFORMATION Info;273 char buf[1024];274 } buf;275 ULONG cbLength = 0;276 277 POBJECT_NAME_INFORMATION pInfo = &buf.Info;278 NTSTATUS Status = ObQueryNameString(pDo, &buf.Info, sizeof (buf), &cbLength);279 if (!NT_SUCCESS(Status))280 {281 if (STATUS_INFO_LENGTH_MISMATCH != Status)282 {283 WARN(("ObQueryNameString failed 0x%x", Status));284 return Status;285 }286 287 LOG(("ObQueryNameString returned STATUS_INFO_LENGTH_MISMATCH, required size %d", cbLength));288 289 pInfo = (POBJECT_NAME_INFORMATION)VBoxUsbMonMemAlloc(cbLength);290 if (!pInfo)291 {292 WARN(("VBoxUsbMonMemAlloc failed"));293 return STATUS_NO_MEMORY;294 }295 Status = ObQueryNameString(pDo, pInfo, cbLength, &cbLength);296 if (!NT_SUCCESS(Status))297 {298 WARN(("ObQueryNameString second try failed 0x%x", Status));299 VBoxUsbMonMemFree(pInfo);300 return Status;301 }302 }303 304 /* we've got the name! */305 LOG(("got the name:"));306 LOG_USTR(&pInfo->Name);307 pfnMatcher(pDo, &pInfo->Name, pvMatcher);308 309 if (&buf.Info != pInfo)310 {311 LOG(("freeing allocated pInfo(0x%p)", pInfo));312 VBoxUsbMonMemFree(pInfo);313 }314 else315 {316 LOG(("no freeing info needed"));317 }318 319 return STATUS_SUCCESS;320 }321 322 323 typedef DECLCALLBACK(BOOLEAN) FNVBOXUSBDEVSTACKWALKER(PDEVICE_OBJECT pTopDo, PDEVICE_OBJECT pCurDo, PVOID pvContext);324 typedef FNVBOXUSBDEVSTACKWALKER *PFNVBOXUSBDEVSTACKWALKER;325 326 VOID vboxUsbObjDevStackWalk(PDEVICE_OBJECT pDo, PFNVBOXUSBDEVSTACKWALKER pfnWalker, PVOID pvWalker)327 {328 LOG(("==>tree walk for Do 0x%p", pDo));329 PDEVICE_OBJECT pCurDo = pDo;330 ObReferenceObject(pCurDo); /* <- to make sure the dereferencing logic below works correctly */331 do332 {333 LOG(("==Do 0x%p", pCurDo));334 #ifdef VBOX_USB_WITH_VERBOSE_LOGGING335 {336 union337 {338 OBJECT_NAME_INFORMATION Info;339 char buf[1024];340 } buf;341 ULONG cbLength = 0;342 343 NTSTATUS tmpStatus = ObQueryNameString(pCurDo, &buf.Info, sizeof (buf), &cbLength);344 if (NT_SUCCESS(tmpStatus))345 {346 LOG((" Obj name:"));347 LOG_USTR(&buf.Info.Name);348 }349 else350 {351 if (STATUS_INFO_LENGTH_MISMATCH != tmpStatus)352 {353 WARN(("ObQueryNameString failed 0x%x", tmpStatus));354 }355 else356 {357 WARN(("ObQueryNameString STATUS_INFO_LENGTH_MISMATCH, required %d", cbLength));358 }359 }360 361 if (pCurDo->DriverObject362 && pCurDo->DriverObject->DriverName.Buffer363 && pCurDo->DriverObject->DriverName.Length)364 {365 LOG((" Drv Obj(0x%p), name:", pCurDo->DriverObject));366 LOG_USTR(&pCurDo->DriverObject->DriverName);367 }368 else369 {370 LOG((" No Drv Name, Drv Obj(0x%p)", pCurDo->DriverObject));371 if (pCurDo->DriverObject)372 {373 LOG((" driver name is zero, Length(%d), Buffer(0x%p)",374 pCurDo->DriverObject->DriverName.Length, pCurDo->DriverObject->DriverName.Buffer));375 }376 else377 {378 LOG((" driver object is NULL"));379 }380 }381 }382 #endif383 if (!pfnWalker(pDo, pCurDo, pvWalker))384 {385 LOG(("the walker said to stop"));386 ObDereferenceObject(pCurDo);387 break;388 }389 390 PDEVICE_OBJECT pLowerDo = IoGetLowerDeviceObject(pCurDo);391 ObDereferenceObject(pCurDo);392 if (!pLowerDo)393 {394 LOG(("IoGetLowerDeviceObject returnned NULL, stop"));395 break;396 }397 pCurDo = pLowerDo;398 } while (1);399 400 LOG(("<==tree walk"));401 }402 403 static DECLCALLBACK(BOOLEAN) vboxUsbObjNamePrefixMatch(PUNICODE_STRING pName, PUNICODE_STRING pNamePrefix, BOOLEAN fCaseInSensitive)404 {405 LOG(("Matching prefix:"));406 LOG_USTR(pNamePrefix);407 if (pNamePrefix->Length > pName->Length)408 {409 LOG(("Pregix Length(%d) > Name Length(%d)", pNamePrefix->Length, pName->Length));410 return FALSE;411 }412 413 LOG(("Pregix Length(%d) <= Name Length(%d)", pNamePrefix->Length, pName->Length));414 415 UNICODE_STRING NamePrefix = *pName;416 NamePrefix.Length = pNamePrefix->Length;417 LONG rc = RtlCompareUnicodeString(&NamePrefix, pNamePrefix, fCaseInSensitive);418 419 if (!rc)420 {421 LOG(("prefix MATCHED!"));422 return TRUE;423 }424 425 LOG(("prefix NOT matched!"));426 return FALSE;427 }428 429 typedef struct VBOXUSBOBJNAMEPREFIXMATCHER430 {431 PUNICODE_STRING pNamePrefix;432 BOOLEAN fMatched;433 } VBOXUSBOBJNAMEPREFIXMATCHER, *PVBOXUSBOBJNAMEPREFIXMATCHER;434 435 static DECLCALLBACK(VOID) vboxUsbObjDevNamePrefixMatcher(PDEVICE_OBJECT pDo, PUNICODE_STRING pName, PVOID pvMatcher)436 {437 RT_NOREF1(pDo);438 PVBOXUSBOBJNAMEPREFIXMATCHER pData = (PVBOXUSBOBJNAMEPREFIXMATCHER)pvMatcher;439 PUNICODE_STRING pNamePrefix = pData->pNamePrefix;440 ASSERT_WARN(!pData->fMatched, ("match flag already set!"));441 pData->fMatched = vboxUsbObjNamePrefixMatch(pName, pNamePrefix, TRUE /* fCaseInSensitive */);442 LOG(("match result (%d)", (int)pData->fMatched));443 }444 445 typedef struct VBOXUSBOBJDRVOBJSEARCHER446 {447 PDEVICE_OBJECT pDevObj;448 PUNICODE_STRING pDrvName;449 PUNICODE_STRING pPdoNamePrefix;450 ULONG fFlags;451 } VBOXUSBOBJDRVOBJSEARCHER, *PVBOXUSBOBJDRVOBJSEARCHER;452 453 static DECLCALLBACK(BOOLEAN) vboxUsbObjDevObjSearcherWalker(PDEVICE_OBJECT pTopDo, PDEVICE_OBJECT pCurDo, PVOID pvContext)454 {455 RT_NOREF1(pTopDo);456 PVBOXUSBOBJDRVOBJSEARCHER pData = (PVBOXUSBOBJDRVOBJSEARCHER)pvContext;457 ASSERT_WARN(!pData->pDevObj, ("non-null dev object (0x%p) on enter", pData->pDevObj));458 pData->pDevObj = NULL;459 if (pCurDo->DriverObject460 && pCurDo->DriverObject->DriverName.Buffer461 && pCurDo->DriverObject->DriverName.Length462 && !RtlCompareUnicodeString(pData->pDrvName, &pCurDo->DriverObject->DriverName, TRUE /* case insensitive */))463 {464 LOG(("MATCHED driver:"));465 LOG_USTR(&pCurDo->DriverObject->DriverName);466 if ((pData->fFlags & VBOXUSBMONHUBWALK_F_ALL) != VBOXUSBMONHUBWALK_F_ALL)467 {468 VBOXUSBOBJNAMEPREFIXMATCHER Data = {0};469 Data.pNamePrefix = pData->pPdoNamePrefix;470 NTSTATUS Status = vboxUsbObjCheckName(pCurDo, vboxUsbObjDevNamePrefixMatcher, &Data);471 if (!NT_SUCCESS(Status))472 {473 WARN(("vboxUsbObjCheckName failed Status (0x%x)", Status));474 return TRUE;475 }476 477 478 LOG(("prefix match result (%d)", Data.fMatched));479 if ((pData->fFlags & VBOXUSBMONHUBWALK_F_FDO) == VBOXUSBMONHUBWALK_F_FDO)480 {481 LOG(("VBOXUSBMONHUBWALK_F_FDO"));482 if (Data.fMatched)483 {484 LOG(("this is a PDO object, skip it and stop search"));485 /* stop search as we will not find FDO here */486 return FALSE;487 }488 489 LOG(("this is a FDO object, MATCHED!!"));490 }491 else if ((pData->fFlags & VBOXUSBMONHUBWALK_F_PDO) == VBOXUSBMONHUBWALK_F_PDO)492 {493 LOG(("VBOXUSBMONHUBWALK_F_PDO"));494 if (!Data.fMatched)495 {496 LOG(("this is a FDO object, skip it and continue search"));497 /* continue seach since since this could be a nested hub that would have a usbhub-originated PDO */498 return TRUE;499 }500 501 LOG(("this is a PDO object, MATCHED!!"));502 }503 504 }505 else506 {507 LOG(("VBOXUSBMONHUBWALK_F_ALL"));508 LOG(("either PDO or FDO, MATCHED!!"));509 }510 511 /* ensure the dev object is not destroyed */512 ObReferenceObject(pCurDo);513 pData->pDevObj = pCurDo;514 /* we are done */515 return FALSE;516 }517 else518 {519 LOG(("driver object (0x%p) no match", pCurDo->DriverObject));520 if (pCurDo->DriverObject)521 {522 if ( pCurDo->DriverObject->DriverName.Buffer523 && pCurDo->DriverObject->DriverName.Length)524 {525 LOG(("driver name not match, was:"));526 LOG_USTR(&pCurDo->DriverObject->DriverName);527 LOG(("but expected:"));528 LOG_USTR(pData->pDrvName);529 }530 else531 {532 LOG(("driver name is zero, Length(%d), Buffer(0x%p)",533 pCurDo->DriverObject->DriverName.Length, pCurDo->DriverObject->DriverName.Buffer));534 }535 }536 else537 {538 LOG(("driver object is NULL"));539 }540 }541 return TRUE;542 236 } 543 237 … … 583 277 ExFreePool(szwHubList); 584 278 } 585 }586 587 typedef struct VBOXUSBMONFINDHUBWALKER588 {589 PDRIVER_OBJECT pDrvObj;590 } VBOXUSBMONFINDHUBWALKER, *PVBOXUSBMONFINDHUBWALKER;591 592 static DECLCALLBACK(BOOLEAN) vboxUsbMonFindHubDrvObjWalker(PFILE_OBJECT pFile, PDEVICE_OBJECT pTopDo, PDEVICE_OBJECT pHubDo, PVOID pvContext)593 {594 RT_NOREF2(pFile, pTopDo);595 PVBOXUSBMONFINDHUBWALKER pData = (PVBOXUSBMONFINDHUBWALKER)pvContext;596 PDRIVER_OBJECT pDrvObj = pHubDo->DriverObject;597 598 ASSERT_WARN(!pData->pDrvObj, ("pDrvObj expected null on enter, but was(0x%p)", pData->pDrvObj));599 if (pDrvObj)600 {601 LOG(("found driver object 0x%p", pDrvObj));602 ObReferenceObject(pDrvObj);603 pData->pDrvObj = pDrvObj;604 return FALSE;605 }606 607 WARN(("null pDrvObj!"));608 return TRUE;609 }610 611 static PDRIVER_OBJECT vboxUsbMonHookFindHubDrvObj()612 {613 UNICODE_STRING szStandardHubName;614 szStandardHubName.Length = 0;615 szStandardHubName.MaximumLength = 0;616 szStandardHubName.Buffer = 0;617 RtlInitUnicodeString(&szStandardHubName, L"\\Driver\\usbhub");618 619 LOG(("Search USB hub"));620 VBOXUSBMONFINDHUBWALKER Data = {0};621 vboxUsbMonHubDevWalk(vboxUsbMonFindHubDrvObjWalker, &Data, VBOXUSBMONHUBWALK_F_ALL);622 if (Data.pDrvObj)623 LOG(("returning driver object 0x%p", Data.pDrvObj));624 else625 WARN(("no hub driver object found!"));626 return Data.pDrvObj;627 279 } 628 280
Note:
See TracChangeset
for help on using the changeset viewer.