Files
kolibrios/drivers/vboxguest/core/dispatcher/dispatcher_macros.inc
lex ab59015ded
Some checks failed
Build system / Check kernel codestyle (pull_request) Has been cancelled
Build system / Build (pull_request) Has been cancelled
Add VBoxGuest driver code
2026-03-04 21:16:17 +03:00

115 lines
5.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; =============================================================================
; Модуль : 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
; Или использовать константу если известна
}