⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zjhmcfusb.h

📁 ddk编写的usb驱动源代码
💻 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 + -