www.pudn.com > wave-isotransfer.rar > usbdriver.h
//#ifdef DRIVER和ENDIF的部分是开发设备驱动程序所专用的,他们不能在Win32应用程序中使用,所以加上了该屏蔽。 //也就是说,该头文件也可在Win32应用程序中直接使用,而且也的确使用了。当然,也可以在Win32应用程序中把不 //需要的部分直接去除。 #ifndef USBDRIVER_H #define USBDRIVER_H #endif #ifdef DRIVER #include "wdm.h" #include "usbdi.h" #include "usbdlib.h" #include#endif #ifndef _BYTE_DEFINED #define _BYTE_DEFINED typedef unsigned char BYTE; #endif // !_BYTE_DEFINED #ifndef _WORD_DEFINED #define _WORD_DEFINED typedef unsigned short WORD; #endif // !_WORD_DEFINED typedef struct _GET_STRING_DESCRIPTOR_IN { UCHAR Index; USHORT LanguageId; } GET_STRING_DESCRIPTOR_IN, *PGET_STRING_DESCRIPTOR_IN; typedef struct _ISO_TRANSFER_CONTROL { // pipe number to perform the ISO transfer to/from. Direction is // implied by the pipe number. ULONG PipeNum; // ISO packet size. Determines how much data is transferred each // frame. Should be less than or equal to the maxpacketsize for // the endpoint. ULONG PacketSize; // Total number of ISO packets to transfer. ULONG PacketCount; // The following two parameters detmine how buffers are managed for // an ISO transfer. In order to maintain an ISO stream, the driver // must create at least 2 transfer buffers and ping pong between them. // BufferCount determines how many buffers the driver creates to ping // pong between. FramesPerBuffer specifies how many USB frames of data // are transferred by each buffer. ULONG FramesPerBuffer; // 10 is a good value ULONG BufferCount; // 2 is a good value } ISO_TRANSFER_CONTROL, *PISO_TRANSFER_CONTROL; #ifdef DRIVER typedef struct _RING_BUFFER { PUCHAR inPtr; PUCHAR outPtr; ULONG totalSize; ULONG currentSize; KSPIN_LOCK spinLock; PUCHAR buffer; } RING_BUFFER, *PRING_BUFFER; typedef struct _ISO_STREAM_OBJECT ISO_STREAM_OBJECT, *PISO_STREAM_OBJECT; typedef struct _ISO_TRANSFER_OBJECT { ULONG Frame; PISO_STREAM_OBJECT StreamObject; PURB Urb; PIRP Irp; KEVENT Done; } ISO_TRANSFER_OBJECT, *PISO_TRANSFER_OBJECT; typedef struct _ISO_STREAM_OBJECT { PDEVICE_OBJECT DeviceObject; ULONG PacketSize; ULONG NumPackets; PUSBD_PIPE_INFORMATION PipeInfo; PVOID TransferBuffer; ULONG TransferBufferLength; PVOID IsoDescriptorBuffer; ULONG FramesPerBuffer; ULONG BufferCount; ULONG PendingTransfers; PRING_BUFFER DataRingBuffer; PRING_BUFFER DescriptorRingBuffer; PISO_TRANSFER_OBJECT TransferObject; } ISO_STREAM_OBJECT, *PISO_STREAM_OBJECT; // Device extension structure typedef struct tagDEVICE_EXTENSION { PDEVICE_OBJECT PhysicalDeviceObject; // physical device object PDEVICE_OBJECT LowerDeviceObject; // next lower driver in same stack BOOLEAN Stop; // Indicates that we have recieved a STOP message // configuration handle for the configuration the // device is currently in USBD_CONFIGURATION_HANDLE ConfigurationHandle; // pointer to the USB device descriptor for this device PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // we support up to one interface PUSBD_INTERFACE_INFORMATION Interface; // the number of device handles currently open to the device object. // Gets incremented by Create and decremented by Close //打开的设备句柄。与用户应用程序相对应的。即createfile和closehandle。 ULONG OpenHandles; // Name buffer for our named Functional device object link //设备连接名,注意它的长度为64。不要太小了,如32,不好。 WCHAR DeviceLinkName[64]; // use counter for the device. Gets incremented when the driver receives // a request and gets decremented when a request s completed. //记录有多少个I/O请求正在处理中。 LONG Usages; // this event gets set when it is ok to remove the device KEVENT evRemove; // TRUE if we're trying to remove this device BOOLEAN Removing; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; NTSTATUS TestAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject); VOID TestDrvUnload(IN PDRIVER_OBJECT DriverObject); NTSTATUS TestPnpIrp(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS TestPowerIrp(IN PDEVICE_OBJECT fdo,IN PIRP Irp); NTSTATUS TestCreate(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS TestClose(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS TestIOCTL(IN PDEVICE_OBJECT fdo,IN PIRP Irp); BOOLEAN LockDevice(IN PDEVICE_OBJECT fdo); void UnlockDevice(PDEVICE_OBJECT fdo); NTSTATUS CompleteRequest(IN PIRP Irp,IN NTSTATUS status,IN ULONG info); NTSTATUS UsbCallUSBDI(IN PDEVICE_OBJECT fdo,IN PURB Urb); NTSTATUS UsbResetPipe(IN PDEVICE_OBJECT DeviceObject,IN ULONG PipeNum); #endif //DRIVER section #define Ezusb_IOCTL_INDEX 0x0800 //FILE_DEVICE_UNKNOWN在adddevice时标志的。 #define IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+0,\ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_Ezusb_GET_CONFIGURATION_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+1,\ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_Ezusb_GET_STRING_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+2,\ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_EZUSB_ISO_WRITE CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+3,\ METHOD_IN_DIRECT, \ FILE_ANY_ACCESS) #define IOCTL_EZUSB_ISO_READ CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+4,\ METHOD_OUT_DIRECT, \ FILE_ANY_ACCESS) #define IOCTL_EZUSB_GET_CURRENT_FRAME_NUMBER CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+5,\ METHOD_BUFFERED, \ FILE_ANY_ACCESS) #define IOCTL_Ezusb_RESETPIPE CTL_CODE(FILE_DEVICE_UNKNOWN, \ Ezusb_IOCTL_INDEX+6,\ METHOD_IN_DIRECT, \ FILE_ANY_ACCESS)