📄 zjhmcfusb.h
字号:
#ifndef zjHMCFUsb_H
#define zjHMCFUsb_H
/****** 预处理宏说明 *********************************************
_PRINT_DBG_INFO : 输出调试信息
_PRINT_COMM_DATA : 输出通信数据
_BUFFERED_IO : 缓冲IO(如果没定义则为直接IO)
_DIRECT_IO : 直接IO
************************************************************************/
#include "wdm.h"
#include "stdio.h"
#include "usbdi.h"
#include "usbdlib.h"
// the size of the transfer buffer on your test board or device
#define zjHMCFUsb_MAX_TRANSFER_SIZE 4*1024
#define BOOL BOOLEAN
typedef struct _globals_var
{
UNICODE_STRING zjHMCFUSB_RegistryPath;
}t_Globals;
typedef struct _zjHMCFUsb_PIPESTATE
{
BOOLEAN fPipeOpened;
} zjHMCFUsb_PIPESTATE, *PzjHMCFUsb_PIPESTATE;
typedef struct _DEVICE_EXTENSION
{
// 我们的FDO的直接下属,当我们用IoCallDriver (dx->LowerDeviceObject, Irp)
// 提交IRP给下层驱动处理时要使用
PDEVICE_OBJECT LowerDeviceObject;
// 总线驱动对象,在zjHMCFUsb_PnPAddDevice()里由系统传入并保存于此
PDEVICE_OBJECT pdo;
// 功能设备对象
PDEVICE_OBJECT fdo;
DEVICE_POWER_STATE CurrentDevicePowerState;
// USB配置句柄和设备当前的配置描述符缓冲地址
USBD_CONFIGURATION_HANDLE UsbConfigurationHandle;
PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
// USB设备描述符地址
PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
// we support one interface
// this is a copy of the info structure
// returned from select_configuration or
// select_interface
PUSBD_INTERFACE_INFORMATION UsbInterface;
//Bus drivers set the appropriate values in this structure in response
//to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might
//alter the capabilities set by the bus driver.
DEVICE_CAPABILITIES DeviceCapabilities;
// used to save the currently-being-handled system-requested power irp request
PIRP PowerIrp;
// 传输数据的urb
PURB TransferDataUrb;
// count of self-staged bytes read or written so far
ULONG StagedBytesTransferred;
// set when PendingIoCount goes to 0; flags device can be removed
KEVENT RemoveEvent;
// set when PendingIoCount goes to 1 ( 1st increment was on add device )
// this indicates no IO requests outstanding, either user, system, or self-staged
KEVENT NoPendingIoEvent;
// set to signal driver-generated power request is finished
KEVENT SelfRequestedPowerIrpEvent;
// spinlock used to protect inc/dec iocount logic
KSPIN_LOCK IoCountSpinLock;
// incremented when device is added and any IO request is received;
// decremented when any io request is completed or passed on, and when device is removed
ULONG PendingIoCount;
// count of open pipes
ULONG OpenPipeCount;
// ptr to array of structs to track pipeinfo;
// in this basic sample it's only used to track if open/closed;
PzjHMCFUsb_PIPESTATE PipeState;
// Name buffer for our named Functional device object link
// The name is generated based on the driver's class GUID
WCHAR DeviceLinkNameBuffer[ MAXIMUM_FILENAME_LENGTH ]; // MAXIMUM_FILENAME_LENGTH defined in wdm.h
//flag set when processing IRP_MN_REMOVE_DEVICE
BOOLEAN DeviceRemoved;
// flag set when driver has answered success to IRP_MN_QUERY_REMOVE_DEVICE
BOOLEAN RemoveDeviceRequested;
// flag set when driver has answered success to IRP_MN_QUERY_STOP_DEVICE
BOOLEAN StopDeviceRequested;
// flag set when device has been successfully started
BOOLEAN DeviceStarted;
// flag set when IRP_MN_WAIT_WAKE is received and we're in a power state
// where we can signal a wait
BOOLEAN EnabledForWakeup;
// 用来标志我们当前正在处理自己产生的电源请求
BOOLEAN SelfPowerIrp;
// default power state to power down to on self-suspend
ULONG PowerDownLevel;
// default maximum transfer per staged irp size
ULONG MaximumTransferSize;
// spinlock used to protect test of dx->BaseIrp in
// zjHMCFUsb_StagedReadWrite()
KSPIN_LOCK FastCompleteSpinlock;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
#define FreeIfAllocated(x) if( (x)!=NULL) { ExFreePool(x); (x) = NULL; }
#if DBG
static const PCHAR szDevicePowerState[] =
{
"PowerDeviceUnspecified",
"PowerDeviceD0",
"PowerDeviceD1",
"PowerDeviceD2",
"PowerDeviceD3",
"PowerDeviceMaximum"
};
#ifdef _PRINT_DBG_INFO
#define hwDbgPrint DbgPrint
#else
#define hwDbgPrint
#endif
#ifdef _PRINT_COMM_DATA
#define hwPrintCommData PrintCommData
#else
#define hwPrintCommData
#endif
#define TRAP() DbgBreakPoint();
#if defined(_X86_)
#undef ASSERT
#define ASSERT(e) if(!(e)){DbgPrint("XXX Assertion failure in file %s line %d \""#e "\"", __FILE__ , __LINE__);}
#endif
#define hwASSERT(cond) ASSERT(cond)
#define zjHMCFUsb_TrapCond( ilev, cond ) if ( gDebugLevel && ( ilev <= gDebugLevel ) && (cond) ) TRAP()
#define hwStringForDevState( devState ) szDevicePowerState[ devState ]
VOID PrintCurIrql();
#else
#define hwDbgPrint
#define hwASSERT( cond )
#define zjHMCFUsb_TrapCond( ilev, cond )
#define hwStringForDevState( devState ) "Free"
#define PrintCurIrql()
#endif
LONG hwDecrementIoCount(IN PDEVICE_OBJECT fdo);
VOID hwIncrementIoCount(IN PDEVICE_OBJECT fdo);
NTSTATUS hwSelfSuspendOrActivate(IN PDEVICE_OBJECT fdo,IN BOOLEAN fSuspend);
NTSTATUS zjHMCFUsb_Write(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
NTSTATUS zjHMCFUsb_Read(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
NTSTATUS zjHMCFUsb_Create(IN PDEVICE_OBJECT fdo, IN PIRP Irp );
NTSTATUS zjHMCFUsb_AddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT pdo);
NTSTATUS zjHMCFUsb_PNP(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
NTSTATUS zjHMCFUsb_IOCTL(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
NTSTATUS zjHMCFUsb_SysControl(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
NTSTATUS zjHMCFUsb_PowerIrp(IN PDEVICE_OBJECT fdo, IN PIRP Irp );
NTSTATUS zjHMCFUsb_Close(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
VOID zjHMCFUsb_Unload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS hwCallUSBD(IN PDEVICE_OBJECT fdo, IN PURB Urb );
BOOLEAN hwCanAcceptIoRequests(IN PDEVICE_OBJECT fdo );
NTSTATUS hwIRPCompletionRoutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp,IN PVOID Context);
NTSTATUS CompleteIrp( IN PIRP Irp, IN NTSTATUS status, IN ULONG info, IN CCHAR PriorityBoost);
NTSTATUS zjHMCFUsb_Cleanup( IN PDEVICE_OBJECT fdo, IN PIRP Irp);
BOOLEAN InitDx(PDEVICE_EXTENSION dx);
void FreeDx(PDEVICE_EXTENSION dx);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -