Программирование драйверов Windows


Приложение для тестирования драйвера Example.sys - часть 3


res = StopDriver (scm, DRIVERNAME ); if(res) res = RemoveDriver (scm, DRIVERNAME ); } CloseServiceHandle(scm); return; } */

#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( "\\\\.\\Example", 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 Example.sys !\n"); return (-1); } DWORD BytesReturned; // Переменная для хранения числа // переданных байт // Последовательно выполняем обращения к драйверу // с различными кодами IOCTL:

unsigned long ioctlCode=IOCTL_PRINT_DEBUG_MESS; if( !DeviceIoControl( hHandle, ioctlCode, NULL, 0, // Input NULL, 0, // Output &BytesReturned, NULL ) ) { printf( "Error in IOCTL_PRINT_DEBUG_MESS!" ); return(-1); }

ioctlCode=IOCTL_CHANGE_IRQL; if( !DeviceIoControl( hHandle, ioctlCode, NULL, 0, // Input NULL, 0, // Output &BytesReturned, NULL ) ) { printf( "Error in IOCTL_CHANGE_IRQL!" ); return(-1); }




Начало  Назад  Вперед