CreateEnvironmentBlock возвращает блок слишком большой для CreateProcessWithLogon в Windows Vista
Я использую функцию Microsoft CreateProcessWithLogonW для запуска программы от имени конкретного пользователя. Практически во всех наших тестовых сценариях все отлично. Наш код похож на пример на странице Microsoft. Проблема возникает на Windows Vista. Мы создаем блок среды, используя:
CreateEnvironmentBlock(&lpvEnv, hToken, TRUE)
затем мы передаем это CreateProcessWithLogonW:
CreateProcessWithLogonW(argv[1], NULL, argv[2],
LOGON_WITH_PROFILE, NULL, argv[3],
CREATE_UNICODE_ENVIRONMENT, lpvEnv, szUserProfile,
&si, &pi)
Проблема в том, что блок окружения длиннее 5120 символов. Единственное место, где я видел это упомянутое, находится в разделе комментариев на странице Microsoft:
"Недокументированное ограничение на размер блока среды. Блок среды, передаваемый с параметром" lpEnvironment ", не должен содержать более 5120 символов, включая завершающие символы \0 и конечный разделитель \0.
Если блок среды превышает этот предел, вызов вызовет ошибку "0x000006F7: заглушка получила неверные данные".
В Windows 7 с пакетом обновления 1 (SP1) документированные ограничения составляют 32767 байтов для среды и 8192 байта для каждой переменной. Однако функция CreateProcessWithLogonW не была адаптирована к этим новым ограничениям. Он по-прежнему не принимает более 5120 символов.
Есть ли что-нибудь, что можно с этим сделать? Я не решаюсь взломать блок среды.
1 ответ
Надеюсь, к настоящему времени эта конкретная проблема была исправлена. Однако, для дальнейшего использования, самый простой обходной путь в такой ситуации - использовать CreateProcessWithLogonW() для запуска исполняемого файла прокси, а не программы, которую вы на самом деле хотите запустить. Затем исполняемый файл прокси-сервера настраивает среду по мере необходимости и запускает целевую программу, используя обычный старый CreateProcess().