阅读:1867回复:12
这样定义全局变量怎么错的??
1、有三个文件init.cpp,dispatch.cpp,wdm1.h
2、在wdm1.h中声明了一个全局变量extern PUNICODE_STRING aa; 3、在init.cpp中的全局域定义它PUNICODE_STRING aa; 并且把DriverEntry中的参数IN PUNICODE_STRING RegistryPath赋值给aa: aa=RegistryPath 4、在dispatch.cpp中调用这个全局变量aa 5、机器重起 |
|
|
沙发#
发布于:2003-02-12 11:54
没看明白,出什么错?
|
|
|
板凳#
发布于:2003-02-12 11:59
我也不知道到底出了什么错,只是在我添加新硬件的时候给我重起。
去掉这些全局变量的定义就没问题了。 我这么定义全局变量有什么问题吗? 还是我的变量赋值有什么问题? [编辑 - 2/12/03 by RedFox_4U] |
|
|
地板#
发布于:2003-02-12 22:51
莫非在DriverEntry调用结束后RegistryPath被释放掉了?你用UNICODE中的类似于ANSI的strcpy的函数把内存拷贝下来试一下,在WDM里对内存的访问是非常严格的,特别是在NT/2K/XP下,不可用的内存连读都不行。
|
|
地下室#
发布于:2003-02-13 00:42
不能在两个CPP文件中都用extern,因此你不应该把extern写在h文件内,除非用#ifdef等把定义在init和其他程序区分开。
|
|
5楼#
发布于:2003-02-13 09:45
你的 PUNICODE_STRING aa是在init页中的?是的话那部分启动完不就和你byebye了?
或者,你没有为aa分配内存? :) |
|
|
6楼#
发布于:2003-02-13 09:49
#pragma code_seg(\"INIT\") // start INIT section
... PUNICODE_STRING aa; NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { ... } #pragma code_seg() // end INIT section 我的PUNICODE_STRING aa在init.cpp中是在这个位置,是你说的init页吗? 令:#pragma 以前没用过,给讲讲好吧 |
|
|
7楼#
发布于:2003-02-13 15:43
那还不死,应该叫init段吧,这部分的东西驱动启动完成后就丢掉了,你后来访问是无效内存,换个地方试试
另外你的赋值好像也有问题,punicode_string只是一个指针,在driverentry里你把它指向一个内核栈,等driverentry结束的时候指向的还是一个无效内存,还是先分配内存,用rtlinitunicodestring或rtlcopyunicodestring赋值试一下 #pragma的说明你在msdn里一搜就有了,说得比我详细 :D |
|
|
8楼#
发布于:2003-02-13 22:53
ft,walt oney的书一点都没有看吗?
|
|
9楼#
发布于:2003-02-14 09:37
walt oney的书叫什么名字,还真没有看呢。。。
现在一直看得叫《WDM驱动开发指南》 |
|
|
10楼#
发布于:2003-02-14 09:38
walt oney的书叫什么名字,还真没有看呢。。。
在哪里能搞到?? 现在一直看得叫《WDM驱动开发指南》 |
|
|
11楼#
发布于:2003-02-14 20:27
《Programming the Microsoft Windows Driver Model》
如果我不告诉你书名,你的分不就白给了? :D 就算没有看,也不能用pointer指向一个会被释放的pointer呀? |
|
12楼#
发布于:2003-02-16 13:23
1、有三个文件init.cpp,dispatch.cpp,wdm1.h DriverEntry所在的段在初始化后,退出内存! |
|
|