Files
VBoxGuest/common/errors.inc
Alexey Mikhailov 0f400bc0e0 #1 init в репу
2026-01-06 15:43:37 +03:00

272 lines
12 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.
; =============================================================================
; VBoxGuest Driver для KolibriOS
; Модуль : Коды ошибок и обработка ошибок
; Назначение : Определения кодов ошибок VirtualBox и функции их обработки
; Источник : VBox/err.h, VBoxVideoErr.h
; =============================================================================
; =============================================================================
; Коды успеха (>= 0)
; =============================================================================
VINF_SUCCESS equ 0 ; Успешное выполнение
VINF_HGCM_ASYNC_EXECUTE equ 2903 ; HGCM выполняется асинхронно
; =============================================================================
; Общие коды ошибок (транспортный уровень VMMDev)
; Диапазон: -1 .. -999
; =============================================================================
VERR_GENERAL_FAILURE equ -1 ; Общая ошибка
VERR_INVALID_PARAMETER equ -2 ; Неверный параметр
VERR_INVALID_MAGIC equ -3 ; Неверная сигнатура
VERR_INVALID_HANDLE equ -4 ; Неверный handle
VERR_LOCK_FAILED equ -5 ; Ошибка блокировки
VERR_INVALID_POINTER equ -6 ; Неверный указатель
VERR_IDT_FAILED equ -7 ; Ошибка IDT
VERR_NO_MEMORY equ -8 ; Недостаточно памяти
VERR_ALREADY_LOADED equ -9 ; Уже загружен
VERR_PERMISSION_DENIED equ -10 ; Доступ запрещён
VERR_TIMEOUT equ -11 ; Таймаут операции
VERR_NOT_IMPLEMENTED equ -12 ; Не реализовано
VERR_NOT_EQUAL equ -18 ; Не равно
VERR_INTERRUPTED equ -39 ; Операция прервана
VERR_TOO_MUCH_DATA equ -42 ; Слишком много данных
VERR_NOT_FOUND equ -78 ; Не найдено
VERR_INVALID_STATE equ -79 ; Неверное состояние
VERR_OUT_OF_RESOURCES equ -80 ; Ресурсы исчерпаны
VERR_ALREADY_EXISTS equ -105 ; Уже существует
VERR_RESOURCE_BUSY equ -138 ; Ресурс занят (0xFFFFFF76)
VERR_INTERNAL_ERROR equ -225 ; Внутренняя ошибка
VERR_INVALID_FUNCTION equ -36 ; Неверная функция
VERR_NOT_SUPPORTED equ -37 ; Не поддерживается
VERR_ACCESS_DENIED equ -38 ; Доступ запрещён
; =============================================================================
; Коды ошибок HGCM (уровень сервисов)
; Диапазон: -2900 .. -2999
; =============================================================================
VERR_HGCM_SERVICE_NOT_FOUND equ -2900 ; Сервис не найден
VERR_HGCM_CLIENT_REJECTED equ -2901 ; Клиент отклонён
VERR_HGCM_INVALID_CMD_ADDRESS equ -2902 ; Неверный адрес команды
VERR_HGCM_INTERNAL equ -2904 ; Внутренняя ошибка HGCM
VERR_HGCM_INVALID_CLIENT_ID equ -2905 ; Неверный client ID
VERR_HGCM_PROTOCOL_ERROR equ -2906 ; Ошибка протокола
VERR_HGCM_TOO_MANY_CLIENTS equ -2908 ; Слишком много клиентов
VERR_HGCM_TOO_MANY_PARMS equ -2909 ; Слишком много параметров
; =============================================================================
; Коды ошибок Clipboard
; Диапазон: -7150 .. -7199
; =============================================================================
VERR_SHCLPB_NO_DATA equ -7153 ; Нет данных в буфере обмена
VERR_SHCLPB_FORMAT_NOT_SUPPORTED equ -7154 ; Формат не поддерживается
; =============================================================================
; Строки сообщений об ошибках
; =============================================================================
align 4
; Успех
msg_success db "Success", 0
msg_async_pending db "Async operation pending", 0
; Общие ошибки
msg_general_failure db "General failure", 0
msg_invalid_parameter db "Invalid parameter", 0
msg_invalid_pointer db "Invalid pointer", 0
msg_no_memory db "Out of memory", 0
msg_timeout db "Operation timed out", 0
msg_not_implemented db "Not implemented", 0
msg_invalid_function db "Invalid function", 0
msg_not_supported db "Not supported", 0
msg_access_denied db "Access denied", 0
msg_too_much_data db "Too much data", 0
msg_not_found db "Not found", 0
msg_invalid_state db "Invalid state", 0
msg_out_of_resources db "Out of resources", 0
msg_already_exists db "Already exists", 0
msg_internal_error db "Internal error", 0
msg_interrupted db "Operation interrupted", 0
msg_resource_busy db "Resource busy", 0
; Ошибки HGCM
msg_hgcm_service_not_found db "HGCM service not found", 0
msg_hgcm_client_rejected db "HGCM client rejected", 0
msg_hgcm_invalid_cmd db "Invalid HGCM command address", 0
msg_hgcm_internal db "HGCM internal error", 0
msg_hgcm_invalid_client db "Invalid HGCM client ID", 0
msg_hgcm_protocol_error db "HGCM protocol error", 0
msg_hgcm_too_many_clients db "Too many HGCM clients", 0
msg_hgcm_too_many_parms db "Too many HGCM parameters", 0
; Ошибки Clipboard
msg_shclpb_no_data db "No clipboard data", 0
msg_shclpb_format_not_supported db "Clipboard format not supported", 0
; Неизвестная ошибка
msg_unknown_error db "Unknown error", 0
; =============================================================================
; Таблица соответствия кодов ошибок и сообщений
; =============================================================================
struct ERROR_ENTRY
code dd ? ; Код ошибки
message dd ? ; Указатель на строку сообщения
ends
align 4
error_table:
; Коды успеха
dd VINF_SUCCESS, msg_success
dd VINF_HGCM_ASYNC_EXECUTE, msg_async_pending
; Общие ошибки
dd VERR_GENERAL_FAILURE, msg_general_failure
dd VERR_INVALID_PARAMETER, msg_invalid_parameter
dd VERR_INVALID_POINTER, msg_invalid_pointer
dd VERR_NO_MEMORY, msg_no_memory
dd VERR_TIMEOUT, msg_timeout
dd VERR_NOT_IMPLEMENTED, msg_not_implemented
dd VERR_INVALID_FUNCTION, msg_invalid_function
dd VERR_NOT_SUPPORTED, msg_not_supported
dd VERR_ACCESS_DENIED, msg_access_denied
dd VERR_TOO_MUCH_DATA, msg_too_much_data
dd VERR_NOT_FOUND, msg_not_found
dd VERR_INVALID_STATE, msg_invalid_state
dd VERR_OUT_OF_RESOURCES, msg_out_of_resources
dd VERR_ALREADY_EXISTS, msg_already_exists
dd VERR_INTERNAL_ERROR, msg_internal_error
dd VERR_INTERRUPTED, msg_interrupted
dd VERR_RESOURCE_BUSY, msg_resource_busy
; Ошибки HGCM
dd VERR_HGCM_SERVICE_NOT_FOUND, msg_hgcm_service_not_found
dd VERR_HGCM_CLIENT_REJECTED, msg_hgcm_client_rejected
dd VERR_HGCM_INVALID_CMD_ADDRESS, msg_hgcm_invalid_cmd
dd VERR_HGCM_INTERNAL, msg_hgcm_internal
dd VERR_HGCM_INVALID_CLIENT_ID, msg_hgcm_invalid_client
dd VERR_HGCM_PROTOCOL_ERROR, msg_hgcm_protocol_error
dd VERR_HGCM_TOO_MANY_CLIENTS, msg_hgcm_too_many_clients
dd VERR_HGCM_TOO_MANY_PARMS, msg_hgcm_too_many_parms
; Ошибки Clipboard
dd VERR_SHCLPB_NO_DATA, msg_shclpb_no_data
dd VERR_SHCLPB_FORMAT_NOT_SUPPORTED, msg_shclpb_format_not_supported
error_table_end:
error_table_count equ (error_table_end - error_table) / 8
; =============================================================================
; ПРОЦЕДУРА: error_get_message
; Назначение: Получение человеко-читаемого сообщения по коду ошибки
; Вход : EAX = код ошибки
; Выход: EAX = указатель на строку сообщения
; =============================================================================
proc error_get_message uses ebx ecx edi
mov ebx, eax ; Сохраняем код ошибки
mov edi, error_table ; Указатель на таблицу
mov ecx, error_table_count ; Количество записей
.loop:
cmp dword [edi], ebx ; Сравниваем код
je .found
add edi, 8 ; Следующая запись
loop .loop
; Ошибка не найдена
mov eax, msg_unknown_error
ret
.found:
mov eax, [edi + 4] ; Возвращаем указатель на сообщение
ret
endp
; =============================================================================
; ПРОЦЕДУРА: error_is_success
; Назначение: Проверка, является ли код успешным
; Вход : EAX = код
; Выход: EAX = 0 если успех, != 0 если ошибка
; ZF = 1 если успех
; =============================================================================
proc error_is_success
test eax, eax
jns .success ; Если >= 0, это успех
; Это ошибка
or eax, 1
ret
.success:
xor eax, eax
ret
endp
; =============================================================================
; ПРОЦЕДУРА: error_is_hgcm
; Назначение: Проверка, является ли ошибка HGCM-специфичной
; Вход : EAX = код ошибки
; Выход: EAX = 0 если HGCM ошибка, != 0 в противном случае
; ZF = 1 если HGCM ошибка
; =============================================================================
proc error_is_hgcm
cmp eax, -2910
jl .not_hgcm
cmp eax, -2900
jg .not_hgcm
xor eax, eax ; Это HGCM ошибка
ret
.not_hgcm:
or eax, 1
ret
endp
; =============================================================================
; МАКРОСЫ ДЛЯ ПРОВЕРКИ ОШИБОК
; =============================================================================
; Проверка кода возврата VMMDev и переход при ошибке
macro CHECK_VMMDEV_RC label_error {
stdcall error_is_success
jnz label_error
}
; Проверка результата HGCM и переход при ошибке
macro CHECK_HGCM_RESULT ptr, label_error {
mov eax, [ptr + HGCM_HEADER.result]
stdcall error_is_success
jnz label_error
}
; Проверка EAX на ошибку (отрицательное значение)
macro CHECK_ERROR label_error {
test eax, eax
js label_error
}
; Проверка успеха и переход при ошибке
macro CHECK_SUCCESS label_error {
call error_is_success
jnz label_error
}
; Вывод сообщения об ошибке
macro PRINT_ERROR {
push eax
call error_get_message
invoke SysMsgBoardStr, eax
pop eax
}
; Комбинированная проверка и вывод
macro CHECK_AND_PRINT label_error {
test eax, eax
jns @f
push eax
call error_get_message
invoke SysMsgBoardStr, eax
pop eax
jmp label_error
@@:
}