2014-10-04 7 views
6

आप विंडोज़ में एचआईडी डिवाइस से कच्चे डिस्क्रिप्टर डेटा कैसे प्राप्त करते हैं?आप विंडोज़ में यूएसबी एचआईडी डिवाइस से कच्चे डिस्क्रिप्टर डेटा कैसे प्राप्त करते हैं?

पृष्ठभूमि:

मैं Windows में एक HID डिवाइस से निर्माता, उत्पाद का नाम, और सीरियल नंबर प्राप्त करने के लिए की जरूरत है। मैं functions seen here का उपयोग कर उपकरणों तक पहुंचने के लिए hid.dll का उपयोग कर रहा हूं। मेरा सवाल बहुत ही to this one है। मैं कुछ छिपाई उपकरणों से निर्माता स्ट्रिंग और उत्पाद स्ट्रिंग प्राप्त करने में सक्षम हूं, लेकिन अधिकांश डेटा को HidD_GetManufacturerString के साथ झूठी लौटने में विफल रहता है। हालांकि, मुझे पता है कि इन उपकरणों में उनके वर्णनकर्ताओं में स्ट्रिंग जानकारी है क्योंकि मैं इसे using USBTreeView देख पा रहा हूं।

दिलचस्प बात यह है कि यहां तक ​​कि उन डिवाइसों के लिए भी जो निर्माता और उत्पाद नाम लौटाते हैं, hid.dll के माध्यम से जो मूल्य मैं प्राप्त कर रहा हूं, वे उपर्युक्त टूल का उपयोग करके देखे गए मानों से बहुत अलग हैं जो कच्चे डेटा से प्राप्त होते हैं यूएसबी यंत्र।

उदाहरण के लिए, एक 360 नियंत्रक:

Via USB Tree View: 
Device Description  : Xbox 360 Controller for Windows 
Language 0x0409   : "©Microsoft Corporation" 
iProduct     : 0x02 
Language 0x0409   : "Controller" 
iSerialNumber   : 0x03 
Language 0x0409   : "0843806" 

Via hid.dll using HidD_GetManufacturerString, HidD_GetProductString, and HidD_GetSerialNumberString: 
Description    : HID-compliant game controller 
Product     : Controller (XBOX 360 Controller for Windows) 
Manufacturer    : FAILS 
Serial Number   : FAILS 

WinUSB सब पर इन उपकरणों को खोलने के लिए के रूप में वे winusb.sys ड्राइवर का उपयोग नहीं करते इस डेटा पुनः प्राप्त करने में असमर्थ है।

1) मुझे समझ में नहीं आता कि क्यों एचआईडीडी कार्यों द्वारा लौटाए गए मान यूएसबी डिस्क्रिप्टर में मानों से मेल नहीं खाते हैं। 2) मुझे छुपा डिवाइस के लिए कच्चे यूएसबी डिस्क्रिप्टर डेटा तक पहुंचने का कोई तरीका नहीं मिल रहा है क्योंकि मैं WinUSB के साथ उन तक नहीं पहुंच सकता।


संपादित करें 1:

ठीक है, तो मैं HID बारे में कुछ और सीखा है। ऐसा लगता है कि hid.dll के माध्यम से जो डेटा मैं प्राप्त कर रहा हूं वह ड्राइवर-निर्दिष्ट डेटा है, न कि यूएसबी डिवाइस से डेटा आ रहा है। छिपाई यूएसबी के अलावा अन्य परिवहन पर उपकरणों पर भी लागू हो सकती है। तो यह ठीक है। आखिरकार, मैं वास्तव में जानना चाहता हूं कि जब मैं छुपा डिवाइस प्राप्त करता हूं और उसके लिए मैं किस एपीआई का उपयोग करता हूं तो मैं यूएसबी डिवाइस कैसे प्राप्त कर सकता हूं। WinUSB के अलावा जो काम नहीं करता है, केवल एक चीज जो मैं पा सकता हूं कर्नेल-स्तरीय कार्य IOCTL हैं। मुझे नहीं पता कि यह एक सामान्य, गैर व्यवस्थापक अनुप्रयोग के लिए उपयुक्त है या नहीं।

+0

मुझे लगता है कि यूएसबी डिवाइस एचआईडी डिवाइस का अभिभावक होगा (इस तरह यह डिवाइस सिस्टम में कम से कम मेरे सिस्टम पर दिखाई देता है) तो शायद आप CM_Get_Parent और संबंधित कार्यों का उपयोग कर सकते हैं? –

+0

@ हैरीजोहनस्टन टिप के लिए धन्यवाद। दुर्भाग्यवश, माता-पिता हमेशा यूएसबी डिवाइस नहीं होते हैं क्योंकि कुछ छिपाई उपकरण कई स्तरों को घोंसले में घिरे होते हैं। आखिरकार, कुंजी मुख्य कार्य था हालांकि। मैं एक जवाब जोड़ूंगा। – Guavaman

उत्तर

2

मुझे अंत में समाधान मिला। मुख्य समस्या सिर्फ एक एचआईडी डिवाइस को अपने मूल यूएसबी डिवाइस से जोड़ रही थी। मान लिया जाये कि आप पहले से ही HID डिवाइस और इसके लिए SP_DEVINFO_DATA है

:

  1. की गणना सभी USB उपकरणों as seen here इस बुनियादी प्रक्रिया है।
  2. यूएसबी उपकरणों के सभी बच्चों को CM_GetChild और CM_GetSibling के साथ खोजें।
  3. ज्ञात एचआईडी डिवाइस के इंस्टेंस हैंडल (SP_DEVINFO_DATA-> DevInst) की तुलना करें प्रत्येक बच्चे डिवाइस के इंस्टेंस हैंडल के साथ जो सीएम कार्यों द्वारा वापस किया गया था यह निर्धारित करने के लिए कि कौन सा यूएसबी डिवाइस माता-पिता है।
  4. वहां से, आप किसी भी यूएसबी जानकारी को प्राप्त कर सकते हैं जिसमें आप वर्णनकर्ता शामिल कर सकते हैं।
+0

क्या आप यूएसबी डिवाइस नहीं मिलने तक चेन का पालन करने के लिए बार-बार CM_Get_Parent को कॉल नहीं कर सकते हैं? –

+0

@ हैरीजोहनस्टन आप शायद सही हैं। मैंने इसके बारे में नहीं सोचा, मुख्य रूप से क्योंकि जब तक मैं प्रक्रिया के माध्यम से नहीं जाता तब तक मैं यूएसबी डिवाइस और एचआईडी उपकरणों के बीच संबंधों को वास्तव में समझ नहीं पाया। आपको यह भी पहचानने में सक्षम होना चाहिए कि शीर्ष-यूएसबी डिवाइस कौन सा हो सकता है। मुझे लगता है कि जब आप एक हब मारा और -1 जाओ तो आप रुकना चाहते हैं। – Guavaman

+0

"वहां से, आप किसी भी यूएसबी जानकारी को प्राप्त कर सकते हैं जिसमें आप वर्णनकर्ता शामिल कर सकते हैं।" मैं यह समझने की कोशिश कर रहा हूं कि यह कैसे करना है। जब आप पैरेंट यूएसबी डिवाइस कहते हैं, तो क्या इसका मतलब है हब जिस पर छिपा हुआ है? क्योंकि एक बार जब मेरे पास यूएसबी डिवाइस इंस्टेंस हैंडल है, और डिवाइस पथ है, तो मुझे यूएसबी डिस्क्रिप्टर नहीं मिल सकता है। ऐसा प्रतीत होता है कि आपको हब में डिवाइस IoControl को गुजरने और डिस्क्रिप्टर प्राप्त करने के लिए आपके डिवाइस से कनेक्ट होने वाले बंदरगाह को निर्दिष्ट करने की आवश्यकता है। क्या यूएसबी डिवाइस इंस्टेंस हैंडल से इसे प्राप्त करने का कोई और तरीका है? – Malaise

संबंधित मुद्दे