Набор тестовых Win32 программ
Пока что разобраны syscall'ы
NtCreateFile,
NtOpenFile,
NtWriteFile,
NtClose. и на их основе были реализованы программы.
create.exe — создает файл, используя ntdll.lib
create2.exe — создает файл, не используя ntdll.lib
writefile.exe — пишет в существующий файл HELLO в юникоде, используя ntdll.lib
writefile2.exe — пишет в существующий файл HELLO в юникоде, используя ntdll.lib
исходники, сборка
исходники
в папках 2003 и xp находятся библиотека ntdll для 2003 и xp версий Windows соответственно.
при
сборке используется nmake:
- nmake -f makefile_xp для winxp
- nmake -f makefile_2003 для win2003
можно указать в качестве цели одну из вышеперечисленных программ, тогда будет собрана только она.
очистка:
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.
Примечание
- Для сборки использовать 32-битную версию gcc, sunstudio не проверялся
- В отличии от версий для win здесь использовался AT&T ассемблер (стандартный в gcc), тогда как в MSVC используется intell'овский синтаксис.
- Естественно проверки на адекватную работу произвести не возможно (разве что только формирование стека).
TODO LIST
- задать строковые константы как дефайны, создать простенький configure-скрипт для генерации makefile'а использующего их. (Для win версии или bat файл, или найти документацию по nmake — судя по небольшому сравнению с gnu make вполне реализуемо)
- вынести все определения функций, директивы препроцессора в отдельный header-файл.