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_