Не мога да инсталирам драйвер с 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: О, благодаря. Когато потърсих в Google операцията не може да бъде завършена (грешка 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-те извиквания на: запис(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