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


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


Перед тем, как приступить к тестированию драйвера путем вызова его сервисов из приложения, следует это приложение создать, хотя бы в минимальном виде, как это предлагается ниже. И хотя драйвер можно успешно запускать программой Monitor, воспользуемся функциями SCM, поскольку это будет существенно полезнее для будущей практики.

//////////////////////////////////////////////////////////////////// // (Файл ExampleTest.cpp) // Консольное приложение для тестирования драйвера Example.sys // 22-Feb-2003 1.0.0 SVP ////////////////////////////////////////////////////////////////////

// Заголовочные файлы, которые необходимы в данном приложении: #include

#include

#include

#include

// Внимание! Файл Ioctl.h должен быть получен из файла Driver.h // (см. комментрарии к Driver.h) и размещен в одной директории с // данным файлом (TestExam.cpp). #include "Ioctl.h"

// Имя объекта драйвера и местоположение загружаемого файла #define DRIVERNAME _T("Example") //#define DRIVERBINARY _T("C:\\Example\\Example.sys") //#define DRIVERBINARY _T("C:\\Ex\\objchk_w2k\\i386\\Example.sys") #define DRIVERBINARY _T("C:\\Ex\\tester\\Example.sys")

// Функция установки драйвера на основе SCM вызовов BOOL InstallDriver( SC_HANDLE scm, LPCTSTR DriverName, LPCTSTR driverExec ) { SC_HANDLE Service = CreateService ( scm, // открытый дескриптор к SCManager DriverName, // имя сервиса - Example DriverName, // для вывода на экран SERVICE_ALL_ACCESS, // желаемый доступ SERVICE_KERNEL_DRIVER, // тип сервиса SERVICE_DEMAND_START, // тип запуска SERVICE_ERROR_NORMAL, // как обрабатывается ошибка driverExec, // путь к бинарному файлу // Остальные параметры не используются - укажем NULL NULL, // Не определяем группу загрузки NULL, NULL, NULL, NULL); if (Service == NULL) // неудача { DWORD err = GetLastError(); if (err == ERROR_SERVICE_EXISTS) {/* уже установлен */} // более серьезная ощибка: else printf ("ERR: CanТt create service. Err=%d\n",err); // (^^ Ётот код ошибки можно подставить в ErrLook): return FALSE; } CloseServiceHandle (Service); return TRUE; }




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