Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 20.11.07 08:51
Оценка:
Привет

Подскажите пожалуйста такую вещь:
Есть у меня простенький драйвер. Я его регистрирую из своей софтины вот таким вот образом:

    SC_HANDLE service = CreateService( scm,
                                        driverName,
                                        driverName,
                                        SERVICE_ALL_ACCESS,
                                        SERVICE_KERNEL_DRIVER,
                                        SERVICE_DEMAND_START,
                                        SERVICE_ERROR_NORMAL,
                                        driverExec,
                                        NULL, NULL, NULL, NULL, NULL );

Регистрация проходит успешно. После этого я пытаюсь драйвер стартануть вот так вот:

    SC_HANDLE service = OpenService( scm, driverName, SERVICE_ALL_ACCESS );
    if( service != NULL )
    {
        result = StartService( service, 0, NULL ); //Возвращает 0
        if( !result && ( error = GetLastError() ) != ERROR_SERVICE_ALREADY_RUNNING ) //GetLastError = ERROR_FILE_NOT_FOUND
        {
            std::cout << "Error: " << error << std::endl;
        }//if
    }//if

Но драйвер не стартует и ошибка после попытки запуска — ERROR_FILE_NOT_FOUND. Путь к файлу проверял — файл драйвера на месте. Подскажите, в чем проблема?
Удачи тебе, браток!
Re: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: serg_fork  
Дата: 20.11.07 11:41
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Но драйвер не стартует и ошибка после попытки запуска — ERROR_FILE_NOT_FOUND. Путь к файлу проверял — файл драйвера на месте. Подскажите, в чем проблема?


Как задан driverExec ?
Re[2]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 20.11.07 17:41
Оценка:
Здравствуйте, serg_fork, Вы писали:

_>Здравствуйте, Glоbus, Вы писали:


G>>Но драйвер не стартует и ошибка после попытки запуска — ERROR_FILE_NOT_FOUND. Путь к файлу проверял — файл драйвера на месте. Подскажите, в чем проблема?


_>Как задан driverExec ?


driverExec задается в виде:

#define DRIVERPATH _T("C:\\Windows\\system32\\drivers\\Drv000.sys")
....
//где-то в коде
InstallDriver( scm, DRIVERNAME, DRIVERPATH ); //внутри этой функции непосредственно вызывается CreateService(...)


В реестре путь имеет вид при этом:

ImagePath = System32\Drivers\Drv000.sys


Пробовал устанавливать и из других мест (например путь был D:\\Projects\\Drv000\\Debug\\Drv000.sys, в реестре — '\??\D:\Projects\Drv000\Debug\Drv000.sys') — результат тот же.
Удачи тебе, браток!
Re[3]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Аноним  
Дата: 20.11.07 22:46
Оценка:
G>
G>#define DRIVERPATH _T("C:\\Windows\\system32\\drivers\\Drv000.sys")
G>....
G>//где-то в коде
G>InstallDriver( scm, DRIVERNAME, DRIVERPATH ); //внутри этой функции непосредственно вызывается CreateService(...)
G>

#define DRIVERPATH _T("\\??\\C:\\Windows\\system32\\drivers\\Drv000.sys")
Re[4]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 21.11.07 10:28
Оценка:
Здравствуйте, Аноним, Вы писали:

G>>
G>>#define DRIVERPATH _T("C:\\Windows\\system32\\drivers\\Drv000.sys")
G>>....
G>>//где-то в коде
G>>InstallDriver( scm, DRIVERNAME, DRIVERPATH ); //внутри этой функции непосредственно вызывается CreateService(...)
G>>

А>#define DRIVERPATH _T("\\??\\C:\\Windows\\system32\\drivers\\Drv000.sys")

Возвращает ошибку ERROR_INVALID_NAME.
Удачи тебе, браток!
Re: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: ABar Украина  
Дата: 21.11.07 12:16
Оценка:
Здравствуйте, Glоbus, Вы писали:

А какая версия ОС? Если 64 bit Edition, то возможна проблема из-за file system redirection на system32\SysWOW64.
Re[2]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: ABar Украина  
Дата: 21.11.07 12:55
Оценка:
Здравствуйте, ABar, Вы писали:

А запуск с консоли sc start <имя службы драйвера> проходит нормально или тоже не стартует ?
Re[3]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: serg_fork  
Дата: 21.11.07 14:31
Оценка:
Здравствуйте, ABar, Вы писали:

AB>Здравствуйте, ABar, Вы писали:


AB>А запуск с консоли sc start <имя службы драйвера> проходит нормально или тоже не стартует ?


Подозреваю, что не стартует.

Попробую немного потелепатить и пофантазировать Есть ли в DriverEntry код, подобный этому?

status = SomeDirectoryFileOperation(...) // тут отгребаем ERROR_FILE_NOT_FOUND
if !NT_SUCCESS(status) return status; //ERROR_FILE_NOT_FOUND
Re[4]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 21.11.07 17:38
Оценка:
Здравствуйте, serg_fork, Вы писали:

_>Здравствуйте, ABar, Вы писали:


Доброго вечерочка
Отвечу по порядкуЖ

AB>>Здравствуйте, ABar, Вы писали:


AB>>А запуск с консоли sc start <имя службы драйвера> проходит нормально или тоже не стартует ?


Не стартует, пишет: [SC] StartService: OpenService FAILED 2:

_>Подозреваю, что не стартует.


_>Попробую немного потелепатить и пофантазировать Есть ли в DriverEntry код, подобный этому?


_>
_>status = SomeDirectoryFileOperation(...) // тут отгребаем ERROR_FILE_NOT_FOUND
_>if !NT_SUCCESS(status) return status; //ERROR_FILE_NOT_FOUND
_>


Не совсем понял, что есть SomeDirectoryFileOperation(), но никаких операций с файлами в DriverEntry нету.
Вообще код DriverEntry такой (взял тестовый пример из Солдатова чтоб просто проверить в чем косяк):


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{
    NTSTATUS status = STATUS_SUCCESS;

    PDEVICE_OBJECT fdo;
    UNICODE_STRING devName;

    DriverObject->DriverUnload = UnloadRoutine;
    DriverObject->MajorFunction[ IRP_MJ_CREATE ] = Create_File_IRPProc;
    DriverObject->MajorFunction[ IRP_MJ_CLOSE ] = Close_HandleIRPProc;
    DriverObject->MajorFunction[ IRP_MJ_READ ] = ReadWrite_IRPHandler;
    DriverObject->MajorFunction[ IRP_MJ_WRITE ] = ReadWrite_IRPHandler;
    DriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL ] = DeviceControlRoutine;

    RtlInitUnicodeString( &devName, L"\\Device\\Drv000" );

    status = IoCreateDevice( DriverObject, sizeof(EXAMPLE_DEVICE_EXTENSION), &devName, FILE_DEVICE_UNKNOWN,
        0, FALSE, &fdo );

    if( !NT_SUCCESS(status) ) return status;

    PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension;
    dx->fdo = fdo;

    UNICODE_STRING symLinkName;
#define    SYM_LINK_NAME    L"\\DosDevices\\Drv000"
    RtlInitUnicodeString( &symLinkName, SYM_LINK_NAME );
    dx->ustrSymLinkName = symLinkName;

    status = IoCreateSymbolicLink( &symLinkName, &devName );
    if( !NT_SUCCESS( status ) )
    {
        IoDeleteDevice( fdo );
        return status;
    }

    KeInitializeSpinLock( &spinLick );

    return status;
}
Удачи тебе, браток!
Re[5]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Аноним  
Дата: 21.11.07 18:17
Оценка:
G>Не стартует, пишет: [SC] StartService: OpenService FAILED 2:
Дык фэйлится OpenService? Значит он нифига не зареган. По кр мере под тем именем что открыть пытаетесь.
Re[6]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 22.11.07 08:34
Оценка:
Здравствуйте, Аноним, Вы писали:

G>>Не стартует, пишет: [SC] StartService: OpenService FAILED 2:

А>Дык фэйлится OpenService? Значит он нифига не зареган. По кр мере под тем именем что открыть пытаетесь.

Сорри, опечатка. Фейлится именно StartService (строчка "OpenService" в буфере была — случайно вставил).
Удачи тебе, браток!
Re: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 22.11.07 10:39
Оценка:
Здравствуйте, Glоbus, Вы писали:


G>Но драйвер не стартует и ошибка после попытки запуска — ERROR_FILE_NOT_FOUND. Путь к файлу проверял — файл драйвера на месте. Подскажите, в чем проблема?



Еще вопрос: а не играет ли рояль то, что сборка дебажная (хотя я Депендсом просмотрел — вроде нет никаких левых длл-ин на которые бы бинарник был завязан и которые бы не находились).
Удачи тебе, браток!
Re[2]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Геннадий Майко США  
Дата: 22.11.07 13:35
Оценка:
Здравствуйте, Glоbus,

G>Еще вопрос: а не играет ли рояль то, что сборка дебажная (хотя я Депендсом просмотрел — вроде нет никаких левых длл-ин на которые бы бинарник был завязан и которые бы не находились).

--
Вообще-то играет. Вряд ли это Ваш случай, но если используется DLL co-installer'a и она написана, например, на основе MFC, то потребуются соответствующие библиотеки, если их не будет — драйвер не загрузиться.

Попробуйте перед запуском драйвера "руками" прописать ImagePath как "system32\Drivers\_your_driver_file_name_.sys" и скопировать файл драйвера в эту директорию.

Попробуйте включить setupapi.log и проанализируйте его.

А Ваш драйвер случайно не PNP?

C уважением,
Геннадий Майко.
Re[3]: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 22.11.07 14:10
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, Glоbus,


G>>Еще вопрос: а не играет ли рояль то, что сборка дебажная (хотя я Депендсом просмотрел — вроде нет никаких левых длл-ин на которые бы бинарник был завязан и которые бы не находились).

ГМ>--
ГМ>Вообще-то играет. Вряд ли это Ваш случай, но если используется DLL co-installer'a и она написана, например, на основе MFC, то потребуются соответствующие библиотеки, если их не будет — драйвер не загрузиться.

Нет, никакие длл-ны не используются. Драйвер простой как угол дома, сделан для тестинга — его задача только загрузиться, запуститься и ответить на пару простейших команд.

ГМ>Попробуйте перед запуском драйвера "руками" прописать ImagePath как "system32\Drivers\_your_driver_file_name_.sys" и скопировать файл драйвера в эту директорию.


Копировал и туда — тот же результат.

ГМ>Попробуйте включить setupapi.log и проанализируйте его.


Спасибо, щас попробую.

ГМ>А Ваш драйвер случайно не PNP?


Нет, самый что нинаесть простой драйвер.

ГМ>C уважением,

ГМ>Геннадий Майко.
Удачи тебе, браток!
Re: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Maxim S. Shatskih Россия  
Дата: 22.11.07 18:31
Оценка: 4 (1)
Если имя .SYS файла совпадает с именем сервиса, и лежит этот файл в system32\drivers — то вообще не нужно ImagePath задавать.
Занимайтесь LoveCraftом, а не WarCraftом!
Re: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: axxie  
Дата: 22.11.07 22:36
Оценка:
Можете отловить проблему с помошью filemon'а. Загружаете и включаете его перед попыткой запуска драйвера и ищете в его логах вашу ошибку. По-крайней мере будете знать, какой файл пытаются открыть. Это если дело в файле, а не в каком-нибудь ключе реестра.
Re: Запуск драйвера, ошибка ERROR_FILE_NOT_FOUND
От: Glоbus Украина  
Дата: 23.11.07 10:22
Оценка:
Всем спасибо за внимание, проблема разрешилась — мой косяк был Неверно указал runtime library в настройках компайлера.
Удачи тебе, браток!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.