Technology sharing

Windows USB fabrica coegi evolutionis-processus static fluenta batch transfero

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.

necessarias

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.

Quomodo static aperire amnis

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:

  • Manubrium in USB fabrica objecti receptae in priore vocatione ad WdfUsbTargetDeviceCreateWithParameters, usus est ad subcriptio exactoris clientis.

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.

  • GUID attributus GUID_USB_CAPABILITY_STATIC_STREAMS;
  • Indicium ad quiddam output (demonstrando USHORT). Semel completum, quiddam implebitur (maximus enim numerus rivorum) singulis terminus ab hospite moderatoris sustinetur;
  • Longitudo quiddam output, in bytes. Nam fluminum longitudo est sizeof (USHORT);

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;

  • Maximus numerus rivorum ab hospite moderatoris sustentatur. WdfUsbTargetDeviceQueryUsbCapability (accipit WdfUsbTargetDeviceQueryUsbCapabilityUSBD_QueryUsbCapability) in RECENS-exitu quiddam suppleverunt. Acervus USB agitator ab Microsoft provisum sustinet usque ad rivos 255. WdfUsbTargetDeviceQueryUsbCapability hunc modum in rationem accipit cum numerum rivorum computandum. Modus numquam reddit valorem maiorem 255 .
  • Maximus numerus rivorum endpoint in fabrica sustinetur. Ut hunc numerum consequamur, finem descriptor (in Usbspec.h) pro USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR reprehendo. Ad finem destoris comitem obtinendum, descriptor conformatio parsed debet. Ut descriptor configurationem obtineat, clientis exactoris modum WdfUsbTargetDeviceRetrieveConfigDescriptorem vocare debet. Consuetudines adiutores, USBD_ParseConfigurationDescriptorEx et USBD_ParseDescriptor, adhibendae sunt.

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:

  • USBD fistulam ansam monstrans ad terminum. Si obiectum fistulae WDF est, tractare fistulam USBD, vocando modum WdfUsbTargetPipeWdmGetPipeHandle, licebit.
  • In gradum creata IV (amnis ordinata)
  • Regula ad URB structuram in creatum (gradum 5).

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;

  • WdfUsbTargetPipeFormatRequestForRead
  • WdfUsbTargetPipeFormatRequestForWrite
  • WdfUsbTargetPipeReadSynchronously
  • WdfUsbTargetPipeWriteSynchronously

Sequens processum induit ut clientis agitator petitionem obiecti a compage acceperit.

  1. Veniat URB vocando WdfUsbTargetDeviceCreateUrb. Haec methodus objectum memoriae WDF allatit quo nuper partita URB est. Coegi clientes eligere possunt unam petitionem URB pro unoquoque I/O collocare, vel URB collocare et eo uti ad eiusdem generis petitiones.
  2. Forma translationis URB ad molem vocando UsbBuildInterruptOrBulkTransferRequest. In PipeHandle parametri, ansam fluvii denota. Fluminis manubrium in petitione praecedenti obtinetur, de quo in sectione Fluminis Static Aperire.
  3. Forma petendi WDF objectum modum vocandi WdfUsbTargetPipeFormatRequestForUrb. In vocatione, objectum memoriae WDF denota continens notitia translationis URB. Memoriam objecti gradus 1 partita erat.
  4. URB mitte ut petitionem WDF vocando WdfRequestSend vel WdfUsbTargetPipeSendUrbSynchronously. Si WdfRequestSend vocas, exercitationis complementum denotare debes vocando WdfRequestSetCompletionRoutine ut clientis agitator notificari possit cum operatio asynchrona perficiat. Data translatio URB dimitti debet in exercitatione complementi.

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.

Quam claudere amnis stabilis

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:

  • Requiritur Hdr membrum ab URB_FUNCTION_CLOSE_STATIC_STREAMS_URB_PIPE_REQUEST
  • Membrum PipeHandle manubrium esse debet in quo terminus punctus qui rivum aperire solebat.

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.

Optima exercitia pro mittendo static effusis petitionibus

USB acervus exactoris facit verificationem in URB receptum. Ad sanationem errorum vitandam, haec sequuntur;

  • Noli emittere rivum apertum neque prope rivum petitiones fines qui rivos non sustinent. Voca WDM agitatoris WdfUsbTargetDeviceQueryUsbCapability (, USBD_QueryUsbCapability) ad stabilis effusis subsidia determinare atque tantum petitiones effusis mittere si terminus suffragatur.
  • Noli plures rivos petere quam numerus maximus rivorum sustentatur, vel petitionem mittat sine numero fluminum determinato. Numerus rivorum determinatur secundum numerum rivorum ab USB acervo agitatori sustinentis et in fabrica designationis.
  • Noli rivum apertum petere ad terminum qui iam rivum apertum habet.
  • Noli tendere rivum arctum petentibus ad terminum qui rivum apertum non habet.
  • Postquam static fluentum propter terminum aperis, petitiones I/O non mitto per ansam fistulae ultimi per electam configurationem vel petitionem instrumenti selectae impetratae. Hoc verum est etiam si amnis static clauditur.
Reset et abort operationes pipeline

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.

Complete exemplum

Sequentis codicis exemplum demonstrat aperire rivum.

  1. NTSTATUS
  2. OpenStreams (
  3. _In_ WDFDEVICE Device,
  4. _In_ WDFUSBPIPE Pipe)
  5. {
  6. NTSTATUS status;
  7. PDEVICE_CONTEXT deviceContext;
  8. PPIPE_CONTEXT pipeContext;
  9. USHORT cStreams = 0;
  10. USBD_PIPE_HANDLE usbdPipeHandle;
  11. WDFMEMORY urbMemory = NULL;
  12. PURB urb = NULL;
  13. PAGED_CODE();
  14. deviceContext =GetDeviceContext(Device);
  15. pipeContext = GetPipeContext (Pipe);
  16. if (deviceContext->MaxStreamsController == 0)
  17. {
  18. TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
  19. "%!FUNC! Static streams are not supported.");
  20. status = STATUS_NOT_SUPPORTED;
  21. goto Exit;
  22. }
  23. // If static streams are not supported, number of streams supported is zero.
  24. if (pipeContext->MaxStreamsSupported == 0)
  25. {
  26. status = STATUS_DEVICE_CONFIGURATION_ERROR;
  27. TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
  28. "%!FUNC! Static streams are not supported by the endpoint.");
  29. goto Exit;
  30. }
  31. // Determine the number of streams to open.
  32. // Compare the number of streams supported by the endpoint with the
  33. // number of streams supported by the host controller, and choose the
  34. // lesser of the two values. The deviceContext->MaxStreams value was
  35. // obtained in a previous call to WdfUsbTargetDeviceQueryUsbCapability
  36. // that determined whether or not static streams is supported and
  37. // retrieved the maximum number of streams supported by the
  38. // host controller. The device context stores the values for IN and OUT
  39. // endpoints.
  40. // Allocate an array of USBD_STREAM_INFORMATION structures to store handles to streams.
  41. // The number of elements in the array is the number of streams to open.
  42. // The code snippet stores the array in its device context.
  43. cStreams = min(deviceContext->MaxStreamsController, pipeContext->MaxStreamsSupported);
  44. // Allocate an array of streams associated with the IN bulk endpoint
  45. // This array is released in CloseStreams.
  46. pipeContext->StreamInfo = (PUSBD_STREAM_INFORMATION) ExAllocatePoolWithTag (
  47. NonPagedPool,
  48. sizeof (USBD_STREAM_INFORMATION) * cStreams,
  49. USBCLIENT_TAG);
  50. if (pipeContext->StreamInfo == NULL)
  51. {
  52. status = STATUS_INSUFFICIENT_RESOURCES;
  53. TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
  54. "%!FUNC! Could not allocate stream information array.");
  55. goto Exit;
  56. }
  57. RtlZeroMemory (pipeContext->StreamInfo,
  58. sizeof (USBD_STREAM_INFORMATION) * cStreams);
  59. // Get USBD pipe handle from the WDF target pipe object. The client driver received the
  60. // endpoint pipe handles during device configuration.
  61. usbdPipeHandle = WdfUsbTargetPipeWdmGetPipeHandle (Pipe);
  62. // Allocate an URB for the open streams request.
  63. // WdfUsbTargetDeviceCreateUrb returns the address of the
  64. // newly allocated URB and the WDFMemory object that
  65. // contains the URB.
  66. status = WdfUsbTargetDeviceCreateUrb (
  67. deviceContext->UsbDevice,
  68. NULL,
  69. &urbMemory,
  70. &urb);
  71. if (status != STATUS_SUCCESS)
  72. {
  73. TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICE,
  74. "%!FUNC! Could not allocate URB for an open-streams request.");
  75. goto Exit;
  76. }
  77. // Format the URB for the open-streams request.
  78. // The UsbBuildOpenStaticStreamsRequest inline function formats the URB by specifying the
  79. // pipe handle to the entire bulk endpoint, number of streams to open, and the array of stream structures.
  80. UsbBuildOpenStaticStreamsRequest (
  81. urb,
  82. usbdPipeHandle,
  83. (USHORT)cStreams,
  84. pipeContext->StreamInfo);
  85. // Send the request synchronously.
  86. // Upon completion, the USB driver stack populates the array of with handles to streams.
  87. status = WdfUsbTargetPipeSendUrbSynchronously (
  88. Pipe,
  89. NULL,
  90. NULL,
  91. urb);
  92. if (status != STATUS_SUCCESS)
  93. {
  94. goto Exit;
  95. }
  96. Exit:
  97. if (urbMemory)
  98. {
  99. WdfObjectDelete (urbMemory);
  100. }
  101. return status;
  102. }