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


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

# 1928, книга: Нашей юности полет
автор: Александр Александрович Зиновьев

«Нашей юности полет» — это автобиографический роман Александра Зиновьева, в котором он исследует формирующие годы своего поколения, выросшего в Советском Союзе в период Великой Отечественной войны. В мемуарах Зиновьев мастерски передает атмосферу своего времени, воссоздавая с потрясающей точностью повседневную жизнь, идеологические воздействия и социальные реалии эпохи. От детской наивности и энтузиазма до разочарования и недоверия, Зиновьев ведет читателя по пути своего интеллектуального и...

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

Сами боги. Айзек Азимов
- Сами боги

Жанр: Научная Фантастика

Год издания: 1976

Серия: Зарубежная фантастика (Мир)

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

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

Жанр:

Программы

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

неизвестно

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

неизвестно

Год издания:

-

ISBN:

неизвестно

Отзывы:

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

Рейтинг:

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

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

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

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

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

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

typedef XDSPINTER_API int (*MemWrtFun)(char *data, int len);

// EXPORT int GetMemSize(void)

typedef XDSPINTER_API int (*MemSizeFun)();

//EXPORT bool IsDriverPresent(void)

typedef XDSPINTER_API bool (*IsDrivFun)();

Теперь пришло время создать сами указатели на функции:

MemReadFun ReadMem;

MemWrtFun WriteMem;

MemSizeFun GetMemSize;

IsDrivFun IsDriverPresent;

Теперь рассмотрим функцию, подключающую dll-библиотеку к приложению. Она будет подключать dll-библиотеку к приложению и пытаться установить связь с драйвером. Функция вернет true в случае успеха и false при неудаче. Т.к. VC++ — объектно-ориентированная среда, то эта функция будет методом одного из классов приложения (в нашем случае — класса представления).

bool CXDSPView::ConnectToDriver() {

 //Переменная, в которой будет храниться возвращаемое значение.

 success=true;

 //HMODULE InterDll – переменная экземпляра, где хранится хэндл библиотеки.

 InterDll=::LoadLibrary("XDSPInter");

 if (InterDll==NULL) {

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

  AfxMessageBox("Couldn't load a library XDSPInter.dll",MB_ICONERROR | MB_OK);

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

  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 и обновременно работать с устройством. Это может породить --">

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


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