; ============================================================================= ; 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 @@: }