Определение размещения при компиляции
Для того чтобы драйверные процедуры оказались после загрузки в памяти определенного типа, можно использовать директивы указания компилятору #pragma.
#pragma code_seg("INIT") <программный текст> #pragma code_seg()
#pragma code_seg("PAGE") <программный текст> #pragma code_seg()
Здесь первая строка вводит программный код категории INIT. Этот код, подобно сгоревшей ступени ракеты, растворится в небытии сразу по окончании инициализации драйвера (работы драйверной процедуры DriverEntry). Традиции такого кода восходят еще ко временам операционной системы DOS, когда малый размер драйвера был его важнейшим достоинством.
Директива '#pragma code_seg()' восстанавливает правила по умолчанию.
Директива '#pragma code_seg("PAGE")' обеспечивает размещение кода в областях странично организованной памяти.
Все остальные процедуры драйвера размещаются в областях нестранично организованной памяти (действие по умолчанию).
Аналогичным образом директивы компилятора применимы и к сегментам (секциям) данных, см. два примера ниже.
#pragma data_seg("INIT") <описание переменных> #pragma data_seg()
#pragma data_seg("PAGE") <описание переменных> #pragma data_seg()
Другой способ добиться того же самого для отдельных функций, применяя другую форму синтаксиса, представлен ниже.
#ifdef ALLOC_PRAGMA #pragma alloc_text( "INIT", DriverEntry ) #pragma alloc_text( "PAGE", MyUnloadProcedure ) #endif
В приведенном выше фрагменте процедура DriverEntry будет отнесена к категории INIT, а процедура MyUnloadProcedure будет размещена в станичной памяти.