#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 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); //Вернуть количество прочитанных слов.
}
//Внешняя функция, производящая запись в память. Практически аналогична
//предыдущей.