Программирование драйверов Windows

Квалификаторы IN, OUT, OPTIONAL


Еще одним небесполезным элементом украшения программного кода, активно используемого в DDK, являются макроопределения IN, OUT и другие. Как можно увидеть в файле ntdef.h, они не обозначают ровным счетом ничего, но зато повышают наглядность программного кода при его чтении, поскольку сообщают о назначении переменных, рядом с которыми используются. (Поскольку они ничего не значат, что является нетипичным для программирования, то позволим себе применить к ним нетипичный термин "квалификатор", который тоже ничего особенного не обозначает.)

#define IN .......... #define OUT .......... #define OPTIONAL .......... #define CRITICAL

Если обратиться к использованию этих элементов, то можно рассмотреть определение функции RtlZeroMemory, которая может быть использована для обнуления некоторой области виртуальной памяти (обнуляет страничную память на уровнях IRQL только ниже DISPATCH_LEVEL, нестраничную &#8212 на любых), а именно:

VOID RtlZeroMemory(IN VOID UNALIGNED *Destination, IN ULONG Length);

В этом описании квалификатор IN сообщает, что указатель Destination и длина буфера Length являются параметрами, передаваемыми внутрь вызова RtlZeroMemory.

В иных случаях бывают даже сочетания IN OUT, что сигнализирует: через этот параметр вызова информация передается внутрь данного вызова и возвращается обратно. Квалификатор OPTIONAL обозначает необязательные параметры.



Содержание раздела