Не могу установить драйвер с printui. Это потому, что срок действия сертификата водителя истек?

Я хочу установить драйвер виртуального принтера с printui, но получаю сообщение "Операция не может быть завершена (ошибка 0x00000002)" (ОС Win7 x64). Это связано с тем, что срок действия сертификата, использованного для подписи драйвера, истек? Или это имеет какие-то другие причины? Если да, то как я могу получить больше информации об ошибке (я не программист на C)?

Вот код для установки драйвера:

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    if (wcsstr(lpCmdLine, L"/chkxps"))
    {
        if (!PrinterExists(L"Microsoft XPS Document Writer"))
        {
            DispError(L"A MediSmart ePrinter nem telepíthető, mivel nem található XPS nyomtató a rendszerben");
            return -10;
        }
        return 0;
    }


    LPWSTR printername = L"MediSmart ePrinter";
    LPWSTR printername1 = L"MediSmart ePrinter - HealthFund";
    LPWSTR printername2 = L"MediSmart ePrinter - B2B Electronic";
    LPWSTR printername3 = L"MediSmart ePrinter - B2B Paper based";
    LPWSTR portname = L"NUL:";

    bool inst = wcsstr(lpCmdLine, L"/uninst") == NULL;

    if (inst)
    {
        PRINTER_DEFAULTS pdef;
        pdef.pDatatype = NULL;
        pdef.pDevMode = NULL;
        pdef.DesiredAccess = SERVER_ACCESS_ADMINISTER;

        DWORD oneed;
        DWORD err;

        HANDLE hxcv;
        if (!OpenPrinter(L",XcvMonitor Local Port", &hxcv, &pdef))
        {
            DispError(L"A virtuális nyomtató port létrehozása nem sikerült");
            return -1;
        }
        XcvData(hxcv, L"AddPort", (LPBYTE)portname, (wcslen(portname) + 1)*2, NULL, NULL, &oneed, &err);
        ClosePrinter(hxcv);
        if (err && err != ERROR_ALREADY_EXISTS)
        {
            DispError(L"A virtuális nyomtató port létrehozása nem sikerült");
            return -2;
        }
    }

    //TODO ez nem lesz igy jo, ha majd drivert akarunk frissiteni
    if (!inst || !PrinterExists(printername))
    {
        typedef void (CALLBACK *RunDllEntry)(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow);

        HMODULE hmod = LoadLibrary(L"printui.dll");
        if (!hmod)
        {
            DispError(L"A virtuális nyomtatót nem sikerült telepíteni: a printui.dll nem található");
            return -3;
        }
        RunDllEntry entry = (RunDllEntry)GetProcAddress(hmod, "PrintUIEntryW");
        if (!entry)
        {
            FreeLibrary(hmod);
            DispError(L"A virtuális nyomtatót nem sikerült telepíteni: hibás printui.dll");
            return -3;
        }
        WCHAR cmd[1000];
        if (inst)
        {
            wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter.inf\"", printername, portname, lpCmdLine);
            entry(NULL, hmod, cmd, SW_SHOW);
            wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_hf.inf\"", printername1, portname, lpCmdLine);
            entry(NULL, hmod, cmd, SW_SHOW);
            wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_b2bel.inf\"", printername2, portname, lpCmdLine);
            entry(NULL, hmod, cmd, SW_SHOW);
            wsprintf(cmd, L"/if /m \"%s\" /r \"%s\" /f \"%s\\mseprinter_b2bpb.inf\"", printername3, portname, lpCmdLine);
            entry(NULL, hmod, cmd, SW_SHOW);
        }
        else
        {
            wsprintf(cmd, L"/dl /n \"%s\"", printername);
            entry(NULL, hmod, cmd, SW_SHOW);
            wsprintf(cmd, L"/dl /n \"%s\"", printername1);
            entry(NULL, hmod, cmd, SW_SHOW);
            wsprintf(cmd, L"/dl /n \"%s\"", printername2);
            entry(NULL, hmod, cmd, SW_SHOW);
            wsprintf(cmd, L"/dl /n \"%s\"", printername3);
            entry(NULL, hmod, cmd, SW_SHOW);
        }
        FreeLibrary(hmod);
    }

    #ifndef _DEBUG
    if (inst)
        RemoveDirectoryTree(lpCmdLine);
    #endif

    return 0;
}

person kovacs lorand    schedule 03.07.2014    source источник
comment
Код ошибки Win32 0x00000002 = ERROR_FILE_NOT_FOUND: Система не может найти указанный файл.. Но вы не указываете ни функцию, которая возвращает вам код ошибки.   -  person Gonmator    schedule 03.07.2014
comment
@Gonmator: О, спасибо. Когда я погуглил, что операция не может быть завершена (ошибка 0x00000002), я получил только ошибки, связанные с принтером.   -  person kovacs lorand    schedule 03.07.2014
comment
Вы можете просмотреть список кодов системных ошибок здесь. Я предполагаю, что ошибка в XcvData()? Убедитесь, что portname указан правильно, и попробуйте удалить + 1 из (wcslen(portname) + 1)*2.   -  person jliv902    schedule 03.07.2014
comment
@jliv902: Спасибо. Извините, забыл указать, в какой строке ошибка. Есть 4 вызова: entry(NULL, hmod, cmd, SW_SHOW);   -  person kovacs lorand    schedule 03.07.2014


Ответы (1)


Я нашел ответ: я должен запустить его с аргументом команды, указывающим путь...

person kovacs lorand    schedule 03.07.2014
comment
просто дополняя, запустив printui для установки драйвера, у которого нет действительного или устаревшего сертификата, появится окно с запросом подтверждения о достоверности поставщика драйвера. - person Undefined Behavior; 05.12.2014