115 lines
5.4 KiB
HTML
115 lines
5.4 KiB
HTML
; =============================================================================
|
||
; Модуль : Dispatcher Macros
|
||
; Файл : core/dispatcher_macros.inc
|
||
; Назначение : Макросы для авторегистрации сервисов VBoxGuest
|
||
; =============================================================================
|
||
|
||
; Структура SERVICE_ENTRY (52 байта = 13 DWORD)
|
||
struct SERVICE_ENTRY
|
||
id dd ? ; +0: Уникальный ID (auto-increment)
|
||
name_ptr dd ? ; +4: Указатель на строку имени
|
||
event_mask dd ? ; +8: Маска событий VMMDev
|
||
caps_mask dd ? ; +12: Маска guest capabilities
|
||
enabled dd ? ; +16: 0=выключен, 1=включен
|
||
autostart dd ? ; +20: 1=запуск с драйвером, 0=через vboxctrl
|
||
fn_init dd ? ; +24: Инициализация (или 0)
|
||
fn_enable dd ? ; +28: Включение (или 0)
|
||
fn_disable dd ? ; +32: Выключение (или 0)
|
||
fn_on_event dd ? ; +36: Обработчик IRQ (или 0)
|
||
fn_on_tick dd ? ; +40: Обработчик тика (или 0)
|
||
hgcm_wakeup_event dd ? ; +44: Event handle для пробуждения HGCM-треда из IRQ
|
||
hgcm_wakeup_event_id dd ? ; +48: Event euid для пробуждения HGCM-треда из IRQ
|
||
ends
|
||
|
||
; Алиас для кода использующего SERVICE_ENTRY_SIZE
|
||
SERVICE_ENTRY_SIZE = sizeof.SERVICE_ENTRY
|
||
|
||
; =============================================================================
|
||
; Инициализация списка сервисов (пустой)
|
||
; =============================================================================
|
||
__SERVICES_LIST__ equ
|
||
|
||
; =============================================================================
|
||
; REGISTER_SERVICE - Регистрация сервиса
|
||
; ID назначается автоматически (1, 2, 3, ...)
|
||
; =============================================================================
|
||
; Это позволяет корректно работать с IRP/forward
|
||
; =============================================================================
|
||
macro REGISTER_SERVICE svc_name, event_mask, caps_mask, fn_init, fn_enable, fn_disable, fn_on_event, fn_on_tick, autostart
|
||
{
|
||
; Добавляем в список с | как разделителем
|
||
; Формат: name|evmask|capmask|init|enable|disable|onevent|ontick|autostart
|
||
match any, __SERVICES_LIST__ \{
|
||
__SERVICES_LIST__ equ __SERVICES_LIST__,svc_name|event_mask|caps_mask|fn_init|fn_enable|fn_disable|fn_on_event|fn_on_tick|autostart
|
||
\}
|
||
match , __SERVICES_LIST__ \{
|
||
__SERVICES_LIST__ equ svc_name|event_mask|caps_mask|fn_init|fn_enable|fn_disable|fn_on_event|fn_on_tick|autostart
|
||
\}
|
||
}
|
||
|
||
; =============================================================================
|
||
; BUILD_SERVICE_TABLE - Генерация таблицы сервисов
|
||
; Создаёт:
|
||
; services_table - массив SERVICE_ENTRY
|
||
; services_table_end - метка конца
|
||
; services_count - количество сервисов (dd)
|
||
; SVC_ID_xxx - константы ID для каждого сервиса
|
||
; =============================================================================
|
||
macro BUILD_SERVICE_TABLE
|
||
{
|
||
align 4
|
||
services_table:
|
||
|
||
; Проверка: есть ли сервисы?
|
||
match , __SERVICES_LIST__ \{
|
||
display 'WARNING: No services registered!', 13, 10
|
||
\}
|
||
|
||
; Генерация записей
|
||
match list, __SERVICES_LIST__ \{
|
||
__BUILD_ENTRIES__ list
|
||
\}
|
||
|
||
services_table_end:
|
||
services_count dd __BUILD_ID__
|
||
}
|
||
|
||
; =============================================================================
|
||
; Вспомогательный макрос для построения записей
|
||
; =============================================================================
|
||
|
||
__BUILD_ID__ = 0
|
||
|
||
macro __BUILD_ENTRIES__ [entry]
|
||
{
|
||
forward
|
||
__BUILD_ID__ = __BUILD_ID__ + 1
|
||
; Парсим entry с разделителем |
|
||
; Формат: name|evmask|capmask|init|enable|disable|onevent|ontick|autostart
|
||
match _name|_evmask|_capmask|_init|_enable|_disable|_onevent|_ontick|_auto, entry \{
|
||
dd __BUILD_ID__ ; id
|
||
dd _name ; name_ptr
|
||
dd _evmask ; event_mask
|
||
dd _capmask ; caps_mask
|
||
dd 0 ; enabled = 0
|
||
dd _auto ; autostart
|
||
dd _init ; fn_init
|
||
dd _enable ; fn_enable
|
||
dd _disable ; fn_disable
|
||
dd _onevent ; fn_on_event
|
||
dd _ontick ; fn_on_tick
|
||
dd 0 ; hgcm_wakeup_event (заполняется сервисом в runtime)
|
||
dd 0 ; hgcm_wakeup_event_id
|
||
\}
|
||
}
|
||
|
||
; =============================================================================
|
||
; Макрос для получения ID по имени переменной (опционально)
|
||
; Использование: SVC_ID svc_name_var
|
||
; =============================================================================
|
||
macro SVC_ID name
|
||
{
|
||
; Поиск ID в рантайме через dispatcher_find_by_name
|
||
; Или использовать константу если известна
|
||
}
|