天天看点

引入内核模式安全字符串函数

原文地址 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个字符。

基于Windows XP SP1 以及随后的操作系统的Windows DDK 版本提供了安全字符串函数 。这类函数被设计的目的是用来取代相同功能的c/c++ 标准函数和其它微软提供的库函数。这类函数具有以下特征: 

  • 每个函数以目标缓冲区所占的字节大小作为其一个输入参数,因此可以保证在写入时不会超出缓冲区末端。
  • 每个函数的输出字符串均以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

   wcscat

   RtlStringCbCatN(A/W)  

   RtlStringCbCatNEx(A/W)  

   RtlStringCchCatN(A/W)  

   RtlStringCchCatNEx(A/W) 

将源字符串指定数目的字符连接到目的字符串的末尾 

   strncat

wcsncat

   RtlStringCbCopy(A/W)  

   RtlStringCbCopyEx(A/W)  

   RtlStringCchCopy(A/W)  

   RtlStringCchCopyEx(A/W) 

将源字符串拷贝到目的字符串

strcpy

wcscpy

   RtlStringCbCopyN(A/W)  

   RtlStringCbCopyNEx(A/W)  

   RtlStringCchCopyN(A/W)  

   RtlStringCchCopyNEx(A/W) 

将源字符串指定数目的字符拷贝到目的字符串

strncpy

wcsncpy

   RtlStringCbLength(A/W)  

   RtlStringCchLength(A/W) 

确定字符串的长度

strlen

wcslen

继续阅读