UndeadDragon
@UndeadDragon
Разработчик ПО на C++, Qt, Python и др.

Почему возникает ошибка в CreateProcessWithLogonW Error 1783: The stub received bad data?

Привет. У меня есть такой тестовый код для запуска процесса от имени юзера:
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");

    std::string user;
    std::string pass;
    std::cout << "user: ";
    getline(std::cin, user);
    std::cout << "\npass: ";
    getline(std::cin, pass);
    std::cout << std::endl;

    std::wstring suser = std::wstring(user.begin(), user.end());
    LPCWSTR su = suser.c_str();
    std::wstring spass = std::wstring(pass.begin(), pass.end());
    LPCWSTR sp = spass.c_str();

    DWORD     dwSize =  0;
    HANDLE    hToken ;
    LPVOID    lpvEnv =  0;
    PROCESS_INFORMATION pi = {0};
    STARTUPINFO         si = {0};
    WCHAR               szUserProfile[256] = L"";

    si.cb = sizeof(STARTUPINFO);

    if (!LogonUser(su, L".", sp, LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, &hToken))
        qDebug() << "LogonUser";

    if (!CreateEnvironmentBlock(&lpvEnv, hToken, TRUE))
        qDebug() << "CreateEnvironmentBlock";

    dwSize = sizeof(szUserProfile)/sizeof(WCHAR);

    if (!GetUserProfileDirectory(hToken, szUserProfile, &dwSize))
        qDebug() << "GetUserProfileDirectory";

    WCHAR app[] = L"\"C:\\Program Files (x86)\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe\" \"C:\\Users\\UD\\Desktop\\insect immunity.pdf\"";
    if (!CreateProcessWithLogonW(su, L".", sp,
            LOGON_WITH_PROFILE, NULL, app,
            CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile,
            &si, &pi)) {
            LPVOID lpMsgBuf;
            LPVOID lpDisplayBuf;
            DWORD dw = GetLastError();

            FormatMessage(
                FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                dw,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMsgBuf,
                0, NULL );

            // Display the error message and exit the process

            lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
                (lstrlen((LPCTSTR)lpMsgBuf) + 40) * sizeof(TCHAR));
            StringCchPrintf((LPTSTR)lpDisplayBuf,
                LocalSize(lpDisplayBuf) / sizeof(TCHAR),
                TEXT("failed with error %d: %s"), dw, lpMsgBuf);
            qDebug() << QString::fromWCharArray((LPTSTR)lpDisplayBuf);
    }

    if (!DestroyEnvironmentBlock(lpvEnv))
        qDebug() << "DestroyEnvironmentBlock";

    CloseHandle(hToken);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    system("pause");
    return 0;
}


У меня он выдает плавающую ошибку "Error 1783: The stub received bad data". Плавающую потому, что иногда она пропадает и все работает. Взаимосвязи выявить не удалось. Пытался удалить лишние сервисы, как советует MSDN, но много удалить не смог и ничего не поменяло.
У моего друга на компьютере все идеально, тестировали как могли, ни разу ошибка не вылезла.
Я конечно могу и с виртуалки работать с этим кодом, но возникает вопрос, не будет ли такой херни когда я перенесу проект на машины заказчика. Поэтому нужно знать почему это возникает и как бороться. Если кто сталкивался - буду признателен за совет.
  • Вопрос задан
  • 3460 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Мне кажется, что перед вызовом CreateEnvironmentBlock не хватает вызова LoadUserProfile.
Не коррелирует ли успешное выполнение с загруженностью профиля пользователя в реестр?
Что происходит, если выкинуть все танцы с получением домашнего каталога пользователя и вызывать CreateProcessWithLogonW с NULL environment и доступным пользователю текущим каталогом?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы