Как правило, вы не можете надежно определить ОС в C (++) или программе на языке ассемблера.
Вы можете различать разные «совместимые» версии одной и той же ОС, используя некоторые из ее функций, которые доступны в таких разных версиях ОС, как GetSystemInfo()
/ GetNativeSystemInfo()
в Windows, но недоступны в DOS, Linux и другие ОС.
Это сложнее обнаружить в подпрограмме на ассемблере, потому что в разных ОС существуют разные способы вызова функций ОС, и если вы делаете это неправильно для ОС, ваша программа падает. Чтобы предотвратить его аварийное завершение, вам нужно установить какой-то тип исключения или обработчик сигнала, но это также зависит от ОС.
Вывод ОС из содержимого регистров ЦП общего назначения также ненадежен, поскольку их значения не гарантируют, что они каким-то образом отражают ОС, и даже если в некоторых случаях это случится, это может измениться в будущем, в том числе в ближайшем будущем. при обновлении ОС (например, установка исправлений безопасности).
Возможно, вы сможете выполнить команду оболочки, такую как ver
для Windows и uname -a
для Linux, используя функцию C system()
, но нет переносимого способа извлечь выходные данные из этой команды в окне консоли и скопировать это обратно в программу для анализа.