summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/propvar.h
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /public/sdk/inc/propvar.h
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'public/sdk/inc/propvar.h')
-rw-r--r--public/sdk/inc/propvar.h227
1 files changed, 227 insertions, 0 deletions
diff --git a/public/sdk/inc/propvar.h b/public/sdk/inc/propvar.h
new file mode 100644
index 000000000..fb9dd0418
--- /dev/null
+++ b/public/sdk/inc/propvar.h
@@ -0,0 +1,227 @@
+//+--------------------------------------------------------------------------
+//
+// Microsoft Windows
+// Copyright (C) Microsoft Corporation, 1993
+//
+// File: propvar.h
+//
+// Contents: PROPVARIANT manipulation code
+//
+// History: 15-Aug-95 vich created
+// 01-Jul-96 MikeHill Updated to allow Win32 SEH removal
+// 08-Nov-96 MikeHill Restore NT4 export signatures.
+//
+//---------------------------------------------------------------------------
+
+#ifndef _PROPVAR_H_
+#define _PROPVAR_H_
+
+#include <debnot.h>
+#include <propset.h>
+
+SERIALIZEDPROPERTYVALUE *
+RtlConvertVariantToProperty(
+ IN PROPVARIANT const *pvar,
+ IN USHORT CodePage,
+ OUT SERIALIZEDPROPERTYVALUE *pprop,
+ IN OUT ULONG *pcb,
+ IN PROPID pid,
+ IN BOOLEAN fVariantVector,
+ OPTIONAL OUT ULONG *pcIndirect);
+
+SERIALIZEDPROPERTYVALUE *
+RtlConvertVariantToPropertyNoEH( // No NT Exception Handling version
+ IN PROPVARIANT const *pvar,
+ IN USHORT CodePage,
+ OUT SERIALIZEDPROPERTYVALUE *pprop,
+ IN OUT ULONG *pcb,
+ IN PROPID pid,
+ IN BOOLEAN fVariantVector,
+ OPTIONAL OUT ULONG *pcIndirect,
+ OUT NTSTATUS *pstatus);
+
+BOOLEAN
+RtlConvertPropertyToVariant(
+ IN SERIALIZEDPROPERTYVALUE const *pprop,
+ IN USHORT CodePage,
+ OUT PROPVARIANT *pvar,
+ IN PMemoryAllocator *pma);
+
+BOOLEAN
+RtlConvertPropertyToVariantNoEH( // No NT Exception Handling version
+ IN SERIALIZEDPROPERTYVALUE const *pprop,
+ IN USHORT CodePage,
+ OUT PROPVARIANT *pvar,
+ IN PMemoryAllocator *pma,
+ OUT NTSTATUS *pstatus);
+
+#ifndef KERNEL
+VOID
+CleanupVariants(
+ IN PROPVARIANT *pvar,
+ IN ULONG cprop,
+ IN PMemoryAllocator *pma);
+#endif
+
+#if DBGPROP
+BOOLEAN IsUnicodeString(WCHAR const *pwszname, ULONG cb);
+BOOLEAN IsAnsiString(CHAR const *pszname, ULONG cb);
+#endif
+
+
+//+--------------------------------------------------------------------------
+// Function: SignalOverflow, SignalInvalidParameter, SignalStatus
+//
+// Synopsis: ASSERT and raise data corrupt/overflow/specified error
+//
+// Arguments: [szReason] -- string explanation
+// [Status] -- Status to raise (SignalStatus only)
+//
+// Returns: None
+//+--------------------------------------------------------------------------
+
+
+#define StatusOverflow(pstatus, szReason) \
+ *(pstatus) = STATUS_BUFFER_OVERFLOW; \
+ TraceStatus(szReason)
+
+#define StatusAccessDenied(pstatus, szReason) \
+ *(pstatus) = STATUS_ACCESS_DENIED; \
+ TraceStatus(szReason);
+
+#define StatusInvalidParameter(pstatus, szReason) \
+ *(pstatus) = STATUS_INVALID_PARAMETER; \
+ TraceStatus(szReason);
+
+#define StatusNoMemory(pstatus, szReason) \
+ *(pstatus) = STATUS_INSUFFICIENT_RESOURCES;\
+ TraceStatus(szReason);
+
+#define StatusDiskFull(pstatus, szReason) \
+ *(pstatus) = STATUS_DISK_FULL; \
+ TraceStatus(szReason);
+
+#define StatusError(pstatus, szReason, Status) \
+ *(pstatus) = Status; \
+ TraceStatus(szReason);
+
+#ifdef KERNEL
+#define StatusKBufferOverflow(pstatus, szReason) StatusOverflow(pstatus, szReason)
+#else
+#define StatusKBufferOverflow(pstatus, szReason) StatusNoMemory(pstatus, szReason)
+#endif
+
+
+#ifdef KERNEL
+#define KERNELSELECT(k, u) k
+#else
+#define KERNELSELECT(k, u) u
+#endif
+
+#define DBGPROPASSERT KERNELSELECT(DBGPROP, DBG)
+
+#if DBGPROPASSERT
+#define TraceStatus(szReason) \
+ { \
+ DebugTrace(0, DEBTRACE_ERROR, (szReason "\n")); \
+ PROPASSERTMSG(szReason, !(DebugLevel & DEBTRACE_WARN)); \
+ }
+
+
+#else
+#define TraceStatus(szReason)
+#endif
+
+
+
+#define AssertVarField(field, cb) \
+ PROPASSERT(FIELD_OFFSET(PROPVARIANT, iVal) == FIELD_OFFSET(PROPVARIANT, field) && \
+ sizeof(((PROPVARIANT *) 0)->field) == (cb))
+
+#define AssertVarVector(field, cbElem) \
+ PROPASSERT(FIELD_OFFSET(PROPVARIANT, cai.cElems) == \
+ FIELD_OFFSET(PROPVARIANT, field.cElems) && \
+ FIELD_OFFSET(PROPVARIANT, cai.pElems) == \
+ FIELD_OFFSET(PROPVARIANT, field.pElems) && \
+ sizeof(((PROPVARIANT *) 0)->field.pElems[0]) == (cbElem))
+
+#define AssertByteField(field) AssertVarField(field, sizeof(BYTE))
+#define AssertShortField(field) AssertVarField(field, sizeof(SHORT))
+#define AssertLongField(field) AssertVarField(field, sizeof(LONG))
+#define AssertLongLongField(field) AssertVarField(field, sizeof(LONGLONG))
+#define AssertStringField(field) AssertVarField(field, sizeof(VOID *))
+
+#define AssertByteVector(field) AssertVarVector(field, sizeof(BYTE))
+#define AssertShortVector(field) AssertVarVector(field, sizeof(SHORT))
+#define AssertLongVector(field) AssertVarVector(field, sizeof(LONG))
+#define AssertLongLongVector(field) AssertVarVector(field, sizeof(LONGLONG))
+#define AssertStringVector(field) AssertVarVector(field, sizeof(VOID *))
+#define AssertVariantVector(field) AssertVarVector(field, sizeof(PROPVARIANT))
+
+
+#define BSTRLEN(bstrVal) *((ULONG *) bstrVal - 1)
+
+
+//+-------------------------------------------------------------------
+// Class: CBufferAllocator, private
+//
+// Synopsis: allocation from a buffer
+//
+// Notes: The Summary catalog APIs use a single buffer to serialize row
+// values on input and deserialize them on output. This class
+// encapsulates the memory allocation routines for these APIs.
+//--------------------------------------------------------------------
+
+class CBufferAllocator : public PMemoryAllocator
+{
+public:
+ inline CBufferAllocator(ULONG cbBuffer, VOID *pvBuffer)
+ {
+ _cbFree = cbBuffer;
+ _pvCur = _pvBuffer = pvBuffer;
+#if _X86_ // stack variables on x86 are not aligned
+ PROPASSERT(((ULONG) _pvCur & (sizeof(LONG) - 1)) == 0);
+#else // RISC
+ PROPASSERT(((ULONG) _pvCur & (sizeof(LONGLONG) - 1)) == 0);
+#endif // X86/RISC
+ }
+
+ VOID *Allocate(ULONG cbSize);
+ VOID Free(VOID *pv) { }
+
+ inline ULONG GetFreeSize(VOID) { return(_cbFree); }
+
+private:
+ ULONG _cbFree;
+ VOID *_pvCur;
+ VOID *_pvBuffer;
+};
+
+//+-------------------------------------------------------------------
+// Member: CBufferAllocator::Allocate, private
+//
+// Synopsis: allocation from a buffer
+//
+// Arguments: [cb] -- Count of bytes to be allocated.
+//
+// Returns: pointer to 'allocated' memory -- NULL if no space left
+//--------------------------------------------------------------------
+
+#define DEFINE_CBufferAllocator__Allocate \
+VOID * \
+CBufferAllocator::Allocate(ULONG cb) \
+{ \
+ VOID *pv; \
+ \
+ cb = (cb + sizeof(LONGLONG) - 1) & ~(sizeof(LONGLONG) - 1); \
+ if (cb > _cbFree) \
+ { \
+ return(NULL); \
+ } \
+ pv = _pvCur; \
+ _pvCur = (BYTE *) _pvCur + cb; \
+ _cbFree -= cb; \
+ return(pv); \
+}
+
+#endif // !_PROPVAR_H_