如果你确定要使用Visual Studio 2015 编写驱动,那么在你安装Visual Studio 2015 和WDK之前,一定一定要注意一件事情,那就是确保SDK和WDK版本保持一致,切记切记!!!否则会出现什么问题,Visual Studio 2015里面宏定义的SDK和系统当前能够正常使用的不一致,无法正常编译驱动程序!!!

我今晚先前解决的问题就是这个原因造成的,当时我使用的SDK比WDK版本高,导致Visual Studio 2015宏定义的值全部是高版本的SDK,在编译驱动时候,无法找到对应的lib和头文件!!

先前问题和解决方法:http://www.cnblogs.com/sunylat/p/6286289.html

如果你已经出现我这样的问题了,不要紧,把当前和WDK不匹配的SDK删除,随后安装和当前WDK匹配的SDK就可以了!!

刚刚编译先前可以正常编译的UMDF驱动,结果出错了,查找了一下资料,发现是驱动时间戳验证问题,解决方法:对工程属性里面的inf2cat工具的属性设置为“是”就可以了!如下图:

参考文章:http://www.yiiyee.cn/Blog/vs2012/

另外我告诉大家,张帆的《windows驱动开发技术详解》,第一个DDK的例子,我已经顺利编译通过了!需要设置这一步就能够顺利编译了:工程属性->C/C++->常规->将警告视为错误,把这项修改为“否”!

下面是我编译的张帆的第一个DDK例子的代码:

driver.h

  1. /************************************************************************
  2. * 文件名称:Driver.h
  3. * 作 者:张帆
  4. * 完成日期:2007-11-1
  5. *************************************************************************/
  6. #pragma once
  7.  
  8. #ifdef __cplusplus
  9. extern "C"
  10. {
  11. #endif
  12. #include <NTDDK.h>
  13. #ifdef __cplusplus
  14. }
  15. #endif
  16.  
  17. #define PAGEDCODE code_seg("PAGE")
  18. #define LOCKEDCODE code_seg()
  19. #define INITCODE code_seg("INIT")
  20.  
  21. #define PAGEDDATA data_seg("PAGE")
  22. #define LOCKEDDATA data_seg()
  23. #define INITDATA data_seg("INIT")
  24.  
  25. #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
  26.  
  27. typedef struct _DEVICE_EXTENSION {
  28. PDEVICE_OBJECT pDevice;
  29. UNICODE_STRING ustrDeviceName; //设备名称
  30. UNICODE_STRING ustrSymLinkName; //符号链接名
  31. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  32.  
  33. // 函数声明
  34.  
  35. NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
  36. VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
  37. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
  38. IN PIRP pIrp);

driver.cpp

  1. /************************************************************************
  2. * 文件名称:Driver.cpp
  3. * 作 者:张帆
  4. * 完成日期:2007-11-1
  5. *************************************************************************/
  6.  
  7. #include "Driver.h"
  8.  
  9. /************************************************************************
  10. * 函数名称:DriverEntry
  11. * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
  12. * 参数列表:
  13. pDriverObject:从I/O管理器中传进来的驱动对象
  14. pRegistryPath:驱动程序在注册表的中的路径
  15. * 返回 值:返回初始化驱动状态
  16. *************************************************************************/
  17. #pragma INITCODE
  18. extern "C" NTSTATUS DriverEntry(
  19. IN PDRIVER_OBJECT pDriverObject,
  20. IN PUNICODE_STRING pRegistryPath)
  21. {
  22. NTSTATUS status;
  23. KdPrint(("Enter DriverEntry\n"));
  24.  
  25. //注册其他驱动调用函数入口
  26. pDriverObject->DriverUnload = HelloDDKUnload;
  27. pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
  28. pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
  29. pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
  30. pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
  31.  
  32. //创建驱动设备对象
  33. status = CreateDevice(pDriverObject);
  34.  
  35. KdPrint(("DriverEntry end\n"));
  36. return status;
  37. }
  38.  
  39. /************************************************************************
  40. * 函数名称:CreateDevice
  41. * 功能描述:初始化设备对象
  42. * 参数列表:
  43. pDriverObject:从I/O管理器中传进来的驱动对象
  44. * 返回 值:返回初始化状态
  45. *************************************************************************/
  46. #pragma INITCODE
  47. NTSTATUS CreateDevice(
  48. IN PDRIVER_OBJECT pDriverObject)
  49. {
  50. NTSTATUS status;
  51. PDEVICE_OBJECT pDevObj;
  52. PDEVICE_EXTENSION pDevExt;
  53.  
  54. //创建设备名称
  55. UNICODE_STRING devName;
  56. RtlInitUnicodeString(&devName, L"\\Device\\MyDDKDevice");
  57.  
  58. //创建设备
  59. status = IoCreateDevice(pDriverObject,
  60. sizeof(DEVICE_EXTENSION),
  61. &(UNICODE_STRING)devName,
  62. FILE_DEVICE_UNKNOWN,
  63. , TRUE,
  64. &pDevObj);
  65. if (!NT_SUCCESS(status))
  66. return status;
  67.  
  68. pDevObj->Flags |= DO_BUFFERED_IO;
  69. pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
  70. pDevExt->pDevice = pDevObj;
  71. pDevExt->ustrDeviceName = devName;
  72. //创建符号链接
  73. UNICODE_STRING symLinkName;
  74. RtlInitUnicodeString(&symLinkName, L"\\??\\HelloDDK");
  75. pDevExt->ustrSymLinkName = symLinkName;
  76. status = IoCreateSymbolicLink(&symLinkName, &devName);
  77. if (!NT_SUCCESS(status))
  78. {
  79. IoDeleteDevice(pDevObj);
  80. return status;
  81. }
  82. return STATUS_SUCCESS;
  83. }
  84.  
  85. /************************************************************************
  86. * 函数名称:HelloDDKUnload
  87. * 功能描述:负责驱动程序的卸载操作
  88. * 参数列表:
  89. pDriverObject:驱动对象
  90. * 返回 值:返回状态
  91. *************************************************************************/
  92. #pragma PAGEDCODE
  93. VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
  94. {
  95. PDEVICE_OBJECT pNextObj;
  96. KdPrint(("Enter DriverUnload\n"));
  97. pNextObj = pDriverObject->DeviceObject;
  98. while (pNextObj != NULL)
  99. {
  100. PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
  101. pNextObj->DeviceExtension;
  102.  
  103. //删除符号链接
  104. UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
  105. IoDeleteSymbolicLink(&pLinkName);
  106. pNextObj = pNextObj->NextDevice;
  107. IoDeleteDevice(pDevExt->pDevice);
  108. }
  109. }
  110.  
  111. /************************************************************************
  112. * 函数名称:HelloDDKDispatchRoutine
  113. * 功能描述:对读IRP进行处理
  114. * 参数列表:
  115. pDevObj:功能设备对象
  116. pIrp:从IO请求包
  117. * 返回 值:返回状态
  118. *************************************************************************/
  119. #pragma PAGEDCODE
  120. NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
  121. IN PIRP pIrp)
  122. {
  123. KdPrint(("Enter HelloDDKDispatchRoutine\n"));
  124. NTSTATUS status = STATUS_SUCCESS;
  125. // 完成IRP
  126. pIrp->IoStatus.Status = status;
  127. pIrp->IoStatus.Information = ; // bytes xfered
  128. IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  129. KdPrint(("Leave HelloDDKDispatchRoutine\n"));
  130. return status;
  131. }

用Visual Studio 2015 编写驱动之前一定要注意的问题!!!的更多相关文章

  1. 用Visual Studio 2015 编写第一个UMDF驱动遇到的问题!!

    前提:Visual Studio 2015已经成功安装了驱动环境,WDK都已经完全正常安装了,在Visual Studio 2015的菜单可以看到"Driver"菜单项了.这说明已 ...

  2. (英文版)使用Visual Studio 2015 编写 MASM 汇编程序!

    原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject Getting Started with MA ...

  3. 用Visual Studio 2015 编写 MASM 汇编程序(一)环境配置

    原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject 下面内容根据上面文章翻译整理而来! 开发32位 ...

  4. 用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序

    一,建立一个VC的控制台类型的空工程: 1,从VS菜单中选择“文件”->“新建”->“项目”. 2,在新建项目中选择:“Visual c++”->"Win32"- ...

  5. 用Visual Studio 2015 编译张帆的第一个WDM驱动,并且成功安装到Windows 10里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows 10 X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...

  6. 用Visual Studio 2015成功编译、发布UMDF驱动到目标机!!

    开发工具:Visual Studio 2015企业版 主      机:windows10 X64企业版,主机是安装了Visual Studio 2015的操作系统,主要进行驱动开发和调试. 目  标 ...

  7. 用Visual Studio 2015 编译张帆的第一个NT式驱动,并且成功安装到Windows XP里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows XP X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...

  8. Visual Studio 2015 开发 ASP.NET 5 有何变化?

    本篇博文目录: ASP.NET 5 模版 ASP.NET 5 目录结构 前端管理工具 无编译开发 Microsoft Git Provider 智能感知和错误信息 Smart Unit Testing ...

  9. 使用Visual Studio 2015 Community 开发windows服务

    昨天研究在.NET下开发Windows服务程序,期间遇到一些小问题,这里仅将自己的开发过程和需要注意的地方写下和广大网友分享……  1.基础   Windows服务是指系统启动时能够自己运行的程序.W ...

随机推荐

  1. javascript动画效果之缓冲动画

    这里的html和css的代码是复制之前的随便匀速运动的,所以不需要改变 <!DOCTYPE html> <html> <head> <meta charset ...

  2. 如何为CentOS 7配置静态IP地址

    问题:在CentOS 7上,我想要将我其中一个网络接口从DHCP改为静态IP地址配置,如何才能永久为CentOS或RHEL 7上的网络接口分配静态IP地址? 如果你想要为CentOS 7中的某个网络接 ...

  3. MFC下MCI的使用播放音乐

    最近研究了一下MFC下的音乐的播放,主要使用了MCI 1.需要包含的库文件 在链接资源里(link)添加库文件VFW32.lib winmm.lib 2.包含的头文件 #include <mms ...

  4. 初探OpenGL(一)

    OPenGL ES 1.X 面向功能固定的硬件所涉及并提供加速支持,图形质量以及性能标准. OpenGL ES2.X则提供包括着色器技术在内的全编程3D图形算法.----硬件要求比较高. OpenGL ...

  5. vbs鼠标方法——模拟鼠标按键

    '*********************************************************************** ' 代码开始 '******************* ...

  6. aspx中如何加入javascript

    Response.Write("<script>window.location ='aaa.aspx';</script>"); Response.Writ ...

  7. 《JS权威指南学习总结--4.13运算符》

    一.typeof运算符     typeof是一元运算符,放在其单个操作数的前面,操作数可以是任意类型.返回值为表示操作数类型的一个字符串.     例如:     typeof x          ...

  8. static静态初始化块

    Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意: ...

  9. Entity Framework技巧系列之五 - Tip 16 – 19

    提示16. 当前如何模拟.NET 4.0的ObjectSet<T> 背景: 当前要成为一名EF的高级用户,你确实需要熟悉EntitySet.例如,你需要理解EntitySet以便使用 At ...

  10. MinGW 运行C++程序的方法

    1:安装好 MinGW 及 GCC 编译器后 , 当然 MinGW 全安装最保险了,不会太费劲 2:配置环境变量(注:可能需要重启后生效) 计算机 --> 属性 --> 高级系统设置 -- ...