阅读:1524回复:3
NdisMapFile的用法
我为了在驱动中打开硬盘文件,也查阅了论坛上的相关帖子,但是发现根据论坛过去的帖子的做法,驱动会死,而且读出的内容是错误的。通过使用softice调试发现原因。
NdisMapFile( OUT PNDIS_STATUS Status, OUT PVOID *MappedBuffer, IN NDIS_HANDLE FileHandle ); 主要是MappedBuffer参数的调用方式,如果定义成 char * fileContent 如此调用: NdisMapFile(Status, (PVOID *)(fileContent), FileHandle)驱动就会挂掉,而且就算有的操作系统可以通过,读出的内容也是错误的。 应该改成这样调用函数: NdisMapFile(Status, (PVOID *)(&fileContent), FileHandle); 直接使用*(fileContent++)就可以访问到正确的文件内容了。 至于原因我想大家看到调用方式的不同,应该都很明了。 [编辑 - 5/30/05 by cn_zhaolin] |
|
|
沙发#
发布于:2005-05-27 17:27
驱动会死
1。可能是在dpc level上调用nisopenfile造成的吧。 2。读的时候,越界。 ndismapfile非常简单,反汇编一下,仅仅是把ndisopenfile已经分配的内存指针(包含了读出来的整个文件),赋予*MappedBuffer。 没有看明白楼主的解释。NdisMapFile(Status, (PVOID *)(&fileContent), 两种调用完全一样。有什么差别? 是应该定义成char * fileContent?还是定义成什么才正确? 能否在解释一下? |
|
板凳#
发布于:2005-05-30 23:37
错误的是:
NdisMapFile(Status, (PVOID *)(fileContent), FileHandle); 正确的是: NdisMapFile(Status, (PVOID *)(&fileContent), FileHandle); 蓝屏的原因我想是如果这样调用 NdisMapFile(Status, (PVOID *)(fileContent), FileHandle); 因为定义是char *fileContent, 但是NdisMapFile函数是吧一个虚拟地址存放到*fileContent中,很明显char *fileContent没有分配过内存空间,当然会死机。 |
|
|
地板#
发布于:2005-05-31 09:51
我看的不够细,NdisMapFile(Status, (PVOID *)(fileContent), FileHandle);当然会死,本来需要传一个地址吗,这是c语言中的指针的一个基本概念!呵呵
|
|