-
-
[求助]看《寒江独钓》串口过滤时遇到一个问题
-
发表于:
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 探索篇!