|
|
/***************************************************************************
Copyright (c) 2001 Microsoft Corporation
Module Name:
INTREAD.H
Abstract:
Public interface for generic USB routines - must be called at PASSIVE_LEVEL
Environment:
Kernel Mode Only
Notes:
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
Copyright (c) 2001 Microsoft Corporation. All Rights Reserved.
Revision History:
06/13/2001 : created
Authors:
Tom Green
****************************************************************************/
#ifndef __INTREAD_H__
#define __INTREAD_H__
//#include "usbutil.h"
#define USBWRAP_BUFFER_GUARD 'draG'
#define USBWRAP_TAG 'prwU'
#define PINGPONG_START_READ 0x01
#define PINGPONG_END_READ 0x02
#define PINGPONG_IMMEDIATE_READ 0x03
#define USBWRAP_INCOMING_QUEUE 0x01
#define USBWRAP_SAVED_QUEUE 0x02
#define PUMP_STATE_RUNNING 0x00
#define PUMP_STATE_STOPPED 0x01
#define PUMP_STATE_ERROR 0x02
typedef NTSTATUS (*INTERRUPT_CALLBACK)(IN PVOID Context, IN PVOID Buffer, ULONG BufferLength, ULONG NotificationType, OUT PBOOLEAN QueueData);
typedef struct _USB_WRAPPER_EXTENSION *PUSB_WRAPPER_EXTENSION; typedef struct _USB_WRAPPER_PINGPONG {
#define PINGPONG_SIG (ULONG)'ppwU'
ULONG sig;
//
// Read interlock value to protect us from running out of stack space
//
ULONG ReadInterlock;
PIRP irp; PURB urb; PUCHAR reportBuffer; LONG weAreCancelling;
KEVENT sentEvent; // When a read has been sent.
KEVENT pumpDoneEvent; // When the read loop is finally exitting.
PUSB_WRAPPER_EXTENSION myWrapExt;
/*
* Timeout context for back-off algorithm applied to broken devices. */ KTIMER backoffTimer; KDPC backoffTimerDPC; LARGE_INTEGER backoffTimerPeriod; // in negative 100-nsec units
} USB_WRAPPER_PINGPONG, *PUSB_WRAPPER_PINGPONG; typedef struct _USB_WRAPPER_DATA_BLOCK { LIST_ENTRY ListEntry; ULONG DataLen; PVOID Buffer;
} USB_WRAPPER_DATA_BLOCK, *PUSB_WRAPPER_DATA_BLOCK;
typedef struct _INTERRUPT_READ_WRAPPER {
PUSBD_PIPE_INFORMATION InterruptPipe;
INTERRUPT_CALLBACK ClientCallback; PVOID ClientContext; ULONG MaxTransferSize; ULONG NotificationTypes;
PUSB_WRAPPER_PINGPONG PingPongs;
ULONG NumPingPongs;
ULONG MaxReportSize;
ULONG OutstandingRequests;
LIST_ENTRY SavedQueue;
LIST_ENTRY IncomingQueue;
KSPIN_LOCK QueueLock;
ULONG PumpState;
ULONG HandlingError;
ULONG WorkItemRunning;
ULONG ErrorCount;
ULONG TransferCount;
} INTERRUPT_READ_WRAPPER, *PINTERRUPT_READ_WRAPPER; NTSTATUS UsbWrapInitializeInterruptReadData( IN PUSB_WRAPPER_EXTENSION WrapExtension, IN PUSBD_PIPE_INFORMATION InterruptPipe, IN INTERRUPT_CALLBACK DriverCallback, IN PVOID DriverContext, IN ULONG MaxTransferSize, IN ULONG NotificationTypes, IN ULONG PingPongCount );
VOID UsbWrapEnqueueData( IN PUSB_WRAPPER_EXTENSION WrapExt, IN PVOID Data, IN ULONG DataLength, IN PLIST_ENTRY Queue );
VOID UsbWrapDequeueData( IN PUSB_WRAPPER_EXTENSION WrapExt, OUT PVOID *Data, OUT ULONG *DataLength, IN PLIST_ENTRY Queue );
PVOID UsbWrapGetTransferBuffer( IN PUSB_WRAPPER_EXTENSION WrapExt );
VOID UsbWrapFreeTransferBuffer( IN PUSB_WRAPPER_EXTENSION WrapExt, PVOID Buffer );
NTSTATUS UsbWrapInitializePingPongIrps( PUSB_WRAPPER_EXTENSION WrapExtension );
NTSTATUS UsbWrapSubmitInterruptRead( IN PUSB_WRAPPER_EXTENSION WrapExtension, PUSB_WRAPPER_PINGPONG PingPong, BOOLEAN *IrpSent );
USB_WRAPPER_PINGPONG *GetPingPongFromIrp( PUSB_WRAPPER_EXTENSION WrapExt, PIRP irp );
NTSTATUS UsbWrapInterruptReadComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context );
NTSTATUS UsbWrapStartAllPingPongs( PUSB_WRAPPER_EXTENSION WrapExt );
VOID UsbWrapCancelAllPingPongIrps( PUSB_WRAPPER_EXTENSION WrapExt );
VOID UsbWrapDestroyPingPongs( PUSB_WRAPPER_EXTENSION WrapExt );
VOID UsbWrapPingpongBackoffTimerDpc( IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2 );
NTSTATUS UsbWrapReadData( IN PUSB_WRAPPER_EXTENSION WrapExt, IN PVOID Buffer, IN ULONG *BufferLength );
VOID UsbWrapCancelPingPongIrp( USB_WRAPPER_PINGPONG *PingPong );
VOID UsbWrapEmptyQueue( PUSB_WRAPPER_EXTENSION WrapExt, PLIST_ENTRY Queue );
#endif // __INTREAD_H__
|