windows xp驱动程序编写方法课件.ppt

上传人:小飞机 文档编号:3908232 上传时间:2023-03-27 格式:PPT 页数:109 大小:2.66MB
返回 下载 相关 举报
windows xp驱动程序编写方法课件.ppt_第1页
第1页 / 共109页
windows xp驱动程序编写方法课件.ppt_第2页
第2页 / 共109页
windows xp驱动程序编写方法课件.ppt_第3页
第3页 / 共109页
windows xp驱动程序编写方法课件.ppt_第4页
第4页 / 共109页
windows xp驱动程序编写方法课件.ppt_第5页
第5页 / 共109页
点击查看更多>>
资源描述

《windows xp驱动程序编写方法课件.ppt》由会员分享,可在线阅读,更多相关《windows xp驱动程序编写方法课件.ppt(109页珍藏版)》请在三一办公上搜索。

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

2、3来开发驱动程序。为了方便起见,也可以使用第三方的开发工具DriverStudio,它将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型驱动程序。Windows 2003 DDK

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

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

5、iverSockets)的 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,DriverMonitorDriverMonitor不仅可以显示WDM和VxD在操作系统核心层次输出的调试语句,还可以装载和卸载VxD驱动和NT4系统的驱动程序。,EZDriverInstaller这是一个无需经过设备管理器或“添加新硬件”功能就能为Windows 2000/XP动态加载和卸载WDM驱动程序的小实用程序。,SetDDKGo用来设置设备驱动程序创建的环境。当我们用Visual Studio(VC+)编译驱动程序源程序的时

7、候,需要用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:Microsoft XP DDK,Visual C+.NET,10,安装步骤:在安装Dri

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

10、变量,并监测相应的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安装后的设置:1)使用DDK Build Setting工具定义BASEDIR环境变量并启动MSVC.N

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

12、NET中启动DriverWizard),22,23,工程文件名,工程文件目录,24,选择驱动类型,选择框架类型,25,创建功能驱动程序,创建过滤器驱动程序,26,选择相应总线,本例不驱动硬件,27,选择需要处理的消息句柄,28,添加和应用程序之间通信的控制代码,29,30,31,32,33,34,35,36,37,38,39,驱动类,设备类,队列管理类,40,驱动类文件,设备类文件,测试用的控制台程序文件,驱动安装指导文件,队列管理类,41,此时已经具备了一个驱动程序以及做测试用的应用程序的基本框架,我们可以在VC集成环境下修改有关程序,增加相关的具体操作代码,然后就可以编译和调试了。,42,

13、该驱动程序框架包含了几个最基本的类,这些类是:class SampleDriver:public KDriver/驱动程序类,用于初始化驱动程序 SAFE_DESTRUCTORSpublic:/以下成员函数注意和WDM中有关例程联系起来看 virtual NTSTATUS DriverEntry(PUNICODE_STRING RegistryPath);virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo);virtual VOID Unload(VOID);void LoadRegistryParameters(PUNICODE_STRING Regi

14、stryPath);protected:/成员数据 int m_Unit;,43,class SampleDevice:public KPnpDevice/是设备类KDvice的派生类,用于在WDM环境下支持即插即用设备/Constructorspublic:SAFE_DESTRUCTORS;SampleDevice(PDEVICE_OBJECT Pdo,ULONG Unit);SampleDevice();VOID Invalidate(void);/Member Functions 注意和PNP的次功能代码联系起来看DEVMEMBER_DISPATCHERSvirtual NTSTATUS

15、 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 DefaultPower(KIrp I);void LoadRegistryParameters();/取注册表信息,44,void

16、 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 DataKPnpLowerDevicem_Lower;sampleQueueReadQueue;/Driver managed IRP queuesampleQueueWriteQueue;/Driver

17、 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_ONLYvirtual NTSTATUS DeviceControl(KIrp I);/COMMENT_ONLYvirtual NTSTATUS SystemControl(KIr

18、p I);/COMMENT_ONLY#endif/_COMMENT_ONLY;,45,由于一个可能是DriverStudio 3.2中的BUG,所以及时生成的一个空工程项目也无法编译通过,需要对生成的工程文件做以下手工修改:把sample项目中的sources文件中的:TARGETLIBS=$(DDK_LIB_PATH)ntstrsafe.lib$(DDK_LIB_PATH)csq.lib 这一行去掉就可以编译通过了,46,先编译驱动程序工程,在VS2002的集成环境中,下面我们讲解编译、执行和调试这个驱动程序。,生成目标文件,47,确认生成的是驱动程序,48,在VS2002的集成环境中,生成

19、目标文件,再编译测试应用程序工程,49,确认生成的是测试用应用程序,50,下面使用DriverStudio带的工具加载驱动程序和查看调试信息。,驱动程序监视,可实时看到驱动程序发出的调试输出语句,驱动程序装载器,可动态调用驱动程序,51,驱动程序监视器界面,52,为了防止其他驱动程序的干扰,在Filter Message对话框中设置消息过滤规则,只让有sample的消息通过。,53,驱动程序装载器界面,54,55,56,57,驱动程序已经加载并且启动,58,YANGQS,59,DriverStudio 3.2给出的驱动测试软件是一个Win32的窗口程序,而不是先前版本的控制台程序。为了在调试输

20、出的时候有所区别我们将测试程序的调试输出语句的句头由原来的sample:改成sampleAPP:(在sampleAPP.cpp文件中),VOID sampleOutputText(LPCTSTR Format,.)TCHAR strMAX_STRING_LENGTH;va_list vaList;va_start(vaList,Format);_vstprintf(str,Format,vaList);OutputDebugString(_T(sampleAPP:);OutputDebugString(str);OutputDebugString(_T(n);va_end(vaList);re

21、turn;,60,运行编译好的sampleAPP.exe,61,62,如果在执行sampleAPP.exe之前,驱动程序sample.sys还没有加载到内存中,则在DriverMonitor程序中就可以看到以下信息:,63,APP中打开与驱动程序联系,64,65,结束后一定要卸载驱动程序,66,驱动程序已经卸载,67,下面我们来修改有关代码,以便增加驱动程序和应用程序之间相互通信的内容。需要增加的内容包括:,使用Read和Write方式分别从驱动程序读入字符和 向驱动程序写字符。使用IO控制代码方式分别从驱动程序读入字符和 向驱动程序写字符。使用IO控制代码方式向驱动程序写字符串再从驱动程序中

22、读出该字符串,并返回反馈串信息。,注意:程序中暗红色显示的部分是我们添加或修改过的语句,其他是DriverWorks自动生成的。蓝色显示的部分是要删除的语句。省略号的部分是不变的。语句中T.Trace(TraceInfo,_FUNCTION_“xxxx”)这样的语句是向调试软件输出信息,该信息可在DriverMonitor或其他调试监视器中看到。,2)完成应用程序和驱动程序之间的信息交换,68,a.1 使用Read方式读SampleDevice.cppvoid SampleDevice:SerialRead(KIrp I)T.Trace(TraceInfo,_FUNCTION_+.IRP%pn

23、,I);NTSTATUS status=STATUS_SUCCESS;PUCHARpBuffer=(PUCHAR)I.BufferedReadDest();/取得返回数据BUFF的指针ULONG readSize=I.ReadSize();/获得应用程序希望读驱动程序信息的字节数。ULONG bytesRead=0;char buff512;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);/把给应用程序的数据拷贝给返回BUFF T.T

24、race(TraceInfo,_FUNCTION_ The string you will read is%sn,buff);/输出调试信息bytesRead=strlen(buff);/Count of bytes read I.Information()=bytesRead;/返回给应用程序的信息的字节个数I.Status()=status;m_DriverManagedQueue.PnpNextIrp(I);,69,控件IDC_OP_TYPE_COMBO及其选择项,我们这次选ReadFile,70,sampleIorw.cpp中有关读数据的代码:,ULONG sampleExecuteI

25、o(HWND hDlg)PSAMPLE_LIST_ITEM ioItem;/获得需要读的字节数 GetDlgItemText(hDlg,IDC_OUT_SIZE_EDIT,str,MAX_STRING_LENGTH);ioItem-OutSize=_ttol(str);/设置控件IDC_OP_TYPE_COMBO的句柄 hWnd=GetDlgItem(hDlg,IDC_OP_TYPE_COMBO);/获得当前被选中项目的索引 itemIndex=(DWORD)SendMessage(hWnd,CB_GETCURSEL,0,0);/获得被选中的项目的字符串 SendMessage(hWnd,CB

26、_GETLBTEXT,(WPARAM)itemIndex,(LPARAM)str);if(!_tcscmp(str,_T(“ReadFile”),71,/从驱动程序读数据 if(!ReadFile(g_hDevice,/设备句柄 ioItem-OutBuffer,/输入缓冲地址 ioItem-OutSize,/缓冲大小(字节数)NULL,/实际读的数据字节数/if(!_tcscmp(str,_T(“ReadFile”),72,VOID sampleReadCompleteCallback(PVOID Context)/读驱动程序的回调函数 PSAMPLE_LIST_ITEM ioItem=(P

27、SAMPLE_LIST_ITEM)Context;/因VS.net隐含采用Unicode编码,每个字符16位,下面做8位到16位字符转换 char wstr1025;for(ULONG i=0;iOutSize;i+)wstri*2=ioItem-OutBufferi;wstri*2+1=0 x0;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-Retu

28、rnLength,ioItem-Error,wstr);/输出读到的字符串 sampleOutputBuffer(ioItem-OutBuffer,ioItem-ReturnLength);/释放缓冲空间 free(ioItem-OutBuffer);/关闭重叠事件句柄 CloseHandle(ioItem-IoOverlapped.hEvent);/释放 ioItem 空间 free(ioItem);return;,73,74,a.2 使用Write方式写SampleDevice.cppvoid SampleDevice:SerialWrite(KIrp I)T.Trace(TraceInf

29、o,_FUNCTION_+.IRP%pn,I);NTSTATUS status=STATUS_SUCCESS;PUCHAR pBuffer=(PUCHAR)I.BufferedWriteSource();/取得存放应用程序写给驱动程序的数据的BUFF的指针ULONG writeSize=I.WriteSize();/获得应用程序写给驱动程序的信息的字节数。ULONG bytesSent=0;bytesSent=writeSize;char buff512;strcpy(buff,(char*)pBuffer);/应用程序写给驱动程序的数据在I.BufferedWriteSource()返回的指

30、针中。buffbytesSent=0;T.Trace(TraceInfo,_FUNCTION_ 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;/获得需

31、要写的字节数/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),77,/Write data to driverif(!_tcscmp(str,_T(“ReadFile”)/if(!_tcscmp(str,_T(“WriteFile”),78,79,b.1 使用IO控制

32、代码方式读,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,“Welcome to driver!”);/

33、这是应用程序将要读到的字符串 fwLength=strlen(buff1)+1;if(outputSize=fwLength)/如果读入缓冲够长 strcpy(PCHAR)I.IoctlBuffer(),buff1);/将信息拷给应用程序读入缓冲 I.Information()=fwLength;/返回信息长度 else I.Information()=0;/否则信息长度为0 T.Trace(TraceInfo,_FUNCTION_buff size too smalln);,80,/Buffered ioctl-using the same buffer so read the buffer

34、 before writing the buffer/*PVOID inputBuffer=I.IoctlBuffer();PVOID outputBuffer=I.IoctlBuffer();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;,81,sampleIorw.cp

35、p中有关写数据的代码:,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,/读缓冲 ioItem-OutSize,/读缓冲大小 NULL,/实际读的字节数/if(!_tcscmp(str,_T(SAMPLE_IO

36、CTL_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=0 x0;wstri*2=wstri*2+1=0;sampleOutputText(_T(“Executed SAMPLE_IOCTL_Read request:in buffer size(%d),

37、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:SAMPLE_IOCTL_Write_Handler(KIrp I)T.Trace(TraceInfo,_FUNCTION_+.IRP%pn,I);NTSTATUS status=STATUS

38、_SUCCESS;ULONG inputSize=I.IoctlInputBufferSize();ULONG outputSize=I.IoctlOutputBufferSize();char buff512;strcpy(buff,(char*)I.IoctlBuffer();/应用程序写给驱动程序的数据在 I.BufferedWriteSource()返回的指针中。buffinputSize=0;T.Trace(TraceInfo,_FUNCTION_ Write to driver is%sn,buff);I.Information()=0;,86,/Buffered ioctl-us

39、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%p,STATUS%xn,I,st

40、atus);return status;,87,sampleIorw.cpp中有关写数据的代码:,ULONG 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

41、);/(VOID)_stscanf(str,_T(%x),88,if(!_tcscmp(str,_T(“SAMPLEIOCTL_Write”)/if(!_tcscmp(str,_T(SAMPLEIOCTL_Write),89,90,c.使用IO控制代码方式写并且读,SampleDevice.cpp,NTSTATUS sampleDevice:IOCTL_ReadWrite_Handler(KIrp I)Trace(TraceInfo,_FUNCTION_+.IRP%pn,I);NTSTATUS status=STATUS_SUCCESS;ULONG inputSize=I.IoctlInput

42、BufferSize();ULONG outputSize=I.IoctlOutputBufferSize();/Buffered ioctl-using the same buffer so read the buffer before writing the buffer/PVOID inputBuffer=I.IoctlBuffer();/PVOID outputBuffer=I.IoctlBuffer();char buff512;strcpy(buff,(char*)I.IoctlBuffer();/取应用程序写给驱动程序的数据 buffinputSize=0;T.Trace(Tra

43、ceInfo,_FUNCTION_ Application write to driver is%sn,buff);char buff1512;ULONG fwLength=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

44、.Information()=fwLength;/返回信息长度else I.Information()=0;/否则信息长度为0 T.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 statu

45、s;,92,sampleIorw.cpp中有关读写数据的代码:,ULONG 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

46、(str,_T(%x),93,if(!_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=ioIte

47、m-OutBufferi;wstri*2+1=0 x0;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);,95,96,3)直接对端口寄存器读写,DriverStudio提供了KIo

48、Range类来将外部总线的I/O地址空间范围映射到处理器总线的地址空间范围。,该类的成员函数主要有KIoRange 构造函数(4 种格式)Initialize 初始化和重新初始化一个实例(3种格式)KIoRange 析构函数Invalidate 从已初始化状态删除该对象IsValid 测试该对象是否已经初始化inb 读一个或多个字节(2 种形式)Outb写一个或多个字节(2 种形式)Inw读一个或多个字(2 种形式)Outw写一个或多个字(2 种形式)ind 读一个或多个双字(2 种形式)outd 写一个或多个双字(2 种形式),97,KIoRange:KIoRange(只介绍WDM形式)FO

49、RM 3(WDM):KIoRange(ULONGLONG CpuPhysicalAddress,/转换成外围设备地址的CPU总线上的物理地址 BOOLEAN InCpuIoSpace,/如果IO范围是在CPU总线的IO空间中为TRUE,否则为FALSE ULONG Count,/以字节计的区域的大小 BOOLEAN MapToSystemVirtual=TRUE/指定是否需要构造函数创建一个非页系统空间的地址空间映射,如果驱动程序读写设备中的数据,就需要这种映射);FORM 4(WDM):(注意:这种形式不被 DriverStudio 2.0支持。)KIoRange(PCM_RESOURCE_

50、LIST pTranslatedResourceList,/指向转换资源表的指针 ULONG Ordinal=0,/指定pTranslatedResourceList指向的资源列表中的一个特殊端口资源 BOOLEAN MapToSystemVirtual=TRUE);FORM 5(WDM):KIoRange(PCM_RESOURCE_LIST pTranslatedResourceList,/可通过KIrp:TranslatedResources获得 PCM_RESOURCE_LIST pRawResourceList,/指向原始资源表的指针 ULONG Ordinal=0,BOOLEAN M

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号