00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
#ifndef _PROPVAR_H_
00016
#define _PROPVAR_H_
00017
00018
#include <debnot.h>
00019
#include <propset.h>
00020
00021
SERIALIZEDPROPERTYVALUE *
00022
RtlConvertVariantToProperty(
00023 IN PROPVARIANT
const *pvar,
00024 IN USHORT CodePage,
00025 OUT
SERIALIZEDPROPERTYVALUE *pprop,
00026 IN OUT ULONG *pcb,
00027 IN PROPID pid,
00028 IN BOOLEAN fVariantVector,
00029 OPTIONAL OUT ULONG *pcIndirect);
00030
00031
SERIALIZEDPROPERTYVALUE *
00032
RtlConvertVariantToPropertyNoEH(
00033 IN PROPVARIANT
const *pvar,
00034 IN USHORT CodePage,
00035 OUT
SERIALIZEDPROPERTYVALUE *pprop,
00036 IN OUT ULONG *pcb,
00037 IN PROPID pid,
00038 IN BOOLEAN fVariantVector,
00039 OPTIONAL OUT ULONG *pcIndirect,
00040 OUT NTSTATUS *pstatus);
00041
00042 BOOLEAN
00043
RtlConvertPropertyToVariant(
00044 IN
SERIALIZEDPROPERTYVALUE const *pprop,
00045 IN USHORT CodePage,
00046 OUT PROPVARIANT *pvar,
00047 IN PMemoryAllocator *pma);
00048
00049 BOOLEAN
00050
RtlConvertPropertyToVariantNoEH(
00051 IN
SERIALIZEDPROPERTYVALUE const *pprop,
00052 IN USHORT CodePage,
00053 OUT PROPVARIANT *pvar,
00054 IN PMemoryAllocator *pma,
00055 OUT NTSTATUS *pstatus);
00056
00057
00058
00059
00060
SERIALIZEDPROPERTYVALUE *
00061
PrConvertVariantToProperty(
00062 IN PROPVARIANT
const *pvar,
00063 IN USHORT CodePage,
00064 OUT
SERIALIZEDPROPERTYVALUE *pprop,
00065 IN OUT ULONG *pcb,
00066 IN PROPID pid,
00067 IN BOOLEAN fVariantVector,
00068 OPTIONAL OUT ULONG *pcIndirect);
00069
00070
SERIALIZEDPROPERTYVALUE *
00071
PrConvertVariantToPropertyNoEH(
00072 IN PROPVARIANT
const *pvar,
00073 IN USHORT CodePage,
00074 OUT
SERIALIZEDPROPERTYVALUE *pprop,
00075 IN OUT ULONG *pcb,
00076 IN PROPID pid,
00077 IN BOOLEAN fVariantVector,
00078 OPTIONAL OUT ULONG *pcIndirect,
00079 OUT NTSTATUS *pstatus);
00080
00081 BOOLEAN
00082
PrConvertPropertyToVariant(
00083 IN
SERIALIZEDPROPERTYVALUE const *pprop,
00084 IN USHORT CodePage,
00085 OUT PROPVARIANT *pvar,
00086 IN PMemoryAllocator *pma);
00087
00088 BOOLEAN
00089
PrConvertPropertyToVariantNoEH(
00090 IN
SERIALIZEDPROPERTYVALUE const *pprop,
00091 IN USHORT CodePage,
00092 OUT PROPVARIANT *pvar,
00093 IN PMemoryAllocator *pma,
00094 OUT NTSTATUS *pstatus);
00095
00096
00097
00098
00099
00100
#ifndef KERNEL
00101
VOID
00102
CleanupVariants(
00103 IN PROPVARIANT *pvar,
00104 IN ULONG cprop,
00105 IN PMemoryAllocator *pma);
00106
#endif
00107
00108
#if DBGPROP
00109
BOOLEAN
IsUnicodeString(WCHAR
const *pwszname, ULONG cb);
00110 BOOLEAN
IsAnsiString(CHAR
const *pszname, ULONG cb);
00111
#endif
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 #define StatusOverflow(pstatus, szReason) \
00127
*(pstatus) = STATUS_BUFFER_OVERFLOW; \
00128
TraceStatus(szReason)
00129
00130 #define StatusAccessDenied(pstatus, szReason) \
00131
*(pstatus) = STATUS_ACCESS_DENIED; \
00132
TraceStatus(szReason);
00133
00134 #define StatusInvalidParameter(pstatus, szReason) \
00135
*(pstatus) = STATUS_INVALID_PARAMETER; \
00136
TraceStatus(szReason);
00137
00138 #define StatusNoMemory(pstatus, szReason) \
00139
*(pstatus) = STATUS_INSUFFICIENT_RESOURCES;\
00140
TraceStatus(szReason);
00141
00142 #define StatusDiskFull(pstatus, szReason) \
00143
*(pstatus) = STATUS_DISK_FULL; \
00144
TraceStatus(szReason);
00145
00146 #define StatusError(pstatus, szReason, Status) \
00147
*(pstatus) = Status; \
00148
TraceStatus(szReason);
00149
00150
#ifdef KERNEL
00151
#define StatusKBufferOverflow(pstatus, szReason) StatusOverflow(pstatus, szReason)
00152
#else
00153 #define StatusKBufferOverflow(pstatus, szReason) StatusNoMemory(pstatus, szReason)
00154
#endif
00155
00156
00157
#ifdef KERNEL
00158
#define KERNELSELECT(k, u) k
00159
#else
00160 #define KERNELSELECT(k, u) u
00161
#endif
00162
00163 #define DBGPROPASSERT KERNELSELECT(DBGPROP, DBG)
00164
00165
#if DBGPROPASSERT
00166
#define TraceStatus(szReason) \
00167
{ \
00168
DebugTrace(0, DEBTRACE_ERROR, (szReason "\n")); \
00169
PROPASSERTMSG(szReason, !(DebugLevel & DEBTRACE_WARN)); \
00170
}
00171
00172
00173
#else
00174 #define TraceStatus(szReason)
00175
#endif
00176
00177
00178
00179 #define AssertVarField(field, cb) \
00180
PROPASSERT(FIELD_OFFSET(PROPVARIANT, iVal) == FIELD_OFFSET(PROPVARIANT, field) && \
00181
sizeof(((PROPVARIANT *) 0)->field) == (cb))
00182
00183 #define AssertVarVector(field, cbElem) \
00184
PROPASSERT(FIELD_OFFSET(PROPVARIANT, cai.cElems) == \
00185
FIELD_OFFSET(PROPVARIANT, field.cElems) && \
00186
FIELD_OFFSET(PROPVARIANT, cai.pElems) == \
00187
FIELD_OFFSET(PROPVARIANT, field.pElems) && \
00188
sizeof(((PROPVARIANT *) 0)->field.pElems[0]) == (cbElem))
00189
00190 #define AssertByteField(field) AssertVarField(field, sizeof(BYTE))
00191 #define AssertShortField(field) AssertVarField(field, sizeof(SHORT))
00192 #define AssertLongField(field) AssertVarField(field, sizeof(LONG))
00193 #define AssertLongLongField(field) AssertVarField(field, sizeof(LONGLONG))
00194 #define AssertStringField(field) AssertVarField(field, sizeof(VOID *))
00195
00196 #define AssertByteVector(field) AssertVarVector(field, sizeof(BYTE))
00197 #define AssertShortVector(field) AssertVarVector(field, sizeof(SHORT))
00198 #define AssertLongVector(field) AssertVarVector(field, sizeof(LONG))
00199 #define AssertLongLongVector(field) AssertVarVector(field, sizeof(LONGLONG))
00200 #define AssertStringVector(field) AssertVarVector(field, sizeof(VOID *))
00201 #define AssertVariantVector(field) AssertVarVector(field, sizeof(PROPVARIANT))
00202
00203
00204 #define BSTRLEN(bstrVal) *((ULONG *) bstrVal - 1)
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 class CBufferAllocator :
public PMemoryAllocator
00218 {
00219
public:
00220 inline CBufferAllocator(ULONG cbBuffer, VOID *pvBuffer)
00221 {
00222
_cbFree = cbBuffer;
00223
_pvCur =
_pvBuffer = pvBuffer;
00224
#if _X86_ // stack variables on x86 are not aligned
00225
PROPASSERT(((ULONG)
_pvCur & (
sizeof(LONG) - 1)) == 0);
00226
#else // RISC
00227
PROPASSERT(((ULONG_PTR)
_pvCur & (
sizeof(LONGLONG) - 1)) == 0);
00228
#endif // X86/RISC
00229
}
00230
00231
VOID *Allocate(ULONG cbSize);
00232 VOID Free(VOID *pv) { }
00233
00234 inline ULONG
GetFreeSize(VOID) {
return(
_cbFree); }
00235
00236
private:
00237 ULONG
_cbFree;
00238 VOID *
_pvCur;
00239 VOID *
_pvBuffer;
00240 };
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 #define DEFINE_CBufferAllocator__Allocate \
00253
VOID * \
00254
CBufferAllocator::Allocate(ULONG cb) \
00255
{ \
00256
VOID *pv; \
00257
\
00258
cb = (cb + sizeof(LONGLONG) - 1) & ~(sizeof(LONGLONG) - 1); \
00259
if (cb > _cbFree) \
00260
{ \
00261
return(NULL); \
00262
} \
00263
pv = _pvCur; \
00264
_pvCur = (BYTE *) _pvCur + cb; \
00265
_cbFree -= cb; \
00266
return(pv); \
00267
}
00268
00269
#endif // !_PROPVAR_H_