用Visual Studio 2015 编写驱动之前一定要注意的问题!!!
如果你确定要使用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
- /************************************************************************
- * 文件名称:Driver.h
- * 作 者:张帆
- * 完成日期:2007-11-1
- *************************************************************************/
- #pragma once
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- #include <NTDDK.h>
- #ifdef __cplusplus
- }
- #endif
- #define PAGEDCODE code_seg("PAGE")
- #define LOCKEDCODE code_seg()
- #define INITCODE code_seg("INIT")
- #define PAGEDDATA data_seg("PAGE")
- #define LOCKEDDATA data_seg()
- #define INITDATA data_seg("INIT")
- #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
- typedef struct _DEVICE_EXTENSION {
- PDEVICE_OBJECT pDevice;
- UNICODE_STRING ustrDeviceName; //设备名称
- UNICODE_STRING ustrSymLinkName; //符号链接名
- } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
- // 函数声明
- NTSTATUS CreateDevice(IN PDRIVER_OBJECT pDriverObject);
- VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
- NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
- IN PIRP pIrp);
driver.cpp
- /************************************************************************
- * 文件名称:Driver.cpp
- * 作 者:张帆
- * 完成日期:2007-11-1
- *************************************************************************/
- #include "Driver.h"
- /************************************************************************
- * 函数名称:DriverEntry
- * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
- * 参数列表:
- pDriverObject:从I/O管理器中传进来的驱动对象
- pRegistryPath:驱动程序在注册表的中的路径
- * 返回 值:返回初始化驱动状态
- *************************************************************************/
- #pragma INITCODE
- extern "C" NTSTATUS DriverEntry(
- IN PDRIVER_OBJECT pDriverObject,
- IN PUNICODE_STRING pRegistryPath)
- {
- NTSTATUS status;
- KdPrint(("Enter DriverEntry\n"));
- //注册其他驱动调用函数入口
- pDriverObject->DriverUnload = HelloDDKUnload;
- pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
- pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
- pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
- pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
- //创建驱动设备对象
- status = CreateDevice(pDriverObject);
- KdPrint(("DriverEntry end\n"));
- return status;
- }
- /************************************************************************
- * 函数名称:CreateDevice
- * 功能描述:初始化设备对象
- * 参数列表:
- pDriverObject:从I/O管理器中传进来的驱动对象
- * 返回 值:返回初始化状态
- *************************************************************************/
- #pragma INITCODE
- NTSTATUS CreateDevice(
- IN PDRIVER_OBJECT pDriverObject)
- {
- NTSTATUS status;
- PDEVICE_OBJECT pDevObj;
- PDEVICE_EXTENSION pDevExt;
- //创建设备名称
- UNICODE_STRING devName;
- RtlInitUnicodeString(&devName, L"\\Device\\MyDDKDevice");
- //创建设备
- status = IoCreateDevice(pDriverObject,
- sizeof(DEVICE_EXTENSION),
- &(UNICODE_STRING)devName,
- FILE_DEVICE_UNKNOWN,
- , TRUE,
- &pDevObj);
- if (!NT_SUCCESS(status))
- return status;
- pDevObj->Flags |= DO_BUFFERED_IO;
- pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
- pDevExt->pDevice = pDevObj;
- pDevExt->ustrDeviceName = devName;
- //创建符号链接
- UNICODE_STRING symLinkName;
- RtlInitUnicodeString(&symLinkName, L"\\??\\HelloDDK");
- pDevExt->ustrSymLinkName = symLinkName;
- status = IoCreateSymbolicLink(&symLinkName, &devName);
- if (!NT_SUCCESS(status))
- {
- IoDeleteDevice(pDevObj);
- return status;
- }
- return STATUS_SUCCESS;
- }
- /************************************************************************
- * 函数名称:HelloDDKUnload
- * 功能描述:负责驱动程序的卸载操作
- * 参数列表:
- pDriverObject:驱动对象
- * 返回 值:返回状态
- *************************************************************************/
- #pragma PAGEDCODE
- VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
- {
- PDEVICE_OBJECT pNextObj;
- KdPrint(("Enter DriverUnload\n"));
- pNextObj = pDriverObject->DeviceObject;
- while (pNextObj != NULL)
- {
- PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
- pNextObj->DeviceExtension;
- //删除符号链接
- UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
- IoDeleteSymbolicLink(&pLinkName);
- pNextObj = pNextObj->NextDevice;
- IoDeleteDevice(pDevExt->pDevice);
- }
- }
- /************************************************************************
- * 函数名称:HelloDDKDispatchRoutine
- * 功能描述:对读IRP进行处理
- * 参数列表:
- pDevObj:功能设备对象
- pIrp:从IO请求包
- * 返回 值:返回状态
- *************************************************************************/
- #pragma PAGEDCODE
- NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
- IN PIRP pIrp)
- {
- KdPrint(("Enter HelloDDKDispatchRoutine\n"));
- NTSTATUS status = STATUS_SUCCESS;
- // 完成IRP
- pIrp->IoStatus.Status = status;
- pIrp->IoStatus.Information = ; // bytes xfered
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- KdPrint(("Leave HelloDDKDispatchRoutine\n"));
- return status;
- }
用Visual Studio 2015 编写驱动之前一定要注意的问题!!!的更多相关文章
- 用Visual Studio 2015 编写第一个UMDF驱动遇到的问题!!
前提:Visual Studio 2015已经成功安装了驱动环境,WDK都已经完全正常安装了,在Visual Studio 2015的菜单可以看到"Driver"菜单项了.这说明已 ...
- (英文版)使用Visual Studio 2015 编写 MASM 汇编程序!
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject Getting Started with MA ...
- 用Visual Studio 2015 编写 MASM 汇编程序(一)环境配置
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject 下面内容根据上面文章翻译整理而来! 开发32位 ...
- 用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序
一,建立一个VC的控制台类型的空工程: 1,从VS菜单中选择“文件”->“新建”->“项目”. 2,在新建项目中选择:“Visual c++”->"Win32"- ...
- 用Visual Studio 2015 编译张帆的第一个WDM驱动,并且成功安装到Windows 10里面!!!
开发工具:Visual Studio 2015 企业版 目 标 机:Windows 10 X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...
- 用Visual Studio 2015成功编译、发布UMDF驱动到目标机!!
开发工具:Visual Studio 2015企业版 主 机:windows10 X64企业版,主机是安装了Visual Studio 2015的操作系统,主要进行驱动开发和调试. 目 标 ...
- 用Visual Studio 2015 编译张帆的第一个NT式驱动,并且成功安装到Windows XP里面!!!
开发工具:Visual Studio 2015 企业版 目 标 机:Windows XP X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...
- Visual Studio 2015 开发 ASP.NET 5 有何变化?
本篇博文目录: ASP.NET 5 模版 ASP.NET 5 目录结构 前端管理工具 无编译开发 Microsoft Git Provider 智能感知和错误信息 Smart Unit Testing ...
- 使用Visual Studio 2015 Community 开发windows服务
昨天研究在.NET下开发Windows服务程序,期间遇到一些小问题,这里仅将自己的开发过程和需要注意的地方写下和广大网友分享…… 1.基础 Windows服务是指系统启动时能够自己运行的程序.W ...
随机推荐
- HTML URL编码参考(转载)
URL编码(URL encoding)的作用是将字符转化为可在因特网上安全传输的格式.URL——统一资源定位符Web浏览器通过URL从Web服务器上请求页面.URL就是网页的地址,如:http://w ...
- 万航单位换算器 V1.0 绿色版
软件名称: 万航单位换算器软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 347KB图片预览: 软件简介:万航单位换算器是一个可以随意转换单位的绿色软件,这个软件 ...
- 设计模式4 外观模式 FACADE
一个外观是一个类,其提供的功能介于工具箱的功能和完整系统的功能之间,并为一个包或者一个子系统中的类提供了简化的使用方式.
- spring AOP 代理机制、执行过程、四种实现方式及示例详解
1.加载过程 spring首先检测配置文件中的代理配置,然后去加载bean; 如果配置文件中没有配置代理,自然代理不会生效,如果配置了代理,但是代理还没有生效,那么有可能是加载顺序的问题,即在检测到代 ...
- Sping3.0版本+Quartz完成定时任务
----------------------不使用注解在XML中配置完成定时任务---------------------- 1.需要导入的jar包 2.编写我们的定时任务的完成类 3.在Spring ...
- 标准IO库
IO标准库类型和头文件
- mysql主从复制的配置总结
首先确定安装配置的环境 centOS7,mysql5.6 在配置之前要保证的几个点 1.系统防火墙,如果只是测试,可以关闭防火墙,如果不是测试,请开发需要使用的端口号,如3306: 开放端口 fire ...
- j2ee网站项目首页如何直接使用action
之前做过一些网站项目,大多数都是首页就是登录,直接进入首页的不多,也就没有注意到,今天刚好注意到了就来记一下.也算是一个小技巧 <welcome-file>index.jsp</we ...
- allegro 导Gerber文件
今天抽空好好整理了一下有关Allegro出Gerber文件文档,此文档在网上搜到的基础上进一步完善,把每个需要注意的地方都用红色字体框出 http://files.cnblogs.com/files/ ...
- <c:if>替代
由于没有else, 由下面的替代 <c:choose> <c:when test="${usersession.hasPrivilegeByName('Case Delet ...