StartService драйвер незапускат, в чем фишка?

Тема в разделе "WASM.NT.KERNEL", создана пользователем ViCooper, 11 дек 2006.

  1. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Стандартные операции, вообщемта:
    1: CreateService(...);
    2: StartService(...) = 0 // The request was accepted
    3: GetLasterror() = 161 // The specified path is invalid
    Файл наместе. В реестре ImagePath = \??\D:\*итд*.sys
    Загадка природы? Где копать?
     
  2. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Ну наверно "The specified path is invalid" ))). Проверь путь до драйвера
     
  3. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Причём здесь ImagePath, ты ведь не к драйверу виртуального устройства обратиться хочешь.

    Покажи параметры которые передаёшь в CreateService, я надеюсь перед этим ты получаешь полный путь до драйвера с помощью GetFullPathName.
     
  4. Guest

    Guest Guest

    Публикаций:
    0
    Если раньше запускался, то попробуй убрать из "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\" раздел с именем драйвера.
     
  5. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Код примерно таков:
    SC_HANDLE schManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

    // lpServicePathName = _T("D:\\My Projects\\wdma\\sys\\objchk\\i386\\wdma.sys")
    SC_HANDLE sch = CreateService( schManager, lpServiceName, lpDisplayName,
    SC_MANAGER_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
    lpServicePathName, NULL, NULL, NULL, NULL, NULL );

    StartService( sch, 0, NULL ); // return 0 ( The request was accepted )

    GetLastError() // return 161 ( ERROR_BAD_PATHNAME The specified path is invalid.)

    Па поваду ImagePath: эта какраз lpServicePathName и есть памоему. Из разных источников разная инфа. MSDN гласит шо пробелов быть недалжно и чтобы "системе было понятно" заключать lpServicePathName в "ковычки''. Пробывал, несрабатыват. А так же шо путь должен быть полным, а сама (система) регистирует некаторые драйвера либо system32\drivers\... либо %SystemPath%system32\drivers\.... Пробывал и так - неработат. В какойта статье прочитал шо именно драйверы должны регестрироваться "там где паложено" т.е. в system32... но в реестре есть заригестрированные и подругому ( да и Шрайбер про это молчит ). С путем именно типа: \??\D:\\... нашол нескалько записей они StartService и запускаются и стопарятся. Причем отличие в регистации служб и драйверов разница всетаки (я фсе про ImagePath) прослеживается но не строгая а "как правило". Вобщем то поэтому про ImagePath и сказал, мож ктота тонкости каки знат.
    И ышо: я уж не сафсем идиот - ФАЙЛ НАМЕСТЕ и кака разница как я путь к нему получаю?
     
  6. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Здравствуйте!
    Вот функции запуска драйвера (Delphi, на C легко можно перевести).
    Код (Text):
    1. Глобальная - schSCManager:SC_HANDLE;
    2. function InstDrv(DriverName:PAnsiChar;ServiceExe:PAnsiChar):boolean;
    3. var
    4. schService:SC_HANDLE;
    5. begin
    6.     schService := CreateService( SchSCManager,          // SCManager database
    7.                                 DriverName,           // name of service
    8.                                 DriverName,           // name to display
    9.                                 SERVICE_ALL_ACCESS,    // desired access
    10.                                 SERVICE_KERNEL_DRIVER, // service type
    11.                                 SERVICE_DEMAND_START,  // start type
    12.                                 SERVICE_ERROR_NORMAL,  // error control type
    13.                                 ServiceExe,            // service's binary
    14.                                 Nil,                  // no load ordering group
    15.                                 Nil,                  // no tag identifier
    16.                                 Nil,                  // no dependencies
    17.                                 Nil,                  // LocalSystem account
    18.                                 Nil                   // no password
    19.                                 );
    20.     if ( schService = Null ) then begin
    21.         Result:= false;
    22.         exit;
    23.     end;
    24.     CloseServiceHandle( schService );
    25.     result:= TRUE;
    26. end;
    27. function StartDrv(DriverName:PAnsiChar):boolean;
    28. var
    29. schService:SC_HANDLE;
    30. ret:boolean;
    31. begin
    32.     schService := OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS);
    33.     if ( schService = Null ) then begin
    34.         Result:= false;
    35.         exit;
    36.     end;
    37.     ret := StartService(schService,0,DriverName );
    38.     CloseServiceHandle( schService );
    39.     result:= ret;
    40. end;
    41.  
    42. function StopDrv(DriverName:PAnsiChar):boolean;
    43. var
    44. schService:SC_HANDLE;
    45. ret:boolean;
    46. serviceStatus:SERVICE_STATUS;
    47. begin
    48.     schService := OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS);
    49.     if ( schService = Null ) then begin
    50.         Result:= false;
    51.         exit;
    52.     end;
    53.     ret := ControlService(schService,SERVICE_CONTROL_STOP,serviceStatus );
    54.     CloseServiceHandle( schService );
    55.     result:= ret;
    56. end;
    57.  
    58. function RemoveDriver(DriverName:PAnsiChar):boolean;
    59. var
    60. schService:SC_HANDLE;
    61. ret:boolean;
    62. begin
    63.     schService := OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS);
    64.     if ( schService = Null ) then begin
    65.         Result:= false;
    66.         exit;
    67.     end;
    68.     ret := DeleteService( schService );
    69.     CloseServiceHandle( schService );
    70.     result:= ret;
    71. end;
    72.  
    73.  
    74. Использовать так:
    75.   if InstDrv(PAnsiChar('MyDriver'),PAnsiChar(FullPathToFile)) then begin
    76.       StartDrv(PAnsiChar('MyDriver'));
    77.   end;
    78.  
    79. StopDrv(PAnsiChar('MyDriver'));
    80. RemoveDriver(PAnsiChar('MyDriver'));
    Код взят из рабочего проекта, функции работают гарантированно.
    Насчет синтаксиса вызовов - тоже должно быть правильно, но не проверял (немножко пришлось переделать, чтобы не было похоже на реальный код :)).
    Надеюсь, поможет.
    Удачи!
     
  7. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Спасибо, конечно за любой ответ!!!
    StartDrv: А если драйвер уже заригестрирован?
    RemoveDrv: А если он ужо помечен для удаления?
    Поясни для чего макрос PAnsiChar(). если StartService уже макрос для StartServiceA или StartServiceW?

    Вообщемто, код и его возможные реализации не интерисуют. Почему может быть ошибка №161 после StartService, при условии, шо путь ImagePath указывает на драйвер гарантировано? Может путь должен быть другим по каким-либо соображениям ???))) А мож кроме реестра ышо куда пишется??

    С уважением ...
     
  8. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Здравствуйте!
    Если корректно стартовать/останавливать драйвер, такая ситуация возникнуть не должна, а если и возникнет - будет ошибка, ее надо обработать. Просто в данном случае не запустится/не остановится драйвер. Далее - по обстановке: надо - еще раз попытайся.
    Честно - вообще не понял что это значит :)
    PAnsiChar(), в Delphi, - просто приводит строку к типу PAnsiChar. Они со StartService, в принципе, связаны весьма опосредованно...
    А вообще я вижу в твоем коде одно отличие от моего:
    Код (Text):
    1. schService := OpenService( SchSCManager, DriverName, SERVICE_ALL_ACCESS);
    Вот этого у тебя вроде нет...
    Да и еще: зачем тебе ImagePath? Тебе же уже сказали, этого не надо!!! Для запуска драйвера посредством SCM не надо вообще ничего в реестр писать!
    Ну, и напоследок:
    #define ERROR_BAD_PATHNAME 161L
    Все-таки посмотри.
    Надеюсь, поможет.
    Удачи!
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Дык он и не закрывает хендл после создания.
     
  10. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    n0name
    Ну да, вообще-то :)
     
  11. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Господа! По поваду приведенного мною кода неспорьте, непринципиально. Приведен, чтобы пока зать шо драйвер создается с параметрами:
    - SC_MANAGER_ALL_ACCESS;
    - SERVICE_KERNEL_DRIVER;
    - SERVICE_DEMAND_START;
    - SERVICE_ERROR_NORMAL.
    Доступ везде:SC_MANAGER_ALL_ACCESS.
    Запускается без параметров.
    В реестре вручную ниче не правится!

    ImagePath приведен потаму шо када копал, заметил шо дизайн путей для разных драйверов(служб) разный. И ошибка про некорректный путь (дословно непомню) собсвенно.

    Считаю там где используется макросы API вместо их реальных имен, явное указание на ANSI или UNICODE длжно быть неслучайно, либо макросы API бессмысленны. т.е. корректней PTChar если он в Дельфи есть, я чесслова в нем несилен.
     
  12. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Это было просто приведение типа. Вообще - это из случая, когда путь у меня (в реальном коде) вычислялся.... Для строки, Вы правы, - скорее всего не надо этого указывать.
    Ну, так получается? Нам уже всем, наверное, очень интересно :)
    Попробуйте удалить все ветки реестра, связанные с Вашим драйвером (если они есть) и запустить с использованием приведенного мной кода.
    Если не получится - я сдаюсь! :)
    У меня с любыми тестовыми драйверами работает.
    Удачи!
     
  13. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Я тупой наверна - неоолучаца!)

    У Вас дрова тестовые где лежат? Есть разница между ...system32\drivers\...sys и любым произвольным(но существующим) путем? Ашипка про НЕДОПУСТИМЫЙ путь, есть же мого разных про пути почему ЭТА? Может всетаки есть связь между путем с одной стороны и драйвер это или служба а так же способом статра с другой? Я уж незнаю как формулировать.
    Запускаю с пустого реестра.
     
  14. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    прямо чат получается :)
    Вообще сейчас у меня в drivers лежат, но в других программах со схожим кодом, запускает из любых (вроде).
    Пробелы не желательны, длинные пути и нелатинские символы в имени.
    Может так.
     
  15. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Кстати, разница между запуском драйвера из консольного и win32 приложения есть, в данном случае? У мя консоль. Щя переделаю в win32, мож попрет? У мя руки опускаца уже! Все ведь проста же как 2x2. У мя SIMATIC "Step7" ышо стоит при запуске проги он выдает "Сбой инициализации приложения" я на это не обращял внимания, это его там затыки какие то, мож поэтому ужо? Теряюсь в догадках ужо!
    Пинайте сильнее мож зерно углежу.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нет
    попробуй такой код:
    Код (Text):
    1.     char buff[256] ;
    2.     DWORD dwType ;
    3.     HKEY Key, Key2 ;
    4.     UNICODE_STRING  us, usReg ;
    5.     DWORD status ;
    6.     //-------- create values in register
    7.     status = STATUS_SUCCESS ;
    8.     lstrcpy(buff, "\\??\\") ;
    9.     GetFullPathName(pPath, sizeof(buff), (LPTSTR)&(buff[4]), (LPTSTR *)&dwType ) ;
    10.     RegOpenKey( HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services", &Key ) ;
    11.     RegCreateKey(Key, pDrvDispName, &Key2 ) ;
    12.     RegSetValueEx(Key2, "ImagePath", 0, REG_SZ, (BYTE *)&buff, lstrlen(buff) ) ;
    13.     dwType = 1 ;
    14.     RegSetValueEx(Key2, "Type", 0, REG_DWORD, ( BYTE *)&dwType, 4 ) ;
    15.     RegSetValueEx(Key2, "ErrorControl", 0, REG_DWORD, ( BYTE *)&dwType, 4 ) ;
    16.     dwType = 0x3 ;
    17.     RegSetValueEx(Key2, "Start", 0, REG_DWORD, ( BYTE *)&dwType, 4 ) ;
    18.     RegCloseKey(Key2) ;
    19.     RegCloseKey(Key);
    20.     lstrcpy(buff, "\\registry\\machine\\system\\CurrentControlSet\\Services\\" ) ;
    21.     lstrcat(buff, pDrvDispName ) ;
    22.     lstrcat(buff, "\\") ;
    23.     MessageBox(0,buff,buff,0) ;
    24.     RtlInitUnicodeString(&us, buff ) ;
    25.     //-------- load driver
    26.     status = ZwLoadDriver(&us)  ;
    27.     if( status != STATUS_SUCCESS)
    28.         return status ;
    PS: Код не мой.
     
  17. Guest

    Guest Guest

    Публикаций:
    0
    Код (Text):
    1. #if !defined(CLASS)
    2. #define CLASS
    3. #pragma once          
    4. #pragma warning(disable: 4996)
    5.  
    6. #define DRV_SUCCESS                      (DWORD)0
    7. #define DRV_ERROR_SCM                    (DWORD)-1
    8. #define DRV_ERROR_SERVICE                (DWORD)-2
    9. #define DRV_ERROR_MEMORY                 (DWORD)-3
    10. #define DRV_ERROR_INVALID_PATH_OR_FILE   (DWORD)-4
    11. #define DRV_ERROR_INVALID_HANDLE         (DWORD)-5
    12. #define DRV_ERROR_STARTING               (DWORD)-6
    13. #define DRV_ERROR_STOPPING               (DWORD)-7
    14. #define DRV_ERROR_REMOVING               (DWORD)-8
    15. #define DRV_ERROR_IO                     (DWORD)-9
    16. #define DRV_ERROR_NO_INITIALIZED         (DWORD)-10
    17. #define DRV_ERROR_ALREADY_INITIALIZED    (DWORD)-11
    18. #define DRV_ERROR_NULL_POINTER           (DWORD)-12
    19. #define DRV_ERROR_UNKNOWN                (DWORD)-13
    20.  
    21. class TDriver
    22. {
    23. public:
    24.     TDriver(void);
    25.     ~TDriver(void);
    26.  
    27.     DWORD InitDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName=NULL);
    28.     DWORD InitDriver(LPCTSTR path);
    29.     DWORD LoadDriver(BOOL start = TRUE);
    30.     DWORD LoadDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName=NULL, BOOL start=TRUE);
    31.     DWORD LoadDriver(LPCTSTR path, BOOL start=TRUE);
    32.     DWORD UnloadDriver(BOOL forceClearData = FALSE);
    33.     DWORD StartDriver(void);
    34.     DWORD StopDriver(void);
    35.     void SetRemovable(BOOL value);
    36.     BOOL IsInitialized();
    37.     BOOL IsStarted();
    38.     BOOL IsLoaded();
    39.    
    40. private:
    41.     LPTSTR driverName;
    42.     LPTSTR driverPath;
    43.     LPTSTR driverDosName;
    44.     BOOL initialized;
    45.     BOOL started;
    46.     BOOL loaded;
    47.     BOOL removable;
    48. };
    49. TDriver::TDriver(void)
    50. {
    51.     removable     = TRUE;
    52.     driverName    = NULL;
    53.     driverPath    = NULL;
    54.     driverDosName = NULL;
    55.     initialized   = FALSE;
    56.     loaded  = FALSE;
    57.     started = FALSE;
    58. }
    59. TDriver::~TDriver(void)
    60. {
    61.     UnloadDriver();
    62. }
    63. void TDriver::SetRemovable(BOOL value)
    64. {  
    65.     removable = value;
    66. }
    67. BOOL TDriver::IsInitialized(void)
    68. {  
    69.     return initialized;
    70. }
    71. BOOL TDriver::IsLoaded(void)
    72. {
    73.     return loaded;
    74. }
    75. BOOL TDriver::IsStarted(void)
    76. {
    77.     return started;
    78. }
    79. DWORD TDriver::InitDriver(LPCTSTR path)
    80. {
    81.     if(initialized)
    82.     {
    83.         if(UnloadDriver() != DRV_SUCCESS)
    84.             return DRV_ERROR_ALREADY_INITIALIZED;
    85.     }
    86.     driverPath = (LPTSTR)malloc((wcslen(path)+1)*sizeof(wchar_t));
    87.     if(driverPath == NULL)
    88.         return DRV_ERROR_MEMORY;
    89.     wcscpy(driverPath, path);
    90.     LPTSTR sPos1 = wcsrchr(driverPath, (int)'\\');
    91.     if (sPos1 == NULL) sPos1 = driverPath;
    92.     LPTSTR sPos2 = wcsrchr(sPos1, (int)'.');
    93.     if (sPos2 == NULL || sPos1 > sPos2)
    94.     {
    95.         free(driverPath);
    96.         driverPath = NULL;
    97.         return DRV_ERROR_INVALID_PATH_OR_FILE;
    98.     }
    99.     driverName = (LPTSTR)malloc((sPos2 - sPos1)*sizeof(wchar_t));
    100.     if(driverName == NULL)
    101.     {
    102.         free(driverPath);
    103.         driverPath = NULL;
    104.         return DRV_ERROR_MEMORY;
    105.     }
    106.     memcpy(driverName, &sPos1[1], (sPos2-sPos1-1)*sizeof(wchar_t));
    107.     driverName[sPos2-sPos1-1] = 0;
    108.     driverDosName = (LPTSTR)malloc((wcslen(driverName)+5)*sizeof(wchar_t));
    109.     if(driverDosName == NULL)
    110.     {
    111.         free(driverPath);
    112.         driverPath = NULL;
    113.         free(driverName);
    114.         driverName = NULL;
    115.         return DRV_ERROR_MEMORY;
    116.     }
    117.     wsprintf(driverDosName, L"\\\\.\\%s", driverName);
    118.     initialized = TRUE;
    119.     return DRV_SUCCESS;
    120. }
    121.  
    122. DWORD TDriver::InitDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName)
    123. {  
    124.     if(initialized)
    125.     {
    126.         if(UnloadDriver() != DRV_SUCCESS)
    127.             return DRV_ERROR_ALREADY_INITIALIZED;
    128.     }
    129.     LPTSTR dirBuffer;
    130.     if (path != NULL)
    131.     {
    132.         DWORD len = (DWORD)(wcslen(name)+wcslen(path)+1);
    133.         dirBuffer = (LPTSTR)malloc(len*sizeof(wchar_t));
    134.         if(dirBuffer == NULL)
    135.             return DRV_ERROR_MEMORY;
    136.         wcscpy(dirBuffer, path);
    137.     }
    138.     else
    139.     {
    140.         LPTSTR pathBuffer;
    141.         DWORD len = GetCurrentDirectory(0, NULL);
    142.         pathBuffer = (LPTSTR)malloc(len*sizeof(wchar_t));
    143.         if(pathBuffer == NULL)
    144.             return DRV_ERROR_MEMORY;
    145.  
    146.         if (GetCurrentDirectory(len*sizeof(wchar_t), pathBuffer) != 0)
    147.         {
    148.             len = (DWORD)(wcslen(pathBuffer)+wcslen(name)+6);
    149.             dirBuffer = (LPTSTR)malloc(len*sizeof(wchar_t));
    150.             if(dirBuffer == NULL)
    151.             {
    152.                 free(pathBuffer);
    153.                 return DRV_ERROR_MEMORY;
    154.             }
    155.             wsprintf(dirBuffer, L"%s\\%s.sys", pathBuffer, name);
    156.             if(GetFileAttributes(dirBuffer) == 0xFFFFFFFF)
    157.             {
    158.                 free(pathBuffer);
    159.                 free(dirBuffer);
    160.  
    161.                 LPCTSTR sysDriver = L"\\system32\\Drivers\\";
    162.                 LPTSTR  sysPath;
    163.                
    164.                 DWORD len = GetWindowsDirectory(NULL, 0);
    165.                 sysPath = (LPTSTR)malloc((len+wcslen(sysDriver))*sizeof(wchar_t));
    166.  
    167.                 if(sysPath == NULL)
    168.                     return DRV_ERROR_MEMORY;
    169.  
    170.                 if (GetWindowsDirectory(sysPath, len*sizeof(wchar_t)) == 0)
    171.                 {
    172.                     free(sysPath);
    173.                     return DRV_ERROR_UNKNOWN;
    174.                 }
    175.                 wcscat(sysPath, sysDriver);
    176.                 len = (DWORD)(wcslen(sysPath)+wcslen(name)+5);
    177.                 dirBuffer = (LPTSTR)malloc(len*sizeof(wchar_t));
    178.  
    179.                 if(dirBuffer == NULL)
    180.                     return DRV_ERROR_MEMORY;
    181.                 wsprintf(dirBuffer, L"%s%s.sys", sysPath, name);
    182.                 free(sysPath);
    183.                 if(GetFileAttributes(dirBuffer) == 0xFFFFFFFF)
    184.                 {
    185.                     free(dirBuffer);
    186.                     return DRV_ERROR_INVALID_PATH_OR_FILE;
    187.                 }
    188.             }
    189.         }
    190.         else
    191.         {
    192.             free(pathBuffer);
    193.             return DRV_ERROR_UNKNOWN;
    194.         }
    195.     }
    196.     driverPath = dirBuffer;
    197.     driverName = (LPTSTR)malloc((wcslen(name)+1)*sizeof(wchar_t));
    198.     if(driverName == NULL)
    199.     {
    200.         free(driverPath);
    201.         driverPath = NULL;
    202.         return DRV_ERROR_MEMORY;
    203.     }
    204.     wcscpy(driverName, name);
    205.     LPCTSTR auxBuffer;
    206.     if(dosName != NULL)
    207.         auxBuffer = dosName;
    208.     else
    209.         auxBuffer = name;
    210.     if(auxBuffer[0] != '\\' && auxBuffer[1] != '\\')
    211.     {
    212.         driverDosName = (LPTSTR)malloc((wcslen(auxBuffer)+5)*sizeof(wchar_t));
    213.         if(driverDosName == NULL)
    214.         {
    215.             free(driverPath);
    216.             driverPath = NULL;
    217.             free(driverName);
    218.             driverName = NULL;
    219.             return DRV_ERROR_MEMORY;
    220.         }
    221.         wsprintf(driverDosName, L"\\\\.\\%s", auxBuffer);
    222.     }
    223.     else
    224.     {
    225.         driverDosName = (LPTSTR)malloc(wcslen(auxBuffer)*sizeof(wchar_t));
    226.         if(driverDosName == NULL)
    227.         {
    228.             free(driverPath);
    229.             driverPath = NULL;
    230.             free(driverName);
    231.             driverName = NULL;
    232.             return DRV_ERROR_MEMORY;
    233.         }
    234.         wcscpy(driverDosName, auxBuffer);
    235.     }
    236.     initialized = TRUE;
    237.     return DRV_SUCCESS;
    238. }
    239.  
    240. DWORD TDriver::LoadDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName, BOOL start)
    241. {
    242.     DWORD retCode = InitDriver(name, path, dosName);
    243.     if(retCode == DRV_SUCCESS)
    244.         retCode = LoadDriver(start);
    245.     return retCode;
    246. }
    247.  
    248. DWORD TDriver::LoadDriver(LPCTSTR path, BOOL start)
    249. {
    250.     DWORD retCode = InitDriver(path);
    251.     if(retCode == DRV_SUCCESS)
    252.         retCode = LoadDriver(start);
    253.     return retCode;
    254. }
    255.  
    256. DWORD TDriver::LoadDriver(BOOL start)
    257. {
    258.     if(loaded)
    259.         return DRV_SUCCESS;
    260.  
    261.     if(!initialized)
    262.         return DRV_ERROR_NO_INITIALIZED;
    263.  
    264.     SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    265.     DWORD retCode = DRV_SUCCESS;
    266.    
    267.     if (SCManager == NULL)
    268.         return DRV_ERROR_SCM;
    269.  
    270.     SC_HANDLE  SCService = CreateService(SCManager, driverName, driverName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
    271.                                          SERVICE_ERROR_NORMAL, driverPath, NULL, NULL, NULL, NULL, NULL);
    272.    
    273.     if (SCService == NULL)
    274.     {
    275.         SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
    276.         if (SCService == NULL)
    277.             retCode = DRV_ERROR_SERVICE;
    278.     }
    279.     CloseServiceHandle(SCService);
    280.     SCService=NULL;
    281.     CloseServiceHandle(SCManager);
    282.     SCManager = NULL;
    283.  
    284.     if(retCode == DRV_SUCCESS)
    285.     {
    286.         loaded = TRUE;
    287.         if(start) retCode = StartDriver();
    288.     }
    289.     return retCode;
    290. }
    291. DWORD TDriver::UnloadDriver(BOOL forceClearData)
    292. {
    293.     DWORD retCode = DRV_SUCCESS;
    294.  
    295.     if (started)
    296.     {
    297.         if ((retCode = StopDriver()) == DRV_SUCCESS)
    298.         {
    299.             if(removable)
    300.             {
    301.                 SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    302.                 if (SCManager == NULL)
    303.                     return DRV_ERROR_SCM;
    304.  
    305.                 SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
    306.                 if (SCService != NULL)
    307.                 {
    308.                     if(!DeleteService(SCService))
    309.                         retCode = DRV_ERROR_REMOVING;
    310.                     else retCode = DRV_SUCCESS;
    311.                 }
    312.                 else retCode = DRV_ERROR_SERVICE;
    313.  
    314.                 CloseServiceHandle(SCService);
    315.                 SCService = NULL;
    316.                 CloseServiceHandle(SCManager);
    317.                 SCManager = NULL;
    318.  
    319.                 if(retCode == DRV_SUCCESS) loaded = FALSE;
    320.             }
    321.         }
    322.     }
    323.  
    324.     if(initialized)
    325.     {
    326.         if(retCode != DRV_SUCCESS && forceClearData == FALSE)
    327.             return retCode;
    328.         initialized = FALSE;
    329.         if(driverPath != NULL)
    330.         {
    331.             free(driverPath);
    332.             driverPath = NULL;
    333.         }
    334.         if(driverDosName != NULL)
    335.         {
    336.             free(driverDosName);
    337.             driverDosName = NULL;
    338.         }
    339.         if(driverName != NULL)
    340.         {
    341.             free(driverName);
    342.             driverName = NULL;
    343.         }
    344.     }
    345.     return retCode;
    346. }
    347. DWORD TDriver::StartDriver(void)
    348. {
    349.     if(started)
    350.         return DRV_SUCCESS;
    351.  
    352.     SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    353.     DWORD retCode;
    354.     if (SCManager == NULL)
    355.         return DRV_ERROR_SCM;
    356.     SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
    357.     if (SCService == NULL)
    358.         return DRV_ERROR_SERVICE;
    359.  
    360.     if (StartService(SCService, 0, NULL) == NULL)
    361.     {
    362.         if (GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
    363.         {
    364.             removable = FALSE;
    365.             retCode = DRV_SUCCESS;
    366.         }
    367.         else retCode = DRV_ERROR_STARTING;
    368.     }
    369.     else retCode = DRV_SUCCESS;
    370.  
    371.     CloseServiceHandle(SCService);
    372.     SCService = NULL;
    373.     CloseServiceHandle(SCManager);
    374.     SCManager = NULL;
    375.     if(retCode == DRV_SUCCESS)
    376.     {
    377.         started = TRUE;
    378.     }
    379.     return retCode;
    380. }
    381. DWORD TDriver::StopDriver(void)
    382. {
    383.     if(!started)
    384.         return DRV_SUCCESS;
    385.  
    386.     SC_HANDLE SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    387.     DWORD retCode;
    388.    
    389.     if (SCManager == NULL)
    390.         return DRV_ERROR_SCM;
    391.  
    392.     SERVICE_STATUS  status;
    393.     SC_HANDLE SCService = OpenService(SCManager, driverName, SERVICE_ALL_ACCESS);
    394.    
    395.     if (SCService != NULL)
    396.     {
    397.         if(!ControlService(SCService, SERVICE_CONTROL_STOP, &status))
    398.             retCode = DRV_ERROR_STOPPING;
    399.         else retCode = DRV_SUCCESS;
    400.     }
    401.     else retCode = DRV_ERROR_SERVICE;
    402.  
    403.     CloseServiceHandle(SCService);
    404.     SCService = NULL;
    405.     CloseServiceHandle(SCManager);
    406.     SCManager = NULL;
    407.  
    408.     if(retCode == DRV_SUCCESS)
    409.         started = FALSE;
    410.     return retCode;
    411. }
    412.  
    413. #endif
    Вот код который работет довольно хорошо.
    P.S. Вызывается так:
    DWORD error = DrvFiles.LoadDriver(L"Driver.sys", NULL, NULL, TRUE);
    if (error != DRV_SUCCESS) ......
     
  18. DeeoniS

    DeeoniS New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2004
    Сообщения:
    132
    По поводу путей, у меня драйвер лежит C:\Program files\Soft\driver.sys, т.е. с пробелами все нормально.
    Когда ты делаешь CreateService, хендл вообще нормальный возращается, если да то попробуй закрыть хендл, не удаляя драйвер и зделать OpenService. А еще можно чтоб винда загружала попробовать. Может дело в драйвере
     
  19. DronG

    DronG Гунько Андрей

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    1
    Адрес:
    Донецк
    У меня было что-то похожее, многое перепробовал, а оказалось что по недоглядке мой DriverEntry завершаеться именно с такой ошибкой (при попытке открыть ветвь реестра). Посмотрите повнимательнее на Ваш DriverEntry - может причина в нем?
     
  20. ViCooper

    ViCooper Victor

    Публикаций:
    0
    Регистрация:
    11 дек 2006
    Сообщения:
    26
    Всем большое спасибо за помощь!

    Ашипка действительно в драйвере на этапе инициализации. А именно, при вызове IoCreateSymbolicLink не было магических вопросительных знаков ( \\??\\... ) в имени SymbolicLink. Отсюда и недопустимый путь к файлу после StartService.

    Нехочется никаво поучать ( сам балбес ), но всеже напишу пару замечаний по приведенному выше коду, для тех кто может захочет его использовать. Речь пайдет про заголовочный файл tchar.h. Ведь неплохо задумано, компилировать в ANSI или в UNICIDE один и тотже код изменив лиш один define, при условии шо код оформлен правильно. Например следующие фразы при использовании tchar.h бессмысленны:
    dirBuffer = (LPTSTR)malloc( len * sizeof( wchar_t ) ); // sizeof( TCHAR )
    len = (DWORD)( wcslen( sysPath ) ); // lstrlen( sysPath )
    wsprintf( driverDosName, L"\\\\.\\%s", auxBuffer ); // TEXT("\\\\.\\%s")
    LPCTSTR sysDriver = L"\\system32\\Drivers\\"; // TEXT("\\system32\\Drivers\\")
    Если же код пишется только для UNICODE( ANSI ) присутствие в коде TCHAR, PTSTR итд нежелательно.