Подгрузка кучи системных DLL к пустой самописной библиотеке
Такой необычный вопрос.. В MSVC создаю пустой проект DLL-ки, в сорс добавляю только:
bool APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
https://yadi.sk/i/3bewimmn3JjWvj
Собственно, такой вопрос... а как мне сделать реально пустую длл? В которой будет только то, что мне нужно. Чтобы я, к пример, мог дёргать WinAPI напрямую через GetProcAddress? Чтобы не было ничего лишнего в виде вот этой толпу подгруженных библиотек
PS: kernel32.lib все равно придется оставить, для GetProcAddress
PPS: Насчет т.н. "веса": ваш кусок из одной процедуры = 4K, заголовки и прочая лабуда, коие располагаются вне пределов страницы с исполняемым кодом
Ну нет :-) Там оно в 512 байт вместится (непосредственно код). Если он отвяжется от рантайма, то с таким кодом 1.5 Кб вроде будет DLL. Если будут вызываться какие-то функции из системных библиотек, то тут вроде 2.5 Кб минимум.
Автору:
9 Кб ещё могут быть из-за того, что DLL собирается в конфигурации Debug. А чтобы отвязаться от рантайма, надо, как минимум, переопределить точку входа на свою main() и в настройках C/C++ → Создание кода выключить исключения C++ и проверку переполнения буфера. Ну и, естественно, нигде не звать функции из рантайма ☺
Ну нет :-) Там оно в 512 байт вместится (непосредственно код). Если он отвяжется от рантайма, то с таким кодом 1.5 Кб вроде будет DLL. Если будут вызываться какие-то функции из системных библиотек, то тут вроде 2.5 Кб минимум.
А как по вашему работает системный загрузчик? Копирует данные из файлика в память посредством memcpy?
PS: Онанизм на ерунду вида "у меня самый маленький в мире coff файл" есть ни что иное как одурь.
Я знаю, как он работает :-)
Автор-то про размер не в памяти писал, а на диске. Как он написал, так и я ему. В памяти оно, естественно, мапается на страницы.