分类 WindowsKernel 中的文章

ETW机制

通过ETW获取的信息非常丰富,可以通过ETW获取到的信息有: 文件类信息,包括文件创建、删除、读写等信息。 注册表信息,包括注册表的创建、删除、读写等信息。 进程线程信息,包括进程创建退出、线程创建退出、模块加载等。 网络信息,TCP、UDP协议的发送,接收ip地址以及数据长度等。 CPU……

阅读全文

Windows驱动自签名

需要makecert.exe和signtool.exe这两个开发工具。这两个工具在WDK的安装包中就有的。例如我本地安装的WDK10.0.22000.0,那么在安装目录下即可看到这两个可执行文件。 先来介绍下这两个工具: makecert.exe 是用来生成证书文件的,也就是用它来生成一个后缀位.cer的文……

阅读全文

Windbg扩展|01入活

1. WinDbg扩展有哪些用处? 在使用WinDbg进行设备驱动调试时,有时候如果存在某些特定的工具那么会让我们的调试过程变得更加的顺畅。比如对于PCI设备,我们想去读取设备物理地址某一段的值然后把它保存下来。我们当然可以使用!dd这个命令来做,读取少量的数据当然也还没啥问题,如果读……

阅读全文

Windows内核编程04|内核工作流程

1 简介 在应用层利用SetThreadPriority等API设置线程优先级是受到进程优先级限制的,所以本节就计划通过编写一个驱动程序和应用程序相结合突破这种限制。本节代码放在了Github上访问此链接 2 驱动程序初始化 先按照上一节的介绍来了解一下创建一个驱动程序的基本流程:入口函数……

阅读全文

Windows内核编程03|内核编程基础

1. 内核编程一般准则 用户编程和内核编程之间的差别 1.1 未处理的异常 在用户模式下如果程序出现未处理的异常,整个程序会直接中止;在内核模式下出现未处理的异常,会造成系统奔溃,出现BSOD(蓝屏)。所以内核代码得非常小心,编译时绝对不能跳过任何细节和错误检查。 1.2 终止 当用户进程终止时不管是否正……

阅读全文

Windows内核编程02|环境搭建和部署测试

1.安装VisualStudio2019 2.安装WindowsDriverKit 3.创建项目 4.添加代码 // driver.c #include <ntddk.h> // DriverEntry Routine DRIVER_INITIALIZE DriverEntry; // Unload Routine DRIVER_UNLOAD DriverUnload; // DriverEntry: 驱动程序的入口点 // DriverObject: 驱动程序对象 // RegistryPath: 注册表中的路径(驱动程序路径) NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath ) { // 编译器默认的警告等级为 /W4, // 并且开启 /WX 将警告视为错误……

阅读全文

Windows内核编程01|Process

1.1 进程 进程拥有的内容: 一个可执行程序。包含用来在进程中执行的原始的代码和数据(PE格式的文件)。 一段虚拟地址空间。进程中的代码不管出于何种目的要分配内存时,都从这里分配。 一个主令牌。它是一个保存进程默认安全上下文的对象,在进程内执行代码的线程会用到它,除非某个线程通过身份扮演(i……

阅读全文

Windows内核开发总结(二)

同步异步的两种用法 FILE_FLAG_OVERLAPPED异步打开参数 在CreateFile打开设备对象时 HANDLE CreateFile( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, //FILE_FLAG_OVERLAPPED HANDLE hTemplateFile ); 加入FILE_FLAG_OVERLAPPED参数就是以异步的方式打开驱动的设备对象 与驱动通讯时如下的调用界面及异步结构,需要设置一个OVE……

阅读全文

Windows内核开发总结(一)

1. windows内核对象 每个对象都有对象头和对象体组成。所有类型的对象头结构都是相同的,而结构体部分却各不相同的。下面是内核对象的结构图: 进程句柄表 dt nt!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER +0x078 ExitTime : _LARGE_INTEGER +0x080 RundownProtect : _EX_RUNDOWN_REF +0x084 UniqueProcessId : Ptr32 Void +0x088 ActiveProcessLinks : _LIST_ENTRY +0x090 QuotaUsage : [3] Uint4B +0x09c QuotaPeak : [3] Uint4B +0x0a8 CommitCharge : Uint4B +0x0ac PeakVirtualSize : Uint4B +0x0b0 VirtualSize : Uint4B +0x0b4 SessionProcessLinks : _LIST_ENTRY +0x0bc DebugPort : Ptr32 Void +0x0c0 ExceptionPort : Ptr32……

阅读全文