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

Определение размещения при компиляции


Для того чтобы драйверные процедуры оказались после загрузки в памяти определенного типа, можно использовать директивы указания компилятору #pragma.

#pragma code_seg("INIT") &#60программный текст&#62 #pragma code_seg()

#pragma code_seg("PAGE") &#60программный текст&#62 #pragma code_seg()

Здесь первая строка вводит программный код категории INIT. Этот код, подобно сгоревшей ступени ракеты, растворится в небытии сразу по окончании инициализации драйвера (работы драйверной процедуры DriverEntry). Традиции такого кода восходят еще ко временам операционной системы DOS, когда малый размер драйвера был его важнейшим достоинством.

Директива '#pragma code_seg()' восстанавливает правила по умолчанию.

Директива '#pragma code_seg("PAGE")' обеспечивает размещение кода в областях странично организованной памяти.

Все остальные процедуры драйвера размещаются в областях нестранично организованной памяти (действие по умолчанию).

Аналогичным образом директивы компилятора применимы и к сегментам (секциям) данных, см. два примера ниже.

#pragma data_seg("INIT") &#60описание переменных&#62 #pragma data_seg()

#pragma data_seg("PAGE") &#60описание переменных&#62 #pragma data_seg()

Другой способ добиться того же самого для отдельных функций, применяя другую форму синтаксиса, представлен ниже.

#ifdef ALLOC_PRAGMA #pragma alloc_text( "INIT", DriverEntry ) #pragma alloc_text( "PAGE", MyUnloadProcedure ) #endif

В приведенном выше фрагменте процедура DriverEntry будет отнесена к категории INIT, а процедура MyUnloadProcedure будет размещена в станичной памяти.



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