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

📄 ch375wdm.c

📁 这是USB接口芯片CH372上位机和下位机的测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
// 这是CH372和CH375的Windows98/ME/2000/XP简化版驱动程序, 仅供学习USB驱动开发
// 稍加修改完全可以用于其它USB芯片, 不过作者希望你是用于CH372和CH375芯片
// 2003.09.08, 2003.12.28, 2004.10.15, 2004.12.05, 2004.12.10, 2005.01.20, 2005.02.23, 2005.07.15
//****************************************
//**  Copyright  (C)  W.ch  1999-2005   **
//**  Web:  http://www.winchiphead.com  **
//****************************************
//**  WDM for USB interface chip CH375  **
//**  C, VC5.0, Windows 98 DDK          **
//****************************************
//
// USB总线接口芯片CH375的WDM驱动程序   V0.1
// 南京沁恒电子有限公司  作者: W.ch 2005.07
// CH375-WDM  V0.1 , Support: Ctrl/Bulk/Int
// 运行环境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH372/CH375
//


#define		mTHIS_VERSION			0x01		// 当前版本
#define		mTHIS_VER_STR			"0.1"		// 当前版本字符串

#include	<wdm.h>
#include	<usbdi.h>
#include	<usbdlib.h>


#include	"CH375WDM.H"

typedef	struct	_DEVICE_EXTENSION {				// 定义设备扩展结构
	UNICODE_STRING		mExtDeviceName;			// 设备名称
	PDEVICE_OBJECT		mExtPhysicalTarget;		// 物理设备对象指针
	PDEVICE_OBJECT		mExtNextLowerDevice;	// 下级设备对象指针
	USBD_PIPE_HANDLE	mExtInterUpPipe;		// USB中断数据上传管道的句柄
	USBD_PIPE_HANDLE	mExtAuxDownPipe;		// USB辅助数据下传管道的句柄
	USBD_PIPE_HANDLE	mExtDataDownPipe;		// USB数据块下传管道的句柄
	USBD_PIPE_HANDLE	mExtDataUpPipe;			// USB数据块上传管道的句柄
	ULONG				mExtIoCount;			// 计数正在进行的操作,以阻止操作中途停止或者移除设备
	ULONG				mExtDeviceOpen;			// 指示设备被打开的次数
	BOOLEAN				mExtDeviceStart;		// 指示设备启动状态
	BOOLEAN				mExtDeviceRemove;		// 指示设备移除状态
} mDEVICE_EXTENSION, *mPDEVICE_EXTENSION;


// 驱动程序说明
UCHAR			mDescription[128] = " CH375 WDM V" mTHIS_VER_STR " "
									" Author : W.ch  "
									"HX.S065  2003.12\xd\xa"
									" www.wch99.com  \xd\xa"
									" Copyright (C) W.ch 1999-2005 \xd\xa\x0";

PDRIVER_OBJECT	mDriverObject = NULL;


// 子程序说明


NTSTATUS		DriverEntry( PDRIVER_OBJECT iDriverObject, PUNICODE_STRING iRegistryPath );
VOID			mDriverUnload( PDRIVER_OBJECT iDriverObject );
NTSTATUS		mAddDevice( PDRIVER_OBJECT iDriverObject, PDEVICE_OBJECT iPhysicalDeviceObject );
VOID			mRemoveDevice( PDEVICE_OBJECT iDeviceObject );
NTSTATUS		mDispatchCreate( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mDispatchClose( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mDispatchDeviceControl( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mRequestPipe( PDEVICE_OBJECT iDeviceObject, USHORT iFunction, ULONG iPipe );
NTSTATUS		mDispatchCleanup( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mDispatchPower( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mDispatchSystemControl( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mDispatchPnp( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mWaitCompletion( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mCompletionRoutine( PDEVICE_OBJECT iDeviceObject, PIRP iIrp, PVOID iContext );
NTSTATUS		mActiveConfig( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mDeactiveConfig( PDEVICE_OBJECT iDeviceObject, PIRP iIrp );
NTSTATUS		mUsbSubmitUrb( PDEVICE_OBJECT iDeviceObject, PURB iUrb );


#ifdef		ALLOC_PRAGMA
#pragma		alloc_text( INIT, DriverEntry )
#endif


NTSTATUS	DriverEntry(  // 驱动程序初始化入口
	PDRIVER_OBJECT	iDriverObject,  // 驱动程序对象
	PUNICODE_STRING	iRegistryPath )
{
	mDriverObject = iDriverObject;  // 保存驱动程序对象
//	while ( mDriverObject );  // 调试
	iDriverObject -> MajorFunction[ IRP_MJ_CREATE ] = mDispatchCreate;  // 创建或者打开设备
	iDriverObject -> MajorFunction[ IRP_MJ_CLOSE ] = mDispatchClose;  // 关闭设备
	iDriverObject -> MajorFunction[ IRP_MJ_DEVICE_CONTROL ] = mDispatchDeviceControl;  // 设备控制
	iDriverObject -> MajorFunction[ IRP_MJ_CLEANUP ] = mDispatchCleanup;  // 取消操作
	iDriverObject -> MajorFunction[ IRP_MJ_POWER ] = mDispatchPower;  // 电源管理
	iDriverObject -> MajorFunction[ IRP_MJ_SYSTEM_CONTROL ] = mDispatchSystemControl;  // 系统WMI接口
	iDriverObject -> MajorFunction[ IRP_MJ_PNP ] = mDispatchPnp;  // 设备PnP操作
	iDriverObject -> DriverUnload = mDriverUnload;  // 卸载驱动程序
	iDriverObject -> DriverExtension -> AddDevice = mAddDevice;  // 检测到新硬件设备
	return( STATUS_SUCCESS );
}

VOID		mDriverUnload(  // 卸载驱动程序
	PDRIVER_OBJECT	iDriverObject )
{
	mDriverObject = NULL;  // 清除驱动程序对象,指示系统线程终止
}

NTSTATUS	mAddDevice(  // 添加新设备的PnP例程
	PDRIVER_OBJECT	iDriverObject,  // 驱动程序对象
	PDEVICE_OBJECT	iPhysicalDeviceObject )
{
	PDEVICE_OBJECT		mDeviceObject = NULL;
	mPDEVICE_EXTENSION	mDeviceExtension;
	NTSTATUS			mStatus = STATUS_INSUFFICIENT_RESOURCES;
	__try {  // 确保退出前的处理
		mStatus = IoCreateDevice( iDriverObject, sizeof( mDEVICE_EXTENSION ), NULL,  // 创建设备对象
								  FILE_DEVICE_UNKNOWN, 0, FALSE, &mDeviceObject );  // 返回的设备对象
		if ( ! NT_SUCCESS( mStatus ) ) __leave;  // 创建设备失败
		mDeviceExtension = mDeviceObject -> DeviceExtension;  // 设备扩展指针
		RtlZeroMemory( mDeviceExtension, sizeof( mDEVICE_EXTENSION ) );  // 清除内存
		mDeviceExtension -> mExtPhysicalTarget = iPhysicalDeviceObject;  // 物理设备的功能设备对象
		mDeviceExtension -> mExtIoCount = 0;  // 清操作计数
		mDeviceExtension -> mExtDeviceOpen = 0;  // 清除设备打开标志
		mDeviceExtension -> mExtDeviceStart = FALSE;  // 清除设备启动标志
		mDeviceExtension -> mExtDeviceRemove = FALSE;  // 清除设备移除标志
		mDeviceExtension -> mExtNextLowerDevice = IoAttachDeviceToDeviceStack( mDeviceObject,  // 挂接设备栈,返回下级设备
																			   iPhysicalDeviceObject );  // 指向物理对象
		if ( mDeviceExtension -> mExtNextLowerDevice == NULL ) {  // 挂接设备栈失败
			mStatus = STATUS_UNSUCCESSFUL;  // 返回错误信息
			__leave;
		}
		mStatus = IoRegisterDeviceInterface( iPhysicalDeviceObject, &CH375Guid,  // 注册设备接口
											 NULL, & mDeviceExtension -> mExtDeviceName );  // 保存符号链接名称
		mDeviceObject -> Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;  // 缓冲IO,指示代码可能在分页内存中
		mDeviceObject -> Flags &= ~DO_DEVICE_INITIALIZING;  // 初始化完成
	}
	__finally {  // 退出前的处理
		if ( ! NT_SUCCESS( mStatus ) ) {  // 初始化失败
			mRemoveDevice( mDeviceObject );  // 移除设备
		}
	}
	return( STATUS_SUCCESS );
}

VOID		mRemoveDevice(  // 移除设备
	PDEVICE_OBJECT	iDeviceObject )
{
	ULONG				mDeviceInstance;
	mPDEVICE_EXTENSION	mDeviceExtension;
	if ( iDeviceObject == NULL ) return;  // 设备对象无效
	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	if ( mDeviceExtension -> mExtDeviceName.Buffer != NULL ) {  // 已经注册设备接口
		IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, FALSE );  // 禁用设备接口
		RtlFreeUnicodeString( & mDeviceExtension -> mExtDeviceName );  // 释放设备名称缓冲区
		mDeviceExtension -> mExtDeviceName.Buffer = NULL;
	}
	if ( mDeviceExtension -> mExtNextLowerDevice != NULL ) {  // 已经挂接到设备栈
		IoDetachDevice( mDeviceExtension -> mExtNextLowerDevice );  // 撤出设备栈
		mDeviceExtension -> mExtNextLowerDevice = NULL;
	}
	IoDeleteDevice( iDeviceObject );  // 删除设备对象
}

NTSTATUS	mDispatchCreate(  // 新建或者打开
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	iIrp -> IoStatus.Information = 0;
	InterlockedIncrement( & mDeviceExtension -> mExtDeviceOpen );  // 打开计数增量
	iIrp -> IoStatus.Status = STATUS_SUCCESS;  // 返回操作状态
	IoCompleteRequest( iIrp, IO_NO_INCREMENT );  // 完成请求
	return( STATUS_SUCCESS );  // 返回状态
}

NTSTATUS	mDispatchClose(  // 关闭
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	InterlockedDecrement( & mDeviceExtension -> mExtDeviceOpen );  // 关闭则打开计数减量
	iIrp -> IoStatus.Status = STATUS_SUCCESS;  // 返回操作状态
	iIrp -> IoStatus.Information = 0;
	IoCompleteRequest( iIrp, IO_NO_INCREMENT );  // 完成请求
	return( STATUS_SUCCESS );  // 返回状态
}

NTSTATUS	mDispatchDeviceControl(  // 设备控制
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	UCHAR				mRequestType, mRequestCode;
	USHORT				mRequestValue, mRequestIndex;
	ULONG				mControlCode;
	ULONG				mFunction, mLength, mReturn;
	ULONG				mTransferFlags, mParameter;
	PVOID				mBuffer;
	mPWIN32_COMMAND		mWin32Command;
	NTSTATUS			mStatus;
	PURB				mUrb;
	PIO_STACK_LOCATION	mCurrentIrpStack;
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	InterlockedIncrement( & mDeviceExtension -> mExtIoCount );  // 操作计数增量,阻止中途停止或者移除设备
	mCurrentIrpStack = IoGetCurrentIrpStackLocation( iIrp );  // 当前栈单元指针
	mControlCode = mCurrentIrpStack -> Parameters.DeviceIoControl.IoControlCode;  // 操作命令
	if ( mControlCode == IOCTL_CH375_COMMAND ) {  // 专用接口
		mStatus = STATUS_SUCCESS;  // 返回状态预置为成功
		mReturn = 0;  // 返回数据长度预置为0
		mUrb = ExAllocatePool( NonPagedPool, sizeof( URB ) );  // 分配内存作为URB请求块
		if (  mUrb != NULL && mCurrentIrpStack -> Parameters.DeviceIoControl.InputBufferLength >= mWIN32_COMMAND_HEAD ) {  // 输入缓冲区长度有效
			mWin32Command = iIrp -> AssociatedIrp.SystemBuffer;  // 命令缓冲区
			mFunction = mWin32Command -> mFunction;  // 功能代码

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -