Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Применимо только к KMDF]
Драйверы для устройств DMA иногда должны выделять буферное пространство, к которому может получить доступ как устройство, так и драйвер. Например, устройство может записывать сведения о передаче, такие как количество байтов, в это буферное пространство, и драйвер может считывать его, чтобы определить количество переданных байтов. Этот тип буферного пространства называется общим буфером.
Чтобы выделить общий буфер, используйте функцию обратного вызова драйвера EvtDriverDeviceAdd.
Вызывает WdfDmaEnablerCreate для создания объекта для включения DMA.
Вызывает WdfCommonBufferCreate или WdfCommonBufferCreateWithConfig для создания буфера.
Вызывает WdfCommonBufferGetAlignedLogicalAddress для получения логического адреса буфера, к которому устройство может получить доступ.
Вызывает WdfCommonBufferGetAlignedVirtualAddress, чтобы получить виртуальный адрес буфера, к которому драйвер может получить доступ.
Следующий пример кода взят из файла Init.c образца PLX9x5x. В этом коде показано, как драйвер KMDF выделяет общее буферное пространство.
// 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);
Если ваш драйвер вызовет WdfDeviceSetAlignmentRequirement перед вызовом WdfDmaEnablerCreate, то буферы, созданные WdfDmaEnablerCreate, будут выровнены по границе адреса памяти, которую драйвер указал в WdfDeviceSetAlignmentRequirement. В противном случае общие буферы выровнены по границам адреса слова. Кроме того, драйвер может вызывать WdfCommonBufferCreateWithConfig, чтобы указать выравнивание для одного буфера.
Чтобы получить длину общего буфера, выделенного драйвером, драйвер может вызвать WdfCommonBufferGetLength.
Когда драйвер завершит работу с общим буфером, драйвер вызывает WdfObjectDelete.