c语言windows驱动编程,Windows驱动开发时编程习惯注意事项

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

一、内核编程注意细节:

在头文件中使用的是 ,而非普通的 。

在应用层编程时,在内核编程时,要使用自己的WDK文档。https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN

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

特征码搜索:遍历内核函数所在的模块。

解析内核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), 回去继续程序错误的代码。

六、常用的内核内存函数

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

b2588bec96100889904b4cf455230cf9.png

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函数:

1811b7f8ca01dad4d8cdf353039b6fe5.png

标签:__,STRING,Windows,编程,unsigned,内核,注意事项,内存

来源: https://www.cnblogs.com/onetrainee/p/11676833.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值