diff options
| author | Javier <dev.git@javispedro.com> | 2022-04-14 23:10:39 +0200 | 
|---|---|---|
| committer | Javier <dev.git@javispedro.com> | 2022-04-14 23:10:39 +0200 | 
| commit | a84f04eb1be124e7fdefb486bf01626ff96d2d04 (patch) | |
| tree | b810079feb76a8aabea96d8489eb0c70527230b8 | |
| parent | c732fc60d5b07417146c750c65faee419083efc9 (diff) | |
| download | vbados-a84f04eb1be124e7fdefb486bf01626ff96d2d04.tar.gz vbados-a84f04eb1be124e7fdefb486bf01626ff96d2d04.zip  | |
cleanup vbox code
| -rw-r--r-- | mousmain.c | 2 | ||||
| -rw-r--r-- | sfmain.c | 2 | ||||
| -rw-r--r-- | sftsr.c | 47 | ||||
| -rw-r--r-- | vbox.h | 13 | ||||
| -rw-r--r-- | vboxdev.h | 16 | ||||
| -rw-r--r-- | vboxhgcm.h | 48 | ||||
| -rw-r--r-- | vboxshfl.h | 411 | 
7 files changed, 268 insertions, 271 deletions
@@ -98,8 +98,6 @@ static int set_virtualbox_integration(LPTSRDATA data, bool enable)  			return err;  		} -		printf("Found VirtualBox device at IO 0x%x\n", data->vb.iobase); -  		err = vbox_init_buffer(&data->vb);  		if (err) {  			fprintf(stderr, "Cannot lock buffer used for VirtualBox communication, err=%d\n", err); @@ -353,8 +353,6 @@ static int configure_driver(LPTSRDATA data)  		return -1;  	} -	printf("Found VirtualBox device at IO 0x%x\n", data->vb.iobase); -  	err = vbox_init_buffer(&data->vb);  	if (err) {  		fprintf(stderr, "Cannot lock buffer used for VirtualBox communication, err=%ld\n", err); @@ -135,7 +135,7 @@ static void set_dos_err(union INTPACK __far *r, int err)  	r->x.ax = err;  } -static int vbox_err_to_dos(int32_t err) +static int vbox_err_to_dos(vboxerr err)  {  	switch (err) {  	case VINF_SUCCESS: @@ -156,12 +156,15 @@ static int vbox_err_to_dos(int32_t err)  		return DOS_ERROR_TOO_MANY_OPEN_FILES;  	case VERR_WRITE_PROTECT:  		return DOS_ERROR_WRITE_PROTECT; +	case VERR_NOT_A_DIRECTORY: +	case VERR_DIR_NOT_EMPTY: // Behavior seen in real DOS +		return DOS_ERROR_PATH_NOT_FOUND;  	default:  		return DOS_ERROR_GEN_FAILURE;  	}  } -static void set_vbox_err(union INTPACK __far *r, int32_t err) +static void set_vbox_err(union INTPACK __far *r, vboxerr err)  {  	dlog_print("->vbox error ");  	if (err < INT16_MIN || err > INT16_MAX) { @@ -325,7 +328,7 @@ static void handle_create_open_ex(union INTPACK __far *r)  	unsigned int action, mode;  	unsigned openfile;  	bool save_result; -	int32_t err; +	vboxerr err;  	switch (r->h.al) {  	case DOS_FN_CREATE: @@ -446,7 +449,7 @@ static void handle_close(union INTPACK __far *r)  {  	DOSSFT __far *sft = MK_FP(r->x.es, r->x.di);  	unsigned openfile = get_sft_openfile_index(sft); -	int32_t err; +	vboxerr err;  	dlog_print("handle_close openfile=");  	dlog_printu(openfile); @@ -479,7 +482,7 @@ static void handle_read(union INTPACK __far *r)  	uint8_t __far *buffer = data.dossda->cur_dta;  	unsigned long offset = sft->f_pos;  	unsigned bytes = r->x.cx; -	int32_t err; +	vboxerr err;  	dlog_print("handle_read openfile=");  	dlog_printu(openfile); @@ -518,7 +521,7 @@ static void handle_write(union INTPACK __far *r)  	uint8_t __far *buffer = data.dossda->cur_dta;  	unsigned long offset = sft->f_pos;  	unsigned bytes = r->x.cx; -	int32_t err; +	vboxerr err;  	dlog_print("handle_write openfile=");  	dlog_printu(openfile); @@ -562,7 +565,7 @@ static void handle_lock(union INTPACK __far *r)  	unsigned flags = (unlock ? SHFL_LOCK_CANCEL : SHFL_LOCK_EXCLUSIVE)  	        | SHFL_LOCK_WAIT | SHFL_LOCK_PARTIAL;  	DOSLOCK __far *ops = MK_FP(r->x.ds, r->x.dx); -	int32_t err; +	vboxerr err;  	dlog_print("handle_lock ");  	if (unlock) dlog_print("unlock"); @@ -585,7 +588,7 @@ static void handle_lock(union INTPACK __far *r)  static void handle_close_all(union INTPACK __far *r)  { -	int32_t err; +	vboxerr err;  	unsigned i;  	dlog_puts("handle_close_all"); @@ -612,7 +615,7 @@ static void handle_delete(union INTPACK __far *r)  	const char __far *path = data.dossda->fn1;  	int drive = drive_letter_to_index(path[0]);  	SHFLROOT root = data.drives[drive].root; -	int32_t err; +	vboxerr err;  	dlog_print("handle_delete ");  	dlog_fprint(path); @@ -638,7 +641,7 @@ static void handle_rename(union INTPACK __far *r)  	const char __far *dst = data.dossda->fn2;  	int dstdrive = drive_letter_to_index(dst[0]);  	SHFLROOT root = data.drives[srcdrive].root; -	int32_t err; +	vboxerr err;  	dlog_print("handle_rename ");  	dlog_fprint(src); @@ -675,7 +678,7 @@ static void handle_getattr(union INTPACK __far *r)  	const char __far *path = data.dossda->fn1;  	int drive = drive_letter_to_index(path[0]);  	SHFLROOT root = data.drives[drive].root; -	int32_t err; +	vboxerr err;  	dlog_print("handle_getattr ");  	dlog_fprint(path); @@ -709,9 +712,9 @@ static void handle_getattr(union INTPACK __far *r)  } -static int32_t open_search_dir(SHFLROOT root, const char __far *path) +static vboxerr open_search_dir(SHFLROOT root, const char __far *path)  { -	int32_t err; +	vboxerr err;  	dlog_puts("open_search_dir"); @@ -752,7 +755,7 @@ static int32_t open_search_dir(SHFLROOT root, const char __far *path)  static void close_search_dir()  { -	int32_t err; +	vboxerr err;  	if (data.files[SEARCH_DIR_FILE].root == SHFL_ROOT_NIL) {  		// Already closed @@ -776,10 +779,10 @@ static inline bool is_search_dir_open()  }  /** Simulates a directory entry with the current volume label. */ -static int32_t find_volume_label(SHFLROOT root) +static vboxerr find_volume_label(SHFLROOT root)  {  	DOSDIR __far *found_file = &data.dossda->found_file; -	int32_t err; +	vboxerr err;  	shflstring_clear(&shflstr.shflstr); @@ -803,10 +806,10 @@ static int32_t find_volume_label(SHFLROOT root)  }  /** Gets and fills in the next directory entry from VirtualBox. */ -static int32_t find_next_from_vbox(uint8_t search_attr) +static vboxerr find_next_from_vbox(uint8_t search_attr)  {  	DOSDIR __far *found_file = &data.dossda->found_file; -	int32_t err; +	vboxerr err;  	if (!is_search_dir_open()) {  		dlog_puts("find_next called, but no opendir handle"); @@ -870,7 +873,7 @@ static void handle_find(union INTPACK __far *r)  	SHFLROOT root = data.drives[drive].root;  	DOSDIR __far *found_file = &data.dossda->found_file;  	uint8_t search_attr; -	int32_t err; +	vboxerr err;  	if (r->h.al == DOS_FN_FIND_FIRST) {  		search_attr = data.dossda->search_attr; @@ -952,7 +955,7 @@ static void handle_chdir(union INTPACK __far *r)  	const char __far *path = data.dossda->fn1;  	int drive = drive_letter_to_index(path[0]);  	SHFLROOT root = data.drives[drive].root; -	int32_t err; +	vboxerr err;  	dlog_print("handle_chdir to ");  	dlog_fprint(path); @@ -995,7 +998,7 @@ static void handle_mkdir(union INTPACK __far *r)  	const char __far *path = data.dossda->fn1;  	int drive = drive_letter_to_index(path[0]);  	SHFLROOT root = data.drives[drive].root; -	int32_t err; +	vboxerr err;  	dlog_print("handle_mkdir ");  	dlog_fprint(path); @@ -1035,7 +1038,7 @@ static void handle_rmdir(union INTPACK __far *r)  	const char __far *path = data.dossda->fn1;  	int drive = drive_letter_to_index(path[0]);  	SHFLROOT root = data.drives[drive].root; -	int32_t err; +	vboxerr err;  	dlog_print("handle_rmdir ");  	dlog_fprint(path); @@ -40,8 +40,11 @@ typedef struct vboxcomm {  	char buf[VBOX_BUFFER_SIZE];  	VDSDDS dds;  } vboxcomm_t; +typedef vboxcomm_t * PVBOXCOMM;  typedef vboxcomm_t __far * LPVBOXCOMM; +typedef int32_t vboxerr; +  /** Actually send a request to the VirtualBox VMM device.    * @param addr 32-bit physical address containing the VMMDevRequest struct.    */ @@ -79,7 +82,7 @@ static void vbox_init_req(VMMDevRequestHeader __far *hdr, VMMDevRequestType type  /** Lets VirtualBox know that there are VirtualBox Guest Additions on this guest.    * @param osType os installed on this guest. */ -static int32_t vbox_report_guest_info(LPVBOXCOMM vb, uint32_t osType) +static vboxerr vbox_report_guest_info(LPVBOXCOMM vb, uint32_t osType)  {  	VMMDevReportGuestInfo __far *req = (void __far *) vb->buf; @@ -93,7 +96,7 @@ static int32_t vbox_report_guest_info(LPVBOXCOMM vb, uint32_t osType)  }  /** Tells VirtualBox whether we want absolute mouse information or not. */ -static int32_t vbox_set_mouse(LPVBOXCOMM vb, bool absolute, bool pointer) +static vboxerr vbox_set_mouse(LPVBOXCOMM vb, bool absolute, bool pointer)  {  	VMMDevReqMouseStatus __far *req = (void __far *) vb->buf; @@ -109,7 +112,7 @@ static int32_t vbox_set_mouse(LPVBOXCOMM vb, bool absolute, bool pointer)  /** Gets the current absolute mouse position from VirtualBox.    * @param abs false if user has disabled mouse integration in VirtualBox,    *  in which case we should fallback to PS/2 relative events. */ -static int32_t vbox_get_mouse(LPVBOXCOMM vb, bool __far *abs, +static vboxerr vbox_get_mouse(LPVBOXCOMM vb, bool __far *abs,                            uint16_t __far *xpos, uint16_t __far *ypos)  {  	VMMDevReqMouseStatus __far *req = (void __far *) vb->buf; @@ -126,7 +129,7 @@ static int32_t vbox_get_mouse(LPVBOXCOMM vb, bool __far *abs,  }  /** Asks the host to render the mouse cursor for us. */ -static int32_t vbox_set_pointer_visible(LPVBOXCOMM vb, bool visible) +static vboxerr vbox_set_pointer_visible(LPVBOXCOMM vb, bool visible)  {  	VMMDevReqMousePointer __far *req = (void __far *) vb->buf; @@ -147,7 +150,7 @@ static inline unsigned vbox_req_mouse_pointer_size(unsigned width, unsigned heig  	return MAX(sizeof(VMMDevReqMousePointer), 24 + 20 + data_size);  } -static int32_t vbox_idle(LPVBOXCOMM vb) +static vboxerr vbox_idle(LPVBOXCOMM vb)  {  	VMMDevReqIdle __far *req = (void __far *) vb->buf; @@ -1412,6 +1412,22 @@ typedef struct _SHFLDIRINFO  #define SHFL_LIST_RETURN_ONE    1  #define SHFL_LIST_RESTART       2 +/** Mask of Set/Get bit. */ +#define SHFL_INFO_MODE_MASK    (0x1) +/** Get information */ +#define SHFL_INFO_GET          (0x0) +/** Set information */ +#define SHFL_INFO_SET          (0x1) + +/** Get name of the object. */ +#define SHFL_INFO_NAME         (0x2) +/** Set size of object (extend/trucate); only applies to file objects */ +#define SHFL_INFO_SIZE         (0x4) +/** Get/Set file object info. */ +#define SHFL_INFO_FILE         (0x8) +/** Get volume information. */ +#define SHFL_INFO_VOLUME       (0x10) +  #define SHFL_REMOVE_FILE        (0x1)  #define SHFL_REMOVE_DIR         (0x2)  #define SHFL_REMOVE_SYMLINK     (0x4) @@ -34,7 +34,7 @@ static void vbox_hgcm_wait(VMMDevHGCMRequestHeader __far * req)  	}  } -static int32_t vbox_hgcm_connect_existing(LPVBOXCOMM vb, const char *service, hgcm_client_id_t __far *client_id) +static vboxerr vbox_hgcm_connect_existing(LPVBOXCOMM vb, const char *service, hgcm_client_id_t __far *client_id)  {  	VMMDevHGCMConnect __far *req = (void __far *) vb->buf; @@ -57,7 +57,7 @@ static int32_t vbox_hgcm_connect_existing(LPVBOXCOMM vb, const char *service, hg  	return req->header.result;  } -static int32_t vbox_hgcm_disconnect(LPVBOXCOMM vb, hgcm_client_id_t client_id) +static vboxerr vbox_hgcm_disconnect(LPVBOXCOMM vb, hgcm_client_id_t client_id)  {  	VMMDevHGCMDisconnect __far *req = (void __far *) vb->buf; @@ -75,7 +75,7 @@ static int32_t vbox_hgcm_disconnect(LPVBOXCOMM vb, hgcm_client_id_t client_id)  	return req->header.result;  } -static inline void vbox_hgcm_init_call(VMMDevHGCMCall __far *req, hgcm_client_id_t client_id, uint32_t function, unsigned narg) +static void vbox_hgcm_init_call(VMMDevHGCMCall __far *req, hgcm_client_id_t client_id, uint32_t function, unsigned narg)  {  	vbox_init_req(&req->header.header, VMMDevReq_HGCMCall32, sizeof(VMMDevHGCMCall) + (narg * sizeof(HGCMFunctionParameter)));  	req->u32ClientID = client_id; @@ -83,4 +83,46 @@ static inline void vbox_hgcm_init_call(VMMDevHGCMCall __far *req, hgcm_client_id  	req->cParms = narg;  } +static vboxerr vbox_hgcm_do_call_sync(LPVBOXCOMM vb, VMMDevHGCMCall __far *req) +{ +	vbox_send_request(vb->iobase, vb->dds.physicalAddress); + +	if (req->header.header.rc < 0) { +		return req->header.header.rc; +	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { +		vbox_hgcm_wait(&req->header); +	} + +	return 0; +} + +static void vbox_hgcm_set_parameter_uint32(VMMDevHGCMCall __far *req, unsigned arg, uint32_t value) +{ +	req->aParms[arg].type = VMMDevHGCMParmType_32bit; +	req->aParms[arg].u.value32 = value; +} + +static inline uint32_t vbox_hgcm_get_parameter_uint32(VMMDevHGCMCall __far *req, unsigned arg) +{ +	return req->aParms[arg].u.value32; +} + +static void vbox_hgcm_set_parameter_uint64(VMMDevHGCMCall __far *req, unsigned arg, uint64_t value) +{ +	req->aParms[arg].type = VMMDevHGCMParmType_64bit; +	req->aParms[arg].u.value64 = value; +} + +static inline uint64_t vbox_hgcm_get_parameter_uint64(VMMDevHGCMCall __far *req, unsigned arg) +{ +	return req->aParms[arg].u.value64; +} + +static void vbox_hgcm_set_parameter_pointer(VMMDevHGCMCall __far *req, unsigned arg, unsigned size, void __far *ptr) +{ +	req->aParms[arg].type = VMMDevHGCMParmType_LinAddr; +	req->aParms[arg].u.LinAddr.cb = size; +	req->aParms[arg].u.LinAddr.uAddr = linear_addr(ptr); +} +  #endif // VBOXHGCM_H @@ -69,457 +69,394 @@ static void shflstring_strncpy(SHFLSTRING *str, const char __far *src, unsigned  	str->ach[str->u16Length] = '\0';  } -static int32_t vbox_shfl_query_mappings(LPVBOXCOMM vb, hgcm_client_id_t client_id, uint32_t flags, unsigned __far *num_maps, SHFLMAPPING __far *maps) +static inline void vbox_hgcm_set_parameter_shflroot(VMMDevHGCMCall __far *req, unsigned arg, SHFLROOT root)  { -	VMMDevHGCMCall __far *req = (void __far *) vb->buf; -	vbox_hgcm_init_call(req, client_id, SHFL_FN_QUERY_MAPPINGS, 3); +	vbox_hgcm_set_parameter_uint32(req, arg, root); +} -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = flags; +static inline void vbox_hgcm_set_parameter_shflhandle(VMMDevHGCMCall __far *req, unsigned arg, SHFLHANDLE handle) +{ +	vbox_hgcm_set_parameter_uint64(req, arg, handle); +} -	req->aParms[1].type = VMMDevHGCMParmType_32bit; -	req->aParms[1].u.value32 = *num_maps; +static void vbox_hgcm_set_parameter_shflstring(VMMDevHGCMCall __far *req, unsigned arg, const SHFLSTRING *str) +{ +	vbox_hgcm_set_parameter_pointer(req, arg, shflstring_size_with_buf(str), str); +} + +static vboxerr vbox_shfl_query_mappings(LPVBOXCOMM vb, hgcm_client_id_t client_id, uint32_t flags, unsigned __far *num_maps, SHFLMAPPING __far *maps) +{ +	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; -	req->aParms[2].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[2].u.Pointer.size = sizeof(SHFLMAPPING) * *num_maps; -	req->aParms[2].u.Pointer.u.linearAddr = linear_addr(maps); +	vbox_hgcm_init_call(req, client_id, SHFL_FN_QUERY_MAPPINGS, 3); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	vbox_hgcm_set_parameter_uint32(req, 0, flags); +	vbox_hgcm_set_parameter_uint32(req, 1, *num_maps); +	vbox_hgcm_set_parameter_pointer(req, 2, sizeof(SHFLMAPPING) * *num_maps, maps); -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; -	*num_maps = req->aParms[1].u.value32; +	*num_maps = vbox_hgcm_get_parameter_uint32(req, 1);  	return req->header.result;  } -static int32_t vbox_shfl_query_map_name(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLSTRING *name) +static vboxerr vbox_shfl_query_map_name(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLSTRING *name)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; -	vbox_hgcm_init_call(req, client_id, SHFL_FN_QUERY_MAP_NAME, 2); - -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vboxerr err; -	req->aParms[1].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[1].u.Pointer.size = shflstring_size_with_buf(name); -	req->aParms[1].u.Pointer.u.linearAddr = linear_addr(name); +	vbox_hgcm_init_call(req, client_id, SHFL_FN_QUERY_MAP_NAME, 2); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	vbox_hgcm_set_parameter_shflroot(req, 0, root); +	vbox_hgcm_set_parameter_shflstring(req, 1, name); -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_map_folder(LPVBOXCOMM vb, hgcm_client_id_t client_id, const SHFLSTRING *name, SHFLROOT *root) +static vboxerr vbox_shfl_map_folder(LPVBOXCOMM vb, hgcm_client_id_t client_id, const SHFLSTRING *name, SHFLROOT *root)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_MAP_FOLDER, 4);  	// arg 0 in shflstring "name" -	req->aParms[0].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[0].u.Pointer.size = shflstring_size_with_buf(name); -	req->aParms[0].u.Pointer.u.linearAddr = linear_addr(name); +	vbox_hgcm_set_parameter_pointer(req, 0, shflstring_size_with_buf(name), name);  	// arg 1 out uint32 "root" -	req->aParms[1].type = VMMDevHGCMParmType_32bit; -	req->aParms[1].u.value32 = *root; +	vbox_hgcm_set_parameter_uint32(req, 1, 0);  	// arg 2 in uint32 "delimiter" -	req->aParms[2].type = VMMDevHGCMParmType_32bit; -	req->aParms[2].u.value32 = '\\'; +	vbox_hgcm_set_parameter_uint32(req, 2, '\\');  	// arg 3 in uint32 "caseSensitive" -	req->aParms[3].type = VMMDevHGCMParmType_32bit; -	req->aParms[3].u.value32 = 0; +	vbox_hgcm_set_parameter_uint32(req, 3, 0); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} - -	*root = req->aParms[1].u.value32; +	*root = vbox_hgcm_get_parameter_uint32(req, 1);  	return req->header.result;  } -static int32_t vbox_shfl_unmap_folder(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root) +static vboxerr vbox_shfl_unmap_folder(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_UNMAP_FOLDER, 1);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if (err = vbox_hgcm_do_call_sync(vb, req)) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_open(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, const SHFLSTRING *name, SHFLCREATEPARMS *parms) +static vboxerr vbox_shfl_open(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, const SHFLSTRING *name, SHFLCREATEPARMS *parms)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_CREATE, 3);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in shflstring "name" -	req->aParms[1].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[1].u.Pointer.size = shflstring_size_with_buf(name); -	req->aParms[1].u.Pointer.u.linearAddr = linear_addr(name); +	vbox_hgcm_set_parameter_shflstring(req, 1, name);  	// arg 2 in shflcreateparms "parms" -	req->aParms[2].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[2].u.Pointer.size = sizeof(SHFLCREATEPARMS); -	req->aParms[2].u.Pointer.u.linearAddr = linear_addr(parms); +	vbox_hgcm_set_parameter_pointer(req, 2, sizeof(SHFLCREATEPARMS), parms); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_close(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle) +static vboxerr vbox_shfl_close(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_CLOSE, 2);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in uint64 "handle" -	req->aParms[1].type = VMMDevHGCMParmType_64bit; -	req->aParms[1].u.value64 = handle; +	vbox_hgcm_set_parameter_shflhandle(req, 1, handle); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_read(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle, +static vboxerr vbox_shfl_read(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle,                                 unsigned long offset, unsigned __far *size, void __far *buffer)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_READ, 5);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in uint64 "handle" -	req->aParms[1].type = VMMDevHGCMParmType_64bit; -	req->aParms[1].u.value64 = handle; +	vbox_hgcm_set_parameter_shflhandle(req, 1, handle);  	// arg 2 in uint64 "offset" -	req->aParms[2].type = VMMDevHGCMParmType_64bit; -	req->aParms[2].u.value64 = offset; +	vbox_hgcm_set_parameter_uint64(req, 2, offset);  	// arg 3 inout uint32 "size" -	req->aParms[3].type = VMMDevHGCMParmType_32bit; -	req->aParms[3].u.value32 = *size; +	vbox_hgcm_set_parameter_uint32(req, 3, *size);  	// arg 4 out void "buffer" -	req->aParms[4].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[4].u.Pointer.size = *size; -	req->aParms[4].u.Pointer.u.linearAddr = linear_addr(buffer); +	vbox_hgcm_set_parameter_pointer(req, 4, *size, buffer); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; -	*size = req->aParms[3].u.value32; +	*size = vbox_hgcm_get_parameter_uint32(req, 3);  	return req->header.result;  } -static int32_t vbox_shfl_write(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle, +static vboxerr vbox_shfl_write(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle,                                 unsigned long offset, unsigned __far *size, void __far *buffer)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_WRITE, 5);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in uint64 "handle" -	req->aParms[1].type = VMMDevHGCMParmType_64bit; -	req->aParms[1].u.value64 = handle; +	vbox_hgcm_set_parameter_shflhandle(req, 1, handle);  	// arg 2 in uint64 "offset" -	req->aParms[2].type = VMMDevHGCMParmType_64bit; -	req->aParms[2].u.value64 = offset; +	vbox_hgcm_set_parameter_uint64(req, 2, offset);  	// arg 3 inout uint32 "size" -	req->aParms[3].type = VMMDevHGCMParmType_32bit; -	req->aParms[3].u.value32 = *size; +	vbox_hgcm_set_parameter_uint32(req, 3, *size);  	// arg 4 in void "buffer" -	req->aParms[4].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[4].u.Pointer.size = *size; -	req->aParms[4].u.Pointer.u.linearAddr = linear_addr(buffer); - -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	vbox_hgcm_set_parameter_pointer(req, 4, *size, buffer); -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; -	*size = req->aParms[3].u.value32; +	*size = vbox_hgcm_get_parameter_uint32(req, 3);  	return req->header.result;  } -static int32_t vbox_shfl_lock(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle, +static vboxerr vbox_shfl_lock(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle,                                unsigned long offset, unsigned long length, unsigned flags)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_LOCK, 5);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in uint64 "handle" -	req->aParms[1].type = VMMDevHGCMParmType_64bit; -	req->aParms[1].u.value64 = handle; +	vbox_hgcm_set_parameter_shflhandle(req, 1, handle);  	// arg 2 in uint64 "offset" -	req->aParms[2].type = VMMDevHGCMParmType_64bit; -	req->aParms[2].u.value64 = offset; +	vbox_hgcm_set_parameter_uint64(req, 2, offset); -	// arg 3 inout uint64 "length" -	req->aParms[3].type = VMMDevHGCMParmType_64bit; -	req->aParms[3].u.value64 = length; +	// arg 3 in uint64 "length" +	vbox_hgcm_set_parameter_uint64(req, 3, length);  	// arg 4 in uint32 "flags" -	req->aParms[4].type = VMMDevHGCMParmType_32bit; -	req->aParms[4].u.value32 = flags; +	vbox_hgcm_set_parameter_uint32(req, 4, flags); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_list(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle, +static vboxerr vbox_shfl_list(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle,                                unsigned flags, unsigned __far *size, const SHFLSTRING *path, SHFLDIRINFO *dirinfo, unsigned __far *resume, unsigned __far *count)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_LIST, 8);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in uint64 "handle" -	req->aParms[1].type = VMMDevHGCMParmType_64bit; -	req->aParms[1].u.value64 = handle; +	vbox_hgcm_set_parameter_shflhandle(req, 1, handle);  	// arg 2 in uint32 "flags" -	req->aParms[2].type = VMMDevHGCMParmType_32bit; -	req->aParms[2].u.value32 = flags; +	vbox_hgcm_set_parameter_uint32(req, 2, flags);  	// arg 3 inout uint32 "size" -	req->aParms[3].type = VMMDevHGCMParmType_32bit; -	req->aParms[3].u.value32 = *size; +	vbox_hgcm_set_parameter_uint32(req, 3, *size);  	// arg 4 in shflstring "path" -	req->aParms[4].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[4].u.Pointer.size = shflstring_size_optional_in(path); -	req->aParms[4].u.Pointer.u.linearAddr = linear_addr(path); +	vbox_hgcm_set_parameter_pointer(req, 4, shflstring_size_optional_in(path), path);  	// arg 5 out void "dirinfo" -	req->aParms[5].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[5].u.Pointer.size = *size; -	req->aParms[5].u.Pointer.u.linearAddr = linear_addr(dirinfo); +	vbox_hgcm_set_parameter_pointer(req, 5, *size, dirinfo);  	// arg 6 inout uint32 "resume_point" -	req->aParms[6].type = VMMDevHGCMParmType_32bit; -	req->aParms[6].u.value32 = *resume; +	vbox_hgcm_set_parameter_uint32(req, 6, *resume);  	// arg 7 out uint32 "count" -	req->aParms[7].type = VMMDevHGCMParmType_32bit; -	req->aParms[7].u.value32 = 0; +	vbox_hgcm_set_parameter_uint32(req, 7, 0); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	*size = vbox_hgcm_get_parameter_uint32(req, 3); +	*resume = vbox_hgcm_get_parameter_uint32(req, 6); +	*count = vbox_hgcm_get_parameter_uint32(req, 7); + +	return req->header.result; +} + +static vboxerr vbox_shfl_info(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, SHFLHANDLE handle, +                               unsigned flags, unsigned __far *size, void __far *buffer) +{ +	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; + +	vbox_hgcm_init_call(req, client_id, SHFL_FN_INFORMATION, 5); + +	// arg 0 in uint32 "root" +	vbox_hgcm_set_parameter_shflroot(req, 0, root); + +	// arg 1 in uint64 "handle" +	vbox_hgcm_set_parameter_shflhandle(req, 1, handle); + +	// arg 2 in uint32 "flags" +	vbox_hgcm_set_parameter_uint32(req, 2, flags); -	*size = req->aParms[3].u.value32; -	*resume = req->aParms[6].u.value32; -	*count = req->aParms[7].u.value32; +	// arg 3 inout uint32 "size" +	vbox_hgcm_set_parameter_uint32(req, 3, *size); + +	// arg 4 in void "buffer" +	vbox_hgcm_set_parameter_pointer(req, 4, *size, buffer); + +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; + +	*size = vbox_hgcm_get_parameter_uint32(req, 3);  	return req->header.result;  } -static int32_t vbox_shfl_remove(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, +static vboxerr vbox_shfl_remove(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root,                                  const SHFLSTRING *path, unsigned flags)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_REMOVE, 3);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in shflstring "path" -	req->aParms[1].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[1].u.Pointer.size = shflstring_size_with_buf(path); -	req->aParms[1].u.Pointer.u.linearAddr = linear_addr(path); +	vbox_hgcm_set_parameter_shflstring(req, 1, path);  	// arg 2 in uint32 "flags" -	req->aParms[2].type = VMMDevHGCMParmType_32bit; -	req->aParms[2].u.value32 = flags; - -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	vbox_hgcm_set_parameter_uint32(req, 2, flags); -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_rename(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, +static vboxerr vbox_shfl_rename(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root,                                  const SHFLSTRING *src, const SHFLSTRING *dst, unsigned flags)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_RENAME, 4);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 in shflstring "src" -	req->aParms[1].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[1].u.Pointer.size = shflstring_size_with_buf(src); -	req->aParms[1].u.Pointer.u.linearAddr = linear_addr(src); +	vbox_hgcm_set_parameter_shflstring(req, 1, src);  	// arg 2 in shflstring "dst" -	req->aParms[2].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[2].u.Pointer.size = shflstring_size_with_buf(dst); -	req->aParms[2].u.Pointer.u.linearAddr = linear_addr(dst); +	vbox_hgcm_set_parameter_shflstring(req, 2, dst);  	// arg 3 in uint32 "flags" -	req->aParms[3].type = VMMDevHGCMParmType_32bit; -	req->aParms[3].u.value32 = flags; +	vbox_hgcm_set_parameter_uint32(req, 3, flags); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_set_utf8(LPVBOXCOMM vb, hgcm_client_id_t client_id) +static vboxerr vbox_shfl_set_utf8(LPVBOXCOMM vb, hgcm_client_id_t client_id)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; -	vbox_hgcm_init_call(req, client_id, SHFL_FN_SET_UTF8, 0); +	vboxerr err; -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); +	vbox_hgcm_init_call(req, client_id, SHFL_FN_SET_UTF8, 0); -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err;  	return req->header.result;  } -static int32_t vbox_shfl_query_map_info(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root, +static vboxerr vbox_shfl_query_map_info(LPVBOXCOMM vb, hgcm_client_id_t client_id, SHFLROOT root,                                          SHFLSTRING *name, SHFLSTRING *mountPoint, unsigned *flags, unsigned *version)  {  	VMMDevHGCMCall __far *req = (void __far *) vb->buf; +	vboxerr err; +  	vbox_hgcm_init_call(req, client_id, SHFL_FN_QUERY_MAP_INFO, 5);  	// arg 0 in uint32 "root" -	req->aParms[0].type = VMMDevHGCMParmType_32bit; -	req->aParms[0].u.value32 = root; +	vbox_hgcm_set_parameter_shflroot(req, 0, root);  	// arg 1 inout shflstring "name" -	req->aParms[1].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[1].u.Pointer.size = shflstring_size_with_buf(name); -	req->aParms[1].u.Pointer.u.linearAddr = linear_addr(name); +	vbox_hgcm_set_parameter_shflstring(req, 1, name);  	// arg 2 inout shflstring "mountPoint" -	req->aParms[2].type = VMMDevHGCMParmType_LinAddr; -	req->aParms[2].u.Pointer.size = shflstring_size_with_buf(mountPoint); -	req->aParms[2].u.Pointer.u.linearAddr = linear_addr(mountPoint); +	vbox_hgcm_set_parameter_shflstring(req, 2, mountPoint);  	// arg 3 inout uint64 "flags" -	req->aParms[3].type = VMMDevHGCMParmType_64bit; -	req->aParms[3].u.value64 = *flags; +	vbox_hgcm_set_parameter_uint64(req, 3, *flags);  	// arg 4 out uint32 "version" -	req->aParms[4].type = VMMDevHGCMParmType_32bit; -	req->aParms[4].u.value32 = *version; +	vbox_hgcm_set_parameter_uint32(req, 4, 0); -	vbox_send_request(vb->iobase, vb->dds.physicalAddress); - -	if (req->header.header.rc < 0) { -		return req->header.header.rc; -	} else if (req->header.header.rc == VINF_HGCM_ASYNC_EXECUTE) { -		vbox_hgcm_wait(&req->header); -	} +	if ((err = vbox_hgcm_do_call_sync(vb, req)) < 0) +		return err; -	*flags = req->aParms[3].u.value64; -	*version = req->aParms[4].u.value32; +	*flags = vbox_hgcm_get_parameter_uint64(req, 3); +	*version = vbox_hgcm_get_parameter_uint32(req, 4);  	return req->header.result;  }  | 
