; ============================================================================= ; Clipboard (HGCM service: Shared Clipboard / SHCL) ; ============================================================================= struct SHCL_MSG_GET header HGCM_CALL msg_type HGCM_PARM formats HGCM_PARM ends struct SHCL_FORMATS_REPORT header HGCM_CALL formats HGCM_PARM ends struct SHCL_DATA_READ header HGCM_CALL format HGCM_PARM buffer HGCM_PARM size HGCM_PARM ends struct SHCL_DATA_WRITE header HGCM_CALL format HGCM_PARM buffer HGCM_PARM ends ; ============================================================================= ; Clipboard Structures ; ; ПРИМЕЧАНИЕ: Старые структуры SHCL_MSG_GET, SHCL_FORMATS_REPORT, ; SHCL_DATA_READ, SHCL_DATA_WRITE УДАЛЕНЫ — они не нужны. ; ; Новый код использует плоский массив HGCM_PARM + hgcm_call32_pagelist, ; как в guest_props. Структуры с встроенным HGCM_CALL заголовком ; были нужны только для ручного формирования пакетов через ; hgcm_send_request, что больше не используется. ; ============================================================================= ; struct CLIPBOARD_STATE ; client_id dd ? ; HGCM client ID ; connected dd ? ; 0 = not connected, 1 = connected ; formats_host dd ? ; Форматы доступные на хосте (битовая маска VBOX_SHCL_FMT_*) ; formats_guest dd ? ; Форматы доступные у гостя ; listen_state dd ? ; error_count dd ? ; ends struct CLIPBOARD_STATE client_id dd ? ; HGCM client ID connected dd ? ; 0/1 listen_state dd ? ; IDLE/SUBMITTED error_count dd ? ; Счетчик ошибок formats_host dd ? ; Форматы от хоста formats_guest dd ? ; Наши форматы has_data dd ? ; Есть данные для чтения data_size dd ? ; Размер данных ; Динамически выделяемые буферы data_buf_ptr dd ? ; -> clip_data_buf (KernelAlloc 64K) listen_pkt_virt dd ? ; -> clip_listen_pkt (KernelAlloc 4096, DMA) listen_pkt_phys dd ? ; физ. адрес listen_pkt parms_ptr dd ? ; -> clip_parms (KernelAlloc) debug_buf_ptr dd ? ; -> clip_debug_buf (KernelAlloc) ; Поток слушателя (thread-based listener) hgcm_event dd ? ; event handle (из CreateEvent) hgcm_event_id dd ? ; event euid (из CreateEvent) thread_id dd ? ; thread ID (из CreateThread) thread_stop dd ? ; 1 = попросить поток завершиться ends