首页
社区
课程
招聘
新手读寒江独钓,求助!
发表于: 2011-2-16 15:21 4782

新手读寒江独钓,求助!

2011-2-16 15:21
4782
读寒江独钓,串口过滤那里
我写了如下过程,运行到IoAttachDeviceToDeviceStack就蓝屏,求解
#include <ntddk.h>
VOID Unload(PDRIVER_OBJECT driver)
{
	DbgPrint("Unloading...\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING path)
{
	DEVICE_OBJECT newdevice;//过滤设备对象
	DEVICE_OBJECT targetdevice;//目标设备对象
	FILE_OBJECT fileobject;//过滤层文件对象
	UNICODE_STRING comname;//设备名称
	NTSTATUS status;
	PDEVICE_OBJECT poutdevice = NULL;

#if DBG
	_asm int 3
#endif
	DbgPrint("begin...\n");

	RtlInitUnicodeString(&comname, L"\\Device\\Serial0");//初始化设备名称字符串

	status = IoGetDeviceObjectPointer(&comname, FILE_ALL_ACCESS, &fileobject, &targetdevice);//获取设备对象
	if(status != STATUS_SUCCESS)
	{
		DbgPrint("获取串口设备对象失败!\n");
		return status;
	}

	status = IoCreateDevice(driver, 0, NULL, targetdevice.DeviceType, 0, FALSE, &newdevice);//创建过滤设备
	if(status != STATUS_SUCCESS)
	{
		DbgPrint("创建过滤设备失败!\n");
		return status;
	}

	if(targetdevice.Flags & DO_BUFFERED_IO)//拷贝重要标志位
		newdevice.Flags |=  DO_BUFFERED_IO;
	if(targetdevice.Flags & DO_DIRECT_IO)
		newdevice.Flags |= DO_DIRECT_IO;
	if(targetdevice.Characteristics & FILE_DEVICE_SECURE_OPEN)
		newdevice.Characteristics |= FILE_DEVICE_SECURE_OPEN;
	newdevice.Flags |= DO_POWER_PAGABLE;

	poutdevice = IoAttachDeviceToDeviceStack(&newdevice, &targetdevice);//绑定设备
	if(poutdevice == NULL)
	{
		DbgPrint("绑定设备失败!\n");
		IoDeleteDevice(&fileobject);
		return status;
	}

	IoDeleteDevice(&fileobject);
	driver->DriverUnload = Unload;
	return STATUS_SUCCESS;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
书上是
        // 拷贝重要标志位。
        if(oldobj->Flags & DO_BUFFERED_IO)
                (*fltobj)->Flags |= DO_BUFFERED_IO;
        if(oldobj->Flags & DO_DIRECT_IO)
                (*fltobj)->Flags |= DO_DIRECT_IO;

标志位是  |= 你怎么是&=
if(targetdevice.Flags & DO_BUFFERED_IO)//拷贝重要标志位
    newdevice.Flags &=  DO_BUFFERED_IO;
  if(targetdevice.Flags & DO_DIRECT_IO)
    newdevice.Flags &= DO_DIRECT_IO;

看看是不是这个原因呢
2011-2-16 16:05
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢指出,我粗心了。

但是改之后还是蓝,还是运行到IoAttachDeviceToDeviceStack这个函数就蓝屏了
2011-2-16 16:43
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
DEVICE_OBJECT newdevice;//过滤设备对象
  status = IoCreateDevice(driver, 0, NULL, targetdevice.DeviceType, 0, FALSE, &newdevice);//创建过滤设备
  poutdevice = IoAttachDeviceToDeviceStack(&newdevice, &targetdevice);//绑定设备

书上
PDEVICE_OBJECT *fltobj,

        // 生成设备,然后绑定之。
        status = IoCreateDevice(driver,0,NULL,        oldobj->DeviceType,0,
                        FALSE,fltobj);
        topdev = IoAttachDeviceToDeviceStack(*fltobj,oldobj);
  DEVICE_OBJECT newdevice;//过滤设备对象

PDEVICE_OBJECT *fltobj,
newdevice是对象 &newdevice 相当于*fltobj 不是fltobj
2011-2-16 17:11
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
DEVICE_OBJECT newdevice;
&newdevice就是PDEVICE_OBJECT

...
2011-2-17 09:32
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
6
淡定……

NTSTATUS
  IoCreateDevice(
    IN PDRIVER_OBJECT  DriverObject,
    IN ULONG  DeviceExtensionSize,
    IN PUNICODE_STRING  DeviceName  OPTIONAL,
    IN DEVICE_TYPE  DeviceType,
    IN ULONG  DeviceCharacteristics,
    IN BOOLEAN  Exclusive,
    OUT PDEVICE_OBJECT  *DeviceObject
    );

注意最后一个参数……
2011-2-17 09:40
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
DEVICE_OBJECT newdevice;
&newdevice就是PDEVICE_OBJECT pdev_obj;
pdev_obj=&newdevice;
pdev_obj是指针;
但是PDEVICE_OBJECT *fltobj;
fltobj=&pdev_obj;相当于指针的指针
2011-2-17 09:41
0
雪    币: 80
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
多谢各位指出。

tunesmith不好意思,对刚刚言语向你道歉
2011-2-17 09:46
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
哈,算了,讨论程序而已,没啥事。
2011-2-17 09:51
0
游客
登录 | 注册 方可回帖
返回
//