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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(Windows XP驱动程序编写方法.ppt)为本站会员(hwpkd79526)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

Windows XP驱动程序编写方法.ppt

1、1,Windows XP驱动程序编写方法 Step by Step,东南大学计算机科学与工程学院 杨全胜,VS.NET+WIN XP DDK+DriverStudio3.2开发环境版,2,本电子讲义可以作为几年前本人所写的驱动开发上、下电子讲义的后续篇,主要是将开发平台从Windows98/2000,DriverStudio 2.7升级到以下环境:,Windows XP SP2 Visual Studio .NET(VC+.NET 2002) 简体中文版* Windows XP DDK* Driver Studio 3.2,1. 驱动程序的开发环境,以上四项中,前3项为Microsoft公司产

2、品,可以只用2,3来开发驱动程序。为了方便起见,也可以使用第三方的开发工具Driver Studio ,它将DDK的内容封装成类,而且提供一个快速方便地生成驱动框架的工具。3.2版本可能是Compuware公司推出的最后一个版本。,3,*通常,开发不同操作系统下的驱动程序需要不同的DDK做支持:,Windows 2000 DDK适合开发Windows 2000/98/Me的WDM驱动程序,Windows 2000下NT4型驱动程序。Windows XP DDK适合开发IA64下的驱动程序或Windows XP/2000/Me的WDM驱动程序,Windows XP下NT4型驱动程序。Window

3、s 2003 DDK适合开发AMD64/IA64下的驱动程序或Windows 2003/XP/2000/Me的WDM驱动程序,Windows 2003/XP/2000下NT4型驱动程序。,*本电子讲义假设大家已经会VC编程及熟悉VS IDE的使用。,4,2. 驱动程序开发工具包DriverStudio,2.1 DriverStudio 3.2所包含的工具,VToolsD VToolsD 是一个用来开发针对Win9X (Windows 95 和 Windows 98)操作系统下设备驱动程序(VxD)的工具。VToolsD 中包括生成驱动程序源代码的工具,run-time 和 interface

4、库,以及一些可以用来作为各种类型的设备驱动程序基础的驱动程序样本。,DriverWorks DriverWorks提供针对Windows NT 4和Win32驱动模型(WDM)的设备驱动程序开发的完全支持。DriverWorks中包含一个非常完善的源代码生成工具(DriverWizard) 以及相应的类库和驱动程序样本,它提供了在C+下进行设备驱动程序开发的支持。它可以集成到msvc6和中,还需要最新的Windows DDK的支持。,5,DriverNetworks DriverNetworks 是针对Windows网络驱动开发人员的一个模块。它的核心部分,是一个针对NDIS drivers

5、和 TDI clients (DriverSockets)的 C+ 的类库。DriverNetworks 中也有Quick Miniport Wizard 用来直接开始一个NDIS Miniport ,Intermediate 或协议驱动程序工程。它可以让你在采用DriverNetworks C+ 类库编写NDIS驱动程序的时候,快速的生成编译、安装和调试所需要的所有文件 。它可以集成到msvc6和中,还需要最新的Windows DDK的支持。,6,SoftICE系列调试器 SoftICE 系列调试器包含了可以调试各种代码的多种工具。它可以调试诸如BIOS代码、中断例程以及系统I/O。这些工具

6、与强大的硬件调试板一起支持符号级调试,可以显示源码、全局或局部数据。其中: SoftICE 是单机调试器,调试本机代码。 Visual SoftICE是双机调试器,支持64位和32位平台上的微软操作系统。,7,DriverMonitor DriverMonitor不仅可以显示WDM和VxD在操作系统核心层次输出的调试语句,还可以装载和卸载VxD驱动和NT4系统的驱动程序。,EZDriverInstaller 这是一个无需经过设备管理器或“添加新硬件”功能就能为Windows 2000/XP动态加载和卸载WDM驱动程序的小实用程序。,SetDDKGo 用来设置设备驱动程序创建的环境。当我们用Vi

7、sual Studio(VC+)编译驱动程序源程序的时候,需要用SetDDKGo来设置环境变量,之后SetDDKGo会自动启动Visual Studio(VC+)编译环境。,8,DriverWorkbench 这是DriverStudio以及用户工具的集成环境和宿主。DS的大多数工具全部被集成到这个开发环境中。,BoundsChecker Driver Edition 它提供了参数验证和系统测试来检测和跟踪不同的设备驱动程序与其他操作系统模块之间的交互。配置,TrueTime Driver Edition 这是一个能让Windows NT/2000/XP设备驱动程序的编写者确定驱动程序性能瓶颈

8、的性能分析工具。对于编写设备驱动程序或核心代码的程序员,这很有用。,TrueCoverage Driver Edition 它能帮助程序员检测其代码的哪部分被测试过,哪部分还需要测试。可帮助程序员提高程序的稳定性。,9,2.2 DriverStudio 3.2的安装,安装需要的软硬件环境,Intel x86兼容系统或X64系统(包含IA64和AMD64以及Itanium) Windows XP 内存: 最少256MB,推荐使用512 MB 硬盘:完全安装需要大约182 MB 针对 SoftICE的远程调试: NE2000-兼容网卡或 3Com 网卡 针对 DriverWorks: Micros

9、oft XP DDK, Visual C+.NET,10,安装步骤:在安装DriverWorks之前,首先要保证你的计算机上已经安装了Microsoft Visual C+.NET以及Windows XP DDK。 所有这些包括DriverStudio的安装都必须以系统管理员身份启动系统。并且要按照下面的顺序安装。,11,第二步: 安装Windows XP DDK(Driver Development Kits)。 注意: 1)在安装DDK的时候请选择完全安装。 2)安装中,不需要安装64BIT IA64Binaries 3)安装好后,对于 XP DDK不需要手动配置环境变量,只需在开始菜单中

10、点击Checked Build Envirment 则DDK会自动调用setenv配置环境变量,并监测相应的SDK以及Visual Studio.NET IDE,第一步:安装Visual Studio C+.NET,第三步:安装DriverStudio 3.2(按照安装提示安装)。,12,Driver Studio 3.2支持单机调试或双机调试两种模式。在安装的时候也有Host和Target两种模式。,单机调试需要在同一个机器中将Host和Target两种模式都安装 双机调试的时候需要在一个机器上安装Host模式,在另一个机器上安装Target模式。,13,DriverStudio安装后的设置

11、: 1)使用DDK Build Setting工具定义BASEDIR环境变量并启动MSVC.NET,,14,15,16,17,18,2)打开下列地址上的建立库文件工程VdwLibs2002.sln 如果是VS.NET2003, 则打开 VdwLibs2003.sln,19,3)选择“生成-批生成”,打开下面的窗口,从中选则需要编译的配置。,Checked是调试版本,Free是发布版本,20,4)点击“重新生成”编译所选择的库文件。,注意:库文件只需在安装完成后第一次使用前编译一次即可。以后要使用DriverWorks,只需通过SetDDKGo进入MSVC.NET即可。 或者直接从MSVC.NE

12、T中启动DriverWorks。,21,3.Driver Works的使用,1)生成简单框架(VS.NET中启动DriverWizard),22,23,工程文件名,工程文件目录,24,选择驱动类型,选择框架类型,25,创建功能驱动程序,创建过滤器驱动程序,26,选择相应总线,本例不驱动硬件,27,选择需要处理的消息句柄,28,添加和应用程序之间通信的控制代码,29,30,31,32,33,34,35,36,37,38,39,驱动类,设备类,队列管理类,40,驱动类文件,设备类文件,测试用的控制台程序文件,驱动安装指导文件,队列管理类,41,此时已经具备了一个驱动程序以及做测试用的应用程序的基本

13、框架,我们可以在VC集成环境下修改有关程序,增加相关的具体操作代码,然后就可以编译和调试了。,42,该驱动程序框架包含了几个最基本的类,这些类是: class SampleDriver : public KDriver / 驱动程序类,用于初始化驱动程序 SAFE_DESTRUCTORS public:/ 以下成员函数注意和WDM中有关例程联系起来看virtual NTSTATUS DriverEntry(PUNICODE_STRING RegistryPath);virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo);virtual VOID Unloa

14、d(VOID);void LoadRegistryParameters(PUNICODE_STRING RegistryPath);protected:/ 成员数据int m_Unit; ;,43,class SampleDevice : public KPnpDevice / 是设备类KDvice的派生类,用于在WDM环境下支持即插即用设备 / Constructors public:SAFE_DESTRUCTORS;SampleDevice(PDEVICE_OBJECT Pdo, ULONG Unit);SampleDevice();VOID Invalidate(void);/ Memb

15、er Functions 注意和PNP的次功能代码联系起来看DEVMEMBER_DISPATCHERSvirtual NTSTATUS OnStartDevice(KIrp I);virtual NTSTATUS OnStopDevice(KIrp I);virtual NTSTATUS OnRemoveDevice(KIrp I);virtual NTSTATUS OnDevicePowerUp(KIrp I);virtual NTSTATUS OnDeviceSleep(KIrp I);virtual NTSTATUS DefaultPnp(KIrp I);virtual NTSTATUS

16、 DefaultPower(KIrp I);void LoadRegistryParameters(); / 取注册表信息,44,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); protected:/ Member DataKPnpLowerDevice m_Lower;sam

17、pleQueue ReadQueue; / Driver managed IRP queuesampleQueue WriteQueue; / Driver managed IRP queue#ifdef _COMMENT_ONLYvirtual NTSTATUS Create(KIrp I); / COMMENT_ONLYvirtual NTSTATUS Close(KIrp I); / COMMENT_ONLYvirtual NTSTATUS Read(KIrp I); / COMMENT_ONLYvirtual NTSTATUS Write(KIrp I); / COMMENT_ONLY

18、virtual NTSTATUS DeviceControl(KIrp I);/ COMMENT_ONLYvirtual NTSTATUS SystemControl(KIrp I);/ COMMENT_ONLY#endif /_COMMENT_ONLY ;,45,由于一个可能是DriverStudio 3.2中的BUG,所以及时生成的一个空工程项目也无法编译通过,需要对生成的工程文件做以下手工修改: 把sample项目中的sources文件中的: TARGETLIBS=$ (DDK_LIB_PATH)ntstrsafe.lib $ (DDK_LIB_PATH)csq.lib 这一行去掉就可以

19、编译通过了,46,先编译驱动程序工程,在VS2002的集成环境中,下面我们讲解编译、执行和调试这个驱动程序。,生成目标文件,47,确认生成的是驱动程序,48,在VS2002的集成环境中,生成目标文件,再编译测试应用程序工程,49,确认生成的是测试用应用程序,50,下面使用DriverStudio带的工具加载驱动程序和查看调试信息。,驱动程序监视,可实时看到驱动程序发出的调试输出语句,驱动程序装载器,可动态调用驱动程序,51,驱动程序监视器界面,52,为了防止其他驱动程序的干扰,在Filter Message对话框中设置消息过滤规则,只让有sample的消息通过。,53,驱动程序装载器界面,54

20、,55,56,57,驱动程序已经加载并且启动,58,YANGQS,59,DriverStudio 3.2给出的驱动测试软件是一个Win32的窗口程序,而不是先前版本的控制台程序。为了在调试输出的时候有所区别我们将测试程序的调试输出语句的句头由原来的sample:改成sampleAPP: (在sampleAPP.cpp文件中),VOID sampleOutputText(LPCTSTR Format, .) TCHAR strMAX_STRING_LENGTH;va_list vaList;va_start(vaList, Format);_vstprintf(str, Format, vaLi

21、st);OutputDebugString(_T(“sampleAPP: “);OutputDebugString(str);OutputDebugString(_T(“n“);va_end(vaList);return; ,60,运行编译好的sampleAPP.exe,61,62,如果在执行sampleAPP.exe之前,驱动程序sample.sys还没有加载到内存中,则在DriverMonitor程序中就可以看到以下信息:,63,APP中打开与驱动程序联系,64,65,结束后一定要卸载驱动程序,66,驱动程序已经卸载,67,下面我们来修改有关代码,以便增加驱动程序和应用程序之间相互通信的内

22、容。需要增加的内容包括:,使用Read和Write方式分别从驱动程序读入字符和 向驱动程序写字符。 使用IO控制代码方式分别从驱动程序读入字符和 向驱动程序写字符。 使用IO控制代码方式向驱动程序写字符串再从驱动程序中读出该字符串,并返回反馈串信息。,注意:程序中暗红色显示的部分是我们添加或修改过的语句,其他是DriverWorks自动生成的。蓝色显示的部分是要删除的语句。省略号的部分是不变的。语句中T.Trace(TraceInfo, _FUNCTION_“xxxx”)这样的语句是向调试软件输出信息,该信息可在DriverMonitor或其他调试监视器中看到。,2)完成应用程序和驱动程序之间

23、的信息交换,68,a.1 使用Read方式读 SampleDevice.cpp void SampleDevice:SerialRead(KIrp I) T.Trace(TraceInfo, _FUNCTION_“+. IRP %pn“, I);NTSTATUS status = STATUS_SUCCESS;PUCHAR pBuffer = (PUCHAR) I.BufferedReadDest();/取得返回数据BUFF的指针ULONG readSize = I.ReadSize( ); /获得应用程序希望读驱动程序信息的字节数。ULONG bytesRead = 0;char buff5

24、12; int n =512, j = (n % 26);for (int i=0; in; i+, j=(j + 1)%26) buffi = a + j; buffreadSize=0; /指定串尾strcpy(char *)pBuffer,buff); / 把给应用程序的数据拷贝给返回BUFFT.Trace(TraceInfo,_FUNCTION_ “ The string you will read is %sn“, buff ); / 输出调试信息bytesRead = strlen(buff); / Count of bytes read I.Information() = byt

25、esRead; / 返回给应用程序的信息的字节个数I.Status() = status;m_DriverManagedQueue.PnpNextIrp(I); ,69,控件IDC_OP_TYPE_COMBO及其选择项,我们这次选ReadFile,70,sampleIorw.cpp中有关读数据的代码:,ULONG sampleExecuteIo(HWND hDlg) PSAMPLE_LIST_ITEM ioItem; / 获得需要读的字节数GetDlgItemText(hDlg, IDC_OUT_SIZE_EDIT, str, MAX_STRING_LENGTH); ioItem-OutSiz

26、e = _ttol(str); / 设置控件IDC_OP_TYPE_COMBO的句柄hWnd = GetDlgItem(hDlg, IDC_OP_TYPE_COMBO); / 获得当前被选中项目的索引itemIndex = (DWORD)SendMessage(hWnd, CB_GETCURSEL, 0, 0); / 获得被选中的项目的字符串SendMessage(hWnd, CB_GETLBTEXT, (WPARAM)itemIndex, (LPARAM)str);if (!_tcscmp(str, _T(“ReadFile”) ,71,/ 从驱动程序读数据if (!ReadFile(g_h

27、Device, / 设备句柄ioItem-OutBuffer, / 输入缓冲地址ioItem-OutSize, / 缓冲大小(字节数)NULL, / 实际读的数据字节数 / if (!_tcscmp(str, _T(“ReadFile”) ,72,VOID sampleReadCompleteCallback(PVOID Context) / 读驱动程序的回调函数PSAMPLE_LIST_ITEM ioItem = (PSAMPLE_LIST_ITEM)Context;/ 因VS.net隐含采用Unicode编码,每个字符16位,下面做8位到16位字符转换char wstr1025;for(U

28、LONG i=0;iOutSize;i+) wstri*2=ioItem-OutBufferi; wstri*2+1=0x0; wstri*2=wstri*2+1=0;sampleOutputText(_T(“Executed ReadFile: buffer size (%d), return length (%d) error (%d) The string I read is %s“),ioItem-OutSize, ioItem-ReturnLength, ioItem-Error, wstr);/ 输出读到的字符串sampleOutputBuffer(ioItem-OutBuffer

29、, ioItem-ReturnLength); / 释放缓冲空间free(ioItem-OutBuffer);/ 关闭重叠事件句柄CloseHandle(ioItem-IoOverlapped.hEvent);/ 释放 ioItem 空间free(ioItem);return; ,73,74,a.2 使用Write方式写 SampleDevice.cpp void SampleDevice:SerialWrite(KIrp I) T.Trace(TraceInfo, _FUNCTION_“+. IRP %pn“, I);NTSTATUS status = STATUS_SUCCESS;PUCH

30、AR pBuffer = (PUCHAR)I.BufferedWriteSource();/取得存放应用程序写给驱动程序的数据的BUFF的指针ULONG writeSize = I.WriteSize( );/ 获得应用程序写给驱动程序的信息的字节数。ULONG bytesSent = 0;bytesSent = writeSize;char buff512;strcpy(buff, (char *)pBuffer); / 应用程序写给驱动程序的数据在I.BufferedWriteSource()返回的指针中。buffbytesSent = 0; T.Trace(TraceInfo,_FUNC

31、TION_ “Write to driver is %sn“, buff );I.Information() = bytesSent; / 返回用户实际写的字节数I.Status() = status;m_DriverManagedQueue.PnpNextIrp(I); ,75,控件IDC_OP_TYPE_COMBO及其选择项,我们这次选WriteFile,76,sampleIorw.cpp中有关写数据的代码:,ULONG sampleExecuteIo(HWND hDlg) PSAMPLE_LIST_ITEM ioItem; / 获得需要写的字节数 /GetDlgItemText(hDlg

32、, IDC_IN_SIZE_EDIT, str, MAX_STRING_LENGTH); / ioItem-InSize = _ttol(str); / 获得要写的字符串和要写的字节数GetDlgItemText(hDlg, IDC_IN_DATA_EDIT, str, MAX_STRING_LENGTH); / (VOID)_stscanf(str, _T(“%x“), ,77,/ Write data to driver if (!_tcscmp(str, _T(“ReadFile”) / if (!_tcscmp(str, _T(“WriteFile”) ,78,79,b.1 使用IO控

33、制代码方式读,SampleDevice.cpp,NTSTATUS sampleDevice:SAMPLE_IOCTL_Read_Handler(KIrp I) T.Trace(TraceInfo, _FUNCTION_“+. IRP %pn“, I);NTSTATUS status = STATUS_SUCCESS;ULONG inputSize = I.IoctlInputBufferSize();ULONG outputSize = I.IoctlOutputBufferSize();char buff1512; ULONG fwLength=0; strcpy(buff1,“Welcom

34、e to driver!”); /这是应用程序将要读到的字符串 fwLength = strlen(buff1)+1; if (outputSize = fwLength) / 如果读入缓冲够长strcpy(PCHAR)I.IoctlBuffer(),buff1); / 将信息拷给应用程序读入缓冲I.Information() = fwLength; / 返回信息长度 else I.Information() = 0; / 否则信息长度为0T.Trace(TraceInfo, _FUNCTION_“buff size too smalln“);,80,/ Buffered ioctl - us

35、ing the same buffer so read the buffer before writing the buffer /*PVOID inputBuffer = I.IoctlBuffer();PVOID outputBuffer = I.IoctlBuffer();if (FALSE)status = STATUS_INVALID_PARAMETER;I.Information() = 0;elseI.Information() = 0; */T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, _FUNCTION_“-. IRP

36、%p, STATUS %xn“, I, status);return status; ,81,sampleIorw.cpp中有关写数据的代码:,ULONG sampleExecuteIo(HWND hDlg) PSAMPLE_LIST_ITEM ioItem;if (!_tcscmp(str, _T(“SAMPLE_IOCTL_Read“) ,82,if (!DeviceIoControl(g_hDevice, / 设备句柄SAMPLE_IOCTL_Read, / IO控制命令ioItem-InBuffer, /写缓冲ioItem-InSize, /写缓冲大小ioItem-OutBuffer,

37、 /读缓冲ioItem-OutSize, /读缓冲大小NULL, /实际读的字节数 /if (!_tcscmp(str, _T(“SAMPLE_IOCTL_Read“) ,83,VOID sampleSAMPLE_IOCTL_ReadCompleteCallback(PVOID Context) PSAMPLE_LIST_ITEM ioItem = (PSAMPLE_LIST_ITEM)Context;char wstr1025;for(ULONG i=0;iOutSize;i+)wstri*2=ioItem-OutBufferi;wstri*2+1=0x0;wstri*2=wstri*2+1

38、=0;sampleOutputText(_T(“Executed SAMPLE_IOCTL_Read request: in buffer size (%d), out buffer size(%d), nreturn length (%d) error (%d) The string I readed is: %s“),ioItem-InSize, ioItem-OutSize, ioItem-ReturnLength, ioItem-Error, wstr); ,84,85,b.2 使用IO控制代码方式写,SampleDevice.cpp,NTSTATUS sampleDevice:SAM

39、PLE_IOCTL_Write_Handler(KIrp I) T.Trace(TraceInfo, _FUNCTION_“+. IRP %pn“, I);NTSTATUS status = STATUS_SUCCESS;ULONG inputSize = I.IoctlInputBufferSize();ULONG outputSize = I.IoctlOutputBufferSize();char buff512;strcpy(buff, (char *)I.IoctlBuffer(); / 应用程序写给驱动程序的数据在 I.BufferedWriteSource()返回的指针中。buf

40、finputSize = 0; T.Trace(TraceInfo,_FUNCTION_“ Write to driver is %sn“, buff );I.Information() = 0;,86,/ Buffered ioctl - using the same buffer so read the buffer before writing the buffer/ PVOID inputBuffer = I.IoctlBuffer();/ PVOID outputBuffer = I.IoctlBuffer(); /*if (FALSE)status = STATUS_INVALID

41、_PARAMETER;I.Information() = 0;elseI.Information() = 0;T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, _FUNCTION_“-. IRP %p, STATUS %xn“, I, status);return status; ,87,sampleIorw.cpp中有关写数据的代码:,ULONG sampleExecuteIo(HWND hDlg) /本页的修改实际上前面Write时已经改好 PSAMPLE_LIST_ITEM ioItem; / 获得需要写的字节数 /GetDlgItem

42、Text(hDlg, IDC_IN_SIZE_EDIT, str, MAX_STRING_LENGTH); / ioItem-InSize = _ttol(str); / 获得要写的字符串和要写的字节数GetDlgItemText(hDlg, IDC_IN_DATA_EDIT, str, MAX_STRING_LENGTH); / (VOID)_stscanf(str, _T(“%x“), ,88,if (!_tcscmp(str, _T(“SAMPLEIOCTL_Write”) /if (!_tcscmp(str, _T(“SAMPLEIOCTL_Write“) ,89,90,c. 使用IO

43、控制代码方式写并且读,SampleDevice.cpp,NTSTATUS sampleDevice:IOCTL_ReadWrite_Handler(KIrp I) Trace(TraceInfo, _FUNCTION_“+. IRP %pn“, I);NTSTATUS status = STATUS_SUCCESS;ULONG inputSize = I.IoctlInputBufferSize();ULONG outputSize = I.IoctlOutputBufferSize(); / Buffered ioctl - using the same buffer so read the

44、 buffer before writing the buffer / PVOID inputBuffer = I.IoctlBuffer(); / PVOID outputBuffer = I.IoctlBuffer();char buff512;strcpy(buff, (char *)I.IoctlBuffer(); / 取应用程序写给驱动程序的数据buffinputSize = 0; T.Trace(TraceInfo,_FUNCTION_“ Application write to driver is %sn“, buff );char buff1512; ULONG fwLengt

45、h=0; strcpy(buff1,“This is feedback from driver! Feedback string is “); strcat(buff1,buff);strcat(buff1,“n“);fwLength = strlen(buff1)+1;,91,if (outputSize = fwLength) / 如果读入缓冲够长strcpy(PCHAR)I.IoctlBuffer(),buff1); / 将信息拷给应用程序读入缓冲I.Information() = fwLength; / 返回信息长度 else I.Information() = 0; / 否则信息长度

46、为0T.Trace(TraceInfo, _FUNCTION_“buff size too smalln“); /* if (FALSE) status = STATUS_INVALID_PARAMETER;I.Information() = 0;else I.Information() = 0; */T.Trace(NT_SUCCESS(status)?TraceInfo:TraceWarning, _FUNCTION_“-. IRP %p, STATUS %xn“, I, status);return status; ,92,sampleIorw.cpp中有关读写数据的代码:,ULONG

47、sampleExecuteIo(HWND hDlg) /本页的修改实际上前面Write时已经改好 PSAMPLE_LIST_ITEM ioItem; / 获得需要写的字节数 /GetDlgItemText(hDlg, IDC_IN_SIZE_EDIT, str, MAX_STRING_LENGTH); / ioItem-InSize = _ttol(str); / 获得要写的字符串和要写的字节数GetDlgItemText(hDlg, IDC_IN_DATA_EDIT, str, MAX_STRING_LENGTH); / (VOID)_stscanf(str, _T(“%x“), ,93,i

48、f (!_tcscmp(str, _T(“IOCTL_ReadWrite”) /if (!_tcscmp(str, _T(“SAMPLEIOCTL_Write“) ,94,VOID sampleIOCTL_ReadWriteCompleteCallback(PVOID Context) PSAMPLE_LIST_ITEM ioItem = (PSAMPLE_LIST_ITEM)Context; / 因VS.net隐含采用Unicode编码,每个字符16位,下面做8位到16位字符转换char wstr1025;for(ULONG i=0;iOutSize;i+)wstri*2=ioItem-OutBufferi;wstri*2+1=0x0;wstri*2=wstri*2+1=0;sampleOutputText(_T(“Executed IOCTL_ReadWrite request: in buffer size (%d), out buffer size (%d), nreturn length (%d) error (%d) The string I readed is: %s“),ioItem-InSize, ioItem-OutSize, ioItem-ReturnLength,ioItem-Error, wstr ); ,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报