📄 main.h
字号:
/*
**********************************************************************
* Micrium, Inc.
* 949 Crestview Circle
* Weston, FL 33327-1848
*
* uC/USB-Bulk
*
* (c) Copyright 2003 - 2004, Micrium, Inc.
* All rights reserved.
*
***********************************************************************
----------------------------------------------------------------------
File : Main.h
Purpose : Main include of the USB bulk driver
---------------------------END-OF-HEADER------------------------------
*/
#ifndef _MAIN_H
#define _MAIN_H
#include "Conf.h"
#include <initguid.h>
#include <wdm.h>
#include <wmilib.h>
#include <wmistr.h>
#include "usbdi.h"
#include "usbdlib.h"
#define USB_BULK_TAG (ULONG) 'kluB'
#define BULKUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE (64 *1024 )
#undef ExAllocatePool
#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, USB_BULK_TAG);
#if DBG
#define DPRINT(_s) DbgPrint _s
#else
#define DPRINT(_s)
#endif
#define IOCTL_USER 0x0111
#define IOCTL_USB_BULK_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USER+0, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_USB_BULK_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USER+1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_USB_BULK_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_USER+2, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _GLOBALS {
UNICODE_STRING RegPath;
} GLOBALS;
typedef enum _DEVSTATE {
NotStarted, // not started
Stopped, // device stopped
Working, // started and working
PendingStop, // stop pending
PendingRemove, // remove pending
SurpriseRemoved, // removed by surprise
Removed // removed
} DEVSTATE;
typedef enum _QUEUE_STATE {
HoldRequests, // device is not started yet
AllowRequests, // device is ready to process
FailRequests // fail both existing and queued up requests
} QUEUE_STATE;
typedef enum _WDM_VERSION {
WinXpOrBetter,
Win2kOrBetter,
WinMeOrBetter,
Win98OrBetter
} WDM_VERSION;
#define INITIALIZE_PNP_STATE(_Data_) \
(_Data_)->DeviceState = NotStarted;\
(_Data_)->PrevDevState = NotStarted;
#define SET_NEW_PNP_STATE(_Data_, _state_) \
(_Data_)->PrevDevState = (_Data_)->DeviceState;\
(_Data_)->DeviceState = (_state_);
#define RESTORE_PREVIOUS_PNP_STATE(_Data_) \
(_Data_)->DeviceState = (_Data_)->PrevDevState;
typedef struct _USB_PIPE_CONTEXT {
BOOLEAN PipeOpen;
} USB_PIPE_CONTEXT, *PUSB_PIPE_CONTEXT;
//
// A structure representing the instance information associated with
// this particular device.
//
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT FunctionalDeviceObject; // fdo
PDEVICE_OBJECT TopOfStackDeviceObject; // lower device
PDEVICE_OBJECT PhysicalDeviceObject; // pdo
UNICODE_STRING InterfaceName; // fdo name
DEVICE_CAPABILITIES DeviceCapabilities; // filled by pdo (IRP_MN_QUERY_CAPABILITIES)
PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor; // Configuration Descriptor
PUSBD_INTERFACE_INFORMATION UsbInterface; // interface info
PUSB_PIPE_CONTEXT PipeContext; // pipes info
DEVSTATE DeviceState; // current device state
DEVSTATE PrevDevState; // state prior to removal query
KSPIN_LOCK DevStateLock; // lock for changing device state
SYSTEM_POWER_STATE SysPower; // system power state
DEVICE_POWER_STATE DevPower; // device power state
QUEUE_STATE QueueState; // pending I/O queue state
LIST_ENTRY NewRequestsQueue; // pending I/O queue
KSPIN_LOCK QueueLock; // I/O queue lock
KEVENT RemoveEvent; // remote event
KEVENT StopEvent; // stop event
ULONG OutStandingIO; // I/O count bias to 1
KSPIN_LOCK IOCountLock; // lock for I/O count
LONG OpenHandleCount; // open handle count
// following are self-suspend & remote wake up var (TO REMOVE)
ULONG PowerDownLevel;
PIRP WaitWakeIrp;
LONG FlagWWCancel;
LONG FlagWWOutstanding;
LONG WaitWakeEnable;
//
// Read Buffer
//
KSPIN_LOCK BufferLock; // lock
char acBuffer[0x1000];
int NumBytesInBuffer;
} DEVICE_EXTENSION;
typedef struct _IRP_COMPLETION_CONTEXT {
DEVICE_EXTENSION * DeviceExtension;
PKEVENT Event;
} IRP_COMPLETION_CONTEXT;
extern GLOBALS Globals;
//
// PNP
//
#define REMOTE_WAKEUP_MASK 0x20
NTSTATUS BulkUsb_DispatchPnP( IN DEVICE_OBJECT * DeviceObject, IN PIRP Irp);
NTSTATUS ConfigureDevice ( IN DEVICE_OBJECT * DeviceObject);
NTSTATUS CallUSBD( IN PDEVICE_OBJECT DeviceObject, IN PURB Urb );
VOID ProcessQueuedRequests( IN OUT DEVICE_EXTENSION * DeviceExtension );
NTSTATUS BulkUsb_AbortPipes(IN PDEVICE_OBJECT DeviceObject );
LONG DevIoIncrement (IN OUT DEVICE_EXTENSION * DeviceExtension);
LONG DevIoDecrement (IN OUT DEVICE_EXTENSION * DeviceExtension);
NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS ntS, IN ULONG_PTR Info);
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) ;
NTSTATUS DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchClean(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS ResetPipe(IN PDEVICE_OBJECT DeviceObject,IN PUSBD_PIPE_INFORMATION PipeInfo);
NTSTATUS ResetDevice(IN PDEVICE_OBJECT DeviceObject);
//
// Power
//
NTSTATUS BulkUsb_DispatchPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
NTSTATUS IssueWaitWake( IN DEVICE_EXTENSION * DeviceExtension );
VOID CancelWaitWake( IN DEVICE_EXTENSION * DeviceExtension );
void WaitWakeCallback(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus);
//
// RWR
//
NTSTATUS DispatchRead (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DispatchWrite (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
void MISC_Unicode2ASCII(char * s, UNICODE_STRING * pUni, int MaxBytes);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -