liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1309回复:9

WDM的问题

楼主#
更多 发布于:2004-05-31 11:30
我发现用SD生成驱动在设备程序中有如下例程:谁能解释每个例程的功能.
我最近在看WDM武安河的书.和看了杨全胜写的驱动程序编写方法.我的问题是:
DEVMEMBER_DISPATCHERS
virtual NTSTATUS OnStartDevice(KIrp I);
virtual NTSTATUS OnStopDevice(KIrp I);
virtual NTSTATUS OnRemoveDevice(KIrp I);
virtual NTSTATUS DefaultPnp(KIrp I);
virtual NTSTATUS DefaultPower(KIrp I);
virtual NTSTATUS OnDevicePowerUp(KIrp I);
virtual NTSTATUS OnDeviceSleep(KIrp I);
void SerialRead(KIrp I);
void SerialWrite(KIrp I);
NTSTATUS SAMPLE_IOCTL_read_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_write_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_readwrite_Handler(KIrp I);

#ifdef _COMMENT_ONLY

// The following member functions are actually defined by the
// a DEVMEMBER_xxx or MEMBER_xxx macro (such as DEVMEMBER_DISPATCHERS).
// The macro __COMMENT_ONLY never gets defined. These comment-only
// definitions simply allow easy navigation to the functions within
// the Developer Studio using the class browser.

virtual NTSTATUS CleanUp(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Create(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Close(KIrp I); // COMMENT_ONLY
virtual NTSTATUS DeviceControl(KIrp I); // COMMENT_ONLY
virtual NTSTATUS SystemControl(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Write(KIrp I);
特别是这几个:
void SerialRead(KIrp I);
void SerialWrite(KIrp I);
NTSTATUS SAMPLE_IOCTL_read_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_write_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_readwrite_Handler(KIrp I);
virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Write(KIrp I);
其中
NTSTATUS SAMPLE_IOCTL_read_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_write_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_readwrite_Handler(KIrp
中的READ和WRITE 以及READWRITE是知道和应用程序控制传输.我不明白上面大READ 和WRITE 是干什么的?

最新喜欢:

abei11abei11
什么也不懂
bobbysun2000
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-31 12:00
你可以结合WDM开发指南来学driverworks,光看武安何那本书可能不行,因为你可能还没有一些wdm的基础。
virtual NTSTATUS OnStartDevice(KIrp I);
virtual NTSTATUS OnStopDevice(KIrp I);
virtual NTSTATUS OnRemoveDevice(KIrp I);
virtual NTSTATUS DefaultPnp(KIrp I);
virtual NTSTATUS DefaultPower(KIrp I);
virtual NTSTATUS OnDevicePowerUp(KIrp I);
virtual NTSTATUS OnDeviceSleep(KIrp I);
上面几个是IRP_MJ_PNP的几个IRP_MN_xxx_xxx的处理函数,分别是启动设备、停止设备、删除设备,还有别的IRP的处理,如IRP_MJ_POWER (电源管理),另外的一些,也是相应的IRP的处理,具体你再看看介绍WDM方面的书。

还有你说的最后一个问题,
NTSTATUS SAMPLE_IOCTL_read_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_write_Handler(KIrp I);
NTSTATUS SAMPLE_IOCTL_readwrite_Handler(KIrp I);
是你用来处理IRP_MJ_DEVICE_CONTROL的函数,在应用程序中使用DeviceIoControl函数来产生这个IRP,

virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Write(KIrp I);
是处理IRP_MJ_READ和IRP_MJ_WRITE的程序,和上面的IRP请求是不一样的,在应用程序中,你应该使用ReadFile和WriteFile来产生这两个IRP。
但愿我的解释能让你满意。


 :)
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-31 12:49
你的回答我很高兴也解决了一些我的问题.
我看不明白的是:下面有两个READ和WRITE例程分别是干什么的.
void SerialRead(KIrp I);
void SerialWrite(KIrp I);
virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Write(KIrp I);
什么也不懂
bobbysun2000
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-31 13:40
你建立的是什么驱动程序?USB?
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-31 15:23
是USB的驱动.
什么也不懂
bobbysun2000
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-01 11:21
我生成的没有
void SerialRead(KIrp I);
void SerialWrite(KIrp I);
两个啊?
south4
驱动牛犊
驱动牛犊
  • 注册日期2003-01-12
  • 最后登录2009-10-26
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望61点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-01 13:26
楼上的是准备做serial <-->usb吧!
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-02 10:35
我说的是附件中有两个不同大READ和WRITE例程:
void SerialRead(KIrp I);
void SerialWrite(KIrp I);

virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Write(KIrp I);
附件名称/大小 下载次数 最后更新
2004-06-02_接口驱动程序开发(下).ppt (785KB)  6
什么也不懂
bobbysun2000
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-02 13:17
我大致明白了,我觉得那两个函数
void SerialRead(KIrp I);
void SerialWrite(KIrp I);
不是DriverWorks生成的,是用户自己加的,它的黑色的代码是DriverWorks生成的,但是应该是在
virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY
virtual NTSTATUS Write(KIrp I);
中生成的,它将它剪切到
void SerialRead(KIrp I);
void SerialWrite(KIrp I);中去的。源程序应该是这样写的:

virtual NTSTATUS Read(KIrp I)
{
 .....
 SerialRead(I);           //在这个函数中调用
 .....
}

virtual NTSTATUS Write(KIrp I);
{
 ......
 SerialWrite(I);         //在这个函数中调用
 ......
}
一般情况下,DriverWorks生成的KDevice下的成员函数都是virtual的

liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-02 14:58
感谢你回答我的问题:
我想请教你同样可以和应用程序通讯,READA和DEVICECONTRL我看一些书上说是控制设备和小数据传输的.不知对不对.
我不明白的是O端点是控制传输.1端点我设置中断传输.2端点是快传输.我用DEVICECONTROLIO能通过1端点控制LED吗?
什么也不懂
游客

返回顶部