MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554887(v=vs.85).aspx

创建驱动程序项目时,指定基本的目标操作系统,该系统是运行驱动程序的基本版本的 Windows。例如,你可以指定 Windows 7 为基本的目标操作系统。在这种情况下,驱动程序会在 Windows 7 和更高版本的 Windows 上运行。

注意  如果为特定的基本版本的 Windows 开发驱动程序且希望驱动程序运行在更高版本的 Windows 上,则不得使用任何未记录的函数,也不得采用文档中介绍方法之外的任何方法使用记录的函数。否则,驱动程序可能会无法运行在更高版本的 Windows 上。即便你已经很小心,仅使用记录的函数,也应在每次发布新版本的 Windows 时在其上对驱动程序进行测试。
 

编写仅使用共同功能的多版本驱动程序

设计将在多个版本的 Windows 上运行的驱动程序时,最简单的方法是允许驱动程序仅使用运行该驱动程序的所有版本的 Windows 共同的 DDI 函数和结构。在此情形下,将最基本的目标操作系统设置为驱动程序支持的最早版本的 Windows。

例如,要支持从 Windows 7 开始的所有版本的 Windows,应执行以下操作:

  1. 设计和实现驱动程序,以便该驱动程序仅使用 Windows 7 中提供的那些功能。

  2. 生成驱动程序时,将 Windows 7 指定为最基本的目标操作系统。

虽然此过程很简单,但它可能会限制驱动程序仅使用更高版本的 Windows 上提供的功能子集。

编写使用版本相关功能的多版本驱动程序

内核模式驱动程序可以动态确定它运行的是哪个版本的 Windows 并且选择使用该版本上提供的功能。例如,必须支持从 Windows 7 开始的 Windows 所有版本的驱动程序可以在运行时确定它所运行的 Windows 版本。 如果驱动程序在 Windows 7 上运行,则它只能使用 Windows 7 支持的 DDI 函数。但是,同一个驱动程序可以使用仅适用于 Windows 8 的其他 DDI 函数,例如,当其运行时检查功能确定它在 Windows 8 上运行时。

确定 Windows 版本

RtlIsNtDdiVersionAvailable 为驱动程序可以在运行时用于确定特定版本的 Windows 提供的功能是否可用的函数。该函数的原型如下所示:

 
 
BOOLEAN RtlIsNtDdiVersionAvailable(IN ULONG Version)

在此原型中,Version 是一个值,指示 Windows DDI 的所需版本。此值必须为 DDI 版本常量之一,在 sdkddkver.h 中定义,例如 NTDDI_WIN8 或 NTDDI_WIN7。

当调用程序运行在 Version. 指定的相同的 Windows 版本或更高版本上时,RtlIsNtDdiVersionAvailable 会返回 TRUE。

驱动程序还可以通过调用 RtlIsServicePackVersionInstalled 函数检查特定的 Service Pack。该函数的原型如下所示:

 
 
BOOLEAN RtlIsServicePackVersionInstalled(IN ULONG Version)

在此原型中,Version 为一个值,指示所需的 Windows 版本和 Service Pack。此值必须为 DDI 版本常量之一,在 sdkddkver.h 中定义,例如 NTDDI_WS08SP3。

注意,仅当操作系统版本与指定版本完全匹配时,RtlIsServicePackVersionInstalled 才会返回 TRUE。因此,如果驱动程序不是在 Windows Server 2008 SP4 上运行,则调用将 Version 设置为 NTDDI_WS08SP3 的 RtlIsServicePackVersionInstalled 会失败。

条件性调用与 Windows 版本相关的函数

在驱动程序确定计算机上可用的特定操作系统版本后,该驱动程序可以使用 MmGetSystemRoutineAddress 函数动态查找例程并通过指针调用该例程。Windows 7 和更高版本的操作系统版本上提供了此函数。

注意  若要帮助保留键入检查和防止出现无意识的错误,应创建映射原始函数类型的 typedef。
 

示例:确定 Windows 版本并条件性调用版本相关的函数

此代码示例(来自驱动程序的头文件)将 PAISQSL 类型定义为指向 KeAcquireInStackQueuedSpinLock 函数的指针。然后,该示例声明此类型的 AcquireInStackQueuedSpinLock 变量。

 
 
...
//
// Pointer to the ordered spin lock function.
// This function is only available on Windows 7 and
// later systems
typedef (* PAISQSL) (KeAcquireInStackQueuedSpinLock);
PAISQSL AcquireInStackQueued = NULL;
...

此代码示例(驱动程序的初始化代码)确定驱动程序是否在 Windows 7 或更高版本的操作系统上运行。如果是,代码会检索指向 KeAcquireInStackQueuedSpinLock 的指针。

 
 
...

//
// Are we running on Windows 7 or later?
//
if (RtlIsNtDdiVersionAvailable(NTDDI_WIN7) ) { //
// Yes... Windows 7 or later it is!
//
RtlInitUnicodeString(&funcName,
L"KeAcquireInStackQueuedSpinLock"); //
// Get a pointer to Windows implementation
// of KeAcquireInStackQueuedSpinLock into our
// variable "AcquireInStackQueued"
AcquireInStackQueued = (PAISQSL)
MmGetSystemRoutineAddress(&funcName);
} ...
// Acquire a spin lock. if( NULL != AcquireInStackQueued) {
(AcquireInStackQueued)(&SpinLock, &lockHandle);
} else {
KeAcquireSpinLock(&SpinLock);
}

在该示例中,驱动程序调用 RtlIsNtDdiVersionAvailable 以确定驱动程序是否在 Windows 7 或更高版本上运行。如果版本为 Windows 7 或更高版本,驱动程序将会调用 MmGetSystemRoutineAddress 来获取指向 KeAcquireInStackQueuedSpinLock 函数的指针并将此指针存储在名为 AcquireInStackQueued 的变量(该变量声明为 PAISQSL 类型)中。

然后,当驱动程序必须获取旋转锁时,它会检查是否收到指向 KeAcquireInStackQueuedSpinLock 函数的指针。如果驱动程序已收到此指针,则驱动程序会使用该指针调用 KeAcquireInStackQueuedSpinLock。如果指向 KeAcquireInStackQueuedSpinLock 的指针为 Null,则驱动程序会使用 KeAcquireSpinLock 来获取旋转锁。

为不同版本的 Windows 编写驱动程序的更多相关文章

  1. 将“早期版本的Windows”改名

    将“早期版本的Windows”改名,并修改系统等待时间 问题描述:       先装Windows XP,再装Windows 7,启动菜单会出现“早期版本的Windows”与“Windows 7”两个 ...

  2. SQL Server 2000 sp2 及更低版本不受此版本的 Windows 支持

    SQL Server 2000 sp2 及更低版本不受此版本的 Windows 支持.在安装了 SQL Server 2000 之后请应用 sp3. 出现这种现象的原因在于:Windows Serve ...

  3. Windows NT 驱动程序开发人员提示 -- 应注意避免的事项

    下面是开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表: 1.  一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度 ...

  4. 分布式版本库——Windows下Git的环境部署以及在GitHub上开源自己的项目

    分布式版本库--Windows下Git的环境部署以及在GitHub上开源自己的项目 这几天着实忙的焦头烂额,可惜不是搞技术,今天周日,难得闲下来,写篇大家都想学习的Git教程,其实廖雪峰老师的网站已经 ...

  5. Visual Studio 2012 与此版本的 Windows 不兼容。有关详细信息,请联系 Microsoft

    参考网址:Visual Studio 2012 与此版本的 Windows 不兼容 解决 下载更新包安装:http://www.microsoft.com/zh-CN/download/details ...

  6. vim7.4版本在windows下的配置文件及所在位置

    1.vim在windows下默认首先会查找"_vimrc"文件,如果没有则会找".vimrc".造成这个原因是windows早期不支持以点开头的文件及目录.2. ...

  7. react native 0.56.0版本在windows下有bug不能正常运行

    react native的0.56.0版本在windows下有bug不能正常运行请init 0.55.4的版本 react-native init MyApp --version 0.55.4 注意v ...

  8. Visual Studio 2012 与此版本的 Windows 不兼容 解决

    警告: [Window Title] 程序兼容性助手[Main Instruction] 此程序存在已知的兼容性问题[Expanded Information] Visual Studio 2012 ...

  9. VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK

    VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK 或者在项目属性页的问题解决方案 解决方法: 右击项目解决方案, 选择:重定 ...

随机推荐

  1. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  2. java jar包收集

    activation~与javaMail有关的jar包,使用javaMail时应与mail.jar (mail.jar和activation.jar)一起加入到lib中去,具体负责mail的数据源和类 ...

  3. word2vec + transE 知识表示模型

    本文主要工作是将文本方法 (word2vec) 和知识库方法 (transE) 相融合作知识表示,即将外部知识库信息(三元组)加入word2vec语言模型,作为正则项指导词向量的学习,将得到的词向量用 ...

  4. DMA控制器

    DMA控制器依赖于平台硬件,这里只对i386的8237 DMA控制器做简单的说明,它有两个控制器,8个通道,具体说明如下: 控制器1: 通道0-3,字节操作, 端口为 00-1F 控制器2: 通道 4 ...

  5. aes rsa加密

    aes在加密时,若加密字符串的长度不是16,则会在后面加0x00补足16位,所以在解密后还应该去除0x00 小于16字节的原文会得到16字节长度的密文,小于32字节的原文会得到32字节长度的密文,大于 ...

  6. debug不过的程序

    下面的程序debug是不能通过的. 至于为什么我还不知道. assume cs:codesg codesg segment start: mov ax,2000h mov ss, ax mov sp, ...

  7. Linux下压缩mp3文件

    apt-get install lame lame -b 64 a.mp3 b.mp3 lame是压缩mp3的一个小工具 参数 -b 64 是输出文件的采样率64 a.mp3 是源文件 b.mp3 是 ...

  8. Python2.7.12开发环境构建(自动补全)

    一.安装readline-devel包 Python的编译安装依赖于这个包 yum -y install readline-devel 二.安装Python2.7.12 Python官方网站(到此处下 ...

  9. 高效能人士必知铁律--note

    偶然看到了<高效能人士 必知铁律>这本书,我比较少看成功学,但是这本书把很多著名的成功学书籍整理出来,有时会让你耳目一新,有些观点尽管是常识,但是却加深了你对它们的理解,比如: 只要在积极 ...

  10. COCOS2D-X中UI动画导致闪退与UI动画浅析

    前两天和同事一起查一个游戏的闪退问题,log日志显示最后挂在CCNode* ActionNode::getActionNode()函数中的首行CCNode* cNode = dynamic_cast& ...