Windows内核编程时的习惯与注意事项
2021-01-30 01:12
标签:buffer ring api 长度 typedef get cut exce 函数 Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 一、内核编程注意细节: 二、获取未公开API的方法: 注意:在安全编程时,经常需要用到一些微软未公开文档化的API,这时就需要自己去寻找。 三、变量定义习惯: 遵循WDK自己的一套规范的变量定义习惯,而不是再用原来的int之类的C语言的变量名称。 ULONG(unsigned long) PULONG(unsigned long*) 四、返回值: 很多API都返回 NTSTATUS 来表示函数执行的结果,其中有如下含义。 STATUS_SUCCESS 0x0000000 成功 更多的信息可以在 ntstatus.h 中查看。 五、内核中的异常处理: 在内核中一个小小的错误就可能导致蓝屏(例如"读写无效内存") 六、常用的内核内存函数 七、内核字符串种类 typedef struct _STRING { typedef struct _UNICODE_STRING { 常用字符串API函数: Windows内核编程时的习惯与注意事项 标签:buffer ring api 长度 typedef get cut exce 函数 原文地址:https://www.cnblogs.com/onetrainee/p/11676833.html
UCHAR(unsigned char) PUCHAR(unsinged char*)
UINT(unsigned int) PUNIT(unsigned int*)
VOID(void) PVOID(void*)
STATUS_INVALID_PARAMETER 0xC000000D 参数无效
STAUS_BUFFER_OVERFLOW 0x80000005 缓冲区长度不够
因此需要使用异常处理代码:
__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结尾。
但在驱动编程中,这样很容易出现蓝屏。
因此,为了避免这种问题,使用内核提供的字符串。
USHORT Length;//字节数,不是字符数 一定要* sizeof(CHAR)
USHORT MaximumLength;//字节数,不是字符数 一定要* sizeof(CHAR)
PWSTR Buffer;//非零结尾,中间也可能含有零
}ANSI_STRING, *PANSI_STRING;
USHORT Length;//字节数,不是字符数 一定要* sizeof(WCHAR)
USHORT MaximumLength;//字节数,不是字符数 一定要* sizeof(WCHAR)
PWSTR Buffer;//非零结尾,中间也可能含有零
} UNICODE_STRING, *PUNICODE_STRING;
文章标题:Windows内核编程时的习惯与注意事项
文章链接:http://soscw.com/index.php/essay/48926.html