ImageVerifierCode 换一换
格式:DOCX , 页数:6 ,大小:17.16KB ,
资源ID:21114950      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21114950.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(驱动和应用层的三种通信方式Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

驱动和应用层的三种通信方式Word格式文档下载.docx

1、输入缓冲区大小lpOutBuffer,输出缓冲区地址nOutBufferSize,输出缓冲区大小LPDWORDlpBytesReturned,存放返回字节数的指针LPOVERLAPPEDlpOverlapped用于异步操作的Overlapped结构体指针);dwIoControlCode要进行操作的控制码。驱动程序可以通过CTL_CODE宏来组合定义一个控制码,并在IRP_MJ_DEVICE_CONTROL的实现中进行控制码的操作。在驱动层,irpStack-Parameters.DeviceIoControl.IoControlCode表示了这个控制码。IOCTL请求有四种缓冲策略,下面一一

2、介绍。1、输入输出缓冲I/O(METHOD_BUFFERED)2、直接输入缓冲输出I/O(METHOD_IN_DIRECT)3、缓冲输入直接输出I/O(METHOD_OUT_DIRECT)4、上面三种方法都不是(METHOD_NEITHER)为了对这些类型更详细的描述,请看msdn上的解释,我抄录如下:缓冲方法(METHOD_BUFFERED)备注:在下面的讨论中,输入表示数据从用户模式的应用程序到驱动程序,输出表示数据从驱动程序到应用程序。对于读取请求,I/O管理器分配一个与用户模式的缓冲区大小相同的系统缓冲区。IRP中的SystemBuffer字段包含系统地址。UserBuffer字段包含

3、初始的用户缓冲区地址。当完成请求时,I/O管理器将驱动程序已经提供的数据从系统缓冲区复制到用户缓冲区。对于写入请求,会分配一个系统缓冲区并将设置为地址。用户缓冲区的内容会被复制到系统缓冲区,但是不设置UserBuffer。对于IOCTL请求,会分配一个容量大小足以包含输入缓冲区或输出缓冲区的系统缓冲区,并将设置为分配的缓冲区地址。输入缓冲区中的数据复制到系统缓冲区。字段设置为用户模式输出缓冲区地址。内核模式驱动程序应当只使用系统缓冲区,且不应使用中存储的地址。IOCTL,驱动程序应当从系统缓冲区获取输入并将输出写入到系统缓冲区。系统将输出数据从系统缓冲区复制到用户缓冲区。直接方法(METHOD

4、_IN/OUT_DIRECT)对于读取和写入请求,用户模式缓冲区会被锁定,并且会创建一个内存描述符列表(MDL)。MDL地址会存储在的MdlAddress字段中。和均没有任何含义。但是,驱动程序不应当更改这些字段的值。请求,如果在METHOD_IN_DIRECTMETHOD_OUT_DIRECT中同时有一个输出缓冲区,则分配一个系统缓冲区(SystemBuffer又有了地址)并将输入数据复制到其中。如果有一个输出缓冲区,且它被锁定,则会创建并设置MdlAddress。字段没有任何含义。两者都不方法(METHOD_NEITHER)对于读取和写入请求,UserBuffer字段被设置为指向初始的用户

5、缓冲区。不执行任何其他操作。SystemAddress没有任何含义。请求,I/O管理器将设置为初始的用户输出缓冲区,而且,它将当前I/O栈位置的Parameters.DeviceIoControl.Type3InputBuffer设置为用户输入缓冲区。利用该方法,由驱动程序来确定如何处理缓冲区:分配系统缓冲区或创建MDL。通常,驱动程序在访问用户数据时不应当将字段用作地址,即使当用户缓冲区被锁定时也是如此。这是由于在调用驱动程序时,在系统中可能看不到调用用户的地址空间。(对于该规则的一个例外是,在最高层驱动程序将向下传递到较低层的驱动程序之前,它可能需要使用来复制数据。)如果使用或方法,在创建

6、之后,驱动程序可以使用MmGetSystemAddressForMdl函数来获取有效的系统地址以访问用户缓冲区。在驱动层,依传输类型的不同,输入缓冲区的位置亦不同,见下表。传输类型位置irp-AssociatedIrp.SystemBufferMETHOD_BUFFEREDMETHOD_NEITHERirpStack-Parameters.DeviceIoControl.Type3InputBuffer在驱动层,依传输类型的不同,输出缓冲区的位置亦不同,见下表。MdlAddressUserBuffer所以只要确定了传输方式后,就可以根据各自的位置来读取和写入数据,从而实现应用层和驱动的通信。下

7、面看驱动层对ioctl控制码的处理代码:代码:/METHOD_OUT_DIREC方式NTSTATUSCOMM_DirectOutIo(PIRPIrp,PIO_STACK_LOCATIONpIoStackIrp,UINT*sizeofWrite)status=STATUS_UNSUCCESSFUL;PVOIDpInputBuffer,pOutputBuffer;ULONGoutputLength,inputLength;DbgPrint(COMM_DirectOutIornoutputLengthpIoStackIrp-Parameters.DeviceIoControl.OutputBuffe

8、rLength;inputLengthParameters.DeviceIoControl.InputBufferLength;pInputBufferIrp-AssociatedIrp.SystemBuffer;pOutputBufferNULL;if(Irp-MdlAddress)MmGetSystemAddressForMdlSafe(Irp-MdlAddress,NormalPagePriority);if(pInputBuffer&pOutputBuffer)COMM_DirectOutIoUserModeMessage%s,pInputBuffer);RtlCopyMemory(p

9、OutputBuffer,outputLength);*sizeofWriteoutputLength;STATUS_SUCCESS;returnstatus;METHOD_IN_DIRECTCOMM_DirectInIo(PIRPCOMM_DirectInIornCOMM_DirectInIoMETHOD_BUFFEREDCOMM_BufferedIo(PIRPCOMM_BufferedIornCOMM_BufferedIoMETHOD_NEITHERCOMM_NeitherIo(PIRPCOMM_NeitherIornParameters.DeviceIoControl.Type3Inpu

10、tBuffer;UserBuffer;COMM_NeitherIo代码比较简单,都是取得输入的数据,然后把数据直接拷贝到输出,传输给应用层。应用层的代码:procedureTfrmMain.Send_Recv_Data(AInData:String;varAOutData:IoctlCode:DWORD);vardwReturn:DWORD;inData:array0.1023ofchar;outData:beginStrPCopy(inData,AInData);ifm_hCommDevice0thenDeviceIoControl(m_hCommDevice,IoctlCode,inData,Length(inData),outData,Length(outData),dwReturn,nil);AOutData:StrPas(outData);end;上面是进行发送和接受的过程。需要通信,只要如下做:TfrmMain.btnDirect_IN_IOClick(Sender:TObject);Send_Recv_Data(Trim(edtDirect_in_in.Text),outData,IOCTL_COMM_DIRECT_IN_IO);edtDirect_in_out.TextoutData;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1