Вход/Регистрация
Использование NuMega DriverStudio для написания WDM-драйверов
вернуться

Тарво Александр

Шрифт:

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 IsDriverPresent(void) {

 //Попытаемся открыть хэндл драйвера

 hDevice=OpenByName;

 if (hDevice == INVALID_HANDLE_VALUE)

//неудача

return(false);

 else

//Успех.

return(true);

};

//Внешняя функция, производящая чтение памяти устройства. Char* data – буфер для

//данных, int len – число 32-битных слов для чтения. Функция вернет число

//прочитанных слов.

EXPORT int ReadMem(char *data, int len) {

 unsigned long rd=0; //Количество прочитанных слов

 ReadFile(hDevice, data, len, &rd, NULL); //Системный вызов чтения данных из

//файла. В данном случае – из нашего устройства

//len – количество запрашиваемых слов

//rd – количество прочитанных слов.

 data[len*4+1]=0; //Установить последний байт в 0 – признак конца строки.

 return(rd); //Вернуть количество прочитанных слов.

}

//Внешняя функция, производящая запись в память. Практически аналогична

//предыдущей.

EXPORT int WriteMem(char *data, int len) {

 unsigned long nWritten=0;

 WriteFile(hDevice, data, len, &nWritten, NULL);

//len – количество запрашиваемых слов

//nWritten – количество прочитанных слов.

 return nWritten;

}

//Эта функция возвращает количество памяти устройства, байт.

EXPORT int GetMemSize(void) {

 CHAR bufInput[4]; // Это пустой входной буфер, который будет

//передан устройсву

 unsigned long bufOutput; //Буфер, куда драйвер запишет результат.

  • Читать дальше
  • 1
  • ...
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: