64 lines
1.6 KiB
HTML
64 lines
1.6 KiB
HTML
; =============================================================================
|
|
; Модуль : HGCM Async
|
|
; Назначение : Ожидание завершения async HGCM запросов
|
|
; Файл : hgcm/async.inc
|
|
; Версия : 1.0
|
|
; Дата : 2025.01.15
|
|
; =============================================================================
|
|
|
|
; hgcm_wait_async
|
|
proc hgcm_wait_async uses ebx ecx edx esi, request_ptr:dword
|
|
mov esi, [request_ptr]
|
|
test esi, esi
|
|
jz .bad
|
|
|
|
mov ecx, HGCM_TIMEOUT_ITERS
|
|
|
|
DEBUGF __DEBUG_HGCM__, "[VBoxGuest] [HGCM] Waiting for async completion (timeout=%d iterations)\n", HGCM_TIMEOUT_ITERS
|
|
|
|
.wait_loop:
|
|
mfence
|
|
mov eax, [esi + HGCM_HEADER.flags]
|
|
|
|
test eax, VBOX_HGCM_REQ_DONE
|
|
jnz .completed
|
|
|
|
test eax, VBOX_HGCM_REQ_CANCELLED
|
|
jnz .cancelled
|
|
|
|
dec ecx
|
|
jz .timeout
|
|
|
|
; короткая задержка
|
|
push ecx
|
|
mov ecx, 1000
|
|
.delay:
|
|
pause
|
|
loop .delay
|
|
pop ecx
|
|
|
|
jmp .wait_loop
|
|
|
|
.completed:
|
|
mfence
|
|
DEBUGF __DEBUG_HGCM__, "[VBoxGuest] [HGCM] Async request completed\n"
|
|
xor eax, eax
|
|
ret
|
|
|
|
.cancelled:
|
|
DEBUGF __DEBUG_HGCM__, "[VBoxGuest] [HGCM] Async request cancelled\n"
|
|
mov eax, VERR_GENERAL_FAILURE
|
|
ret
|
|
|
|
.timeout:
|
|
DEBUGF __DEBUG_HGCM__, "[VBoxGuest] [HGCM] *** ASYNC TIMEOUT ***\n"
|
|
DEBUGF __DEBUG_HGCM__, "[VBoxGuest] [HGCM] Current flags: 0x%x\n", [esi + HGCM_HEADER.flags]
|
|
DEBUGF __DEBUG_HGCM__, "[VBoxGuest] [HGCM] Request RC: 0x%x\n", [esi + HGCM_HEADER.header.rc]
|
|
mov eax, VERR_TIMEOUT
|
|
ret
|
|
|
|
.bad:
|
|
mov eax, VERR_INVALID_POINTER
|
|
ret
|
|
endp
|