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