阅读:2432回复:6
笨笨的问题
有一些问题我不是很懂。我想问一下,问题简单不要打我哦。
1.DriverEntry中的两个参数DriverObject和RegistryPath的具体值是从什么地方得到的。 2.UNREFERENCED_PARAMETER和PAGED_CODE两个宏是什么意思,哪儿有具体的定义。 谢谢。 |
|
|
沙发#
发布于:2003-02-19 17:25
怎么不回答我啊。是不是问题太简单了?没人愿意啊?
|
|
|
板凳#
发布于:2003-02-19 21:25
你到2000DDK里查查看
应该可以查到 我做过98的,DDK里差不多都能找到 |
|
地板#
发布于:2003-02-20 12:49
谢谢楼上的兄弟。关于driverentry的两个参数问题ddk中有说明,怪我没有看。sorry.
可是那两个宏我可没有找到。:( |
|
|
地下室#
发布于:2003-02-21 10:15
我在网上找到这样的文章,看够用吗?
宏PAGED_CODE (UNREFERENCED_PARAMETER宏没找到,好像是检查函数参数的宏) 。。。 可分页内存和不可分页内存: 上面讲了内存可以分页,但并不是每个分页内存区都可以换到磁盘文件中。我们把可以换出来的分页叫作“可 分页内存”,只能永久驻留在物理内存中而不能被换出来页的叫作“非分页内存”。 如果在DISPATCH_LEVEL或者更高的中断级中访问分页内存,就会引起缺页故障,内核会崩溃。如果在 PASSIVE_LEVEL中断级访问没有驻留在物理内存中的分页内存时,内核会阻塞我们的线程,直到内存管理器把此页 重新装回物理内存中。 不要随意使用非分页内存,因为系统的资源是有限的,如果永久驻留在物理内存中的页太多,将导致可分页内 存更加频繁地进行交换,降低系统性能。 在开发驱动程序时我们必须遵守这样几个原则: 决不(或几乎从不)直接引用用户模式的内存地址。 因为我们不能确切知道用户模式内存地址所指向的真实物理地址。 执行在高于或等于DISPATCH_LEVEL级的代码不可以引发页故障。 在驱动程序的checked版中,你可以使用PAGED_CODE预处理宏(在wdm.h中声明)来帮助发现有违背这个规则的代码。 例如: NTSTATUS DispatchPower(PDEVICE_OBJECT fdo, PIRP Irp) { PAGED_CODE() ... } PAGED_CODE包含条件编译语句。在checked-build方式中,如果当前IRQL太高,它就打印出一行信息并生成一个断 言失败。在free-build方式中,它不做任何事。如果测试驱动程序时包含DispatchPower代码的页正好在内存中, 那么你不会发现已经在一个提升的IRQL上调用了DispatchPower函数。即使这样,PAGED_CODE仍能查出问题。如果 该页碰巧不在内存中,系统将产生一个bug check。 我们可以调用以下几个函数来分配可分而和非可分页内存块: ExAllocatePool(…) 调用方式如下: PVOID p = ExAllocatePool(type, nbytes); type参数是表2中列出的POOL_TYPE枚举常量,nbytes是要分配的字节数。返回值是一个内核模式虚拟地址指针,指 向已分配的内存块。如果内存不足,则返回一个NULL指针。如果指定的内存池类型为“must succeed”类型,即 NonPagedPoolMustSucceed或NonPagedPoolCacheAlignedMustS,那么内存不足将导致一个代码为 MUST_SUCCEED_POOL_EMPTY的bug check。 。。。 (是文章的部分,原文在http://www.sunistudio.com/ssdn/index.asp?act=-2&article=417) |
|
5楼#
发布于:2003-02-21 11:23
在SDK,DDK,里面对UNREFERENCED_PARAMETER都有定义,对于这些,你应该自己多动手在M$的头文件里面查一下
|
|
6楼#
发布于:2003-02-21 13:31
谢谢挑战者和yuxuehu!
我想给分,可是找不到按钮。 找一找。还有对于UNREFERENCED_PARAMETER我在ddk的头文件中找了,可是没有看明白,所以才来问的。 |
|
|