59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define INCL_DOSERRORS
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define INCL_DOSMEMMGR
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define INCL_DOSSEMAPHORES
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define INCL_DOSDEVICES
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define INCL_DOSDEVIOCTL
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define INCL_DOSMODULEMGR
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#include <os2.h>
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#if !defined(__GNUC__) || defined(STATIC_USBCALLS)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#include <string.h>
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define memcpy __builtin_memcpy
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#include <stdlib.h>
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#include <stdio.h>
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define LOG_GROUP LOG_GROUP_DRV_USBPROXY
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#include <VBox/log.h>
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifdef __GNUC__
59190ecd61435d19ba3515b876272aee7bd12298vboxsync# define APIEXPORT __declspec(dllexport)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync# define APIEXPORT
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifndef ERROR_USER_DEFINED_BASE
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/*#define ERROR_USER_DEFINED_BASE 0xFF00 */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_WRITE_PROTECT 0
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_BAD_UNIT 1
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_NOT_READY 2
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_BAD_COMMAND 3
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_CRC 4
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_BAD_LENGTH 5
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_SEEK 6
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_NOT_DOS_DISK 7
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_SECTOR_NOT_FOUND 8
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_OUT_OF_PAPER 9
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_WRITE_FAULT 10
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_READ_FAULT 11
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_GEN_FAILURE 12
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_DISK_CHANGE 13
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_WRONG_DISK 15
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_UNCERTAIN_MEDIA 16
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_CHAR_CALL_INTERRUPTED 17
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_NO_MONITOR_SUPPORT 18
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_INVALID_PARAMETER 19
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_DEVICE_IN_USE 20
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ERROR_I24_QUIET_INIT_FAIL 21
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#include "usbcalls.h"
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCAT_USBRES 0x000000A0 /* USB Resource device control */
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync#define IOCTLF_NUMDEVICE 0x00000031 /* Get Number of plugged in Devices */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_GETINFO 0x00000032 /* Get Info About a device */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_AQUIREDEVICE 0x00000033
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_RELEASEDEVICE 0x00000034
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_GETSTRING 0x00000035
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_SENDCONTROLURB 0x00000036
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_SENDBULKURB 0x00000037 /* Send */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_START_IRQ_PROC 0x00000038 /* Start IRQ polling in a buffer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_GETDEVINFO 0x00000039 /* Get information about device */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_STOP_IRQ_PROC 0x0000003A /* Stop IRQ Polling */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_START_ISO_PROC 0x0000003B /* Start ISO buffering in a Ringbuffer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_STOP_ISO_PROC 0x0000003C /* Stop ISO buffering */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_CANCEL_IORB 0x0000003D /* Abort an IORB; */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_SELECT_BULKPIPE 0x0000003E /* Select which Bulk endpoints can be used via Read/Write */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_SENDIRQURB 0x0000003F /* Start IRQ polling in a buffer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_FIXUPDEVUCE 0x00000040 /* Fixup USB device configuration data */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_REG_STATUSSEM 0x00000041 /* Register Semaphore for general Statuschange */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_DEREG_STATUSSEM 0x00000042 /* Deregister Semaphore */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_REG_DEVICESEM 0x00000043 /* Register Semaphore for a vendor&deviceID */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_DEREG_DEVICESEM 0x00000044 /* Deregister Semaphore */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define NOTIFY_FREE 0
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define NOTIFY_CHANGE 1
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define NOTIFY_DEVICE 2
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define MAX_NOTIFICATIONS 256
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#pragma pack(1)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usFlags;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usVendor;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usProduct;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usBCDDevice;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} NOTIFYENTRY, *PNOTIFYENTRY;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define DEV_SEM_ADD 0x00000001
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define DEV_SEM_REMOVE 0x00000002
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define DEV_SEM_MASK 0x00000003
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define DEV_SEM_VENDORID 0x00000004
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define DEV_SEM_PRODUCTID 0x00000008
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define DEV_SEM_BCDDEVICE 0x00000010
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulCaps;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSemDeviceAdd;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSemDeviceRemove;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} STATUSEVENTSET, * PSTATUSEVENTSET;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulCaps;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSemDeviceAdd;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSemDeviceRemove;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usVendorID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usProductID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usBCDDevice;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} DEVEVENTSET, * PDEVEVENTSET;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usVendorID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usProductID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usBCDDevice;
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync USHORT usDeviceNumber; /* Get the usDeviceNumber device in the system fi. if 2 acquire the 2nd device
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync 0 means first not acquired device. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} AQUIREDEV, *PAQUIREDEV;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR bRequestType;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR bRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT wValue;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT wIndex;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT wLength;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout; /* in milliseconds */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} SETUPPACKET, *PSETUPPACKET;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulHandle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR bRequestType;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR bRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT wValue;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT wIndex;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT wLength;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout; /* in milliseconds */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} USBCALLS_CTRL_REQ, *PUSBCALLS_CTRL_REQ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulDevHandle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucEndpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucAltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulEvent;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} USBCALLS_ISO_START, *NPUSBCALLS_ISO_START, FAR *PUSBCALLS_ISO_START,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_IRQ_START, *NPUSBCALLS_IRQ_START, FAR *PUSBCALLS_IRQ_START,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_CANCEL_REQ, *NPUSBCALLS_CANCEL_REQ, FAR *PUSBCALLS_CANCEL_REQ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define ISO_DIRMASK 0x80
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync ULONG hSemAccess; /* Synchronise access to the Pos values */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG hDevice;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usPosWrite;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usPosRead;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usBufSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucEndpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucAltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucBuffer[16*1023];
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} ISORINGBUFFER, *PISORINGBUFFER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef USBCALLS_ISO_START USBCALLS_ISO_STOP, * NPUSBCALLS_ISO_STOP, FAR *PUSBCALLS_ISO_STOP;
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef USBCALLS_ISO_START USBCALLS_IRQ_STOP, * NPUSBCALLS_IRQ_STOP, FAR *PUSBCALLS_IRQ_STOP;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define USB_TRANSFER_FULL_SIZE 0x01
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulDevHandle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucEndpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucAltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulEvent;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* ULONG ulID; - yeah, right */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usDataProcessed;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usDataRemain;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usFlags;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} USBCALLS_BULK_REQ, *PUSBCALLS_BULK_REQ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulDevHandle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucEndpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucAltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulEvent;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} LIBUSB_IRQ_REQ, *NPLIBUSB_IRQ_REQ, FAR *PLIBUSB_IRQ_REQ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulDevHandle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucConfiguration;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucAltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} LIBUSB_FIXUP, *NPLIBUSB_FIXUP, FAR *PLIBUSB_FIXUP;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#pragma pack()
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/******************************************************************************/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncHFILE g_hUSBDrv;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncULONG g_cInit;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncULONG g_ulFreeNotifys;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncHMTX g_hSemNotifytable;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncNOTIFYENTRY g_Notifications[MAX_NOTIFICATIONS];
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncHMTX g_hSemRingBuffers;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncPISORINGBUFFER g_pIsoRingBuffers;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncULONG g_ulNumIsoRingBuffers;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncInitUsbCalls(void)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync int i;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulAction;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (++g_cInit > 1)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return NO_ERROR;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosOpen( (PCSZ)"USBRESM$",
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &ulAction,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync 0,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync FILE_NORMAL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync OPEN_ACTION_OPEN_IF_EXISTS,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync OPEN_ACCESS_READWRITE |
59190ecd61435d19ba3515b876272aee7bd12298vboxsync OPEN_FLAGS_NOINHERIT |
59190ecd61435d19ba3515b876272aee7bd12298vboxsync OPEN_SHARE_DENYNONE,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync 0 );
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_hUSBDrv = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_cInit = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ToDO Add EnvVar or INI for dynamically setting the number */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_ulNumIsoRingBuffers = 8;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i<MAX_NOTIFICATIONS;i++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usFlags = NOTIFY_FREE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceAdded = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceRemoved = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usVendor = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usProduct = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usBCDDevice = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosAllocMem( (PPVOID)&g_pIsoRingBuffers,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_ulNumIsoRingBuffers * sizeof(ISORINGBUFFER),
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PAG_WRITE | PAG_COMMIT | OBJ_TILE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pIter = g_pIsoRingBuffers;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i< g_ulNumIsoRingBuffers;i++,pIter++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->hDevice = 0;
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync pIter->hSemAccess = 0; /* Synchronise access to the Pos values */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->usPosWrite = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->usPosRead = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->usBufSize = 16*1023;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->ucEndpoint = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->ucAltInterface = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*pIter->ucBuffer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc=DosCreateMutexSem(NULL,&g_hSemRingBuffers,DC_SEM_SHARED,FALSE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc=DosCreateMutexSem(NULL,&g_hSemNotifytable,DC_SEM_SHARED,FALSE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosCloseMutexSem(g_hSemRingBuffers);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosFreeMem(g_pIsoRingBuffers);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosFreeMem(g_pIsoRingBuffers);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosClose(g_hUSBDrv);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_hUSBDrv = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_cInit = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return g_cInit ? NO_ERROR : rc ? rc : ERROR_GEN_FAILURE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncTermUsbCalls(void)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_GEN_FAILURE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!--g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync int i;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i<MAX_NOTIFICATIONS;i++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( g_Notifications[i].usFlags != NOTIFY_FREE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UsbDeregisterNotification((USBNOTIFY)(&g_Notifications[i]));
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosClose(g_hUSBDrv);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_hUSBDrv = NULLHANDLE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (g_pIsoRingBuffers)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosFreeMem(g_pIsoRingBuffers);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosCloseMutexSem(g_hSemRingBuffers);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_hSemRingBuffers = NULLHANDLE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosCloseMutexSem(g_hSemNotifytable);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_hSemNotifytable = NULLHANDLE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return NO_ERROR;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifdef VBOX /* complete wast of time */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync# define IsBadReadPointer(pBase, ulSize) (FALSE)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync# define IsBadWritePointer(pBase, ulSize) (FALSE)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#else
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncstatic BOOL IsBadReadPointer(PVOID pBase, ULONG ulSize)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulFlags;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosQueryMem(pBase, &ulSize, &ulFlags);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc!=0?TRUE:(ulFlags&PAG_READ)&&(ulFlags&PAG_COMMIT)?FALSE:TRUE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncstatic BOOL IsBadWritePointer(PVOID pBase, ULONG ulSize)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulFlags;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosQueryMem(pBase, &ulSize, &ulFlags);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc!=0?TRUE:((ulFlags&PAG_WRITE)==PAG_WRITE&&(ulFlags&PAG_COMMIT)==PAG_COMMIT)?FALSE:TRUE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbQueryNumberDevices(ULONG *pulNumDev)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulLength;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( IsBadWritePointer(pulNumDev,sizeof(ULONG)) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulLength=sizeof(ULONG);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pulNumDev = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_NUMDEVICE,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync NULL, 0, NULL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pulNumDev, ulLength, &ulLength);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbQueryDeviceReport(ULONG ulDevNumber, ULONG *pulBufLen, PVOID pData)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( IsBadWritePointer(pulBufLen, sizeof(ULONG)) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( pData!=NULL && IsBadWritePointer(pData,*pulBufLen) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(pData==NULL)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pulBufLen = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(ulDevNumber);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_GETINFO,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&ulDevNumber, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pData, *pulBufLen, pulBufLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbRegisterChangeNotification( PUSBNOTIFY pNotifyID,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hDeviceAdded,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hDeviceRemoved)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync int i;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync STATUSEVENTSET EventSet;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( IsBadWritePointer(pNotifyID, sizeof(ULONG)) ||
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (hDeviceAdded==0 && hDeviceRemoved==0) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulSize = sizeof(EventSet);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSize = ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(hDeviceAdded!=0)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulCnt;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosQueryEventSem(hDeviceAdded,&ulCnt);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulCaps = DEV_SEM_ADD;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceAdd = hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(hDeviceRemoved!=0)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulCnt;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosQueryEventSem(hDeviceRemoved,&ulCnt);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulCaps |= DEV_SEM_REMOVE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceRemove = hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemNotifytable,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i<MAX_NOTIFICATIONS;i++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( g_Notifications[i].usFlags == NOTIFY_FREE)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usFlags = NOTIFY_CHANGE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceAdded = hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceRemoved = hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usVendor = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usProduct = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usBCDDevice = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosReleaseMutexSem(g_hSemNotifytable);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(i==MAX_NOTIFICATIONS)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_ERROR_NO_MORE_NOTIFICATIONS;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ToDo come up with a better way to generate IDs */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pNotifyID = (USBNOTIFY) (&g_Notifications[i]);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_REG_STATUSSEM,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync NULL, 0, NULL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &EventSet,ulSize, &ulSize);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usFlags = NOTIFY_FREE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pNotifyID = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbRegisterDeviceNotification( PUSBNOTIFY pNotifyID,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hDeviceAdded,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hDeviceRemoved,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usVendor,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usProduct,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usBCDVersion)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DEVEVENTSET EventSet;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulCnt,ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync int i;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( IsBadWritePointer(pNotifyID, sizeof(ULONG)) ||
59190ecd61435d19ba3515b876272aee7bd12298vboxsync hDeviceAdded==0 || hDeviceRemoved==0 ||
59190ecd61435d19ba3515b876272aee7bd12298vboxsync usVendor == 0 || usVendor == 0xFFFF ||
59190ecd61435d19ba3515b876272aee7bd12298vboxsync usProduct == 0 || usProduct == 0xFFFF )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosQueryEventSem(hDeviceAdded,&ulCnt);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosQueryEventSem(hDeviceRemoved,&ulCnt);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulSize = sizeof(EventSet);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSize = ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulCaps = DEV_SEM_ADD | DEV_SEM_REMOVE |
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DEV_SEM_VENDORID | DEV_SEM_PRODUCTID |
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DEV_SEM_BCDDEVICE ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceAdd = hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceRemove = hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usVendorID = usVendor;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usProductID = usProduct;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usBCDDevice = usBCDVersion;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usStatus = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemNotifytable,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i<MAX_NOTIFICATIONS;i++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( g_Notifications[i].usFlags == NOTIFY_FREE)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usFlags = NOTIFY_DEVICE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceAdded = hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceRemoved = hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usVendor = usVendor;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usProduct = usProduct;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usBCDDevice = usBCDVersion;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosReleaseMutexSem(g_hSemNotifytable);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(i==MAX_NOTIFICATIONS)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_ERROR_NO_MORE_NOTIFICATIONS;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ToDo come up with a better way to generate IDs */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pNotifyID = (USBNOTIFY) (&g_Notifications[i]);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_REG_DEVICESEM,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync NULL, 0, NULL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &EventSet,ulSize, &ulSize);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= EventSet.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].usFlags = NOTIFY_FREE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pNotifyID = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbDeregisterNotification( USBNOTIFY NotifyID )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DEVEVENTSET EventSet;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBNOTIFY MinID,MaxID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG Index, ulFunction, ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync MinID = (USBNOTIFY) (&g_Notifications[0]);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync MaxID = (USBNOTIFY) (&g_Notifications[MAX_NOTIFICATIONS-1]);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(NotifyID<MinID || NotifyID>MaxID)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Index = NotifyID - MinID;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(Index % sizeof(NOTIFYENTRY))
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Index /= sizeof(NOTIFYENTRY);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemNotifytable,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync switch(g_Notifications[Index].usFlags)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync case NOTIFY_FREE:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosReleaseMutexSem(g_hSemNotifytable);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync case NOTIFY_CHANGE:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulFunction = IOCTLF_DEREG_STATUSSEM;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulSize = sizeof(STATUSEVENTSET);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSize = ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulCaps = DEV_SEM_ADD | DEV_SEM_REMOVE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceAdd = g_Notifications[Index].hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceRemove = g_Notifications[Index].hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync case NOTIFY_DEVICE:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulFunction = IOCTLF_DEREG_DEVICESEM;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulSize = sizeof(DEVEVENTSET);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSize = ulSize;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulCaps = DEV_SEM_ADD | DEV_SEM_REMOVE |
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DEV_SEM_VENDORID | DEV_SEM_PRODUCTID |
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DEV_SEM_BCDDEVICE ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceAdd = g_Notifications[Index].hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceRemove = g_Notifications[Index].hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usVendorID = g_Notifications[Index].usVendor;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usProductID = g_Notifications[Index].usProduct;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usBCDDevice = g_Notifications[Index].usBCDDevice;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.usStatus = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync default:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosReleaseMutexSem(g_hSemNotifytable);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_GEN_FAILURE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, ulFunction,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync NULL, 0, NULL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &EventSet,ulSize, &ulSize);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(0==rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[Index].usFlags = NOTIFY_FREE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[Index].hDeviceAdded = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[Index].hDeviceRemoved = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[Index].usVendor = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[Index].usProduct = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[Index].usBCDDevice = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync } else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= EventSet.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosReleaseMutexSem(g_hSemNotifytable);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbOpen( PUSBHANDLE pHandle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usVendor,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usProduct,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usBCDDevice,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usEnumDevice)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulCat, ulFunc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync AQUIREDEV Aquire;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(IsBadWritePointer(pHandle,sizeof(USBHANDLE)) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Aquire.usVendorID = usVendor;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Aquire.usProductID = usProduct;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Aquire.usBCDDevice = usBCDDevice;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Aquire.usDeviceNumber = usEnumDevice;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulCat = 0xA0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulFunc = 0x33;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(Aquire);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = sizeof(USBHANDLE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulCat,ulFunc, /*IOCAT_USBRES, IOCTLF_AQUIREDEVICE, */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &Aquire, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pHandle, ulDataLen, &ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* @@ ToDO maybe gether some info about device here (endpoints etc for safety checks) */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbClose( USBHANDLE Handle)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulDataLen,ulParmLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(USBHANDLE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_RELEASEDEVICE,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&Handle, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync NULL, ulDataLen, &ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbCtrlMessage( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucRequestType,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucRequest,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usValue,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usIndex,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usLength,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_CTRL_REQ CtrlRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(USBCALLS_CTRL_REQ);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.ulHandle = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.bRequestType = ucRequestType;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.bRequest = ucRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.wValue = usValue;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.wIndex = usIndex;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.wLength = usLength;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync CtrlRequest.ulTimeout = ulTimeout;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = usLength;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_SENDCONTROLURB,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&CtrlRequest, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen>0?(PVOID)pData:NULL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen>0?&ulDataLen:NULL);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc != NO_ERROR )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= CtrlRequest.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbBulkRead( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG *ulNumBytes,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pvData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return UsbBulkRead2(Handle, Endpoint, AltInterface, TRUE /* fShortOk */, ulNumBytes, pvData, ulTimeout);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbBulkRead2( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BOOL fShortOk,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG *ulNumBytes,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pvData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen, ulToProcess, ulTotalProcessed;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_BULK_REQ BulkRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(*ulNumBytes==0)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* just require this */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if ((ULONG)pvData & 0xfff)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_ADDRESS;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if ((ULONG)pvData >= 0x20000000)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_ADDRESS;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulToProcess = *ulNumBytes;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulTotalProcessed = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync do
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Process up to 64k, making sure we're working on segments. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = 0x10000 - ((ULONG)pvData & 0xffff);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (ulDataLen > ulToProcess)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = ulToProcess;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(USBCALLS_BULK_REQ);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync memset(&BulkRequest, 0, sizeof(BulkRequest));
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ulDevHandle = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ucEndpoint = Endpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ucAltInterface = AltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usStatus = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ulEvent = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync //BulkRequest.ulID = (ULONG)pvData;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ulTimeout = ulTimeout;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usDataProcessed = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usDataRemain = ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usFlags = fShortOk && ulDataLen == ulToProcess ? 0 : USB_TRANSFER_FULL_SIZE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_SENDBULKURB,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&BulkRequest, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pvData, ulDataLen, &ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Log(("BulkRead: usStatus=%d rc=%ld usDataProcessed=%d usDataRemain=%d ulDataLen=%ld\n",
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usStatus, rc, BulkRequest.usDataProcessed, BulkRequest.usDataRemain, ulDataLen));
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (rc != NO_ERROR)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= BulkRequest.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Adjust count and source pointer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulToProcess -= ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pvData = (PBYTE)pvData + ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulTotalProcessed += BulkRequest.usDataProcessed;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (BulkRequest.usDataProcessed != ulDataLen)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* Transferred less than we wanted? so something is wrong,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync or device doesn't wish to send more, exit loop */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = USB_ERROR_LESSTRANSFERED;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync } while( ulToProcess>0 );
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *ulNumBytes = ulTotalProcessed;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbBulkWrite( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulNumBytes,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pvData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return UsbBulkWrite2(Handle, Endpoint, AltInterface, FALSE /* fShortOk */, ulNumBytes, pvData, ulTimeout);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbBulkWrite2( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BOOL fShortOk,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulNumBytes,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pvData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_BULK_REQ BulkRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* just require this */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if ((ULONG)pvData & 0xfff)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_ADDRESS;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if ((ULONG)pvData >= 0x20000000)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_ADDRESS;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync do
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Process up to 64k, making sure we're working on segments. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = 0x10000 - ((ULONG)pvData & 0xffff);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (ulDataLen > ulNumBytes)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = ulNumBytes;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(USBCALLS_BULK_REQ);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync memset(&BulkRequest, 0, sizeof(BulkRequest));
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ulDevHandle = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ucEndpoint = Endpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ucAltInterface = AltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usStatus = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ulEvent = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync //BulkRequest.ulID = (ULONG)pvData;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.ulTimeout = ulTimeout;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usDataProcessed = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usDataRemain = ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usFlags = fShortOk && ulDataLen == ulNumBytes ? 0 : USB_TRANSFER_FULL_SIZE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_SENDBULKURB,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &BulkRequest, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pvData, ulDataLen, &ulDataLen );
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Log(("BulkWrite: usStatus=%d rc=%ld usDataProcessed=%d usDataRemain=%d ulDataLen=%ld\n",
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usStatus, rc, BulkRequest.usDataProcessed, BulkRequest.usDataRemain, ulDataLen));
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (rc != NO_ERROR)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= BulkRequest.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Adjust count and source pointer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulNumBytes -= ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pvData = (PBYTE)pvData + ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync } while( ulNumBytes > 0 );
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIrqStart( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT ulNumBytes,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PHEV pHevModified)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_IRQ_START IrqStart;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV hEvent;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(0==ulNumBytes || IsBadWritePointer(pData, ulNumBytes))
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosCreateEventSem( NULL,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &hEvent,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DC_SEM_SHARED,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync FALSE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqStart.ulDevHandle = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqStart.ucEndpoint = Endpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqStart.ucAltInterface = AltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqStart.usStatus = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqStart.ulEvent = hEvent;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(IrqStart);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = ulNumBytes;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_START_IRQ_PROC,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&IrqStart, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pData, ulDataLen,&ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosCloseEventSem(hEvent);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pHevModified = hEvent;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIrqStop( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync HEV HevModified)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(Handle);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = sizeof(HevModified);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_STOP_IRQ_PROC,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&Handle, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync &HevModified, ulDataLen, &ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosCloseEventSem(HevModified);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIsoStart( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ISOHANDLE *phIso)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pIter = g_pIsoRingBuffers;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USBCALLS_ISO_START IsoStart;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync int i;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemRingBuffers,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i< g_ulNumIsoRingBuffers;i++,pIter++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (pIter->hDevice==0)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->hDevice = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync DosReleaseMutexSem(g_hSemRingBuffers);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(i==g_ulNumIsoRingBuffers)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_ERROR_OUTOF_RESOURCES;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IsoStart.ulDevHandle = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IsoStart.ucEndpoint = Endpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IsoStart.ucAltInterface = AltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(IsoStart);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = sizeof(ISORINGBUFFER);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_STOP_IRQ_PROC,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&IsoStart, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter, ulDataLen, &ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->hDevice = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *phIso = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->ucEndpoint = Endpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->ucAltInterface = AltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncstatic APIRET IsInvalidIsoHandle(const ISOHANDLE hIso)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pIter;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG i;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter = g_pIsoRingBuffers;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync for(i=0;i<g_ulNumIsoRingBuffers;i++,pIter++)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(pIter==(PISORINGBUFFER)hIso && pIter->hDevice)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIsoStop( ISOHANDLE hIso)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* rc = DosDevIOCtl( g_hUSBDrv, */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIsoDequeue( ISOHANDLE hIso,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pBuffer,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulNumBytes)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pRB = (PISORINGBUFFER)hIso;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = IsInvalidIsoHandle(hIso);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!(pRB->ucEndpoint & ISO_DIRMASK))
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIsoPeekQueue( ISOHANDLE hIso,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR * pByte,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulOffset)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pRB = (PISORINGBUFFER)hIso;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = IsInvalidIsoHandle(hIso);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!(pRB->ucEndpoint & ISO_DIRMASK))
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIsoEnqueue( ISOHANDLE hIso,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync const UCHAR * pBuffer,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulNumBytes)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pRB = (PISORINGBUFFER)hIso;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = IsInvalidIsoHandle(hIso);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(pRB->ucEndpoint & ISO_DIRMASK)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIsoGetLength( ISOHANDLE hIso,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG *pulLength)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PISORINGBUFFER pRB = (PISORINGBUFFER) hIso;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT ri,wi;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = IsInvalidIsoHandle(hIso);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(rc)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync wi = pRB->usPosWrite;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ri = pRB->usPosRead;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (ri == wi)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pulLength = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync else if (ri < wi)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pulLength = wi - ri;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *pulLength = wi + (pRB->usBufSize - ri);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbIrqRead( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR Endpoint,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR AltInterface,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG *ulNumBytes,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync PVOID pData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulTimeout)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync LIBUSB_IRQ_REQ IrqRequest;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(!g_cInit)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_NOT_INIT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* 10 01 2003 - KIEWITZ -> Still @@ToDo Add Endpoint check based on descriptors
59190ecd61435d19ba3515b876272aee7bd12298vboxsync We currently only allow Endpoint-addresses 80h->8Fh here */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if ((Endpoint<0x80) || (Endpoint>0x8F))
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return USB_ERROR_INVALID_ENDPOINT;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(*ulNumBytes==0)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqRequest.ulDevHandle = Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqRequest.ucEndpoint = Endpoint;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqRequest.ucAltInterface = AltInterface;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqRequest.usStatus = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqRequest.ulEvent = 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IrqRequest.ulTimeout = ulTimeout;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen = sizeof(LIBUSB_IRQ_REQ);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulDataLen = *ulNumBytes;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_SENDIRQURB,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&IrqRequest, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pData, ulDataLen, &ulDataLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == NO_ERROR )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync *ulNumBytes = IrqRequest.usDataLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync } else
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= IrqRequest.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncAPIEXPORT APIRET APIENTRY
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbFixupDevice( USBHANDLE Handle,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR ucConfiguration,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UCHAR *pucConfigurationData,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulConfigurationLen )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync LIBUSB_FIXUP request;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync APIRET rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync request.ulDevHandle= Handle;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync request.ucConfiguration= ucConfiguration;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync request.usStatus= 0;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulParmLen= sizeof(LIBUSB_FIXUP);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosDevIOCtl( g_hUSBDrv,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync IOCAT_USBRES, IOCTLF_FIXUPDEVUCE,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync (PVOID)&request, ulParmLen, &ulParmLen,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pucConfigurationData, ulConfigurationLen, &ulConfigurationLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc != NO_ERROR )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= ERROR_INVALID_PARAMETER;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc= request.usStatus;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifndef STATIC_USBCALLS
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| _CRT_init is the C run-time environment initialization function. |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*|It will return 0 to indicate success and -1 to indicate failure. |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* int _CRT_init (void); */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| _CRT_term is the C run-time environment termination function. |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* void _CRT_term (unsigned long);*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| _DLL_InitTerm is the function that gets called by the operating |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| system loader when it loads and frees this DLL for each process |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| that accesses this DLL. However, it only gets called the first |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| time the DLL is loaded and the last time it is freed for a |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| particular process. The system linkage convention must be used |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| because the operating system loader is calling this function. |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifdef STATIC_LINK
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncint _CRT_init (void);
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncvoid _CRT_term(0UL);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncunsigned long _System _DLL_InitTerm (unsigned long modhandle, unsigned long flag)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync{
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* If flag is zero then the DLL is being loaded so initialization */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* should be performed. If flag is 1 then the DLL is being freed */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* so termination should be performed. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync switch (flag)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync {
59190ecd61435d19ba3515b876272aee7bd12298vboxsync case 0:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* The C run-time environment initialization function must */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* be called before any calls to C run-time functions that */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* are not inlined. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifdef STATIC_LINK
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if (_CRT_init () == -1)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 0UL;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync InitUsbCalls();
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync case 1:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync TermUsbCalls();
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#ifdef STATIC_LINK
59190ecd61435d19ba3515b876272aee7bd12298vboxsync _CRT_term(0UL);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif
59190ecd61435d19ba3515b876272aee7bd12298vboxsync break;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync default:
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 0UL;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync }
59190ecd61435d19ba3515b876272aee7bd12298vboxsync
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* A nonzero value must be returned to indicate success. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 1UL;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync}
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif /* !STATIC_USBCALLS */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync