2012-01-30 15 views
6

मुझे आश्चर्य है कि अगर कोई भी मदद कर सकता है, तो विशेषज्ञ समस्या का थोड़ा सा।एक कस्टम ड्राइवर के साथ विंडोज यूएसबी कक्षा चालक को बदलें?

मेरे पास एक ऐसा एप्लिकेशन है जिसे कई यूएसबी उपकरणों को पढ़ने और विश्लेषण करने की आवश्यकता है (साथ ही, वे प्रत्येक अलग परीक्षण में नहीं चलते हैं और सिद्धांत में विभिन्न मशीनों पर चल सकते हैं)।

प्रत्येक यूएसबी डिवाइस यूएसबी एचआईडी कक्षा पर आधारित है, और विभिन्न कंपनियों द्वारा निर्मित किया जाता है, इनमें से कोई भी यूएसबी डिवाइस पीसी पर चलाने के लिए डिज़ाइन नहीं किया गया है, लेकिन एक अलग मंच के लिए है, हालांकि प्रयोजनों के लिए उन डिवाइसों का परीक्षण करना जो क्लाइंट ने अनुरोध किया है कि परीक्षण एप्लिकेशन एक पीसी से चलाया जाता है।

कुछ डिवाइस शुरू हो जाएंगे, विंडोज़ द्वारा पहचाने जाएंगे जो विंडोज़ में बने जेनेरिक एचआईडी क्लास ड्राइवर का उपयोग करके उन्हें सही ढंग से शुरू करेंगे और शुरू करेंगे, डिवाइस परीक्षण के लिए डेटा के सही डेटा पैकेट भेजना शुरू कर देंगे।

कुछ डिवाइस शुरू हो जाएंगे, विंडोज़ द्वारा पहचाने जाएंगे जो उन्हें शुरू करने का प्रयास करेंगे, लेकिन उन्हें प्रारंभिक स्थिति में छोड़ने के लिए पूरी तरह से विफल होने में विफल रहेगा। यह ठीक है, क्योंकि मैं वास्तविक प्लेटफ़ॉर्म से प्रारंभिक पैकेट को कैप्चर करने के लिए अपने बीगल प्रोटोकॉल विश्लेषक का उपयोग कर सकता हूं और फिर प्रारंभिक क्रम में शेष पैकेट को दोहराने के लिए LibUSBDotNet लाइब्रेरी का उपयोग कर सकता हूं और उन्हें पैकेट को सही तरीके से भेजने शुरू कर सकता हूं।

मेरी समस्या एक विशेष डिवाइस के साथ है (हालांकि कुछ और हैं जिन्हें मैंने अभी तक परीक्षण नहीं किया है, इसलिए यह संभव है कि उनमें से एक भी एक ही समस्या का प्रदर्शन कर सके)। मुद्दा यह है कि विंडोज एचआईडी क्लास ड्राइवर डिवाइस को पहचानता है और इसे शुरू करने और शुरू करने की कोशिश करता है, यह फैशन के बाद काम करता है और डिवाइस डेटा भेजना शुरू करता है।

समस्या यह है कि भेजा जा रहा डेटा वास्तविक मंच पर भेजा जाता है (जिसमें पूर्ण डेटा का केवल एक सबसेट होता है)। ऐसा लगता है कि विंडोज़ ने डिवाइस को एक अलग मोड में शुरू किया है।

जब मैं अपने पीसी प्रोटोकॉल विश्लेषक का उपयोग कर पीसी और वास्तविक मंच दोनों के प्रारंभिक पैकेट को कैप्चर करता हूं तो मुझे लगता है कि विंडोज कुछ अलग प्रारंभिक पैकेट भेज रहा है। एक बार विंडोज़ ने डिवाइस शुरू करने के बाद सही पैकेट को फिर से भेजने के लिए LibUSBDotNet का उपयोग करना कोई प्रभाव नहीं पड़ता है।

मेरी समस्या यह है कि मुझे मानक एचआईडी क्लास ड्राइवर का उपयोग कर डिवाइस को शुरू करने की कोशिश करने से विंडोज़ को रोकने की जरूरत है, मैंने डिवाइस मैनेजर में ड्राइवर को हटाने का प्रयास किया है, लेकिन यह अभी भी इसे शुरू करता है (और ड्राइवर को जादुई रूप से डिवाइस में पुन: असाइन किया गया है प्रबंधक)। मैं कुछ जांच किया है और वहाँ संभव विकल्प हैं:

  1. जो खिड़कियों विशेष VID को आवंटित करेगा एक विशिष्ट चालक बनाएं/उपकरण की पीआईडी ​​लेकिन कुछ भी नहीं, तो मैं LibUSBDotNet का उपयोग कर सकते है सही भेजने के लिए डिवाइस के लिए प्रारंभिक अनुक्रम मेरे अपने कोड के भीतर से। इस उपकरण के लिए एक उचित ड्राइवर बनाने के लिए

  2. WinUSB की तरह कुछ का उपयोग करें (या संभवतः एक विशिष्ट VID के साथ एक ड्राइवर/पीआईडी ​​द्वारा इस्तेमाल किया जा परिभाषित करेंगे 1.

की तरह एक "मृत" चालक बनाने के लिए विंडोज़ इनबिल्ट यूएसबी एचआईडी क्लास ड्राइवर के वरीयता में खिड़कियां हैं? यदि नहीं तो मैं अपना रास्ता इस मार्ग से नीचे बर्बाद कर दूंगा?

नोट, मेरा मैक समस्या डिवाइस को सही तरीके से शुरू करता है, और मैंने क्लाइंट के सवाल से पूछा है कि क्या एप्लिकेशन मैक के लिए विकसित किया जा सकता है और उनका जवाब केवल विंडोज़ को निराशाजनक था।

मुझे उचित विंडोज ड्राइवर लिखने में कोई अनुभव नहीं है, हालांकि मुझे अपेक्षाकृत कम स्तर पर यूएसबी से बात करने का अनुभव है (इसलिए भाग बहुत ज्यादा चिंता नहीं करता है)। क्या कोई भी कार्रवाई का एक अच्छा तरीका सुझा सकता है (इससे पहले कि मैं संभावित रूप से पीसी के लिए ड्राइवरों को लिखने के लिए जांच कर रहा हूं, यह जांचने के लिए कि मेरे चुने हुए पाठ्यक्रम को खोजने के लिए मुझे क्या चाहिए)।

कोई भी मदद या सुझाव बहुत सराहना की।

धन्यवाद, रिच


जोड़ा नीचे दिए गए सुझावों की कोशिश कर के बाद:

मैं आवश्यक फ़ाइलों को बनाने और उन्हें स्थापित करने के लिए LibUsbDotNet inf विज़ार्ड का उपयोग करने की कोशिश की और यह काम करने के लिए दिखाई दिया - निश्चित रूप से डिवाइस था अब डिवाइस प्रबंधक में libusb-win32 डिवाइस के रूप में दिखाई दे रहा है - छुपा डिवाइस नहीं है और संबंधित ड्राइवर libusb ड्राइवर था। ऐसा करने के बाद भी डिवाइस प्रारंभिक प्रतीत होता है और गलत प्रकार के डेटा पैकेट भेजना शुरू करता है हालांकि अब उन पैकेट को क्लास ड्राइवर द्वारा नियंत्रित नहीं किया जाता है और वे अभी खो गए हैं।

मैं ज़ेडिग में भी आया था जिसमें WinUSB के लिए एक समान इंफ निर्माण विज़ार्ड है और यह बिल्कुल वही परिणाम था।

एक सहयोगी ने सुझाव दिया है कि यह खिड़कियां स्वयं नहीं हो सकती है जो इस मोड में डिवाइस को स्विच कर रही है, बल्कि डिवाइस यह पहचानने के लिए कि यह विंडोज मशीन से जुड़ा हुआ है और स्वयं को इस मोड में स्विच कर रहा है। मुझे संदेह है कि यह मामला है, इस मामले में मैं अटक गया हूं - ग्राहक के साथ एक और बातचीत करने का समय।

सहायता के लिए बहुत धन्यवाद।

+1

क्या आप इस प्रश्न को और संक्षिप्त बना सकते हैं? मुझे संदेह है कि बहुत से लोग यह सब पढ़ेंगे। –

उत्तर

4

आप एक फिल्टर ड्राइवर के रूप में libusb-win32 का उपयोग कर रहे हैं; यानी, HidUsb डिवाइस ड्राइवर को आपके डिवाइस के लिए असाइन और लोड किया गया है, लेकिन फिर libusb-win32 ड्राइवर शीर्ष पर लोड होता है और आपको हार्डवेयर तक अनबन्धित पहुंच प्रदान करता है।

यदि आप एचआईडीयूएसबी (या किसी अन्य क्लास ड्राइवर) को "आपकी ओर से" कोई संचार करने के लिए नहीं चाहते हैं, तो बस अपने हार्डवेयर के साथ डिवाइस ड्राइवर के रूप में libusb-win32 को संबद्ध करें। इसके लिए, आपको एक .INF फ़ाइल को प्रत्येक यूएसबी डिवाइस के वीआईडी ​​/ पीआईडी ​​/ संशोधन के साथ जोड़ना होगा। अगर मुझे सही ढंग से याद है, तो libusb-win32 भी ऐसी .INF फ़ाइलों को उत्पन्न करने के लिए उपयोगिता के साथ आता है।

यदि आप इसे .INF फ़ाइल उदा। PnpUtil.exe (Vista या उच्चतर पर उपलब्ध) के साथ, आप अभी भी उन समस्याओं में भाग ले सकते हैं, हालांकि, सामान्य जेआईडी ड्राइवर से बेहतर मिलान हो, फिर भी छुपा ड्राइवर अभी भी चुना गया है।

जेनेरिक एचआईडी ड्राइवर हार्डवेयर आईडी (जो उच्च प्राथमिकता वाले) से मेल खाता है, तो उनके संगत आईडी (यानी यूएसबी इंटरफ़ेस क्लास द्वारा) से मेल खाता है। हालांकि, विंडोज अन्य पहलुओं को प्राथमिकता दे सकता है, जैसे आपका ड्राइवर हस्ताक्षरित नहीं है। पढ़ें: How Windows Selects Drivers

सौभाग्य से, यहां तक ​​कि उस स्थिति में, एक स्वयं उत्पन्न प्रमाण पत्र के साथ ड्राइवरों पर हस्ताक्षर (का उपयोग CertUtil.exe, MakeCat.exe और SignTool.exe) भी मुश्किल नहीं है।

+0

धन्यवाद, वहां बहुत सारी उपयोगी जानकारी है। हां, मैं एक फ़िल्टर का उपयोग कर रहा हूं जिसे मैंने LibUSBDotNet के माध्यम से इंस्टॉल किया है। मैं एक inf फ़ाइल के माध्यम से सुझाव और स्थापित के रूप में कोशिश करेंगे। मैं आपके सभी सुझावों की जांच करता हूं और आपको बताता हूं कि मैं कैसे चलता हूं। –

+0

उपरोक्त अतिरिक्त टिप्पणी देखें, आपका समाधान काम करता है कि यह कक्षा चालक को लोड होने से रोकता है और कक्षा चालक द्वारा बाद में प्रसंस्करण को रोकता है, दुर्भाग्यवश न्यूनतम डिवाइस को विंडोज़ को डिवाइस की पहचान करने और वैकल्पिक ड्राइवर लोड करने की आवश्यकता होती है, फिर भी समस्या को ट्रिगर करने के लिए पर्याप्त है । हालांकि मदद के लिए धन्यवाद, यह डिवाइस ड्राइवरों आदि के बारे में सीखने में एक बहुत ही उपयोगी अभ्यास रहा है। –

+0

एक साधारण डिवाइस पर, विंडोज केवल एक "डिवाइस डिस्क्रिप्टर प्राप्त करें" और "कॉन्फ़िगरेशन डिस्क्रिप्टर प्राप्त करें" करता है। यदि यह एक समग्र डिवाइस है, तो कुछ और वर्णक प्राप्त किए जाएंगे। किसी भी परिस्थिति में विंडोज़ एंडपॉइंट्स को पढ़/लिखता है या इस चरण में अजीब नियंत्रण अनुरोध करता है। जब आप "वैकल्पिक ड्राइवर" कहते हैं, तो वैकल्पिक ड्राइवर वास्तव में डिवाइस के लिए लोड करता है, और यदि ऐसा है, तो यह कौन सा चालक है? – Ilya