Я вижу две проблемы, и обе они касаются длины возможного значения "VS90COMNTOOLS"
.
Первая GetEnvironmentVariable
используется неправильно.Если переданный буфер недостаточно велик для хранения значения переменной среды, возвращаемое значение GetEnvironmentVariable
- это количество символов, необходимое для хранения значения, включая нулевой терминатор.Если функция завершается ошибкой из-за того, что буфер недостаточно велик, возвращаемое значение не равно нулю, как предполагает ваш код.Вы должны увидеть, является ли возвращаемое значение 0 (для сбоя, например, не найден) или оно больше, чем размер буфера, переданного (слишком мало).
Во-вторых, dwSize
используется для выделения1024 символа для sGetVS
, где в буфере sBuffEnv
выделено 4097 символов.Если значение, возвращаемое в sBuffEnv
, превышает 1024 символа, вы будете переполнять буфер, выделенный для sGetVS
, при выполнении StringCchCopy
, что приведет к серьезному повреждению кучи, вызывающему прерывание работы вашего приложения (или любое другое странное действие).
Обновление
Если переменная среды слишком велика, чтобы поместиться в предоставленном буфере, возвращаемое значение из GetEnvironmentVariable
- это размер, необходимый для того, чтобы буфер мог содержатьпеременная.В этом случае содержимое sBuffEnv
не определено (может быть нетронутым, может быть усеченным значением с или без нулевого терминатора, содержать мусор ..., нет никаких гарантий, что оно может содержать после вызова).Если это так, вы можете использовать неверные данные, когда делаете StringCchCopy
.