You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
6.5 KiB
206 lines
6.5 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
GENUSBIO.H
|
|
|
|
Abstract
|
|
|
|
Contains the IOCTL definitions shared between the generic USB driver and
|
|
its corresponding user mode dll. This is not a public interface.
|
|
|
|
Environment:
|
|
|
|
User / Kernel mode
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include <basetyps.h>
|
|
|
|
#include "gusb.h"
|
|
|
|
//
|
|
// Define the interface guid *OUTSIDE* the #ifndef/#endif to allow
|
|
// multiple includes with precompiled headers.
|
|
//
|
|
// fc21b2d1-2c37-4440-8eb0-b7e383a034e2
|
|
//
|
|
|
|
DEFINE_GUID( GUID_DEVINTERFACE_GENUSB, 0xfc21b2d1L, 0x2c37, 0x4440, 0x8e, 0xb0, 0xb7, 0xee, 0x83, 0xa0, 0x34, 0xe2);
|
|
|
|
|
|
#ifndef __GENUSBIO_H__
|
|
#define __GENUSBIO_H__
|
|
|
|
typedef ULONG GENUSB_PIPE_HANDLE;
|
|
|
|
#define GUID_DEVINTERFACE_GENUSB_STR "fc21b2d1-2c37-4440-8eb0-b7e383a034e2"
|
|
|
|
typedef struct _GENUSB_GET_STRING_DESCRIPTOR {
|
|
UCHAR Index;
|
|
UCHAR Recipient;
|
|
USHORT LanguageId;
|
|
|
|
} GENUSB_GET_STRING_DESCRIPTOR, *PGENUSB_GET_STRING_DESCRIPTOR;
|
|
|
|
typedef struct _GENUSB_GET_REQUEST {
|
|
UCHAR RequestType; // bmRequestType
|
|
UCHAR Request; // bRequest
|
|
USHORT Value; // wValue
|
|
USHORT Index; // wIndex
|
|
|
|
} GENUSB_GET_REQUEST, *PGENUSB_GET_REQUEST;
|
|
|
|
|
|
typedef struct _GENUSB_SELECT_CONFIGURATION {
|
|
|
|
UCHAR NumberInterfaces;
|
|
UCHAR Reserved[3];
|
|
USB_INTERFACE_DESCRIPTOR Interfaces[];
|
|
// provide an array of USB_INTERFACE_DESCRIPTOR structures to set the
|
|
// interfaces desired in a select configuration.
|
|
// Use -1 on any of the fields in this struct for that field to be ignored.
|
|
|
|
} GENUSB_SELECT_CONFIGURATION, *PGENUSB_SELECT_CONFIGURATION;
|
|
|
|
typedef struct _GENUSB_PIPE_INFO_REQUEST {
|
|
UCHAR InterfaceNumber;
|
|
UCHAR EndpointAddress;
|
|
UCHAR Reserved[2];
|
|
|
|
} GENUSB_PIPE_INFO_REQUEST, *PGENUSB_PIPE_INFO_REQUEST;
|
|
|
|
|
|
//
|
|
// This structure shouldn't be needed. We should be able to reuse
|
|
// USBD_PIPE_INFORMATION. (as we do in user mode.) The trouble is that
|
|
// USBD_PIPE_INFORMATION has an embedded pointer (namely PipeHandle which is
|
|
// a PVOID. This causes a problem if the user mode piece is running in a
|
|
// 32 bit app on a 64 bit machine. (aka the driver is 64 bits and user is 32.)
|
|
// because of that, I have redefined this structure, for use only in the
|
|
// comunication between the driver and the DLL so that no pointer is exchanged.
|
|
//
|
|
// Cleanups and confusions to follow.
|
|
//
|
|
typedef struct _GENUSB_PIPE_INFORMATION {
|
|
USHORT MaximumPacketSize; // Maximum packet size for this pipe
|
|
UCHAR EndpointAddress; // 8 bit USB endpoint address (includes direction)
|
|
// taken from endpoint descriptor
|
|
UCHAR Interval; // Polling interval in ms if interrupt pipe
|
|
|
|
USBD_PIPE_TYPE PipeType; // PipeType identifies type of transfer valid for this pipe
|
|
ULONG MaximumTransferSize; // Maximum size for a single request
|
|
// in bytes.
|
|
ULONG PipeFlags;
|
|
GENUSB_PIPE_HANDLE PipeHandle;
|
|
ULONG Reserved [8];
|
|
|
|
} GENUSB_PIPE_INFORMATION, *PGENUSB_PIPE_INFORMATION;
|
|
|
|
typedef struct _GENUSB_SET_READ_WRITE_PIPES {
|
|
ULONG ReadPipe;
|
|
ULONG WritePipe;
|
|
|
|
} GENUSB_SET_READ_WRITE_PIPES, *PGENUSB_SET_READ_WRITE_PIPES;
|
|
|
|
typedef struct _GENUSB_READ_WRITE_PIPE {
|
|
GENUSB_PIPE_HANDLE Pipe;
|
|
ULONG UsbdTransferFlags;
|
|
USBD_STATUS UrbStatus;
|
|
ULONG BufferLength;
|
|
|
|
// Since this IOCTL goes between kernel and user modes, it could be traveling
|
|
// between a 64 bit system and a 32 bit subsystem. Therefore this embedded
|
|
// pointer causes a problem.
|
|
// To take care of that, one must first initialize junk to zero, and then
|
|
// fill in UserBuffer. If the code is 64 bit code then all that happened
|
|
// was an unneeded step was taken, if the code is 32 bit, then what happens
|
|
// is that the more significant bits are now all zero, so that the other
|
|
// side can still use UserBuffer as a pointer.
|
|
union {
|
|
PVOID UserBuffer;
|
|
LONGLONG Junk;
|
|
};
|
|
|
|
} GENUSB_READ_WRITE_PIPE, *PGENUSB_READ_WRITE_PIPE;
|
|
|
|
typedef struct _GENUSB_RESET_PIPE {
|
|
GENUSB_PIPE_HANDLE Pipe;
|
|
|
|
// Reset the usbd pipe, nothing goes out to the device
|
|
BOOLEAN ResetPipe;
|
|
|
|
// Send a clear stall to the device.
|
|
BOOLEAN ClearStall;
|
|
|
|
// If using buffered Reads use this to flush out the buffer
|
|
BOOLEAN FlushData;
|
|
|
|
UCHAR Reserved;
|
|
|
|
} GENUSB_RESET_PIPE, *PGENUSB_RESET_PIPE;
|
|
|
|
/////////////////////////////////////////////
|
|
// Description IOCTLs
|
|
/////////////////////////////////////////////
|
|
//
|
|
// macro for defining HID ioctls
|
|
//
|
|
#define FILE_DEVICE_GENUSB 0x00000040
|
|
|
|
#define GENUSB_CTL_CODE(id) \
|
|
CTL_CODE(FILE_DEVICE_GENUSB, (id), METHOD_NEITHER, FILE_ANY_ACCESS)
|
|
#define GENUSB_BUFFER_CTL_CODE(id) \
|
|
CTL_CODE(FILE_DEVICE_GENUSB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)
|
|
#define GENUSB_IN_CTL_CODE(id) \
|
|
CTL_CODE(FILE_DEVICE_GENUSB, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS)
|
|
#define GENUSB_OUT_CTL_CODE(id) \
|
|
CTL_CODE(FILE_DEVICE_GENUSB, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
|
|
|
|
//
|
|
// Capabilities
|
|
//
|
|
#define IOCTL_GENUSB_GET_CAPS GENUSB_BUFFER_CTL_CODE(0x100)
|
|
|
|
//
|
|
// Preformated descriptors
|
|
//
|
|
#define IOCTL_GENUSB_GET_DEVICE_DESCRIPTOR GENUSB_BUFFER_CTL_CODE(0x110)
|
|
#define IOCTL_GENUSB_GET_CONFIGURATION_DESCRIPTOR GENUSB_BUFFER_CTL_CODE(0x111)
|
|
#define IOCTL_GENUSB_GET_STRING_DESCRIPTOR GENUSB_BUFFER_CTL_CODE(0x112)
|
|
|
|
// Commands
|
|
#define IOCTL_GENUSB_GET_REQUEST GENUSB_BUFFER_CTL_CODE(0x113)
|
|
|
|
//
|
|
// Configure
|
|
//
|
|
|
|
#define IOCTL_GENUSB_SELECT_CONFIGURATION GENUSB_BUFFER_CTL_CODE(0x120)
|
|
#define IOCTL_GENUSB_DESELECT_CONFIGURATION GENUSB_BUFFER_CTL_CODE(0x121)
|
|
|
|
//
|
|
// IO
|
|
//
|
|
#define IOCTL_GENUSB_GET_PIPE_INFO GENUSB_BUFFER_CTL_CODE(0x130)
|
|
#define IOCTL_GENUSB_SET_READ_WRITE_PIPES GENUSB_BUFFER_CTL_CODE(0x131)
|
|
#define IOCTL_GENUSB_SET_PIPE_TIMEOUT GENUSB_BUFFER_CTL_CODE(0x132)
|
|
#define IOCTL_GENUSB_GET_PIPE_PROPERTIES GENUSB_BUFFER_CTL_CODE(0x133)
|
|
#define IOCTL_GENUSB_SET_PIPE_PROPERTIES GENUSB_BUFFER_CTL_CODE(0x134)
|
|
#define IOCTL_GENUSB_RESET_PIPE GENUSB_BUFFER_CTL_CODE(0x135)
|
|
|
|
#define IOCTL_GENUSB_READ_WRITE_PIPE GENUSB_CTL_CODE(0X140)
|
|
|
|
/////////////////////////////////////////////
|
|
// Configuration IOCTLs
|
|
/////////////////////////////////////////////
|
|
|
|
|
|
#endif // __GENUSBIO_H__
|
|
|
|
|