Leaked source code of windows server 2003
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.
 
 
 
 
 
 

425 lines
9.4 KiB

/*++
Copyright (c) 1996-1998 Microsoft Corporation
Module Name:
I82930.H
Abstract:
Header file for I82930 driver
Environment:
kernel mode
Revision History:
06-01-98 : started rewrite
--*/
//*****************************************************************************
// I N C L U D E S
//*****************************************************************************
#include "dbg.h"
//*****************************************************************************
// D E F I N E S
//*****************************************************************************
#define USB_RECIPIENT_DEVICE 0
#define USB_RECIPIENT_INTERFACE 1
#define USB_RECIPIENT_ENDPOINT 2
#define USB_RECIPIENT_OTHER 3
// Endpoint numbers are 0-15. Endpoint number 0 is the standard control
// endpoint which is not explicitly listed in the Configuration Descriptor.
// There can be an IN endpoint and an OUT endpoint at endpoint numbers
// 1-15 so there can be a maximum of 30 endpoints per device configuration.
//
#define I82930_MAX_PIPES 30
#define POOL_TAG '039I'
#define INCREMENT_OPEN_COUNT(deviceExtension) \
InterlockedIncrement(&(((PDEVICE_EXTENSION)(deviceExtension))->OpenCount))
#define DECREMENT_OPEN_COUNT(deviceExtension) do { \
if (InterlockedDecrement(&(((PDEVICE_EXTENSION)(deviceExtension))->OpenCount)) == 0) { \
KeSetEvent(&((deviceExtension)->RemoveEvent), \
IO_NO_INCREMENT, \
0); \
} \
} while (0)
//*****************************************************************************
// T Y P E D E F S
//*****************************************************************************
typedef struct _I82930_PIPE {
// Pointer into PDEVICE_EXTENSION->InterfaceInfo.Pipes[]
//
PUSBD_PIPE_INFORMATION PipeInfo;
// Index into PDEVICE_EXTENSION->PipeList[]
//
UCHAR PipeIndex;
// TRUE if pipe is currently open
//
BOOLEAN Opened;
UCHAR Pad[2];
} I82930_PIPE, *PI82930_PIPE;
typedef struct _DEVICE_EXTENSION
{
// PDO passed to I82930_AddDevice
//
PDEVICE_OBJECT PhysicalDeviceObject;
// Our FDO is attached to this device object
//
PDEVICE_OBJECT StackDeviceObject;
// Device Descriptor retrieved from the device
//
PUSB_DEVICE_DESCRIPTOR DeviceDescriptor;
// Configuration Descriptor retrieved from the device
//
PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
// ConfigurationHandle returned from URB_FUNCTION_SELECT_CONFIGURATION
//
USBD_CONFIGURATION_HANDLE ConfigurationHandle;
// Interface info returned from URB_FUNCTION_SELECT_CONFIGURATION
//
PUSBD_INTERFACE_INFORMATION InterfaceInfo;
// Name of our symbolic link
//
UNICODE_STRING SymbolicLinkName;
// Initialized to one in AddDevice.
// Incremented by one for every open.
// Decremented by one for every close.
// Decremented by one in REMOVE_DEVICE.
//
ULONG OpenCount;
// Set when OpenCount is decremented to zero
//
KEVENT RemoveEvent;
// Current system power state
//
SYSTEM_POWER_STATE SystemPowerState;
// Current device power state
//
DEVICE_POWER_STATE DevicePowerState;
// Current power Irp, set by I82930_FdoSetPower(), used by
// I82930_FdoSetPowerCompletion().
//
PIRP CurrentPowerIrp;
// Inialized to FALSE in AddDevice.
// Set to TRUE in START_DEVICE.
// Set to FALSE in STOP_DEVICE and REMOVE_DEVICE.
//
BOOLEAN AcceptingRequests;
UCHAR Pad[3];
// Array of info about each pipe in the current device configuration
//
I82930_PIPE PipeList[I82930_MAX_PIPES];
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//*****************************************************************************
//
// F U N C T I O N P R O T O T Y P E S
//
//*****************************************************************************
//
// I82930.C
//
NTSTATUS
DriverEntry (
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
VOID
I82930_Unload (
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
I82930_AddDevice (
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS
I82930_Power (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_FdoSetPower (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
I82930_FdoSetPowerCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
I82930_SystemControl (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_Pnp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_StartDevice (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_StopDevice (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_RemoveDevice (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_QueryStopRemoveDevice (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_CancelStopRemoveDevice (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_QueryCapabilities (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_SyncPassDownIrp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN BOOLEAN CopyToNext
);
NTSTATUS
I82930_SyncCompletionRoutine (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
I82930_SyncSendUsbRequest (
IN PDEVICE_OBJECT DeviceObject,
IN PURB Urb
);
NTSTATUS
I82930_GetDescriptor (
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR Recipient,
IN UCHAR DescriptorType,
IN UCHAR Index,
IN USHORT LanguageId,
IN ULONG RetryCount,
IN ULONG DescriptorLength,
OUT PUCHAR *Descriptor
);
NTSTATUS
I82930_SelectConfiguration (
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
I82930_UnConfigure (
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
I82930_SelectAlternateInterface (
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR AlternateSetting
);
//
// OCRW.C
//
NTSTATUS
I82930_Create (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_Close (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_ReadWrite (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_ReadWrite_Complete (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
PURB
I82930_BuildAsyncUrb (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PI82930_PIPE Pipe
);
PURB
I82930_BuildIsoUrb (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PI82930_PIPE Pipe
);
ULONG
I82930_GetCurrentFrame (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_ResetPipe (
IN PDEVICE_OBJECT DeviceObject,
IN PI82930_PIPE Pipe,
IN BOOLEAN IsoClearStall
);
NTSTATUS
I82930_AbortPipe (
IN PDEVICE_OBJECT DeviceObject,
IN PI82930_PIPE Pipe
);
//
// IOCTL.C
//
NTSTATUS
I82930_DeviceControl (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlGetDeviceDescriptor (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlGetConfigDescriptor (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlSetConfigDescriptor (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
BOOLEAN
I82930_ValidateConfigurationDescriptor (
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
IN ULONG Length
);
NTSTATUS
I82930_IoctlGetPipeInformation (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlResetPipe (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlStallPipe (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlAbortPipe (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlResetDevice (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
I82930_IoctlSelectAlternateInterface (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);