Системные вызовы Windows

У меня есть (очень) базовое понимание сборки с использованием системных вызовов в Linux (я использую сборщик GNU as). В Windows 7 я использую порт MinGW (32-разрядный) компилятора GCC для создания ассемблерных программ. В Linux я регулярно использую библиотеку C для некоторых взаимодействий с ОС в моих программах ассемблера, и на моей платформе Windows это отлично работает также с помощью MinGW. Иногда, однако, я хочу использовать низкоуровневые системные вызовы - в основном, чтобы мои исполняемые файлы были как можно меньше. В Linux я знаю, как это сделать:

movl        $0, %ebx
movl        $1, %eax
int $0x80   ; exit with code 0

Я также использую эти системные вызовы для чтения/записи символов в/из терминала (например, для записи в syscall с 4 в EAX). Мне было интересно, как это сделать на платформе Windows NT. Является ли это возможным? Я просмотрел эту таблицу, но я действительно не понимаю имена системных вызовов. Любая помощь приветствуется.

Ответ 1

Набор функций Nt* недокументирован по уважительной причине: он встроен в Windows и изменяется между версиями, а это означает, что программы, нацеленные на него напрямую, подвергаются высокому риску разрыва между версиями Windows.

На самом деле, это не такая уж большая нагрузка на нацеливание на общедоступные, документированные функции, и вы получаете гарантию Microsoft, что ваша программа будет работать с будущими версиями Windows, если вы правильно используете API.

По этой причине я не буду давать вам ответ, который вы хотите. Я настоятельно рекомендую вам использовать API публичной консоли: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx

Обновить

Я предполагаю, что это для экспериментов или для удовольствия, действительно ОП написал:

Однако иногда я хочу использовать низкоуровневые системные вызовы - в основном, чтобы мои исполняемые файлы были как можно меньше.

... Я нахожу эту линию рассуждений проблематичной, и я не хочу выступать в качестве активатора для такого рода методов разработки, тем более что нет практического преимущества использования системных вызовов для консольных задач.

Если кто-то хочет знать, как использовать низкоуровневые системные вызовы в Windows, тогда, пожалуйста, опубликуйте новый вопрос в соответствующей рамке, и я с удовольствием на него отвечу.

Но в качестве отправной точки см. Https://j00ru.vexillium.org/syscalls/nt/64/ для обратной таблицы таблиц системных вызовов x64 NT с разбивкой по версии ядра Windows. (Не используйте в переносимом коде, только для экспериментов, чтобы удовлетворить ваше любопытство о том, как работает Windows и/или ASM.)