; ============================================================================= ; Модуль : Корректное завершение работы драйвера VBoxGuest ; Назначение : Деинициализация всех подсистем при выгрузке драйвера (DRV_EXIT) ; Файл : sys/shutdown.inc ; Порядок : По образцу Linux vbg_core_exit для избежания зависаний ; ============================================================================= ; Полная деинициализация драйвера VBoxGuest (вызывается при DRV_EXIT) proc sys_shutdown DEBUGF 2, "[VBoxGuest] Shutdown started\n" ; 1. Остановить все сервисы (отправить уведомления хосту) call dispatcher_disable_all DEBUGF 2, "[VBoxGuest] All services disabled\n" ; 2. Остановить таймер (ПЕРЕД IRQ detach, иначе tick вызовется во время cleanup) call timer_stop DEBUGF 2, "[VBoxGuest] Timer stopped\n" ; 3. Убрать IRQ handler ОБЯЗАТЕЛЬНО до освобождения буферов ; ISR не должна писать в освобождаемую память ; call vbox_irq_detach ; DEBUGF 2, "[VBoxGuest] IRQ handler detached\n" ; 4. Сбросить маски события и возможностей на хосте (маска = 0) xor eax, eax mov [dispatcher_active_events], eax call vmmdev_update_event_filter DEBUGF 2, "[VBoxGuest] Event filter cleared\n" mov [dispatcher_active_caps], eax call vmmdev_update_capabilities DEBUGF 2, "[VBoxGuest] Capabilities cleared\n" ; 5. Освободить пакеты (ПОСЛЕ IRQ detach — ISR больше не пишет в них) call hgcm_free_packets DEBUGF 2, "[VBoxGuest] HGCM packets freed\n" call vmmdev_free_packets DEBUGF 2, "[VBoxGuest] VMMDev packets freed\n" DEBUGF 2, "[VBoxGuest] Shutdown complete\n" xor eax, eax ret endp