windows-nt/Source/XPSP1/NT/public/ddk/inc/wdm/usbioctl.h
2020-09-26 16:20:57 +08:00

758 lines
23 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
USBIOCTL.H
Abstract:
This file defines both kernel and user mode IOCTL
codes supported by the USB core stack.
Environment:
Kernel & user mode
Revision History:
09-29-95 : created
01-06-97 : added user mode hub ioctls
10-31-99 : cleanup and document, jdunn
--*/
#ifndef __USBIOCTL_H__
#define __USBIOCTL_H__
#include "usb100.h"
#ifndef FAR
#define FAR
#endif
#include "usbiodef.h"
#pragma message ("warning: using obsolete header file usbioctl.h")
/*
IOCTLS definitions
*/
/*
USB kernel Mode IOCTLS
*/
/* IOCTL_INTERNAL_USB_SUBMIT_URB
This IOCTL is used by client drivers to submit URB (USB Request Blocks)
Parameters.Others.Argument1 = pointer to URB
*/
#define IOCTL_INTERNAL_USB_SUBMIT_URB CTL_CODE(FILE_DEVICE_USB, \
USB_SUBMIT_URB, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_RESET_PORT
This IOCTL is used by kernel mode drivers to reset their
upstream port.
After a successful reset the device is re-configured to the
same configuration it was in before the reset. All pipe
handles, configuration handles and interface handles remain
valid.
*/
#define IOCTL_INTERNAL_USB_RESET_PORT CTL_CODE(FILE_DEVICE_USB, \
USB_RESET_PORT, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
This IOCTL is used internally by the hub driver this API will
return the PhysicalDeviceObject of the root hub enumerated by the
controller.
Parameters.Others.Argument1 =
pointer to be filled in with PDO for the root hub;
Parameters.Others.Argument2 =
pointer to be filled in with FDO of the USB Host Controller;
*/
#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO CTL_CODE(FILE_DEVICE_USB, \
USB_GET_ROOTHUB_PDO, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_PORT_STATUS
This IOCTL returns the current status of the devices upstream
port.
Parameters.Others.Argument1 =
pointer to port status register (ULONG)
status bits are:
USBD_PORT_ENABLED
USBD_PORT_CONNECTED
*/
#define USBD_PORT_ENABLED 0x00000001
#define USBD_PORT_CONNECTED 0x00000002
#define IOCTL_INTERNAL_USB_GET_PORT_STATUS CTL_CODE(FILE_DEVICE_USB, \
USB_GET_PORT_STATUS, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_ENABLE_PORT
This IOCTL is obsolete, drivers should use
IOCTL_INTERNAL_USB_RESET_PORT
*/
#define IOCTL_INTERNAL_USB_ENABLE_PORT CTL_CODE(FILE_DEVICE_USB, \
USB_ENABLE_PORT, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION
This ioctl registers a device to receive notification when a specific
timeout has expired and it should now be suspended in order to conserve
power. If all devices on a hub are suspended, then the actual hub
can be suspended.
*/
#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION CTL_CODE(FILE_DEVICE_USB, \
USB_IDLE_NOTIFICATION, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_HUB_COUNT
This IOCTL is used internally by the hub driver, it returns the
number of hubs between the device and the root hub.
Parameters.Others.Argument1 =
pointer to be count of hubs in chain;
*/
#define IOCTL_INTERNAL_USB_GET_HUB_COUNT CTL_CODE(FILE_DEVICE_USB, \
USB_GET_HUB_COUNT, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_CYCLE_PORT
This IOCTL will simulate a plug/unplug on the port.
The device will be removed and re-added by PnP.
*/
#define IOCTL_INTERNAL_USB_CYCLE_PORT CTL_CODE(FILE_DEVICE_USB, \
USB_CYCLE_PORT, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_HUB_NAME
*/
#define IOCTL_INTERNAL_USB_GET_HUB_NAME CTL_CODE(FILE_DEVICE_USB, \
USB_GET_HUB_NAME, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_BUS_INFO
This IOCTL is obsolete -- it has been replaced by the
USB_BUSIFFN_QUERY_BUS_INFORMATION service available thru
the usb stack bus interface.
*/
#define IOCTL_INTERNAL_USB_GET_BUS_INFO CTL_CODE(FILE_DEVICE_USB, \
USB_GET_BUS_INFO, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME
*/
#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME CTL_CODE(FILE_DEVICE_USB, \
USB_GET_CONTROLLER_NAME, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_BUSGUID_INFO
*/
#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO CTL_CODE(FILE_DEVICE_USB, \
USB_GET_BUSGUID_INFO, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/* IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO
*/
#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO CTL_CODE(FILE_DEVICE_USB, \
USB_GET_PARENT_HUB_INFO, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE CTL_CODE(FILE_DEVICE_USB, \
USB_GET_DEVICE_HANDLE, \
METHOD_NEITHER, \
FILE_ANY_ACCESS)
/*
USB user mode IOCTLS
*/
/************************************************************
The following IOCTLS are always sent to the HCD symbolic
name
*************************************************************/
/* IOCTL_USB_HCD_GET_STATS_1 (OPTIONAL)
The following IOCTL is used to return internal statictics
for HCDs
*/
#define IOCTL_USB_HCD_GET_STATS_1 CTL_CODE(FILE_DEVICE_USB, \
HCD_GET_STATS_1, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/* IOCTL_USB_HCD_GET_STATS_2 (OPTIONAL)
The following IOCTL is used to return internal statictics
for HCDs
*/
#define IOCTL_USB_HCD_GET_STATS_2 CTL_CODE(FILE_DEVICE_USB, \
HCD_GET_STATS_2, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_HCD_DISABLE_PORT CTL_CODE(FILE_DEVICE_USB, \
HCD_DISABLE_PORT, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_HCD_ENABLE_PORT CTL_CODE(FILE_DEVICE_USB, \
HCD_ENABLE_PORT, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/*
These ioctls are used for USB diagnostic and test applications
*/
#define IOCTL_USB_DIAGNOSTIC_MODE_ON CTL_CODE(FILE_DEVICE_USB, \
HCD_DIAGNOSTIC_MODE_ON, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_DIAGNOSTIC_MODE_OFF CTL_CODE(FILE_DEVICE_USB, \
HCD_DIAGNOSTIC_MODE_OFF, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_ROOT_HUB_NAME CTL_CODE(FILE_DEVICE_USB, \
HCD_GET_ROOT_HUB_NAME, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_GET_HCD_DRIVERKEY_NAME CTL_CODE(FILE_DEVICE_USB, \
HCD_GET_DRIVERKEY_NAME, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/*********************************************************
The following IOCTLS are always sent to symbolic names
created by usbhub
**********************************************************/
/*
Utility IOCTLS supported by the hub device
*/
/*
These ioctls are supported by the hub driver for
use by user mode USB utilities.
*/
#define IOCTL_USB_GET_NODE_INFORMATION CTL_CODE(FILE_DEVICE_USB, \
USB_GET_NODE_INFORMATION, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION CTL_CODE(FILE_DEVICE_USB, \
USB_GET_NODE_CONNECTION_INFORMATION, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES CTL_CODE(FILE_DEVICE_USB, \
USB_GET_NODE_CONNECTION_ATTRIBUTES,\
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION CTL_CODE(FILE_DEVICE_USB, \
USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_NODE_CONNECTION_NAME CTL_CODE(FILE_DEVICE_USB, \
USB_GET_NODE_CONNECTION_NAME, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_DIAG_IGNORE_HUBS_ON CTL_CODE(FILE_DEVICE_USB, \
USB_DIAG_IGNORE_HUBS_ON, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF CTL_CODE(FILE_DEVICE_USB, \
USB_DIAG_IGNORE_HUBS_OFF, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME CTL_CODE(FILE_DEVICE_USB, \
USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_HUB_CAPABILITIES CTL_CODE(FILE_DEVICE_USB, \
USB_GET_HUB_CAPABILITIES, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_HUB_CYCLE_PORT CTL_CODE(FILE_DEVICE_USB, \
USB_HUB_CYCLE_PORT, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX CTL_CODE(FILE_DEVICE_USB, \
USB_GET_NODE_CONNECTION_INFORMATION_EX, \
METHOD_BUFFERED, \
FILE_ANY_ACCESS)
/*
structures for user mode ioctls
*/
#include <pshpack1.h>
typedef enum _USB_HUB_NODE {
UsbHub,
UsbMIParent
} USB_HUB_NODE;
typedef struct _USB_HUB_INFORMATION {
/*
copy of data from hub descriptor
*/
USB_HUB_DESCRIPTOR HubDescriptor;
BOOLEAN HubIsBusPowered;
} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;
typedef struct _USB_MI_PARENT_INFORMATION {
ULONG NumberOfInterfaces;
} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;
typedef struct _USB_NODE_INFORMATION {
USB_HUB_NODE NodeType; /* hub, mi parent */
union {
USB_HUB_INFORMATION HubInformation;
USB_MI_PARENT_INFORMATION MiParentInformation;
} u;
} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;
typedef struct _USB_PIPE_INFO {
USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
ULONG ScheduleOffset;
} USB_PIPE_INFO, *PUSB_PIPE_INFO;
typedef struct _USB_HUB_CAPABILITIES {
/*
Unlike the USB_HUB_INFORMATION structure used by
IOCTL_USB_GET_NODE_INFORMATION, this structure can be extended in the
future to accomodate more data. The IOCTL will return only as much
data as indicated by the size of the request buffer, to maintain
backward compatibility with older callers that don't know about the
new data.
*/
ULONG HubIs2xCapable:1;
} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;
typedef enum _USB_CONNECTION_STATUS {
NoDeviceConnected,
DeviceConnected,
/* failure codes, these map to fail reasons */
DeviceFailedEnumeration,
DeviceGeneralFailure,
DeviceCausedOvercurrent,
DeviceNotEnoughPower,
DeviceNotEnoughBandwidth,
DeviceHubNestedTooDeeply,
DeviceInLegacyHub
} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;
typedef struct _USB_NODE_CONNECTION_INFORMATION {
ULONG ConnectionIndex;
/* usb device descriptor returned by this device
during enumeration */
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
UCHAR CurrentConfigurationValue;
BOOLEAN LowSpeed;
BOOLEAN DeviceIsHub;
USHORT DeviceAddress;
ULONG NumberOfOpenPipes;
USB_CONNECTION_STATUS ConnectionStatus;
USB_PIPE_INFO PipeList[0];
} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;
/*
values for the speed field are defined in USB200.h
*/
typedef struct _USB_NODE_CONNECTION_INFORMATION_EX {
ULONG ConnectionIndex;
/* usb device descriptor returned by this device
during enumeration */
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
UCHAR CurrentConfigurationValue;
UCHAR Speed;
BOOLEAN DeviceIsHub;
USHORT DeviceAddress;
ULONG NumberOfOpenPipes;
USB_CONNECTION_STATUS ConnectionStatus;
USB_PIPE_INFO PipeList[0];
} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;
typedef struct _USB_NODE_CONNECTION_ATTRIBUTES {
ULONG ConnectionIndex;
/* usb device descriptor returned by this device
during enumeration */
USB_CONNECTION_STATUS ConnectionStatus;
/* extended port attributes defined in usb.h*/
ULONG PortAttributes;
} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES;
typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME {
ULONG ConnectionIndex; /* INPUT */
ULONG ActualLength; /* OUTPUT */
/* unicode name for the devnode. */
WCHAR DriverKeyName[1]; /* OUTPUT */
} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME;
typedef struct _USB_NODE_CONNECTION_NAME {
ULONG ConnectionIndex; /* INPUT */
ULONG ActualLength; /* OUTPUT */
/* unicode symbolic name for this node if it is a hub or parent driver
null if this node is a device. */
WCHAR NodeName[1]; /* OUTPUT */
} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;
typedef struct _USB_HUB_NAME {
ULONG ActualLength; /* OUTPUT */
/* NULL terminated unicode symbolic name for the root hub */
WCHAR HubName[1]; /* OUTPUT */
} USB_HUB_NAME, *PUSB_HUB_NAME;
typedef struct _USB_ROOT_HUB_NAME {
ULONG ActualLength; /* OUTPUT */
/* NULL terminated unicode symbolic name for the root hub */
WCHAR RootHubName[1]; /* OUTPUT */
} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;
typedef struct _USB_HCD_DRIVERKEY_NAME {
ULONG ActualLength; /* OUTPUT */
/* NULL terminated unicode driverkeyname for hcd */
WCHAR DriverKeyName[1]; /* OUTPUT */
} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;
typedef struct _USB_DESCRIPTOR_REQUEST {
ULONG ConnectionIndex;
struct {
UCHAR bmRequest;
UCHAR bRequest;
USHORT wValue;
USHORT wIndex;
USHORT wLength;
} SetupPacket;
UCHAR Data[0];
} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;
/*
Structure for returning HCD debug and statistic information to
a user mode application.
*/
typedef struct _HCD_STAT_COUNTERS {
ULONG BytesTransferred;
USHORT IsoMissedCount;
USHORT DataOverrunErrorCount;
USHORT CrcErrorCount;
USHORT ScheduleOverrunCount;
USHORT TimeoutErrorCount;
USHORT InternalHcErrorCount;
USHORT BufferOverrunErrorCount;
USHORT SWErrorCount;
USHORT StallPidCount;
USHORT PortDisableCount;
} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS;
typedef struct _HCD_ISO_STAT_COUNTERS {
USHORT LateUrbs;
USHORT DoubleBufferedPackets;
USHORT TransfersCF_5ms;
USHORT TransfersCF_2ms;
USHORT TransfersCF_1ms;
USHORT MaxInterruptLatency;
USHORT BadStartFrame;
USHORT StaleUrbs;
/* total count of packets programmed but not accessed by
the controller either due to software scheduling
problems or HW problems */
USHORT IsoPacketNotAccesed;
USHORT IsoPacketHWError;
USHORT SmallestUrbPacketCount;
USHORT LargestUrbPacketCount;
USHORT IsoCRC_Error;
USHORT IsoOVERRUN_Error;
USHORT IsoINTERNAL_Error;
USHORT IsoUNKNOWN_Error;
ULONG IsoBytesTransferred;
/* count of packets missed due to software scheduling
problems */
USHORT LateMissedCount;
/* incremented when a packet is scheduled but not
accessed by the controller */
USHORT HWIsoMissedCount;
ULONG Reserved7[8];
} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS;
typedef struct _HCD_STAT_INFORMATION_1 {
ULONG Reserved1;
ULONG Reserved2;
ULONG ResetCounters;
LARGE_INTEGER TimeRead;
/*
stat registers
*/
HCD_STAT_COUNTERS Counters;
} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1;
typedef struct _HCD_STAT_INFORMATION_2 {
ULONG Reserved1;
ULONG Reserved2;
ULONG ResetCounters;
LARGE_INTEGER TimeRead;
LONG LockedMemoryUsed;
/*
stat registers
*/
HCD_STAT_COUNTERS Counters;
HCD_ISO_STAT_COUNTERS IsoCounters;
} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2;
/*
WMI related structures
*/
/* these index in to our array of guids */
#define WMI_USB_DRIVER_INFORMATION 0
#define WMI_USB_DRIVER_NOTIFICATION 1
#define WMI_USB_POWER_DEVICE_ENABLE 2
typedef enum _USB_NOTIFICATION_TYPE {
/* the following return a
USB_CONNECTION_NOTIFICATION structure: */
EnumerationFailure = 0,
InsufficentBandwidth,
InsufficentPower,
OverCurrent,
ResetOvercurrent,
/* the following return a
USB_BUS_NOTIFICATION structure:*/
AcquireBusInfo,
/* the following return a
USB_ACQUIRE_INFO structure: */
AcquireHubName,
AcquireControllerName,
/* the following return a
USB_HUB_NOTIFICATION structure: */
HubOvercurrent,
HubPowerChange,
HubNestedTooDeeply,
ModernDeviceInLegacyHub
} USB_NOTIFICATION_TYPE;
typedef struct _USB_NOTIFICATION {
/* indicates type of notification */
USB_NOTIFICATION_TYPE NotificationType;
} USB_NOTIFICATION, *PUSB_NOTIFICATION;
/* this structure is used for connection notification
codes */
typedef struct _USB_CONNECTION_NOTIFICATION {
/* indicates type of notification */
USB_NOTIFICATION_TYPE NotificationType;
/* valid for all connection notifictaion codes,
0 indicates global condition for hub or parent
this value will be a port number for devices
attached to a hub, otherwise a one based
index if the device is a child of a composite
parent */
ULONG ConnectionNumber;
/* valid for InsufficentBandwidth,
the amount of bandwidth the device
tried to allocate and was denied. */
ULONG RequestedBandwidth;
/* valid for EnumerationFailure,
gives some indication why the device failed
to enumerate */
ULONG EnumerationFailReason;
/* valid for InsufficentPower,
the amount of power requested to configure
this device. */
ULONG PowerRequested;
/* length of the UNICODE symbolic name (in bytes) for the HUB
that this device is attached to.
not including NULL */
ULONG HubNameLength;
} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION;
/*
This structure is used for the bus notification code 'AcquireBusInfo'
*/
typedef struct _USB_BUS_NOTIFICATION {
/* indicates type of notification */
USB_NOTIFICATION_TYPE NotificationType; /* indicates type of */
/* notification */
ULONG TotalBandwidth;
ULONG ConsumedBandwidth;
/* length of the UNICODE symbolic name (in bytes) for the controller
that this device is attached to.
not including NULL */
ULONG ControllerNameLength;
} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION;
/*
used to acquire user mode filenames to open respective objects
*/
typedef struct _USB_ACQUIRE_INFO {
/* indicates type of notification */
USB_NOTIFICATION_TYPE NotificationType;
/* TotalSize of this struct */
ULONG TotalSize;
WCHAR Buffer[1];
} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO;
typedef
VOID
(*USB_IDLE_CALLBACK)(
PVOID Context
);
typedef struct _USB_IDLE_CALLBACK_INFO {
USB_IDLE_CALLBACK IdleCallback;
PVOID IdleContext;
} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO;
#include <poppack.h>
#endif /* __USBIOCTL_H__ */