Windows内核编程时的习惯与注意事项

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

一、内核编程注意细节:

  1. 在头文件中使用的是 <ntddk.h>,而非普通的 <windows.h>。
  2. 在应用层编程时,在内核编程时,要使用自己的WDK文档。https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN

二、获取未公开API的方法:

  1. 特征码搜索:遍历内核函数所在的模块。
  2. 解析内核PDB文件:用Windbg U 指令查看汇编函数代码。

  注意:在安全编程时,经常需要用到一些微软未公开文档化的API,这时就需要自己去寻找。

三、变量定义习惯:

 遵循WDK自己的一套规范的变量定义习惯,而不是再用原来的int之类的C语言的变量名称。

ULONG(unsigned long)  PULONG(unsigned long*)
    UCHAR(unsigned char)  PUCHAR(unsinged char*)
    UINT(unsigned int)     PUNIT(unsigned int*)
    VOID(void)                PVOID(void*)

四、返回值:

  很多API都返回 NTSTATUS 来表示函数执行的结果,其中有如下含义。

  STATUS_SUCCESS 0x0000000 成功
  STATUS_INVALID_PARAMETER 0xC000000D 参数无效
  STAUS_BUFFER_OVERFLOW    0x80000005  缓冲区长度不够

  更多的信息可以在 ntstatus.h 中查看。

五、内核中的异常处理:

在内核中一个小小的错误就可能导致蓝屏(例如"读写无效内存")
        因此需要使用异常处理代码:

 __try {
            // 可能出错的代码
        }
        __except (filter_value) {
            // 出错时要执行的代码
        }

filter_value解析:
        EXCEPTION_EXECUTE_HANDLER(1) 代码进入except块。
        EXCEPTION_CONTINUE_SEARCH(0) 不处理异常,由上一层调用函数处理。
        EXCEPTION_CONTINUE_EXECUTION(-1), 回去继续程序错误的代码。

六、常用的内核内存函数
    对内存的使用,主要就是:申请、设置、拷贝以及释放。

    

   PVOID ExAllocatePool(     __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType, // 这里主要说明其是 主要分页内存还是非分页内存     SIZE_T // NumberOfBytes   );

七、内核字符串种类
  在R3层时都是以\0或\0\0结尾。
  但在驱动编程中,这样很容易出现蓝屏。
  因此,为了避免这种问题,使用内核提供的字符串。

typedef struct _STRING {
            USHORT  Length;//字节数,不是字符数 一定要* sizeof(CHAR)
            USHORT  MaximumLength;//字节数,不是字符数 一定要* sizeof(CHAR)
            PWSTR  Buffer;//非零结尾,中间也可能含有零
        }ANSI_STRING, *PANSI_STRING;

typedef struct _UNICODE_STRING {
            USHORT  Length;//字节数,不是字符数 一定要* sizeof(WCHAR)
            USHORT  MaximumLength;//字节数,不是字符数 一定要* sizeof(WCHAR)
            PWSTR  Buffer;//非零结尾,中间也可能含有零
        } UNICODE_STRING, *PUNICODE_STRING;

  常用字符串API函数:

  

  

原文地址:https://www.cnblogs.com/onetrainee/p/11676833.html

时间: 2024-08-28 08:19:53

Windows内核编程时的习惯与注意事项的相关文章

C++windows内核编程笔记day07_day08,可视化建菜单、加速键使用、绘图等

可视化操作创建的菜单,加载到窗口. 方法1:注册时指定菜单 wce.lpszMenuName=MAKEINTRESOURCE(IDR_MENUMAIN);//数字形式的资源ID转换为字符串形式的资源 方法2: //创建窗口时加载菜单资源 HMENU menumain= LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENUMAIN)); menumain 传入 CreateWindowEx();//倒数第三个参数 窗口指定小图标: 1.注册时指定 wce.hI

C++windows内核编程笔记day09_day10,对话框和窗口基本控件等的使用

//设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗口背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce.hbrBackground=CreateSolidBrush(RGB(0,0,255)); //设置字体背景 SetBkColor(hdc,RGB(0,0,200)); //设置字体背景模式 SetBkMode(hdc,TRANSPARENT);//字体背景透明 //创建字体,成功返回字体,失败返回

C++windows内核编程笔记day11 win32静态库和动态库的使用

windows库程序: 静态库: 源代码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB 动态库: 函数被程序或其他动态库调用,被调用时,代码只有1份,文件后缀.DLL 静态库(C语言): 创建时,选择文本类型文件,输入Clib.c,设置输出路径 ../lib/Clib.lib int Clib_add(int a,int b) { return a+b; } 同一上工作区,建立控制台程序(.c文件)调用静态库: #include<STDIO.H> #pragma com

C++windows内核编程笔记day14 其他线程同步技术

线程同步技术: 原子锁 临界区(段) 互斥 事件 信号量(线程示例时已经使用过) 可等候定时器 使用范围:原子锁<临界区<互斥 效率:    原子锁>临界区(用户态)>互斥(内核态) 一般用临界区. //等候多个信号 DWORD WaitForMultipleObjects( DWORD nCount,             // number of handles in array CONST HANDLE *lpHandles,  // object-handle array

C++windows内核编程笔记day13 进程、线程与信号量

Windows进程 进程是一个容器,包含程序执行需要的代码.数据.资源等信息, windows进程的特点: 每个进程都有自己的ID号 每个进程都有自己的地址空间,进程之间无法访问对方的地址空间. 每个进程都有自己的安全属性 每个进程至少包含一个线程. 获取和释放环境信息 GetEnvironmentStrings FreeEnvironmentStrings 获取或设置 本程序的环境变量 GetEnvironmentVariable SetEnvironmentVariable 示例: char

寒江独钓Windows内核编程——串口过滤

一.过滤的概念: 过滤是在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件或者下层的真是驱动程序,就加入了新的功能. 1.1 设备绑定的内核API 进行过滤的最主要的方法是对一个设备对象(Device Object)进行绑定.通过编程可以生成一个虚拟设备对象,并“绑定”(Attach)在一个真实的设备上.一旦绑定,则本来操作系统发送给真实设备的请求,就会首先发送到这个虚拟设备. 在WDK中,有多个内核API能实现绑定的功能.以下三个绑定API是从WDK

c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理

windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 GetCurrentDirectory();//获取当前工作文件夹 SetCurrentDirectory();//改动当前工作文件夹 CreateFile/ReadFile/WriteFile/GetFileSize/SetFilePointer //返回文件大小的低32位 DWORD GetF

windows内核编程--头文件包含的奇葩的问题

先给解决办法:如果您认为您的头文件包含木有问题,请用WDK的build命令编译试试,很有可能是因为您用了VS 2010 + EASY SYS 环境的问题 使用VS 2010 + EASY SYS 搭建的环境中,包含了ke.h 这是在网上找的关于用到EPROCESS和ETHREAD的头文件. 在这种环境下编译一直出错. 在这里不得不大声说一句:妈B,怎么调戏都调戏不好... 如这张图: 解决办法是: 不用调.. 真的不用调. 只需要用WDK带的编译器BUILD,就OK

windows内核编程--头文件包括的奇葩的问题

先给解决的方法:假设您觉得您的头文件包括木有问题,请用WDK的build命令编译试试,非常有可能是由于您用了VS 2010 + EASY SYS 环境的问题 使用VS 2010 + EASY SYS 搭建的环境中,包括了ke.h 这是在网上找的关于用到EPROCESS和ETHREAD的头文件. 在这样的环境下编译一直出错. 在这里不得不大声说一句:妈B,怎么调戏都调戏不好... 如这张图: 解决的方法是: 不用调.. 真的不用调. 仅仅须要用WDK带的编译器BUILD,就OK watermark