/*++ BUILD Version: 0002 // Increment this if a change has global effects Copyright (c) Microsoft Corporation. All rights reserved. Module Name: sxsapi.h Abstract: Include file with definitions for calling into the sxs.dll private APIs Author: Michael Grier (MGrier) 4-May-2000 Environment: Revision History: Jay Krell (JayKrell) November 30, 2001 seperated guids out into sxsapi_guids.h --*/ #ifndef _SXSAPI_ #define _SXSAPI_ #if (_MSC_VER > 1020) #pragma once #endif // // bring in IStream / ISequentialStream // #if !defined(COM_NO_WINDOWS_H) #define COM_NO_WINDOWS_H COM_NO_WINDOWS_H #endif #pragma push_macro("COM_NO_WINDOWS_H") #undef COM_NO_WINDOWS_H #include "objidl.h" #pragma pop_macro("COM_NO_WINDOWS_H") // from setupapi.h typedef PVOID HSPFILEQ; #include #ifdef __cplusplus extern "C" { #endif #define SXS_DLL_NAME_A ( "sxs.dll") #define SXS_DLL_NAME_W (L"sxs.dll") #define SXS_DLL_NAME (TEXT( "sxs.dll")) typedef struct _SXS_XML_DOCUMENT *PSXS_XML_DOCUMENT; typedef const struct _SXS_XML_DOCUMENT *PCSXS_XML_DOCUMENT; typedef struct _SXS_XML_STRING *PSXS_XML_STRING; typedef const struct _SXS_XML_STRING *PCSXS_XML_STRING; typedef struct _SXS_XML_LOCATION *PSXS_XML_LOCATION; typedef const struct _SXS_XML_LOCATION *PCSXS_XML_LOCATION; typedef struct _SXS_XML_NODE *PSXS_XML_NODE; typedef const struct _SXS_XML_NODE *PCSXS_XML_NODE; typedef struct _SXS_XML_ATTRIBUTE *PSXS_XML_ATTRIBUTE; typedef const struct _SXS_XML_ATTRIBUTE *PCSXS_XML_ATTRIBUTE; typedef struct _SXS_XML_DOCUMENT { ULONG Flags; ULONG StringCount; PCSXS_XML_STRING Strings; // Note that index 0 is reserved to mean "no string" or "no value" LIST_ENTRY ElementListHead; // conceptually just one element, but PIs also appear in this list } SXS_XML_DOCUMENT; // Most will not be null terminated; if they happen to be this flag will be set; this can be used // to avoid a string copy if you really need them to be null terminated. #define SXS_XML_STRING_FLAG_NULL_TERMINATED (0x00000001) #define SXS_XML_STRING_FLAG_INVALID (0x00000002) typedef struct _SXS_XML_STRING { ULONG Flags; ULONG PseudoKey; ULONG Length; // in bytes const WCHAR *Buffer; // pointer to first character of non-null-terminated string } SXS_XML_STRING; typedef struct _SXS_XML_LOCATION { ULONG Flags; ULONG SourceString; // source file name ULONG BeginningLine; ULONG BeginningColumn; ULONG EndingLine; ULONG EndingColumn; } SXS_XML_LOCATION; #define SXS_XML_NODE_TYPE_INVALID (0) #define SXS_XML_NODE_TYPE_XML_DECL (1) #define SXS_XML_NODE_TYPE_PI (2) #define SXS_XML_NODE_TYPE_ELEMENT (3) #define SXS_XML_NODE_TYPE_PCDATA (4) #define SXS_XML_NODE_TYPE_CDATA (5) typedef struct _SXS_XML_NODE_XML_DECL_DATA { ULONG AttributeCount; PCSXS_XML_ATTRIBUTE Attributes; } SXS_XML_NODE_XML_DECL_DATA; typedef struct _SXS_XML_NODE_ELEMENT_DATA { ULONG NamespaceString; ULONG NameString; ULONG AttributeCount; PCSXS_XML_ATTRIBUTE Attributes; LIST_ENTRY ChildListHead; } SXS_XML_NODE_ELEMENT_DATA; typedef struct _SXS_XML_NODE { LIST_ENTRY SiblingLink; ULONG Flags; ULONG Type; PCSXS_XML_NODE Parent; union { SXS_XML_NODE_XML_DECL_DATA XMLDecl; ULONG PIString; SXS_XML_NODE_ELEMENT_DATA Element; ULONG PCDataString; ULONG CDataString; }; } SXS_XML_NODE; #define SXS_XML_ATTRIBUTE_FLAG_NAMESPACE_ATTRIBUTE (0x00000001) typedef struct _SXS_XML_ATTRIBUTE { ULONG Flags; ULONG NamespaceString; ULONG NameString; ULONG ValueString; } SXS_XML_ATTRIBUTE; // // structs for walking/locating things in the XML parse tree // typedef struct _SXS_XML_NAMED_REFERENCE *PSXS_XML_NAMED_REFERENCE; typedef const struct _SXS_XML_NAMED_REFERENCE *PCSXS_XML_NAMED_REFERENCE; typedef struct _SXS_XML_NODE_PATH *PSXS_XML_NODE_PATH; typedef const struct _SXS_XML_NODE_PATH *PCSXS_XML_NODE_PATH; typedef struct _SXS_XML_NAMED_REFERENCE { PCWSTR Namespace; ULONG NamespaceLength; // in bytes PCWSTR Name; ULONG NameLength; // in bytes } SXS_XML_NAMED_REFERENCE; typedef struct _SXS_XML_NODE_PATH { ULONG ElementCount; const PCSXS_XML_NAMED_REFERENCE *Elements; } SXS_XML_NODE_PATH; typedef VOID (WINAPI * PSXS_ENUM_XML_NODES_CALLBACK)( IN PVOID Context, IN PCSXS_XML_NODE Element, OUT BOOL *ContinueEnumeration ); BOOL WINAPI SxsEnumXmlNodes( IN ULONG Flags, IN PCSXS_XML_DOCUMENT Document, IN PCSXS_XML_NODE_PATH PathToMatch, IN PSXS_ENUM_XML_NODES_CALLBACK Callback, IN PVOID Context ); #define SXS_INSTALLATION_FILE_COPY_DISPOSITION_FILE_COPIED (1) #define SXS_INSTALLATION_FILE_COPY_DISPOSITION_FILE_QUEUED (2) #define SXS_INSTALLATION_FILE_COPY_DISPOSITION_PLEASE_COPY (3) #define SXS_INSTALLATION_FILE_COPY_DISPOSITION_PLEASE_MOVE (4) typedef struct _SXS_INSTALLATION_FILE_COPY_CALLBACK_PARAMETERS { IN DWORD cbSize; IN PVOID pvContext; IN DWORD dwFileFlags; IN PVOID pAlternateSource; IN PCWSTR pSourceFile; IN PCWSTR pDestinationFile; IN ULONGLONG nFileSize; OUT INT nDisposition; } SXS_INSTALLATION_FILE_COPY_CALLBACK_PARAMETERS, *PSXS_INSTALLATION_FILE_COPY_CALLBACK_PARAMETERS; typedef BOOL (WINAPI * PSXS_INSTALLATION_FILE_COPY_CALLBACK)( PSXS_INSTALLATION_FILE_COPY_CALLBACK_PARAMETERS pParameters ); // // If SxsBeginAssemblyInstall() is called with SXS_INSTALL_ASSEMBLY_FILE_COPY_CALLBACK_SETUP_COPY_QUEUE as the // InstallationCallback parameter, the InstallationContext parameter is assumed to be an // HSPFILEQ copy queue handle. If SXS_INSTALL_ASSEMBLY_FILE_COPY_CALLBACK_SETUP_COPY_QUEUE_EX, // the InstallationContext must point to a SXS_INSTALL_ASSEMBLY_SETUP_COPY_QUEUE_EX_PARAMETERS. // // This provides an easy mechanism for someone maintaining a copy queue to interact with assembly installation. // #define SXS_INSTALLATION_FILE_COPY_CALLBACK_SETUP_COPY_QUEUE ((PSXS_INSTALLATION_FILE_COPY_CALLBACK) 1) #define SXS_INSTALLATION_FILE_COPY_CALLBACK_SETUP_COPY_QUEUE_EX ((PSXS_INSTALLATION_FILE_COPY_CALLBACK) 2) // // Parameters to Setupapi.dll::SetupQueueCopy // typedef struct _SXS_INSTALLATION_SETUP_COPY_QUEUE_EX_PARAMETERS { DWORD cbSize; HSPFILEQ hSetupCopyQueue; // SetupOpenFileQueue PCWSTR pszSourceDescription; DWORD dwCopyStyle; } SXS_INSTALLATION_SETUP_COPY_QUEUE_EX_PARAMETERS, *PSXS_INSTALLATION_SETUP_COPY_QUEUE_EX_PARAMETERS; typedef const SXS_INSTALLATION_SETUP_COPY_QUEUE_EX_PARAMETERS* PCSXS_INSTALLATION_SETUP_COPY_QUEUE_EX_PARAMETERS; typedef BOOL (WINAPI * PSXS_IMPERSONATION_CALLBACK)( IN PVOID Context, IN BOOL Impersonate ); #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_MOVE (0x00000001) #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_FROM_RESOURCE (0x00000002) #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_FROM_DIRECTORY (0x00000004) #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_FROM_DIRECTORY_RECURSIVE (0x00000008) #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_NOT_TRANSACTIONAL (0x00000010) #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_NO_VERIFY (0x00000020) #define SXS_BEGIN_ASSEMBLY_INSTALL_FLAG_REPLACE_EXISTING (0x00000040) typedef BOOL (WINAPI * PSXS_BEGIN_ASSEMBLY_INSTALL)( IN DWORD Flags, IN PSXS_INSTALLATION_FILE_COPY_CALLBACK InstallationCallback OPTIONAL, IN PVOID InstallationContext OPTIONAL, IN PSXS_IMPERSONATION_CALLBACK ImpersonationCallback OPTIONAL, IN PVOID ImpersonationContext OPTIONAL, OUT PVOID *InstallCookie ); #define SXS_BEGIN_ASSEMBLY_INSTALL ("SxsBeginAssemblyInstall") BOOL WINAPI SxsBeginAssemblyInstall( IN DWORD Flags, IN PSXS_INSTALLATION_FILE_COPY_CALLBACK InstallationCallback OPTIONAL, IN PVOID InstallationContext OPTIONAL, IN PSXS_IMPERSONATION_CALLBACK ImpersonationCallback OPTIONAL, IN PVOID ImpersonationContext OPTIONAL, OUT PVOID *InstallCookie ); #include #include "sxsapi_guids.h" typedef struct tagSXS_INSTALL_REFERENCEW { DWORD cbSize; DWORD dwFlags; GUID guidScheme; PCWSTR lpIdentifier; PCWSTR lpNonCanonicalData; } SXS_INSTALL_REFERENCEW, *PSXS_INSTALL_REFERENCEW; typedef const struct tagSXS_INSTALL_REFERENCEW *PCSXS_INSTALL_REFERENCEW; typedef struct tagSXS_INSTALLW { DWORD cbSize; DWORD dwFlags; PCWSTR lpManifestPath; PVOID pvInstallCookie; PCWSTR lpCodebaseURL; PCWSTR lpRefreshPrompt; PCWSTR lpLogFileName; PCSXS_INSTALL_REFERENCEW lpReference; } SXS_INSTALLW, *PSXS_INSTALLW; typedef const struct tagSXS_INSTALLW *PCSXS_INSTALLW; // // These flags are distinct from the begin install flags, but // we're assigning them unique numbers so that flag-reuse errors can // be caught more easily. // #define SXS_INSTALL_FLAG_CODEBASE_URL_VALID (0x00000100) #define SXS_INSTALL_FLAG_MOVE (0x00000200) #define SXS_INSTALL_FLAG_FROM_RESOURCE (0x00000400) #define SXS_INSTALL_FLAG_FROM_DIRECTORY (0x00000800) #define SXS_INSTALL_FLAG_FROM_DIRECTORY_RECURSIVE (0x00001000) #define SXS_INSTALL_FLAG_NOT_TRANSACTIONAL (0x00002000) #define SXS_INSTALL_FLAG_NO_VERIFY (0x00004000) #define SXS_INSTALL_FLAG_REPLACE_EXISTING (0x00008000) #define SXS_INSTALL_FLAG_LOG_FILE_NAME_VALID (0x00010000) #define SXS_INSTALL_FLAG_INSTALLED_BY_DARWIN (0x00020000) #define SXS_INSTALL_FLAG_INSTALLED_BY_OSSETUP (0x00040000) #define SXS_INSTALL_FLAG_INSTALL_COOKIE_VALID (0x00080000) #define SXS_INSTALL_FLAG_REFRESH_PROMPT_VALID (0x00100000) #define SXS_INSTALL_FLAG_REFERENCE_VALID (0x00200000) #define SXS_INSTALL_FLAG_REFRESH (0x00400000) #define SXS_INSTALL_FLAG_INSTALLED_BY_MIGRATION (0x00800000) #define SXS_INSTALL_FLAG_FROM_CABINET (0x01000000) typedef BOOL (WINAPI * PSXS_INSTALL_W)( IN OUT PSXS_INSTALLW lpInstall ); typedef PSXS_INSTALL_W PSXS_INSTALL_W_ROUTINE; BOOL WINAPI SxsInstallW( IN OUT PSXS_INSTALLW lpInstall ); #define SXS_INSTALL_W ("SxsInstallW") // // If you've specified SXS_INSTALL_ASSEMBLY_FLAG_INCLUDE_CODEBASE, you must pass // a PSXS_INSTALL_SOURCE_INFO in the Reserved value of SxsInstallAssemblyW. // This is the definition of that structure. // typedef struct _SXS_INSTALL_SOURCE_INFO { // Size of this structure. Required. SIZE_T cbSize; // Any combination of SXSINSTALLSOURCE_* DWORD dwFlags; // Codebase to reinstall this assembly from. Can be determined from the // manifest name that's being installed, but not preferrably. PCWSTR pcwszCodebaseName; // What string (localized!) that should be presented to the user during // recovery to request the media that this assembly came from. PCWSTR pcwszPromptOnRefresh; PCWSTR pcwszLogFileName; } SXS_INSTALL_SOURCE_INFO, *PSXS_INSTALL_SOURCE_INFO; typedef const struct _SXS_INSTALL_SOURCE_INFO *PCSXS_INSTALL_SOURCE_INFO; // The SXS_INSTALL_SOURCE_INFO structure has the pcwszCodebase member filled in. #define SXSINSTALLSOURCE_HAS_CODEBASE ( 0x00000001 ) // The SXS_INSTALL_SOURCE_INFO structure has the pcwszPromptOnRefresh member filled in. #define SXSINSTALLSOURCE_HAS_PROMPT ( 0x00000002 ) // The assembly has a catalog that must be present and copied over. If missing, then the // instaler will intuit whether it has a catalog or not. #define SXSINSTALLSOURCE_HAS_CATALOG ( 0x00000004 ) // This assembly is being installed as part of OS-setup, and so the codebase actually // contains the source-relative path of the root directory of the assembly source #define SXSINSTALLSOURCE_INSTALLING_SETUP ( 0x00000008 ) // The installer should not attempt to autodetect whether or not there's a catalog // associated with this assembly. #define SXSINSTALLSOURCE_DONT_DETECT_CATALOG ( 0x0000010 ) #define SXSINSTALLSOURCE_CREATE_LOGFILE ( 0x0000020 ) // for WFP recovery usage #define SXSINSTALLSOURCE_INSTALL_BY_DARWIN ( 0x0000040 ) #define SXSINSTALLSOURCE_INSTALL_BY_OSSETUP ( 0x0000080 ) #define SXSINSTALLSOURCE_INSTALL_BY_MIGRATION (0x0000100 ) // // These flags are distinct from the begin assembly install flags, but // we're assigning them unique numbers so that flag-reuse errors can // be caught more easily. // #define SXS_END_ASSEMBLY_INSTALL_FLAG_COMMIT (0x01000000) #define SXS_END_ASSEMBLY_INSTALL_FLAG_ABORT (0x02000000) #define SXS_END_ASSEMBLY_INSTALL_FLAG_NO_VERIFY (0x04000000) #define SXS_END_ASSEMBLY_INSTALL_FLAG_GET_STATUS (0x08000000) typedef BOOL (WINAPI * PSXS_END_ASSEMBLY_INSTALL)( IN PVOID InstallCookie, IN DWORD Flags, OUT DWORD *Reserved OPTIONAL ); #define SXS_END_ASSEMBLY_INSTALL ("SxsEndAssemblyInstall") BOOL WINAPI SxsEndAssemblyInstall( IN PVOID InstallCookie, IN DWORD Flags, IN OUT PVOID Reserved OPTIONAL ); // // Uninstallation of an assembly // typedef struct _tagSXS_UNINSTALLW { SIZE_T cbSize; DWORD dwFlags; LPCWSTR lpAssemblyIdentity; PCSXS_INSTALL_REFERENCEW lpInstallReference; LPCWSTR lpInstallLogFile; } SXS_UNINSTALLW, *PSXS_UNINSTALLW; typedef const struct _tagSXS_UNINSTALLW *PCSXS_UNINSTALLW; #define SXS_UNINSTALL_FLAG_REFERENCE_VALID (0x00000001) #define SXS_UNINSTALL_FLAG_FORCE_DELETE (0x00000002) #define SXS_UNINSTALL_FLAG_USE_INSTALL_LOG (0x00000004) #define SXS_UNINSTALL_FLAG_REFERENCE_COMPUTED (0x00000008) // // The reference to the assembly was removed // #define SXS_UNINSTALL_DISPOSITION_REMOVED_REFERENCE (0x00000001) // // The actual assembly was removed because it ran out of references. // #define SXS_UNINSTALL_DISPOSITION_REMOVED_ASSEMBLY (0x00000002) typedef BOOL (WINAPI * PSXS_UNINSTALL_ASSEMBLYW)( IN PCSXS_UNINSTALLW pcUnInstallData, OUT DWORD *pdwDisposition ); typedef PSXS_UNINSTALL_ASSEMBLYW PSXS_UNINSTALL_W_ROUTINE; #define SXS_UNINSTALL_ASSEMBLYW ("SxsUninstallW") BOOL WINAPI SxsUninstallW( IN PCSXS_UNINSTALLW pcUnInstallData, OUT DWORD *pdwDisposition ); #define SXS_PROBE_ASSEMBLY_INSTALLATION_IDENTITY_PRECOMPOSED (0x00000001) #define SXS_PROBE_ASSEMBLY_INSTALLATION_DISPOSITION_NOT_INSTALLED (0x00000001) #define SXS_PROBE_ASSEMBLY_INSTALLATION_DISPOSITION_INSTALLED (0x00000002) #define SXS_PROBE_ASSEMBLY_INSTALLATION_DISPOSITION_RESIDENT (0x00000004) typedef BOOL (WINAPI * PSXS_PROBE_ASSEMBLY_INSTALLATION)( IN DWORD dwFlags, IN PCWSTR lpIdentity, OUT DWORD *plpDisposition ); #define SXS_PROBE_ASSEMBLY_INSTALLATION ("SxsProbeAssemblyInstallation") BOOL WINAPI SxsProbeAssemblyInstallation( DWORD dwFlags, PCWSTR lpIdentity, PDWORD lpDisposition ); #define SXS_QUERY_MANIFEST_INFORMATION_INFOCLASS_BASIC (1) #define SXS_QUERY_MANIFEST_INFORMATION_FLAG_SOURCE_IS_DLL (0x00000001) #define SXS_QUERY_MANIFEST_INFORMATION_INFOCLASS_BASIC_FLAG_OMIT_IDENTITY (0x00000001) #define SXS_QUERY_MANIFEST_INFORMATION_INFOCLASS_BASIC_FLAG_OMIT_SHORTNAME (0x00000002) typedef struct _SXS_MANIFEST_INFORMATION_BASIC { PCWSTR lpIdentity; PCWSTR lpShortName; ULONG ulFileCount; } SXS_MANIFEST_INFORMATION_BASIC, *PSXS_MANIFEST_INFORMATION_BASIC; #define SXS_QUERY_MANIFEST_INFORMATION_DLL_SOURCE_FLAG_RESOURCE_TYPE_VALID (0x00000001) #define SXS_QUERY_MANIFEST_INFORMATION_DLL_SOURCE_FLAG_RESOURCE_LANGUAGE_VALID (0x00000002) #define SXS_QUERY_MANIFEST_INFORMATION_DLL_SOURCE_FLAG_RESOURCE_ID_VALID (0x00000004) typedef struct _SXS_MANIFEST_INFORMATION_SOURCE_DLL { DWORD dwSize; DWORD dwFlags; PCWSTR pcwszDllPath; PCWSTR pcwszResourceType; PCWSTR pcwszResourceName; INT Language; } SXS_MANIFEST_INFORMATION_SOURCE_DLL, *PSXS_MANIFEST_INFORMATION_SOURCE_DLL; typedef const struct _SXS_MANIFEST_INFORMATION_SOURCE_DLL *PCSXS_MANIFEST_INFORMATION_SOURCE_DLL; typedef BOOL (WINAPI * PSXS_QUERY_MANIFEST_INFORMATION)( IN DWORD dwFlags, IN PCWSTR pszSource, IN ULONG ulInfoClass, IN DWORD dwInfoClassSpecificFlags, IN SIZE_T cbBuffer, OUT PVOID lpBuffer, OUT PSIZE_T cbWrittenOrRequired OPTIONAL ); BOOL WINAPI SxsQueryManifestInformation( IN DWORD dwFlags, IN PCWSTR pszSource, IN ULONG ulInfoClass, IN DWORD dwInfoClassSpecificFlags, IN SIZE_T cbBuffer, OUT PVOID lpBuffer, OUT PSIZE_T cbWrittenOrRequired OPTIONAL ); // // these flags are used for sxs.dll. when ActCtx generation for system default fails, there are two cases we could ignore this error : // Case 1 : there is no system-default at all // Case 2 : the dependency of system-default could not be found: this case may happen during the GUImode setup, when system-default is // installed before GUI assembly is installed // SXS.dll would pass out these two failure cases using these flags // #define BASESRV_SXS_RETURN_RESULT_SYSTEM_DEFAULT_NOT_FOUND (0x0001) #define BASESRV_SXS_RETURN_RESULT_SYSTEM_DEFAULT_DEPENDENCY_ASSEMBLY_NOT_FOUND (0x0002) #define SXS_GENERATE_ACTIVATION_CONTEXT_FLAG_SUPPRESS_EVENT_LOG (0x00000001) #define SXS_GENERATE_ACTIVATION_CONTEXT_FLAG_SYSTEM_DEFAULT_TEXTUAL_ASSEMBLY_IDENTITY (0x00000002) #define SXS_GENERATE_ACTIVATION_CONTEXT_FLAG_TEXTUAL_ASSEMBLY_IDENTITY (0x00000004) #define SXS_GENERATE_ACTIVATION_CONTEXT_FLAG_APP_RUNNING_IN_SAFEMODE (0x00000008) typedef struct _SXS_GENERATE_ACTIVATION_CONTEXT_STREAM { IStream* Stream; // // This is not necessarily a file system path, just something // for descriptive/debugging purposes. // // Still, when they are file system paths, we try to keep them as Win32 paths instead of Nt paths. // PCWSTR Path; ULONG PathType; } SXS_GENERATE_ACTIVATION_CONTEXT_STREAM; typedef struct _SXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS { IN DWORD Flags; IN USHORT ProcessorArchitecture; IN LANGID LangId; IN PCWSTR AssemblyDirectory; // should be a Win32 path IN PCWSTR TextualAssemblyIdentity; IN SXS_GENERATE_ACTIVATION_CONTEXT_STREAM Manifest; IN SXS_GENERATE_ACTIVATION_CONTEXT_STREAM Policy; OUT DWORD SystemDefaultActCxtGenerationResult; // when generate activation context for system default fails, this mask shows whether it fails for some certain reason which we could ignore the error. PSXS_IMPERSONATION_CALLBACK ImpersonationCallback; PVOID ImpersonationContext; OUT HANDLE SectionObjectHandle; } SXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS, *PSXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS; typedef const SXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS* PCSXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS; typedef BOOL (WINAPI* PSXS_GENERATE_ACTIVATION_CONTEXT_FUNCTION)( PSXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS Parameters ); BOOL WINAPI SxsGenerateActivationContext( IN OUT PSXS_GENERATE_ACTIVATION_CONTEXT_PARAMETERS Parameters ); // // Opaque ASSEMBLY_IDENTITY structure // typedef struct _ASSEMBLY_IDENTITY *PASSEMBLY_IDENTITY; typedef const struct _ASSEMBLY_IDENTITY *PCASSEMBLY_IDENTITY; // // The types of assembly identities. // // Definitions may not include wildcard attributes; definitions // match only if they are exactly equal. A wildcard matches // a definition if for all the non-wildcarded attributes, // there is an exact match. References may not contain // wildcarded attributes but may contain a different set of // attributes than a definition that they match. (Example: // definitions carry the full public key of the publisher, but // references usually carry just the "strong name" which is // the first 8 bytes of the SHA-1 hash of the public key.) // #define ASSEMBLY_IDENTITY_TYPE_DEFINITION (1) #define ASSEMBLY_IDENTITY_TYPE_REFERENCE (2) #define ASSEMBLY_IDENTITY_TYPE_WILDCARD (3) #define SXS_ASSEMBLY_MANIFEST_STD_NAMESPACE L"urn:schemas-microsoft-com:asm.v1" #define SXS_ASSEMBLY_MANIFEST_STD_NAMESPACE_CCH (32) #define SXS_ASSEMBLY_MANIFEST_STD_ELEMENT_NAME_ASSEMBLY L"assembly" #define SXS_ASSEMBLY_MANIFEST_STD_ELEMENT_NAME_ASSEMBLY_CCH (8) #define SXS_ASSEMBLY_MANIFEST_STD_ELEMENT_NAME_ASSEMBLY_IDENTITY L"assemblyIdentity" #define SXS_ASSEMBLY_MANIFEST_STD_ELEMENT_NAME_ASSEMBLY_IDENTITY_CCH (16) #define SXS_APPLICATION_CONFIGURATION_MANIFEST_STD_ELEMENT_NAME_CONFIGURATION L"configuration" #define SXS_APPLICATION_CONFIGURATION_MANIFEST_STD_ELEMENT_NAME_CONFIGURATION_CCH (13) #define SXS_ASSEMBLY_MANIFEST_STD_ATTRIBUTE_NAME_MANIFEST_VERSION L"manifestVersion" #define SXS_ASSEMBLY_MANIFEST_STD_ATTRIBUTE_NAME_MANIFEST_VERSION_CCH (15) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_NAME L"name" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_NAME_CCH (4) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_VERSION L"version" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_VERSION_CCH (7) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_LANGUAGE L"language" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_LANGUAGE_CCH (8) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_PUBLIC_KEY L"publicKey" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_PUBLIC_KEY_CCH (9) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_PUBLIC_KEY_TOKEN L"publicKeyToken" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_PUBLIC_KEY_TOKEN_CCH (14) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_PROCESSOR_ARCHITECTURE L"processorArchitecture" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_PROCESSOR_ARCHITECTURE_CCH (21) #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_TYPE L"type" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_NAME_TYPE_CCH (4) // Pseudo-value used in some places when the language= attribute is missing from the identity. // An identity that does not have language is implicitly "worldwide". #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_LANGUAGE_MISSING_VALUE L"x-ww" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_LANGUAGE_MISSING_VALUE_CCH (4) // // All win32 assemblies must have "win32" as their type. // #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_TYPE_VALUE_WIN32 L"win32" #define SXS_ASSEMBLY_IDENTITY_STD_ATTRIBUTE_TYPE_VALUE_WIN32_CCH (5) // // Global flags describing the assembly identity state // // // SXS_ASSEMBLY_IDENTITY_FLAG_FROZEN means that the assembly // identity's contents are frozen and are not subject to additional // change. // #define ASSEMBLY_IDENTITY_FLAG_FROZEN (0x80000000) // // ASSEMBLY_IDENTITY_ATTRIBUTE structure // typedef struct _ASSEMBLY_IDENTITY_ATTRIBUTE { DWORD Flags; SIZE_T NamespaceCch; SIZE_T NameCch; SIZE_T ValueCch; const WCHAR *Namespace; const WCHAR *Name; const WCHAR *Value; } ASSEMBLY_IDENTITY_ATTRIBUTE, *PASSEMBLY_IDENTITY_ATTRIBUTE; typedef const struct _ASSEMBLY_IDENTITY_ATTRIBUTE *PCASSEMBLY_IDENTITY_ATTRIBUTE; typedef enum _ASSEMBLY_IDENTITY_INFORMATION_CLASS { AssemblyIdentityBasicInformation = 1, } ASSEMBLY_IDENTITY_INFORMATION_CLASS; typedef struct _ASSEMBLY_IDENTITY_BASIC_INFORMATION { DWORD Flags; ULONG Type; ULONG Hash; ULONG AttributeCount; } ASSEMBLY_IDENTITY_BASIC_INFORMATION, *PASSEMBLY_IDENTITY_BASIC_INFORMATION; #define SXS_CREATE_ASSEMBLY_IDENTITY_FLAG_FREEZE (0x00000001) BOOL WINAPI SxsCreateAssemblyIdentity( IN DWORD Flags, IN ULONG Type, OUT PASSEMBLY_IDENTITY *AssemblyIdentity, IN ULONG InitialAttributeCount OPTIONAL, IN PCASSEMBLY_IDENTITY_ATTRIBUTE const * InitialAttributes OPTIONAL ); typedef BOOL (WINAPI * PSXS_CREATE_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN ULONG Type, OUT PASSEMBLY_IDENTITY *AssemblyIdentity, IN ULONG InitialAttributeCount OPTIONAL, IN PCASSEMBLY_IDENTITY_ATTRIBUTE const * InitialAttributes OPTIONAL ); BOOL WINAPI SxsHashAssemblyIdentity( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, OUT ULONG *Hash ); typedef BOOL (WINAPI * PSXS_HASH_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, OUT ULONG *Hash ); #define SXS_ARE_ASSEMBLY_IDENTITIES_EQUAL_FLAG_ALLOW_REF_TO_MATCH_DEF (0x00000001) BOOL WINAPI SxsAreAssemblyIdentitiesEqual( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity1, IN PCASSEMBLY_IDENTITY AssemlbyIdentity2, OUT BOOL *Equal ); typedef BOOL (WINAPI * PSXS_ARE_ASSEMBLY_IDENTITIES_EQUAL_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity1, IN PCASSEMBLY_IDENTITY AssemblyIdentity2, OUT BOOL *Equal ); BOOL WINAPI SxsFreezeAssemblyIdentity( IN DWORD Flags, IN PASSEMBLY_IDENTITY AssemblyIdentity ); typedef BOOL (WINAPI *PSXS_FREEZE_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN PASSEMBLY_IDENTITY AssemblyIdentity ); VOID WINAPI SxsDestroyAssemblyIdentity( IN PASSEMBLY_IDENTITY AssemblyIdentity ); typedef VOID (WINAPI * PSXS_DESTROY_ASSEMBLY_IDENTITY_ROUTINE)( IN PASSEMBLY_IDENTITY AssemblyIdentity ); #define SXS_VALIDATE_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_VALIDATE_NAMESPACE (0x00000001) #define SXS_VALIDATE_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_VALIDATE_NAME (0x00000002) #define SXS_VALIDATE_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_VALIDATE_VALUE (0x00000004) #define SXS_VALIDATE_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_WILDCARDS_PERMITTED (0x00000008) #define SXS_HASH_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_HASH_NAMESPACE (0x00000001) #define SXS_HASH_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_HASH_NAME (0x00000002) #define SXS_HASH_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_HASH_VALUE (0x00000004) BOOL WINAPI SxsValidateAssemblyIdentityAttribute( IN DWORD Flags, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute ); typedef BOOL (WINAPI * PSXS_VALIDATE_ASSEMBLY_IDENTITY_ATTRIBUTES_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute ); BOOL WINAPI SxsHashAssemblyIdentityAttribute( IN DWORD Flags, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute, OUT ULONG *HashValue ); typedef BOOL (WINAPI * PSXS_HASH_ASSEMBLY_IDENTITY_ATTRIBUTE_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute, OUT ULONG *HashValue ); #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_COMPARISON_RESULT_INVALID (0) #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_COMPARISON_RESULT_LESS_THAN (1) #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_COMPARISON_RESULT_EQUAL (2) #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_COMPARISON_RESULT_GREATER_THAN (3) #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_COMPARE_NAMESPACE (0x00000001) #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_COMPARE_NAME (0x00000002) #define SXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_COMPARE_VALUE (0x00000004) BOOL WINAPI SxsCompareAssemblyIdentityAttributes( IN DWORD Flags, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute1, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute2, OUT ULONG *ComparisonResult ); typedef BOOL (WINAPI * PSXS_COMPARE_ASSEMBLY_IDENTITY_ATTRIBUTES_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute1, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute2, OUT ULONG *ComparisonResult ); #define SXS_INSERT_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_OVERWRITE_EXISTING (0x00000001) BOOL WINAPI SxsInsertAssemblyIdentityAttribute( IN DWORD Flags, IN PASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE AssemblyIdentityAttribute ); typedef BOOL (WINAPI * PSXS_INSERT_ASSEMBLY_IDENTITY_ATTRIBUTE_ROUTINE)( IN DWORD Flags, IN PASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE AssemblyIdentityAttribute ); BOOL WINAPI SxsRemoveAssemblyIdentityAttributesByOrdinal( IN DWORD Flags, IN PASSEMBLY_IDENTITY AssemblyIdentity, IN ULONG AttributeOrdinal, IN ULONG AttributeCount ); typedef BOOL (WINAPI * PSXS_REMOVE_ASSEMBLY_IDENTITY_ATTRIBUTES_BY_ORDINAL_ROUTINE)( IN DWORD Flags, IN PASSEMBLY_IDENTITY AssemblyIdentity, IN ULONG AttributeOrdinal, IN ULONG AttributeCount ); #define SXS_FIND_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_MATCH_NAMESPACE (0x00000001) #define SXS_FIND_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_MATCH_NAME (0x00000002) #define SXS_FIND_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_MATCH_VALUE (0x00000004) #define SXS_FIND_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_NOT_FOUND_SUCCEEDS (0x00000008) BOOL WINAPI SxsFindAssemblyIdentityAttribute( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE AttributeToMatch, OUT ULONG *FirstMatchOrdinal OPTIONAL, OUT ULONG *MatchCount OPTIONAL ); typedef BOOL (WINAPI * PSXS_FIND_ASSEMBLY_IDENTITY_ATTRIBUTE_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE AttributeToMatch, OUT ULONG *FirstMatchOrdinal OPTIONAL, OUT ULONG *MatchCount OPTIONAL ); // // Rather than making "n" heap allocations, the pattern for SxsGetAssemblyIdentityAttributeByOrdinal() // is to call once with BufferSize = 0 or some reasonable fixed number to get the size of the // buffer required, allocate the buffer if the buffer passed in was too small and call again. // // The strings returned in the ASSEMBLY_IDENTITY_ATTRIBUTE are *not* // dynamically allocated, but are instead expected to fit in the buffer passed in. // BOOL WINAPI SxsGetAssemblyIdentityAttributeByOrdinal( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN ULONG AttributeOrdinal, // 0-based IN SIZE_T BufferSize, OUT PASSEMBLY_IDENTITY_ATTRIBUTE AssemblyIdentityAttributeBuffer, OUT SIZE_T *BytesWrittenOrRequired ); typedef BOOL (WINAPI * PSXS_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_BY_ORDINAL_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN ULONG AttributeOrdinal, // 0-based IN SIZE_T BufferSize, OUT PASSEMBLY_IDENTITY_ATTRIBUTE AssemblyIdentityAttributeBuffer, OUT SIZE_T *BytesWrittenOrRequired ); #define SXS_DUPLICATE_ASSEMBLY_IDENTITY_FLAG_FREEZE (0x00000001) #define SXS_DUPLICATE_ASSEMBLY_IDENTITY_FLAG_ALLOW_NULL (0x00000002) BOOL WINAPI SxsDuplicateAssemblyIdentity( IN DWORD Flags, IN PCASSEMBLY_IDENTITY Source, OUT PASSEMBLY_IDENTITY *Destination ); typedef BOOL (WINAPI * PSXS_DUPLICATE_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY Source, OUT PASSEMBLY_IDENTITY *Destination ); BOOL WINAPI SxsQueryInformationAssemblyIdentity( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, OUT PVOID AssemblyIdentityInformation, IN SIZE_T AssemblyIdentityInformationLength, IN ASSEMBLY_IDENTITY_INFORMATION_CLASS AssemblyIdentityInformationClass ); typedef BOOL (WINAPI * PSXS_QUERY_INFORMATION_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, OUT PVOID AssemblyIdentityInformation, IN SIZE_T AssemblyIdentityInformationLength, IN ASSEMBLY_IDENTITY_INFORMATION_CLASS AssemblyIdentityInformationClass ); #define SXS_ENUMERATE_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_MATCH_NAMESPACE (0x00000001) #define SXS_ENUMERATE_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_MATCH_NAME (0x00000002) #define SXS_ENUMERATE_ASSEMBLY_IDENTITY_ATTRIBUTES_FLAG_MATCH_VALUE (0x00000004) typedef VOID (WINAPI * PSXS_ASSEMBLY_IDENTITY_ATTRIBUTE_ENUMERATION_ROUTINE)( IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute, IN PVOID Context ); BOOL WINAPI SxsEnumerateAssemblyIdentityAttributes( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute OPTIONAL, IN PSXS_ASSEMBLY_IDENTITY_ATTRIBUTE_ENUMERATION_ROUTINE EnumerationRoutine, IN PVOID Context ); typedef BOOL (WINAPI * PSXS_ENUMERATE_ASSEMBLY_IDENTITY_ATTRIBUTES_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN PCASSEMBLY_IDENTITY_ATTRIBUTE Attribute OPTIONAL, IN PSXS_ASSEMBLY_IDENTITY_ATTRIBUTE_ENUMERATION_ROUTINE EnumerationRoutine, IN PVOID Context ); // // Assembly Identity encoding: // // Assembly identities may be encoded in various forms. The two usual ones // are either a binary stream, suitable for embedding in other data structures // or for persisting or a textual format that looks like: // // name;[ns1,]n1="v1";[ns2,]n2="v2"[;...] // #define SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_BINARY (1) #define SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_TEXTUAL (2) BOOL SxsComputeAssemblyIdentityEncodedSize( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN const GUID *EncodingGroup OPTIONAL, // use NULL to use any of the SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_* encodings IN ULONG EncodingFormat, OUT SIZE_T *SizeOut ); typedef BOOL (WINAPI * PSXS_COMPUTE_ASSEMBLY_IDENTITY_ENCODED_SIZE_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN const GUID *EncodingGroup OPTIONAL, // use NULL to use any of the SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_* encodings IN ULONG EncodingFormat, OUT SIZE_T *SizeOut ); BOOL WINAPI SxsEncodeAssemblyIdentity( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN const GUID *EncodingGroup OPTIONAL, // use NULL to use any of the SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_* encodings IN ULONG EncodingFormat, IN SIZE_T BufferSize, OUT PVOID Buffer, OUT SIZE_T *BytesWrittenOrRequired ); typedef BOOL (WINAPI * PSXS_ENCODE_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN PCASSEMBLY_IDENTITY AssemblyIdentity, IN const GUID *EncodingGroup OPTIONAL, // use NULL to use any of the SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_* encodings IN ULONG EncodingFormat, IN SIZE_T BufferSize, OUT PVOID Buffer, OUT SIZE_T *BytesWrittenOrRequired ); #define SXS_DECODE_ASSEMBLY_IDENTITY_FLAG_FREEZE (0x00000001) BOOL WINAPI SxsDecodeAssemblyIdentity( IN ULONG Flags, IN const GUID *EncodingGroup OPTIONAL, // use NULL to use any of the SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_* encodings IN ULONG EncodingFormat, IN SIZE_T BufferSize, IN const VOID *Buffer, OUT PASSEMBLY_IDENTITY *AssemblyIdentity ); typedef BOOL (WINAPI * PSXS_DECODE_ASSEMBLY_IDENTITY_ROUTINE)( IN DWORD Flags, IN const GUID *EncodingGroup OPTIONAL, // use NULL to use any of the SXS_ASSEMBLY_IDENTITY_ENCODING_DEFAULTGROUP_* encodings IN ULONG EncodingFormat, IN SIZE_T BufferSize, IN const VOID *Buffer, OUT PASSEMBLY_IDENTITY *AssemblyIdentity ); // // These are the definitions that SFC requires to interact with SXS. // #define SXS_PROTECT_RECURSIVE ( 0x00000001 ) #define SXS_PROTECT_SINGLE_LEVEL ( 0x00000000 ) #define SXS_PROTECT_FILTER_DEFAULT ( FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SECURITY ) typedef struct _SXS_PROTECT_DIRECTORY { WCHAR pwszDirectory[MAX_PATH]; PVOID pvCookie; ULONG ulRecursiveFlag; ULONG ulNotifyFilter; } SXS_PROTECT_DIRECTORY, *PSXS_PROTECT_DIRECTORY; typedef const SXS_PROTECT_DIRECTORY* PCSXS_PROTECT_DIRECTORY; typedef BOOL ( WINAPI * PSXS_PROTECT_NOTIFICATION )( PVOID pvCookie, PCWSTR wsChangeText, SIZE_T cchChangeText, DWORD dwChangeAction ); BOOL WINAPI SxsProtectionNotifyW( PVOID pvCookie, PCWSTR wsChangeText, SIZE_T cchChangeText, DWORD dwChangeAction ); typedef BOOL ( WINAPI * PSXS_PROTECT_RETRIEVELISTS )( PCSXS_PROTECT_DIRECTORY *prgpProtectListing, SIZE_T *pcProtectEntries ); BOOL WINAPI SxsProtectionGatherEntriesW( PCSXS_PROTECT_DIRECTORY *prgpProtectListing, SIZE_T *pcProtectEntries ); // // This is for both the Logon and the Logoff events // typedef BOOL ( WINAPI * PSXS_PROTECT_LOGIN_EVENT )(void); BOOL WINAPI SxsProtectionUserLogonEvent( void ); BOOL WINAPI SxsProtectionUserLogoffEvent( void ); typedef BOOL ( WINAPI * PSXS_PROTECT_SCAN_ONCE )( HWND, BOOL, BOOL ); BOOL WINAPI SxsProtectionPerformScanNow( HWND hwProgressWindow, BOOL bValidate, BOOL bUIAllowed ); #define PFN_NAME_PROTECTION_GATHER_LISTS_W ( "SxsProtectionGatherEntriesW" ) #define PFN_NAME_PROTECTION_NOTIFY_CHANGE_W ( "SxsProtectionNotifyW" ) #define PFN_NAME_PROTECTION_NOTIFY_LOGON ( "SxsProtectionUserLogonEvent" ) #define PFN_NAME_PROTECTION_NOTIFY_LOGOFF ( "SxsProtectionUserLogoffEvent" ) #define PFN_NAME_PROTECTION_SCAN_ONCE ( "SxsProtectionPerformScanNow" ) // // Settings API // // // These APIs are deliberately designed to look like a subset of the registry // APIs; their behavior should match the documented registry behavior in general; // the major missing functionality includes security, the win16 compatibility // APIs, loading and unloading of keys/hives and change notification. // // Settings are strictly local to the process; changes are not visible to other // processes until the settings are saved. // typedef struct _SXS_SETTINGS_KEY *PSXS_SETTINGS_KEY; typedef const struct _SXS_SETTINGS_KEY *PCSXS_SETTINGS_KEY; #define SXS_SETTINGS_USERSCOPE_INVALID (0) #define SXS_SETTINGS_USERSCOPE_PER_USER (1) #define SXS_SETTINGS_USERSCOPE_SYSTEM_WIDE (2) #define SXS_SETTINGS_APPSCOPE_INVALID (0) #define SXS_SETTINGS_APPSCOPE_PER_PROCESS_ROOT (1) #define SXS_SETTINGS_APPSCOPE_PER_CONTEXT_ROOT (2) #define SXS_SETTINGS_APPSCOPE_PER_COMPONENT (3) #define SXS_SETTINGS_ITEMTYPE_INVALID (0) #define SXS_SETTINGS_ITEMTYPE_KEY (1) #define SXS_SETTINGS_ITEMTYPE_VALUE (2) typedef VOID (WINAPI * PSXS_OPEN_SETTINGS_INITIALIZATION_CALLBACK)( IN PVOID pvContext, IN PSXS_SETTINGS_KEY lpUninitializedSettingsKey, OUT BOOL *pfFailed ); #define SXS_OPEN_SETTINGS_FLAG_RETURN_NULL_IF_NONE (0x00000001) typedef LONG (WINAPI * PSXS_OPEN_SETTINGS_W)( IN DWORD dwFlags, IN ULONG ulUserScope, IN ULONG ulAppScope, IN PCWSTR lpAssemblyName, IN PSXS_OPEN_SETTINGS_INITIALIZATION_CALLBACK lpInitializationCallback OPTIONAL, IN PVOID pvContext, OUT PSXS_SETTINGS_KEY *lpKey ); LONG WINAPI SxsOpenSettingsW( IN DWORD dwFlags, IN ULONG ulUserScope, IN ULONG ulAppScope, IN PCWSTR lpAssemblyName, IN PSXS_OPEN_SETTINGS_INITIALIZATION_CALLBACK lpInitializationCallback OPTIONAL, IN PVOID pvContext, OUT PSXS_SETTINGS_KEY *lpKey ); #define SXS_MERGE_SETTINGS_KEYDISPOSITION_INVALID (0) #define SXS_MERGE_SETTINGS_KEYDISPOSITION_COPY_ENTIRE_SUBTREE (1) #define SXS_MERGE_SETTINGS_KEYDISPOSITION_COPY_KEY_WALK_SUBTREE (2) typedef VOID (WINAPI * PSXS_MERGE_SETTINGS_KEY_CALLBACKW)( IN PVOID pvContext, IN PCWSTR lpKeyPath, OUT ULONG *lpKeyDisposition ); #define SXS_MERGE_SETTINGS_VALUEDISPOSITION_INVALID (0) #define SXS_MERGE_SETTINGS_VALUEDISPOSITION_COPY (1) #define SXS_MERGE_SETTINGS_VALUEDISPOSITION_DONT_COPY (2) typedef VOID (WINAPI * PSXS_MERGE_SETTINGS_VALUE_CALLBACKW)( IN PVOID pvContext, IN PCWSTR lpKeyPath, IN LPCWSTR lpValueName, IN OUT LPDWORD lpType, IN OUT LPBYTE *lplpData, // pointer to replacable data pointer. Allocate replacements using GlobalAlloc(GPTR, nBytes) IN DWORD dwDataBufferSize, // for modifying data you can write up to this many bytes OUT ULONG *lpValueDisposition ); typedef LONG (WINAPI * PSXS_MERGE_SETTINGS_W)( IN DWORD dwFlags, IN PCSXS_SETTINGS_KEY lpKeyToMergeFrom, IN PSXS_SETTINGS_KEY lpKeyToMergeInTo, IN PSXS_MERGE_SETTINGS_KEY_CALLBACKW lpKeyCallback, IN PSXS_MERGE_SETTINGS_VALUE_CALLBACKW lpValueCallback, LPVOID pvContext ); LONG WINAPI SxsMergeSettingsW( IN DWORD dwFlags, IN PCSXS_SETTINGS_KEY lpKeyToMergeFrom, IN PSXS_SETTINGS_KEY lpKeyToMergeInTo, IN PSXS_MERGE_SETTINGS_KEY_CALLBACKW lpKeyCallback, IN PSXS_MERGE_SETTINGS_VALUE_CALLBACKW lpValueCallback, LPVOID pvContext ); LONG WINAPI SxsCloseSettingsKey( PSXS_SETTINGS_KEY lpKey ); LONG WINAPI SxsCreateSettingsKeyExW( PSXS_SETTINGS_KEY lpKey, LPCWSTR lpSubKey, DWORD Reserved, LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PSXS_SETTINGS_KEY *lplpKeyResult, LPDWORD lpdwDisposition ); LONG WINAPI SxsDeleteSettingsKeyW( PSXS_SETTINGS_KEY lpKey, LPCWSTR lpSubKey ); LONG WINAPI SxsDeleteSettingsValueW( PSXS_SETTINGS_KEY lpKey, LPCWSTR lpValueName ); LONG WINAPI SxsEnumSettingsKeyW( IN PSXS_SETTINGS_KEY lpKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName ); LONG WINAPI SxsEnumSettingsKeyExW( IN PSXS_SETTINGS_KEY lpKey, IN DWORD dwIndex, OUT PWSTR lpName, IN OUT LPDWORD lpcName, IN OUT LPDWORD lpReserved, OUT PWSTR lpClass, OUT LPDWORD lpcClass, OUT PFILETIME lpftLastWriteTime ); LONG WINAPI SxsEnumSettingsValueW( IN PSXS_SETTINGS_KEY lpKey, IN DWORD dwIndex, OUT PWSTR lpValueName, IN OUT LPDWORD lpcValueName, IN OUT LPDWORD lpReserved, OUT LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData ); LONG WINAPI SxsFlushSettingsKey( IN PSXS_SETTINGS_KEY lpKey ); LONG WINAPI SxsOpenSettingsKeyEx( IN PSXS_SETTINGS_KEY lpKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PSXS_SETTINGS_KEY *lplpKeyResult ); LONG WINAPI SxsQuerySettingsInfoKeyW( IN PSXS_SETTINGS_KEY lpKey, OUT PWSTR lpClass, IN OUT LPDWORD lpcClass, IN OUT LPDWORD lpReserved, OUT LPDWORD lpcSubKeys, OUT LPDWORD lpcMaxSubKeyLen, OUT LPDWORD lpcMaxClassLen, OUT LPDWORD lpcValues, OUT LPDWORD lpcMaxValueNameLen, OUT LPDWORD lpcMaxValueLen, OUT LPDWORD lpcSecurityDescriptor, OUT PFILETIME lpftLastWriteTime ); LONG WINAPI SxsQuerySettingsMultipleValuesW( IN PSXS_SETTINGS_KEY lpKey, PVALENT val_list, DWORD num_vals, LPWSTR lpValueBuf, LPDWORD lpdwTotsize ); LONG WINAPI SxsQuerySettingsValueExW( IN PSXS_SETTINGS_KEY lpKey, IN LPCWSTR lpValueName, IN OUT LPDWORD lpReserved, OUT LPDWORD lpType, OUT LPBYTE lpData, IN OUT LPDWORD lpcbData ); LONG WINAPI SxsSetSettingsValueExW( IN PSXS_SETTINGS_KEY lpKey, LPCWSTR lpValueName, DWORD dwReserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData ); typedef struct _SXS_CLR_SURROGATE_INFORMATION { DWORD cbSize; DWORD dwFlags; GUID SurrogateIdent; PCWSTR pcwszSurrogateType; PCWSTR pcwszImplementingAssembly; PCWSTR pcwszRuntimeVersion; } SXS_CLR_SURROGATE_INFORMATION, *PSXS_CLR_SURROGATE_INFORMATION; typedef const SXS_CLR_SURROGATE_INFORMATION *PCSXS_CLR_SURROGATE_INFORMATION; typedef struct _SXS_CLR_CLASS_INFORMATION { DWORD dwSize; DWORD dwFlags; ULONG ulThreadingModel; ULONG ulType; GUID ReferenceClsid; PCWSTR pcwszProgId; PCWSTR pcwszImplementingAssembly; PCWSTR pcwszTypeName; PCWSTR pcwszRuntimeVersion; } SXS_CLR_CLASS_INFORMATION, *PSXS_CLR_CLASS_INFORMATION; typedef const SXS_CLR_CLASS_INFORMATION *PCSXS_CLR_CLASS_INFORMATION; #define SXS_FIND_CLR_SURROGATE_USE_ACTCTX (0x00000001) #define SXS_FIND_CLR_SURROGATE_GET_IDENTITY (0x00000002) #define SXS_FIND_CLR_SURROGATE_GET_RUNTIME_VERSION (0x00000004) #define SXS_FIND_CLR_SURROGATE_GET_TYPE_NAME (0x00000008) #define SXS_FIND_CLR_SURROGATE_GET_ALL (SXS_FIND_CLR_SURROGATE_GET_IDENTITY | SXS_FIND_CLR_SURROGATE_GET_RUNTIME_VERSION | SXS_FIND_CLR_SURROGATE_GET_TYPE_NAME) #define SXS_FIND_CLR_SURROGATE_INFO ("SxsFindClrSurrogateInformation") typedef BOOL (WINAPI* PFN_SXS_FIND_CLR_SURROGATE_INFO)( IN DWORD dwFlags, IN LPGUID lpGuidToFind, IN HANDLE hActivationContext, IN OUT PVOID pvDataBuffer, IN SIZE_T cbDataBuffer, IN OUT PSIZE_T pcbDataBufferWrittenOrRequired ); // The 'pvSearchData' parameter is really a progid to look up #define SXS_FIND_CLR_CLASS_SEARCH_PROGID (0x00000001) // The 'pvSearchData' is an LPGUID to look up #define SXS_FIND_CLR_CLASS_SEARCH_GUID (0x00000002) // Activate the given actctx before looking up information in it #define SXS_FIND_CLR_CLASS_ACTIVATE_ACTCTX (0x00000004) #define SXS_FIND_CLR_CLASS_GET_PROGID (0x00000008) #define SXS_FIND_CLR_CLASS_GET_IDENTITY (0x00000010) #define SXS_FIND_CLR_CLASS_GET_TYPE_NAME (0x00000020) #define SXS_FIND_CLR_CLASS_GET_RUNTIME_VERSION (0x00000040) #define SXS_FIND_CLR_CLASS_GET_ALL (SXS_FIND_CLR_CLASS_GET_PROGID | SXS_FIND_CLR_CLASS_GET_IDENTITY | SXS_FIND_CLR_CLASS_GET_TYPE_NAME | SXS_FIND_CLR_CLASS_GET_RUNTIME_VERSION) #define SXS_FIND_CLR_CLASS_INFO ("SxsFindClrClassInformation") typedef BOOL (WINAPI* PFN_SXS_FIND_CLR_CLASS_INFO)( IN DWORD dwFlags, IN PVOID pvSearchData, IN HANDLE hActivationContext, IN OUT PVOID pvDataBuffer, IN SIZE_T cbDataBuffer, OUT PSIZE_T pcbDataBufferWrittenOrRequired ); #define SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001) #define SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002) typedef struct _SXS_GUID_INFORMATION_CLR { DWORD cbSize; DWORD dwFlags; PCWSTR pcwszRuntimeVersion; PCWSTR pcwszTypeName; PCWSTR pcwszAssemblyIdentity; } SXS_GUID_INFORMATION_CLR, *PSXS_GUID_INFORMATION_CLR; typedef const SXS_GUID_INFORMATION_CLR *PCSXS_GUID_INFORMATION_CLR; #define SXS_LOOKUP_CLR_GUID_USE_ACTCTX (0x00000001) #define SXS_LOOKUP_CLR_GUID_FIND_SURROGATE (0x00010000) #define SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS (0x00020000) #define SXS_LOOKUP_CLR_GUID_FIND_ANY (SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS | SXS_LOOKUP_CLR_GUID_FIND_SURROGATE) #define SXS_LOOKUP_CLR_GUID ("SxsLookupClrGuid") typedef BOOL (WINAPI* PFN_SXS_LOOKUP_CLR_GUID)( IN DWORD dwFlags, IN LPGUID pClsid, IN HANDLE hActCtx, IN OUT PVOID pvOutputBuffer, IN SIZE_T cbOutputBuffer, OUT PSIZE_T pcbOutputBuffer ); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* _SXSAPI_ */