Все статьи >> Что есть модули Apache2 под Microsoft Windows (просмотров: 1935)

Что есть модули Apache2 под Microsoft Windows

В этой статье я попытаюсь ответить на этот вопрос, который меня начал волновать не так давно и впрочем, волнует и сейчас, т.е. содержимое этого текста не является завершенным.
Для этого я скачал и установил Apache2 (apache_2.2.4-win32-x86-no_ssl.msi).
В директории \modules содержатся исполняемые файлы модулей, файлы модулей имеют расширение *.so (насколько я знаю, в unix-подобных ОС такое расширение файлов имеют исполняемые модули с бинарным кодом, скорее всего в формате elf).
Так же были взяты на рассмотрение исходные коды примеров модулей.

Исследование модуля Apache2

Просматривая исходники в httpd-2.2.4\modules, я мало что понял.
Понятно, что общее для всех модулей это код:

 

module AP_MODULE_DECLARE_DATA logio_module;

module AP_MODULE_DECLARE_DATA logio_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config */
NULL, /* merge per-dir config */
NULL, /* server config */
NULL, /* merge server config */
NULL, /* command apr_table_t */
register_hooks /* register hooks */
};
Где register_hooks функция обратного вызова, которая регистрирует функции обратного вызова, вызываемые при определенных условиях, той частью, которую некоторые зовут «ядром апача»
Но как проходит взаимодействие, как построена плагинная (модульная система) Apache2?
Как компилировать модули? И многие другие вопросы остались неясны.
Поэтому, был взят первый попавшийся модуль для Apache2 (мне попался mod_status.so) и был подвергнут препарации, посредством замечательной утилиты IDA Pro.
Выяснено, что модуль mod_status.so ни что иное как DLL, в которой присутствуют секции: релокации, данных, кода, ресурсов (где собственно и определена версия, которую видно на рисунке 1) импорта, экспорта.
Данные DLL модуля Apache
Рисунок 1. Свойства mod_status.so
Зачем нужны эти секции и что такое можно, почитать в гугле, так как это выходит за рамки содержания этого текста.
Итак, у DLL mod_status.so есть точка входа DllMain (на самом деле это не настоящая точка входа этого модуля, так как в нем используется CRT и реальная точка входа вызывает __CRT_INIT, что это такое и что она делает опять-таки можно почитать в гугле)
А чем же занимается DllMain в данном модуле?
Да собственно ничем:
Модуль Apache с точки зрения IDA
Рисунок 2. Модуль Apache2 с точки зрения IDA
Эта точка входа вызывается при событиях:
  • загрузки процессом этой DLL (DLL_PROCESS_ATTACH),
  • выгрузки DLL процессом (DLL_PROCESS_DETACH),
  • создание процессом нового потока (DLL_THREAD_ATTACH),
  • завершением потока процессом (DLL_THREAD_DETACH)
Вызов DisableThreadLibraryCalls() запрещает вызов DllMain при событиях связанных с созданием и удалением потоков процессом. Сделано это для оптимизации.
Просмотрев секцию импорта, определено что, модуль статически импортирует функции из:
  • KERNEL32.DLL
  • MSVCRT.DLL
  • LIBAPR-1.DLL
  • LIBAPRUTILS-1.DLL
  • LIBHTTPD.DLL
Что это за библиотеки, я думаю, читающий понимает.
Просматривание секции экспорта дало вот что: каждый модуль экспортирует некую переменную name_module, где name – имя модуля, например status_module
А эта переменная – указатель на структуру module, определенную в файле http_config.h:
/**
* Module structures. Just about everything is dispatched through
* these, directly or indirectly (through the command and handler
* tables).
*/

typedef struct module_struct module;
struct module_struct {
/** API version, *not* module version; check that module is
* compatible with this version of the server.
*/

int version;
/** API minor version. Provides API feature milestones. Not checked
* during module init */

int minor_version;
/** Index to this modules structures in config vectors. */
int module_index;
/** The name of the module’s C file */
const char *name;
/** The handle for the DSO. Internal use only */
void *dynamic_load_handle;
/** A pointer to the next module in the list
* @defvar module_struct *next */

struct module_struct *next;
/** Magic Cookie to identify a module structure; It’s mainly
* important for the DSO facility (see also mod_so). */

unsigned long magic;
/** Function to allow MPMs to re-write command line arguments. This
* hook is only available to MPMs.
* @param The process that the server is running in.
*/

void (*rewrite_args) (process_rec *process);
/** Function to allow all modules to create per directory configuration
* structures.
* @param p The pool to use for all allocations.
* @param dir The directory currently being processed.
* @return The per-directory structure created
*/

void *(*create_dir_config) (apr_pool_t *p, char *dir);
/** Function to allow all modules to merge the per directory configuration
* structures for two directories.
* @param p The pool to use for all allocations.
* @param base_conf The directory structure created for the parent directory.
* @param new_conf The directory structure currently being processed.
* @return The new per-directory structure created
*/

void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);
/** Function to allow all modules to create per server configuration
* structures.
* @param p The pool to use for all allocations.
* @param s The server currently being processed.
* @return The per-server structure created
*/

void *(*create_server_config) (apr_pool_t *p, server_rec *s);
/** Function to allow all modules to merge the per server configuration
* structures for two servers.
* @param p The pool to use for all allocations.
* @param base_conf The directory structure created for the parent directory.
* @param new_conf The directory structure currently being processed.
* @return The new per-directory structure created
*/

void *(*merge_server_config) (apr_pool_t *p, void *base_conf,
void *new_conf);
/** A command_rec table that describes all of the directives this module
* defines. */

const command_rec *cmds;

/** A hook to allow modules to hook other points in the request processing.
* In this function, modules should call the ap_hook_*() functions to
* register an interest in a specific step in processing the current
* request.
* @param p the pool to use for all allocations
*/

void (*register_hooks) (apr_pool_t *p);
Теперь примерно ясно, как работают модули:
Apache из файла httpd.conf, выбирает записи типа LoadModule actions_module modules/mod_actions.so, где modules/mod_actions.so – путь к модулю, а actions_module – имя экспортируемой модулем mod_actions.so переменной, в которой содержится структураmodule, ну а далее думаю все понятно.
Подведем итоги:
Модуль для Apache2 под Microsoft Windows – это DLL, экспортирующая указатель на переменную типа module, корректно заполненную, модуль может использовать функции из DLL:
  • LIBAPR-1.DLL
  • LIBAPRUTILS-1.DLL
  • LIBHTTPD.DLL
которые импортируются им статически.

Создание модуля Apache2 с помощью Microsoft Visual C++ .NET

Ну теперь пример модуля, который можно собрать с помощью Microsoft Visual C++ .NET:
1.Создаем новый проект:
Новый проект для модуля Apache 2
Рисунок 3. Новый проект для модуля Apache 2
Какой тип приложения мы выберем, не имеет значения, потому что это DLL. Но выбирать что-то надо, поэтому выбираем Console. Далее указываем:
Выбираем тип приложения для модуля Apache 2
Рисунок 4. Выбираем тип приложения для модуля
2. Далее добавляем новый файл, где будет размещаться исходный код:
Добавляем файлы приложения
Рисунок 5. Добавляем файлы приложения
Далее размещаем наш исходный код в нем.
3. Настраиваем созданный проект:
Указываем включаемые файлы:
Указываем включаемые файлы
Рисунок 6. Указываем включаемые файлы
Указать, где находятся DLL, используемые этим модулем:
Указываем импортируемые библиотеки
Рисунок 7. Указываем импортируемые библиотеки
Так же можно указать расширение исполняемого файла:
Указываем расширение исполняемого файла
Рисунок 8. Указываем расширение исполняемого файла
Если вы создали cpp файл, то следует указать компилятору, что его нужно компилировать как c-файл:
Устанавливаем параметры сборки
Рисунок 9. Устанавливаем параметры сборки
И собираем модуль
В  содержится пример такого модуля, для компиляции которого вам необходимо указать путь к включаемым файлам и библиотекам статической линковки

Автор: unknow [regiomontanus(at)mail(dot)ru]
 
 
Email:
не зарегистрированы?
Пароль:
забыли?
 
Астраханские магазины