You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
7.6 KiB
195 lines
7.6 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// File: rasclient_strsafe.h
|
|
//
|
|
// Synopsis: Includes strsafe.h from sdk\inc as well as adding other common RAS
|
|
// string related items like Macros
|
|
//
|
|
// Copyright (c) 2002 Microsoft Corporation
|
|
//
|
|
// Author: quintinb Created 02/05/2002
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
#ifndef _RASCLIENT_STRSAFE_INCLUDED_
|
|
#define _RASCLIENT_STRSAFE_INCLUDED_
|
|
#pragma once
|
|
|
|
#if DEBUG && defined(CMASSERTMSG)
|
|
#define CELEMS(x) ( \
|
|
CMASSERTMSG(sizeof(x) != sizeof(void*), TEXT("possible incorrect usage of CELEMS")), \
|
|
(sizeof(x))/(sizeof(x[0])) \
|
|
)
|
|
#else
|
|
#define CELEMS(x) ((sizeof(x))/(sizeof(x[0])))
|
|
#endif // DEBUG
|
|
|
|
#include <strsafe.h>
|
|
|
|
#define NULL_OKAY 0x1
|
|
#define EMPTY_STRING_OKAY 0x2
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: IsBadInputStringW
|
|
//
|
|
// Synopsis: Function to check if a given input string is a "good" string.
|
|
// The function is basically a wrapper for IsBadStringPtr but
|
|
// depending on what flags are passed to the function it will accept
|
|
// NULL string pointers (c_dwNullOkay), or empty strings (c_dwEmptyStringOkay).
|
|
// Note that we also require the string to be NULL terminated within
|
|
// the size given.
|
|
//
|
|
// Arguments: pszString - String pointer to check
|
|
// cchStringSizeToCheck - number of TCHARS to check in the input string (this will often be estimated)
|
|
// dwCheckFlags - Flags to control what checking to do on the string or
|
|
// what is an acceptable good string. Current list:
|
|
// NULL_OKAY -- allows NULL pointers to be "okay"
|
|
// EMPTY_STRING_OKAY -- allows the empty string ("")
|
|
// to be "okay"
|
|
//
|
|
// Returns: BOOL - TRUE if the given pointer is bad
|
|
// FALSE if the pointer passes all checks
|
|
//
|
|
// History: quintinb Created 02/18/02
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
__inline BOOL __stdcall IsBadInputStringW(LPCWSTR pszString, UINT cchStringSizeToCheck, DWORD dwCheckFlags)
|
|
{
|
|
BOOL bReturn = TRUE; // assume the worst, a bad input string
|
|
|
|
//
|
|
// First check the pointer to see if it is NULL or not
|
|
//
|
|
if (pszString)
|
|
{
|
|
//
|
|
// No point in having us check 0 characters in the string...
|
|
//
|
|
if (cchStringSizeToCheck)
|
|
{
|
|
//
|
|
// Okay, now let's check to see if the string is readable.
|
|
// Note that IsBadStringPtr will stop checking the string
|
|
// when it has examined the number of bytes passed in or
|
|
// when it hits a terminating NULL char, whichever it hits
|
|
// first.
|
|
//
|
|
if (!IsBadStringPtrW(pszString, cchStringSizeToCheck*sizeof(WCHAR)))
|
|
{
|
|
//
|
|
// Okay, it's readable. Let's check to see if it is NULL terminated
|
|
// within cchStringSizeToCheck, if not then we consider it a bad string.
|
|
//
|
|
|
|
if(SUCCEEDED(StringCchLengthW((LPWSTR)pszString, cchStringSizeToCheck, NULL))) //Note we actually don't care how long the string is...
|
|
{
|
|
//
|
|
// Finally, check to see if the string is the empty string
|
|
//
|
|
BOOL bEmptyString = (L'\0' == pszString[0]);
|
|
BOOL bEmptyStringOkay = (EMPTY_STRING_OKAY == (dwCheckFlags & EMPTY_STRING_OKAY));
|
|
|
|
if ((bEmptyString && bEmptyStringOkay) || !bEmptyString)
|
|
{
|
|
bReturn = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bReturn = (NULL_OKAY != (dwCheckFlags & NULL_OKAY)); // If NULL and NULL is okay, return FALSE.
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: IsBadInputStringA
|
|
//
|
|
// Synopsis: Function to check if a given input string is a "good" string.
|
|
// The function is basically a wrapper for IsBadStringPtr but
|
|
// depending on what flags are passed to the function it will accept
|
|
// NULL string pointers (c_dwNullOkay), or empty strings (c_dwEmptyStringOkay).
|
|
// Note that we also require the string to be NULL terminated within
|
|
// the size given.
|
|
//
|
|
// Arguments: pszString - String pointer to check
|
|
// cchStringSizeToCheck - number of TCHARS to check in the input string (this will often be estimated)
|
|
// dwCheckFlags - Flags to control what checking to do on the string or
|
|
// what is an acceptable good string. Current list:
|
|
// NULL_OKAY -- allows NULL pointers to be "okay"
|
|
// EMPTY_STRING_OKAY -- allows the empty string ("")
|
|
// to be "okay"
|
|
//
|
|
// Returns: BOOL - TRUE if the given pointer is bad
|
|
// FALSE if the pointer passes all checks
|
|
//
|
|
// History: quintinb Created 02/18/02
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
__inline BOOL __stdcall IsBadInputStringA(LPCSTR pszString, UINT cchStringSizeToCheck, DWORD dwCheckFlags)
|
|
{
|
|
BOOL bReturn = TRUE; // assume the worst, a bad input string
|
|
|
|
//
|
|
// First check the pointer to see if it is NULL or not
|
|
//
|
|
if (pszString)
|
|
{
|
|
//
|
|
// No point in having us check 0 characters in the string...
|
|
//
|
|
if (cchStringSizeToCheck)
|
|
{
|
|
//
|
|
// Okay, now let's check to see if the string is readable.
|
|
// Note that IsBadStringPtr will stop checking the string
|
|
// when it has examined the number of bytes passed in or
|
|
// when it hits a terminating NULL char, whichever it hits
|
|
// first.
|
|
//
|
|
if (!IsBadStringPtrA(pszString, cchStringSizeToCheck*sizeof(CHAR)))
|
|
{
|
|
//
|
|
// Okay, it's readable. Let's check to see if it is NULL terminated
|
|
// within cchStringSizeToCheck, if not then we consider it a bad string.
|
|
//
|
|
|
|
if(SUCCEEDED(StringCchLengthA((LPSTR)pszString, cchStringSizeToCheck, NULL))) //Note we actually don't care how long the string is...
|
|
{
|
|
//
|
|
// Finally, check to see if the string is the empty string
|
|
//
|
|
BOOL bEmptyString = ('\0' == pszString[0]);
|
|
BOOL bEmptyStringOkay = (EMPTY_STRING_OKAY == (dwCheckFlags & EMPTY_STRING_OKAY));
|
|
|
|
if ((bEmptyString && bEmptyStringOkay) || !bEmptyString)
|
|
{
|
|
bReturn = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bReturn = (NULL_OKAY != (dwCheckFlags & NULL_OKAY)); // If NULL and NULL is okay, return FALSE.
|
|
}
|
|
|
|
return bReturn;
|
|
}
|
|
|
|
|
|
#ifdef UNICODE
|
|
#define IsBadInputString IsBadInputStringW
|
|
#else
|
|
#define IsBadInputString IsBadInputStringA
|
|
#endif
|
|
|
|
#endif // _RASCLIENT_STRSAFE_INCLUDED_
|
|
|