|
|
|
1 |
|
/****************************************************************** |
2 |
|
* * |
3 |
|
* strsafe.h -- This module defines safer C library string * |
4 |
|
* routine replacements. These are meant to make C * |
5 |
|
* a bit more safe in reference to security and * |
6 |
|
* robustness * |
7 |
|
* * |
8 |
|
* Copyright (c) Microsoft Corp. All rights reserved. * |
9 |
|
* * |
10 |
|
******************************************************************/ |
11 |
|
#ifndef _STRSAFE_H_INCLUDED_ |
12 |
|
#define _STRSAFE_H_INCLUDED_ |
13 |
|
#if (_MSC_VER > 1000) |
14 |
|
#pragma once |
15 |
|
#endif |
16 |
|
|
17 |
|
#include <stdio.h> // for _vsnprintf, _vsnwprintf, getc, getwc |
18 |
|
#include <string.h> // for memset |
19 |
|
#include <stdarg.h> // for va_start, etc. |
20 |
|
#include <specstrings.h> // for __in, etc. |
21 |
|
|
22 |
|
#if !defined(_W64) |
23 |
|
#if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && (_MSC_VER >= 1300) |
24 |
|
#define _W64 __w64 |
25 |
|
#else |
26 |
|
#define _W64 |
27 |
|
#endif |
28 |
|
#endif |
29 |
|
|
30 |
|
#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64) || defined(_M_AMD64) |
31 |
|
#define ALIGNMENT_MACHINE |
32 |
|
#define UNALIGNED __unaligned |
33 |
|
#if defined(_WIN64) |
34 |
|
#define UNALIGNED64 __unaligned |
35 |
|
#else |
36 |
|
#define UNALIGNED64 |
37 |
|
#endif |
38 |
|
#else |
39 |
|
#undef ALIGNMENT_MACHINE |
40 |
|
#define UNALIGNED |
41 |
|
#define UNALIGNED64 |
42 |
|
#endif |
43 |
|
|
44 |
|
// typedefs |
45 |
|
#ifdef _WIN64 |
46 |
|
typedef unsigned __int64 size_t; |
47 |
|
#else |
48 |
|
typedef _W64 unsigned int size_t; |
49 |
|
#endif |
50 |
|
|
51 |
|
#ifndef _HRESULT_DEFINED |
52 |
|
#define _HRESULT_DEFINED |
53 |
|
typedef __success(return >= 0) long HRESULT; |
54 |
|
#endif |
55 |
|
|
56 |
|
typedef unsigned long DWORD; |
57 |
|
|
58 |
|
|
59 |
|
// macros |
60 |
|
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0) |
61 |
|
#define FAILED(hr) (((HRESULT)(hr)) < 0) |
62 |
|
|
63 |
|
#define S_OK ((HRESULT)0L) |
64 |
|
|
65 |
|
#ifndef SORTPP_PASS |
66 |
|
// compiletime asserts (failure results in error C2118: negative subscript) |
67 |
|
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] |
68 |
|
#else |
69 |
|
#define C_ASSERT(e) |
70 |
|
#endif |
71 |
|
|
72 |
|
#ifdef __cplusplus |
73 |
|
#define EXTERN_C extern "C" |
74 |
|
#else |
75 |
|
#define EXTERN_C extern |
76 |
|
#endif |
77 |
|
|
78 |
|
// use the new secure crt functions if available |
79 |
|
#ifndef STRSAFE_USE_SECURE_CRT |
80 |
|
#if defined(__GOT_SECURE_LIB__) && (__GOT_SECURE_LIB__ >= 200402L) |
81 |
|
#define STRSAFE_USE_SECURE_CRT 0 |
82 |
|
#else |
83 |
|
#define STRSAFE_USE_SECURE_CRT 0 |
84 |
|
#endif |
85 |
|
#endif // !STRSAFE_USE_SECURE_CRT |
86 |
|
|
87 |
|
#ifdef _M_CEE_PURE |
88 |
|
#define STRSAFEAPI __inline HRESULT __clrcall |
89 |
|
#else |
90 |
|
#define STRSAFEAPI __inline HRESULT __stdcall |
91 |
|
#endif |
92 |
|
|
93 |
|
#if defined(STRSAFE_LIB_IMPL) || defined(STRSAFE_LIB) |
94 |
|
#define STRSAFEWORKERAPI EXTERN_C HRESULT __stdcall |
95 |
|
#else |
96 |
|
#define STRSAFEWORKERAPI static STRSAFEAPI |
97 |
|
#endif |
98 |
|
|
99 |
|
#ifdef STRSAFE_LOCALE_FUNCTIONS |
100 |
|
#if defined(STRSAFE_LOCALE_LIB_IMPL) || defined(STRSAFE_LIB) |
101 |
|
#define STRSAFELOCALEWORKERAPI EXTERN_C HRESULT __stdcall |
102 |
|
#else |
103 |
|
#define STRSAFELOCALEWORKERAPI static STRSAFEAPI |
104 |
|
#endif |
105 |
|
#endif // STRSAFE_LOCALE_FUNCTIONS |
106 |
|
|
107 |
|
#if defined(STRSAFE_LIB) |
108 |
|
#pragma comment(lib, "strsafe.lib") |
109 |
|
#endif |
110 |
|
|
111 |
|
// The user can request no "Cb" or no "Cch" fuctions, but not both |
112 |
|
#if defined(STRSAFE_NO_CB_FUNCTIONS) && defined(STRSAFE_NO_CCH_FUNCTIONS) |
113 |
|
#error cannot specify both STRSAFE_NO_CB_FUNCTIONS and STRSAFE_NO_CCH_FUNCTIONS !! |
9522 |
|
#pragma deprecated(_getws) |
9523 |
|
|
9524 |
|
// Then all the windows.h names |
9525 |
|
#undef lstrcpy |
9526 |
|
#undef lstrcat |
9527 |
|
#undef wsprintf |
9528 |
|
#undef wvsprintf |
9529 |
|
#pragma deprecated(lstrcpy) |
9530 |
|
#pragma deprecated(lstrcat) |
9531 |
|
#pragma deprecated(wsprintf) |
9532 |
|
#pragma deprecated(wvsprintf) |
9533 |
|
#ifdef UNICODE |
9534 |
|
#define lstrcpy lstrcpyW |
9535 |
|
#define lstrcat lstrcatW |
9536 |
|
#define wsprintf wsprintfW |
9537 |
|
#define wvsprintf wvsprintfW |
9538 |
|
#else |
9539 |
|
#define lstrcpy lstrcpyA |
9540 |
|
#define lstrcat lstrcatA |
9541 |
|
#define wsprintf wsprintfA |
9542 |
|
#define wvsprintf wvsprintfA |
9543 |
|
#endif |
9544 |
|
|
9545 |
|
// Then the shlwapi names |
9546 |
|
#undef StrCpyA |
9547 |
|
#undef StrCpy |
9548 |
|
#undef StrCatA |
9549 |
|
#undef StrCat |
9550 |
|
#undef StrNCat |
9551 |
|
#undef StrCatN |
9552 |
|
#pragma deprecated(StrCpyA) |
9553 |
|
#pragma deprecated(StrCatA) |
9554 |
|
#pragma deprecated(StrCatN) |
9555 |
|
#pragma deprecated(StrCpy) |
9556 |
|
#pragma deprecated(StrCat) |
9557 |
|
#pragma deprecated(StrNCat) |
9558 |
|
#define StrCpyA lstrcpyA |
9559 |
|
#define StrCatA lstrcatA |
9560 |
|
#define StrCatN StrNCat |
9561 |
|
#ifdef UNICODE |
9562 |
|
#define StrCpy StrCpyW |
9563 |
|
#define StrCat StrCatW |
9564 |
|
#define StrNCat StrNCatW |
9565 |
|
#else |
9566 |
|
#define StrCpy lstrcpyA |
9567 |
|
#define StrCat lstrcatA |
9568 |
|
#define StrNCat StrNCatA |
9569 |
|
#endif |
9570 |
|
|
9571 |
|
#undef _tcscpy |
9572 |
|
#undef _ftcscpy |
9573 |
|
#undef _tcscat |
9574 |
|
#undef _ftcscat |
9575 |
|
#undef _stprintf |
9576 |
|
#undef _sntprintf |
9577 |
|
#undef _vstprintf |
9578 |
|
#undef _vsntprintf |
9579 |
|
#undef _getts |
9580 |
|
#pragma deprecated(_tcscpy) |
9581 |
|
#pragma deprecated(_ftcscpy) |
9582 |
|
#pragma deprecated(_tcscat) |
9583 |
|
#pragma deprecated(_ftcscat) |
9584 |
|
#pragma deprecated(_stprintf) |
9585 |
|
#pragma deprecated(_sntprintf) |
9586 |
|
#pragma deprecated(_vstprintf) |
9587 |
|
#pragma deprecated(_vsntprintf) |
9588 |
|
#pragma deprecated(_getts) |
9589 |
|
#ifdef _UNICODE |
9590 |
|
#define _tcscpy wcscpy |
9591 |
|
#define _ftcscpy wcscpy |
9592 |
|
#define _tcscat wcscat |
9593 |
|
#define _ftcscat wcscat |
9594 |
|
#define _stprintf swprintf |
9595 |
|
#define _sntprintf _snwprintf |
9596 |
|
#define _vstprintf vswprintf |
9597 |
|
#define _vsntprintf _vsnwprintf |
9598 |
|
#define _getts _getws |
9599 |
|
#else |
9600 |
|
#define _tcscpy strcpy |
9601 |
|
#define _ftcscpy strcpy |
9602 |
|
#define _tcscat strcat |
9603 |
|
#define _ftcscat strcat |
9604 |
|
#define _stprintf sprintf |
9605 |
|
#define _sntprintf _snprintf |
9606 |
|
#define _vstprintf vsprintf |
9607 |
|
#define _vsntprintf _vsnprintf |
9608 |
|
#define _getts gets |
9609 |
|
#endif |
9610 |
|
|
9611 |
|
#else // DEPRECATE_SUPPORTED |
9612 |
|
|
9613 |
|
#undef strcpy |
9614 |
|
#define strcpy strcpy_instead_use_StringCchCopyA_or_StringCbCopyA; |
9615 |
|
|
9616 |
|
#undef wcscpy |
9617 |
|
#define wcscpy wcscpy_instead_use_StringCchCopyW_or_StringCbCopyW; |
9618 |
|
|
9619 |
|
#undef strcat |
9620 |
|
#define strcat strcat_instead_use_StringCchCatA_or_StringCbCatA; |
9621 |
|
|
9622 |
|
#undef wcscat |
9623 |
|
#define wcscat wcscat_instead_use_StringCchCatW_or_StringCbCatW; |
9624 |
|
|
9625 |
|
#undef sprintf |
9626 |
|
#define sprintf sprintf_instead_use_StringCchPrintfA_or_StringCbPrintfA; |
9627 |
|
|
9628 |
|
#undef swprintf |
9629 |
|
#define swprintf swprintf_instead_use_StringCchPrintfW_or_StringCbPrintfW; |
9630 |
|
|
9631 |
|
#undef vsprintf |
9632 |
|
#define vsprintf vsprintf_instead_use_StringCchVPrintfA_or_StringCbVPrintfA; |
9633 |
|
|
9634 |
|
#undef vswprintf |
9635 |
|
#define vswprintf vswprintf_instead_use_StringCchVPrintfW_or_StringCbVPrintfW; |
9636 |
|
|
9637 |
|
#undef _snprintf |
9638 |
|
#define _snprintf _snprintf_instead_use_StringCchPrintfA_or_StringCbPrintfA; |
9639 |
|
|
9640 |
|
#undef _snwprintf |
9641 |
|
#define _snwprintf _snwprintf_instead_use_StringCchPrintfW_or_StringCbPrintfW; |
9642 |
|
|
9643 |
|
#undef _vsnprintf |
9644 |
|
#define _vsnprintf _vsnprintf_instead_use_StringCchVPrintfA_or_StringCbVPrintfA; |
9645 |
|
|
9646 |
|
#undef _vsnwprintf |
9647 |
|
#define _vsnwprintf _vsnwprintf_instead_use_StringCchVPrintfW_or_StringCbVPrintfW; |
9648 |
|
|
9649 |
|
#undef strcpyA |
9650 |
|
#define strcpyA strcpyA_instead_use_StringCchCopyA_or_StringCbCopyA; |
9651 |
|
|
9652 |
|
#undef strcpyW |
9653 |
|
#define strcpyW strcpyW_instead_use_StringCchCopyW_or_StringCbCopyW; |
9654 |
|
|
9655 |
|
#undef lstrcpy |
9656 |
|
#define lstrcpy lstrcpy_instead_use_StringCchCopy_or_StringCbCopy; |
9657 |
|
|
9658 |
|
#undef lstrcpyA |
9659 |
|
#define lstrcpyA lstrcpyA_instead_use_StringCchCopyA_or_StringCbCopyA; |
9660 |
|
|
9661 |
|
#undef lstrcpyW |
9662 |
|
#define lstrcpyW lstrcpyW_instead_use_StringCchCopyW_or_StringCbCopyW; |
9663 |
|
|
9664 |
|
#undef StrCpy |
9665 |
|
#define StrCpy StrCpy_instead_use_StringCchCopy_or_StringCbCopy; |
9666 |
|
|
9667 |
|
#undef StrCpyA |
9668 |
|
#define StrCpyA StrCpyA_instead_use_StringCchCopyA_or_StringCbCopyA; |
9669 |
|
|
9670 |
|
#undef StrCpyW |
9671 |
|
#define StrCpyW StrCpyW_instead_use_StringCchCopyW_or_StringCbCopyW; |
9672 |
|
|
9673 |
|
#undef _tcscpy |
9674 |
|
#define _tcscpy _tcscpy_instead_use_StringCchCopy_or_StringCbCopy; |
9675 |
|
|
9676 |
|
#undef _ftcscpy |
9677 |
|
#define _ftcscpy _ftcscpy_instead_use_StringCchCopy_or_StringCbCopy; |
9678 |
|
|
9679 |
|
#undef lstrcat |
9680 |
|
#define lstrcat lstrcat_instead_use_StringCchCat_or_StringCbCat; |
9681 |
|
|
9682 |
|
#undef lstrcatA |
9683 |
|
#define lstrcatA lstrcatA_instead_use_StringCchCatA_or_StringCbCatA; |
9684 |
|
|
9685 |
|
#undef lstrcatW |
9686 |
|
#define lstrcatW lstrcatW_instead_use_StringCchCatW_or_StringCbCatW; |
9687 |
|
|
9688 |
|
#undef StrCat |
9689 |
|
#define StrCat StrCat_instead_use_StringCchCat_or_StringCbCat; |
9690 |
|
|
9691 |
|
#undef StrCatA |
9692 |
|
#define StrCatA StrCatA_instead_use_StringCchCatA_or_StringCbCatA; |
9693 |
|
|
9694 |
|
#undef StrCatW |
9695 |
|
#define StrCatW StrCatW_instead_use_StringCchCatW_or_StringCbCatW; |
9696 |
|
|
9697 |
|
#undef StrNCat |
9698 |
|
#define StrNCat StrNCat_instead_use_StringCchCatN_or_StringCbCatN; |
9699 |
|
|
9700 |
|
#undef StrNCatA |
9701 |
|
#define StrNCatA StrNCatA_instead_use_StringCchCatNA_or_StringCbCatNA; |
9702 |
|
|
9703 |
|
#undef StrNCatW |
9704 |
|
#define StrNCatW StrNCatW_instead_use_StringCchCatNW_or_StringCbCatNW; |
9705 |
|
|
9706 |
|
#undef StrCatN |
9707 |
|
#define StrCatN StrCatN_instead_use_StringCchCatN_or_StringCbCatN; |
9708 |
|
|
9709 |
|
#undef StrCatNA |
9710 |
|
#define StrCatNA StrCatNA_instead_use_StringCchCatNA_or_StringCbCatNA; |
9711 |
|
|
9712 |
|
#undef StrCatNW |
9713 |
|
#define StrCatNW StrCatNW_instead_use_StringCchCatNW_or_StringCbCatNW; |
9714 |
|
|
9715 |
|
#undef _tcscat |
9716 |
|
#define _tcscat _tcscat_instead_use_StringCchCat_or_StringCbCat; |
9717 |
|
|
9718 |
|
#undef _ftcscat |
9719 |
|
#define _ftcscat _ftcscat_instead_use_StringCchCat_or_StringCbCat; |
9720 |
|
|
9721 |
|
#undef wsprintf |
9722 |
|
#define wsprintf wsprintf_instead_use_StringCchPrintf_or_StringCbPrintf; |
9723 |
|
|
9724 |
|
#undef wsprintfA |
9725 |
|
#define wsprintfA wsprintfA_instead_use_StringCchPrintfA_or_StringCbPrintfA; |
9726 |
|
|
9727 |
|
#undef wsprintfW |
9728 |
|
#define wsprintfW wsprintfW_instead_use_StringCchPrintfW_or_StringCbPrintfW; |
9729 |
|
|
9730 |
|
#undef wvsprintf |
9731 |
|
#define wvsprintf wvsprintf_instead_use_StringCchVPrintf_or_StringCbVPrintf; |
9732 |
|
|
9733 |
|
#undef wvsprintfA |
9734 |
|
#define wvsprintfA wvsprintfA_instead_use_StringCchVPrintfA_or_StringCbVPrintfA; |
9735 |
|
|
9736 |
|
#undef wvsprintfW |
9737 |
|
#define wvsprintfW wvsprintfW_instead_use_StringCchVPrintfW_or_StringCbVPrintfW; |
9738 |
|
|
9739 |
|
#undef _vstprintf |
9740 |
|
#define _vstprintf _vstprintf_instead_use_StringCchVPrintf_or_StringCbVPrintf; |
9741 |
|
|
9742 |
|
#undef _vsntprintf |
9743 |
|
#define _vsntprintf _vsntprintf_instead_use_StringCchVPrintf_or_StringCbVPrintf; |
9744 |
|
|
9745 |
|
#undef _stprintf |
9746 |
|
#define _stprintf _stprintf_instead_use_StringCchPrintf_or_StringCbPrintf; |
9747 |
|
|
9748 |
|
#undef _sntprintf |
9749 |
|
#define _sntprintf _sntprintf_instead_use_StringCchPrintf_or_StringCbPrintf; |
9750 |
|
|
9751 |
|
#undef _getts |
9752 |
|
#define _getts _getts_instead_use_StringCchGets_or_StringCbGets; |
9753 |
|
|
9754 |
|
#undef gets |
9755 |
|
#define gets _gets_instead_use_StringCchGetsA_or_StringCbGetsA; |
9756 |
|
|
9757 |
|
#undef _getws |
9758 |
|
#define _getws _getws_instead_use_StringCchGetsW_or_StringCbGetsW; |
9759 |
|
|
9760 |
|
#endif // DEPRECATE_SUPPORTED |
9761 |
|
#endif // !STRSAFE_NO_DEPRECATE |
9762 |
|
|
9763 |
|
#pragma warning(pop) |
9764 |
|
|
9765 |
|
#endif // _STRSAFE_H_INCLUDED_ |
9766 |
|
|
9767 |
|
|
|
|
|