Библиотека knigago >> Компьютеры и Интернет >> Программы >> Использование NuMega DriverStudio для написания WDM-драйверов


СЛУЧАЙНЫЙ КОММЕНТАРИЙ

# 2437, книга: Сердце иллюзий
автор: Даниил Аллександрович Стулишенко

Йоу, ребят! Я только что закончил читать "Сердце иллюзий" от Даниила Стулишенко, и, чувак, это была дичь! Я люблю крутые приключения, а в этой книге их было завались. Героиня, какая-то девочка по имени Арина, оказалась в волшебном королевстве, где чёрта с два понимаешь, что происходит. И эти монстры... Ух, я бы себе в штаны наложил, если бы оказался их. Но тут и приколы были. Типа, там есть этот чувак, Крюк, который постоянно ловит Арину и пытается её пришить. Но Арина - не промах,...

СЛУЧАЙНАЯ КНИГА

СЛУЧАЙНАЯ КНИГА

Лобовая атака. Sierra XR
- Лобовая атака

Жанр: Фэнтези: прочее

Серия: sierra_xr_lobovaya_ataka

Александр Тарво - Использование NuMega DriverStudio для написания WDM-драйверов

Использование NuMega DriverStudio для написания WDM-драйверов
Книга - Использование NuMega DriverStudio для написания WDM-драйверов.  Александр Тарво  - прочитать полностью в библиотеке КнигаГо
Название:
Использование NuMega DriverStudio для написания WDM-драйверов
Александр Тарво

Жанр:

Программы

Изадано в серии:

неизвестно

Издательство:

неизвестно

Год издания:

-

ISBN:

неизвестно

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Использование NuMega DriverStudio для написания WDM-драйверов"

Аннотация к этой книге отсутствует.

Читаем онлайн "Использование NuMega DriverStudio для написания WDM-драйверов". [Страница - 24]

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

В нашем случае нам необходимо разработать dll-библиотеку, которая будет предоставлять приложению три функции: чтение памяти, запись в память и получение общего количества памяти устройства. Естественно, dll – библиотеку мы также будем проектировать в среде Visual C++.

Запустите среду VC++ и создайте новый проект с названием XDSPInter. В качестве типа проекта выберите Win32 Dynamic-Link Library. Далее в качестве типа проекта выберите A Simple DLL (простая dll-библиотека). Среда VC++ создаст для Вас пустой проект с одной– единственной функцией DllMain().

Функция DllMain() вызывается при подключении и отключении dll процессом. DllMain() имеет возвращаемое значение BOOL APIENTRY (фактически, она возвращает значение типа BOOL) и три параметра —HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved.

Параметры:

• 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;

//И зарезервируем переменную для хранения объема памяти карточки

UINT dwSize;


//Вспомогательная внутренняя функция OpenByName будет пытаться связаться с

//драйвером.

HANDLE OpenByName(void) {

 // вызов API.

 return CreateFile(sLinkName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,  OPEN_EXISTING, 0, NULL);

 //Функция возвращает NULL, если не удалось подключится к драйверу и хэндл

 //на него в противном случае.

}


//Далее – функция DllMain:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {

 //Определяем, почему была вызвана функция:

 switch (ul_reason_for_call) {

 //Приложение подключает библиотеку. Ничего не делаем.

 case DLL_PROCESS_ATTACH: {

  break;

 }

 case DLL_THREAD_ATTACH: {

  break;

 }

 //Приложение отключает библиотеку.

 case DLL_THREAD_DETACH: {

  //Закрыть хэндл драйвера

  if (hDevice != INVALID_HANDLE_VALUE) CloseHandle(hDevice);

  hDevice = INVALID_HANDLE_VALUE;

  break;

 }

 case DLL_PROCESS_DETACH: {

  //Закрыть хэндл драйвера

  if (hDevice != INVALID_HANDLE_VALUE) CloseHandle(hDevice);

  hDevice = INVALID_HANDLE_VALUE;

  break;

 }

 } //Все операции завершились успешно. Вернем true.

 return TRUE;

}


//Эта внешняя функция будет вызываться приложением, которое захочет установить

//связь с драйвером. Функция вернет true в случае успеха и false при неудаче.

EXPORT bool --">

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.