📄 ch375wdm.c
字号:
// 这是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 + -