2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
In USB 2.0 et prioribus machinis, terminus molem unum rivum notitiarum per terminum mittere vel recipere potest. In USB 3.0 machinis, mole finis mittendi et accipiendi multiplex notitia rivorum per terminum potest.
Acervus agitator USB provisum est a Microsoft in Fenestra plures rivos sustinet. Hoc dat clientes coegi mittere independentes I/O petitiones cuiusque amnis cum mole termini in USB 3.0 fabrica, sine petitionibus ad diversos rivos serializing.
Clienti aurigae rivus multiplices rationes logicas cum notarum statutis repraesentat. Petitionem ut ad certum rivum mittat, clientis auriga ansam illi rivulo eget (similis ansa fistulae endecae). URB pro effusis I/O petitionibus similis est URB pro I/O petitiones pro terminis mole. Sola tibia ansa differentia est. Ad rivum peto, auriga fistulam manubrium in flumine denotat.
In fabrica configuratione, clientis agitator electam configurationem postulat et optione interfaciendi petitionem emittit. Hae petitiones ansarum fistularum constitutum recuperare pro terminis definitis in uncinis interfaciei activitatis. Ad fines fluminum conscii, fistulae terminus canalis adhiberi potest petitiones I/O ad defaltam rivum (primum rivum) mittere donec auriga rivum aperit.
Si auriga clientis petitiones rivorum praeter flumen defectus mittere vult, auriga aperire et ad omnes rivos ansas obtinere debet. Ad hoc, cliens auriga emittit petitionem fluminis apertam speciem rivorum ad aperiendum. Postquam clientis agitator rivos usus finivit, auriga potest eligere ad eos claudendos mittendo petitionem proximi fluminis.
Kernel Modus Coegi Framework (KMDF) non sustinet static nativa flumina. Clientes regentes debent uti exemplar Windows Driver (WDM) ad rivos aperiendos et claudendos. User-modus Driver Framework (UMDF) rectoribus clientis static effusis pluma uti non potest.
Sequentia continere possunt nonnulla commenta intitulata WDM Coegi. Hae instructiones describunt consuetudines a WDM-substructio USB agitatoris clientis qui petitiones effusis mittere vult.
Coegi clientis antequam rivum aperire vel claudere potest, auriga debet habere;
1. Voca modum WdfUsbTargetDeviceCreateWithParameters. Ratio clientis protocollum versionis requirit USBD_CLIENT_CONTRACT_VERSION_602. Hanc versionem definiens, clientis exactoris statuto regularum adhaerere debet.
Vocate ad recuperandam WDFUSBDEVICE manubrium compagis scriptor USB scopum fabrica obiecti. Ansa requirenda est ad voca- tionem sequentis ad apertum rivum. De more clientis coegi ipsum in regesta exactoris EVT_WDF_DEVICE_PREPARE_HARDWARE eventum callback exercitationis.
WDM agitator: exercitatione USBD_CreateHandle voca et manubrium USBD descripserunt in acervo exactoris USB.
2. Configuratus fabrica et nactus fistulam WDFUSBPIPE ansam pro mole termino sustinente effusis. Ad fistulam obtinendam, methodum interfaceGet Configuratum in WdfUsbInterfaceGet Configuratum in currenti alternis lectis interfaciei in figura electa.
WDM agitator: obtinet USBD fistulam ansam mittendo selectos configurationis vel selectis-interface petitionem.
1. Decernite an subditae USB acervus exactoris et exercitus moderatoris plumam staticam profluentem sustineat, vocans methodum WdfUsbTargetDeviceQueryUsbCapabilitatis. De more, aurigae clientes vocant consuetudines in EVT_WDF_DEVICE_PREPARE_HARDWARE eventum exactoris exercitatione callback.
WDM exactoris: USBD_QueryUsbCapability exercitatione vocat. Typice munus exactoris querit utendum in exercitatione machinis aurigae (IRP_MN_START_DEVICE).
Praebere sequenti notitia:
WDM exactoris: Transi ansam USBD receptam in vocatione priore ad USBD_CreateHandle.
Si clientis agitator speciali pluma uti volet, auriga primum debet investigare acervum USB coegi subiacentem determinare an ACERVUS exactor et hospes moderatoris plumam sustineat. Si pluma sustinetur, tunc demum auriga petitionem misit ut pluma uteretur. Quaedam petitiones URBs requirunt, ut in V Step. Quas quidem petitiones fac ut eodem ansa quaesitae functioni utantur ac collocant URB. Causa est, quia ACERVUS agitator utitur manubriis ad vestigia conservandarum notarum quibus agitator uti potest.
Exempli gratia, si USBD_HANDLE vocando USBD_CreateHandle adeptus est, acervus auriga queritur appellando USBD_QueryUsbCapability et URB partita appellando USBD_UrbAllocate. Idem USBD_HANDLE in utroque vocat.
Si modos vocas KMDF, WdfUsbTargetDeviceQueryUsbCapability, et WdfUsbTargetDeviceCreateUrb, idem WDFUSBDEVICE tractatum specificare pro objecto scopo compage in his methodis vocat.
2. Censeo NTStatus reditum pretii. Si usus feliciter consummavit, STATUS_SUCCESSUS redditur, et officiatio static profusis sustinetur. Alioquin erroris ratio convenientem reddit codicem.
3. Determinare numerum rivorum aperire. Maximus numerus rivorum qui aperiri possunt limitatur;
Numerus maximus fluit ut determinet, minorem elige ex duobus valoribus, qui ab hospite moderatore et endpoint sustinentur.
4. Collocat aciem n elementi USBD_STREAM_INFORMATION structurarum, ubi n est numerus rivorum ad aperiendum. Cliens agitator author est ad liberandum hunc ordinatam postquam auriga fit utens flumine.
5. Collocare a URB ad petitionem fluminis patentem vocandi modum WdfUsbTargetDeviceCreateUrb. Si vocationem feliciter perficit, modus obiecti memoriae WDF restituit et electronica structurae URB a acervo USB agitatoris partita est.
WDM exactoris: USBD_UrbAllocate exercitatione vocat.
6. Pone URB forma patentis fluminis petitionem. URB _URB_OPEN_STATIC_STREAMS structura utitur ad petitiones definiendas. URB formare, debes:
Ut formare URB, UsbBuildOpenStaticStreamsRequest vocare et requisita indicia pro modulo valores transire. Fac ut numerus rivorum ad UsbBuildOpenStaticStreamsRequest definitus non excedat, maximus rivorum numerus sustinetur.
7. Mitte URB sicut WDF objectum postulationis modum vocando WdfRequestSend. Ut petitionem synchrone mittat, methodum pro WdfUsbTargetDeviceSendUrbSynchronously vocant.
WDM agitator: Associates URB cum IRP et IRP submittit ACERVUS USB exactoris.
8. Peracta petitione, status instantiae retentat.Si USB acervus exactoris postulatio deficit, URB status continet pertinet error codicem.
Si status petitionis (IRP vel WDF rei postulationis) indicat USBD_STATUS_SUCCESS, postulatio feliciter consummata est. Ordinata ex USBD_STREAM_INFORMATION structurarum receptarum cum annotando completum est. Ordo est hominum cum informationibus de flumine rogatus. Acervus USB coegi populares singulas structuras cum informationibus streamum ordinatas, sicut USBD_PIPE_HANDLE accepit manubrium, fluentum identificatorem, et translatio numerica maxima magnitudo. Fluminis nunc trans- data.
Apertum enim amnis petitiones, urbs et vestit collocari necesse est. Post flumen apertum petitionem peracta, clientis agitator URB dimittere debet methodum WdfObjectDelete vocando in obiectum memoriae consociata WDF. Si auriga petitionem synchrone vocat WdfUsbTargetDeviceSendUrbSynchronously mittat, WDF memoria obiecti dimitti debet post modum redit. Si clientis agitator petitionem asynchrone misit vocando WdfRequestSend, auriga debet rem memoriae WDF dimittere in exercitatione exactoris impletae consuetudinis cum petitione coniungitur.
Ordo amnis dimitti potest postquam auriga clientis rivo utendo finivit, vel pro petitionibus I/O condiri potest. In codice exemplum inferius continetur, auriga amnis aciem in contextu contextus reponit. A coegi remittit fabrica contextu priusquam ab object fabrica fabrica.
Quomodo data transferre ad certum stream?
Petitio data translationis ad certum rivum mittendum, postulatum WDF postulatum est. Typice, regentibus clientibus WDF obiectis postulationi non egent. Cum I/O procurator petitionem ab applicatione accipit, I/O procurator IRP ad petitionem creat. IRP compage interceptus. Compages deinde postulatio objecti WDF distribuit ut IRP repraesentaret. Postea, compage petitionem obiecti WDF exactoris clientis transit. Cliens agitator tunc petitionem obiecti coniungi potest cum notitia translationis URB et mitte ad acervum USB exactoris.
Si clientis agitator rem ex compage petentibus WDF non accipit et petitionem asynchrone mittere vult, agitator rem postulationis WDF rogationis WdfRequestCreate methodum collocare debet. Novum obiectum formare, vocando WdfUsbTargetPipeFormatRequestForUrb et rogatum mittet vocando WdfRequestSend.
In synchrono casu transiens WDF postulatio obiecti libitum est.
Data ad rivum transferre, URB utendum est. URB formari debet vocando WdfUsbTargetPipeFormatRequestForUrb.
rivi sequentes WDF methodos non sustinent;
Sequens processum induit ut clientis agitator petitionem obiecti a compage acceperit.
WDM exactoris: Allocet URB vocando USBD_UrbAllocate et format eam ad molem translationis (vide _URB_BULK_OR_INTERRUPT_TRANSFER). Ut formare URB, vocare potes UsbBuildInterruptOrBulkTransferRequest vel manually formare URB structuram. Denota manubrium rivi in UrbBulkOrInterruptTransfer.PipeHandle membrum URB.
Cliens auriga flumen claudere potest postquam exactoris usus est. Sed petitio effusis claudendi libitum est. Acervus USB exactoris omnes rivos claudit cum terminus cum flumine unconfiguratus est. Puncta inconfigurantur, cum alternam configurationem vel interfaciem eligunt, machinam delendo, etc. Si cliens auriga alium numerum rivorum aperire vult, rivulos claudere debet. Prope flumen petitio mittet:
1. collocant URB structuram vocando WdfUsbTargetDeviceCreateUrb.
2. forma URB constitue amnis petitionem claudendi. UrbPipeRequest membrum structurae URB est compages _URB_PIPE_REQUEST. Imple membra sua sic:
3. URB ut petitionem WDF mitte rogando WdfRequestSend vel WdfUsbTargetDeviceSendUrbSynchronously.
Prope ansam petit clausuram omnium fluminum antea a rectore cliente aperto. Cliens exactoris petitionibus uti non potest ad certum flumen in termino claudere.
USB acervus exactoris facit verificationem in URB receptum. Ad sanationem errorum vitandam, haec sequuntur;
Aliquoties transfert vel ab termino deficiet. Huiusmodi defectiones ex errore condiciones circa finem vel exercitum moderatoris causari possunt, ut condicionem claudam vel sistendam. Ad errorem conditionis purgandum, clientis agitator translationem pendentem primum destruit, deinde fistulam cum termino coniungit. Ad translationem pendenti inrita, clientis agitator fistulam abortivam petitionem mittere potest. Ut fistulam retexere, clientis agitator fistulam petitionem retexere debet.
Pro effusis, abortum et fistulae retexere petitiones non sustinentur pro singulis fluminibus quae cum magnitudine termini coniunguntur. Si translatio in fistulam fluvii specifica deficiat, hospes gubernator cessabit translationes in omnibus aliis fistulis pro aliis fluminibus fistulam ansam ut fistulam rete petentibus ad finem quantitatis mittat. Ad petitionem huius, exactoris clientis notare debet fistulam ansam in _URB_PIPE_REQUEST structuram et munus URB (Hdr.Function) ad URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL designare.
Sequentis codicis exemplum demonstrat aperire rivum.
- 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;
- }