Функция WdfDeviceSetAlignmentRequirement (wdfdevice.h)
[Относится только к KMDF]
Метод WdfDeviceSetAlignmentRequirement регистрирует предпочтительное выравнивание адресов драйвера для буферов данных, которые устройство использует во время операций передачи памяти.
Синтаксис
void WdfDeviceSetAlignmentRequirement(
[in] WDFDEVICE Device,
[in] ULONG AlignmentRequirement
);
Параметры
[in] Device
Дескриптор объекта устройства платформы.
[in] AlignmentRequirement
Аппаратно-зависимое требование выравнивания для буфера данных. Это значение должно быть на один меньше границы выравнивания. Например, можно указать 15 для 16-байтовой границы выравнивания и 31 для 32-байтовой границы. Можно также использовать одну из констант FILE_Xxxx_ALIGNMENT которые определены в Wdm.h, например:
//
// Define alignment requirement values
//
#define FILE_BYTE_ALIGNMENT 0x00000000
#define FILE_WORD_ALIGNMENT 0x00000001
#define FILE_LONG_ALIGNMENT 0x00000003
#define FILE_QUAD_ALIGNMENT 0x00000007
#define FILE_OCTA_ALIGNMENT 0x0000000f
#define FILE_32_BYTE_ALIGNMENT 0x0000001f
#define FILE_64_BYTE_ALIGNMENT 0x0000003f
#define FILE_128_BYTE_ALIGNMENT 0x0000007f
#define FILE_256_BYTE_ALIGNMENT 0x000000ff
#define FILE_512_BYTE_ALIGNMENT 0x000001ff
Возвращаемое значение
None
Remarks
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Драйвер, использующий прямой ввод-вывод, может вызвать WdfDeviceSetAlignmentRequirement , чтобы зарегистрировать предпочтительное требование выравнивания. Выравнивание применяется к запросам ввода-вывода, которые проходят через диспетчер ввода-вывода, а не к тем, которые отправляются вашему драйверу из другого драйвера, который вызывает IoCallDriver.
Так как диспетчер ввода-вывода не всегда использует запрошенное выравнивание, драйвер должен быть подготовлен к несровненным буферам.
Драйвер может вызвать WdfDeviceGetAlignmentRequirement , чтобы получить текущее значение для требования к выравниванию устройства.
Диспетчер ввода-вывода задает значение требования к выравниванию для устройства, когда драйвер вызывает WdfDeviceCreate. Дополнительные сведения о значении требования к выравниванию устройства и о том, когда драйвер должен изменить это значение, см. в разделе Инициализация объекта устройства документации по WDM.
Если драйвер задает требование выравнивания, превышающее размер страницы компьютера (PAGE_SIZE), логические адреса, возвращаемые методом WdfCommonBufferGetAlignedLogicalAddress , всегда соответствуют указанному требованию выравнивания, но виртуальные адреса, возвращаемые методом WdfCommonBufferGetAlignedVirtualAddress , могут быть не согласованы с требованиями выравнивания.
Если драйвер задает требование выравнивания, которое меньше размера страницы компьютера, все логические и виртуальные адреса выравниваются в соответствии с указанным требованием выравнивания.
Дополнительные сведения о вызове WdfDeviceSetAlignmentRequirement см. в разделе Включение транзакций DMA и использование общих буферов.
Примеры
Следующий пример кода получен из примера драйвера AMCC5933 . В этом примере проверяется текущее требование к выравниванию устройства и при необходимости устанавливается новое значение. Обратите внимание, что точное значение выравнивания зависит от оборудования.
ULONG alignReq;
alignReq = WdfDeviceGetAlignmentRequirement(device);
if (alignReq < AMCC5933_ALIGNMENT__32BITS) {
//
// Set the S5933 alignment requirement to a new value.
//
WdfDeviceSetAlignmentRequirement(
device,
AMCC5933_ALIGNMENT__32BITS
);
}
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Верхняя часть | wdfdevice.h (включая Wdf.h) |
Библиотека | Wdf01000.sys (см. раздел Управление версиями библиотеки Платформы). |
IRQL | <= DISPATCH_LEVEL |
Правила соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |
См. также раздел
WdfCommonBufferGetAlignedLogicalAddress