/* * usbcamdi.h * * USB Camera driver interface. * * This file is part of the w32api package. * * Contributors: * Created by Casper S. Hornstrup * * THIS SOFTWARE IS NOT COPYRIGHTED * * This source code is offered for use in the public domain. You may * use, modify or distribute it freely. * * This code is distributed in the hope that it will be useful but * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * */ #ifndef __USBCAMDI_H #define __USBCAMDI_H #if __GNUC__ >=3 #pragma GCC system_header #endif #if !defined(__USB_H) && !defined(__USBDI_H) #error include usb.h or usbdi.h before usbcamdi.h #else #ifdef __cplusplus extern "C" { #endif #pragma pack(push,4) #include "ntddk.h" #if defined(_BATTERYCLASS_) #define USBCAMAPI DECLSPEC_EXPORT #else #define USBCAMAPI DECLSPEC_IMPORT #endif /* FIXME: Unknown definition */ typedef PVOID PHW_STREAM_REQUEST_BLOCK; DEFINE_GUID(GUID_USBCAMD_INTERFACE, 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5); #define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002 #define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004 #define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008 #define USBCAMD_DATA_PIPE 0x0001 #define USBCAMD_MULTIPLEX_PIPE 0x0002 #define USBCAMD_SYNC_PIPE 0x0004 #define USBCAMD_DONT_CARE_PIPE 0x0008 #define USBCAMD_VIDEO_STREAM 0x1 #define USBCAMD_STILL_STREAM 0x2 #define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM) #define USBCAMD_STOP_STREAM 0x00000001 #define USBCAMD_START_STREAM 0x00000000 typedef struct _pipe_config_descriptor { CHAR StreamAssociation; UCHAR PipeConfigFlags; } USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor; typedef enum { USBCAMD_CamControlFlag_NoVideoRawProcessing = 1, USBCAMD_CamControlFlag_NoStillRawProcessing = 2, USBCAMD_CamControlFlag_AssociatedFormat = 4, USBCAMD_CamControlFlag_EnableDeviceEvents = 8 } USBCAMD_CamControlFlags; typedef NTSTATUS DDKAPI (*PCAM_ALLOCATE_BW_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PULONG RawFrameLength, PVOID Format); typedef NTSTATUS DDKAPI (*PCAM_ALLOCATE_BW_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PULONG RawFrameLength, PVOID Format, ULONG StreamNumber); typedef NTSTATUS DDKAPI (*PCAM_CONFIGURE_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PUSBD_INTERFACE_INFORMATION Interface, PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, PLONG DataPipeIndex, PLONG SyncPipeIndex); typedef NTSTATUS DDKAPI (*PCAM_CONFIGURE_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PUSBD_INTERFACE_INFORMATION Interface, PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, ULONG PipeConfigListSize, PUSBCAMD_Pipe_Config_Descriptor PipeConfig, PUSB_DEVICE_DESCRIPTOR DeviceDescriptor); typedef NTSTATUS DDKAPI (*PCAM_FREE_BW_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext); typedef NTSTATUS DDKAPI (*PCAM_FREE_BW_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, ULONG StreamNumber); typedef NTSTATUS DDKAPI (*PCAM_INITIALIZE_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext); typedef VOID DDKAPI (*PCAM_NEW_FRAME_ROUTINE)( PVOID DeviceContext, PVOID FrameContext); typedef VOID DDKAPI (*PCAM_NEW_FRAME_ROUTINE_EX)( PVOID DeviceContext, PVOID FrameContext, ULONG StreamNumber, PULONG FrameLength); typedef NTSTATUS DDKAPI (*PCAM_PROCESS_RAW_FRAME_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PVOID FrameContext, PVOID FrameBuffer, ULONG FrameLength, PVOID RawFrameBuffer, ULONG RawFrameLength, ULONG NumberOfPackets, PULONG BytesReturned); typedef NTSTATUS DDKAPI (*PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PVOID FrameContext, PVOID FrameBuffer, ULONG FrameLength, PVOID RawFrameBuffer, ULONG RawFrameLength, ULONG NumberOfPackets, PULONG BytesReturned, ULONG ActualRawFrameLength, ULONG StreamNumber); typedef ULONG DDKAPI (*PCAM_PROCESS_PACKET_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PVOID CurrentFrameContext, PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket, PVOID SyncBuffer, PUSBD_ISO_PACKET_DESCRIPTOR DataPacket, PVOID DataBuffer, PBOOLEAN FrameComplete, PBOOLEAN NextFrameIsStill); typedef ULONG DDKAPI (*PCAM_PROCESS_PACKET_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, PVOID CurrentFrameContext, PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket, PVOID SyncBuffer, PUSBD_ISO_PACKET_DESCRIPTOR DataPacket, PVOID DataBuffer, PBOOLEAN FrameComplete, PULONG PacketFlag, PULONG ValidDataOffset); typedef NTSTATUS DDKAPI (*PCAM_STATE_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext); typedef NTSTATUS DDKAPI (*PCAM_START_CAPTURE_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext); typedef NTSTATUS DDKAPI (*PCAM_START_CAPTURE_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, ULONG StreamNumber); typedef NTSTATUS DDKAPI (*PCAM_STOP_CAPTURE_ROUTINE)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext); typedef NTSTATUS DDKAPI (*PCAM_STOP_CAPTURE_ROUTINE_EX)( PDEVICE_OBJECT BusDeviceObject, PVOID DeviceContext, ULONG StreamNumber); typedef struct _USBCAMD_DEVICE_DATA { ULONG Sig; PCAM_INITIALIZE_ROUTINE CamInitialize; PCAM_INITIALIZE_ROUTINE CamUnInitialize; PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket; PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame; PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame; PCAM_START_CAPTURE_ROUTINE CamStartCapture; PCAM_STOP_CAPTURE_ROUTINE CamStopCapture; PCAM_CONFIGURE_ROUTINE CamConfigure; PCAM_STATE_ROUTINE CamSaveState; PCAM_STATE_ROUTINE CamRestoreState; PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth; PCAM_FREE_BW_ROUTINE CamFreeBandwidth; } USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA; typedef struct _USBCAMD_DEVICE_DATA2 { ULONG Sig; PCAM_INITIALIZE_ROUTINE CamInitialize; PCAM_INITIALIZE_ROUTINE CamUnInitialize; PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx; PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx; PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx; PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx; PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx; PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx; PCAM_STATE_ROUTINE CamSaveState; PCAM_STATE_ROUTINE CamRestoreState; PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx; PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx; } USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2; USBCAMAPI ULONG DDKAPI USBCAMD_InitializeNewInterface( /*IN*/ PVOID DeviceContext, /*IN*/ PVOID DeviceData, /*IN*/ ULONG Version, /*IN*/ ULONG CamControlFlag); typedef VOID DDKAPI (*PCOMMAND_COMPLETE_FUNCTION)( PVOID DeviceContext, PVOID CommandContext, NTSTATUS NtStatus); typedef NTSTATUS DDKAPI (*PFNUSBCAMD_BulkReadWrite)( /*IN*/ PVOID DeviceContext, /*IN*/ USHORT PipeIndex, /*IN*/ PVOID Buffer, /*IN*/ ULONG BufferLength, /*IN*/ PCOMMAND_COMPLETE_FUNCTION CommandComplete, /*IN*/ PVOID CommandContext); typedef NTSTATUS DDKAPI (*PFNUSBCAMD_SetIsoPipeState)( /*IN*/ PVOID DeviceContext, /*IN*/ ULONG PipeStateFlags); typedef NTSTATUS DDKAPI (*PFNUSBCAMD_CancelBulkReadWrite)( /*IN*/ PVOID DeviceContext, /*IN*/ ULONG PipeIndex); typedef NTSTATUS DDKAPI (*PFNUSBCAMD_SetVideoFormat)( /*IN*/ PVOID DeviceContext, /*IN*/ PHW_STREAM_REQUEST_BLOCK pSrb); typedef NTSTATUS DDKAPI (*PFNUSBCAMD_WaitOnDeviceEvent)( /*IN*/ PVOID DeviceContext, /*IN*/ ULONG PipeIndex, /*IN*/ PVOID Buffer, /*IN*/ ULONG BufferLength, /*IN*/ PCOMMAND_COMPLETE_FUNCTION EventComplete, /*IN*/ PVOID EventContext, /*IN*/ BOOLEAN LoopBack); USBCAMAPI PVOID DDKAPI USBCAMD_AdapterReceivePacket( /*IN*/ PHW_STREAM_REQUEST_BLOCK Srb, /*IN*/ PUSBCAMD_DEVICE_DATA DeviceData, /*IN*/ PDEVICE_OBJECT *DeviceObject, /*IN*/ BOOLEAN NeedsCompletion); USBCAMAPI NTSTATUS DDKAPI USBCAMD_ControlVendorCommand( /*IN*/ PVOID DeviceContext, /*IN*/ UCHAR Request, /*IN*/ USHORT Value, /*IN*/ USHORT Index, /*IN*/ PVOID Buffer, /*IN OUT*/ PULONG BufferLength, /*IN*/ BOOLEAN GetData, /*IN*/ PCOMMAND_COMPLETE_FUNCTION CommandComplete, /*IN*/ PVOID CommandContext); typedef VOID DDKAPI (*PADAPTER_RECEIVE_PACKET_ROUTINE)( /*IN*/ PHW_STREAM_REQUEST_BLOCK Srb); USBCAMAPI ULONG DDKAPI USBCAMD_DriverEntry( PVOID Context1, PVOID Context2, ULONG DeviceContextSize, ULONG FrameContextSize, PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket); USBCAMAPI NTSTATUS DDKAPI USBCAMD_GetRegistryKeyValue( /*IN*/ HANDLE Handle, /*IN*/ PWCHAR KeyNameString, /*IN*/ ULONG KeyNameStringLength, /*IN*/ PVOID Data, /*IN*/ ULONG DataLength); USBCAMAPI NTSTATUS DDKAPI USBCAMD_SelectAlternateInterface( /*IN*/ PVOID DeviceContext, /*IN OUT*/ PUSBD_INTERFACE_INFORMATION RequestInterface); #define USBCAMD_VERSION_200 0x200 typedef struct _USBCAMD_INTERFACE { INTERFACE Interface; PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent; PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite; PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat; PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState; PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite; } USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE; typedef VOID DDKAPI (*PSTREAM_RECEIVE_PACKET)( /*IN*/ PVOID Srb, /*IN*/ PVOID DeviceContext, /*IN*/ PBOOLEAN Completed); #if defined(DEBUG_LOG) USBCAMAPI VOID DDKAPI USBCAMD_Debug_LogEntry( /*IN*/ CHAR *Name, /*IN*/ ULONG Info1, /*IN*/ ULONG Info2, /*IN*/ ULONG Info3); #define ILOGENTRY(sig, info1, info2, info3) \ USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3) #else #define ILOGENTRY(sig, info1, info2, info3) #endif /* DEBUG_LOG */ #pragma pack(pop) #ifdef __cplusplus } #endif #endif /* !defined(__USB_H) && !defined(__USBDI_H) */ #endif /* __USBCAMDI_H */