драйвер umdf2 с CreateService

Могу ли я запустить драйвер umdf2 с помощью API CreateService и StartService в Windows 10? Я ищу любой работающий образец, на который я мог бы сослаться.

Раньше я делал это с драйвером WDM, но в настоящее время мне не удалось сделать это с драйвером umdf2. Вот код

WCHAR strPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, strPath);
std::wstring binaryPath(strPath);
binaryPath += L"\\" + pDeviceName + L".dll";

std::string logPath(binaryPath.begin(), binaryPath.end());
cout << "Load Path : " << logPath << endl;

SC_HANDLE hManager, hService;
hManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!hManager) {
    DWORD err = GetLastError();
    if (err == ERROR_ACCESS_DENIED) {
        cout << "OPenSCManager Access denied - run administration access" << endl;
    } else {
        cout << "OPenSCManager Error : " << err << endl;
    }
    return;
}

hService = CreateService(hManager, pDeviceName.c_str(), pDeviceName.c_str(), SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
    SERVICE_ERROR_NORMAL, binaryPath.c_str(), NULL, NULL, NULL, NULL, NULL);
if (!hService) {
    hService = OpenService(hManager, pDeviceName.c_str(), SERVICE_ALL_ACCESS);
    if (!hService) {
        CloseServiceHandle(hManager);
        return;
    }
}

if (!StartService(hService, 0, NULL)) {
    DWORD err = GetLastError();
    cout << "StartService Error : " << err << endl;
    if (err == ERROR_SERVICE_ALREADY_RUNNING) {
        cout << "Already running" << endl;
    }
}

CloseServiceHandle(hManager);
CloseServiceHandle(hService);

pDeviceName относится к имени драйвера. Выполнение кода завершается с ошибкой 2:

StartService Error : 2

Я тестировал это как в Win7, так и в Win10, и результат тот же.


person miradham    schedule 10.01.2019    source источник


Ответы (1)


Код ошибки сказал нам большую часть вещей:

Система не может найти указанный файл.

Во-первых, убедитесь, что (pDeviceName).dll находится в текущем каталоге.

Во-вторых, проверьте его зависимости с помощью таких инструментов, как Dependency Walker, переместите их в Current Directory или System Directory, чтобы убедиться, что система также может найти зависимости.

Затем попробуйте проверить "regedit", открыть ключ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\pDeviceName или другие подобные имена. Проверьте значение ключа «ImagePath», путь был создан в первый раз. Переместите dll в путь или измените путь на dll.

person Drake Wu    schedule 10.01.2019
comment
pDeviceName.dll действительно находится в текущем каталоге. Пробовал копировать в System32 и SysWow64. Оба дают одинаковый результат. FYI pDeviceName.dll — это очень простой драйвер umdf2, созданный для целей тестирования, который не имеет никакой зависимости. - person miradham; 10.01.2019
comment
@miradham, как вы проверяете каталог? режим отладки или просто запустить тестовую программу? в какой каталог вы поместили dll? Папка отладки или папка .sln? В моем тесте, если dll находится в папке отладки, используйте режим отладки, текущий каталог находится в пути решения и возвращает ошибку 2. - person Drake Wu; 10.01.2019
comment
Я только что убедился, что dll и исполняемый файл моей тестовой программы находятся в одном каталоге. Каталог находится за пределами пути решения, и я скопировал как dll, так и exe. Можете ли вы подтвердить, что вы можете запустить его без ошибок? - person miradham; 10.01.2019
comment
Попробуйте проверить regedit, открыть ключ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\pDeviceName или другие подобные имена. Проверьте значение ключа ImagePath, путь был создан в первый раз. Переместите dll в путь или измените путь на dll. - person Drake Wu; 10.01.2019
comment
Я проверил ImagePath, и он содержит неожиданный вопросительный знак, то есть \??\restofthepath, не уверен, нормально это или нет... но удаление вопросительных знаков приводит к ошибке 123 от StartService. Пока безуспешно - person miradham; 10.01.2019
comment
Это нормально, не удаляйте его. - person Drake Wu; 10.01.2019
comment
SO не позволяет мне комментировать дальше. Давайте поговорим поподробнее - person miradham; 10.01.2019