272 lines
12 KiB
HTML
272 lines
12 KiB
HTML
; =============================================================================
|
||
; 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
|
||
@@:
|
||
} |