cn_zhaolin
驱动牛犊
驱动牛犊
  • 注册日期2002-04-17
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1523回复:3

NdisMapFile的用法

楼主#
更多 发布于:2005-05-27 15:29
我为了在驱动中打开硬盘文件,也查阅了论坛上的相关帖子,但是发现根据论坛过去的帖子的做法,驱动会死,而且读出的内容是错误的。通过使用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]
xiaolin
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-05-27 17:27
驱动会死
1。可能是在dpc level上调用nisopenfile造成的吧。
2。读的时候,越界。
ndismapfile非常简单,反汇编一下,仅仅是把ndisopenfile已经分配的内存指针(包含了读出来的整个文件),赋予*MappedBuffer。

没有看明白楼主的解释。NdisMapFile(Status, (PVOID *)(&fileContent), 两种调用完全一样。有什么差别?

是应该定义成char * fileContent?还是定义成什么才正确?

能否在解释一下?






cn_zhaolin
驱动牛犊
驱动牛犊
  • 注册日期2002-04-17
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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没有分配过内存空间,当然会死机。

xiaolin
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-05-31 09:51
我看的不够细,NdisMapFile(Status, (PVOID *)(fileContent), FileHandle);当然会死,本来需要传一个地址吗,这是c语言中的指针的一个基本概念!呵呵

游客

返回顶部