WindowsXP驱动程序编写方法.ppt

上传人:sh****n 文档编号:6569653 上传时间:2020-02-29 格式:PPT 页数:109 大小:2.85MB
返回 下载 相关 举报
WindowsXP驱动程序编写方法.ppt_第1页
第1页 / 共109页
WindowsXP驱动程序编写方法.ppt_第2页
第2页 / 共109页
WindowsXP驱动程序编写方法.ppt_第3页
第3页 / 共109页
点击查看更多>>
资源描述
1 WindowsXP驱动程序编写方法 StepbyStep 东南大学计算机科学与工程学院杨全胜 VS NET WINXPDDK DriverStudio3 2开发环境版 2 本电子讲义可以作为几年前本人所写的 驱动开发 上 下电子讲义的后续篇 主要是将开发平台从Windows98 2000 DriverStudio2 7升级到以下环境 WindowsXPSP2VisualStudio NET VC NET2002 简体中文版 WindowsXPDDK DriverStudio3 2 1 驱动程序的开发环境 以上四项中 前3项为Microsoft公司产品 可以只用2 3来开发驱动程序 为了方便起见 也可以使用第三方的开发工具DriverStudio 它将DDK的内容封装成类 而且提供一个快速方便地生成驱动框架的工具 3 2版本可能是Compuware公司推出的最后一个版本 3 通常 开发不同操作系统下的驱动程序需要不同的DDK做支持 Windows2000DDK适合开发Windows2000 98 Me的WDM驱动程序 Windows2000下NT4型驱动程序 WindowsXPDDK适合开发IA64下的驱动程序或WindowsXP 2000 Me的WDM驱动程序 WindowsXP下NT4型驱动程序 Windows2003DDK适合开发AMD64 IA64下的驱动程序或Windows2003 XP 2000 Me的WDM驱动程序 Windows2003 XP 2000下NT4型驱动程序 本电子讲义假设大家已经会VC 编程及熟悉VSIDE的使用 4 2 驱动程序开发工具包DriverStudio 2 1DriverStudio3 2所包含的工具 VToolsDVToolsD是一个用来开发针对Win9X Windows95和Windows98 操作系统下设备驱动程序 VxD 的工具 VToolsD中包括生成驱动程序源代码的工具 run time和interface库 以及一些可以用来作为各种类型的设备驱动程序基础的驱动程序样本 DriverWorksDriverWorks提供针对WindowsNT4和Win32驱动模型 WDM 的设备驱动程序开发的完全支持 DriverWorks中包含一个非常完善的源代码生成工具 DriverWizard 以及相应的类库和驱动程序样本 它提供了在C 下进行设备驱动程序开发的支持 它可以集成到msvc6和中 还需要最新的WindowsDDK的支持 5 DriverNetworksDriverNetworks是针对Windows网络驱动开发人员的一个模块 它的核心部分 是一个针对NDISdrivers和TDIclients DriverSockets 的C 的类库 DriverNetworks中也有QuickMiniportWizard用来直接开始一个NDISMiniport Intermediate或协议驱动程序工程 它可以让你在采用DriverNetworksC 类库编写NDIS驱动程序的时候 快速的生成编译 安装和调试所需要的所有文件 它可以集成到msvc6和中 还需要最新的WindowsDDK的支持 6 SoftICE系列调试器SoftICE系列调试器包含了可以调试各种代码的多种工具 它可以调试诸如BIOS代码 中断例程以及系统I O 这些工具与强大的硬件调试板一起支持符号级调试 可以显示源码 全局或局部数据 其中 SoftICE是单机调试器 调试本机代码 VisualSoftICE是双机调试器 支持64位和32位平台上的微软操作系统 7 DriverMonitorDriverMonitor不仅可以显示WDM和VxD在操作系统核心层次输出的调试语句 还可以装载和卸载VxD驱动和NT4系统的驱动程序 EZDriverInstaller这是一个无需经过设备管理器或 添加新硬件 功能就能为Windows2000 XP动态加载和卸载WDM驱动程序的小实用程序 SetDDKGo用来设置设备驱动程序创建的环境 当我们用VisualStudio VC 编译驱动程序源程序的时候 需要用SetDDKGo来设置环境变量 之后SetDDKGo会自动启动VisualStudio VC 编译环境 8 DriverWorkbench这是DriverStudio以及用户工具的集成环境和宿主 DS的大多数工具全部被集成到这个开发环境中 BoundsCheckerDriverEdition它提供了参数验证和系统测试来检测和跟踪不同的设备驱动程序与其他操作系统模块之间的交互 配置 TrueTimeDriverEdition这是一个能让WindowsNT 2000 XP设备驱动程序的编写者确定驱动程序性能瓶颈的性能分析工具 对于编写设备驱动程序或核心代码的程序员 这很有用 TrueCoverageDriverEdition它能帮助程序员检测其代码的哪部分被测试过 哪部分还需要测试 可帮助程序员提高程序的稳定性 9 2 2DriverStudio3 2的安装 安装需要的软硬件环境 Intelx86兼容系统或X64系统 包含IA64和AMD64以及Itanium WindowsXP内存 最少256MB 推荐使用512MB硬盘 完全安装需要大约182MB针对SoftICE的远程调试 NE2000 兼容网卡或3Com网卡针对DriverWorks MicrosoftXPDDK VisualC NET 10 安装步骤 在安装DriverWorks之前 首先要保证你的计算机上已经安装了MicrosoftVisualC NET以及WindowsXPDDK 所有这些包括DriverStudio的安装都必须以系统管理员身份启动系统 并且要按照下面的顺序安装 11 第二步 安装WindowsXPDDK DriverDevelopmentKits 注意 1 在安装DDK的时候请选择完全安装 2 安装中 不需要安装64BITIA64Binaries3 安装好后 对于XPDDK不需要手动配置环境变量 只需在开始菜单中点击CheckedBuildEnvirment则DDK会自动调用setenv配置环境变量 并监测相应的SDK以及VisualStudio NETIDE 第一步 安装VisualStudioC NET 第三步 安装DriverStudio3 2 按照安装提示安装 12 DriverStudio3 2支持单机调试或双机调试两种模式 在安装的时候也有Host和Target两种模式 单机调试需要在同一个机器中将Host和Target两种模式都安装双机调试的时候需要在一个机器上安装Host模式 在另一个机器上安装Target模式 13 DriverStudio安装后的设置 1 使用DDKBuildSetting工具定义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 NET中启动DriverWorks 21 3 DriverWorks的使用 1 生成简单框架 VS NET中启动DriverWizard 22 23 工程文件名 工程文件目录 24 选择驱动类型 选择框架类型 25 创建功能驱动程序 创建过滤器驱动程序 26 选择相应总线 本例不驱动硬件 27 选择需要处理的消息句柄 28 添加和应用程序之间通信的控制代码 29 30 31 32 33 34 35 36 37 38 39 驱动类 设备类 队列管理类 40 驱动类文件 设备类文件 测试用的控制台程序文件 驱动安装指导文件 队列管理类 41 此时已经具备了一个驱动程序以及做测试用的应用程序的基本框架 我们可以在VC集成环境下修改有关程序 增加相关的具体操作代码 然后就可以编译和调试了 42 该驱动程序框架包含了几个最基本的类 这些类是 classSampleDriver publicKDriver 驱动程序类 用于初始化驱动程序 SAFE DESTRUCTORSpublic 以下成员函数注意和WDM中有关例程联系起来看virtualNTSTATUSDriverEntry PUNICODE STRINGRegistryPath virtualNTSTATUSAddDevice PDEVICE OBJECTPdo virtualVOIDUnload VOID voidLoadRegistryParameters PUNICODE STRINGRegistryPath protected 成员数据intm Unit 43 classSampleDevice publicKPnpDevice 是设备类KDvice的派生类 用于在WDM环境下支持即插即用设备 Constructorspublic SAFE DESTRUCTORS SampleDevice PDEVICE OBJECTPdo ULONGUnit SampleDevice VOIDInvalidate void MemberFunctions注意和PNP的次功能代码联系起来看DEVMEMBER DISPATCHERSvirtualNTSTATUSOnStartDevice KIrpI virtualNTSTATUSOnStopDevice KIrpI virtualNTSTATUSOnRemoveDevice KIrpI virtualNTSTATUSOnDevicePowerUp KIrpI virtualNTSTATUSOnDeviceSleep KIrpI virtualNTSTATUSDefaultPnp KIrpI virtualNTSTATUSDefaultPower KIrpI voidLoadRegistryParameters 取注册表信息 44 voidSerialRead KIrpI voidSerialWrite KIrpI NTSTATUSSAMPLE IOCTL Read Handler KIrpI NTSTATUSSAMPLE IOCTL Write Handler KIrpI NTSTATUSSAMPLE IOCTL ReadWrite Handler KIrpI protected MemberDataKPnpLowerDevicem Lower sampleQueueReadQueue DrivermanagedIRPqueuesampleQueueWriteQueue DrivermanagedIRPqueue ifdef COMMENT ONLYvirtualNTSTATUSCreate KIrpI COMMENT ONLYvirtualNTSTATUSClose KIrpI COMMENT ONLYvirtualNTSTATUSRead KIrpI COMMENT ONLYvirtualNTSTATUSWrite KIrpI COMMENT ONLYvirtualNTSTATUSDeviceControl KIrpI COMMENT ONLYvirtualNTSTATUSSystemControl KIrpI COMMENT ONLY endif COMMENT ONLY 45 由于一个可能是DriverStudio3 2中的BUG 所以及时生成的一个空工程项目也无法编译通过 需要对生成的工程文件做以下手工修改 把sample项目中的sources文件中的 TARGETLIBS DDK LIB PATH ntstrsafe lib DDK LIB PATH csq lib这一行去掉就可以编译通过了 46 先编译驱动程序工程 在VS2002的集成环境中 下面我们讲解编译 执行和调试这个驱动程序 生成目标文件 47 确认生成的是驱动程序 48 在VS2002的集成环境中 生成目标文件 再编译测试应用程序工程 49 确认生成的是测试用应用程序 50 下面使用DriverStudio带的工具加载驱动程序和查看调试信息 驱动程序监视 可实时看到驱动程序发出的调试输出语句 驱动程序装载器 可动态调用驱动程序 51 驱动程序监视器界面 52 为了防止其他驱动程序的干扰 在FilterMessage对话框中设置消息过滤规则 只让有sample的消息通过 53 驱动程序装载器界面 54 55 56 57 驱动程序已经加载并且启动 58 YANGQS 59 DriverStudio3 2给出的驱动测试软件是一个Win32的窗口程序 而不是先前版本的控制台程序 为了在调试输出的时候有所区别我们将测试程序的调试输出语句的句头由原来的sample 改成sampleAPP 在sampleAPP cpp文件中 VOIDsampleOutputText LPCTSTRFormat TCHARstr MAX STRING LENGTH va listvaList va start vaList Format vstprintf str Format vaList 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 下面我们来修改有关代码 以便增加驱动程序和应用程序之间相互通信的内容 需要增加的内容包括 使用Read和Write方式分别从驱动程序读入字符和向驱动程序写字符 使用IO控制代码方式分别从驱动程序读入字符和向驱动程序写字符 使用IO控制代码方式向驱动程序写字符串再从驱动程序中读出该字符串 并返回反馈串信息 注意 程序中暗红色显示的部分是我们添加或修改过的语句 其他是DriverWorks自动生成的 蓝色显示的部分是要删除的语句 省略号的部分是不变的 语句中T Trace TraceInfo FUNCTION xxxx 这样的语句是向调试软件输出信息 该信息可在DriverMonitor或其他调试监视器中看到 2 完成应用程序和驱动程序之间的信息交换 68 a 1使用Read方式读SampleDevice cppvoidSampleDevice SerialRead KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS PUCHARpBuffer PUCHAR I BufferedReadDest 取得返回数据BUFF的指针ULONGreadSize I ReadSize 获得应用程序希望读驱动程序信息的字节数 ULONGbytesRead 0 charbuff 512 intn 512 j n 26 for inti 0 i n i j j 1 26 buff i a j buff readSize 0 指定串尾strcpy char pBuffer buff 把给应用程序的数据拷贝给返回BUFFT Trace TraceInfo FUNCTION Thestringyouwillreadis s n buff 输出调试信息bytesRead strlen buff CountofbytesreadI Information bytesRead 返回给应用程序的信息的字节个数I Status status m DriverManagedQueue PnpNextIrp I 69 控件IDC OP TYPE COMBO及其选择项 我们这次选ReadFile 70 sampleIorw cpp中有关读数据的代码 ULONGsampleExecuteIo HWNDhDlg PSAMPLE LIST ITEMioItem 获得需要读的字节数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 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 VOIDsampleReadCompleteCallback PVOIDContext 读驱动程序的回调函数PSAMPLE LIST ITEMioItem PSAMPLE LIST ITEM Context 因VS net隐含采用Unicode编码 每个字符16位 下面做8位到16位字符转换charwstr 1025 for ULONGi 0 iOutSize i wstr i 2 ioItem OutBuffer i wstr i 2 1 0 x0 wstr i 2 wstr i 2 1 0 sampleOutputText T ExecutedReadFile buffersize d returnlength d error d ThestringIreadis s ioItem OutSize ioItem ReturnLength 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 cppvoidSampleDevice SerialWrite KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS PUCHARpBuffer PUCHAR I BufferedWriteSource 取得存放应用程序写给驱动程序的数据的BUFF的指针ULONGwriteSize I WriteSize 获得应用程序写给驱动程序的信息的字节数 ULONGbytesSent 0 bytesSent writeSize charbuff 512 strcpy buff char pBuffer 应用程序写给驱动程序的数据在I BufferedWriteSource 返回的指针中 buff bytesSent 0 T Trace TraceInfo FUNCTION Writetodriveris s n buff I Information bytesSent 返回用户实际写的字节数I Status status m DriverManagedQueue PnpNextIrp I 75 控件IDC OP TYPE COMBO及其选择项 我们这次选WriteFile 76 sampleIorw cpp中有关写数据的代码 ULONGsampleExecuteIo HWNDhDlg PSAMPLE LIST ITEMioItem 获得需要写的字节数 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 Writedatatodriverif tcscmp str T ReadFile if tcscmp str T WriteFile 78 79 b 1使用IO控制代码方式读 SampleDevice cpp NTSTATUSsampleDevice SAMPLE IOCTL Read Handler KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS ULONGinputSize I IoctlInputBufferSize ULONGoutputSize I IoctlOutputBufferSize charbuff1 512 ULONGfwLength 0 strcpy buff1 Welcometodriver 这是应用程序将要读到的字符串fwLength strlen buff1 1 if outputSize fwLength 如果读入缓冲够长strcpy PCHAR I IoctlBuffer buff1 将信息拷给应用程序读入缓冲I Information fwLength 返回信息长度 else I Information 0 否则信息长度为0T Trace TraceInfo FUNCTION buffsizetoosmall n 80 Bufferedioctl usingthesamebuffersoreadthebufferbeforewritingthebuffer PVOIDinputBuffer I IoctlBuffer PVOIDoutputBuffer 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 x n I status returnstatus 81 sampleIorw cpp中有关写数据的代码 ULONGsampleExecuteIo HWNDhDlg PSAMPLE LIST ITEMioItem 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 IOCTL Read 83 VOIDsampleSAMPLE IOCTL ReadCompleteCallback PVOIDContext PSAMPLE LIST ITEMioItem PSAMPLE LIST ITEM Context charwstr 1025 for ULONGi 0 iOutSize i wstr i 2 ioItem OutBuffer i wstr i 2 1 0 x0 wstr i 2 wstr i 2 1 0 sampleOutputText T ExecutedSAMPLE IOCTL Readrequest inbuffersize d outbuffersize d nreturnlength d error d ThestringIreadedis s ioItem InSize ioItem OutSize ioItem ReturnLength ioItem Error wstr 84 85 b 2使用IO控制代码方式写 SampleDevice cpp NTSTATUSsampleDevice SAMPLE IOCTL Write Handler KIrpI T Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS ULONGinputSize I IoctlInputBufferSize ULONGoutputSize I IoctlOutputBufferSize charbuff 512 strcpy buff char I IoctlBuffer 应用程序写给驱动程序的数据在I BufferedWriteSource 返回的指针中 buff inputSize 0 T Trace TraceInfo FUNCTION Writetodriveris s n buff I Information 0 86 Bufferedioctl usingthesamebuffersoreadthebufferbeforewritingthebuffer PVOIDinputBuffer I IoctlBuffer PVOIDoutputBuffer 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 x n I status returnstatus 87 sampleIorw cpp中有关写数据的代码 ULONGsampleExecuteIo HWNDhDlg 本页的修改实际上前面Write时已经改好 PSAMPLE LIST ITEMioItem 获得需要写的字节数 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 88 if tcscmp str T SAMPLEIOCTL Write if tcscmp str T SAMPLEIOCTL Write 89 90 c 使用IO控制代码方式写并且读 SampleDevice cpp NTSTATUSsampleDevice IOCTL ReadWrite Handler KIrpI Trace TraceInfo FUNCTION IRP p n I NTSTATUSstatus STATUS SUCCESS ULONGinputSize I IoctlInputBufferSize ULONGoutputSize I IoctlOutputBufferSize Bufferedioctl usingthesamebuffersoreadthebufferbeforewritingthebuffer PVOIDinputBuffer I IoctlBuffer PVOIDoutputBuffer I IoctlBuffer charbuff 512 strcpy buff char I IoctlBuffer 取应用程序写给驱动程序的数据buff inputSize 0 T Trace TraceInfo FUNCTION Applicationwritetodriveris s n buff charbuff1 512 ULONGfwLength 0 strcpy buff1 Thisisfeedbackfromdriver Feedbackstringis 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 否则信息长度为0T Trace TraceInfo FUNCTION buffsizetoosmall n if FALSE status STATUS INVALID PARAMETER I Information 0 else I Information 0 T Trace NT SUCCESS status TraceInfo TraceWarning FUNCTION IRP p STATUS x n I status returnstatus 92 sampleIorw cpp中有关读写数据的代码 ULONGsampleExecuteIo HWNDhDlg 本页的修改实际上前面Write时已经改好 PSAMPLE LIST ITEMioItem 获得需要写的字节数 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 if tcscmp str T IOCTL ReadWrite if tcscmp str T SAMPLEIOCTL Write 94 VOIDsampleIOCTL ReadWriteCompleteCallback PVOIDContext PSAMPLE LIST ITEMioItem PSAMPLE LIST ITEM Context 因VS net隐含采用Unicode编码 每个字符16位 下面做8位到16位字符转换charwstr 1025 for ULONGi 0 iOutSize i wstr i 2 ioItem OutBuffer i wstr i 2 1 0 x0 wstr i 2 wstr i 2 1 0 sampleOutputText T ExecutedIOCTL ReadWriterequest inbuffersize d outbuffersize d nreturnlength d error d ThestringIreadedis s ioItem InSize ioItem OutSize ioItem ReturnLength ioItem Error wstr 95 96 3 直接对端口寄存器读写 DriverStudio提供了KIoRange类来将外部总线的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形式 FORM3 WDM KIoRange ULONGLONGCpuPhysicalAddress 转换成外围设备地址的CPU总线上的物理地址BOOLEANInCpuIoSpace 如果IO范围是在CPU总线的IO空间中为TRUE 否则为FALSEULONGCount 以字节计的区域的大小BOOLEANMapToSystemVirtual TRUE 指定是否需要构造函数创建一个非页系统空间的地址空间映射 如果驱动程序读写设备中的数据 就需要这种映射 FORM4 WDM 注意 这种形式不被DriverStudio2 0支持 KIoRange PCM RESOURCE LISTpTranslatedResourceList 指向转换资源表的指针ULONGOrdinal 0 指定pTranslatedResourceList指向的资源列表中的一个特殊端口资源BOOLEANMapToSystemVirtual TRUE FORM5 WDM KIoRange PCM RESOURCE LISTpTranslatedResourceList 可通过KIrp TranslatedResources获得PCM RESOURCE LISTpRawResourceList 指向原始资源表的指针ULONGOrdinal 0 BOOLEANMapToSystemVirtual TRUE 构造KIoRange类 98 KIoRange Initialize 只介绍WDM形式 FORM2 WDM NTSTATUSInitialize ULONGLONGCpuPhysicalAddress BOOLEANInCpuIoSpace ULONGCount BOOLEANMapToSystemVirtual TRUE FORM3 WDM 注意 这种形式不被DriverStudio2 0支持 NTSTATUSInitialize PCM RESOURCE LISTpTranslatedResourceList ULONGOrdinal 0 BOOLEANMapToSystemVirtual TRUE FORM4 WDM Initialize PCM RESOURCE LISTpTranslatedResourceList PCM RESOURCE LISTpRawResourceList ULONGOrdinal 0 BOOLEANMapToSystemVirtual TRUE 初始化或重新初始化KIoRange的实例 99 KIoRange inbFORM1 UCHARinb ULONGByteOffset FORM2 VOIDinb ULONGByteOffset PUCHARBuffer ULONGCount 从映射空间读一个或多个字节 100 KIoRange outbFORM1 VOIDoutb ULONGByteOffset 以字节为单位的目标位置到IO空间开始位置的偏移值UCHARData 要写的一个字节数据 FORM2 VOIDoutb ULONGByteOffset PUCHARBuffer 指向包含要写数据的缓冲的指针ULONGCount 缓冲中要写数据的字节数 写一个或多个字节到映射的IO空间 101 写端口 索引信息 地址70H m ParPortIos outb 0 0 x02 准备读分钟信息读端口 读分钟信息 地址71H UCHARdata m ParPortIos inb 1 下面我们来访问CMOS的数据 首先定义类KIoRange的一个实例 以定义相关地址空间 KIoRangem ParPortIos 初始化实例 指定CMOS的端口首地址 并映射 status m ParPortIos Initialize 0 x70 CMOS端口首地址是70HTRUE 在CPUI O空间内8 设备读写数据的字节宽度TRUE 映射到系统空间 102 4 截获中断和挂接中断服务例程 DriverStudio提供了KInterrupt类来截获和挂接中断 该类的成员函数主要有KInterrupt构造函数 3种格式 Initialize在无效状态下初始化一个对象 3种格式 Connect绑定ISR 中断服务例程 到中断InitializeAndConnect一步完成初始化与绑定工作 要用资源列表作为输入 KInterrupt析构函数Invalidate在初始化状态下删除对象IsValid检查对象是否初始化Disconnect使中断和ISR与中断分离Synchronize当得到一个中断自旋锁时请求同步功能 103 KInterrupt KInterrupt 只介绍WDM形式 FORM3 WDM KInterrupt KIRQLirql 即插即用设备提供的IRQL值ULONGvector 即插即用设备提供的向量值KINTERRUPT MODEMode LevelSensitive或Latched中选一 BOOLEANbShareVector FALSE 该向量是否被几个设备共享KAFFINITYaffinity 1 thisistheprocessoraffinitymask BOOLEANbSaveFloat FALSE 是否需要在中断到来使保存浮点处理器上下文 X86平台下必须使FALSE 构造类Kinterrupt的实例 104 KInterrupt Initialize 只介绍WDM形式 FORM2 WDM VOIDInitialize KIRQLirql ULONGvector KINTERRUPT MODEMode BOOLEANbShareVector FALSE KAFFINITYaffinity 1 BOOLEANbSaveFloat FALSE 初始化对象 只在对象没有初始化的时候使用 105 KInterrupt ConnectFORM1 NTSTATUSConnect PKSERVICE ROUTINEIsr 作为ISR服务的函数的地址PVOIDContext 当系统调用ISR的时候传递给他的无类型的参数 FORM2 NTSTATUSConnect PKSERVICE ROUTINEIsr PVOIDContext PKSPIN LOCKpSpin KIRQLSynchIrql 绑定一个中断到ISR 中断处理程序 106 KInterrupt InitializeAndConnectNTSTATUSInitializeAndConnect PCM RESOURCE LISTpResourceList 指向资源列表的指针PKSERVICE ROUTINEIsr PVOIDIsrContext ULONGOrdinal 0 BOOLEANbSaveFloat FALSE 初始化一个中断并绑定到一个ISR上 对于WDM驱动程序 pResourceList必须是一个转换资源表 例如是KIrp TranslatedResources的返回值 107 下面我们来举例说明 首先定义类KInterrupt的一个实例KInterruptm TheInterrupt 在设备类中声明一个成员函数TheIsr作为中断服务例程ISR classSampleDevice publicKPnpDevice public MEMBER ISR SampleDevice TheIsr ifdef COMMENT ONLYBOOLEANTheIsr void returnTRUE endif 108 在OnStartDevice例程中获取包括中断的设备资源并初始化中断和挂接ISRSampleDevice OnStartDevice KIrpI PCM RESOURCE LISTpResList I TranslatedResources 获取设备资源 初始化中断并挂接中断服务例程TheIsrstatus m TheInterrupt InitializeAndConnect pResList LinkTo TheIsr this 109 本讲义参考了DriverStudio有关文档
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!