原文地址 http://www.osronline.com/ddkx/kmarch/other_0vfr.htm
一、在内核驱动代码中引入安全字符串函数
有两种方式可以引入安全字符串函数:
如果代码需要在系统为Windows XP及以后版本运行时,可以使用内联的方式;
如果代码需要运行在早于Windows XP时,则必须使用链接库的方式。
1) 在链接时以库的方式引入
#define NTSTRSAFE_LIB
#include <ntstrsafe.h>
在sources文件中,添加一TARGETLIBS条目如下:$(DDK_LIB_PATH)\ntstrsafe.lib.
2) 以内联的方式引入,只需包含头文件即可 #include <ntstrsafe.h>
在默认情况下,当引入了安全字符串函数后,那些被取代的c/c++运行库函数将变得无效,编译是会报错,提示需要使用安全字符串函数。
如果还希望继续使用c/c++运行库函数,即在使用安全字符串函数的时候,c/c++运行库函数还可以继续使用,
则需要在包含ntstrsafe.h之前先定义宏NTSTRSAFE_NO_DEPRECATE
#define NTSTRSAFE_NO_DEPRECATE
您可以只提供字节计数或字符计数的安全字符串函数。
只允许字节计数功能
包括ntstrsafe.h头文件包括之前在您的代码中的下面一行 。
#定义NTSTRSAFE_NO_CCH_FUNCTIONS
要只允许字符计数功能
包括ntstrsafe.h头文件包括之前在您的代码中的下面一行 。
#定义NTSTRSAFE_NO_CB_FUNCTIONS
您可以定义要么NTSTRSAFE_NO_CB_FUNCTIONS或NTSTRSAFE_NO_CCH_FUNCTIONS,但不能两者兼得。
任何ANSI或Unicode字符串可以包含的字符的最大数量是 STRSAFE_MAX_CCH。在ntstrsafe.h中定义了这个常量。
如果一个字符串将被放置到一个UNICODE_STRING结构,这个字符串的长度不得超过65,535个字符。
- 每个函数以目标缓冲区所占的字节大小作为其一个输入参数,因此可以保证在写入时不会超出缓冲区末端。
- 每个函数的输出字符串均以NULL结尾(null-terminate),即使该函数可能会对正确的结果进行截断。
- 所有函数均有返回值,类型为NTSTATUS,只有返回STATUS_SUCCESS时,操作结果才正确。
- 每个函数均有两种类型的版本,按字节或者按字符数。例如,RtlStringCbCatW和RtlStringCchCatW。
- 每个函数均有支持双字节的unicode字符(以W作为后缀)和单字节的ANSI字符(以A作为后缀)的版本。例如:RtlStringCbCatW和RtlStringCbCatA。
- 大部分函数有提供扩展版本的函数(以Ex作为后缀),例如,RtlStringCbCatW和RtlStringCbCatExW。
函数名含有Cb的是以字节数为单位,含有Cch的是以字符数为单位。
函数名
作用
取代
RtlStringCbCat(A/W)
RtlStringCbCatEx(A/W)
RtlStringCchCat(A/W)
RtlStringCchCatEx(A/W)将源字符串连接到目的字符串的末尾
strcat
wcscatRtlStringCbCatN(A/W)
RtlStringCbCatNEx(A/W)
RtlStringCchCatN(A/W)
RtlStringCchCatNEx(A/W)将源字符串指定数目的字符连接到目的字符串的末尾
strncat
wcsncatRtlStringCbCopy(A/W)
RtlStringCbCopyEx(A/W)
RtlStringCchCopy(A/W)
RtlStringCchCopyEx(A/W)将源字符串拷贝到目的字符串
strcpy
wcscpyRtlStringCbCopyN(A/W)
RtlStringCbCopyNEx(A/W)
RtlStringCchCopyN(A/W)
RtlStringCchCopyNEx(A/W)将源字符串指定数目的字符拷贝到目的字符串
strncpy
wcsncpyRtlStringCbLength(A/W)
RtlStringCchLength(A/W)确定字符串的长度
strlen
wcslen