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



Параметры:

• HANDLE hModule — дескриптор (хэндл) нашей dll;

• DWORD ul_reason_for_call — флаг, показывающий, почему была вызвана функция. Может принимать значения:

 • DLL_PROCESS_ATTACH или DLL_THREAD_ATTACH — библиотека подключается к процессу;

 • DLL_PROCESS_DETACH или DLL_THREAD_DETACH — библиотека отключается от процесса.

• LPVOID lpReserved – зарезервировано.

Функция DllMain() — единственная функция, которая обязательно должна присутствовать в библиотеке. Остальные функции и переменные добавляет программист в соответствии с решаемой задачей.

В нашем случае dll–библиотека будет экспортировать следующие функции: bool IsDriverPresent(void). Функция будет определять, присутствует ли в системе необходимый драйвер и попытаться подключиться к нему. Если это удастся — функция вернет true, в противном случае — false.

int ReadMem(char data, int len) — чтение данных из памяти устройства. Char* data — буфер для данных, int len — число 32-битных слов для чтения. Функция вернет число прочитанных слов.

int WriteMem(char *data, int len) — аналогична предыдущей; запись данных в память.

int GetMemSize(void) — получить объем доступной памяти устройства. Для того, чтобы функция стала экспортируемой, она должна быть скомпилирована со специальным объявлением типа:

>extern "C" __declspec (dllexport)

Для того, чтобы при каждом объявлении функции не писать эту длинную малопонятную строку, определим ее, как директиву препроцессора:

>#define EXPORT extern "C" __declspec (dllexport)

Теперь перед каждым объявлением функции просто следует писать слово EXPORT. Создадим заголовочный файл нашей dll-библиотеки, в котором перечислим все экспортируемые функции и директивы препроцессора:

>#define EXPORT extern "C" __declspec (dllexport)

>EXPORT int ReadMem(char *data, int len);

>EXPORT int WriteMem(char *data, int len);

>EXPORT int GetMemSize(void);

>EXPORT bool IsDriverPresent(void);

Теперь рассмотрим текст исходного срр–файла библиотеки.

>//В начале идут включения заголовочных файлов:

>#include "stdafx.h" // Основной заголовочный файл MFC

>#include "XDSPInter.h" //Наш заголовочный файл


>//Определим IOCTL-код для нашего драйвера:

>#define XDSPDRV_IOCTL_GETMEMSIZE 0x800


>//Введем переменную, которая будет содержать HANDLE драйвера, возвращаемый

>//вызовом API CreateFile.

>HANDLE hDevice = INVALID_HANDLE_VALUE;


>//Также введем строку со значением символической ссылки на наше устройство:

>char *sLinkName = \\\\.\\XDSPdrvDevice0