zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:1193回复:4

请问驱动程序与APP通信问题

楼主#
更多 发布于:2003-02-10 22:07
用driverstudio开发的驱动,APP要和驱动程序通信。APP中使用DeviceIoControl。驱动程序得到输入输出缓冲区后,不能马上返回数据,需要等待一个事件,所以要保存此缓冲区的指针,方法如下:
m_pMsgRec=new(NonPagedPool)(Msg)(((Message_To_Rec*)I.IoctlBuffer())->msg);
m_pMsgRec是device类的成员变量(Msg* m_pMsgRec;),Message_To_Rec是自定义的结构体,msg是此结构体的Msg类型的成员(即要传输数据的一个数组)。
结构体定义如下:
#define MAX_MSG_BUFFER 128
struct Msg
{
unsigned char data[MAX_MSG_BUFFER];
unsigned int bytes;
};
struct Message_To_Rec
{
HANDLE* hHandle;
Msg msg;
};

事件发生后,驱动程序将数据写入缓冲区,程序如下:
for(int i=0;i<nReceivedMsgBytes;i++)
*((m_pMsgRec->data)+i)=*(pReceivedMsg+i);

结果APP中并没有得到数据。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-02-10 22:46
你得到并保存缓冲区的指针后,完成这个IRP了?那这个指针还有什么用呢?用的BUFFERED_IO方式?

[编辑 -  2/10/03 by  arthurtu]
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-11 01:55
在WDM不能用这种“等”方法。
还有你在什么地方new?在APP中没必要,在WDM中你怎么管理内存?只有new没有delete?
还有你复制IRP中的缓冲区的指针,该指针不等于你APP的变量,是IRP建立的临时缓冲区随着IRP结束而结束。
zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-11 15:54
感谢两位的回复,我在驱动的DeviceControl(KIrp I)中保存了这个指针,并且完成了这个IRP。象两位所说的,如果我完成了这个IRP,那么这个指针实际上就没有用了?
我再说说我的想法。在APP中创建一个事件hReceiveMessageEvent,此事件作为msg_to_rec的成员发送给驱动程序。驱动程序获得并保存此事件和缓冲区的指针,完成这个IRP。某一时刻驱动程序把数据写入缓冲区,并将这个事件设置为有信号的来通知应用程序。象各位所说的如果我完成了这个IRP,那么我所保存的这两个个指针也就没有意义了?可是我现驱动程序能够通过所保存的事件的指针来设置事件通知APP,却不能将数据写入所保存的缓冲区中,也就是说所保存的事件的指针是有意义的而缓冲区的指针是无意义的?这是为什么呢?还请各位高手指点,谢谢。

APP中的部分代码如下:
Message_To_Rec msg_to_rec;
HANDLE hReceiveMessageEvent;
hReceiveMessageEvent=CreateEvent( NULL,TRUE,FALSE,NULL);
msg_to_rec.hHandle=&hReceiveMessageEvent;
DeviceIoControl(hDevice,
RECEIVE_MESSAGE_IOCTL,
&msg_to_rec,
           sizeof(Message_To_Rec),
&msg_to_rec,
sizeof(Message_To_Rec),
&nOutput,
NULL);
for(;;)
{
WaitForSingleObject(hReceiveMessageEvent,INFINITE);
ResetEvent(hReceiveMessageEvent);
AfxMessageBox(\"Receive Message\");
}

驱动中DeviceControl(KIrp I) 的代码如下:
HANDLE hEvent = *(((Message_To_Rec*)I.IoctlBuffer())->hHandle);
m_pEventToSignal = new(NonPagedPool) KEvent(hEvent);
//m_pEventToSignal是所保存的事件的指针,是DEVICE类的成员。
m_pMsgRec=new(NonPagedPool)(Msg)(((Message_To_Rec*)I.IoctlBuffer())->msg);
//m_pMsgRec是所保存的缓冲区的指针,也是DEVICE类的成员。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-02-11 20:43
event的指针是有效的,因为event object一直在。是内核对象。
缓冲区在IRP完成了后就不在了,指针当然没有意义了。
游客

返回顶部