阅读:4550回复:10
菜鸟的设备驱动开发之路2003-0320
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了。 |
|
沙发#
发布于:2003-07-22 01:53
a very good start step!
what\'s next? |
|
板凳#
发布于:2003-10-13 22:49
牛人!!!!!!
继续努力,我继续当你的学生!!!!! |
|
地板#
发布于:2003-10-17 00:30
不错不错,加油。进度挺快的
|
|
|
地下室#
发布于:2003-10-25 10:38
谢谢,论坛就需要你这样得人
|
|
5楼#
发布于:2004-03-10 10:53
不要加载 c 运行库。
|
|
6楼#
发布于:2004-05-12 21:45
值得学习,继续贴撒
|
|
7楼#
发布于:2004-05-12 23:32
memcpy可以直接在驱动中用,其实RTLCOPYMEMORY就是memcpy,NTOSKRNL里实现了memcpy,确保其的安全性
|
|
|
8楼#
发布于:2005-03-15 20:11
y :)
|
|
|
9楼#
发布于:2005-04-16 00:29
学习,崇拜阿!
|
|
|
10楼#
发布于:2005-04-23 09:40
值得学习
|
|