Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一.内核编程注意细节: 在头文件中使用的是 <ntddk.h>,而非普通的 <windows.h>. 在应用层编程时,在内核编程时,要使用自己的WDK文档.https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN 二.获取未公开API的方法: 特征码搜…
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttributes来初始化一个OBJECT_ATTRIBUTES结构体: VOID InitializeObjectAttributes( [out] POBJECT_ATTRIBUTES InitializedAttributes, //OBJECT_ATTRIBUTES的指针 [in] PUNICODE_ST…
(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用windows运用层API函数 很多C标准函数失去意义,如printf,fopen,fwrite等,它们有专门的内核函数 很多单纯的C标准,如string.h(不涉及I/O及网络等)等还是适用 可以使用标准C语言,但是用浮点数之前要特殊处理 WDK提供大量System Routine以供调用,相当于运用层…
1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTATUS status; -. return status; } 如果碰到一个函数返回了奇特的NTSTATUS值,正确的方法是在WDK的头文件比如(NTSTATUS.h)中去寻找答案. 2.字符串 驱动里的字符串一般用这个结构来容纳. typedef struct _UNICODE_STRING{ US…
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函数)指针的个数为:IRP_MJ_MAXINUM_FUNCTION,保存在一个数组中,编写驱动程序,实质上就是自己编写处理I/O请求IRP包的派遣函数,可以使用for循环将所有的派遣函数注册到同一个派遣函数.分发函数类似MFC消息机制中的回调函数,它的名字也是程序员自定义的,但是参数确定.卸载函数通过…
系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE ThreadHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBUTES objectAttributes OPTIONAL, IN HANDLE ProcessHandle OPTIONAL, OUT PCLIENT_ID ClientId OPTION…
1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建还是不够理想,这里稍微做下笔记. 2)概念:普通运用程序开发在R3,而内核开发在R0,R0是最高特权等级.内核空间不同于普通的程序代码空间,独享4GB寻址过程,内核空间被所有的运用程序共享,一旦内存程序崩溃,系统将崩溃,导致蓝屏或者重启. 3) 开发与调试方案:基于上述的概念,调试内核程序是一个很要…
/* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDEVICE_OBJECT DeviceObject; //驱动设备对象 PDRIVER_EXTENSION DriverExtension; //驱动扩展指针 UNICODE_STRING DriverName; //驱动程序的名字 PDRIVER_UNLOAD DriverUnload; //驱动的…
---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用,如果要使用,必须进行重载. b)标准C接口的声明,在包含头文件以及入口例程的前面要声明extern "C" c)类的静态成员函数的使用:在类内部声明一个静态函数作为分发函数Dispatch,这个静态函数当做普通的C函数调用,而C++声明的非静态函数调用该函数进行分配. 这一部分读下来,其…
1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThread:关闭线程句柄API函数:ZwClose.以下代码忽略同步问题 线程函数: void MyThreadProc(PVOID context) { PUNICODE_STRING str = (PUNICODE_STRING)context; //打印字符串 KdPrint(("PrintInMyT…