HID设备无法启动(代码10)-发送无效的参数给服务或者功能
2022-11-28
2514
0
在对HID设备进行过滤,即通过一个自己构造的HID功能驱动来更新现在的一个HID设备驱动,实现对原来的HID设备进行功能扩展。
扩展的功能如下:
最终的效果就是原来是一个HID设备,但是通过我们的扩展,可以新增加一个HID设备。新增加的就是我们在现在的真实的设备上扩展或者说是虚拟的,但又不影响原来的HID设备。
不过想法是简单的,实现起来就比较麻烦了。
比如说对配置描述符的篡改,比如说对选择配置中相关的端点信息进行修改扩展。涉及到的东西还不少,而且有些数据内存结权处理起来还真是麻烦。
这不,今天就是因为自己返回了一个错误的配置描述符,而致设备选择配置描述符出现设备启动失败。
其实有的时候,发现系统上报的这些错误信息很迷,看的人很莫明奇妙。
不过,我想通过我们的总线,偿试,总有一天会搞清楚这个东西的。
多看多总结多偿试。
大不了蓝屏呗。。。
如下是我的一段对配置描述符的HOOK代码:
do
{
KdBreakPoint();
ULONG OldLength = GetTransferLength(Urb->UrbControlDescriptorRequest);
status = SyncForwardIrp(FdoDeviceExtension->NextDeviceObject, Irp);
if (!NT_SUCCESS(status))
{
DPrint1(("SyncForwardIrp err:[%08x]\n", status));
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
ULONG length = GetTransferLength(Urb->UrbControlDescriptorRequest);
PUSB_CONFIGURATION_DESCRIPTOR pConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)GetTransferBuffer(Urb->UrbControlDescriptorRequest);
ULONG AppendLen = 0;
ULONG DropLen = 0;
PUSB_INTERFACE_DESCRIPTOR pAppendDescriptor = (PUSB_INTERFACE_DESCRIPTOR)GetAppendingConfigureDescriptor(&AppendLen);
if (OldLength == (AppendLen + length - DropLen) && pAppendDescriptor != NULL)
{
RtlCopyMemory((PUCHAR)pConfigDesc + length - DropLen, pAppendDescriptor, AppendLen);
GetTransferLength(Urb->UrbControlDescriptorRequest) += AppendLen;
}
pConfigDesc->wTotalLength += (USHORT)(AppendLen-DropLen);
pConfigDesc->bNumInterfaces += 1;
if (pAppendDescriptor != NULL)
{
ExFreePool(pAppendDescriptor);
}
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
} while (0);
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936