Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

676 lines
22 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1993
  5. //
  6. // File: propstm.hxx
  7. //
  8. // Contents: property set definitions
  9. //
  10. // History: 15-Jul-94 brianb created
  11. // 15-Aug-94 SethuR revised
  12. // 22-Feb-96 MikeHill Added several new member functions.
  13. // 29-Feb-96 MikeHill Removed include of propmac.hxx
  14. // Moved 2 inlines to propstm.cxx
  15. // 09-May-96 MikeHill Update _InitSection & _FixSummaryInformation
  16. // prototypes.
  17. // 22-May-96 MikeHill Update prototypes for new OSVersion parameter,
  18. // and for callee-allocated property name buffers.
  19. // 01-Jul-96 MikeHill - Modified to allow removal of Win32 SEH.
  20. // - Added byte-swapping support.
  21. // 07-Feb-97 Danl - Changed CMappedStream to IMappedStream.
  22. //
  23. //
  24. // Notes: This implementation of property streams has no notion of
  25. // sections in a property set.
  26. //
  27. //---------------------------------------------------------------------------
  28. #ifndef _PROPSTM_HXX_
  29. #define _PROPSTM_HXX_
  30. #include <propset.h> // Appendix B Property set structure definitions
  31. #ifndef _MAC_NODOC
  32. #include <ddeml.h> // For CP_WINUNICODE
  33. #include <objidl.h>
  34. #endif
  35. #include <byteordr.hxx>
  36. typedef enum _PROPOP
  37. {
  38. PROPOP_IGNORE = 1,
  39. PROPOP_DELETE = 2,
  40. PROPOP_INSERT = 3,
  41. PROPOP_MOVE = 4,
  42. PROPOP_UPDATE = 5,
  43. } PROPOP;
  44. typedef struct tagPROPERTY_INFORMATION // pinfo
  45. {
  46. PROPID pid;
  47. #ifdef KERNEL
  48. SERIALIZEDPROPERTYVALUE *pprop; // Only the Kernel serializes to temp buf
  49. #endif
  50. ULONG cbprop;
  51. PROPOP operation;
  52. } PROPERTY_INFORMATION;
  53. #define VT_DICTIONARY (VT_VECTOR | VT_ILLEGALMASKED)
  54. // Default the endian-ness to Little
  55. #if !defined(BIGENDIAN) && !defined(LITTLEENDIAN)
  56. #define LITTLEENDIAN 1
  57. #endif
  58. //+-------------------------------------------------------------------------
  59. // Class: IMappedStream
  60. //
  61. // Purpose: defines the interface for a mapped Stream. This enables us to
  62. // have multiple implementations of the stream (one kernel mode
  63. // and multiple user mode implementations) without virtual methods
  64. // in kernel mode, and just one implementation for parsing the
  65. // contents of the stream (CPropertySetStream)
  66. //--------------------------------------------------------------------------
  67. //+-------------------------------------------------------------------------
  68. // Class: IMappedStream (user mode implementation)
  69. //
  70. // Note: Implemented in CNtMappedStream for native property sets
  71. // Implemented in CDfMappedStream for DocFile property sets
  72. //--------------------------------------------------------------------------
  73. class IMappedStream : public IUnknown
  74. {
  75. public:
  76. virtual VOID Open(IN NTPROP np, OUT LONG *phr) = 0;
  77. virtual VOID Close(OUT LONG *phr) = 0;
  78. virtual VOID ReOpen(IN OUT VOID **ppv, OUT LONG *phr) = 0;
  79. virtual VOID Quiesce(VOID) = 0;
  80. virtual VOID Map(IN BOOLEAN fCreate, OUT VOID **ppv) = 0;
  81. virtual VOID Unmap(IN BOOLEAN fFlush, IN OUT VOID **ppv) = 0;
  82. virtual VOID Flush(OUT LONG *phr) = 0;
  83. virtual ULONG GetSize(OUT LONG *phr) = 0;
  84. virtual VOID SetSize(IN ULONG cb, IN BOOLEAN fPersistent, IN OUT VOID **ppv, OUT LONG *phr) = 0;
  85. virtual NTSTATUS Lock(IN BOOLEAN fExclusive) = 0;
  86. virtual NTSTATUS Unlock(VOID) = 0;
  87. virtual VOID QueryTimeStamps(OUT STATPROPSETSTG *pspss, BOOLEAN fNonSimple) const = 0;
  88. virtual BOOLEAN QueryModifyTime(OUT LONGLONG *pll) const = 0;
  89. virtual BOOLEAN QuerySecurity(OUT ULONG *pul) const = 0;
  90. virtual BOOLEAN IsWriteable(VOID) const = 0;
  91. virtual BOOLEAN IsModified(VOID) const = 0;
  92. virtual VOID SetModified(VOID) = 0;
  93. virtual HANDLE GetHandle(VOID) const = 0;
  94. #if DBGPROP
  95. virtual BOOLEAN SetChangePending(BOOLEAN fChangePending) = 0;
  96. virtual BOOLEAN IsNtMappedStream(VOID) const = 0;
  97. #endif
  98. };
  99. //+-------------------------------------------------------------------------
  100. // Class: CStreamChunkList
  101. //
  102. // Purpose: Used to support efficient in-place compaction/expansion of
  103. // property set streams for CPropertySetStorage.
  104. //--------------------------------------------------------------------------
  105. struct CStreamChunk // scnk
  106. {
  107. ULONG oOld;
  108. LONG cbChange;
  109. };
  110. class CStreamChunkList // scl
  111. {
  112. public:
  113. CStreamChunkList(ULONG cMaxChunks, CStreamChunk *ascnk);
  114. CStreamChunk *GetFreeChunk(OUT NTSTATUS *pstatus);
  115. CStreamChunk const *GetChunk(ULONG i) const;
  116. ULONG Count(VOID) const;
  117. VOID SortByStartAddress(VOID);
  118. VOID Delete(VOID);
  119. #if DBGPROP
  120. VOID AssertCbChangeTotal(
  121. CStreamChunk const *pscnk,
  122. ULONG cbChangeTotal) const;
  123. #endif
  124. private:
  125. ULONG _cMaxChunks; // elements in _ascnk
  126. ULONG _cChunks; // elements allocated from _ascnk
  127. CStreamChunk *_ascnk;
  128. BOOLEAN _fDelete; // TRUE if _ascnk allocated from heap
  129. };
  130. //+-------------------------------------------------------------------------
  131. // Class: CPropertySetStream
  132. //
  133. // Purpose: class for parsing the contents of a property set stream.
  134. //--------------------------------------------------------------------------
  135. #ifdef KERNEL
  136. #define _MSTM(fn) _mstm.fn
  137. #else
  138. #define _MSTM(fn) _pmstm->fn
  139. #endif
  140. #ifdef KERNEL
  141. #define CPSS_PROPHEADER 0x01 // has property header
  142. #endif
  143. #define CPSS_DOWNLEVEL 0x02 // Downlevel property set.
  144. #define CPSS_PACKEDPROPERTIES 0x04 // Packed property values
  145. #define CPSS_DOCUMENTSUMMARYINFO 0x08 // DocumentSummaryInfo propset
  146. #define CPSS_USERDEFINEDPROPERTIES 0x10 // DocumentSummaryInfo: second section
  147. #define CPSS_MULTIPLESECTIONS 0x20 // Multiple property sections
  148. #define CPSS_USERDEFINEDDELETED 0x40 // second section deleted
  149. #define CPSS_VARIANTVECTOR 0x80 // Only for recursion
  150. typedef enum tagLOADSTATE
  151. {
  152. LOADSTATE_FAIL = 0, // load failed
  153. LOADSTATE_DONE = 1, // load succeeded
  154. LOADSTATE_BADFMTID = 2, // fmtid mismatch
  155. LOADSTATE_USERDEFINEDNOTFOUND = 3, // user defined section missing
  156. LOADSTATE_USERDEFINEDDELETE = 4, // delete user defined section
  157. } LOADSTATE;
  158. typedef enum tagPATCHOP
  159. {
  160. PATCHOP_COMPUTESIZE = 0, // just compute expanded size
  161. PATCHOP_ALIGNLENGTHS = 1, // just align string lengths
  162. PATCHOP_EXPAND = 2, // expand property in-place
  163. } PATCHOP;
  164. // Create a macro that tells us the type
  165. // of OLECHARs.
  166. #ifdef OLE2ANSI
  167. #define OLECHAR_IS_UNICODE FALSE
  168. #else
  169. #define OLECHAR_IS_UNICODE TRUE
  170. #endif
  171. // IsOLECHARString calls IsUnicodeString or IsAnsiString,
  172. // whichever is appropriate for this compilation.
  173. #if DBGPROP
  174. inline BOOLEAN IsOLECHARString( OLECHAR const *posz, ULONG cb )
  175. {
  176. #if OLECHAR_IS_UNICODE
  177. return( IsUnicodeString( posz, cb ));
  178. #else
  179. return( IsAnsiString( posz, cb ));
  180. #endif
  181. }
  182. #endif
  183. class CPropertySetStream
  184. {
  185. public:
  186. CPropertySetStream(
  187. IN USHORT Flags, // NONSIMPLE|*1* of READ/WRITE/CREATE/CREATEIF/DELETE
  188. IN IMappedStream *pmstm, // mapped stream implementation
  189. IN PMemoryAllocator *pma // caller's memory allocator
  190. );
  191. VOID Close(OUT NTSTATUS *pstatus);
  192. VOID SetValue(
  193. IN ULONG cprop,
  194. OPTIONAL IN OUT INDIRECTPROPERTY **ppip,
  195. IN PROPVARIANT const avar[],
  196. IN PROPERTY_INFORMATION *ppinfo,
  197. OUT NTSTATUS *pstatus);
  198. SERIALIZEDPROPERTYVALUE const *GetValue(IN PROPID pid, OUT ULONG *pcbprop,
  199. OUT NTSTATUS *pstatus);
  200. PROPID QueryPropid(IN OLECHAR const *poszName, OUT NTSTATUS *pstatus);
  201. USHORT GetCodePage(VOID) const { return(_CodePage); }
  202. #if DBGPROP
  203. VOID Validate(OUT NTSTATUS *pstatus);
  204. #else
  205. VOID Validate(OUT NTSTATUS *pstatus) const { *pstatus = STATUS_SUCCESS; }
  206. #endif
  207. BOOLEAN IsModified(VOID) const { return(_MSTM(IsModified)()); }
  208. NTSTATUS Lock(IN BOOLEAN fExclusive) { return(_MSTM(Lock)(fExclusive)); }
  209. NTSTATUS Unlock(VOID) { return(_MSTM(Unlock)()); }
  210. VOID Flush(OUT NTSTATUS *pstatus)
  211. {
  212. PROPASSERT(PROPSET_BYTEORDER == _pph->wByteOrder);
  213. _MSTM(Flush)(pstatus);
  214. PROPASSERT(PROPSET_BYTEORDER == _pph->wByteOrder);
  215. }
  216. VOID Open(
  217. OPTIONAL IN GUID const *pfmtid, // property set fmtid (create or Word95)
  218. OPTIONAL IN GUID const *pclsid, // CLASSID of propset code (create only)
  219. IN ULONG LocaleId, // Locale Id (create only)
  220. OPTIONAL OUT ULONG *pOSVersion, // OS Version field in the propset header
  221. IN USHORT CodePage, // CodePage of propset (create only)
  222. OUT NTSTATUS *pstatus); // Return code.
  223. ULONG ReOpen(OUT NTSTATUS *pstatus);
  224. // Property Dictionary Lookup and Manipulation.
  225. BOOLEAN EnumeratePropids(
  226. IN OUT ULONG *pkey,
  227. IN OUT ULONG *pcprop,
  228. OUT PROPID *apid,
  229. OUT NTSTATUS *pstatus);
  230. OLECHAR *DuplicatePropertyName(
  231. IN OLECHAR const *poszName,
  232. IN ULONG cbName,
  233. OUT NTSTATUS *pstatus) const;
  234. BOOLEAN QueryPropertyNameBuf(
  235. IN PROPID pid,
  236. OUT OLECHAR *aocName,
  237. IN OUT ULONG *pcbName,
  238. OUT NTSTATUS *pstatus);
  239. BOOLEAN QueryPropertyNames(
  240. IN ULONG cprop,
  241. IN PROPID const *apid,
  242. OUT OLECHAR *aposz[],
  243. OUT NTSTATUS *pstatus);
  244. VOID SetPropertyNames(
  245. IN ULONG cprop,
  246. IN PROPID const *apid,
  247. IN OPTIONAL OLECHAR const * const aposz[],
  248. OUT NTSTATUS *pstatus);
  249. VOID QueryPropertySet(OUT STATPROPSETSTG *pspss, OUT NTSTATUS *pstatus) const;
  250. VOID SetClassId(IN GUID const *pclsid, OUT NTSTATUS *pstatus);
  251. HANDLE GetHandle(VOID) const { return(_MSTM(GetHandle)()); }
  252. PMemoryAllocator *GetAllocator(VOID) const { return(_pma); }
  253. VOID ByteSwapHeaders( IN PROPERTYSETHEADER *psh,
  254. IN ULONG cbstm,
  255. OUT NTSTATUS *pstatus );
  256. // Convert a character count to a byte count based on the _CodePage
  257. ULONG CCh2CB( ULONG cch ) const
  258. {
  259. return( _CodePage == CP_WINUNICODE
  260. ? cch * sizeof( WCHAR )
  261. : cch * sizeof( CHAR )
  262. );
  263. }
  264. // Convert a byte count to a character count based on the _CodePage
  265. // If for some reason the given byte-count is odd, the return
  266. // value won't include that last half-character.
  267. ULONG CB2CCh( ULONG cb ) const
  268. {
  269. return( _CodePage == CP_WINUNICODE
  270. ? cb / sizeof( WCHAR )
  271. : cb / sizeof( CHAR )
  272. );
  273. }
  274. private:
  275. // Private methods.
  276. VOID _Create(
  277. IN GUID const *pfmtid,
  278. OPTIONAL IN GUID const *pclsid,
  279. IN ULONG LocaleId,
  280. IN USHORT CodePage,
  281. IN LOADSTATE LoadState,
  282. OUT NTSTATUS *pstatus);
  283. BOOLEAN _HasPropHeader(VOID) const { return(TRUE); }
  284. BOOLEAN _CreateUserDefinedSection(
  285. IN LOADSTATE LoadState,
  286. IN ULONG LocaleId,
  287. OUT NTSTATUS *pstatus);
  288. VOID _InitSection(
  289. IN FORMATIDOFFSET *pfo,
  290. IN ULONG LocaleId,
  291. IN BOOL fCreateDictionary );
  292. VOID _FixSummaryInformation(IN OUT ULONG *pcbstm, OUT NTSTATUS *pstatus);
  293. VOID _FixPackedPropertySet(OUT NTSTATUS *pstatus);
  294. BOOLEAN _FixDocPartsVector(
  295. IN PATCHOP PatchOp,
  296. IN OUT SERIALIZEDPROPERTYVALUE *pprop,
  297. OUT ULONG *pcbprop);
  298. BOOLEAN _FixDocPartsElements(
  299. IN PATCHOP PatchOp,
  300. IN ULONG cString,
  301. OUT VOID *pvDst,
  302. IN VOID UNALIGNED const *pvSrc,
  303. OUT ULONG *pcbprop);
  304. BOOLEAN _FixHeadingPairVector(
  305. IN PATCHOP PatchOp,
  306. IN OUT SERIALIZEDPROPERTYVALUE *pprop,
  307. OUT ULONG *pcbprop);
  308. BOOLEAN _FixHeadingPairElements(
  309. IN PATCHOP PatchOp,
  310. IN ULONG cPairs,
  311. OUT SERIALIZEDPROPERTYVALUE *ppropDst,
  312. IN SERIALIZEDPROPERTYVALUE UNALIGNED const *ppropSrc,
  313. OUT ULONG *pcbprop);
  314. BOOLEAN _IsMapped(VOID) const { return(_pph != NULL); }
  315. LOADSTATE _LoadHeader(OPTIONAL IN GUID const *pfmtid, IN BYTE Mode,
  316. OUT NTSTATUS *pstatus);
  317. PROPERTYSECTIONHEADER *_LoadPropertyOffsetPointers(
  318. OUT PROPERTYIDOFFSET **pppo,
  319. OUT PROPERTYIDOFFSET **pppoMax,
  320. OUT NTSTATUS *pstatus);
  321. SERIALIZEDPROPERTYVALUE *_LoadProperty(IN PROPID pid, OUT ULONG *pcbprop,
  322. OUT NTSTATUS *pstatus);
  323. PROPERTYSECTIONHEADER *_GetSectionHeader(VOID) const;
  324. VOID _SearchForCodePage( OUT NTSTATUS *pstatus);
  325. PROPERTYSECTIONHEADER *_GetSectionHeader(IN ULONG iSection, OUT NTSTATUS *pstatus);
  326. FORMATIDOFFSET *_GetFormatidOffset(IN ULONG iSection) const;
  327. VOID *_MapOffsetToAddress(IN ULONG oOffset) const;
  328. ULONG _MapAddressToOffset(IN VOID const *pvAddr) const;
  329. VOID *_MapAbsOffsetToAddress(IN ULONG oAbsolute) const;
  330. ULONG _MapAddressToAbsOffset(IN VOID const *pvAddr) const;
  331. ULONG _GetNewOffset(
  332. IN CStreamChunkList const *pscl,
  333. IN ULONG oOld) const;
  334. ULONG _DictionaryEntryLength(
  335. IN ENTRY UNALIGNED const * pent ) const;
  336. ULONG _DictionaryLength(
  337. IN DICTIONARY const *pdy,
  338. IN ULONG cbbuf,
  339. OUT NTSTATUS *pstatus) const;
  340. ENTRY UNALIGNED
  341. *_NextDictionaryEntry(
  342. IN ENTRY UNALIGNED const * pent ) const;
  343. ULONG _CountFreePropertyOffsets(OUT NTSTATUS *pstatus);
  344. VOID _DeleteMovePropertyOffsets(
  345. IN PROPERTY_INFORMATION const *apinfo,
  346. IN ULONG cprop,
  347. OUT NTSTATUS *pstatus);
  348. VOID _UpdatePropertyOffsets(
  349. IN CStreamChunkList const *pscl,
  350. OUT NTSTATUS *pstatus);
  351. VOID _InsertMovePropertyOffsets(
  352. IN PROPERTY_INFORMATION const *apinfo,
  353. IN ULONG cprop,
  354. IN ULONG oInsert,
  355. IN ULONG cpoReserve,
  356. OUT NTSTATUS *pstatus);
  357. VOID _CompactStream(IN CStreamChunkList const *pscl);
  358. VOID _CompactChunk(
  359. IN CStreamChunk const *pscnk,
  360. IN LONG cbChangeTotal,
  361. IN ULONG oOldNext);
  362. VOID _PatchSectionOffsets(LONG cbChange);
  363. ULONG _ComputeMinimumSize(ULONG cbstm, OUT NTSTATUS *pstatus);
  364. #if DBGPROP
  365. VOID _ValidateStructure(OUT NTSTATUS *pstatus);
  366. VOID _ValidateProperties(OUT NTSTATUS *pstatus) const;
  367. VOID _ValidateDictionary(OUT NTSTATUS *pstatus);
  368. VOID _StatusCorruption(char *szReason, OUT NTSTATUS *pstatus) const;
  369. #else
  370. VOID _StatusCorruption(OUT NTSTATUS *pstatus) const;
  371. #endif
  372. VOID _SetModified(VOID) { _MSTM(SetModified)(); }
  373. #if DBGPROP
  374. public: // public for fnEntryNameCompare only!
  375. #endif
  376. BOOLEAN _ComparePropertyNames(
  377. IN VOID const *pvName1,
  378. IN VOID const *pvName2,
  379. IN BOOL fSameByteOrder,
  380. IN ULONG cbName) const;
  381. #if DBGPROP
  382. private:
  383. #endif
  384. BOOLEAN _PropertyNameLength(
  385. IN VOID const *pvName,
  386. OUT ULONG *pcbName) const;
  387. VOID _MultiByteToWideChar(
  388. IN CHAR const *pch,
  389. IN ULONG cb,
  390. IN USHORT CodePage,
  391. OUT WCHAR **ppwc,
  392. OUT ULONG *pcb,
  393. OUT NTSTATUS *pstatus);
  394. VOID _OLECHARToWideChar(
  395. IN OLECHAR const *poc,
  396. IN ULONG cb,
  397. IN USHORT CodePage,
  398. OUT WCHAR **ppwc,
  399. OUT ULONG *pcb,
  400. OUT NTSTATUS *pstatus)
  401. {
  402. PROPASSERT( sizeof(OLECHAR) == sizeof(CHAR) );
  403. // Since OLECHAR may be MultiByte or WideChar for this
  404. // compilation, explicitely cast 'poc' to a CHAR* to prevent
  405. // a compilation error.
  406. _MultiByteToWideChar( (CHAR*) poc, cb, CodePage, ppwc, pcb, pstatus );
  407. }
  408. VOID _MultiByteToOLECHAR(
  409. IN CHAR const *pch,
  410. IN ULONG cb,
  411. IN USHORT CodePage,
  412. OUT OLECHAR **ppoc,
  413. OUT ULONG *pcb,
  414. OUT NTSTATUS *pstatus)
  415. {
  416. PROPASSERT( sizeof(OLECHAR) == sizeof(WCHAR) );
  417. // Since OLECHAR may be MultiByte or WideChar for this
  418. // compilation, explicitely cast 'ppoc' to a WCHAR** to prevent
  419. // a compilation error.
  420. _MultiByteToWideChar( pch, cb, CodePage, (WCHAR**)ppoc, pcb, pstatus );
  421. }
  422. VOID _WideCharToMultiByte(
  423. IN WCHAR const *pwc,
  424. IN ULONG cch,
  425. IN USHORT CodePage,
  426. OUT CHAR **ppch,
  427. OUT ULONG *pcb,
  428. OUT NTSTATUS *pstatus);
  429. VOID _OLECHARToMultiByte(
  430. IN OLECHAR const *poc,
  431. IN ULONG cch,
  432. IN USHORT CodePage,
  433. OUT CHAR **ppch,
  434. OUT ULONG *pcb,
  435. OUT NTSTATUS *pstatus)
  436. {
  437. PROPASSERT( sizeof(OLECHAR) == sizeof(WCHAR) );
  438. // Since OLECHAR may be MultiByte or WideChar for this
  439. // compilation, explicitely cast 'poc' to a WCHAR* to prevent
  440. // a compilation error.
  441. _WideCharToMultiByte( (WCHAR*) poc, cch, CodePage, ppch, pcb, pstatus );
  442. }
  443. VOID _WideCharToOLECHAR(
  444. IN WCHAR const *pwc,
  445. IN ULONG cch,
  446. IN USHORT CodePage,
  447. OUT OLECHAR **ppoc,
  448. OUT ULONG *pcb,
  449. OUT NTSTATUS *pstatus)
  450. {
  451. PROPASSERT( sizeof(OLECHAR) == sizeof(CHAR) );
  452. // Since OLECHAR may be MultiByte or WideChar for this
  453. // compilation, explicitely cast 'ppoc' to a CHAR** to prevent
  454. // a compilation error.
  455. _WideCharToMultiByte( pwc, cch, CodePage, (CHAR**) ppoc, pcb, pstatus );
  456. }
  457. PROPERTYSETHEADER *_pph;
  458. ULONG _oSection;
  459. ULONG _cSection;
  460. USHORT _CodePage;
  461. BYTE _Flags;
  462. BYTE _State;
  463. ULONG _cbTail;
  464. PMemoryAllocator *_pma;
  465. IMappedStream *_pmstm; // user mode: replacable virtual class
  466. };
  467. #ifdef WINNT
  468. VOID CopyPropertyValue(
  469. IN OPTIONAL SERIALIZEDPROPERTYVALUE const *pprop,
  470. IN ULONG cb,
  471. OUT SERIALIZEDPROPERTYVALUE *ppropDst,
  472. OUT ULONG *pcb);
  473. ULONG PropertyLengthAsVariant(
  474. IN SERIALIZEDPROPERTYVALUE const *pprop,
  475. IN ULONG cbprop,
  476. IN USHORT CodePage,
  477. IN BYTE flags);
  478. ULONG PropertyLengthAsVariantNoEH( // No NT Exception Handling version
  479. IN SERIALIZEDPROPERTYVALUE const *pprop,
  480. IN ULONG cbprop,
  481. IN USHORT CodePage,
  482. IN BYTE flags,
  483. OUT NTSTATUS *pstatus);
  484. #endif
  485. ULONG PropertyLength(
  486. IN SERIALIZEDPROPERTYVALUE const *pprop,
  487. IN ULONG cbbuf,
  488. IN BYTE flags);
  489. ULONG PropertyLengthNoEH( // No NT Exception Handling version
  490. IN SERIALIZEDPROPERTYVALUE const *pprop,
  491. IN ULONG cbbuf,
  492. IN BYTE flags,
  493. OUT NTSTATUS *pstatus);
  494. // ------------
  495. // PBS Routines
  496. // ------------
  497. // PBS routines (Property Byte Swap) perform specialized byte-swapping
  498. // in the big-endian build, and do nothing in the little-endian
  499. // build (in which case they are inlined).
  500. #ifdef BIGENDIAN
  501. VOID PBSCopy( OUT VOID *pvDest,
  502. IN VOID const *pvSource,
  503. IN ULONG cbCopy,
  504. IN LONG cbByteSwap );
  505. VOID PBSAllocAndCopy( OUT VOID **ppvDest,
  506. IN VOID const *pvSource,
  507. ULONG cbSize,
  508. LONG cbByteSwap,
  509. OUT NTSTATUS *pstatus);
  510. VOID PBSInPlaceAlloc( IN OUT WCHAR** ppwszResult,
  511. OUT WCHAR** ppwszBuffer,
  512. OUT NTSTATUS *pstatus );
  513. VOID PBSBuffer( IN OUT VOID *pv,
  514. IN ULONG cbSize,
  515. IN ULONG cbByteSwap );
  516. #else // Little-endian build
  517. inline VOID PBSCopy( OUT VOID *pvDest,
  518. IN VOID const *pvSource,
  519. IN ULONG cbCopy,
  520. IN LONG cbByteSwap )
  521. {
  522. }
  523. inline VOID PBSAllocAndCopy( OUT VOID **ppvDest,
  524. IN VOID const *pvSource,
  525. ULONG cbSize,
  526. LONG cbByteSwap,
  527. OUT NTSTATUS *pstatus)
  528. {
  529. *pstatus = STATUS_SUCCESS;
  530. }
  531. inline VOID PBSInPlaceAlloc( IN OUT WCHAR** ppwszResult,
  532. OUT WCHAR** ppwszBuffer,
  533. OUT NTSTATUS *pstatus )
  534. {
  535. *pstatus = STATUS_SUCCESS;
  536. }
  537. inline VOID PBSBuffer( IN OUT VOID *pv,
  538. IN ULONG cbSize,
  539. IN ULONG cbByteSwap )
  540. {
  541. }
  542. #endif // #ifdef BIGENDIAN ... #else
  543. #endif // _PROPSTM_HXX_