Чтение онлайн

ЖАНРЫ

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

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

Шрифт:

//Вернем неудачу.

success=false;

 } else {

//Библиотека подключена успешно. Импортируем функции.

ReadMem=(MemReadFun)::GetProcAddress(InterDll,"ReadMem");

if (ReadMem==NULL) {

//Не удалось импортировать функцию

AfxMessageBox("Couldn't get adress for ReadMem function from library XDSPInter.dll", MB_ICONERROR | MB_OK);

success=false;

}

WriteMem=(MemReadFun)::GetProcAddress(InterDll,"WriteMem");

if (WriteMem==NULL) {

//Не удалось импортировать функцию

AfxMessageBox("Couldn't get an adress for WriteMem function from library XDSPInter.dll", MB_ICONERROR | MB_OK);

success=false;

}

GetMemSize=(MemSizeFun)::GetProcAddress(InterDll,"GetMemSize");

if (GetMemSize==NULL) {

//Не удалось импортировать функцию AfxMessageBox("Couldn't get an adress for GetMemSize function from library XDSPInter.dll", MB_ICONERROR | MB_OK);

success=false;

}

IsDriverPresent=(IsDrivFun)::GetProcAddress(InterDll,"IsDriverPresent");

if (IsDriverPresent==NULL) {

//Не удалось импортировать функцию

AfxMessageBox("Couldn't get an adress for IsDriverPresent function from library XDSPInter.dll", MB_ICONERROR | MB_OK);

success=false;

}

 }

 return(success);

}

Вызов метода ConnectToDriver целесообразно сделать в конструкторе класса. Там же надо реализовать и проверку, присутствует ли в системе драйвер. Тогда вся необходимая инициализация будет проведена еще при запуске приложения.

CXDSPView::CXDSPView : CFormView(CXDSPView::IDD) {

 //{{AFX_DATA_INIT(CXDSPView)

 //}}AFX_DATA_INIT

 //Здесь мы добавляем свой код. Success – переменная экземпляра. Если она

 //равна true – то ошибок нет, иначе произошла какая-то ошибка.

 success=true;

 //Пробуем подключить dll:

 if (ConnectToDriver) {

//Удалось подключить библиотеку. Теперь пытаемся установить связь с

//драйвером – вызываем функцию в dll:

if (!IsDrvPresent) {

//Неудача

success=false;

AfxMessageBox("Necessary driver isn't present in the system",MB_ICONERROR | MB_OK);

}

 } else

//Не удалось подключиться к dll.

success=false;

}

Метод, производящий чтение памяти устройства может выглядеть следующим образом:

void CXDSPView::OnRead {

 int res; //Количество слов, прочитанных из памяти

res=(*ReadMem)(dt,256); //Пытаемся читать 256 слов.

 m_buff.SetWindowText(dt); //Выводим данные на экран

 //Код, характерный для VC++.

 CXDSPDoc *m_doc; //Подключаем документ, связанный с представлением

 m_doc=GetDocument;

 //копируем туда данные.

 strcpy((char*)m_doc->m_buffer,dt);

 //Примечание: оба буфера должны иметь достаточный объем – минимум

 //256*4+1 байт.

}

Аналогично может выглядеть метод записи в память устройство:

void CXDSPView::OnWrite {

 //Получили данные, введенный пользователем

 m_buff.GetWindowText(dt,32767);

 int res;

 //Записываем его в память устройства. Заметим, что в качестве длины данных

 //мы передаем не длину в байтах, а в 4-байтых словах.

 res=(*WriteMem)(dt,strlen(dt)%4+1);

}

Метод, возвращающий длину памяти устройства, совсем прост и, думаю, в комментариях не нуждается.

int CXDSPView::GetTotalLen {

 int res=(*GetMemSize);

 return(res);

}

Также введем еще один метод, который может быть полезным. Он будет очищать память устройства.

void CXDSPView::OnClear {

 //Получили документ

 CXDSPDoc *m_doc;

 m_doc=GetDocument;

 //Забиваем буфер нулями

 for (int i=0;i<1025;i++) dt[i]=0;

 //Обнуляем буфер в классе документа

 m_doc->m_buffer[0]=0;

 int res;

 //Записывем в память устройства нули

 res=(*WriteMem)(dt,256);

 //Обновляем данные в окне приложения.

 m_buff.SetWindowText(dt);

}

Конечно, написанные нами приложение и dll-библиотека весьма несовершенны. Например, сбои будут происходить, если будут запущены несколько приложений. Тогда они будут одновременно обращаться к одной и той же dll и обновременно работать с устройством. Это может породить множество сбоев. В лучшем случае данные, получаемые каждым из них будут неадекватными. В худшем — система зависнет. Впрочем, этот недостаток можно устранить, модифицировав драйвер способом, описанным выше. Также в нашем приложении производится работа только с первыми 1024 байтами памяти устройства.

Поделиться с друзьями: