Набор тестовых Win32 программ
Описание
текущий набор задач использует следующие syscall'ы NtCreateFile, NtOpenFile, NtWriteFile, NtClose. Набор состоит из следующих программ:
create.exe — создает файл, используя ntdll.lib
create2.exe — создает файл, не используя ntdll.lib
writefile.exe — пишет в существующий файл в юникоде, используя ntdll.lib
writefile2.exe — пишет в существующий файл в юникоде, используя ntdll.lib
Примечание
- Так как создавались программы с минимальными зависимостями, пришлось отказать от libc, в следствии чего отсутствуют функции mainCRTStartup и подобные, которые являются настоящими точками входа в программу, точка входа в программу указывается с помощью опции /entry линкера.
- mainCRTStartup в libc организует передачу в main() аргументов командой строки.
- Передачи аргументов в данной реализации нет, для задания неоторых опций определены define'ы:
- CREATING_FILE – файл, который создается программой create
- WRITING_FILE – файл, в который пишет программа writefile
- WRITE_WORD – слово, записываемое в WRITING_FILE
исходники, сборка
исходники
в папках 2003 и xp находятся библиотека ntdll для 2003 и xp версий Windows соответственно.
для сборки используется nmake:
- nmake /F makefile_xp [var=value ..] для winxp
- nmake /F makefile_2003 [var=value ..] для win2003
можно указать в качестве цели одну из вышеперечисленных программ, тогда будет собрана только она.
var --один из вышеперечисленных define'ов, value — его значение.
очистка:
nmake /F makefile_xp clean
little hint по cl.exe и link.exe:
- флаг /Gz указывает использовать соглашение _stdcall при вызове функций
- /NODEFAULTLIB не линкует со стандартными библиотеками
Примечание
Для вызова syscall'ов в программах без зависимости от ntdll используется инструкция sysenter архитектуры i686, её можно заменить, реализовав функцию _syscall@0 иначе чем в sysenter.asm
Программы для solaris
исходники
В данной реализации аргументы функций для пока что мнимых syscall'ов помещались так же как и в windows (cdecl соглашение), производятся два «мнимых» call'а — дважды помещается в стек регистр esp, затем в eax помещался номер syscall'а (использовались номера аналогичные win2003), а edx — текущее значение esp. Далее следует вызов sysenter.
Примечание
- Для создания configure скрипта использовать autoconf
- В отличии от версий для win здесь использовался AT&T ассемблер (стандартный в gcc), тогда как в MSVC используется intell'овский синтаксис.
Ссылки