首页
社区
课程
招聘
[求助]看《寒江独钓》串口过滤时遇到一个问题
发表于: 2011-3-2 22:18 6249

[求助]看《寒江独钓》串口过滤时遇到一个问题

2011-3-2 22:18
6249
学习驱动也有一两个月了,现在开始看寒江独钓,对于第三章串口过滤,我稍稍改了一下书上的代码,就是给每个生成的过滤设备都创建了一个符号链接,这样我就可以用应用程序来和驱动程序通信了(我不知道这个想法正确否?原来书上的代码是没有这一步的)。我改过的代码如下:
#pragma code_seg("PAGE")
NTSTATUS AttachFltDev2ComDev(
			PDRIVER_OBJECT pDriverObject,
			PDEVICE_OBJECT pDstDevObj,
			PDEVICE_OBJECT *pFltDevObj,
			PDEVICE_OBJECT *pNextDevObj,
			ULONG i)
{
	// 保证函数运行在非分页内存环境中
	PAGED_CODE();
	
	NTSTATUS status;
	PDEVICE_OBJECT pSrcDevObj = NULL;
	
	// 创建设备名称
	UNICODE_STRING devName;
	static WCHAR name[32] = {0};
	RtlZeroMemory(name, sizeof(name));
	RtlStringCchPrintfW(name, 
		sizeof(name),
		L"\\Device\\MySerial%d",
		i);
	RtlInitUnicodeString(&devName, name);

	// 先生成过滤设备
	status = IoCreateDevice(pDriverObject,
				sizeof(DEVICE_EXTENSION),
				&devName,
				pDstDevObj->DeviceType,	// 类型匹配
				0,
				FALSE,
				pFltDevObj);
				
	// 创建设备失败
	if (!NT_SUCCESS(status))
	{
		return status;
	}
	
	// 设置过滤设备的标志位
	if (pDstDevObj->Flags & DO_BUFFERED_IO)
	{
		(*pFltDevObj)->Flags |= DO_BUFFERED_IO;
	}
	if (pDstDevObj->Flags & DO_DIRECT_IO)
	{
		(*pFltDevObj)->Flags |= DO_DIRECT_IO;
	}
	if (pDstDevObj->Characteristics & FILE_DEVICE_SECURE_OPEN)
	{
		(*pFltDevObj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
	}
	(*pFltDevObj)->Flags |= DO_POWER_PAGABLE;
	
	// 设备扩展
	PDEVICE_EXTENSION pDevExt = 
			(PDEVICE_EXTENSION)(*pFltDevObj)->DeviceExtension;
	pDevExt->pDevice = *pFltDevObj;
	pDevExt->ustrDeviceName = devName;
	pDevExt->pKEvent = NULL;
	pDevExt->pBuff = NULL;
	
	// 设置符号链接
	UNICODE_STRING symLinkName;
	RtlZeroMemory(name, sizeof(name));
	RtlStringCchPrintfW(name, 
		sizeof(name),
		L"\\??\\MySerial%d",
		i);
	RtlInitUnicodeString(&symLinkName, name);
	pDevExt->ustrSymLinkName = symLinkName;
	status = IoCreateSymbolicLink(&symLinkName, &devName);

	if(!NT_SUCCESS(status))
	{
		IoDeleteDevice(*pFltDevObj);
		return status;
	}
	
	// 绑定设备
	pSrcDevObj = IoAttachDeviceToDeviceStack(
					*pFltDevObj,
					pDstDevObj);
	
	// 如果绑定失败
	if (pSrcDevObj == NULL)
	{
		// 删除过滤设备
		IoDeleteDevice(*pFltDevObj);
		*pFltDevObj = NULL;
		status = STATUS_UNSUCCESSFUL;
		return status;
	}
	
	// 绑定成功
	*pNextDevObj = pSrcDevObj;
	
	// 去除初始化标记
	(*pFltDevObj)->Flags &= ~DO_DEVICE_INITIALIZING;
	return STATUS_SUCCESS;
}

但是,此时我在应用程序中用CreateFile来打开设备,设备名字诸如"\\\\.\\MySerial0", "\\\\.\\MySerial1"之类的,但是无法打开设备。GetLastError返回2,是说找不到这个设备。
但是用WinObj可以看到符号链接,真是不明白。
希望各位给小弟指点迷津,这个问题想了很久了,实在不明白,所以来论坛提问了。

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 138
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
又是个创建了设备不写Create和CleanupIRP滴~那些要IoCompleteRequest呀~
2011-3-3 10:04
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
3
继续求助:如果这些请求时发给真是串口的怎么办?我该怎么分辨这些IRP的真是目的是为了操作过滤设备还是操作真是设备?
2011-3-3 12:56
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我学驱动编程也不久,不过 驱动程序和应用程序通信的话。不是利用符号链接就能通信的,那个只是能让我们在应用层看到而已,如果要通信的话,得利用DEVICECONTROL 或者利用共享内存区 或者内存区之间的传递
2011-3-3 17:03
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
5
我知道 你总得先通过符号链接打开设备吧。我的问题就是设备打不开
2011-3-3 19:56
0
雪    币: 138
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
要是直接在上层应用进行关于串口操作的话,你都Attach了原来的设备了,你说IRP先发给谁呀~IRP从上往下发的。你去看看“设备栈”这个东东~
另外的还要看你打开的设备是什么,你的操作不是打开"\\\\.\\MySerial0"么,这是你自己的设备呀,所以IRP当然发给这个设备啦,所以完成CreateIRP才能打开呢。
明白了不~
2011-3-4 09:19
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
7
仔细看了一下《windows驱动开发技术详解》,我明白了,其实不管是我自己要和虚拟设备通信,还是别的程序要去操作串口,我都要自己处理一下IRP然后转发到串口去。因为两个东东都需要打开多谢朋友的指教。
2011-3-4 16:03
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
8
你处理open的irp函数呢?没有怎恶魔打开
2011-5-13 23:10
0
游客
登录 | 注册 方可回帖
返回
//