[windows驱动开发]奇怪的DeviceName,无法获取DeviceObject

DaPPer 2017-07-31 01:05:27
说明:
现在有一个串口设备(1~32个串口),需要识别每个串口并进行数据过滤。
需要做一个过滤驱动进行数据过滤。

问题:
①32个串口只对应一个device(明显不符合微软关于设备的说明)
通过deviceTree查看到,驱动下面只有一个device
\Driver\SerialX
\Device\SerialX

无法通过devicename关联过滤驱动
②注册表中有32个串口(明显不符合微软关于设备的说明)

\Device\SerialX\1 COM1
\Device\SerialX\2 COM2
\Device\SerialX\3 COM3
\Device\SerialX\4 COM4
\Device\SerialX\5 COM5
\Device\SerialX\6 COM6
\Device\SerialX\7 COM7
...


1、这是一种什么用法?
2、怎样attach原有的驱动和过滤驱动?
...全文
507 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 kaisawind 的回复:
@大家好我是新来的
引用
1.换台电脑以及系统呢? 2.我在想串口加载的驱动是不是微软的驱动呢?
换台电脑也是相同的。 驱动不是微软的驱动,是加载的驱动。 多串口设备是[康海时代 NC900],硬件设备上有32个COM口,但是驱动下只有一个device。更奇怪的是注册表奇怪的使用方式竟然能够映射到具体的PDO。 如果适应下面的方式查找device,微软提供的API直接就查不到。 \Device\SerialX\1
这样的话,基本上是没办法了,你得自己分析这个驱动到底干了什么事情,多串口下 一个devices是如何处理消息的,然后你才可以继续attach 一句话,当attach一个驱动时 你必须了解那个驱动。
DaPPer 2017-07-31
  • 打赏
  • 举报
回复
@大家好我是新来的
DaPPer 2017-07-31
  • 打赏
  • 举报
回复
@u013605639 串口过滤驱动我知道怎么做。问题不是串口过滤驱动的写法。 ①我需要识别到每个串口 ②DeviceTree中只有一个DeviceObject 我无法从这一个DeviceObject中获取到收到的是哪个串口的数据。 注册表中\Device\SerialX\1 这种用法无法查找到设备。
\Device\SerialX\1        COM1
  • 打赏
  • 举报
回复

另外,我的电脑 win7x64 显示串口是这样子的
  • 打赏
  • 举报
回复
请参考 寒江独钓中的串口过滤
// 打开一个端口设备
PDEVICE_OBJECT ccpOpenCom(ULONG id,NTSTATUS *status)
{
	UNICODE_STRING name_str;
	static WCHAR name[32] = { 0 };
	PFILE_OBJECT fileobj = NULL;
	PDEVICE_OBJECT devobj = NULL;

	// 输入字符串。
	memset(name,0,sizeof(WCHAR)*32);
	RtlStringCchPrintfW(
		name,32,
		L"\\Device\\Serial%d",id);
	RtlInitUnicodeString(&name_str,name);

	// 打开设备对象
	*status = IoGetDeviceObjectPointer(&name_str, FILE_ALL_ACCESS, &fileobj, &devobj);
	if (*status == STATUS_SUCCESS)
		ObDereferenceObject(fileobj);

	return devobj;
}
DaPPer 2017-07-31
  • 打赏
  • 举报
回复
@大家好我是新来的
引用
1.换台电脑以及系统呢? 2.我在想串口加载的驱动是不是微软的驱动呢?
换台电脑也是相同的。 驱动不是微软的驱动,是加载的驱动。 多串口设备是[康海时代 NC900],硬件设备上有32个COM口,但是驱动下只有一个device。更奇怪的是注册表奇怪的使用方式竟然能够映射到具体的PDO。 如果适应下面的方式查找device,微软提供的API直接就查不到。 \Device\SerialX\1
  • 打赏
  • 举报
回复
引用 3 楼 kaisawind 的回复:
@u013605639 串口过滤驱动我知道怎么做。问题不是串口过滤驱动的写法。 ①我需要识别到每个串口 ②DeviceTree中只有一个DeviceObject 我无法从这一个DeviceObject中获取到收到的是哪个串口的数据。 注册表中\Device\SerialX\1 这种用法无法查找到设备。
\Device\SerialX\1        COM1
1.换台电脑以及系统呢? 2.我在想串口加载的驱动是不是微软的驱动呢?

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧