wordstar
驱动牛犊
驱动牛犊
  • 注册日期2003-03-18
  • 最后登录2003-08-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4550回复: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了。


hong
驱动小牛
驱动小牛
  • 注册日期2001-09-19
  • 最后登录2005-12-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-22 01:53
a very good start step!
what\'s next?
guowf
驱动牛犊
驱动牛犊
  • 注册日期2002-12-15
  • 最后登录2006-04-27
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-13 22:49
牛人!!!!!!
继续努力,我继续当你的学生!!!!!
superrobust
驱动牛犊
驱动牛犊
  • 注册日期2003-01-04
  • 最后登录2007-08-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-17 00:30
不错不错,加油。进度挺快的
everything is developing
savage213
驱动牛犊
驱动牛犊
  • 注册日期2003-10-01
  • 最后登录2004-03-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-25 10:38
谢谢,论坛就需要你这样得人
lanbincn
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2004-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-03-10 10:53
  不要加载 c 运行库。
czliang
驱动牛犊
驱动牛犊
  • 注册日期2004-05-08
  • 最后登录2004-05-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-12 21:45
值得学习,继续贴撒
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2004-05-12 23:32
memcpy可以直接在驱动中用,其实RTLCOPYMEMORY就是memcpy,NTOSKRNL里实现了memcpy,确保其的安全性
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-03-15 20:11
y :)
Ideas for life!
Raul_Shao
驱动牛犊
驱动牛犊
  • 注册日期2005-03-05
  • 最后登录2006-03-22
  • 粉丝0
  • 关注0
  • 积分99分
  • 威望14点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-04-16 00:29
学习,崇拜阿!
我是一只小小牛
jiajia20050307
驱动牛犊
驱动牛犊
  • 注册日期2005-04-23
  • 最后登录2005-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-04-23 09:40
值得学习
游客

返回顶部