Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Какой модуль надо подключить? [D7, Win2k, WinXP]


kvz ©   (2006-02-16 10:45:00) 

Какой модуль надо подключить для работы следующих функций:
OpenSCManager, OpenService, StartService, ControlService?


VirEx   (2006-02-19 08:44:00) [1]

помочь? консольная

program SCMTestApp;

{$APPTYPE CONSOLE}

uses
 SysUtils,
 Winsvc,  //для работы с сервисами
 Windows; //для распознавания ошибок

//===================================================
// далее идут вспомогательные процедуры и функции
//

//установка драйвера
function InstallDriver(scm :SC_HANDLE;DrvName,DrvPath:PChar):string;
var
 Service:SC_HANDLE;
begin
//создаем сервис
Service:=CreateService(scm, //дескриптор создаваемого сервиса
DrvName,                    //имя сервиса (для системы)
DrvName,                    //имя сервиса для вывода на экран
SERVICE_ALL_ACCESS,         //тип доступа (полный)
SERVICE_KERNEL_DRIVER,      //тип сервиса (драйвер)
SERVICE_DEMAND_START,       //тип запуска (по опросу)
SERVICE_ERROR_NORMAL,       //реакция системы на ошибку
DrvPath,                    //путь к *.sys файлу
nil,nil,nil,nil,nil);       //здесь не используются

if scm<>0 then result:='Install driver OK' else
 //вывод ошибок
 case GetLastError of
 ERROR_ACCESS_DENIED:        result:='ERROR_ACCESS_DENIED';
 ERROR_CIRCULAR_DEPENDENCY:  result:='ERROR_CIRCULAR_DEPENDENCY';
 ERROR_DUP_NAME:             result:='ERROR_DUP_NAME';
 ERROR_INVALID_HANDLE:       result:='Driver fail install';
 ERROR_INVALID_NAME:         result:='ERROR_INVALID_NAME';
 ERROR_INVALID_PARAMETER:    result:='ERROR_INVALID_PARAMETER';
 ERROR_INVALID_SERVICE_ACCOUNT: result:='ERROR_INVALID_SERVICE_ACCOUNT';
 ERROR_SERVICE_EXISTS:       result:='Driver already install';
 end;
//закрываем сервис
CloseServiceHandle(Service);
end;

//удаление драйвера
function RemoveDriver(scm :SC_HANDLE;DrvName:PChar):string;
var
 Service:SC_HANDLE;
begin
//открываем сервис
Service:=OpenService(scm,DrvName,SERVICE_ALL_ACCESS);
if Service=0 then result:='Driver not install' else
if DeleteService(Service) then result:='Driver remove OK';
//закрываем сервис
CloseServiceHandle(Service);
end;

//запуск драйвера
function StartDriver(scm :SC_HANDLE;DrvName:PChar):string;
var
 Service:SC_HANDLE;
 arg:PChar;
begin
arg:=nil;
//открываем сервис
Service:=OpenService(scm,DrvName,SERVICE_ALL_ACCESS);
if Service=0 then result:='Driver not install' else
 if StartService(Service,0,arg) then result:='Driver start OK' else
 //вывод ошибок
 case GetLastError of
 ERROR_INVALID_HANDLE:         result:='ERROR_INVALID_HANDLE';
 ERROR_PATH_NOT_FOUND:         result:='ERROR_PATH_NOT_FOUND';
 ERROR_SERVICE_ALREADY_RUNNING:result:='Driver already start';
 ERROR_SERVICE_DATABASE_LOCKED:result:='ERROR_SERVICE_DATABASE_LOCKED';
 ERROR_SERVICE_DEPENDENCY_DELETED: result:='ERROR_SERVICE_DEPENDENCY_DELETED';
 ERROR_SERVICE_DEPENDENCY_FAIL:result:='ERROR_SERVICE_DEPENDENCY_FAIL';
 ERROR_SERVICE_DISABLED:       result:='ERROR_SERVICE_DISABLED';
 ERROR_SERVICE_LOGON_FAILED:   result:='ERROR_SERVICE_LOGON_FAILED';
 ERROR_SERVICE_MARKED_FOR_DELETE: result:='ERROR_SERVICE_MARKED_FOR_DELETE';
 ERROR_SERVICE_NO_THREAD:      result:='ERROR_SERVICE_NO_THREAD';
 ERROR_SERVICE_REQUEST_TIMEOUT:result:='ERROR_SERVICE_REQUEST_TIMEOUT';
 end;
//закрываем сервис
CloseServiceHandle(Service);
end;

//остановка драйвера
function StopDriver(scm :SC_HANDLE;DrvName:PChar):string;
var
 Service:SC_HANDLE;
 ServStatus:TServiceStatus;
begin
//открываем сервис
Service:=OpenService(scm,DrvName,SERVICE_ALL_ACCESS);
if Service=0 then result:='Driver not install' else
 if ControlService(Service,SERVICE_CONTROL_STOP,ServStatus) then result:='Driver stop OK' else
 //вывод ошибок
 case GetLastError of
 ERROR_INVALID_HANDLE:         result:='ERROR_INVALID_HANDLE';
 ERROR_ACCESS_DENIED:            result:='ERROR_ACCESS_DENIED';
 ERROR_DEPENDENT_SERVICES_RUNNING:result:='ERROR_DEPENDENT_SERVICES_RUNNING';
 ERROR_INVALID_SERVICE_CONTROL:  result:='ERROR_INVALID_SERVICE_CONTROL';
 ERROR_SERVICE_CANNOT_ACCEPT_CTRL:result:='ERROR_SERVICE_CANNOT_ACCEPT_CTRL';
 ERROR_SERVICE_NOT_ACTIVE:       result:='Driver already stopped';
 ERROR_SERVICE_REQUEST_TIMEOUT:  result:='ERROR_SERVICE_REQUEST_TIMEOUT';
 end;
//закрываем сервис
CloseServiceHandle(Service);
end;

//помощь о командах
procedure Help;
begin
Writeln('-------------------------------');
Writeln('|Test drivers from SCM meneger|');
Writeln('-------------------------------');
Writeln('Commands:');
Writeln('1 - Install driver');
Writeln('2 - Start   driver');
Writeln('3 - Stop    driver');
Writeln('4 - Remove  driver');
Writeln('99 - exit');
Writeln('-------------------------------');
end;
//
// вспомогательные процедуры и функции заканчиваются здесь,
// далее идёт главная процедура программы
// (в языке C/C++ она называется Main)
//===================================================

var
 i:integer;
 scm_:SC_HANDLE;//дескриптор SCM менеждера
 status:string; //строка статуса (для вывода)
begin
//запуск SCM менеждера
scm_:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);

if scm_<>0 then WriteLn('SCM Manager start OK')//успешный запуск
else begin
 WriteLn('SCM Manager start fail');//показываем ошибку на экране
 readln;// до ввода любого символа
 exit;  // выход из программы
end;

status:='';
Help; // выводим меню команд при старте
repeat
//цикл, до тех пор, пока не будет
//введена цифра 99
begin
  readln(i);// запоминаем код команды
  Help;     // выводим меню команд после ввода команды
  case i of
  //команды
     1: status:=InstallDriver(scm_,'Example','D:\Example\objchk_wxp_x86\i386\Example.sys ');
     2: status:=StartDriver  (scm_,'Example');
     3: status:=StopDriver   (scm_,'Example');
     4: status:=RemoveDriver (scm_,'Example');
  end;
  Writeln('Driver status='+Status);//статус результата команды
  Write('>'); //командное приглашение
end;
until i=99;

//останавливаем SCM менеждер
CloseServiceHandle(scm_);
end.


kvz   (2006-02-16 10:58:00) [2]

Спасибо!


Reindeer Moss Eater   (2006-02-16 10:49:00) [3]

Поиск по pas файлам содержащим нужный текст отменили?


kaZaNoVa   (2006-02-16 10:48:00) [4]

WinSvc


Наверх

Титульная страница Поиск, карта сайта Написать письмо