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

📄 ch375wdm.c

📁 南京沁恒电子有限公司USB通用设备接口芯片资料
💻 C
📖 第 1 页 / 共 3 页
字号:
			mLength = mWin32Command -> mLength;  // 存取长度
			mBuffer = & mWin32Command -> mBuffer[0];  // 数据缓冲区
			switch( mFunction ) {  // 分析功能代码
				case mFuncGetVersion:  // 获取版本号
					while ( mLength >= sizeof( ULONG ) && *(PULONG)mBuffer == 'hc.W' );  // 等待调试工具W.ch
					*(PUCHAR)mBuffer = mTHIS_VERSION;  // 驱动程序版本号
					mReturn = sizeof( UCHAR );  // 返回数据长度
					break;
				case mPipeDeviceCtrl:  // CH375的综合控制管道
					mRequestType = mWin32Command -> mSetupPkt.mUspReqType;  // 请求类型
					mRequestCode = mWin32Command -> mSetupPkt.mUspRequest;  // 请求码
					mRequestValue = mWin32Command -> mSetupPkt.mUspValue;  // 数值参数
					mRequestIndex = mWin32Command -> mSetupPkt.mUspIndex;  // 索引参数
					mLength = mWin32Command -> mSetupPkt.mLength;  // 后续操作的数据长度
					mTransferFlags = ( ( mRequestType & 0x80 ) != 0 ? USBD_TRANSFER_DIRECTION_IN : 0 ) | USBD_SHORT_TRANSFER_OK;  // 传输标志
					switch( mRequestType >> 5 & 0x03 ) {  // 分析请求类型
						case 0:  // 标准请求
							switch( mRequestCode ) {  // 分析请求码
								case USB_REQUEST_GET_DESCRIPTOR:  // 获取描述符
									mParameter = ( mRequestValue >> 8 ) == 1 ? USB_DEVICE_DESCRIPTOR_TYPE : USB_CONFIGURATION_DESCRIPTOR_TYPE;  // 描述符类型
									UsbBuildGetDescriptorRequest( mUrb, sizeof( struct _URB_CONTROL_DESCRIPTOR_REQUEST ),  // 构造获取描述符URB
																  (UCHAR)mParameter, 0, 0, mBuffer, NULL, mLength, NULL );
									mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
									mReturn = mUrb -> UrbControlDescriptorRequest.TransferBufferLength;  // 实际传输长度
									break;
								default:  // 不支持
									mStatus = STATUS_INVALID_PARAMETER;  // 返回错误
									break;
							}
							break;
						default:  // 不支持的请求
							mStatus = STATUS_INVALID_PARAMETER;  // 返回错误
							break;
					}
					break;
				case mPipeInterUp:  // CH375的中断数据上传管道
					if ( mDeviceExtension -> mExtInterUpPipe != NULL ) {  // 管道有效
						mTransferFlags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;  // 传输标志
						UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ),  // 构造USB请求
																mDeviceExtension -> mExtInterUpPipe,  // 管道的句柄
																mBuffer, NULL, mLength, mTransferFlags, NULL );  // 操作标志
						mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
						mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength;  // 实际传输长度
						if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeInterUp );  // 出错则复位管道
					}
					else mStatus = STATUS_NO_SUCH_DEVICE ;  // 管道无效,设备无效
					break;
				case mPipeAuxDown:  // CH375的辅助数据下传管道
					if ( mDeviceExtension -> mExtAuxDownPipe != NULL ) {  // 管道有效
						mTransferFlags = USBD_SHORT_TRANSFER_OK;  // 传输标志
						UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ),  // 构造USB请求
																mDeviceExtension -> mExtAuxDownPipe,  // 管道的句柄
																mBuffer, NULL, mLength, mTransferFlags, NULL );  // 操作标志
						mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
						mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength;  // 实际传输长度
						if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeAuxDown );  // 出错则复位管道
					}
					else mStatus = STATUS_NO_SUCH_DEVICE ;  // 管道无效,设备无效
					break;
				case mPipeDataUp:  // CH375的数据块上传管道
					if ( mDeviceExtension -> mExtDataUpPipe != NULL ) {  // 管道有效
						mTransferFlags = USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;  // 传输标志
						UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ),  // 构造USB请求
																mDeviceExtension -> mExtDataUpPipe,  // 管道的句柄
																mBuffer, NULL, mLength, mTransferFlags, NULL );  // 操作标志
						mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
						mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength;  // 实际传输长度
						if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeDataUp );  // 出错则复位管道
					}
					else mStatus = STATUS_NO_SUCH_DEVICE ;  // 管道无效,设备无效
					break;
				case mPipeDataDown:  // CH375的数据块下传管道
					if ( mDeviceExtension -> mExtDataDownPipe != NULL ) {  // 管道有效
						mTransferFlags = USBD_SHORT_TRANSFER_OK;  // 传输标志
						UsbBuildInterruptOrBulkTransferRequest( mUrb, sizeof( struct _URB_BULK_OR_INTERRUPT_TRANSFER ),  // 构造USB请求
																mDeviceExtension -> mExtDataDownPipe,  // 管道的句柄
																mBuffer, NULL, mLength, mTransferFlags, NULL );  // 操作标志
						mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
						mReturn = mUrb -> UrbBulkOrInterruptTransfer.TransferBufferLength;  // 实际传输长度
						if ( ! NT_SUCCESS( mStatus ) ) mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, mPipeDataDown );  // 出错则复位管道
					}
					else mStatus = STATUS_NO_SUCH_DEVICE ;  // 管道无效,设备无效
					break;
				case mFuncResetPipe:  // 复位USB管道
					mStatus = mRequestPipe( iDeviceObject, URB_FUNCTION_RESET_PIPE, *(PULONG)mBuffer );  // 在指定管道执行复位请求
					break;
				case mFuncAbortPipe:  // 取消USB管道的数据请求
					mStatus = mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, *(PULONG)mBuffer );  // 在指定管道执行取消请求
					break;
				default:  // 不支持的请求
					mStatus = STATUS_INVALID_PARAMETER;  // 返回错误
					break;
			}
			mWin32Command -> mStatus = mStatus;  // 返回操作状态
			mWin32Command -> mLength = mReturn;  // 实际传输长度
			mReturn += mWIN32_COMMAND_HEAD;  // 加上头部长度得返回数据的总长度
		}
		else {  // 失败
			if ( mUrb == NULL ) mStatus = STATUS_INSUFFICIENT_RESOURCES;  // 资源不够
			else mStatus = STATUS_BUFFER_TOO_SMALL;  // 缓冲区太小
		}
		if ( mUrb != NULL ) ExFreePool( mUrb );  // 释放内存
		if ( mStatus != STATUS_PENDING ) {  // 成功返回或者失败返回
			iIrp -> IoStatus.Status = mStatus;  // 返回状态
			iIrp -> IoStatus.Information = mReturn;  // 返回数据的长度
			IoCompleteRequest( iIrp, 4 );
		}
	}
	else {  // 直接传送至下级设备处理
		IoSkipCurrentIrpStackLocation( iIrp );  // 直接传送当前栈
		mStatus = IoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp );  // 传送至下级设备
	}
	InterlockedDecrement( & mDeviceExtension -> mExtIoCount );  // 操作计数减量
	return( mStatus );
}

NTSTATUS	mRequestPipe(  // 在指定管道上执行请求
	PDEVICE_OBJECT	iDeviceObject,
	USHORT			iFunction,
	ULONG			iPipe )
{
	PURB				mUrb;
	NTSTATUS			mStatus;
	ULONG				mPortStatus;
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	mUrb = ExAllocatePool( NonPagedPool, sizeof( URB ) );  // 分配内存作为URB请求块
	if ( mUrb == NULL ) return( STATUS_INSUFFICIENT_RESOURCES );  // 资源不够
	mUrb -> UrbHeader.Length = sizeof( struct _URB_PIPE_REQUEST );
	mUrb -> UrbHeader.Function = iFunction;
	switch( iPipe ) {  // 指定管道
		case mPipeInterUp:  // CH375的中断数据上传管道
			mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtInterUpPipe;
			break;
		case mPipeAuxDown:  // CH375的辅助数据下传管道
			mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtAuxDownPipe;
			break;
		case mPipeDataUp:  // CH375的数据块上传管道
			mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtDataUpPipe;
			break;
		case mPipeDataDown:  // CH375的数据块下传管道
			mUrb -> UrbPipeRequest.PipeHandle = mDeviceExtension -> mExtDataDownPipe;
			break;
		default:  // 不支持
			mUrb -> UrbPipeRequest.PipeHandle = NULL;  // 管道无效
			break;
	}
	if ( mUrb -> UrbPipeRequest.PipeHandle == NULL ) mStatus = STATUS_NO_SUCH_DEVICE ;  // 管道无效
	else mStatus = mUsbSubmitUrb( iDeviceObject, mUrb );  // 提交URB
	ExFreePool( mUrb );  // 释放内存
	return( mStatus );
}

NTSTATUS	mDispatchCleanup(  // 取消操作
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	ULONG				i;
	ULONG				mPortStatus;
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	if ( mDeviceExtension -> mExtIoCount != 0 ) {  // 有未完成的操作请求
		mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeDataDown );  // 在下传管道执行取消请求
		mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeDataUp );  // 在上传管道执行取消请求
		mRequestPipe( iDeviceObject, URB_FUNCTION_ABORT_PIPE, mPipeInterUp );  // 取消请求
	}
	iIrp -> IoStatus.Status = STATUS_SUCCESS;  // 返回成功
	iIrp -> IoStatus.Information = 0;
	IoCompleteRequest( iIrp, IO_NO_INCREMENT );  // 完成请求
	return( STATUS_SUCCESS );  // 返回状态
}

NTSTATUS	mDispatchPower(  // 电源管理
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	PoStartNextPowerIrp( iIrp );  // 开始下一个操作
	IoSkipCurrentIrpStackLocation( iIrp );  // 直接传送当前栈
	return( PoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp ) );  // 传送至下级设备
}

NTSTATUS	mDispatchSystemControl(  // 系统WMI控制
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	IoSkipCurrentIrpStackLocation( iIrp );  // 直接传送当前栈
	return( IoCallDriver( mDeviceExtension -> mExtNextLowerDevice, iIrp ) );  // 传送至下级设备
}

NTSTATUS	mDispatchPnp(  // 即插即用
	PDEVICE_OBJECT	iDeviceObject,
	PIRP			iIrp )
{
	ULONG				i, mCompletion;  // 0:下传, 1:完成, 2:返回状态
	NTSTATUS			mStatus;
	PDEVICE_OBJECT		mNextDeviceObject;
	mPDEVICE_EXTENSION	mDeviceExtension = iDeviceObject -> DeviceExtension;  // 设备扩展
	mNextDeviceObject = mDeviceExtension -> mExtNextLowerDevice ;
	mCompletion = 0;  // 预置为下传
	switch( IoGetCurrentIrpStackLocation( iIrp ) -> MinorFunction ) {  // 检查PnP子功能代码
		case IRP_MN_START_DEVICE:  // 启动设备
			mStatus = mWaitCompletion( iDeviceObject, iIrp );  // 等待IRP完成
			if ( NT_SUCCESS( mStatus ) ) {  // 设备启动完成
				mStatus = mActiveConfig( iDeviceObject, iIrp );  // 设备启动完成则激活配置
				if ( NT_SUCCESS( mStatus ) ) {  // 设备配置完成
					mDeviceExtension -> mExtDeviceStart = TRUE;  // 置设备启动标志
					mDeviceExtension -> mExtDeviceRemove = FALSE;  // 清设备移除标志
					IoSetDeviceInterfaceState( & mDeviceExtension -> mExtDeviceName, TRUE );  // 允许设备接口
				}
			}

⌨️ 快捷键说明

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