489 lines
17 KiB
C
489 lines
17 KiB
C
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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(s,n) swprintf ((s), L"prop%lu", (n))
|
|
|
|
// Ansi sprintf implementations
|
|
# define PropSprintfA sprintf
|
|
# 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_
|