aliving
驱动小牛
驱动小牛
  • 注册日期2001-07-18
  • 最后登录2004-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2139回复:6

快来看看一些驱动开发的语法问题――

楼主#
更多 发布于:2001-09-25 10:32
函数调用:
NdisQueryPacket(
    MyPacket,
    NULL,
    NULL,
    &FirstBuffer,
    &TotalPacketLength
   );

函数原型:
NdisQueryPacket(
    IN PNDIS_PACKET  Packet,
    OUT PUINT  PhysicalBufferCount  OPTIONAL,
    OUT PUINT  BufferCount  OPTIONAL,
    OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL,
    OUT PUINT  TotalPacketLength  OPTIONAL
    );
问题:
  
     (1) TotalPacketLength代表整个包的长度,是整数,程序中也可以把它作为简单的整数使用,为什么函数调用中写成了&TotalPacketLength,C语言中的“&”表示它修饰的变量是对应变量的引用,那么TotalPacketLength就是包长度的引用了,是吗?
     那么PUINT到底又是什么意思呢?
     (2) PVOID呢?它的确切含义是什么?
     (3) 调用函数中的&FirstBuffer,为什么要这么写? 对应函数原型中的格式是OUT PNDIS_BUFFER  *FirstBuffer  OPTIONAL啊!

    这些在程序中可以学着范例使用,但还是有些基本的语法不太明繁劳这里的同志们给与解答。
    
    还有函数原型:

  NdisQueryBuffer
  (
    IN PNDIS_BUFFER  Buffer,
    OUT PVOID  *VirtualAddress  OPTIONAL,
    OUT PUINT  Length
  );

对应的函数调用:
   NdisQueryBuffer
   (
       firstBuffer,
       &VirtualAddress,
       &TotalBufferLength
    );
    
    
    为什么调用时的实参可以那么写?
    为什么使用VirtualAddress时,可以是
          VA=(char*)VirtualAddress;
          而VA则成了字符数组? 比如if(VA[3] == 7)等等

最新喜欢:

zb_xizb_xi
~~~~ Looking For Hope ~~~~ [img]http://www.driverdevelop.com/forum/upload/aliving/2002-11-11_me.jpg[/img]
aliving
驱动小牛
驱动小牛
  • 注册日期2001-07-18
  • 最后登录2004-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-09-25 12:48

问题太简单了吗?

那么哪位给推荐一本详细讲解语法的书,好吗?
~~~~ Looking For Hope ~~~~ [img]http://www.driverdevelop.com/forum/upload/aliving/2002-11-11_me.jpg[/img]
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-09-25 15:05
1) TotalPacketLength代表整个包的长度,是整数,程序中也可以把它作为简单的整数使用,为什么函数调用中写成了&TotalPacketLength,C语言中的“&”表示它修饰的变量是对应变量的引用,那么TotalPacketLength就是包长度的引用了,是吗?

是引用
2)那么PUINT到底又是什么意思呢?

是 unit 指针  如果写成 unit *length你觉得是否更好理解?

3)那么PVOID到底又是什么意思呢?
就是一个指针,没有具体类型,可以按照需要自己进行类型转换

4)调用函数中的&FirstBuffer,为什么要这么写? 对应函数原型中的格式是OUT PNDIS_BUFFER *FirstBuffer OPTIONAL。
这一次用的是地址,原来的申明是指针的指针

5)VA=(char*)VirtualAddress; 就是按照需要进行的类型转换

6)而VA则成了字符数组? 比如if(VA[3] == 7)等等

没看懂是什么意思。

答的不对,请各位高人指正

jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-09-25 15:07
对了,这里涉及了c++,microsoft c的语法,看什么书,我也不知道
singwoo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-10
  • 最后登录2002-02-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-09-25 16:47
1) TotalPacketLength代表整个包的长度,是整数,程序中也可以把它作为简单的整数使用,为什么函数调用中写成了&TotalPacketLength,C语言中的“&”表示它修饰的变量是对应变量的引用,那么TotalPacketLength就是包长度的引用了,是吗?

是引用

我认为这里应为地址传递。PUNIT 不就是指针吗。所以当然用地址来传递了啦。



singwoo
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2001-09-25 23:12
哥们,ddk里面虽然用到了很多对象的思想,但是只不过是
基于对象的思想,而不是面向对象。base object不是面向
对象阿。何况所有代码都是c写的。

ddk里面并没有完全按照ms的编码风格,也就是匈牙利风格,
很多指针都没有用p前缀。那是因为几乎所有的结构的传入
参数都用指针传递,这样最快。那些需要传出的当然更是
只能用指针了。除了类型前缀之外,全局变量也不用g_前缀,
不过除了前缀之外,别的地方基本上还是使用了匈牙利风格的。

此外ddk里面的风格似乎也并不完全一致,
例如很多函数返回一个nt_status,但是也有不少函数返回
void,真正的返回值在第一个参数pndis_status。
我开始以为是效率上的考虑,但是后来我做了一些试验,
没有发现有多大的不同,我个人还是喜欢第一种,至少
后面的代码可以直接swithch()。


我强烈的建议好好学习c语言。此外学习对象的思想是很重要的
不再回忆从前,我已经生活在幸福当中。
aliving
驱动小牛
驱动小牛
  • 注册日期2001-07-18
  • 最后登录2004-04-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-09-28 13:32
衷心感谢大家!!!
~~~~ Looking For Hope ~~~~ [img]http://www.driverdevelop.com/forum/upload/aliving/2002-11-11_me.jpg[/img]
游客

返回顶部