首页
社区
课程
招聘
[求助]为什么每次都蓝屏??
发表于: 2008-11-30 17:21 7649

[求助]为什么每次都蓝屏??

2008-11-30 17:21
7649
驱动代码是:
extern "C"{
#include "wdm.h"
}

NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo){
PDEVICE_OBJECT device;
UNICODE_STRING device_name;
RtlInitUnicodeString(&device_name,L"\\Device\\Example");
NTSTATUS status;
status=IoCreateDevice(DriverObject,0,&device_name,FILE_DEVICE_UNKNOWN,0,FALSE,&device);
if (!NT_SUCCESS(status)){
DbgPrint("Fail to build Driver\r\n");
}
UNICODE_STRING symb_name;
RtlInitUnicodeString(&symb_name,L"\\Global??\\Example");
status = IoCreateSymbolicLink(&symb_name,&device_name);
if (!NT_SUCCESS(status)){
DbgPrint("Fail to build Driver2\r\n");
IoDeleteDevice(device);
return STATUS_SUCCESS;
}
device->Flags |= DO_BUFFERED_IO;
device->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}

VOID DriverUnload(PDRIVER_OBJECT DriverObject){
UNICODE_STRING UnString;
        RtlInitUnicodeString(&UnString,L"\\Global??\\Example");
IoDeleteSymbolicLink(&UnString);
IoDeleteDevice(DriverObject->DeviceObject);
DbgPrint("Fail to build Driver3\r\n");
}

NTSTATUS MyFunction(IN PDEVICE_OBJECT        dev,PIRP irp){
PIO_STACK_LOCATION irpsp=IoGetCurrentIrpStackLocation(irp);
ULONG in_len =irpsp->Parameters.DeviceIoControl.InputBufferLength;
ULONG out_len =irpsp->Parameters.DeviceIoControl.OutputBufferLength;
// 请注意输入输出缓冲是公用内存空间的
PVOID buffer = irp->AssociatedIrp.SystemBuffer;
irp->AssociatedIrp.SystemBuffer="RYYFile";
irp->IoStatus.Information = 8;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (irp,IO_NO_INCREMENT);
DbgPrint("Fail to build Driver\r\n");
return STATUS_SUCCESS;       
}
NTSTATUS Function(IN PDEVICE_OBJECT        dev,PIRP irp){
irp->IoStatus.Information = 1;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (irp,IO_NO_INCREMENT);
KdPrint(("Fail to build Driver\r\n"));
return irp->IoStatus.Status;
}
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegPathName){
        for(int uiIndex = 0; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++){
                DriverObject->MajorFunction[uiIndex] = Function;
        }

DriverObject->DriverUnload=DriverUnload;
DriverObject->DriverExtension->AddDevice = AddDevice;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyFunction;
return STATUS_SUCCESS;
}
为什么每次我在monitor里开始驱动的时候就会蓝屏?

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

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
动态加载的话,去掉AddDevice,把里面代码加到DriverEntry就不会蓝了
2008-11-30 17:27
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
蓝屏不知自己调,不如回家去养猪
2008-11-30 17:29
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
为什么?
不是WDM模式的都需要个AddDevice的?
2008-11-30 17:43
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
        
   为什么 蓝屏不知自己调,不如回家去养猪?
2008-11-30 17:44
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
adddevice是要配合静态加载使用的。。。。我是这样理解的,错了不要怪我
2008-11-30 17:49
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
还有停止的时候出现the driver is not in a state to accept thie command这是什么原因?
是不是因为跟IRP_MJ_CLOSE的处理有关,那么又应该怎么处理呢?
2008-11-30 17:56
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
好像是的,我看动态加载的都不会用adddevice
2008-11-30 17:57
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
停止的时候要unload。。你不是有unload了吗
2008-11-30 18:04
0
雪    币: 271
活跃值: (18)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
10
windbg 调试看一下.
2008-11-30 18:16
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
11
你的意思是?如果驱动有了unload,就不用在monitor里用Stop?那怎么实现卸载呢?
2008-11-30 21:46
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
......你误会我了。。。你要在驱动里面设unload,然后才能在monitor里面卸载驱动,不然是卸载不了的
2008-11-30 22:24
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
但是我已经有了driverunload,为什么有这个错误呢?
2008-12-1 12:03
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
14
光写个函数系统就给你编译进DRIVER OBJECT啦?

还是回家好好学好基础再来写驱动吧~
2008-12-1 12:55
0
雪    币: 306
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
AddDevice例程中你创建的设备好像没有附加在pdo上,或是其它设备链上啊IoAttachDeviceStack(your device,pdo);
2008-12-1 13:45
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
郁闷了。。
你可以说我苯,说我SB,说我白痴,但是你要把话讲清楚啊。光写个函数系统就给你编译进DRIVER OBJECT?这是什么意思?

   还有我不是没学过基础,就来写驱动的,我看驱动的书很久了,但是书上有很多的点是没有提到的,而且没真的编过的话哪里能有一个总体的把握,就箱刚开始我学SDK编程,看书都不怎么懂,等到自己写出一个SDK的程序了,才知道是怎么回事。                     
所以才来试着写写代码,让自己的知识领会贯通。            
  最后就是重复下,光写个函数系统就给你编译进DRIVER OBJECT?这是什么意思?
2008-12-1 17:23
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
没有加在PDO上,是有什么后果的?
我在driverEntry里加入我在AddDevice中的代码,然后去掉AddDevice例程,这样编出来的程序是可以动态加载的,调试了下,IRP也可以传进来,但是我没有调用IoAttachDeviceStack,好像IRP是根据设备链上的顺序往下传的,为什么我没调用IoAttachDeviceStack也可以传进IRP?
是不是跟是不是WDM模式驱动有关?
2008-12-1 17:32
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
18
呵呵~~~~~~~
2008-12-1 17:38
0
雪    币: 306
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
对哦,AddDevice例程好像是WDM驱动专有的函数,用于创建设备(基于pdo上层的设备,wdm驱动是分层的)滴 ,你不用此例程,还是wdm驱动么?
2008-12-1 17:40
0
雪    币: 261
活跃值: (32)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
谢谢了。
同时也谢谢大家了
2008-12-2 17:43
0
游客
登录 | 注册 方可回帖
返回
//