Материал: Написание драйверов. методические указания к выполнению лабораторной работы № 3 по дисциплине Периферийные устройства. Нужный А.М., Гребенникова Н.И

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

if (!ret) { /* неудача при удалении драйвера */ }

CloseServiceHandle (Service);

return ret;

}

// Функция запуска драйвера на основе SCM вызовов

BOOL StartDriver(SC_HANDLE scm, LPCTSTR DriverName)

{ SC_HANDLE Service = OpenService(scm, DriverName, SERVICE_ALL_ACCESS);

if (Service == NULL) return FALSE; /* open failed */

BOOL ret = StartService( Service,

// дескриптор

0, // число аргументов

NULL ); // указатель на аргументы

if (!ret) // неудача

{

DWORD err = GetLastError();

if (err == ERROR_SERVICE_ALREADY_RUNNING)

ret = TRUE; // OK, драйвер уже работает!

else { /* другие проблемы */}

}

CloseServiceHandle (Service);

return ret;

}

// Функция останова драйвера на основе SCM вызовов

BOOL StopDriver(SC_HANDLE scm, LPCTSTR DriverName)

{

SC_HANDLE Service = OpenService (scm, DriverName, SERVICE_ALL_ACCESS );

if (Service == NULL) //Невозможно выполнить останов //драйвера

{

DWORD err = GetLastError();

return FALSE;

}

SERVICE_STATUS serviceStatus;

BOOL ret =

ControlService(Service, SERVICE_CONTROL_STOP, &serviceStatus);

if (!ret)

{

DWORD err = GetLastError();

// дополнительная диагностика

}

CloseServiceHandle (Service);

return ret;

}

#define SCM_SERVICE

// ^^^^^^^^^^^^^^^^ вводим элемент условной //компиляции, при помощи

// которого можно отключать использование SCM //установки драйвера

// в тексте данного приложения. (Здесь Ц //использование SCM включено.)

// Основная функция тестирующего приложения.

// Здесь минимум внимания уделен диагностике //ошибочных ситуаций.

// В действительно рабочих приложениях следует //уделить этому больше внимания

int __cdecl main(int argc, char* argv[])

{

#ifdef SCM_SERVICE

// Используем сервис SCM для запуска драйвера.

BOOL res; // Получаем доступ к SCM :

SC_HANDLE scm = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

if(scm == NULL) return -1; // неудача

// Делаем попытку установки драйвера

res = InstallDriver(scm, DRIVERNAME, DRIVERBINARY );

if(!res)//Неудача, но возможно, он уже //инсталлирован

printf("Cannot install service");

res = StartDriver (scm, DRIVERNAME );

if(!res)

{

printf("Cannot start driver!");

res = RemoveDriver (scm, DRIVERNAME );

if(!res)

{

printf("Cannot remove driver!");

}

CloseServiceHandle(scm); // Отключаемся от SCM

return -1;

}

#endif

HANDLE hHandle = // Получаем доступ к драйверу

CreateFile( "\\\\.\\IRQDMA ",

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL );

if(hHandle==INVALID_HANDLE_VALUE)

{

printf("ERR: can not access driver IRQDMA.sys !\n");

return (-1);

}

DWORD BytesReturned; // Переменная для хранения //числа переданных байт

// строка для отправки

unsigned char *xdata = new unsigned char [5];

*(xdata) = 'T';

*(xdata + 1) = 'E';

*(xdata + 2) = 'S';

*(xdata + 3) = 'T';

char gets_line[100];

gets(gets_line);

printf( "Write to DATA port\n");

if( !WriteFile( hHandle,

xdata,

4,

&BytesReturned,

NULL) )

{

printf( "Error with byte receive!" );

return(-1);

}

//Вывод диагностического сообщения в консольном //окне:

printf("Byte send: BytesTransferred=%d xdata=%d\r\n",

BytesReturned, *xdata);

printf("Printe some in PuTTY\r\n");

gets(gets_line);

printf( "Read from DATA port\n" );

while(*gets(gets_line) != '1')

{

int step = 1;

// читаем из устройства

while(step == 1)

{

// читаем данные из устройства

if( !ReadFile( hHandle,

xdata,

1,

&BytesReturned,

NULL) )

{

printf( "Error with byte receive!" );

return(-1);

}

// Вывод принятой строки в консоле:

if(BytesReturned>0)

{

printf("%c", *xdata);

step = BytesReturned;

}

else

step = 0;

}

}

// Закрываем дескриптор доступа к драйверу:

CloseHandle(hHandle);

#ifdef SCM_SERVICE

//Останавливаем и удаляем драйвер.

//Отключаемся от SCM.

res = StopDriver (scm, DRIVERNAME );

if(!res)

{

printf("Cannot stop driver!");

CloseServiceHandle(scm);

return -1;

}

res = RemoveDriver (scm, DRIVERNAME );

if(!res)

{

printf("Cannot remove driver!");

CloseServiceHandle(scm);

return -1;

}

CloseServiceHandle(scm);

#endif

return 0;

}

Библиографический список

  1. Шрайбер С. Недокументированные возможности Windows 2000 / С. Шрайбер. СПб.: Издательство «Питер» 2002 год.

  2. Солдатов В.П. Программирование драйверов Windows. / В.П. Солдатов. Изд. 2-е, перераб. и доп. — М.: ООО "Бином-Пресс", 2004. — 480 с: ил.

  3. Рудаков П.И. Язык ассемблера: уроки программирования / П.И. Рудаков, К.Г. Финогенов. Диалог МИФИ, 2001.

  4. Сорокина С.Программирование драйверов и систем безопасности / С. Сорокина, А. Тихонов, А. Щербаков. СПб.: Издательство «БХВ-Петербург», 2002.

НАПИСАНИЕ ДРАЙВЕРОВ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к выполнению лабораторной работы № 3

по дисциплине "Периферийные устройства"

для студентов специальности 230101

«Вычислительные машины, комплексы, системы и сети»

очной и очной сокращенной форм обучения

Составители:

Нужный Александр Михайлович

Гребенникова Наталия Ивановна

В авторской редакции

Подписано к изданию 19.03.2012.

Уч.-изд. л. 1,6.

ФГБОУ ВПО «Воронежский государственный технический университет»

394026 Воронеж, Московский просп., 14

ФГБОУ ВПО

«Воронежский государственный технический университет»

СПРАВОЧНИК МАГНИТНОГО ДИСКА

(кафедра автоматизированных и вычислительных систем)

НАПИСАНИЕ ДРАЙВЕРОВ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к выполнению лабораторной работы № 3

по дисциплине "Периферийные устройства"

для студентов специальности 230101

«Вычислительные машины, комплексы, системы и сети»

очной и очной сокращенной формы обучения

Составители: а.М.Нужный н.И. Гребенникова

ПУ.Ч.2.doc 184 КБ 19.03.2012 1,6 уч.-изд.л.

(наименование файла) (объем файла) (дата) (объем издания)

2

Источник: https://studfile.net/preview/16569003/