|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992-1999.
//
// File: propapi.h
//
// Contents: Stuff needed to make properties build for Nashville and
// NT... definitions of Nt property api.
//
//
// History: 07-Aug-95 BillMo Created.
// 22-Feb-96 MikeHill Fixed the non-WINNT version of
// PROPASSERTMSG.
// 09-May-96 MikeHill Update define to allow PropSet names
// to be 255 characters (from 127).
// 31-May-96 MikeHill Add OSVersion to RtlCreatePropSet.
// 18-Jun-96 MikeHill Add OleAut32 wrappers to Unicode callouts.
// 15-Jul-96 MikeHill - Remvd Win32 SEH exception-related code.
// - WCHAR=>OLECHAR where applicable.
// - Added RtlOnMappedStreamEvent
// - Added Mac versions of PROPASSERT
//
//--------------------------------------------------------------------------
#ifndef _PROPAPI_H_
#define _PROPAPI_H_
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef __cplusplus
extern "C" { #endif
//
// typedef the function prototypes necessary
// for the UNICODECALLOUTS structure.
//
typedef UINT (WINAPI FNGETACP)(VOID);
typedef int (WINAPI FNMULTIBYTETOWIDECHAR)( IN UINT CodePage, IN DWORD dwFlags, IN LPCSTR lpMultiByteStr, IN int cchMultiByte, OUT LPWSTR lpWideCharStr, IN int cchWideChar);
typedef int (WINAPI FNWIDECHARTOMULTIBYTE)( IN UINT CodePage, IN DWORD dwFlags, IN LPCWSTR lpWideCharStr, IN int cchWideChar, OUT LPSTR lpMultiByteStr, IN int cchMultiByte, IN LPCSTR lpDefaultChar, IN LPBOOL lpUsedDefaultChar);
typedef BSTR FNSYSALLOCSTRING( OLECHAR FAR* pwsz);
typedef VOID FNSYSFREESTRING( BSTR pwsz);
//
// The UNICODECALLOUTS structure holds function
// pointers for routines needed by the property
// set routines in NTDLL.
//
typedef struct _UNICODECALLOUTS { FNGETACP *pfnGetACP; FNMULTIBYTETOWIDECHAR *pfnMultiByteToWideChar; FNWIDECHARTOMULTIBYTE *pfnWideCharToMultiByte; FNSYSALLOCSTRING *pfnSysAllocString; FNSYSFREESTRING *pfnSysFreeString; } UNICODECALLOUTS;
//
// Define the default UNICODECALLOUTS
// values.
//
STDAPI_(BSTR) PropSysAllocString(OLECHAR FAR* pwsz);
STDAPI_(VOID) PropSysFreeString(BSTR bstr);
#define WIN32_UNICODECALLOUTS \
GetACP, \ MultiByteToWideChar, \ WideCharToMultiByte, \ PropSysAllocString, \ PropSysFreeString
// Is this pure NT (the IProp DLL needs to run on Win95)?
#if defined(WINNT) && !defined(IPROPERTY_DLL)
// Set the function modifiers
# define PROPSYSAPI NTSYSAPI
# define PROPAPI NTAPI
// How do we free mem allocated in the low-level propset routines?
# define PropFreeHeap(h, z, p) RtlFreeHeap(h, z, p)
// Assert implementations
# define PROPASSERT ASSERT
# define PROPASSERTMSG ASSERTMSG
// Generate the default non-simple property stream/storage name
# define PROPGENPROPERTYNAME_SIZEOF ( (sizeof("prop")+10+1) * sizeof(WCHAR) )
# define PROPGENPROPERTYNAME_CB(s,cb,n) StringCbPrintf( (s), cb, L"prop%lu", (n) )
// Ansi sprintf implementations
# define PropSprintfA StringCbPrintfA
# define PropVsprintfA vsprintf
// Otherwise this is either the IProp DLL (NT, Win95, Mac),
// or it's the Win95 OLE32build.
#else // #if defined(WINNT) && !defined(IPROPERTY_DLL)
// Set the function modifiers
# define PROPSYSAPI
# define PROPAPI
// How do we free mem allocated in low-level propset routines?
# define PropFreeHeap(h, z, p) CoTaskMemFree(p)
// Assert implementations
# if DBG==1
# ifdef _MAC_NODOC
# define PROPASSERT(f) { if (!(f)) FnAssert(#f, NULL, __FILE__, __LINE__); }
# define PROPASSERTMSG(szReason, f) { if (!(f)) FnAssert(#f, szReason, __FILE__, __LINE__); }
# else
# define PROPASSERT(f) PROPASSERTMSG(NULL,f)
# define PROPASSERTMSG(szReason,f) { if(!(f)) PropAssertFailed(#f,__FILE__,__LINE__,szReason); }
# endif
# else
# define PROPASSERT(f)
# define PROPASSERTMSG(szReason, f)
# endif // #if DBG==1
// Generate the default non-simple property stream/storage name
# define PROPGENPROPERTYNAME(s,n) \
{ \ memcpy ((s), OLESTR("prop"), sizeof (OLESTR("prop"))); \ ULTOO ((n), &(s)[sizeof("prop") - 1], 10); \ }
// Ansi sprintf implementations
# ifdef IPROPERTY_DLL
# define PropSprintfA sprintf
# define PropVsprintfA vsprintf
# else
# define PropSprintfA wsprintfA
# define PropVsprintfA wvsprintfA
# endif // #ifdef _MAC_NODOC
#endif // #if defined(WINNT) && !defined(IPROPERTY_DLL) ... #else
#define WC_PROPSET0 ((WCHAR) 0x0005) //(L'#'))
#define OC_PROPSET0 ((OLECHAR) 0x0005) //OLESTR('#'))
#define CBIT_BYTE 8
#define CBIT_GUID (CBIT_BYTE * sizeof(GUID))
#define CBIT_CHARMASK 5
// The wFormat field in the header indicates what features
// are supported.
#define PROPSET_WFORMAT_ORIGINAL 0
#define PROPSET_WFORMAT_VERSTREAM 1
#define PROPSET_WFORMAT_CASE_SENSITIVE 1
#define PROPSET_WFORMAT_BEHAVIOR 1
#define PROPSET_WFORMAT_LONG_NAMES 1
#define PROPSET_WFORMAT_EXPANDED_VTS 1
// Allow for OC_PROPSET0 and a GUID mapped to a 32 character alphabet
#define CCH_PROPSET (1 + (CBIT_GUID + CBIT_CHARMASK-1)/CBIT_CHARMASK)
#define CCH_PROPSETSZ (CCH_PROPSET + 1) // allow null
#define CCH_PROPSETCOLONSZ (1 + CCH_PROPSET + 1) // allow colon and null
// Define the max property name in units of characters
// (and synonomously in wchars).
#define CCH_MAXPROPNAME 255 // Matches Shell & Office
#define CCH_MAXPROPNAMESZ (CCH_MAXPROPNAME + 1) // allow null
#define CWC_MAXPROPNAME CCH_MAXPROPNAME
#define CWC_MAXPROPNAMESZ CCH_MAXPROPNAMESZ
#define MAX_DOCFILE_ENTRY_NAME 31
//+--------------------------------------------------------------------------
// Property Access APIs:
//---------------------------------------------------------------------------
typedef VOID *NTPROP; typedef VOID *NTMAPPEDSTREAM; typedef VOID *NTMEMORYALLOCATOR;
VOID PROPSYSAPI PROPAPI RtlSetUnicodeCallouts( IN UNICODECALLOUTS *pUnicodeCallouts);
ULONG PROPSYSAPI PROPAPI RtlGuidToPropertySetName( IN GUID const *pguid, OUT OLECHAR aocname[]);
NTSTATUS PROPSYSAPI PROPAPI RtlPropertySetNameToGuid( IN ULONG cwcname, IN OLECHAR const aocname[], OUT GUID *pguid);
VOID PrSetUnicodeCallouts( IN UNICODECALLOUTS *pUnicodeCallouts);
ULONG PrGuidToPropertySetName( IN GUID const *pguid, OUT OLECHAR aocname[]);
NTSTATUS PrPropertySetNameToGuid( IN ULONG cwcname, IN OLECHAR const aocname[], OUT GUID *pguid);
// RtlCreatePropertySet Flags:
#define CREATEPROP_READ 0x0000 // request read access (must exist)
#define CREATEPROP_WRITE 0x0001 // request write access (must exist)
#define CREATEPROP_CREATE 0x0002 // create (overwrite if exists)
#define CREATEPROP_CREATEIF 0x0003 // create (open existing if exists)
#define CREATEPROP_DELETE 0x0004 // delete
#define CREATEPROP_UNKNOWN 0x0008 // read/write state is unknown
#define CREATEPROP_MODEMASK 0x000f // open mode mask
#define CREATEPROP_NONSIMPLE 0x0010 // Is non-simple propset (in a storage)
// RtlCreateMappedStream Flags:
#define CMS_READONLY 0x00000000 // Opened for read-only
#define CMS_WRITE 0x00000001 // Opened for write access
#define CMS_TRANSACTED 0x00000002 // Is transacted
NTSTATUS PROPSYSAPI PROPAPI RtlCreatePropertySet( IN NTMAPPEDSTREAM ms, // Nt mapped stream
IN USHORT Flags, // NONSIMPLE|*1* of READ/WRITE/CREATE/CREATEIF/DELETE
OPTIONAL IN GUID const *pguid, // property set guid (create only)
OPTIONAL IN GUID const *pclsid,// CLASSID of propset code (create only)
IN NTMEMORYALLOCATOR ma, // caller's memory allocator
IN ULONG LocaleId, // Locale Id (create only)
OPTIONAL OUT ULONG *pOSVersion,// OS Version field in header.
IN OUT USHORT *pCodePage, // IN: CodePage of property set (create only)
// OUT: CodePage of property set (always)
OUT NTPROP *pnp); // Nt property set context
NTSTATUS PROPSYSAPI PROPAPI RtlClosePropertySet( IN NTPROP np); // property set context
NTSTATUS PrCreatePropertySet( IN NTMAPPEDSTREAM ms, // Nt mapped stream
IN USHORT Flags, // NONSIMPLE|*1* of READ/WRITE/CREATE/CREATEIF/DELETE
OPTIONAL IN GUID const *pguid, // property set guid (create only)
OPTIONAL IN GUID const *pclsid,// CLASSID of propset code (create only)
IN NTMEMORYALLOCATOR ma, // caller's memory allocator
IN ULONG LocaleId, // Locale Id (create only)
OPTIONAL OUT ULONG *pOSVersion,// OS Version field in header.
IN OUT USHORT *pCodePage, // IN: CodePage of property set (create only)
// OUT: CodePage of property set (always)
IN OUT DWORD *pgrfBehavior, // IN: Behavior of property set (create only)
// OUT: Behavior of property set (always)
OUT NTPROP *pnp); // Nt property set context
NTSTATUS PrClosePropertySet( IN NTPROP np); // property set context
// *NOTE* RtlOnMappedStreamEvent assumes that the caller has
// already taken the CPropertySetStream::Lock.
#define CBSTM_UNKNOWN ((ULONG) -1)
NTSTATUS PROPSYSAPI PROPAPI RtlOnMappedStreamEvent( IN VOID *pv, // property set context (NTPROP)
IN VOID *pbuf, // property set buffer
IN ULONG cbstm ); // size of underlying stream, or CBSTM_UNKNOWN
NTSTATUS PrOnMappedStreamEvent( IN VOID *pv, // property set context (NTPROP)
IN VOID *pbuf, // property set buffer
IN ULONG cbstm ); // size of underlying stream, or CBSTM_UNKNOWN
NTSTATUS PROPSYSAPI PROPAPI RtlFlushPropertySet( IN NTPROP np); // property set context
NTSTATUS PrFlushPropertySet( IN NTPROP np); // property set context
typedef struct _INDIRECTPROPERTY // ip
{ ULONG Index; // Index into Variant and PropId arrays
LPOLESTR poszName; // Old indirect name, RtlSetProperties() only
} INDIRECTPROPERTY;
NTSTATUS PROPSYSAPI PROPAPI RtlSetProperties( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPID pidNameFirst, // first PROPID for new named properties
IN PROPSPEC const aprs[], // array of property specifiers
OPTIONAL OUT PROPID apid[], // buffer for array of propids
OPTIONAL OUT INDIRECTPROPERTY **ppip, // pointer to returned pointer to
// MAXULONG terminated array of Indirect
// properties w/indexes into aprs & avar
OPTIONAL IN PROPVARIANT const avar[]);// array of properties with values
NTSTATUS PrSetProperties( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPID pidNameFirst, // first PROPID for new named properties
IN PROPSPEC const aprs[], // array of property specifiers
OUT USHORT *pCodePage, // updated code page
OPTIONAL OUT PROPID apid[], // buffer for array of propids
OPTIONAL OUT INDIRECTPROPERTY **ppip, // pointer to returned pointer to
// MAXULONG terminated array of Indirect
// properties w/indexes into aprs & avar
OPTIONAL IN PROPVARIANT const avar[]);// array of properties with values
NTSTATUS PROPSYSAPI PROPAPI RtlQueryProperties( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPSPEC const aprs[], // array of property specifiers
OPTIONAL OUT PROPID apid[], // buffer for array of propids
OPTIONAL OUT INDIRECTPROPERTY **ppip, // pointer to returned pointer to
// MAXULONG terminated array of Indirect
// properties w/indexes into aprs & avar
IN OUT PROPVARIANT *avar, // IN: array of uninitialized PROPVARIANTs,
// OUT: may contain pointers to alloc'd memory
OUT ULONG *pcpropFound); // count of property values retrieved
NTSTATUS PrQueryProperties( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPSPEC const aprs[], // array of property specifiers
OPTIONAL OUT PROPID apid[], // buffer for array of propids
OPTIONAL OUT INDIRECTPROPERTY **ppip, // pointer to returned pointer to
// MAXULONG terminated array of Indirect
// properties w/indexes into aprs & avar
IN OUT PROPVARIANT *avar, // IN: array of uninitialized PROPVARIANTs,
// OUT: may contain pointers to alloc'd memory
OUT ULONG *pcpropFound); // count of property values retrieved
#define ENUMPROP_NONAMES 0x00000001 // return property IDs only
NTSTATUS PROPSYSAPI PROPAPI RtlEnumerateProperties( IN NTPROP np, // property set context
IN ULONG Flags, // flags: No Names (propids only), etc.
IN OUT ULONG *pkey, // bookmark; caller set to 0 before 1st call
IN OUT ULONG *pcprop, // pointer to property count
OPTIONAL OUT PROPSPEC aprs[],// IN: array of uninitialized PROPSPECs
// OUT: may contain pointers to alloc'd strings
OPTIONAL OUT STATPROPSTG asps[]); // IN: array of uninitialized STATPROPSTGs
// OUT: may contain pointers to alloc'd strings
NTSTATUS PROPSYSAPI PROPAPI RtlQueryPropertyNames( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPID const *apid, // PROPID array
OUT OLECHAR *aposz[] // OUT pointers to allocated strings
);
NTSTATUS PROPSYSAPI PROPAPI RtlSetPropertyNames( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPID const *apid, // PROPID array
IN OLECHAR const * const aposz[] // pointers to property names
);
NTSTATUS PROPSYSAPI PROPAPI RtlSetPropertySetClassId( IN NTPROP np, // property set context
IN GUID const *pclsid // new CLASSID of propset code
);
NTSTATUS PROPSYSAPI PROPAPI RtlQueryPropertySet( IN NTPROP np, // property set context
OUT STATPROPSETSTG *pspss // buffer for property set stat information
);
NTSTATUS PROPSYSAPI PROPAPI RtlEnumeratePropertySets( IN HANDLE hstg, // structured storage handle
IN BOOLEAN fRestart, // restart scan
IN OUT ULONG *pcspss, // pointer to count of STATPROPSETSTGs
IN OUT GUID *pkey, // bookmark
OUT STATPROPSETSTG *pspss // array of STATPROPSETSTGs
);
NTSTATUS PrEnumerateProperties( IN NTPROP np, // property set context
IN ULONG Flags, // flags: No Names (propids only), etc.
IN OUT ULONG *pkey, // bookmark; caller set to 0 before 1st call
IN OUT ULONG *pcprop, // pointer to property count
OPTIONAL OUT PROPSPEC aprs[],// IN: array of uninitialized PROPSPECs
// OUT: may contain pointers to alloc'd strings
OPTIONAL OUT STATPROPSTG asps[]); // IN: array of uninitialized STATPROPSTGs
// OUT: may contain pointers to alloc'd strings
NTSTATUS PrQueryPropertyNames( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPID const *apid, // PROPID array
OUT OLECHAR *aposz[] // OUT pointers to allocated strings
);
NTSTATUS PrSetPropertyNames( IN NTPROP np, // property set context
IN ULONG cprop, // property count
IN PROPID const *apid, // PROPID array
IN OLECHAR const * const aposz[] // pointers to property names
);
NTSTATUS PrSetPropertySetClassId( IN NTPROP np, // property set context
IN GUID const *pclsid // new CLASSID of propset code
);
NTSTATUS PrQueryPropertySet( IN NTPROP np, // property set context
OUT STATPROPSETSTG *pspss // buffer for property set stat information
);
NTSTATUS PrEnumeratePropertySets( IN HANDLE hstg, // structured storage handle
IN BOOLEAN fRestart, // restart scan
IN OUT ULONG *pcspss, // pointer to count of STATPROPSETSTGs
IN OUT GUID *pkey, // bookmark
OUT STATPROPSETSTG *pspss // array of STATPROPSETSTGs
);
#ifdef __cplusplus
} #endif
#endif // ifndef _PROPAPI_H_
|