Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Win32API] ошибка при StartService, запуск драйвера 
V
    Опции темы
anatox91
Дата 29.10.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



есть простенький хелловордовский пример драйвера
Код

#include <ntddk.h>

VOID unload(PDRIVER_OBJECT driverObject) {
    DbgPrint("unload called!\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT theDriverObject, PUNICODE_STRING theRegistryPath) {
    DbgPrint("I'm loaded!\n");
    theDriverObject->DriverUnload = unload;
    return STATUS_SUCCESS;
}

и программка, которая по идее должна запускать этот драйвер
Код

#include "stdafx.h"
#include <windows.h>
#include <process.h>

void usage(char *p){ printf("Usage:\n%s l\t load driver from c:\\test_driver.sys\n%s u\tunload driver\n", p,p); } 
int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        usage(argv[0]);
        exit(0);
    }
    
    if(*argv[1] == 'l')
    {
        printf("Registering Driver.\n");
        
        SC_HANDLE sh = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if(!sh) 
        {
            puts("error OpenSCManager");
            exit(1);
        }

        SC_HANDLE rh = CreateService(
            sh, 
            L"test_driver", 
            L"test_driver", 
            SERVICE_ALL_ACCESS, 
            SERVICE_KERNEL_DRIVER, 
            SERVICE_DEMAND_START,
            SERVICE_ERROR_NORMAL, 
            L"C:\\test_driver.sys", 
            NULL, 
            NULL, 
            NULL, 
            NULL, 
            NULL);

        if(!rh) 
        {
            if (GetLastError() == ERROR_SERVICE_EXISTS) 
            {
                // serive exists
                rh = OpenService(    sh, 
                                    L"test_driver", 
                                    SERVICE_ALL_ACCESS);

                if(!rh)
                {
                    puts("error OpenService");
                    CloseServiceHandle(sh);
                    exit(1);
                }
            } 
            else 
            {
                puts("error CreateService");
                CloseServiceHandle(sh);
                exit(1);
            }
        }
        if(!StartService(rh, 0, NULL)) {
            printf("StartService failed: ");
            switch(GetLastError()) {
            case ERROR_ACCESS_DENIED: printf("ERROR_ACCESS_DENIED");
            break;
            case ERROR_INVALID_HANDLE: printf("ERROR_INVALID_HANDLE");
            break;
            case ERROR_PATH_NOT_FOUND: printf("ERROR_PATH_NOT_FOUND");
            break;
            case ERROR_SERVICE_ALREADY_RUNNING: printf("ERROR_SERVICE_ALREADY_RUNNING");
            break;
            case ERROR_SERVICE_DATABASE_LOCKED: printf("ERROR_SERVICE_DATABASE_LOCKED");
            break;
            case ERROR_SERVICE_DEPENDENCY_DELETED: printf("ERROR_SERVICE_DEPENDENCY_DELETED");
            break;
            case ERROR_SERVICE_DEPENDENCY_FAIL: printf("ERROR_SERVICE_DEPENDENCY_FAIL");
            break;
            case ERROR_SERVICE_DISABLED: printf("ERROR_SERVICE_DISABLED");
            break;
            case ERROR_SERVICE_LOGON_FAILED: printf("ERROR_SERVICE_LOGON_FAILED");
            break;
            case ERROR_SERVICE_MARKED_FOR_DELETE: printf("ERROR_SERVICE_MARKED_FOR_DELETE");
            break;
            case ERROR_SERVICE_NO_THREAD: printf("ERROR_SERVICE_NO_THREAD");
            break;
            case ERROR_SERVICE_REQUEST_TIMEOUT: printf("ERROR_SERVICE_REQUEST_TIMEOUT");
            break;
            default: printf("UNKNOWN ERROR");
            break;
            }
        }
    }
    else if(*argv[1]=='u')
    {
        SERVICE_STATUS ss;

        printf("Unloading Driver.\n");
        
        SC_HANDLE sh = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if(!sh) 
        {
            puts("error OpenSCManager");
            exit(1);
        }
        SC_HANDLE rh = OpenService(    
                            sh, 
                            L"test_driver", 
                            SERVICE_ALL_ACCESS);

        if(!rh) 
        {
            puts("error OpenService");
            CloseServiceHandle(sh);
            exit(1);
        }

        if(!ControlService(rh, SERVICE_CONTROL_STOP, &ss))
        {
            puts("warning: could not stop service");
        }

        if (!DeleteService(rh)) 
        {
            puts("warning: could not delete service");
        }

        CloseServiceHandle(rh);
        CloseServiceHandle(sh);
    }
    else usage(argv[0]);

    return 0;
}

при работе этой программы вызов StartService() завершается с ошибкой. Поставил свитч-кейсы для GetLastError(), пишет UNKNOWN ERROR, т.е. заходит в default-ветвь... в чем может быть проблема?
П.С. код ошибки 1275 в десятичной системе(4FBh)

Это сообщение отредактировал(а) anatox91 - 29.10.2010, 21:48


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 29.10.2010, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



еще гугл подсказал что 1275 - это ERROR_DRIVER_BLOCKED и видимо это из-за того что в семерке блокируются драйверы без цифровой подписи. Что в таком случае делают разработчики драйверов, как вообще их можно тестировать под Windows 7?


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Sartorius
Дата 29.10.2010, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



Цитата(anatox91 @  29.10.2010,  22:54 Найти цитируемый пост)
видимо это из-за того что в семерке блокируются драйверы без цифровой подписи

Ну тогда используй cat-файлы sample-ов из WDK. 
ЗЫ
Вообще лучше взять sceleton driver из WDK и его уже потом модифицировать....
PM MAIL ICQ   Вверх
anatox91
Дата 29.10.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



как с этими cat-ами вообще работать?

Добавлено через 13 минут и 43 секунды
все, вроде разобрался


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 29.10.2010, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



прочитал в документации что проверку подписи можно отключить если включить отладчик ядра:
Код

bcdedit /debug on

но при вводе этой команды выдает:
Код

C:\>bcdedit /debug on
Не удается открыть данные конфигурации загрузки.
Не удается найти указанный файл.

UAC настроен на самый низкий уровень, из-за чего такое еще может быть?


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Sartorius
Дата 30.10.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



Под админом запускаешь?
PM MAIL ICQ   Вверх
anatox91
Дата 30.10.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



естественно)


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 31.10.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



самое интересное что не помогает даже загрузка системы с опцией "Отключить проверку подписей драйверов" (через F8), драйвер все равно не хочет запускаться, программа вроде срабатывает нормально, но вывода в DebugView нет, и выскакивает окошко винды что мол требуется драйвер с цифровой подписью и этот драйвер недоступен...

Это сообщение отредактировал(а) anatox91 - 31.10.2010, 19:12


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 31.10.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



почему мне винда нивкакую не хочет дать запустить мой неподписанный драйвер, даже в Test Mode?

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  1.jpg 71,24 Kb


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 1.11.2010, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



вобщем получилось кое-как запустить все-таки драйвер с помощью KMDManager и той же F8 на старте...


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.