2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
USB 2.0 तथा पूर्वयन्त्रेषु बल्क अन्त्यबिन्दुः अन्त्यबिन्दुद्वारा दत्तांशस्य एकं धारा प्रेषयितुं वा प्राप्तुं वा शक्नोति । USB 3.0 उपकरणेषु बल्क अन्त्यबिन्दुः अन्त्यबिन्दुद्वारा बहुविधदत्तांशप्रवाहं प्रेषयितुं प्राप्तुं च समर्थः भवति ।
विण्डोज-मध्ये Microsoft द्वारा प्रदत्तः USB-ड्राइवर-स्टैक् बहुविध-प्रवाह-समर्थनं करोति । एतेन क्लायन्ट् चालकाः USB 3.0 उपकरणे बल्क अन्त्यबिन्दुना सह सम्बद्धं प्रत्येकं धारा प्रति स्वतन्त्रं I/O अनुरोधं प्रेषयितुं समर्थाः भवन्ति, भिन्नधारासु अनुरोधानाम् क्रमाङ्कनं विना
क्लायन्ट् चालकस्य कृते, एकः धारा समानलक्षणसमूहेन सह बहुविधं तार्किकं अन्त्यबिन्दुं प्रतिनिधियति । विशिष्टधारायां अनुरोधं प्रेषयितुं क्लायन्ट् चालकस्य तस्याः धारायां (अन्तबिन्दुस्य पाइप् हन्डलस्य सदृशं) एकं हन्डलस्य आवश्यकता भवति । I/O अनुरोधानाम् स्ट्रीमिंग् कृते URB बल्क अन्त्यबिन्दून् कृते I/O अनुरोधानाम् URB इत्यस्य सदृशम् अस्ति । केवलं भेदः नलीहस्तः एव । धारायां I/O अनुरोधं प्रेषयितुं चालकः धारायां पाइप् हन्डलं निर्दिशति ।
उपकरणविन्यासस्य समये क्लायन्ट् चालकः चयनितविन्यासानुरोधं वैकल्पिकरूपेण चयनित-अन्तरफलक-अनुरोधं च प्रेषयति । एते अनुरोधाः अन्तरफलकस्य क्रियाकलापसेटिंग्स् मध्ये परिभाषितस्य अन्त्यबिन्दुस्य कृते पाइप् हन्डलस्य समुच्चयं पुनः प्राप्नुवन्ति । धारा-जागरूक-अन्तबिन्दुषु, अन्त्यबिन्दु-पाइप्-हन्डलस्य उपयोगः पूर्वनिर्धारित-धारा (प्रथम-धारा) प्रति I/O-अनुरोधं प्रेषयितुं यावत् चालकः धारां न उद्घाटयति तावत् यावत् उपयोक्तुं शक्यते ।
यदि कश्चन क्लायन्ट् चालकः पूर्वनिर्धारितधाराव्यतिरिक्तधाराभ्यः अनुरोधं प्रेषयितुम् इच्छति तर्हि चालकः सर्वेभ्यः धाराभ्यः उद्घाट्य हन्डलं प्राप्तुं अर्हति । एतत् कर्तुं क्लायन्ट् चालकः उद्घाटनीयानां धारानां संख्यां निर्दिश्य मुक्तधारानुरोधं प्रेषयति । क्लायन्ट् चालकस्य स्ट्रीम्स् इत्यस्य उपयोगं समाप्तस्य अनन्तरं चालकः क्लोज् स्ट्रीम अनुरोधं प्रेषयित्वा तान् पिधातुं चयनं कर्तुं शक्नोति ।
कर्नेल् मोड चालकरूपरेखा (KMDF) स्थिरधाराणां समर्थनं मूलतः न करोति । क्लायन्ट् चालकाः धाराः उद्घाटयितुं बन्दं कर्तुं च Windows Driver Model (WDM) इत्यस्य उपयोगं अवश्यं कुर्वन्ति । उपयोक्तृ-विधा चालक-रूपरेखा (UMDF) क्लायन्ट् चालकाः स्थिर-प्रवाह-विशेषतायाः उपयोगं कर्तुं न शक्नुवन्ति ।
निम्नलिखितम् WDM Drivers इति लेबलयुक्तानि कानिचन टिप्पण्यानि भवितुं शक्नुवन्ति । एते निर्देशाः WDM-आधारितस्य USB क्लायन्ट् चालकस्य कृते रूटीन्स् वर्णयन्ति यः स्ट्रीमिंग् अनुरोधं प्रेषयितुम् इच्छति ।
क्लायन्ट् चालकः धाराम् उद्घाटयितुं वा बन्दं कर्तुं वा शक्नोति तस्मात् पूर्वं चालकस्य निम्नलिखितम् अवश्यं भवति:
1. WdfUsbTargetDeviceCreateWithParameters मेथड् आह्वयन्तु । विधिः USBD_CLIENT_CONTRACT_VERSION_602 क्लायन्ट् प्रोटोकॉल संस्करणस्य आवश्यकता अस्ति । एतत् संस्करणं निर्दिश्य क्लायन्ट् चालकेन नियमसमूहस्य पालनम् अवश्यं कर्तव्यम् ।
फ्रेमवर्कस्य USB लक्ष्ययन्त्रवस्तुनः WDFUSBDEVICE हन्डलं पुनः प्राप्तुं आह्वानं कुर्वन्तु । मुक्तधारायां अनन्तरं आह्वानार्थं हन्डलस्य आवश्यकता भवति । सामान्यतया, क्लायन्ट् चालकः चालकस्य EVT_WDF_DEVICE_PREPARE_HARDWARE इवेण्ट् कॉलबैक् रूटीने स्वयमेव पञ्जीकरणं करोति ।
WDM चालकः: USBD_CreateHandle दिनचर्याम् आह्वयन्तु तथा च USB चालक-ढेर-मध्ये चालकेन पञ्जीकृतं USBD-हन्डलं प्राप्नुवन्तु ।
2. उपकरणं विन्यस्तं कृत्वा स्ट्रीमिंग् समर्थयति इति बल्क् अन्त्यबिन्दुस्य कृते WDFUSBPIPE पाइप् हन्डलं प्राप्तवान् । पाइप् हन्डल प्राप्तुं, चयनितविन्यासे अन्तरफलकस्य वर्तमानवैकल्पिकसेटिंग्स् इत्यत्र WdfUsbInterfaceGetConfiguredPipe मेथड् आह्वयन्तु ।
WDM चालकः: चयन-विन्यासः अथवा चयन-अन्तरफलक-अनुरोधं प्रेषयित्वा USBD पाइप्-हन्डलं प्राप्नोति ।
1. WdfUsbTargetDeviceQueryUsbCapability मेथड् आह्वयित्वा निर्धारयन्तु यत् अन्तर्निहितः USB चालक-स्टैक् तथा होस्ट् नियन्त्रकः स्थिर-स्ट्रीमिंग-विशेषतां समर्थयति वा इति। सामान्यतया, क्लायन्ट् चालकाः चालकस्य EVT_WDF_DEVICE_PREPARE_HARDWARE इवेण्ट् कॉलबैक् रूटीने रूटीन् आह्वयन्ति ।
WDM चालकः: USBD_QueryUsbCapability दिनचर्याम् आह्वयति । सामान्यतया, चालकः चालकस्य आरम्भयन्त्रस्य दिनचर्यायां, (IRP_MN_START_DEVICE) उपयोक्तुं कार्यं पृच्छति ।
निम्नलिखितसूचनाः प्रदातव्याः : १.
WDM चालकः: पूर्वस्मिन् आह्वाने पुनः प्राप्तं USBD-हन्डलं USBD_CreateHandle -इत्यत्र पारयन्तु ।
यदि कश्चन क्लायन्ट् चालकः विशिष्टं विशेषतां उपयोक्तुं इच्छति तर्हि चालकेन प्रथमं अन्तर्निहितं USB चालक-स्टैक् पृच्छितव्यं यत् चालक-स्टैक् तथा होस्ट्-नियन्त्रकः विशेषतां समर्थयति वा इति निर्धारयितुं यदि विशेषता समर्थिता अस्ति तर्हि तदा एव चालकः विशेषतायाः उपयोगाय अनुरोधं प्रेषयेत् । कतिपयेषु अनुरोधेषु URBs आवश्यकाः सन्ति, यथा Step 5 मध्ये चर्चा कृता स्ट्रीमिंग् कार्यक्षमता । एतेषां अनुरोधानाम् कृते, फंक्शन् पृच्छितुं URB आवंटयितुं च समानं हन्डलं उपयोक्तुं सुनिश्चितं कुर्वन्तु । यतो हि चालकः स्तम्भः समर्थितविशेषतानां निरीक्षणार्थं हन्डलस्य उपयोगं करोति यत् चालकः उपयोक्तुं शक्नोति ।
उदाहरणार्थं, यदि USBD_HANDLE USBD_CreateHandle इति आह्वयित्वा प्राप्तम् आसीत्, तर्हि USBD_QueryUsbCapability इति आह्वयित्वा चालकस्य स्टैक् इत्यस्य प्रश्नः क्रियते तथा च USBD_UrbAllocate इत्यस्य आह्वानं कृत्वा URB आवंटितं भवति उभयत्र आह्वानयोः समानं USBD_HANDLE पारयन्तु ।
यदि भवान् KMDF मेथड्, WdfUsbTargetDeviceQueryUsbCapability, WdfUsbTargetDeviceCreateUrb च आह्वयति, तर्हि एतेषु मेथड् कॉल् मध्ये फ्रेमवर्क लक्ष्यवस्तुनः कृते समानं WDFUSBDEVICE हन्डलं निर्दिशतु
2. प्रत्यागतस्य NTSTATUS मूल्यस्य मूल्याङ्कनं कुर्वन्तु। यदि दिनचर्या सफलतया सम्पन्नं भवति तर्हि STATUS_SUCCESS प्रत्यागच्छति, स्थिरप्रवाहकार्यक्षमता च समर्थिता भवति । अन्यथा विधिः समुचितं त्रुटिसङ्केतं प्रत्यागच्छति ।
3. उद्घाटनीयानां धारानां संख्यां निर्धारयन्तु। अधिकतमं धारानां संख्या यत् उद्घाटयितुं शक्यते तत् सीमितं भवति :
अधिकतमं प्रवाहसङ्ख्यां निर्धारयितुं, होस्ट् नियन्त्रकेन अन्त्यबिन्दुना च समर्थितयोः मूल्ययोः लघुतरं चिनोतु ।
4. n-तत्त्व USBD_STREAM_INFORMATION संरचनानां सरणी आवंटयन्तु, यत्र n उद्घाटयितुं धारानां संख्या अस्ति । क्लायन्ट् चालकः स्ट्रीम इत्यस्य उपयोगेन चालकस्य कृते अस्य सरणीयाः मुक्तीकरणस्य उत्तरदायी भवति ।
5. WdfUsbTargetDeviceCreateUrb मेथड् आह्वयित्वा मुक्तधारानुरोधाय URB आवंटयन्तु । यदि आह्वानं सफलतया सम्पन्नं भवति तर्हि विधिः WDF स्मृतिवस्तुं USB चालक-स्टैक् द्वारा आवंटितस्य URB संरचनायाः पतां च पुनः प्राप्नोति ।
WDM चालकः: USBD_UrbAllocate दिनचर्याम् आह्वयति ।
6. मुक्तधारा-अनुरोधस्य URB प्रारूपं सेट् कुर्वन्तु । URB अनुरोधं परिभाषितुं _URB_OPEN_STATIC_STREAMS संरचनायाः उपयोगं करोति । URB स्वरूपयितुं भवतः आवश्यकता अस्ति:
URB स्वरूपयितुं, UsbBuildOpenStaticStreamsRequest इति आह्वयन्तु तथा च आवश्यकसूचनाः पैरामीटर् मूल्यरूपेण पारयन्तु । UsbBuildOpenStaticStreamsRequest कृते निर्दिष्टानां धारानां संख्या समर्थितानां धाराणां अधिकतमसंख्यां न अतिक्रमति इति सुनिश्चितं कुर्वन्तु ।
7. WdfRequestSend मेथड् आह्वयन् URB इत्येतत् WDF अनुरोधवस्तुरूपेण प्रेषयन्तु । अनुरोधं समकालिकरूपेण प्रेषयितुं, तस्य स्थाने WdfUsbTargetDeviceSendUrbSynchronously मेथड् आह्वयन्तु ।
WDM चालकः : URB इत्येतत् IRP इत्यनेन सह सम्बद्धं करोति तथा च IRP इत्येतत् USB चालकस्य ढेरं प्रति प्रस्तौति ।
8. अनुरोधस्य समाप्तेः अनन्तरं अनुरोधस्य स्थितिं पश्यन्तु।यदि USB चालक-स्तम्भ-अनुरोधः विफलः भवति तर्हि URB-स्थितौ प्रासंगिकः त्रुटिसङ्केतः भवति ।
यदि अनुरोधस्य स्थितिः (IRP अथवा WDF अनुरोधवस्तु) USBD_STATUS_SUCCESS इति सूचयति तर्हि अनुरोधः सफलतया सम्पन्नः । जाँचः समाप्तः भवति तदा प्राप्तानां USBD_STREAM_INFORMATION संरचनानां सरणी । सरणी अनुरोधितधाराविषये सूचनाभिः पूरिता भवति । USB चालक-ढेरः सरणीयां प्रत्येकं संरचनां धारा-सूचनया सह पूरयति, यथा USBD_PIPE_HANDLE प्राप्तः हन्डलः, धारा-परिचयः, अधिकतमः संख्यात्मकः स्थानान्तरण-आकारः च इदानीं धारा दत्तांशं स्थानान्तरयितुं शक्नोति ।
मुक्तधारा-अनुरोधानाम् कृते URBs, arrays च आवंटितव्यम् । मुक्तधारा-अनुरोधस्य समाप्तेः अनन्तरं, क्लायन्ट्-चालकेन सम्बद्धे WDF-स्मृति-वस्तुनि WdfObjectDelete-विधिं आह्वयित्वा URB मुक्तं कर्तव्यम् । यदि चालकः WdfUsbTargetDeviceSendUrbSynchronously इति आह्वयित्वा अनुरोधं समकालिकरूपेण प्रेषयति तर्हि विधिस्य पुनरागमनानन्तरं WDF स्मृतिवस्तुं मुक्तं भवितुमर्हति । यदि कश्चन क्लायन्ट् चालकः WdfRequestSend इति आह्वानं कृत्वा अतुल्यकालिकरूपेण अनुरोधं प्रेषयति तर्हि चालकेन अनुरोधेन सह सम्बद्धे चालक-कार्यन्वयितसमाप्ति-रूटीने WDF स्मृति-वस्तुं विमोचनीयम्
क्लायन्ट् चालकस्य स्ट्रीम इत्यस्य उपयोगं समाप्तस्य अनन्तरं स्ट्रीम् एरे मुक्तुं शक्यते, अथवा I/O अनुरोधानाम् कृते संग्रहीतुं शक्यते । अधोलिखिते कोड् उदाहरणे चालकः उपकरणसन्दर्भे एकं स्ट्रीम एरे संगृह्णाति । चालकः यन्त्रवस्तुं मुक्तुं पूर्वं यन्त्रसन्दर्भं मुञ्चति ।
विशिष्टधारायां दत्तांशं कथं स्थानान्तरयितुं शक्यते
विशिष्टधारायां दत्तांशस्थापनानुरोधं प्रेषयितुं WDF अनुरोधवस्तु आवश्यकम् अस्ति । सामान्यतया, क्लायन्ट् चालकानां WDF अनुरोधवस्तूनाम् आवंटनस्य आवश्यकता नास्ति । यदा I/O प्रबन्धकः अनुप्रयोगात् अनुरोधं प्राप्नोति तदा I/O प्रबन्धकः अनुरोधाय IRP निर्माति । आईआरपी ढाञ्चेन अवरुद्धम् आसीत् । ततः फ्रेमवर्क् IRP इत्यस्य प्रतिनिधित्वार्थं WDF अनुरोधवस्तुं आवंटयति । तदनन्तरं, फ्रेमवर्क् WDF अनुरोधवस्तुं क्लायन्ट् चालकं प्रति पारयति । ततः क्लायन्ट् चालकः अनुरोधवस्तुं data transfer URB इत्यनेन सह सम्बद्धं कृत्वा USB चालक-स्टैक् प्रति प्रेषयितुं शक्नोति ।
यदि क्लायन्ट् चालकः फ्रेमवर्कतः WDF अनुरोधवस्तुं न प्राप्नोति तथा च अनुरोधं अतुल्यकालिकरूपेण प्रेषयितुम् इच्छति तर्हि चालकेन WdfRequestCreate मेथड् आह्वयन् WDF अनुरोधवस्तु आवंटनीयम् WdfUsbTargetPipeFormatRequestForUrb इति आह्वयित्वा नूतनं वस्तु स्वरूपयन्तु तथा च WdfRequestSend इति आह्वयित्वा अनुरोधं प्रेषयन्तु ।
समकालिकप्रसङ्गे WDF अनुरोधवस्तुं पारयितुं वैकल्पिकम् अस्ति ।
धारायां दत्तांशं स्थानान्तरयितुं URB इत्यस्य उपयोगः अवश्यं करणीयः । URB WdfUsbTargetPipeFormatRequestForUrb इत्येतत् आह्वयित्वा स्वरूपितं भवितुमर्हति ।
स्ट्रीम्स् निम्नलिखित WDF पद्धतीनां समर्थनं न कुर्वन्ति:
निम्नलिखितप्रक्रिया कल्पयति यत् क्लायन्ट् चालकः ढाञ्चात् अनुरोधवस्तुं प्राप्नोति ।
WDM चालकः: USBD_UrbAllocate इति आह्वयित्वा URB आवंटयति तथा च बल्क स्थानान्तरणार्थं स्वरूपयति (_URB_BULK_OR_INTERRUPT_TRANSFER पश्यन्तु) । URB स्वरूपयितुं, भवान् UsbBuildInterruptOrBulkTransferRequest इति आह्वयितुं शक्नोति अथवा URB संरचनां मैन्युअल् रूपेण स्वरूपयितुं शक्नोति । URB इत्यस्य UrbBulkOrInterruptTransfer.PipeHandle सदस्ये स्ट्रीम इत्यस्य हन्डलं निर्दिशन्तु ।
क्लायन्ट् चालकः चालकस्य उपयोगं समाप्तस्य अनन्तरं धाराम् पिधातुं शक्नोति । तथापि स्ट्रीमिंग् अनुरोधस्य बन्दीकरणं वैकल्पिकम् अस्ति । USB चालक-स्तम्भः सर्वाणि धाराः बन्दं करोति यदा धारा सह सम्बद्धः अन्त्यबिन्दुः अविन्यस्तः भवति । वैकल्पिकविन्यासस्य अथवा अन्तरफलकस्य चयनं कुर्वन्, यन्त्रस्य विलोपने इत्यादिषु अन्त्यबिन्दवः अविन्यस्ताः भवन्ति । यदि क्लायन्ट् चालकः भिन्नसङ्ख्यायाः धाराः उद्घाटयितुम् इच्छति तर्हि तया धाराः पिधायितव्याः । एकं निकटधारा अनुरोधं प्रेषयन्तु:
1. WdfUsbTargetDeviceCreateUrb इत्येतत् आह्वयित्वा URB संरचनां आवंटयन्तु ।
2. धारा-अनुरोधं बन्दं कर्तुं URB प्रारूपं सेट् कुर्वन्तु । URB संरचनायाः UrbPipeRequest सदस्यः _URB_PIPE_REQUEST संरचना अस्ति । तस्य सदस्यान् निम्नलिखितरूपेण पूरयन्तु।
3. WdfRequestSend अथवा WdfUsbTargetDeviceSendUrbSynchronously इति आह्वानं कृत्वा URB इत्येतत् WDF अनुरोधरूपेण प्रेषयन्तु।
Close handle क्लायन्ट् चालकेन पूर्वं उद्घाटितानां सर्वेषां धाराणां बन्दीकरणस्य अनुरोधं करोति । क्लायन्ट् चालकः अन्त्यबिन्दौ विशिष्टधाराम् बन्दं कर्तुं अनुरोधानाम् उपयोगं कर्तुं न शक्नोति ।
USB चालकस्य ढेरः प्राप्ते URB इत्यत्र सत्यापनम् करोति । प्रमाणीकरणदोषाणां परिहाराय निम्नलिखितम् कुर्वन्तु ।
यदा कदा, अन्त्यबिन्दुं प्रति अथवा ततः स्थानान्तरणं विफलं भवितुम् अर्हति । एतादृशाः विफलताः अन्त्यबिन्दौ अथवा होस्ट् नियन्त्रके त्रुटिस्थित्याः कारणेन भवितुम् अर्हन्ति, यथा स्थगितस्य अथवा विरामस्य स्थितिः । त्रुटिस्थितिं स्वच्छं कर्तुं क्लायन्ट् चालकः प्रथमं लम्बितस्थापनं रद्दं करोति ततः अन्त्यबिन्दुना सह सम्बद्धं पाइप् पुनः सेट् करोति । लम्बितस्थानांतरणं रद्दीकर्तुं क्लायन्ट् चालकः एबोर्ट् पाइप् अनुरोधं प्रेषयितुं शक्नोति । पाइप् पुनः सेट् कर्तुं क्लायन्ट् चालकेन रीसेट् पाइप् अनुरोधं प्रेषयितव्यम् ।
स्ट्रीमिंग् कृते, बल्क अन्त्यबिन्दुना सह सम्बद्धानां व्यक्तिगतधाराणां कृते abort-pipe तथा reset-pipe अनुरोधाः समर्थिताः न सन्ति । यदि विशिष्टधारापाइप् इत्यत्र स्थानान्तरणं विफलं भवति तर्हि होस्ट् नियन्त्रकः अन्येषां धाराणां कृते अन्येषु सर्वेषु पाइपेषु स्थानान्तरणं स्थगयिष्यति, क्लायन्ट् चालकेन प्रत्येकं धारायां स्थानान्तरणं मैन्युअल् रूपेण रद्दं कर्तव्यम् बल्क अन्त्यबिन्दुं प्रति रीसेट् पाइप-अनुरोधं प्रेषयितुं पाइप-हन्डलम् अस्य अनुरोधस्य कृते, क्लायन्ट् चालकेन _URB_PIPE_REQUEST संरचनायां अन्त्यबिन्दुस्य पाइप-हन्डलं निर्दिष्टं कर्तव्यं तथा च URB फंक्शन् (Hdr.Function) URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL इति सेट् कर्तव्यम् ।
निम्नलिखित कोड उदाहरणं स्ट्रीम कथं उद्घाटयितुं शक्यते इति दर्शयति ।
- NTSTATUS
- OpenStreams (
- _In_ WDFDEVICE Device,
- _In_ WDFUSBPIPE Pipe)
- {
- NTSTATUS status;
- PDEVICE_CONTEXT deviceContext;
- PPIPE_CONTEXT pipeContext;
- USHORT cStreams = 0;
- USBD_PIPE_HANDLE usbdPipeHandle;
- WDFMEMORY urbMemory = NULL;
- PURB urb = NULL;
-
- PAGED_CODE();
-
- deviceContext =GetDeviceContext(Device);
- pipeContext = GetPipeContext (Pipe);
-
- if (deviceContext->MaxStreamsController == 0)
- {
- TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
- "%!FUNC! Static streams are not supported.");
-
- status = STATUS_NOT_SUPPORTED;
- goto Exit;
- }
-
- // If static streams are not supported, number of streams supported is zero.
-
- if (pipeContext->MaxStreamsSupported == 0)
- {
- status = STATUS_DEVICE_CONFIGURATION_ERROR;
-
- TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
- "%!FUNC! Static streams are not supported by the endpoint.");
-
- goto Exit;
- }
-
- // Determine the number of streams to open.
- // Compare the number of streams supported by the endpoint with the
- // number of streams supported by the host controller, and choose the
- // lesser of the two values. The deviceContext->MaxStreams value was
- // obtained in a previous call to WdfUsbTargetDeviceQueryUsbCapability
- // that determined whether or not static streams is supported and
- // retrieved the maximum number of streams supported by the
- // host controller. The device context stores the values for IN and OUT
- // endpoints.
-
- // Allocate an array of USBD_STREAM_INFORMATION structures to store handles to streams.
- // The number of elements in the array is the number of streams to open.
- // The code snippet stores the array in its device context.
-
- cStreams = min(deviceContext->MaxStreamsController, pipeContext->MaxStreamsSupported);
-
- // Allocate an array of streams associated with the IN bulk endpoint
- // This array is released in CloseStreams.
-
- pipeContext->StreamInfo = (PUSBD_STREAM_INFORMATION) ExAllocatePoolWithTag (
- NonPagedPool,
- sizeof (USBD_STREAM_INFORMATION) * cStreams,
- USBCLIENT_TAG);
-
- if (pipeContext->StreamInfo == NULL)
- {
- status = STATUS_INSUFFICIENT_RESOURCES;
-
- TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
- "%!FUNC! Could not allocate stream information array.");
-
- goto Exit;
- }
-
- RtlZeroMemory (pipeContext->StreamInfo,
- sizeof (USBD_STREAM_INFORMATION) * cStreams);
-
- // Get USBD pipe handle from the WDF target pipe object. The client driver received the
- // endpoint pipe handles during device configuration.
-
- usbdPipeHandle = WdfUsbTargetPipeWdmGetPipeHandle (Pipe);
-
- // Allocate an URB for the open streams request.
- // WdfUsbTargetDeviceCreateUrb returns the address of the
- // newly allocated URB and the WDFMemory object that
- // contains the URB.
-
- status = WdfUsbTargetDeviceCreateUrb (
- deviceContext->UsbDevice,
- NULL,
- &urbMemory,
- &urb);
-
- if (status != STATUS_SUCCESS)
- {
- TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
- "%!FUNC! Could not allocate URB for an open-streams request.");
-
- goto Exit;
- }
-
- // Format the URB for the open-streams request.
- // The UsbBuildOpenStaticStreamsRequest inline function formats the URB by specifying the
- // pipe handle to the entire bulk endpoint, number of streams to open, and the array of stream structures.
-
- UsbBuildOpenStaticStreamsRequest (
- urb,
- usbdPipeHandle,
- (USHORT)cStreams,
- pipeContext->StreamInfo);
-
- // Send the request synchronously.
- // Upon completion, the USB driver stack populates the array of with handles to streams.
-
- status = WdfUsbTargetPipeSendUrbSynchronously (
- Pipe,
- NULL,
- NULL,
- urb);
-
- if (status != STATUS_SUCCESS)
- {
- goto Exit;
- }
-
- Exit:
- if (urbMemory)
- {
- WdfObjectDelete (urbMemory);
- }
-
- return status;
- }