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;
}
Шрайбер С. Недокументированные возможности Windows 2000 / С. Шрайбер. СПб.: Издательство «Питер» 2002 год.
Солдатов В.П. Программирование драйверов Windows. / В.П. Солдатов. Изд. 2-е, перераб. и доп. — М.: ООО "Бином-Пресс", 2004. — 480 с: ил.
Рудаков П.И. Язык ассемблера: уроки программирования / П.И. Рудаков, К.Г. Финогенов. Диалог МИФИ, 2001.
Сорокина С.Программирование драйверов и систем безопасности / С. Сорокина, А. Тихонов, А. Щербаков. СПб.: Издательство «БХВ-Петербург», 2002.
НАПИСАНИЕ ДРАЙВЕРОВ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к выполнению лабораторной работы № 3
по дисциплине "Периферийные устройства"
для студентов специальности 230101
«Вычислительные машины, комплексы, системы и сети»
очной и очной сокращенной форм обучения
Составители:
Нужный Александр Михайлович
Гребенникова Наталия Ивановна
В авторской редакции
Подписано к изданию 19.03.2012.
Уч.-изд. л. 1,6.
ФГБОУ ВПО «Воронежский государственный технический университет»
ФГБОУ ВПО
«Воронежский государственный технический университет»
СПРАВОЧНИК МАГНИТНОГО ДИСКА
(кафедра автоматизированных и вычислительных систем)
НАПИСАНИЕ ДРАЙВЕРОВ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к выполнению лабораторной работы № 3
по дисциплине "Периферийные устройства"
для студентов специальности 230101
«Вычислительные машины, комплексы, системы и сети»
очной и очной сокращенной формы обучения
ПУ.Ч.2.doc 184 КБ 19.03.2012 1,6 уч.-изд.л.
(наименование файла) (объем файла) (дата) (объем издания)