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



>;

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

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

>}


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