153 lines
3.3 KiB
C++
153 lines
3.3 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: utils.hxx
|
|
//
|
|
// Contents: Useful classes in implementing properties.
|
|
//
|
|
// Classes: CPropSetName - Buffer which converts fmtids->names
|
|
// CSubPropertyName - Buffer which converts VT_STREAM etc -> name
|
|
//
|
|
// Functions: DfpStatusToHResult - map NTSTATUS to HRESULT
|
|
// VerifyCommitFlags - check transaction flags
|
|
// Probe - probe memory range to generate GP fault.
|
|
//
|
|
// History: 1-Mar-95 BillMo Created.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Codework:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Misc functions and defines
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#if DBG
|
|
#define STACKELEMS 3
|
|
#else
|
|
#define STACKELEMS 64
|
|
#endif
|
|
|
|
extern HRESULT NtStatusToScode(NTSTATUS);
|
|
|
|
inline HRESULT DfpNtStatusToHResult(NTSTATUS nts)
|
|
{
|
|
if ((nts & 0xF0000000) == 0x80000000)
|
|
return nts;
|
|
else
|
|
return(NtStatusToScode(nts));
|
|
}
|
|
|
|
#define VerifyCommitFlags(cf) \
|
|
((((cf) & ~(STGC_OVERWRITE | STGC_ONLYIFCURRENT | \
|
|
STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE)) == 0) ? S_OK : \
|
|
STG_E_INVALIDFLAG)
|
|
|
|
inline VOID Probe(VOID *pv, ULONG cb)
|
|
{
|
|
BYTE b = *(BYTE*)pv;
|
|
b=((BYTE*)pv)[cb-1];
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CPropSetName
|
|
//
|
|
// Purpose: Wrap buffer to convert
|
|
//
|
|
// Interface:
|
|
//
|
|
//
|
|
//
|
|
//
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CPropSetName
|
|
{
|
|
public:
|
|
CPropSetName(REFFMTID rfmtid);
|
|
inline const OLECHAR * GetPropSetName()
|
|
{
|
|
return(_oszName);
|
|
}
|
|
private:
|
|
OLECHAR _oszName[CWCSTORAGENAME];
|
|
};
|
|
|
|
class CStackBuffer
|
|
{
|
|
public:
|
|
CStackBuffer(BYTE *pbStackBuf,
|
|
ULONG ulElementSize,
|
|
ULONG cStackElements);
|
|
|
|
~CStackBuffer();
|
|
|
|
HRESULT Init(ULONG cElements);
|
|
|
|
protected:
|
|
BYTE * _pbHeapBuf;
|
|
|
|
private:
|
|
BYTE * _pbStackBuf;
|
|
ULONG _cbElementSize;
|
|
ULONG _cStackElements;
|
|
};
|
|
|
|
inline CStackBuffer::CStackBuffer( BYTE *pbStackBuf,
|
|
ULONG cbElementSize,
|
|
ULONG cStackElements)
|
|
: _pbStackBuf(pbStackBuf),
|
|
_pbHeapBuf(pbStackBuf),
|
|
_cbElementSize(cbElementSize),
|
|
_cStackElements(cStackElements)
|
|
{
|
|
}
|
|
|
|
inline CStackBuffer::~CStackBuffer()
|
|
{
|
|
if (_pbHeapBuf != _pbStackBuf)
|
|
{
|
|
delete [] _pbHeapBuf;
|
|
}
|
|
}
|
|
|
|
class CStackPropIdArray : public CStackBuffer
|
|
{
|
|
public:
|
|
inline CStackPropIdArray();
|
|
inline PROPID * GetBuf();
|
|
|
|
private:
|
|
PROPID _apid[STACKELEMS];
|
|
};
|
|
|
|
inline CStackPropIdArray::CStackPropIdArray() :
|
|
CStackBuffer((BYTE*)_apid, sizeof(_apid[0]), sizeof(_apid)/sizeof(_apid[0]))
|
|
{
|
|
}
|
|
|
|
inline PROPID * CStackPropIdArray::GetBuf()
|
|
{
|
|
return((PROPID*)_pbHeapBuf);
|
|
}
|
|
|
|
inline void PropSysFreeString(BSTR bstr)
|
|
{
|
|
SysFreeString(bstr);
|
|
}
|
|
|
|
inline BSTR PropSysAllocString(LPOLECHAR pwsz)
|
|
{
|
|
return SysAllocString(pwsz);
|
|
}
|