mirror of https://github.com/tongzx/nt5src
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.
225 lines
5.2 KiB
225 lines
5.2 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
validate.h
|
|
|
|
Abstract:
|
|
|
|
Author:
|
|
|
|
Vlad Sadovsky (vlads) 26-Jun-1998
|
|
|
|
Revision History:
|
|
|
|
26-Jun-1998 VladS created
|
|
|
|
--*/
|
|
|
|
#ifndef _validate_h_
|
|
#define _validate_h_
|
|
|
|
#include <stidebug.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* parameter validation macros */
|
|
|
|
/*
|
|
* call as:
|
|
*
|
|
* bOK = IS_VALID_READ_PTR(pfoo, CFOO);
|
|
*
|
|
* bOK = IS_VALID_HANDLE(hfoo, FOO);
|
|
*/
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define IS_VALID_READ_PTR(ptr, type) \
|
|
(IsBadReadPtr((ptr), sizeof(type)) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs read pointer - %#08lx"), (LPCSTR)#type TEXT(" *"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_WRITE_PTR(ptr, type) \
|
|
(IsBadWritePtr((PVOID)(ptr), sizeof(type)) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs write pointer - %#08lx"), (LPCSTR)#type TEXT(" *"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_STRING_PTRA(ptr, cch) \
|
|
((IsBadReadPtr((ptr), sizeof(char)) || IsBadStringPtrA((ptr), (UINT)(cch))) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid LPSTR pointer - %#08lx"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_STRING_PTRW(ptr, cch) \
|
|
((IsBadReadPtr((ptr), sizeof(WCHAR)) || IsBadStringPtrW((ptr), (UINT)(cch))) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid LPWSTR pointer - %#08lx"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_CODE_PTR(ptr, type) \
|
|
(IsBadCodePtr((FARPROC)(ptr)) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs code pointer - %#08lx"), (LPCSTR)#type, (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_READ_BUFFER(ptr, type, len) \
|
|
(IsBadReadPtr((ptr), sizeof(type)*(len)) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs read buffer pointer - %#08lx"), (LPCSTR)#type TEXT(" *"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_WRITE_BUFFER(ptr, type, len) \
|
|
(IsBadWritePtr((ptr), sizeof(type)*(len)) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs write buffer pointer - %#08lx"), (LPCSTR)#type TEXT(" *"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
|
|
(((dwFlags) & (~(dwAllFlags))) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid flags set - %#08lx"), ((dwFlags) & (~(dwAllFlags)))), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_PIDL(ptr) \
|
|
( !IsValidPIDL(ptr) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid PIDL pointer - %#08lx"), (ptr)), FALSE) : \
|
|
TRUE)
|
|
|
|
#define IS_VALID_SIZE(cb, cbExpected) \
|
|
((cb) != (cbExpected) ? \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid size - is %#08lx, expected %#08lx"), (cb), (cbExpected)), FALSE) : \
|
|
TRUE)
|
|
|
|
|
|
#else
|
|
|
|
#define IS_VALID_READ_PTR(ptr, type) \
|
|
(! IsBadReadPtr((ptr), sizeof(type)))
|
|
|
|
#define IS_VALID_WRITE_PTR(ptr, type) \
|
|
(! IsBadWritePtr((PVOID)(ptr), sizeof(type)))
|
|
|
|
#define IS_VALID_STRING_PTRA(ptr, cch) \
|
|
(! IsBadStringPtrA((ptr), (UINT)(cch)))
|
|
|
|
#define IS_VALID_STRING_PTRW(ptr, cch) \
|
|
(! IsBadStringPtrW((ptr), (UINT)(cch)))
|
|
|
|
#define IS_VALID_CODE_PTR(ptr, type) \
|
|
(! IsBadCodePtr((FARPROC)(ptr)))
|
|
|
|
#define IS_VALID_READ_BUFFER(ptr, type, len) \
|
|
(! IsBadReadPtr((ptr), sizeof(type)*(len)))
|
|
|
|
#define IS_VALID_WRITE_BUFFER(ptr, type, len) \
|
|
(! IsBadWritePtr((ptr), sizeof(type)*(len)))
|
|
|
|
#define FLAGS_ARE_VALID(dwFlags, dwAllFlags) \
|
|
(((dwFlags) & (~(dwAllFlags))) ? FALSE : TRUE)
|
|
|
|
#define IS_VALID_PIDL(ptr) \
|
|
(IsValidPIDL(ptr))
|
|
|
|
#define IS_VALID_SIZE(cb, cbExpected) \
|
|
((cb) == (cbExpected))
|
|
|
|
#endif
|
|
|
|
#ifdef UNICODE
|
|
#define IS_VALID_STRING_PTR IS_VALID_STRING_PTRW
|
|
#else
|
|
#define IS_VALID_STRING_PTR IS_VALID_STRING_PTRA
|
|
#endif
|
|
|
|
|
|
/* handle validation macros */
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define IS_VALID_HANDLET(hnd, type) \
|
|
(IsValidH##type(hnd) ? \
|
|
TRUE : \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid H") #type TEXT(" - %#08lx"), (hnd)), FALSE))
|
|
|
|
#else
|
|
|
|
#define IS_VALID_HANDLET(hnd, type) \
|
|
(IsValidH##type(hnd))
|
|
|
|
#endif
|
|
|
|
//
|
|
// Validation macros
|
|
//
|
|
|
|
//#define IS_VALID_HANDLE(h) (((h) != NULL) && ((h) != INVALID_HANDLE_VALUE))
|
|
|
|
#define IS_VALID_HANDLE(hnd) (IsValidHANDLE(hnd))
|
|
|
|
/* structure validation macros */
|
|
|
|
// Define VSTF if you want to validate the fields in structures. This
|
|
// requires a handler function (of the form IsValid*()) that knows how
|
|
// to validate the specific structure type.
|
|
|
|
#ifdef VSTF
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define IS_VALID_STRUCT_PTR(ptr, type) \
|
|
(IsValidP##type(ptr) ? \
|
|
TRUE : \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs pointer - %#08lx"), (LPCSTR)#type TEXT(" *"), (ptr)), FALSE))
|
|
|
|
#define IS_VALID_STRUCTEX_PTR(ptr, type, x) \
|
|
(IsValidP##type(ptr, x) ? \
|
|
TRUE : \
|
|
(DPRINTF(DM_ERROR, TEXT("invalid %hs pointer - %#08lx"), (LPCSTR)#type TEXT(" *"), (ptr)), FALSE))
|
|
|
|
#else
|
|
|
|
#define IS_VALID_STRUCT_PTR(ptr, type) \
|
|
(IsValidP##type(ptr))
|
|
|
|
#define IS_VALID_STRUCTEX_PTR(ptr, type, x) \
|
|
(IsValidP##type(ptr, x))
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
#define IS_VALID_STRUCT_PTR(ptr, type) \
|
|
(! IsBadReadPtr((ptr), sizeof(type)))
|
|
|
|
#define IS_VALID_STRUCTEX_PTR(ptr, type, x) \
|
|
(! IsBadReadPtr((ptr), sizeof(type)))
|
|
|
|
#endif // VSTF
|
|
|
|
/* OLE interface validation macro */
|
|
|
|
#define IS_VALID_INTERFACE_PTR(ptr, iface) \
|
|
IS_VALID_STRUCT_PTR(ptr, ##iface)
|
|
|
|
|
|
|
|
BOOL IsValidHANDLE(HANDLE hnd); // Compares with NULL and INVALID_HANDLE_VALUE
|
|
BOOL IsValidHANDLE2(HANDLE hnd); // Compares with INVALID_HANDLE_VALUE
|
|
|
|
BOOL
|
|
IsValidHWND(
|
|
HWND hwnd);
|
|
|
|
BOOL
|
|
IsValidHMENU(
|
|
HMENU hmenu);
|
|
|
|
BOOL
|
|
IsValidShowCmd(
|
|
int nShow);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif // _validate_h_
|
|
|