Это оказывает такое большое влияние из-за давно известной слабости в Win32 API.
Программы порождаются в Win32 через системный вызов CreateProcess() . Это может быть использовано несколькими способами. Люди, пришедшие из фонов Unix, Linux или OS/2, обычно думают, что они берут два отдельных аргумента для программы (файл образа) для появления и командный хвост для передачи новому процессу, потому что имена файлов и аргументы векторы /командные хвосты это две разные вещи в API этих операционных систем. Но на самом деле системный вызов может быть вызван в альтернативной форме с именем программы и аргументами, объединенными в одну большую строку. CreateProcess() попытается отделить имя файла программы от хвоста команды.
Проблема заключается в том, что он делает это путем постепенного разделения строки по два на каждый последующий пробел, пока левая часть не совпадет с файлом или каталогом. Многие программы Win32 пытаются передать такие строки, как C:\Program Files\Contoso\TakeOver.exe StackExchange.com в системный вызов. Это запустит нужную программу - C:\Program Files\Contoso\TakeOver.exe - с правильным хвостом команды - StackExchange.com - до момента, когда какой-то явно опасный человек придет и создаст файл C:\Program такой же, как вы сделал.
В этот момент системный вызов завершается попыткой запустить файл образа программы C:\Program с помощью команды tail Files\Contoso\TakeOver.exe StackExchange.com . Небеса помогут вам, если C:\Program на самом деле является образом исполняемой программы.
Это общий недостаток, и он применяется к любому имени файла программы, содержащему пробелы в сочетании с любой программой, которая использует One Big String для порождения других программ. Но наиболее распространенным случаем, который поражает это, являются все программы, которые живут в C:\Program Files\ и большое количество программ Win32, которые используют подход One Big String.
Слишком поздно менять Win32 API. Это было слишком поздно десять лет назад. И Microsoft не может изменить все программы, написанные другими людьми, которые передают одну большую строку вместо двух в CreateProcess() . Таким образом, Microsoft при входе в систему проверяет Windows на наличие C:\Program и отображает предупреждение, которое вы видите.
И, как вы можете видеть, в документе Microsoft Win32 есть серьезное предупреждение "Безопасность", в котором говорится, что разработчики не должны писать программы с использованием подхода One Big String, который существует уже несколько лет.
дальнейшее чтение