Обновить
22
Андрей Андреев@ComradeAndrew

Senior Software Engineer

6
Подписчики
Отправить сообщение
И правда ведь. Неужели я так криво пробовал настройки, что решил, что это не так работает. Спасибо, много полезного на хабре узнать можно.
И еще, не подскажете ли такую вещь: в «Entry Point» можно любую точку входа вставить или только определенные? Где-то прочел, что линковщик ожидает определенные.
Понял, спасибо.
Круто! Работает на win10. А вы сразу в ассемблере писали или на си код есть?
Я думал об этом, ещё до того как написал этот «Hello, World!», но так и не осилили. На данный момент я плохо знаю структуру exe файла и тонкости компиляторов.
И да, в том экзешнике куча рантайма и дебага.
/SECTION:.text,ERW
Это что, устанавливает в секции все атрибуты? Ого.
В этом комментарии я показал во что превращается main. В то же самое, что и вставили в массив, компилятор никак не изменил этот код, потому что для него это были данные, а не код.
Точно так же, как если бы main был функцией. main является EntryPoint по умолчанию.
Вызывается
mainCRTStartup

Из него вызывается
__tmainCRTStartup

Затем сам
main

А main лежит в секции
.exre

И как видно по этому адресу лежит непосредственно наш
main
Раньше можно покороче сделать было байт-код.

Где это работало?
На сколько я знаю в windows прерывания заблокированы начиная с windows 2000.
Ну разве что исходного. Дизассеблер будет выглядеть как код составленный заботливым разработчиком (:
Я абсолютно с вами согласен. Это исключительный интерес. И в первую очередь проба себя в низкоуровневых областях программирования, если можно так выразиться.
Если правда интересно, то постараюсь придумать что-то похожее. Пока времени мало, но как сдам сессию наверняка вернусь к этому. Я даже не ожидал, что будет такой интерес :)
Честно говоря совсем не понял для чего столько пушей и что в итоге получается. Можете немного подробнее объяснить как это работает?
Да, действительно. На тулсете 2013 студии компилирует. Однако при компиляции тулсетом v140(visual studio 2015) она кидает error:
error LNK2001: unresolved external symbol _printf
Тут не поспоришь :)
Но мне кажется, что вариант с прототипом вполне неплохой и поддерживает стиль остального кода.
NtWriteFile в поток вывода? Интересно. Надо попробовать как по длине кода получится.
А у меня даже варнинга не выдает. Если ставить пробел после #include, как все нормальные люди, то получится одинаковая длина.
printf(char*,...);
#include <stdio.h>

Варнинг у меня только один. На &ptrprintf. Я хотел добавить макрос с кастом к int, чтобы оставить ту же длину и однородный цвет в таблице массива, но решил оставить как есть.
Да, вы правы. Об этом я не думал. Посмотрим, если наберется достаточно много интересных поправок, добавлю к статье модифицированный вариант.

Информация

В рейтинге
Не участвует
Откуда
Минск, Минская обл., Беларусь
Дата рождения
Зарегистрирован
Активность