48 lines
2.1 KiB
HTML
48 lines
2.1 KiB
HTML
; =============================================================================
|
|
; Модуль : Корректное завершение работы драйвера 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
|