|
|
//+------------------------------------------------------------------------- // // 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_
|