附本章需要资源:VS+SDK+WDK+InstDrv+DbgView-系统安全文档类资源-CSDN下载

首先下载VS+WDK,资源可以从微软上下,我这里资源也附在后面,但不是最新的。

今天我们开始第一个项目:HelloWorld

(我用的是VS2019)打开VS,[创建新项目]=>[Kernel Mode Driver Empty],再填写名称:HelloWorld

进入项目后,右击“解决方案管理器”中的“Source Files”,“添加”,“新建项”,不要选择上面的任何项目,直接在“名称”中填写“main.c”,然后在“main.c”里写入以下C语言代码:

#include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("HW: Our driver is unloading...\r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {DbgPrint("HW: Hello, World!\r\n");driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

保存项目。然后根据你的系统版本,在菜单栏中选择“x86”“x64”“ARM”或“ARM64”。

接着开始生成解决方案了。菜单栏中“生成”=>“生成解决方案”。

接下来有些人会遇到要添加Spectre缓解库的情况,可以从开始菜单里打开“Visual Studio 2019 Installer”,进行修改。修改完后重新生成。

还有个问题。VS会提示代码中有错误,原因在于driver与reg_path没用到过,可以改成下面的样子:(也就是自己给自己赋值了一下)

#include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("HW: Our driver is unloading...\r\n");driver = driver;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {DbgPrint("HW: Hello, World!\r\n");reg_path = reg_path;driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

生成完毕后,就是运行项目了。这时候你到项目文件夹下会找到一个“.sys”的文件,因为我们这里项目名称叫HelloWorld,所以文件名为“HelloWorld.sys”。怎么运行呢?因为Windows内核程序不同于普通的应用程序,你也不要指望它会弹出个窗口,所以只能用`DbgPrint`,也就是调试输出,来查看它的状态。输出内容可以用DbgView软件查看——接下来介绍如何查看`DbgPrint`的内容。

先安装驱动程序。我这里用的InstDrv,资源附在后面。

打开InstDrv.exe,把HelloWorld.sys拖到输入框上,会自动输入文件路径。接下来先不忙安装启动,我们打开DbgView.exe,把菜单栏中“监视”栏中除了“启动日志”以外都勾上,接下来会出现一堆监视输出信息,不管它们,我们的程序还没安装呢。

但是启动失败了。为什么?因为没有签名。

打开测试模式,在测试模式下可以安装启动没有签名的驱动程序。Win+R,输入cmd回车,在命令提示符中输入`bcdedit /set testsigning on`打开测试模式,再重启就行了。(同理,`bcdedit /set testsigning off`可以再重启后关闭测试模式)

InstDrv中 安装=>启动  程序,DbgView中会立刻出现调试信息(迅速一定要迅速!!!),我这里把我的给大家看看:

同样,“停止”之后,会有驱动程序卸载的信息:

接下来可以卸载了。

今天的学习就结束了!感谢大家的阅读!也欢迎大家提出问题!

Windows内核编程学习1:构建HelloWorld相关推荐

  1. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  2. 内核对象——Windows核心编程学习手札系列之三

    内核对象 --Windows核心编程学习手札系列之三 内核对象可供系统和应用程序使用来管理各种各样的资源,如进程.线程.文件等,是内核分配的一个内存块,只能又内核访问,该内存块是一种数据结构,它的成员 ...

  3. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  4. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  5. 内存映射文件——Windows核心编程学习手札之十七

    内存映射文件 --Windows核心编程学习手札之十七 与虚拟内存一样,内存映射文件保留地址空间,并将物理存储器提交给该区域,差别在于所提交的物理存储器是磁盘上有文件存在的空间,而非系统的页文件,一旦 ...

  6. 虚拟内存——Windows核心编程学习手札之十四

    虚拟内存 --Windows核心编程学习手札之十四 系统信息 有些操作系统的值是根据主机而定的,如页面大小.分配粒度大小等,这些值不用硬编码形式,进程初始化时应检索这些值以使用.函数GetSystem ...

  7. 用户方式中线程的同步——Windows核心编程学习手札之八

    用户方式中线程的同步 --Windows核心编程学习手札之八 系统中所有线程都必须拥有对各种系统资源的访问权,这些资源包括内存堆栈.串口.文件.窗口和许多其他资源.如果一个线程需要独占对资源的访问权, ...

  8. 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七

    线程的调度.优先级和亲缘性 --Windows核心编程学习手札系列之七 每个线程都拥有一个上下文结构,在线程的内核对象中,记录线程上次运行时该线程的CPU寄存器状态.Windows会每隔20ms左右查 ...

  9. 线程基础知识——Windows核心编程学习手札系列之六

    线程基础知识 --Windows核心编程学习手札系列之六 线程与进程一样由两部分构成:一是线程的内核对象,操作系统用它来对线程实施管理,也是系统用来存放线程统计信息的地方:二是线程堆栈,用于维护线程在 ...

  10. 作业——Windows核心编程学习手札系列之五

    作业 --Windows核心编程学习手札系列之五 Windows提供作业内核对象,可以将进程组合在千毫 ,并创建一个"沙框"以便限制进程能够进行的操作.作业可视为进程的容器,win ...

最新文章

  1. Hook技术之4 在自己的进程中注入一个Dll到别人的进程
  2. windows 下使用 Filezilla server 搭建 ftp 服务器
  3. ecshop后台实现用ajax动态修改/更新用户评论的时间
  4. what are used for research figures
  5. 使用IntelliJ IDEA开发Maven初始化创建流程
  6. 几种常用的排序算法详解和C++排序算法模板(附有动图理解)
  7. 什么是反向跟单?反向跟单怎么运作?
  8. String对象的match方法
  9. emcy协议_商铺三方租赁协议合同范本
  10. 【Java】抽象类和接口的区别
  11. 数据库-不允许保存更改,阻止保存要求重新创建表的更改
  12. Lawnmower E题
  13. layui教程,非常全,常用代码一键复制粘贴
  14. 简单汇总整理IC芯片检测的几种主要方法
  15. linux 设置系统时间为当前网络时间
  16. 航班编程代码c语言,航班查询系统C语言源程序
  17. 法国CONDENSE珂蒂丝官宣苏菲-玛索成为香水系列代言人
  18. 实习证明| 大数据在线实习项目意义
  19. 关于使用华为手机进行自动化测试的一个坑
  20. 查询读者的借阅信息mysql_MySQL查询练习2

热门文章

  1. 从「模拟」理解零知识证明:平行宇宙与时光倒流—— 探索零知识证明系列(二)
  2. 腾讯tdsql如何对接mysql,数据库交付运维高级工程师-腾讯云TDSQL(MySQL版)认证考试(TCE)...
  3. python接受前端传递的参数
  4. Linux学习笔记(尚硅谷韩顺平老师2021最新Linux教程)万字笔记
  5. 记录一次安装gaussian09的经历
  6. java rslinx_如何使用AB PLC仿真软件Studio 5000 Logix Emulate
  7. CAN通讯与RS485通讯区别
  8. 修复VC6.0打开菜单项以及添加工程菜单项
  9. win10自动停用打印服务器,win10系统添加打印机总是自动关闭打印服务的技巧介绍...
  10. C# .NET 如何修改代码字体