305 lines
15 KiB
HTML
305 lines
15 KiB
HTML
; =============================================================================
|
||
; VirtualBox SharedFolder Structures
|
||
; =============================================================================
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; Глобальное состояние SharedFolder драйвера
|
||
; -----------------------------------------------------------------------------
|
||
struct SF_STATE
|
||
connected dd ? ; 1 = HGCM подключен к сервису
|
||
client_id dd ? ; HGCM client ID
|
||
|
||
; Динамически выделяемые init-буферы
|
||
packet_ptr dd ? ; sf_packet (KernelAlloc 4096)
|
||
mappings_ptr dd ? ; sf_mappings (часть small_bufs)
|
||
namebuf_ptr dd ? ; sf_namebuf
|
||
cp866_buf_ptr dd ? ; sf_cp866_buf
|
||
listbuf_ptr dd ? ; sf_listbuf (KernelAlloc 4096)
|
||
createparms_ptr dd ? ; sf_createparms
|
||
dir_path_ptr dd ? ; sf_dir_path
|
||
small_bufs_ptr dd ? ; единый блок мелких буферов (KernelAlloc 4096)
|
||
|
||
; Динамически выделяемые FS-буферы
|
||
fs_packet_ptr dd ? ; vboxsf_fs_packet (KernelAlloc 4096)
|
||
fs_listbuf_ptr dd ? ; vboxsf_fs_listbuf (KernelAlloc 4096)
|
||
fs_iobuf_ptr dd ? ; vboxsf_fs_iobuf (KernelAlloc 65536)
|
||
fs_cparms_ptr dd ? ; vboxsf_fs_cparms (KernelAlloc 4096)
|
||
fs_pathbuf_ptr dd ? ; vboxsf_fs_pathbuf
|
||
fs_pathbuf2_ptr dd ? ; vboxsf_fs_pathbuf2
|
||
fs_tmpname_ptr dd ? ; vboxsf_fs_tmpname
|
||
fs_small_bufs_ptr dd ? ; единый блок мелких FS-буферов (KernelAlloc 4096)
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; Информация об одной shared folder (выделяется через KernelAlloc)
|
||
; -----------------------------------------------------------------------------
|
||
struct SF_FOLDER
|
||
root_handle dd ? ; SHFL root handle (от MAP_FOLDER)
|
||
active dd ? ; 1 = folder активен и подключен
|
||
name rb 256 ; Имя mapping (UTF-8, null-terminated)
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; Данные для виртуального диска /vbox/
|
||
; -----------------------------------------------------------------------------
|
||
struct VBOXSF_DISK
|
||
folders rd SHFL_MAX_FOLDERS ; Указатели на SF_FOLDER
|
||
count dd ? ; Количество папок
|
||
disk_handle dd ? ; Handle от DiskAdd
|
||
ends
|
||
|
||
; =============================================================================
|
||
; Структура DISKMEDIAINFO для querymedia callback
|
||
; =============================================================================
|
||
struct DISKMEDIAINFO
|
||
flags dd ? ; флаги медиа
|
||
sectorsize dd ? ; размер сектора
|
||
capacity dq ? ; емкость в секторах (64-bit)
|
||
ends
|
||
|
||
; =============================================================================
|
||
; Смещения внутренних структур ядра KolibriOS
|
||
; (нужны для create_partition callback)
|
||
; =============================================================================
|
||
KPARTITION_OFS_DISK = 16 ; PARTITION.Disk -> DISK*
|
||
KPARTITION_OFS_FSUSERFUNCTIONS = 20 ; PARTITION.FSUserFunctions -> UserFuncs*
|
||
KDISK_OFS_USERDATA = 16 ; DISK.UserData -> void*
|
||
|
||
; =============================================================================
|
||
; BDFE (Block Data File Entry) — формат записи в директории KolibriOS
|
||
; =============================================================================
|
||
BDFE_SIZE = 304 ; Размер одной BDFE записи (CP866)
|
||
BDFE_HEADER_SIZE = 32 ; Размер заголовка ответа ReadFolder
|
||
|
||
; Структура заголовка ReadFolder ответа
|
||
struct BDFE_HEADER
|
||
version dd ? ; Версия формата (1)
|
||
entries_placed dd ? ; Количество возвращенных записей
|
||
total_entries dd ? ; Общее количество записей
|
||
reserved rd 5 ; Зарезервировано (20 байт)
|
||
ends
|
||
|
||
; Смещения полей BDFE
|
||
BDFE_OFS_ATTR = 0 ; dword: атрибуты
|
||
BDFE_OFS_ENCODING = 4 ; byte: кодировка (0=CP866, 1=UTF-16, 2=UTF-8)
|
||
BDFE_OFS_CTIME = 8 ; dword: время создания
|
||
BDFE_OFS_CDATE = 12 ; dword: дата создания
|
||
BDFE_OFS_ATIME = 16 ; dword: время доступа
|
||
BDFE_OFS_ADATE = 20 ; dword: дата доступа
|
||
BDFE_OFS_MTIME = 24 ; dword: время модификации
|
||
BDFE_OFS_MDATE = 28 ; dword: дата модификации
|
||
BDFE_OFS_SIZE_LO = 32 ; dword: размер файла (младшие 32 бита)
|
||
BDFE_OFS_SIZE_HI = 36 ; dword: размер файла (старшие 32 бита)
|
||
BDFE_OFS_NAME = 40 ; 264 байта: имя файла (null-terminated)
|
||
|
||
; Атрибуты файлов
|
||
FA_READONLY = 0x01
|
||
FA_HIDDEN = 0x02
|
||
FA_SYSTEM = 0x04
|
||
FA_LABEL = 0x08
|
||
FA_FOLDER = 0x10
|
||
FA_ARCHIVED = 0x20
|
||
|
||
; Коды ошибок KolibriOS (syscall 70)
|
||
ERROR_SUCCESS = 0
|
||
ERROR_DISK_FULL = 1
|
||
ERROR_UNSUPPORTED = 2
|
||
ERROR_UNKNOWN_FS = 3
|
||
ERROR_FILE_NOT_FOUND = 5
|
||
ERROR_END_OF_FILE = 6
|
||
ERROR_MEMORY = 7
|
||
ERROR_ACCESS_DENIED = 10
|
||
ERROR_DEVICE = 11
|
||
|
||
; =============================================================================
|
||
; Смещения внутри SHFLFSOBJINFO (92 байта)
|
||
; Используются для конвертации в BDFE при ReadFolder/GetFileInfo
|
||
; =============================================================================
|
||
SHFLOBJINFO_OFS_SIZE_LO = 0 ; int64 cbObject (low)
|
||
SHFLOBJINFO_OFS_SIZE_HI = 4 ; int64 cbObject (high)
|
||
SHFLOBJINFO_OFS_ALLOC_LO = 8 ; int64 cbAllocated (low)
|
||
SHFLOBJINFO_OFS_ALLOC_HI = 12 ; int64 cbAllocated (high)
|
||
SHFLOBJINFO_OFS_BTIME_LO = 16 ; int64 BirthTime (low, nanosec)
|
||
SHFLOBJINFO_OFS_BTIME_HI = 20 ; int64 BirthTime (high)
|
||
SHFLOBJINFO_OFS_CTIME_LO = 24 ; int64 ChangeTime (low)
|
||
SHFLOBJINFO_OFS_CTIME_HI = 28 ; int64 ChangeTime (high)
|
||
SHFLOBJINFO_OFS_MTIME_LO = 32 ; int64 ModificationTime (low)
|
||
SHFLOBJINFO_OFS_MTIME_HI = 36 ; int64 ModificationTime (high)
|
||
SHFLOBJINFO_OFS_ATIME_LO = 40 ; int64 AccessTime (low)
|
||
SHFLOBJINFO_OFS_ATIME_HI = 44 ; int64 AccessTime (high)
|
||
SHFLOBJINFO_OFS_FMODE = 48 ; uint32 Attr (RTFMODE)
|
||
|
||
; Биты fMode (RTFMODE)
|
||
S_IFDIR = 0x4000
|
||
S_IFREG = 0x8000
|
||
|
||
; =============================================================================
|
||
; HGCM пакеты для SharedFolder операций
|
||
; =============================================================================
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_QUERY_MAPPINGS - Получить список доступных mappings
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_QUERY_MAPPINGS
|
||
header HGCM_CALL
|
||
flags HGCM_PARM ; IN: флаги (обычно 0)
|
||
count HGCM_PARM ; OUT: количество mappings
|
||
buffer HGCM_PARM ; OUT: буфер для данных (SHFLMAPPING[])
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_QUERY_MAP_NAME - Получить имя mapping по индексу
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_QUERY_MAP_NAME
|
||
header HGCM_CALL
|
||
index HGCM_PARM ; IN: индекс mapping (0..count-1)
|
||
name HGCM_PARM ; OUT: имя mapping (SHFLSTRING)
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_MAP_FOLDER - Подключить mapping
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_MAP_FOLDER
|
||
header HGCM_CALL
|
||
path HGCM_PARM ; IN
|
||
root HGCM_PARM ; OUT
|
||
delimiter HGCM_PARM ; IN
|
||
flags HGCM_PARM ; IN
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_UNMAP_FOLDER - Отключить mapping
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_UNMAP_FOLDER
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_CREATE - Открыть/создать файл
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_CREATE
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
path HGCM_PARM ; IN: путь к файлу (SHFLSTRING)
|
||
parms HGCM_PARM ; IN/OUT: параметры (SHFLCREATEPARMS)
|
||
ends
|
||
|
||
; Параметры создания файла (108 байт)
|
||
struct SHFLCREATEPARMS
|
||
handle_lo dd ? ; +0: OUT: SHFLHANDLE low (uint64_t)
|
||
handle_hi dd ? ; +4: OUT: SHFLHANDLE high
|
||
result dd ? ; +8: OUT: SHFLCREATERESULT
|
||
flags dd ? ; +12: IN: SHFL_CF_* CreateFlags
|
||
info rb 92 ; +16: IN/OUT: SHFLFSOBJINFO
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFLDIRINFO - одна запись в результате SHFL_FN_LIST (переменный размер)
|
||
; Фиксированная часть = 126 байт:
|
||
; SHFLFSOBJINFO (92) + cucShortName (2) + uszShortName (28) + SHFLSTRING hdr (4)
|
||
; За ней идут байты имени файла (переменная длина).
|
||
; -----------------------------------------------------------------------------
|
||
SHFLDIRINFO_FIXED_SIZE = 126
|
||
|
||
SHFLDIRINFO_OFS_INFO = 0 ; SHFLFSOBJINFO (92 bytes)
|
||
SHFLDIRINFO_OFS_SIZE_LO = 0 ; cbObject low
|
||
SHFLDIRINFO_OFS_SIZE_HI = 4 ; cbObject high
|
||
SHFLDIRINFO_OFS_FMODE = 48 ; fMode (RTFMODE)
|
||
SHFLDIRINFO_OFS_CUC_SHORT_NAME = 92 ; cucShortName (uint16)
|
||
SHFLDIRINFO_OFS_USZ_SHORT_NAME = 94 ; uszShortName (14 x uint16 = 28 bytes)
|
||
SHFLDIRINFO_OFS_NAME_SIZE = 122 ; SHFLSTRING.u16Size
|
||
SHFLDIRINFO_OFS_NAME_LENGTH = 124 ; SHFLSTRING.u16Length
|
||
SHFLDIRINFO_OFS_NAME_STRING = 126 ; SHFLSTRING.string (данные имени)
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_CLOSE - Закрыть файл
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_CLOSE
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
handle HGCM_PARM ; IN: file handle
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_READ - Читать из файла
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_READ
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
handle HGCM_PARM ; IN: file handle
|
||
offset_low HGCM_PARM ; IN: offset low (64-bit)
|
||
offset_high HGCM_PARM ; IN: offset high (64-bit)
|
||
size HGCM_PARM ; IN/OUT: размер для чтения
|
||
buffer HGCM_PARM ; OUT: буфер для данных
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_WRITE - Писать в файл
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_WRITE
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
handle HGCM_PARM ; IN: file handle
|
||
offset_low HGCM_PARM ; IN: offset low (64-bit)
|
||
offset_high HGCM_PARM ; IN: offset high (64-bit)
|
||
size HGCM_PARM ; IN/OUT: размер для записи
|
||
buffer HGCM_PARM ; IN: буфер с данными
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_LIST - Получить список файлов в директории
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_LIST
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; parm[0] IN: root handle (32bit)
|
||
handle HGCM_PARM ; parm[1] IN: dir handle (64bit!)
|
||
flags HGCM_PARM ; parm[2] IN: SHFL_LIST_* (32bit)
|
||
cb HGCM_PARM ; parm[3] IN/OUT: размер буфера (32bit)
|
||
path HGCM_PARM ; parm[4] IN: search pattern (опционально)
|
||
buffer HGCM_PARM ; parm[5] OUT: SHFLDIRINFO[]
|
||
resume_pt HGCM_PARM ; parm[6] IN/OUT: точка продолжения (32bit)
|
||
file_count HGCM_PARM ; parm[7] OUT: количество файлов (32bit)
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_INFORMATION - Получить информацию о файле
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_INFORMATION
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
handle HGCM_PARM ; IN: file handle
|
||
flags HGCM_PARM ; IN: флаги
|
||
info HGCM_PARM ; OUT: информация (SHFLFSOBJINFO)
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_REMOVE - Удалить файл
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_REMOVE
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
path HGCM_PARM ; IN: путь к файлу (SHFLSTRING)
|
||
flags HGCM_PARM ; IN: флаги
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_RENAME - Переименовать файл
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_RENAME
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
src HGCM_PARM ; IN: исходный путь (SHFLSTRING)
|
||
dst HGCM_PARM ; IN: новый путь (SHFLSTRING)
|
||
flags HGCM_PARM ; IN: флаги
|
||
ends
|
||
|
||
; -----------------------------------------------------------------------------
|
||
; SHFL_FN_FLUSH - Flush буферов файла
|
||
; -----------------------------------------------------------------------------
|
||
struct SHFL_FLUSH
|
||
header HGCM_CALL
|
||
root HGCM_PARM ; IN: root handle
|
||
handle HGCM_PARM ; IN: file handle
|
||
ends
|