《Windows内核安全与驱动开发》自学笔记之@WDK安装及编译设置

下载:

最后编辑此篇时间是2020年12月22日,书中下载地址已变更,需到微软官网找下载地址,微软官方有详细的
安装步骤和说明,仔细阅读安装成功不会有什么问题。
WDK微软官方下载地址:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

下载遇到的问题:

1、用公司电脑下载的是 Visual Studio 2019 安装程序,但是同样是这个下载地址到家里电脑下载的却是 Visual Studio 2017 ,未找到原因,现把2019版程序保存在CSND,以备以后使用
下载地址:https://download.csdn.net/download/lygl35/13752376

安装:

是需要添加 Spectre

如果不添加编译是会出现如下错误:

Building ‘KmdfHelloWorld’ with toolset ‘WindowsKernelModeDriver10.0’
and the ‘Universal’ target platform.Microsoft Visual
Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(458,5):
error MSB8040: 此项目需要缓解了 Spectre 漏洞的库。从 Visual Studio
安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。了解详细信息: https://aka.ms/Ofhn4c

在这里插入图片描述
我安装的所有项目如下图:
在这里插入图片描述
在这里插入图片描述

新建项目

第一种空项目(一般不用)
在这里插入图片描述
第二种(存粹的空项目)
在这里插入图片描述

编译

编译遇到的问题:

微软官方编译步骤:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/writing-a-very-small-kmdf–driver

编译第一个驱动报错处理:

错误提示如下图:
在这里插入图片描述

警告 C4100 “driver”: 未引用的形参
警告 C4100 “reg_path”: 未引用的形参

3个解决方法:

方法1:
头部需要添加如下代码

#pragma warning( disable : 4100 ) 

方法2:
函数内加

UNREFERENCED_PARAMETER(driver);//参数driver 改为未引用的参数

方法3:
修改调试设置:
在这里插入图片描述在这里插入图片描述

编译调试设置

编译的目标系统设置:
在这里插入图片描述
inf2Cat 签名设置:
在这里插入图片描述
在这里插入图片描述

存粹的空项目 错误提示:
1297 Device driver does not install on any devices, use primitive driver if this is intended
在这里插入图片描述
在这里插入图片描述

错误提示:

在这里插入图片描述
解决办法:
修改为x64
在这里插入图片描述

代码展示

/**********************驱动程序学习例程************************
*  平台:windows10
*  功能:编写第一个驱动程序代码
*  编写:ZGL
*  日期:2020-12-21
*   QQ : 55027932
*	 更改记录:未更改
******************************************************************/

#include <ntddk.h>  //包含所有驱动程序的核心 Windows内核定义
#pragma warning( disable : 4100 ) //避免编译报错,不加会会报"未引用形参的错误"


//提供一个Unload函数值是为了让程序能动态卸载,方便调试
VOID DriverUnload(PDRIVER_OBJECT driver) 
{
    
    
	//UNREFERENCED_PARAMETER(driver);//未引用的参数,避免编译器报错
	DbgPrint("first:Our driver is unloading...\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path) 
{
    
    
	//UNREFERENCED_PARAMETER(reg_path); 
	
	//这里是内核模块的入口,可以在这里写入我们想写的东西
	
	//打印已经话
	DbgPrint("first:Hello,my salary!");

	//设置一个卸载函数,便于这个函数退出
	driver->DriverUnload = DriverUnload;

	return STATUS_SUCCESS;
}

存粹的空项目(文件扩展名 用 .c)

#include <ntddk.h>

VOID DrvUnload(PDRIVER_OBJECT pdriver)
{
    
    
	DbgPrint("Unload\n");
}


NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
    
    
	driver->DriverUnload=DrvUnload;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lygl35/article/details/111476952