binkd9x - это версия binkd, специально компилируемая для работы под управлением Win9x-систем (Windows 95/98/ME). Дело в том, что в этих операционных системах имеется документированная и при этом весьма противная ошибка в консольной подсистеме. Из-за ошибки консоль не получает никаких сигналов (сообщений), кроме клавиатурных CTRL_C_EVENT и CTRL_BREAK_EVENT. На практике это приводит к невозможности автоматического корректного завершения binkd, например, при shutdown'е или перезагрузке ОС. binkd9x не является консольным приложением и создаёт окно, которое получает сообщения системы. Фактически продолжает работать классический binkd, только без консоли (в скрытом режиме). Это недостаток номер 1. При этом для Win9x систем необходим отдельный бинарник. Это второй недостаток. Также binkd9x умеет работать сервисом под Win9x-системами. Конечно, этот режим работы нельзя сравнивать с сервисами под Windows NT/2000/XP по функциональности, но на Win9x в некоторых случаях это бывает необходимо, например, при частых Logoff'ах. binkd9x, установленный сервисом, загружается при старте системы (до Logon'а) и не останавливается при Logoff'е. binkd9x идентифицирует себя, как "Win9x", в отличие от обычного binkd для Win32 ("Win32"). Впрочем, такое поведение можно легко исправить в config.h В некоторых ситуациях binkd9x активирует временную консоль. При деактивации консоли ожидается нажатие любой клавиши. Отличие опций binkd9x от обычного binkd для Win32: "-T minimize to Tray" в binkd9x недоступна, т.к. за неимением консоли нечего и минимизировать. "-C exit(3) on config change" заменена на "-C reload on config change", т.е. binkd9x при указании ключа -C автоматически перезапускается при изменении конфигурационных файлов (в т.ч. в режиме сервиса) "-v be verbose / dump version and quit", "-h print this help", недокументированная "--help", а также при запуске без параметров binkd9x активирует временную консоль перед выполнением соответствующего действия. Новые опции: "-i install Win9x service" Инсталлирует сервис. Сервисы прописываются в реестр в ветвь "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices". Также в ветвь реестра "HKEY_LOCAL_MACHINE\Software\binkd9x" записывается текущий путь на момент инсталляции binkd9x. Сервис binkd9x при старте установит этот путь текущим. Если binkd9x при инсталляции был запущен из command.com'а или из оболочки (например из Far'а), то CommandLine процесса binkd9x содержит "короткое" имя файла (и "короткий" путь). Если необходимо при инсталляции занести в реестр "длинное" имя файла, то можно использовать команду start. Например: start binkd9x-mingw -i binkd.cfg При использовании команд "-i", "-u", "-t" binkd9x активирует временную консоль. Опция "-q" блокирует активацию временной консоли для всех трёх команд. При этом binkd9x будет сообщать пользователю лишь о важных ошибках при помощи всплывающего сообщения. Данный режим удобен в основном для автоматического управления сервисами командой "-t". Если установка сервиса прошла успешно, binkd9x пытается запустить сервис. "-u UNinstall Win9x service" Удаление сервиса. Работает аналогично команде "-i". Можно удалить все зарегистрированные сервисы, указав в опции "-S name" имя "all". Пример: 1. binkd9x -u ==> удалить binkd9x-service 2. binkd9x -u -S Zol ==> удалить binkd9x-service-Zol 3. binkd9x -u -S all ==> удалить все binkd9x-сервисы "-t cmd (start|stop|restart|status) service(s)" Команда для управления сервисами. "-t status" показывает состояние зарегистрированных в реестре сервисов binkd9x. "-t start" запускает сервисы. "-t stop" останавливает сервисы. "-t restart" перезапускает сервисы. Во всех случаях по умолчанию действия производятся с сервисом "binkd9x-service". Можно указать имя сервиса в опции "-S name", аналогично командам "-i" и "-u". Если вместо имени сервиса указать all, то операция будет проведена со всеми зарегистрированными в реестре сервисами. Использование опции "-q" с командой "-t status" особого смысла не имеет. Пример: 1. binkd9x -t status ==> Выведет состояние сервиса binkd9x-service 2. binkd9x -t status -S local ==> Выведет состояние сервиса binkd9x-service-local 3. binkd9x -t status -S all ==> Выведет состояние всех зарегистрированных сервисов 4. binkd9x -t status -S all -q ==> см. 2., но практического смысла не имеет (отсутствует консоль) 5. binkd9x -t start ==> Запустит сервис binkd9x-service, если тот не был запущен 6. binkd9x -t start -S local ==> см. 5., но для сервиса binkd9x-service-local 7. binkd9x -t start -S all ==> см. 5., но для всех сервисов. 9. binkd9x -t start -q ==> см. 5., но не создаёт консоль (удобно для автоматизации при помощи скриптов или bat-файлов). 10. binkd9x -t stop -q ==> аналогично 9., только остановка сервиса. ... ну и так далее... "-S name set Win9x service name, all - use all services" Указывает имя сервиса, с которым будут работать команды -i, -u и -t. Реальное имя сервиса (которое прописывается в реестре) строится по принципу: "binkd9x-service[-name]", где "binkd9x-service" - обязательная часть, а "-name" добавляется при наличии параметра "-S name". Для команд -u и -t допустимо использовать специальное имя сервиса all. В этом случае указанная операция будет произведена над всеми инсталлированными сервисами. Если в качестве "name" указано "binkd9x-service" или "binkd9x-service-*", то имя сервиса будет использовано "как есть", т.е. без дополнительного добавления префикса "binkd9x-service". Примеры: 1. binkd9x -i binkd.cfg ==> binkd9x-service 2. binkd9x -i -S local binkd.cfg ==> binkd9x-service-local 3. binkd9x -i -S binkd9x-service binkd.cfg ==> binkd9x-service 4. binkd9x -i -S binkd9x-service-local binkd.cfg ==> binkd9x-service-local 5. binkd9x -t status -S all ==> будет выведен статус всех проинсталлированных сервисов Сборка binkd9x: В настоящий момент binkd9x собирается под MSVC и MinGW. Технология сборки практически такая же, как и для обычного binkd. Для MSVC необходимо только указать nmake макрос "BINKD9X", например: 1. nmake BINKD9X=1 ==> соберёт binkd9x с Release-конфигурацией 2. nmake BINKD9X=1 DEBUG=1 ==> соберёт binkd9x с Debug-конфигурацией 3. nmake BINKD9X=1 DLLRTL=1 ==> соберёт binkd9x с использованием динамической RTL-библиотеки Под MinGW аналогично: make BINKD9X=1 ВНИМАНИЕ! При попеременной компиляции binkd и binkd9x под MinGW необходимо выполнять make clean или вручную удалить *.o, nt/*.o и ntlm/*.o файлы. Если этого не сделать, то возможны ошибки компиляции или неправильное функционирование binkd и binkd9x. Я буду рад, если binkd9x пригодится кому-то кроме меня. Alexander Reznikov, 2:4600/220@fidonet 99:2003/110@webnet homebrewer@yandex.ru