wordstar
驱动牛犊
驱动牛犊
  • 注册日期2003-03-18
  • 最后登录2003-08-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4454回复:10

菜鸟的设备驱动开发之路2003-0320

楼主#
更多 发布于:2003-03-21 23:12
2003-3-20
 最终也没有从KPnpDevice的源代码中看出什么名堂,我回想起当初看MFC源代码的时侯了,当时也是怎么也看不懂,不过现在
就好多了,看样子这不是一天的功夫就可以搞明白的了.

看不下程序就不看了,随便做做就好.
今天想完成应用层到驱动程序的读写.最初的思想是很简单的:
在驱动中申请一块内存,然后在整个驱动运行期间保持这块内存,在写的时侯把应用内存复制到驱动内存中,读的时侯把驱动
内存复制到应用内存中.
然后就开始写了我自己的第一行驱动代码:
PUCHAR m_pDataBuffer;
这个是作为我的驱动内存指针,放在MyWDM0Device类里面
然后在MyWDM0Device的构造里面申请内存.好像没有人说不能用malloc,我就用它吧。
m_pDataBuffer = malloc(1024);
然后就出错了,告诉我找不到malloc的说明。当然我可以不管这些,去找出malloc的原型,但是我不敢这麽做。我想肯定是Numega
为了防止我这种菜鸟乱用这些危险的函数屏蔽掉了。也许这是危险的。
ChrisCant说:在DispatchLevel使用分页内存会崩溃,在PassiveLevel使用分页内存会阻塞,非分页内存不可以申请太大,资源宝贵
然后就迷惑了,怎样申请一段内存呢?
m_pDataBuffer = (PUCHAR)ExAllocatePool(NonPagedPool,1024);
//分配1024字节作为数据寄存区。所以读写不可超过1024字节。
这一句是从ChrisCant的源代码中得到的。我不管了,先看看编译的效果。
编译通过了。但是我还不敢就这麽安装上去。申请了内存不释放是不可以的,我在析构里释放内存。
if( m_pDataBuffer!=NULL) ExFreePool(m_pDataBuffer);
当然这一句也是抄来的。我不清楚析构在什么时侯会被调用,是不是真的就能够释放这一片内存。自我安慰吧,怎么办呢?

然后就是急功近利的读写了。我用了另外一个可能是危险的函数memcpy .内存的问题总是非常复杂,不知道会发生什么样的结果,Chris
说内存需要用内存自旋锁,我实在不知道这是个什么东东,先不用它。
memcpy((void *)m_pDataBuffer,(void *)pBuffer,dwTotalSize);
dwBytesSent = dwTotalSize;
I.Information() = dwBytesSent;
I.Status() = status;
这是写IRP处理程序中加的,读处理也是类似。然后编译,测试。
居然通过了。其中的pBuffer指针是Numega给我的框架中从IRP得到的,dwTotalSize也是.
当然我还是不能就这麽使用memcpy 的。我想应该也是用DDK中那些莫名其妙的函数比较合适。再看Chris的源代码。
RtlCopyMemory( Irp->AssociatedIrp.SystemBuffer, Buffer+FilePointer, BytesTxd);
我抄,我抄,我抄抄抄!
出错了,安装正确,测试结果没有出现我想要的东东呢。
再查出错的地方,可能是指针弄错了。调整了一下,好了没有问题了。
再加点防御性代码。
我的第一个设备驱动就这麽做好了。这个驱动能完成什么功能?嘿嘿,天晓得,大概可以做一个1024字节大小的
共享内存映象文件吧。微软早就提供这种东东了。不过这是我自己的哦。

然后就不知道该做什么了。我的目标是PLX9054,然后就开始研究9054这东东。
开发9054最好的东东是什么?废话,当然是PLX公司提供的SDK了。


游客

返回顶部