Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
[Alleen van toepassing op KMDF]
Stuurprogramma's voor DMA-apparaten moeten soms bufferruimte toewijzen waartoe zowel een apparaat als het stuurprogramma toegang heeft. Een apparaat kan bijvoorbeeld overdrachtsgegevens schrijven, zoals byteaantallen, in deze bufferruimte en het stuurprogramma kan deze lezen om het aantal overgedragen bytes te bepalen. Dit type bufferruimte wordt een gemeenschappelijke buffer genoemd.
Als u een gemeenschappelijke buffer wilt toewijzen, gebruikt u de callback-functie EvtDriverDeviceAdd van uw stuurprogramma:
Roept WdfDmaEnablerCreate aan om een DMA enabler-object te maken.
Roept WdfCommonBufferCreate of WdfCommonBufferCreateWithConfig aan om de buffer te maken.
Roept WdfCommonBufferGetAlignedLogicalAddress aan om het logische adres van de buffer te verkrijgen, waartoe het apparaat toegang heeft.
Roept WdfCommonBufferGetAlignedVirtualAddress aan om het virtuele adres van de buffer te verkrijgen waartoe het stuurprogramma toegang heeft.
Het volgende codevoorbeeld is afkomstig uit het bestand Init.c van het PLX9x5x-voorbeeld . Deze code laat zien hoe een KMDF-stuurprogramma algemene bufferruimte toewijst.
// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize =
sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
DevExt->WriteCommonBufferSize,
WDF_NO_OBJECT_ATTRIBUTES,
&DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
. . . //Error-handling code omitted
}
DevExt->WriteCommonBufferBase =
WdfCommonBufferGetAlignedVirtualAddress(
DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA =
WdfCommonBufferGetAlignedLogicalAddress(
DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);
Als uw stuurprogramma WdfDeviceSetAlignmentRequirement aanroept voordat u WdfDmaEnablerCreate aanroept, worden de buffers die WdfDmaEnablerCreate maakt, afgestemd op de grens van het geheugenadres dat het stuurprogramma heeft opgegeven bij WdfDeviceSetAlignmentRequirement. Anders worden gemeenschappelijke buffers uitgelijnd op woordadresgrenzen. Alternatief kan het stuurprogramma WdfCommonBufferCreateWithConfig aanroepen om een uitlijning voor één buffer op te geven.
Om de lengte te verkrijgen van een gemeenschappelijke buffer die uw stuurprogramma heeft toegewezen, kan het stuurprogramma WdfCommonBufferGetLength aanroepen.
Wanneer het stuurprogramma klaar is met een gemeenschappelijke buffer, roept het stuurprogramma WdfObjectDelete aan.