Это интересный вопрос, по крайней мере для меня, вот некоторые из моих мыслей.
Ваше понимание верно, приложение, работающее на виртуальной машине XP, имеет доступ только к API Win32, предоставляемым XP на виртуальной машине. Один из многих способов, которыми я видел подход Microsoft к расширению определенных API, заключается в создании новых функций с расширенной / фиксированной функциональностью и присвоении новой функции имени, добавляя Ex и даже ExEx к исходному имени, например
GetVersion
GetVersionEx
Для функций, которые принимают указатели на структуры, структуры «версионируются» с использованием размера структуры для определения требуемой функциональности, поэтому старый код будет передавать предыдущий размер структуры, в то время как более новый код будет передаваться в более новая более крупная структура и функции API соответственно.
I догадываюсь , проблема заключается в том, что это уже не просто различия в том, как работает API, а в большей степени интеграция в функционирование операционной системы и внутренних структур, которые имеют достаточно значительные изменения, что, вероятно, плохо написанный код эффективно нарушен.
Что касается вашего настоящего вопроса, я думаю, это было бы довольно сложно. Даже если подумать, что ОС сможет отрегулировать, как она выполняет код на основе целевой версии ОС в заголовке PE исполняемого файла, что произойдет, если в процесс, нацеленный на последнюю ОС, будет загружена более новая библиотека DLL, как теперь ОС? справиться с этим, когда код выполняется? ИМХО, я думаю, что это будет очень сложно, из-за ловушек, которые в конечном итоге потерпят неудачу.
Конечно, это только мои грубые мысли по этой теме, поэтому я могу ошибаться на 100%, и есть простой подход, который просто не приходит в голову.