Использование NuMega DriverStudio для написания WDM-драйверов | страница 37



>  break;

> }

> if (status == STATUS_PENDING)

> // Если драйвер по каким-то причинам отложил обработку запроса, переменной status

> //присваивается значение STATUS_PENDING. Этот код будет возвращен методом

> //DeviceControl.

> {

>  return status;

> } else

> //В противном случае завершаем обработку пакета.

> {

>  return I.PnpComplete(this, status);

> }

>}

Метод XDSPDRV_IOCTL_GETMEMSIZE_Handler является обработчиком IOCTL–кода XDSPDRV_IOCTL_GETMEMSIZE. Получив этот код, драйвер возвращает общий объем памяти устройтсва. Шаблон метода сгенерирован DriverWizard, но программист должен написать практически весь его код.

>NTSTATUS XDSPdrvDevice::XDSPDRV_IOCTL_GETMEMSIZE_Handler(KIrp I) {

> NTSTATUS status = STATUS_SUCCESS;

> t << "Entering XDSPdrvDevice::XDSPDRV_IOCTL_GETMEMSIZE_Handler, " << I << EOL;

> //Количество памяти будет возвращено как число unsigned long. Поэтому определяем

> //указатель на unsigned long.

unsigned long *buf;

> //Получаем указатель на буфер пользователя

buf=(unsigned long*) I.UserBuffer();

> //Записываем туда количество памяти нашего устройства. Получаем его при помощи

> //метода Count объекта m_MainMem.

*buf=m_MainMem.Count();

> //Длина возвращаемых нами данных равна длине числа unsigned long.

I.Information() = sizeof(unsigned long);

> //Возвращаем STATUS_SUCCESS

> return status;

>}

Написание драйвера завершено. Возможно, у Вас сложилось впечатление, что DriverWizard может практически все и написание драйвера — очень простая задача. Но не следует забывать, что наш драйвер — всего-то простейшая демонстрационная программа, которая практически не выполняет никаких полезных действий. Написание реальных драйверов является гораздо более сложной задачей.

Если бы драйвер был написан с использованием пакета DDK, то он бы имел практически ту же структуру и почти тот же код (правда, не объектно-ориентированный). Но в таком случае весь драйвер пришлось бы писать вручную, а DriverWizard генерирует скелет драйвера автоматически. Это сильно облегчает процесс разработки драйвера, позволяя программисту не заботиться о написании скелета драйвера и предохраняя его от возможных ошибок.

2.4 Разработка dll-библиотеки для взаимодействия с драйвером

dll-библиотека (Dynamic Link Library) — программный модуль, который может быть динамически подключен к выполняющемуся процессу. Dll–библиотека может содержать функции и данные. При подключении dll к процессу она отображается на адресное пространство этого процесса.

Если говорить по русски, то это означает: в любой момент времени программа может загрузить dll-библиотеку, получить указатели на функции и данные этой библиотеки. Потом приложение как-то использует функции и данные библиотеки, и когда они больше не нужны — выгружает библиотеку.