Sdílet prostřednictvím


Případová studie: Jak diagnostikovat neznámé zařízení USB pomocí Trasování událostí pro Windows (ETW) a Netmonu

Toto téma obsahuje příklad použití USB ETW a Netmon k řešení potíží se zařízením USB, které Systém Windows nerozpozná.

V tomto příkladu jsme připojili zařízení, které se zobrazilo jako neznámé zařízení ve Správci zařízení a dalších částech uživatelského rozhraní. ID hardwaru bylo USB\UNKNOWN. Abychom mohli dále diagnostikovat, odpojili jsme zařízení, zahájili trasování pro Windows a znovu připojili zařízení. Jakmile se zařízení zobrazilo jako neznámé, zastavili jsme trasování.

Informace o problému s neznámým zařízením

Pokud chcete ladit neznámý problém se zařízením USB, pomůže pochopit, co dělá zásobník ovladačů USB k vytvoření výčtu zařízení, když ho uživatel připojí k systému. Informace o enumeraci USB naleznete v blogovém příspěvku s názvem Jak zásobník USB enumeruje zařízení?

Obvykle když se zásobníku ovladačů USB nepodaří vypsat výčet zařízení, ovladač rozbočovače stále hlásí příchod zařízení do Systému Windows a zařízení USB je označeno jako neznámé zařízení ve Správci zařízení. Zařízení má ID zařízení USB\VID_0000&PID_0000 a ID hardwaru a kompatibilní ID USB\UNKNOWN. Následující události způsobují, že ovladač rozbočovače USB vypíše zařízení USB jako neznámé zařízení:

  • Během výčtu vypršel časový limit požadavku na resetování portu.
  • Požadavek nastavit adresu pro zařízení USB se nezdařil.
  • Požadavek na popisovač zařízení USB selhal.
  • Popisovač zařízení USB byl poškozený a ověření se nezdařilo.
  • Požadavek na popisovač konfigurace se nezdařil.
  • Popisovač konfigurace USB byl poškozený a ověření se nezdařilo.

Ve Windows 7 jsou neidentifikovatelná zařízení, která se nepodaří identifikovat, označena kódem chyby 43 ve Správci zařízení.

Pokud je ve Správci zařízení zařízení označeno kódem chyby 28, zařízení bylo úspěšně rozpoznáno, ale stále je vedené jako neznámé zařízení. Tento kód selhání označuje, že zařízení během výčtu nezadalo řetězec ID produktu a Systém Windows nemohl najít odpovídající inf pro zařízení pro instalaci ovladače.

Spuštění analýzy trasování událostí

Vzhledem k tomu, že se jedná o selhání zařízení, doporučujeme k analýze souboru protokolu použít Netmon s analyzátorem USB.

Zobrazení protokolu trasování událostí

  1. Spusťte příkaz Netmon, klikněte na Soubor –> Otevřít –> Zachytávání a vyberte soubor.

  2. V podokně Souhrn rámce vyberte první událost, která obsahuje popis SystemTrace. Tento obrázek ukazuje, jak obrazovka vypadá, když vyberete první událost.

    Snímek obrazovky s oknem Microsoft Network Monitor po výběru první události

  3. Pokud chcete přizpůsobit sloupce, které netmon zobrazí, klikněte pravým tlačítkem myši na název sloupce a vyberte Zvolit sloupce.

  4. První událost, která je identifikována jako typ SystemTrace, obsahuje obecné informace o protokolu. Rozbalením informačního stromu v podokně Podrobnosti rámce můžete zobrazit informace, jako je počet ztracených událostí a čas zahájení trasování.

Souhrn událostí zařízení USB

Událost 2 je první událost USB v protokolu. Tato událost a několik dalších popisuje řadiče hostitele USB, rozbočovače a zařízení, která byla připojena k systému při zahájení sledování. Tuto skupinu událostí můžeme volat jako souhrnné události zařízení nebo jen souhrnné události. Podobně jako u první události souhrnné události nepopisují aktivitu řidiče. Souhrnné záznamy událostí zaznamenávají stav zařízení na začátku relace protokolování. Jiné události představují něco, co se děje v autobusu, interakce s klientskými ovladači nebo systémem, či změny interního stavu.

Rozbočovač USB i ovladače portu USB zaznamenávají souhrnné události. Ovladač, který protokoloval událost, je identifikován ve sloupci Název protokolu. Například událost protokolovaná ovladačem portu USB má název protokolu USBPort_MicrosoftWindowsUSBPORT. Trasování událostí USB obvykle obsahuje posloupnost souhrnných událostí portu, za kterou následuje posloupnost souhrnných událostí rozbočovače. Mnoho událostí souhrnu portů USB a rozbočovačů USB obsahuje v popisu slova "Informace" nebo "Atributy".

Jak můžete identifikovat konec souhrnných událostí? Pokud na začátku protokolu dojde mezi událostmi rozbočovače USB k významnému přerušení v modelu časového razítka, toto přerušení je pravděpodobně koncem souhrnu zařízení. V opačném případě je první událost portu USB po všech událostech rozbočovače USB pravděpodobně první událostí, která není shrnující. Obrázek 3 na následující stránce ukazuje první neshrnující událost v tomto ukázkovém trasování.

V tomto příkladu nebylo zařízení, které vás zajímá, připojeno k systému při spuštění trasování, takže prozatím můžete přeskočit souhrnné události zařízení.

Snímek obrazovky znázorňující zařízení vybrané v části

Popis události a datový payload

V ukázkovém protokolu je první událostí po souhrnných událostech zařízení událost dokončení USB Hub Wait Wake IRP. Připojili jsme zařízení a hostitelský kontroler nebo rozbočovač se v reakci na to probouzí. Pokud chcete zjistit, která komponenta se probouzí, podívejte se na data události. Data jsou v podokně Podrobnosti rámce, které je znázorněno ve stromové struktuře přibližně v následujícím formátu:

Frame information
ETW event header information
    ETW event descriptor (Constant information about the event ID such
    as error level)
Event payload (Data logged at the time of the event)
    Name of a USB-specific structure
        Structure members and their values (Types: numbers, strings,
        or arrays)
    ...

Rozbalte datovou část pro událost dokončení IRP Čekání na probuzení pro rozbočovač USB a zobrazí se struktura ETW s názvem fid_USBHUB_Hub. Název struktury má následující komponenty:

termín Popis
fid_ Typická předpona pro strukturu USB ETW.
USBHUB_ Indikace, že ovladač rozbočovače USB protokoloval událost.
Zbytek řetězce Název objektu, který popisuje data struktury. Pro tuto událost je to objekt typu Hub.

Ovladač rozbočovače USB používá strukturu fid_USBHUB_Hub k popisu rozbočovače USB. Události, které mají tuto strukturu centra v datové části dat, odkazují na centrum a můžeme identifikovat konkrétní centrum pomocí obsahu struktury. Obrázek 4 znázorňuje podokno Podrobnosti rámce s rozbalenou strukturou fid_USBHUB_Hub, která zobrazuje její pole.

Microsoft Network Monitor – podrobnosti rámce.

Struktura rozbočovače je velmi podobná dvěma dalším strukturám, které se běžně objevují v událostech USB ETW: fid_USBHUB_Device a fid_USBPORT_Device. Pro všechny tři struktury jsou společná následující důležitá pole:

(No improvements necessary, the translation is already optimal.) Popis
fid_idVendor ID dodavatele USB (VID) zařízení
fid_idProduct ID USB produktu zařízení (PID)
fid_PortPath Seznam čísel portů rozbočovače číslovaných od jedné, pomocí kterých je připojeno USB zařízení. Počet čísel portů v seznamu je obsažen v poli PortPathDepth . U rozbočovačů, které jsou kořenovými zařízeními, je tento seznam samé nuly. Pro zařízení USB, které je připojené přímo k portu kořenového rozbočovače, je hodnota v PortPath[0] číslo portu kořenového rozbočovače portu, ke kterému je zařízení připojené.

U zařízení USB připojeného pomocí jednoho nebo více dalších rozbočovačů USB začíná seznam čísel portů rozbočovače s portem kořenového rozbočovače a pokračuje s dalšími rozbočovači (v pořadí vzdálenosti od kořenového rozbočovače). Ignorujte všechny nuly. Například:

Ukázková hodnota Popis
[0, 0, 0, 0, 0, 0] Událost odkazuje na kořenový rozbočovač (port na počítači přímo řízený hostitelským řadičem USB).
[3, 0, 0, 0, 0, 0] Událost odkazuje na rozbočovač nebo zařízení, které je připojené k portu kořenového rozbočovače číslo 3.
[3, 1, 0, 0, 0, 0] Rozbočovač je připojený k portu 3 kořenového rozbočovače. Událost odkazuje na rozbočovač nebo zařízení, které je připojeno k portu 1 tohoto externího rozbočovače.

Měli byste monitorovat cesty portů všech zařízení, která vás zajímají. Při výčtu zařízení jsou VID a PID neznámé a zaprotokolované jako 0. Vid a PID se nezobrazují během některých požadavků na zařízení nízké úrovně, jako je resetování a pozastavení. Tyto požadavky se posílají do centra, do kterého je zařízení připojené.

V našem ukázkovém protokolu má událost dokončení „Čekání na probuzení“ portovou cestu se šesti nulami. Událost označuje akci Wait Wake v kořenovém centru. To je logické kvůli našim akcím: zařízení jsme připojili ke kořenovému portu rozbočovače, takže se kořenový rozbočovač probouzí.

USB Netmon filtry

Pokud máte čas, můžete každou událost prozkoumat v chronologickém pořadí. I v případě zkušeností je obtížné rychle identifikovat důležité události vyhledáním seznamu popisů událostí. Pokud chcete zjistit příčinu neznámého zařízení rychleji, můžete použít funkci filtru Netmon.

Filtr chyb USB

Chcete-li aktivovat filtr chyb USB v nástroji Netmon, klikněte na filtr -> Filtr zobrazení -> Filtr zatížení -> Standardní filtry -> USB -> Chyby rozbočovače USB a potom klepněte na tlačítko Použít v podokně Filtr zobrazení .

Filtr chyb USB zúží seznam událostí pouze na události, které splňují kritéria uvedená v následující tabulce.

Filtrování textu Popis
(USBPort_MicrosoftWindowsUSBUSBPORT A NetEvent.Header.Descriptor.Opcode == 34) Události portu USB, které mají opcode 34, jsou chyby portu.
(USBHub_MicrosoftWindowsUSBUSBHUB a zároveň NetEvent.Header.Descriptor.Opcode == 11) Události rozbočovače USB, které mají operační kód 11, jsou chyby rozbočovače.
(NetEvent.Header.Descriptor.Level == 0x2) Události, které mají úroveň 0x2, jsou obvykle chyby.
(USBHub_MicrosoftWindowsUSBUSBHUB AND NetEvent.Header.Descriptor.Id == 210) Události rozbočovače USB s ID 210 jsou události "Protokolované výjimky rozbočovače USB". Další informace naleznete v tématu Vysvětlení chybových událostí a stavových kódů.

Tento obrázek ukazuje menší množinu událostí, které se zobrazí v podokně Souhrn rámce poté, co byl na trasovací protokol použit filtr chyb USB.

Snímek obrazovky, který znázorňuje sadu událostí v podokně

Pokud chcete zobrazit přehled posloupnosti chyb, můžete krátce zobrazit každou událost chyby. Důležitá pole, která je potřeba sledovat, zahrnují fid_NtStatus, fid_UsbdStatus a fid_DebugText. Další informace naleznete v tématu Vysvětlení chybových událostí a stavových kódů. Pokud chcete filtr vypnout, klikněte v podokně Zobrazit filtr na tlačítko Odebrat.

Vlastní filtry Netmonu

V Netmonu můžete vytvořit vlastní filtry. Nejjednodušší metodou je vytvořit filtr z dat na obrazovce jedním z následujících způsobů:

  • Klikněte pravým tlačítkem myši na pole v podokně Podrobnosti rámce a vyberte Přidat vybranou hodnotu do filtru zobrazení.
  • Klikněte pravým tlačítkem myši na pole v podokně Souhrn rámce a vyberte Přidat [název pole] do zobrazení filtru.

Můžete změnit operátory (například OR, AND a ==) a hodnoty filtru, aby se vytvořily odpovídající výrazy filtru.

Vysvětlení chybových událostí a stavových kódů

V našem příkladu neznámého zařízení má většina výjimek USB rozbočovače data fid_DebugText typu CreateDeviceFailure. Není jasné, jak závažná je výjimka, ale ladicí text poskytuje nápovědu k příčině: operace související s novým zařízením selhala. Prozatím předpokládejme, že sousední události Create Device Failed jsou redundantní. Poslední dvě výjimky jsou CreateDeviceFailure_Popup a GenErr_UserIoctlFailed. Automatická vyskakovací chyba zní jako chyba, která se uživateli zobrazila, ale jakákoli z těchto chyb může souviset s neznámým problémem zařízení.

Chybové události USB a další události mají v datech hodnoty stavu, které poskytují cenné informace o problému. Informace o stavových hodnotách najdete využitím zdrojů v následující tabulce.

Typ stavu Zdroj
fid_NtStatus Viz hodnoty NTSTATUS.
Pole stavu bloku žádosti USB (URB) nebo fid_UsbdStatus Vyhledejte hodnotu jako USBD_STATUS ve složce inc\api\usb.h v sadě Windows Driver Kit (WDK). Můžete také použít USBD_STATUS. Toto téma obsahuje symbolické názvy a významy hodnot USBD_STATUS.

Čtení zpětného čtení z událostí problému

Události, které jsou zaznamenány před událostmi chyby, mohou poskytnout důležité informace o příčině chyby. Měli byste se podívat na události, které jsou zaprotokolovány před chybami a pokusit se zjistit původní příčinu neznámého zařízení. V tomto příkladu se začněte dívat zpět z události CreateDeviceFailure_Popup, druhou až poslední výjimku. Tuto událost vyberte, když je povolený filtr chyb USB, a potom klepněte na tlačítko Odebrat v podokně Filtr zobrazení . Filtr chyb USB se stále zobrazuje v podokně Filtr zobrazení a můžete ho později znovu použít. Teď je ale filtr zakázaný a v podokně Souhrn rámce se zobrazí všechny události, jak je znázorněno na tomto obrázku.

monitor sítě Microsoft.

Dvě události, které jsou protokolovány těsně před událostí CreateDeviceFailure_Popup, jsou Odeslání a Dokončení přenosu řízení USB. Pole fid_USBPORT_Device cesta k portu je pro obě události nula, což značí, že cílem přenosu je kořenové centrum. V fid_USBPORT_URB_CONTROL_TRANSFER struktuře události dokončení je stav nula (USBD_STATUS_SUCCESS), což značí, že přenos byl úspěšný. Pokračujte ve zkoumání předchozích událostí.

Další dvě předchozí události jsou čtvrtou (konečnou) událostí Create Device Failed a čtvrtou (konečnou) výjimkou CreateDeviceFailure, kterou jsme prozkoumali dříve.

Další předchozí událostí je Ukončení koncového bodu. Tato událost znamená, že koncový bod už není použitelný. Data události popisují zařízení i koncový bod na tomto zařízení. Cesta portu zařízení je [1, 0, 0, 0, 0, 0]. Systém, na kterém jsme spustili sledování, má pouze řadiče hostitele (kořenové rozbočovače) a zařízení, které jsme připojili, proto tato cesta k portu nepředstavuje rozbočovač. Uzavřený koncový bod musí být na tom jediném zařízení, které jsme připojili, a teď víme, že jeho cesta je 1. Je pravděpodobné, že ovladače znesnadnily přístup ke koncovému bodu zařízení kvůli problému, který se objevil dříve. Pokračujte ve zkoumání předchozích událostí.

Další předchozí událost je dokončený přenos řízení USB. Data události ukazují, že cílem přenosu je zařízení (cesta portu je 1). Struktura fid_USBPORT_Endpoint_Descriptor označuje, že adresa koncového bodu je 0, takže se jedná o výchozí řídicí koncový bod definovaný usb. Stav URB je 0xC0000004. Vzhledem k tomu, že stav není nula, převod pravděpodobně nebyl úspěšný. Další podrobnosti o této hodnotě USBD_STATUS naleznete v tématu usb.h a vysvětlení událostí chyb a stavových kódů.

#define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L)

Význam: Zařízení vrátilo identifikátor paketu pozastavení. Jaký požadavek byl zastaven koncovým bodem? Další data zaprotokolovaná pro událost značí, že požadavek byl standardním požadavkem na řízení zařízení. Tady je analyzovaný požadavek:

  Frame: Number = 184, Captured Frame Length = 252, MediaType = NetEvent
+ NetEvent:
- MicrosoftWindowsUSBUSBPORT: Complete Internal URB_FUNCTION_CONTROL_TRANSFER
  - USBPORT_ETW_EVENT_COMPLETE_INTERNAL_URB_FUNCTION_CONTROL_TRANSFER: Complete Internal URB_FUNCTION_CONTROL_TRANSFER
   + fid_USBPORT_HC:
   + fid_USBPORT_Device:
   + fid_USBPORT_Endpoint:
   + fid_USBPORT_Endpoint_Descriptor:
   + fid_URB_Ptr: 0x84539008
   - ControlTransfer:
    + Urb: Status = 0xc0000004, Flags 0x3, Length = 0
    - SetupPacket: GET_DESCRIPTOR
     + bmRequestType: (Standard request) 0x80
       bRequest: (6) GET_DESCRIPTOR
       Value_DescriptorIndex: 0 (0x0)
       Value_DescriptorType: (1) DEVICE
       _wIndex: 0 (0x0)
       wLength: 64 (0x40)

Zkombinujte bRequest (GET_DESCRIPTOR) s Value_DescriptorType (DEVICE) a můžete určit, že požadavek byl popisovač get-device.

Aby výčet USB pokračoval, mělo by zařízení odpovědět na tuto žádost pomocí popisovače zařízení. Místo toho zařízení zastavilo požadavek, což způsobilo selhání výčtu. Proto všechna čtyři selhání při vytváření zařízení byla způsobena pozastavenými požadavky na popisovač zařízení. Zjistili jste, že zařízení je neznámé, protože výčet selhal a tento výčet selhal, protože zařízení nedokončilo požadavek na popisovač zařízení.