6014|14

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

應用程序與驅動之間的通信問題 [复制链接]

我現在遇到這樣一個問題,還請大家給點建議:
在應用程序中,我們動態調用驅動的順序一般是:
1.調用CreateService(),裝入驅動;
2.調用OpenService(),啟動驅動;
3.調用CreateFile(),建立設備句柄;
4.執行DeviceIoControl(),調用驅動提供的IOCTL CODE;
5.關閉設備句柄;
6.調用ControlService(),停止驅動;
7.調用DeleteService(),卸載驅動;

我想知道的是
1.應用程序執行DeviceIoControl()時,提供的參數InputBuffer,OutputBuffer,與Driver中pIrpStack->Parameters->DeviceIoControl.InputBufferLength,pIrpStack->Parameters->DeviceIoControl.OutputBufferLength有什麼關係?
2.應用程序中DeviceIoControl()的InputBuffer,OutputBuffer與pIrp->AssociateIrp.SystemBuffer有什麼關係?
3.誰能解釋下這段代碼,代碼執行後的結果會是什麼?我對彙編實在...
    void* pParam;
    pParam = (DWORD*)pIrp->AssociatedIrp.SystemBuffer;
   
//  start:
                __asm
                {
                                push        eax
                                push        esi
                                mov                esi, pParam
                                mov                eax, ds:[esi]
                                mov                DMIFunction, ax
                                pop                esi
                                pop                eax
                }
問題比較多,還請大家幫忙!

最新回复

To:pilixuanke 感謝你的建議! 目前我所負責的程序是調用底層驅動提供的接口,但手邊沒有該驅動的使用手冊,只能嘗試學習/調試驅動的代碼來找出應用程序與底層驅動之間的參數傳遞. 將來我工作的重點應該還是編寫應用程序,調用底層驅動提供的接口,來實現特定的功能.再遇到問題的話,我會先去http://bbs.driverdevelop.com嘗試尋找原因和解決辦法的. To:cnzdgs 謝謝你的說明!  详情 回复 发表于 2008-1-22 10:23
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
只有NT的驱动需要Service吧? wdm驱动,应用程序直接用CreateFile()建立句柄然后通讯。
汇编代码是用winDbg看到的??
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
To footway:
這段彙編代碼是驅動源代碼中的一部分.
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
1.應用程序執行DeviceIoControl()時,提供的參數InputBuffer,OutputBuffer,與Driver中pIrpStack-> Parameters-> DeviceIoControl.InputBufferLength,pIrpStack-> Parameters-> DeviceIoControl.OutputBufferLength有什麼關係?
是对应关系,由操作系统进行匹配
2.應用程序中DeviceIoControl()的InputBuffer,OutputBuffer與pIrp-> AssociateIrp.SystemBuffer有什麼關係?
没有上下文,无法猜测
3.誰能解釋下這段代碼,代碼執行後的結果會是什麼?我對彙編實在...
把 pparam 附给 DMIFunction 没有上下文,具体不知道什么意思

ce的流驱动,一般是  creatfile 得到设备句柄,通过readfile和writefile完成数据的读写,特殊的自定义操作一般在 DeviceIoControl里完成。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
To Hiproz:
謝謝你的答覆.
關於第三個問題:
如果pParam是指向一個BYTE型數組bArray的指針,這個數組是
BYTE bArray[10]={0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};
PVOID pParam;
pParam=(BYTE*)bArray;
那麼經過那段彙編運行後,得到的DMIFunction應為什麼值呢?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
我突然想到這個:
DeviceIoControl()需要InputBuffer與OutputBuffer兩個參數.
如果我在應用程序中對InputBuffer賦了值,比如
BYTE InputBuffer[10]={0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};
然後調用DeviceIoControl(hDevice,IOCTL_CODE,&InputBuffer,sizeof(InputBuffer),&OutputBuffer,sizeof(OutputBuffer),NULL)時,
Driver中的OnDeviceControl例程中的pIrp->AssociateIrp.SystemBuffer會是什麼呢?
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

7
 
或者有什麼方便的方法讓我可以在程序運行時查看到pIrp->AssociateIrp.SystemBuffer呢?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
好像不同的IRP有不同的意义。

建议查DDK,并通过实践验证。

一般来说DDK中说到的是准确的,不需要验证!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
To pilixuanke:
我也想用實驗來驗證,但我隨意對InputBuffer賦值的話,執行DeviceIoControl會讓電腦瞬間重啟,什麼都看不到...
我的最終目的是在Windows下寫個應用程序,透過Kernel驅動來調用SMBIOS Plug-and-Play Function,實現讀寫SMBIOS信息,驅動是用別人寫的現成的,我調用時出現了很多問題.
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
To: xuyijie2005
原来你只是在应用层调用驱动啊,可能是你的参数传的不对,对照MSDN的说明和例子再检查检查,一般不会有什么问题的,所谓的InputBuffer就是你需要传给驱动的数据的指针,lpOutBuffer是输出数据的指针。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

11
 
To: pilixuanke
感謝你的建議,的確是參數傳的不對.
我裝了WinDbg,用交叉串口線調試的結果發現:我隨意對InputBuffer賦值後,調用DeviceIoControl時,目標電腦藍屏,Bug Check 0xD1:DRIVER_IRQL_NOT_LESS_OR_EQUAL.
我是第一次做核心模式下的調試,關於核心模式下的調試,應該注意哪些方面呢?請大家給點建議,謝謝!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
目前我會的只是在驅動代碼中插入DBG_TRACE_FLAG,輸出其中的部分變量的值.
然後調試時,在目標電腦上運行應用程序,在主控電腦的WinDbg下查看DBG輸出到哪,輸出的變量是否與預想的值相同來判斷.
請大家給點調試方面的建議.謝謝!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
TO:xuyijie2005

如果你只是调用底层接口,那么不了解底层编程也可以,只需要按照定义好的接口使用就行了。

如果你以后要做底层的开发,如驱动开发,那么在Windows平台下必须要看DDK和其它一些资料。Linux平台也有相关资料。

推荐网站:http://bbs.driverdevelop.com/

上面的人和资料都是关于底层开发方面的,认真去学就是了。

做底层开发路比较长,就看你自己能否坚持下来了。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

14
 
DeviceIoControl中的nInBufferSize和nOutBufferSize的值会被系统传递到Parameters.DeviceIoControl中的InputBufferLength和OutputBufferLength中。

如果InputBufferLength==0,执行完后系统会把AssociatedIrp.SystemBuffer中的数据复制到OutputBuffer中;
如果InputBufferLength!=0,InputBuffer中的数据会被系统复制到AssociatedIrp.SystemBuffer中,执行完后系统把MdlAddress中的数据复制到OutputBuffer中。

这段代码是把pIrp->AssociatedIrp.SystemBuffer中的short型值赋给DMIFunction。
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

15
 
To:pilixuanke
感謝你的建議!
目前我所負責的程序是調用底層驅動提供的接口,但手邊沒有該驅動的使用手冊,只能嘗試學習/調試驅動的代碼來找出應用程序與底層驅動之間的參數傳遞.
將來我工作的重點應該還是編寫應用程序,調用底層驅動提供的接口,來實現特定的功能.再遇到問題的話,我會先去http://bbs.driverdevelop.com嘗試尋找原因和解決辦法的.

To:cnzdgs
謝謝你的說明!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表