usbcalls.c revision 59190ecd61435d19ba3515b876272aee7bd12298
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/*#define ERROR_USER_DEFINED_BASE 0xFF00 */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCAT_USBRES 0x000000A0 /* USB Resource device control */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_NUMDEVICE 0x00000031 /* Get Number of pluged in Devices */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#define IOCTLF_GETINFO 0x00000032 /* Get Info About a device */
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 */
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct{
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct{
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync USHORT usDeviceNumber; /* Get the usDeviceNumber device in the system fi. if 2 aquire the 2nd device
59190ecd61435d19ba3515b876272aee7bd12298vboxsync 0 means first not aquired device. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
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;
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG hSemAccess; /* Syncronise access to the Pos values */
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;
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* ULONG ulID; - yeah, right */
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} LIBUSB_IRQ_REQ, *NPLIBUSB_IRQ_REQ, FAR *PLIBUSB_IRQ_REQ;
59190ecd61435d19ba3515b876272aee7bd12298vboxsynctypedef struct
59190ecd61435d19ba3515b876272aee7bd12298vboxsync} LIBUSB_FIXUP, *NPLIBUSB_FIXUP, FAR *PLIBUSB_FIXUP;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/******************************************************************************/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ToDO Add EnvVar or INI for dynamically setting the number */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pIter->hSemAccess = 0; /* Syncronise access to the Pos values */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*pIter->ucBuffer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc=DosCreateMutexSem(NULL,&g_hSemRingBuffers,DC_SEM_SHARED,FALSE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc=DosCreateMutexSem(NULL,&g_hSemNotifytable,DC_SEM_SHARED,FALSE);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return g_cInit ? NO_ERROR : rc ? rc : ERROR_GEN_FAILURE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync UsbDeregisterNotification((USBNOTIFY)(&g_Notifications[i]));
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncstatic BOOL IsBadReadPointer(PVOID pBase, ULONG ulSize)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc!=0?TRUE:(ulFlags&PAG_READ)&&(ulFlags&PAG_COMMIT)?FALSE:TRUE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncstatic BOOL IsBadWritePointer(PVOID pBase, ULONG ulSize)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return rc!=0?TRUE:((ulFlags&PAG_WRITE)==PAG_WRITE&&(ulFlags&PAG_COMMIT)==PAG_COMMIT)?FALSE:TRUE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbQueryDeviceReport(ULONG ulDevNumber, ULONG *pulBufLen, PVOID pData)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( pData!=NULL && IsBadWritePointer(pData,*pulBufLen) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbRegisterChangeNotification( PUSBNOTIFY pNotifyID,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemNotifytable,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceRemoved = hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ToDo come up with a better way to generate IDs */
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncUsbRegisterDeviceNotification( PUSBNOTIFY pNotifyID,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemNotifytable,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync g_Notifications[i].hDeviceRemoved = hDeviceRemoved;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ToDo come up with a better way to generate IDs */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync MaxID = (USBNOTIFY) (&g_Notifications[MAX_NOTIFICATIONS-1]);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemNotifytable,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceAdd = g_Notifications[Index].hDeviceAdded;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync EventSet.ulSemDeviceRemove = g_Notifications[Index].hDeviceRemoved;
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 if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ulCat,ulFunc, /*IOCAT_USBRES, IOCTLF_AQUIREDEVICE, */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* @@ ToDO maybe gether some info about device here (endpoints etc for savety checks) */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return UsbBulkRead2(Handle, Endpoint, AltInterface, TRUE /* fShortOk */, ulNumBytes, pvData, ulTimeout);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync ULONG ulParmLen, ulDataLen, ulToProcess, ulTotalProcessed;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* just require this */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Process up to 64k, making sure we're working on segments. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync //BulkRequest.ulID = (ULONG)pvData;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usFlags = fShortOk && ulDataLen == ulToProcess ? 0 : USB_TRANSFER_FULL_SIZE;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync Log(("BulkRead: usStatus=%d rc=%ld usDataProcessed=%d usDataRemain=%d ulDataLen=%ld\n",
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usStatus, rc, BulkRequest.usDataProcessed, BulkRequest.usDataRemain, ulDataLen));
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Adjust count and source pointer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Transfered less than we wanted? so something is wrong,
59190ecd61435d19ba3515b876272aee7bd12298vboxsync or device doesn't wish to send more, exit loop */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync } while( ulToProcess>0 );
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return UsbBulkWrite2(Handle, Endpoint, AltInterface, FALSE /* fShortOk */, ulNumBytes, pvData, ulTimeout);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* just require this */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Process up to 64k, making sure we're working on segments. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync //BulkRequest.ulID = (ULONG)pvData;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync BulkRequest.usFlags = fShortOk && ulDataLen == ulNumBytes ? 0 : USB_TRANSFER_FULL_SIZE;
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 == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /* Adjust count and source pointer */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync } while( ulNumBytes > 0 );
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if(0==ulNumBytes || IsBadWritePointer(pData, ulNumBytes))
59190ecd61435d19ba3515b876272aee7bd12298vboxsync rc = DosRequestMutexSem(g_hSemRingBuffers,SEM_INDEFINITE_WAIT);
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncstatic APIRET IsInvalidIsoHandle(const ISOHANDLE hIso)
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* rc = DosDevIOCtl( g_hUSBDrv, */
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( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync pucConfigurationData, ulConfigurationLen, &ulConfigurationLen);
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_INVALID_PARAMETER) )
59190ecd61435d19ba3515b876272aee7bd12298vboxsync if( rc == (ERROR_USER_DEFINED_BASE|ERROR_I24_GEN_FAILURE) )
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/* int _CRT_init (void); */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*| _CRT_term is the C run-time environment termination function. |*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsync/* void _CRT_term (unsigned long);*/
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 /*+-------------------------------------------------------------------+*/
59190ecd61435d19ba3515b876272aee7bd12298vboxsyncunsigned long _System _DLL_InitTerm (unsigned long modhandle, unsigned long flag)
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 /* 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 /* A nonzero value must be returned to indicate success. */
59190ecd61435d19ba3515b876272aee7bd12298vboxsync return 1UL;
59190ecd61435d19ba3515b876272aee7bd12298vboxsync#endif /* !STATIC_USBCALLS */