windows-nt/Source/XPSP1/NT/com/ole32/olethunk/ole16/compobj/valid.cxx
2020-09-26 16:20:57 +08:00

201 lines
4 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: Valid.cxx (16 bit target)
//
// Contents: Validation APIs exported by CompObj
//
// Functions:
//
// History: 93 OLE 2.0 Dev team Cretead
// 17-Dec-93 JohannP
//
//--------------------------------------------------------------------------
#include <headers.cxx>
#pragma hdrstop
/*
* IsValidPtrIn -- Check if the pointer points to a readable segment
* and if the pointer + #of bytes stays within the segment.
*
* NULL will fail
*
* cb == 0 will FAIL
*
* This function exists only for compatibility with already-compiled apps.
* We now use macros for IsValidPtrIn and IsValidPtrOut
* Check out the comments in inc\valid.h
*/
//+---------------------------------------------------------------------------
//
// Function: ISVALIDPTRIN, Local
//
// Synopsis:
//
// Effects:
//
// Arguments: [pv] --
// [cb] --
//
// Requires:
//
// Returns:
//
// Signals:
//
// Modifies:
//
// Algorithm:
//
// History: 2-28-94 kevinro Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDAPI_(BOOL)
ISVALIDPTRIN( const void FAR* pv, UINT cb )
{
return !IsBadReadPtr (pv, cb);
// We cannot use inline assembly here because the VERR instruction does
// not work if the segment has been discarded (but is still valid).
}
// This function exists only for compatibility with already-compiled apps.
// We now use macros for IsValidPtrIn and IsValidPtrOut
//
// Check out the comments in inc\valid.h
//+---------------------------------------------------------------------------
//
// Function: ISVALIDPTROUT, Local
//
// Synopsis:
//
// Effects:
//
// Arguments: [pv] --
// [cb] --
//
// Requires:
//
// Returns:
//
// Signals:
//
// Modifies:
//
// Algorithm:
//
// History: 2-28-94 kevinro Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDAPI_(BOOL)
ISVALIDPTROUT( void FAR* pv, UINT cb )
// NULL is not acceptable
{
return !IsBadWritePtr (pv, cb);
}
// valid code begins 0xb8, ??, ??, followed by:
// BYTE validcode[6] = { 0x55, 0x8b, 0xec, 0x1e, 0x8e, 0xd8};
//+---------------------------------------------------------------------------
//
// Function: IsValidInterface, Local
//
// Synopsis:
//
// Effects:
//
// Arguments: [pv] --
//
// Requires:
//
// Returns:
//
// Signals:
//
// Modifies:
//
// Algorithm:
//
// History: 2-28-94 kevinro Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDAPI_(BOOL) IsValidInterface( void FAR* pv )
{
BYTE FAR* pb;
// NULL is not acceptable as input.
if (!IsValidPtrIn(pv,4)) goto false;
#ifdef _STRICT_VALIDATION
// if the interface was compiled with C++, the virtual function table
// will be in a code segment
if (IsBadCodePtr(*(FARPROC FAR*)pv)) goto false;
#endif
pb = *(BYTE FAR* FAR*)pv; // pb points to beginning of vftable
if (!IsValidPtrIn(pb, 4)) goto false;
if (IsBadCodePtr(*(FARPROC FAR*)pb)) goto false;
pb = *(BYTE FAR* FAR*)pb;
if (!IsValidPtrIn(pb, 9)) goto false;
// if (*pb != 0xb8) goto false;
// pb += 3;
// if (_fmemcmp(pb, validcode, 6)) goto false;
return TRUE;
false:
// AssertSz(FALSE, "Invalid interface pointer");
return FALSE;
}
//+---------------------------------------------------------------------------
//
// Function: IsValidIid, Local
//
// Synopsis:
//
// Effects:
//
// Arguments: [iid] --
//
// Requires:
//
// Returns:
//
// Signals:
//
// Modifies:
//
// Algorithm:
//
// History: 2-28-94 kevinro Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDAPI_(BOOL)
IsValidIid( REFIID iid )
{
IID iidTemp = iid;
DWORD FAR* pdw = (DWORD FAR*)&iidTemp;
*pdw = 0;
if (IID_IUnknown == iidTemp) return TRUE;
thkDebugOut((DEB_IERROR, "WARNING: Nonstandard IID parameter"));
return TRUE;
}