Windows Safe String (StrSafe库) 简介
来源:互联网 发布:windows 手写笔记软件 编辑:程序博客网 时间:2024/05/02 00:25
原始MSDN连接:
Url0, System Requirement WXP SP2 or Above, WSVR 2003 SP1 or Above:
http://msdn.microsoft.com/en-us/library/ms647466(v=vs.85)
Url1, System Requirement WCE 5.0 or Above:
http://msdn.microsoft.com/en-us/library/ms861501.aspx
一、背景
许多系统安全问题都是由于糟糕的缓冲区操作和缓冲区溢出造成的。糟糕的缓冲区操作通常是和字符串操作关联的。C/C++ 运行库提供的标准字符串操作函数(strcat, strcpy, sprintf等等)并不会阻止写缓冲区越界的行为。
基于以上的原因,Windows实现了一个安全的字符串操作库,用以替代C/C++运行库的标准字符串操作库以及Windows自己对应的实现版本(lstrcat,StrCat,StrCatBuff等等)。
二、StrSafe函数库概述
StrSafe库函数的优点包括:
- 目的缓冲区的大小总是作为参数被提供给函数,以确保函数不会写缓冲区越界;
- 缓冲区被保证以null结尾,即便是字符串被截断的情况下;
- 所有的函数返回一个HRESULT值,并且返回值只有唯一的正确码(S_OK);
- 每个函数都有分别有个一个“以字符个数计数”(“cch”)和一个以字节个数计数(“cb”)的版本。
- 大多数的函数都有一个扩展的版本(“Ex”)提供些更高阶的功能。
使用方法:
(1)首先包含头文件, #include <strsafe>
(2)在包含“strsafe.h”头文件之前,定义宏STRSAFE_LIB,则所有的函数都将从库中导出。如果未定义该宏(以及未定义STRSAFE_LIB_IMPL)
p.s. 这几个函数 StringCbGets, StringCbGetsEx, StringCchGets, 和 StringCchGetsEx 必须使用内联函数版本。
(3)当你包含了“strsafe.h”头文件,那些被strsafe.h取代的函数(C/C++运行库的标准字符串操作库以及Windows自己对应的实现版本)将会被弃用,试图使用这些函数可能会导致编译错误,其提示你去使用新的安全版本的字符串函数。如果关闭这个功能,则在包含“strsafe.h”头文件前,定义宏STRSAFE_NO_DEPRECATE
#define STRSAFE_NO_DEPRECATE
#include <strsafe>
(4)如果只允许以字符个数计数的函数版本,则在包含“strsafe.h”之前,定义宏STRSAFE_NO_CB_FUNCTIONS
#define STRSAFE_NO_CB_FUNCTIONS
#include <strsafe>
(5)如果只允许以字节个数计数的函数版本,则在包含“strsafe.h”之前,定义宏STRSAFE_NO_CCH_FUNCTIONS
#define STRSAFE_NO_CCH_FUNCTIONS
#include <strsafe>
P.S. 不能同时定义宏STRSAFE_NO_CB_FUNCTION和STRSAFE_NO_CCH_FUNCTIONS。
(6)支持的最大字符串长度 2,147,483,647 个字符,不管是ANSI和UNICODE
#define STRSAFE_MAX_CCH 2147483647 // max # of characters we support (same as INT_MAX)
(7)函数的返回值说明
返回值都是一个HRESULT值,有以下三个可能的值:
- S_OK,源字符串的数据都被成功提前,没有截取的行为,目的缓冲区以null结尾。
- STRSAFE_E_INVALID_PARAMETER,参数非法,不同的函数请参照MSDN了解细节。
- STRSAFE_E_INSUFFICIENT_BUFFER,有截断行为,有些情况下,这是可以接受的,可以不算做是失败
建议使用宏SUCCEEDED和FAILED去判断函数的返回值是否成功。
三、StrSafe函数库函数列表
(1)以字符计数的函数版本以及其对应的取代品
Function
Replaces
StringCchCat
StringCchCatEx
strcat, wcscat, _tcsat
lstrcat
StrCat
StrCatBuff
StringCchCatN
StringCchCatNEx
strncat
StrNCat
StringCchCopy
StringCchCopyEx
strcpy, wcscpy, _tcscpy
lstrcpy
StrCpy
StringCchCopyN
StringCchCopyNEx
strncpy, wcsncpy, _tcsncpy
StringCchGets
StringCchGetsEx
gets, _getws, _getts
StringCchPrintf
StringCchPrintfEx
sprintf, swprintf, _stprintf
wsprintf
wnsprintf
_snprintf, _snwprintf, _sntprintf
StringCchVPrintf
StringCchVPrintfEx
vsprintf, vswprintf, _vstprintf
vsnprintf, _vsnwprintf, _vsntprintf
wvsprintf
wvnsprintf
,
StringCchLength
strlen, wcslen, _tcslen
(2)以字节计数的函数版本以及其对应的取代品
Function
Replaces
StringCbCat
StringCbCatEx
strcat, wcscat, _tcsat
lstrcat
StrCat
StrCatBuff
StringCbCatN
StringCbCatNEx
strncat
StrNCat
StringCbCopy
StringCbCopyEx
strcpy, wcscpy, _tcscpy
lstrcpy
StrCpy
StringCbCopyN
StringCbCopyNEx
strncpy, wcsncpy, _tcsncpy
StringCbGets
StringCbGetsEx
gets, _getws, _getts
StringCbPrintf
StringCbPrintfEx
sprintf, swprintf, _stprintf
wsprintf
wnsprintf
_snprintf, _snwprintf, _sntprintf
StringCbVPrintf
StringCbVPrintfEx
vsprintf, vswprintf, _vstprintf
vsnprintf, _vsnwprintf, _vsntprintf
wvsprintf
wvnsprintf
StringCbLength
strlen, wcslen, _tcslen
- Windows Safe String (StrSafe库) 简介
- Safe string in window
- Safe string concatenation
- Visual Source Safe简介
- Visual Source Safe简介
- strsafe.h
- String用法简介(1)
- 敏捷(SAFe)常见问题
- safe
- safe
- strsafe与oralib
- 网络安全(Web-safe)字体
- Safe Or Unsafe(哈夫曼树)
- Safe-splash页面(1)
- Safe-Home页面(1)
- WINDOWS API 简介(一)
- WINDOWS API 简介(二)
- WINDOWS API 简介(三)
- 结构体字节对齐小结
- iphone develop tips
- ios开发之向输出流写数据
- 11g新特性:result cache 结果缓存
- 我的XHTML思想建立001:中文网页制作中段落缩进的方法_HTML
- Windows Safe String (StrSafe库) 简介
- OC自学笔记
- System.map
- Eclipse的Dbug
- 禁用U盘小妙招!
- grep查找文件内容
- mysql学习足迹之一【linux环境下源码安装mysql-5.5.25版本数据库】
- use WebKit as the Browser's underlying renderer
- ubuntu 命令行 apt-get 代理 上网