阅读:1309回复:9
WDM的问题
我发现用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 是干什么的? |
|
最新喜欢:![]()
|
沙发#
发布于: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。 但愿我的解释能让你满意。 :) |
|
板凳#
发布于: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); |
|
|
地板#
发布于:2004-05-31 13:40
你建立的是什么驱动程序?USB?
|
|
地下室#
发布于:2004-05-31 15:23
是USB的驱动.
|
|
|
5楼#
发布于:2004-06-01 11:21
我生成的没有
void SerialRead(KIrp I); void SerialWrite(KIrp I); 两个啊? |
|
6楼#
发布于:2004-06-01 13:26
楼上的是准备做serial <-->usb吧!
|
|
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); |
|
|
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的 |
|
9楼#
发布于:2004-06-02 14:58
感谢你回答我的问题:
我想请教你同样可以和应用程序通讯,READA和DEVICECONTRL我看一些书上说是控制设备和小数据传输的.不知对不对. 我不明白的是O端点是控制传输.1端点我设置中断传输.2端点是快传输.我用DEVICECONTROLIO能通过1端点控制LED吗? |
|
|