/*++

Copyright (c) 2000 Microsoft Corporation

Module Name:

    ism.h

Abstract:

    Base definitions for the Intermediate State Manager.

Author:

    Jim Schmidt (jimschm) 15-Nov-1999

Revision History:

    <alias> <date> <comments>

--*/

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

//
// Strings
//

#define S_DATATYPE                      TEXT("Data")
#define S_FILETYPE                      TEXT("File")
#define S_REGISTRYTYPE                  TEXT("Registry")

//
// Constants
//

//
// If either DBG or DEBUG defined, use debug mode
//

#if defined(DBG) && !defined(DEBUG)
#define DEBUG
#endif

#if defined(DEBUG) && !defined(DBG)
#define DBG
#endif

#ifdef DEBUG

#define TRACKING_DEF , PCSTR File, UINT Line
#define TRACKING_CALL ,__FILE__,__LINE__
#define TRACKING_INLINE_CALL ,File,Line

#else

#define TRACKING_DEF
#define TRACKING_CALL
#define TRACKING_INLINE_CALL

#endif

//
// callback constants
//

#define CALLBACK_ENUM_CONTINUE          0x00000000

#define CALLBACK_SKIP_LEAVES            0x00000001
#define CALLBACK_SKIP_NODES             0x00000002
#define CALLBACK_SKIP_TREE              0x00000004
#define CALLBACK_SKIP_REMAINING_TREE    CALLBACK_SKIP_TREE
#define CALLBACK_THIS_TREE_ONLY         0x00000008
#define CALLBACK_DONE_ENUMERATING       0x00000010
#define CALLBACK_ERROR                  0x80000000

#define ALL_PATTERN                     ((PMIG_SEGMENTS) 1)

//
// used by rollback and delayed operations mechanism
//
#define JRNOP_CREATE                    0x00000001
#define JRNOP_DELETE                    0x00000002
#define JRNOP_REPLACE                   0x00000003

#define ZEROED
#define CALLER_INITIALIZED

//
// component constants
//

#define MASTERGROUP_NONE                0
#define MASTERGROUP_SCRIPT              1
#define MASTERGROUP_FILES_AND_FOLDERS   2
#define MASTERGROUP_USER                3
#define MASTERGROUP_APP                 4
#define MASTERGROUP_SYSTEM              5
#define MASTERGROUP_ALL                 255

//
// IsmQueueEnumeration constants
//

#define QUEUE_MAKE_APPLY                0x0001
#define QUEUE_MAKE_PERSISTENT           0x0002
#define QUEUE_OVERWRITE_DEST            0x0004
#define QUEUE_DONT_OVERWRITE_DEST       0x0008
#define QUEUE_MAKE_NONCRITICAL          0x0010

//
// execute constants
//
#define MIG_EXECUTE_PREPROCESS          0x0001
#define MIG_EXECUTE_REFRESH             0x0002
#define MIG_EXECUTE_POSTPROCESS         0x0003

#define ISMMESSAGE_EXECUTE_PREPROCESS   0x0001
#define ISMMESSAGE_EXECUTE_REFRESH      0x0002
#define ISMMESSAGE_EXECUTE_POSTPROCESS  0x0003
#define ISMMESSAGE_EXECUTE_ROLLBACK     0x0004
#define ISMMESSAGE_APP_INFO             0x0005
#define ISMMESSAGE_APP_INFO_NOW         0x0006

//
// Macros
//

// None

//
// Types
//

//
// misc types
//

typedef enum {
    CONTENTTYPE_ANY = 0,
    CONTENTTYPE_MEMORY,
    CONTENTTYPE_FILE,
    CONTENTTYPE_DETAILS_ONLY
} MIG_CONTENTTYPE;


#define PLATFORM_CURRENT        0x00000000
#define PLATFORM_SOURCE         0x10000000
#define PLATFORM_DESTINATION    0x20000000
#define PLATFORM_MASK           0xF0000000
#define TYPE_MASK               0x0FFFFFFF

#define COMPONENTENUM_ALIASES                   0x00000001
#define COMPONENTENUM_ENABLED                   0x00000002
#define COMPONENTENUM_DISABLED                  0x00000004
#define COMPONENTENUM_PREFERRED_ONLY            0x00000008
#define COMPONENTENUM_NON_PREFERRED_ONLY        0x00000010

#define COMPONENTENUM_ALL_COMPONENTS            (COMPONENTENUM_ENABLED|COMPONENTENUM_DISABLED)
#define COMPONENTENUM_ALL_ALIASES               (COMPONENTENUM_ALIASES|COMPONENTENUM_ENABLED|COMPONENTENUM_DISABLED)

#define EXECUTETYPE_VIRTUALCOMPUTER_PARSING     0x00000001
#define EXECUTETYPE_VIRTUALCOMPUTER             0x00000002
#define EXECUTETYPE_EXECUTESOURCE_PARSING       0x00000003
#define EXECUTETYPE_EXECUTESOURCE               0x00000004
#define EXECUTETYPE_EXECUTEDESTINATION          0x00000005
#define EXECUTETYPE_DELAYEDOPERATIONS           0x00000006
#define EXECUTETYPE_DELAYEDOPERATIONSCLEANUP    0x00000007

#define TRANSPORTTYPE_LIGHT             0x00000001
#define TRANSPORTTYPE_FULL              0x00000002

#define MIG_DATA_TYPE           IsmGetObjectTypeId(S_DATATYPE)
#define MIG_REGISTRY_TYPE       IsmGetObjectTypeId(S_REGISTRYTYPE)
#define MIG_FILE_TYPE           IsmGetObjectTypeId(S_FILETYPE)

typedef enum {
    MIG_TRANSPORT_PHASE = 1,
    MIG_HIGHPRIORITYQUEUE_PHASE,
    MIG_HIGHPRIORITYESTIMATE_PHASE,
    MIG_HIGHPRIORITYGATHER_PHASE,
    MIG_GATHERQUEUE_PHASE,
    MIG_GATHERESTIMATE_PHASE,
    MIG_GATHER_PHASE,
    MIG_ANALYSIS_PHASE,
    MIG_APPLY_PHASE
} MIG_PROGRESSPHASE;

typedef enum {
    MIG_BEGIN_PHASE = 1,
    MIG_IN_PHASE,
    MIG_END_PHASE
} MIG_PROGRESSSTATE;

typedef struct {
    DWORD TotalObjects;
    DWORD PersistentObjects;
    DWORD ApplyObjects;
} MIG_OBJECTCOUNT, *PMIG_OBJECTCOUNT;

#ifndef PCVOID
typedef const void * PCVOID;
#endif

#ifndef PCBYTE
typedef const unsigned char * PCBYTE;
#endif

typedef unsigned long       MIG_ATTRIBUTEID;
typedef unsigned int        MIG_PROPERTYID;
typedef unsigned long       MIG_OBJECTTYPEID;
typedef unsigned long       MIG_OPERATIONID;
typedef signed int          MIG_OBJECTID;
typedef unsigned int        MIG_PROPERTYDATAID;
typedef unsigned int        MIG_DATAHANDLE;
typedef PCTSTR              MIG_OBJECTSTRINGHANDLE;
typedef unsigned int        MIG_PLATFORMTYPEID;
typedef LONG_PTR            MIG_TRANSPORTID;
typedef signed long         MIG_TRANSPORTSTORAGEID;
typedef unsigned long       MIG_TRANSPORTTYPE;
typedef unsigned long       MIG_TRANSPORTCAPABILITIES;
typedef signed short        MIG_PROGRESSSLICEID;
typedef unsigned int        MIG_EXECUTETYPEID;
typedef PCVOID              MIG_PARSEDPATTERN;

typedef MIG_TRANSPORTTYPE *PMIG_TRANSPORTTYPE;
typedef MIG_TRANSPORTCAPABILITIES *PMIG_TRANSPORTCAPABILITIES;

typedef enum {
    PHYSICAL_OBJECT = 1,
    ISM_OBJECT
} MIG_LOCATION_TYPE;

typedef enum {
    CR_FAILED = 1,
    CR_SOURCE_DOES_NOT_EXIST,
    CR_DESTINATION_EXISTS
} MIG_COMPARERESULT;

//
// object values
//

typedef struct {
    UINT DetailsSize;
    PCVOID DetailsData;
} MIG_DETAILS, *PMIG_DETAILS;

typedef struct {
    MIG_OBJECTTYPEID ObjectTypeId;

    BOOL ContentInFile;

    union {

        struct _TAG_FILECONTENT {
            PCTSTR ContentPath;
            LONGLONG ContentSize;
        } FileContent;

        struct _TAG_MEMORYCONTENT {
            PCBYTE ContentBytes;
            UINT ContentSize;
        } MemoryContent;
    };

    MIG_DETAILS Details;

    // internal members
    union {
        PVOID EtmHandle;
        PVOID TransHandle;
    };

    PVOID IsmHandle;

} MIG_CONTENT, *PMIG_CONTENT;

typedef MIG_CONTENT const * PCMIG_CONTENT;

typedef struct {
    PCTSTR Segment;
    BOOL IsPattern;
} MIG_SEGMENTS, *PMIG_SEGMENTS;

//
// transport module structs and function types
//

typedef struct {
    MIG_TRANSPORTID TransportId;
    MIG_TRANSPORTSTORAGEID SupportedStorageId;
    MIG_TRANSPORTTYPE TransportType;
    MIG_TRANSPORTCAPABILITIES Capabilities;
    PCTSTR FriendlyDescription;

    PVOID Handle;
} MIG_TRANSPORTENUM, *PMIG_TRANSPORTENUM;


//
// object enum
//

typedef struct {
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;

    PCTSTR NativeObjectName;
    PCTSTR ObjectNode;
    PCTSTR ObjectLeaf;

    UINT Level;
    UINT SubLevel;
    BOOL IsLeaf;
    BOOL IsNode;

    MIG_DETAILS Details;

    LONG_PTR EtmHandle;
    PVOID IsmHandle;
} MIG_TYPEOBJECTENUM, *PMIG_TYPEOBJECTENUM;

typedef struct {

    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;

    PCTSTR NativeObjectName;
    PCTSTR ObjectNode;
    PCTSTR ObjectLeaf;

    UINT Level;
    UINT SubLevel;
    BOOL IsLeaf;
    BOOL IsNode;

    MIG_DETAILS Details;
} MIG_OBJECTENUMDATA, *PMIG_OBJECTENUMDATA;

typedef const MIG_OBJECTENUMDATA * PCMIG_OBJECTENUMDATA;

typedef struct {
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;

    MIG_OBJECTID ObjectId;              // 0 == physical object

    PVOID Handle;       // used by enum routines
} MIG_OBJECT_ENUM, *PMIG_OBJECT_ENUM;

//
// properties
//

typedef enum {
    BLOBTYPE_STRING = 1,
    BLOBTYPE_BINARY = 2
} MIG_BLOBTYPE, *PMIG_BLOBTYPE;

typedef struct {
    MIG_BLOBTYPE Type;

    union {
        PCTSTR String;
        struct {
            PCBYTE BinaryData;
            UINT BinarySize;
        };
    };

} MIG_BLOB, *PMIG_BLOB;

typedef const MIG_BLOB * PCMIG_BLOB;

typedef struct {
    MIG_PROPERTYID PropertyId;
    MIG_PROPERTYDATAID PropertyDataId;
    BOOL Private;

    PVOID Handle;       // used by enum routines
} MIG_OBJECTPROPERTY_ENUM, *PMIG_OBJECTPROPERTY_ENUM;

typedef struct {
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;
    MIG_OBJECTID ObjectId;

    PVOID Handle;       // used by enum routines
} MIG_OBJECTWITHPROPERTY_ENUM, *PMIG_OBJECTWITHPROPERTY_ENUM;

//
// attributes
//

typedef struct {
    MIG_ATTRIBUTEID AttributeId;
    BOOL Private;

    PVOID Handle;       // used by enum routines
} MIG_OBJECTATTRIBUTE_ENUM, *PMIG_OBJECTATTRIBUTE_ENUM;

typedef struct {
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;
    MIG_OBJECTID ObjectId;

    PVOID Handle;       // used by enum routines
} MIG_OBJECTWITHATTRIBUTE_ENUM, *PMIG_OBJECTWITHATTRIBUTE_ENUM;

//
// operations
//

typedef struct {
    MIG_OPERATIONID OperationId;
    PCMIG_BLOB SourceData;              OPTIONAL
    PCMIG_BLOB DestinationData;         OPTIONAL
    BOOL Private;

    PVOID Handle;       // used by enum routines
} MIG_OBJECTOPERATION_ENUM, *PMIG_OBJECTOPERATION_ENUM;

typedef struct {
    MIG_OBJECTSTRINGHANDLE ObjectName;
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTID ObjectId;
    MIG_OPERATIONID OperationId;
    PCMIG_BLOB SourceData;              OPTIONAL
    PCMIG_BLOB DestinationData;         OPTIONAL

    PVOID Handle;       // used by enum routines
} MIG_OBJECTWITHOPERATION_ENUM, *PMIG_OBJECTWITHOPERATION_ENUM;

typedef struct {
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;
} MIG_OBJECT, *PMIG_OBJECT;

typedef const MIG_OBJECT * PCMIG_OBJECT;

typedef struct {
    MIG_OBJECT OriginalObject;
    MIG_OBJECT CurrentObject;
    BOOL FilterTreeChangesOnly;
    BOOL Deleted;
    BOOL Replaced;
} MIG_FILTERINPUT, *PMIG_FILTERINPUT;

typedef MIG_FILTERINPUT const * PCMIG_FILTERINPUT;

typedef struct {
    MIG_OBJECT NewObject;
    BOOL Deleted;
    BOOL Replaced;
} MIG_FILTEROUTPUT, *PMIG_FILTEROUTPUT;

//
// environment & message passing types
//

typedef enum {
    ENVENTRY_NONE = 0,
    ENVENTRY_STRING,
    ENVENTRY_MULTISZ,
    ENVENTRY_CALLBACK,
    ENVENTRY_BINARY
} ENVENTRY_TYPE, *PENVENTRY_TYPE;

typedef BOOL (WINAPI ENVENTRYCALLBACK)(PCTSTR,PTSTR,UINT,PUINT,PCTSTR);
typedef ENVENTRYCALLBACK *PENVENTRYCALLBACK;

typedef struct {
    ENVENTRY_TYPE Type;
    union {
        PCTSTR EnvString;
        PCTSTR MultiSz;
        struct {
            PCBYTE EnvBinaryData;
            UINT EnvBinaryDataSize;
        };
        PENVENTRYCALLBACK EnvCallback;
    };
} ENVENTRY_STRUCT, *PENVENTRY_STRUCT;

typedef struct {
    PCTSTR UserName;
    PCTSTR DomainName;
    PCTSTR AccountName;
    PCTSTR UserProfileRoot;
    PSID UserSid;
} MIG_USERDATA, *PMIG_USERDATA;

typedef struct {
    MIG_PROGRESSPHASE Phase;
    UINT SubPhase;
    MIG_OBJECTTYPEID ObjectTypeId;
    MIG_OBJECTSTRINGHANDLE ObjectName;
    PCTSTR Text;
} MIG_APPINFO, *PMIG_APPINFO;

//
// components
//

typedef struct {
    PCTSTR ComponentString;
    PCTSTR LocalizedAlias;
    UINT Instance;
    UINT GroupId;
    BOOL Preferred;
    BOOL UserSupplied;
    BOOL Enabled;
    UINT MasterGroup;

    BOOL SkipToNextComponent;       // set this to TRUE to cause enumeration to continue to next component
                                    // (instead of next alias of same component)

    PVOID Handle;
} MIG_COMPONENT_ENUM, *PMIG_COMPONENT_ENUM;

//
// Version
//

#define OSTYPE_WINDOWS9X        1
#define OSTYPE_WINDOWS9X_STR    TEXT("9X")
#define OSTYPE_WINDOWSNT        2
#define OSTYPE_WINDOWSNT_STR    TEXT("NT")

#define OSMAJOR_WIN95           1
#define OSMAJOR_WIN95_STR       TEXT("Windows 95")
#define OSMAJOR_WIN95OSR2       2
#define OSMAJOR_WIN95OSR2_STR   TEXT("Windows 95 - OSR2")
#define OSMAJOR_WIN98           3
#define OSMAJOR_WIN98_STR       TEXT("Windows 98")
#define OSMAJOR_WINME           4
#define OSMAJOR_WINME_STR       TEXT("Windows Millennium")
#define OSMAJOR_WINNT4          1
#define OSMAJOR_WINNT4_STR      TEXT("Windows NT4")
#define OSMAJOR_WINNT5          2
#define OSMAJOR_WINNT5_STR      TEXT("Windows 2000")

#define OSMINOR_GOLD            0
#define OSMINOR_GOLD_STR        TEXT("Gold")
#define OSMINOR_WIN95OSR21      1
#define OSMINOR_WIN95OSR21_STR  TEXT("1")
#define OSMINOR_WIN95OSR25      2
#define OSMINOR_WIN95OSR25_STR  TEXT("5")
#define OSMINOR_WIN98SE         1
#define OSMINOR_WIN98SE_STR     TEXT("Second Edition")
#define OSMINOR_WINNT51         1
#define OSMINOR_WINNT51_STR     TEXT("XP")

typedef struct {
    UINT OsType;
    PCTSTR OsTypeName;
    UINT OsMajorVersion;
    PCTSTR OsMajorVersionName;
    UINT OsMinorVersion;
    PCTSTR OsMinorVersionName;
    UINT OsBuildNumber;
} MIG_OSVERSIONINFO, *PMIG_OSVERSIONINFO;

#include "ismproc.h"

//
// Globals
//

// None

//
// Macro expansion list
//

// None

//
// Macro expansion definition
//

// None

//
// Public function declarations
//

//
// app layer
//

BOOL
WINAPI
IsmInitialize (
    IN      PCTSTR InfPath,
    IN      PMESSAGECALLBACK MessageCallback,   OPTIONAL
    IN      PMIG_LOGCALLBACK LogCallback
    );

BOOL
WINAPI
IsmSetPlatform (
    IN      MIG_PLATFORMTYPEID Platform
    );

BOOL
WINAPI
IsmRegisterProgressBarCallback (
    IN      PPROGRESSBARFN ProgressBarFn,
    IN      ULONG_PTR Arg
    );

BOOL
WINAPI
IsmStartEtmModules (
    VOID
    );

BOOL
WINAPI
IsmStartTransport (
    VOID
    );

BOOL
WINAPI
IsmEnumFirstTransport (
    OUT     PMIG_TRANSPORTENUM Enum,
    IN      MIG_TRANSPORTSTORAGEID DesiredType  OPTIONAL
    );

BOOL
WINAPI
IsmEnumNextTransport (
    IN OUT  PMIG_TRANSPORTENUM Enum
    );

VOID
WINAPI
IsmAbortTransportEnum (
    IN      PMIG_TRANSPORTENUM Enum
    );

MIG_TRANSPORTID
WINAPI
IsmSelectTransport (
    IN      MIG_TRANSPORTSTORAGEID DesiredStorageId,
    IN      MIG_TRANSPORTTYPE TransportType,
    IN      MIG_TRANSPORTCAPABILITIES RequiredCapabilities
    );

BOOL
WINAPI
IsmSetTransportStorage (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      MIG_TRANSPORTID TransportId,
    IN      MIG_TRANSPORTSTORAGEID StorageId,
    IN      MIG_TRANSPORTCAPABILITIES RequiredCapabilities,
    IN      PCTSTR StoragePath,
    OUT     PBOOL StoragePathIsValid,                       OPTIONAL
    OUT     PBOOL ImageExistsInStorage                      OPTIONAL
    );

BOOL
WINAPI
IsmPerformParsing (
    VOID
    );

BOOL
WINAPI
IsmExecute (
    IN      MIG_EXECUTETYPEID ExecuteType
    );

BOOL
WINAPI
IsmLoad (
    VOID
    );

BOOL
WINAPI
IsmResumeLoad (
    VOID
    );

BOOL
WINAPI
IsmSave (
    VOID
    );

BOOL
WINAPI
IsmResumeSave (
    VOID
    );

VOID
WINAPI
IsmTerminate (
    VOID
    );

//
// component apis
//

BOOL
WINAPI
IsmAddComponentAlias (
    IN      PCTSTR ComponentString,             OPTIONAL
    IN      UINT MasterGroup,
    IN      PCTSTR LocalizedAlias,
    IN      UINT ComponentGroupId,
    IN      BOOL UserSupplied
    );

BOOL
WINAPI
IsmSelectPreferredAlias (
    IN      PCTSTR ComponentString,
    IN      PCTSTR LocalizedAlias,          OPTIONAL
    IN      UINT ComponentGroupId           OPTIONAL
    );

BOOL
WINAPI
IsmSelectComponent (
    IN      PCTSTR ComponentOrAlias,
    IN      UINT ComponentGroupId,              OPTIONAL
    IN      BOOL Enable
    );

BOOL
WINAPI
IsmSelectMasterGroup (
    IN      UINT MasterGroup,
    IN      BOOL Enable
    );

BOOL
WINAPI
IsmEnumFirstComponent (
    OUT     PMIG_COMPONENT_ENUM EnumPtr,
    IN      DWORD ComponentEnumFlags,
    IN      UINT GroupIdFilter                  OPTIONAL
    );

BOOL
WINAPI
IsmEnumNextComponent (
    IN OUT  PMIG_COMPONENT_ENUM EnumPtr
    );


VOID
WINAPI
IsmAbortComponentEnum (
    IN      PMIG_COMPONENT_ENUM EnumPtr         ZEROED
    );

VOID
WINAPI
IsmRemoveAllUserSuppliedComponents (
    VOID
    );

BOOL
WINAPI
IsmIsComponentSelected (
    IN      PCTSTR ComponentOrAlias,
    IN      UINT ComponentGroupId               OPTIONAL
    );

//
// module support routines
//

PVOID
WINAPI
TrackedIsmGetMemory (
    IN      UINT Size
            TRACKING_DEF
    );
#define IsmGetMemory(s) TrackedIsmGetMemory(s TRACKING_CALL)

PCTSTR
WINAPI
TrackedIsmDuplicateString (
    IN      PCTSTR String
            TRACKING_DEF
    );
#define IsmDuplicateString(s) TrackedIsmDuplicateString(s TRACKING_CALL)

BOOL
WINAPI
IsmReleaseMemory (
    IN      PCVOID Memory
    );

MIG_PLATFORMTYPEID
WINAPI
IsmGetRealPlatform (
    VOID
    );

BOOL
WINAPI
IsmCreateUser (
    IN      PCTSTR UserName,
    IN      PCTSTR Domain
    );

MIG_OBJECTSTRINGHANDLE
TrackedIsmGetLongName (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName
            TRACKING_DEF
    );
#define IsmGetLongName(t,n) TrackedIsmGetLongName(t,n TRACKING_CALL)

//
// type module interface
//

MIG_OBJECTTYPEID
WINAPI
IsmRegisterObjectType (
    IN      PCTSTR ObjectTypeName,
    IN      BOOL CanBeRestored,
    IN      BOOL ReadOnly,
    IN      PTYPE_REGISTER TypeRegisterData
    );

MIG_OBJECTTYPEID
WINAPI
IsmGetFirstObjectTypeId (
    VOID
    );

MIG_OBJECTTYPEID
WINAPI
IsmGetNextObjectTypeId (
    IN      MIG_OBJECTTYPEID CurrentTypeId
    );

PCTSTR
WINAPI
IsmConvertObjectToMultiSz (
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      PMIG_CONTENT ObjectContent
    );

BOOL
WINAPI
IsmConvertMultiSzToObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      PCTSTR ObjectMultiSz,
    OUT     MIG_OBJECTSTRINGHANDLE *ObjectName,
    OUT     PMIG_CONTENT ObjectContent          OPTIONAL
    );

PCTSTR
WINAPI
TrackedIsmGetNativeObjectName (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName
            TRACKING_DEF
    );
#define IsmGetNativeObjectName(t,n) TrackedIsmGetNativeObjectName(t,n TRACKING_CALL)

BOOL
IsmRegisterPhysicalAcquireHook (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      PMIG_PHYSICALACQUIREHOOK HookCallback,
    IN      PMIG_PHYSICALACQUIREFREE FreeCallback,          OPTIONAL
    IN      ULONG_PTR CallbackArg,                          OPTIONAL
    IN      PCTSTR FunctionId                               OPTIONAL
    );

BOOL
IsmProhibitPhysicalEnum (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      PMIG_PHYSICALENUMCHECK EnumCheckCallback,       OPTIONAL
    IN      ULONG_PTR CallbackArg,                          OPTIONAL
    IN      PCTSTR FunctionId                               OPTIONAL
    );

BOOL
IsmAddToPhysicalEnum (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectBase,
    IN      PMIG_PHYSICALENUMADD EnumAddCallback,
    IN      ULONG_PTR CallbackArg                           OPTIONAL
    );

//
// environment & messaging
//

BOOL
WINAPI
IsmSetEnvironmentValue (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PENVENTRY_STRUCT VariableData   OPTIONAL
    );

BOOL
WINAPI
IsmSetEnvironmentString (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PCTSTR VariableValue
    );

BOOL
WINAPI
IsmSetEnvironmentMultiSz (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PCTSTR VariableValue
    );

BOOL
WINAPI
IsmAppendEnvironmentString (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PCTSTR VariableValue
    );

BOOL
WINAPI
IsmAppendEnvironmentMultiSz (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PCTSTR VariableValue
    );

BOOL
WINAPI
IsmSetEnvironmentCallback (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PENVENTRYCALLBACK VariableCallback
    );

BOOL
WINAPI
IsmSetEnvironmentData (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName,
    IN      PCBYTE VariableData,
    IN      UINT VariableDataSize
    );

BOOL
WINAPI
IsmSetEnvironmentFlag (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                   OPTIONAL
    IN      PCTSTR VariableName
    );

BOOL
WINAPI
IsmGetEnvironmentValue (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR VariableName,
    OUT     PBYTE Data,                 OPTIONAL
    IN      UINT DataSize,
    OUT     PUINT DataSizeNeeded,       OPTIONAL
    OUT     PENVENTRY_TYPE DataType     OPTIONAL
    );

BOOL
WINAPI
IsmGetEnvironmentString (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR VariableName,
    OUT     PTSTR VariableValue,        OPTIONAL
    IN      UINT DataSize,
    OUT     PUINT DataSizeNeeded        OPTIONAL
    );

#define IsmCopyEnvironmentString(p,g,n,v) IsmGetEnvironmentString(p,g,n,v,sizeof(v)/sizeof((v)[0]),NULL)

BOOL
WINAPI
IsmGetEnvironmentMultiSz (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR VariableName,
    OUT     PTSTR VariableValue,        OPTIONAL
    IN      UINT DataSize,
    OUT     PUINT DataSizeNeeded        OPTIONAL
    );

BOOL
WINAPI
IsmGetEnvironmentCallback (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,                           OPTIONAL
    IN      PCTSTR VariableName,
    OUT     PENVENTRYCALLBACK *VariableCallback     OPTIONAL
    );

BOOL
WINAPI
IsmGetEnvironmentData (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR VariableName,
    OUT     PBYTE VariableData,         OPTIONAL
    IN      UINT DataSize,
    OUT     PUINT DataSizeNeeded        OPTIONAL
    );

BOOL
WINAPI
IsmIsEnvironmentFlagSet (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR VariableName
    );

BOOL
WINAPI
IsmDeleteEnvironmentVariable (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR VariableName
    );

PCTSTR
WINAPI
TrackedIsmExpandEnvironmentString (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Group,               OPTIONAL
    IN      PCTSTR SrcString,
    IN      PCTSTR Context
            TRACKING_DEF
    );
#define IsmExpandEnvironmentString(p,g,s,c) TrackedIsmExpandEnvironmentString(p,g,s,c TRACKING_CALL)

BOOL
WINAPI
IsmGetTransportVariable (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Section,
    IN      PCTSTR Key,
    OUT     PTSTR KeyData,              OPTIONAL
    IN      UINT KeyDataBufferSizeInBytes
    );

BOOL
WINAPI
IsmSetTransportVariable (
    IN      MIG_PLATFORMTYPEID Platform,
    IN      PCTSTR Section,
    IN      PCTSTR Key,
    IN      PCTSTR KeyData
    );

ULONG_PTR
WINAPI
IsmSendMessageToApp (
    UINT Message,
    ULONG_PTR Arg
    );

MIG_PROGRESSSLICEID
WINAPI
IsmRegisterProgressSlice (
    IN      UINT Ticks,
    IN      UINT TimeEstimateInSeconds
    );

BOOL
WINAPI
IsmTickProgressBar (
    IN      MIG_PROGRESSSLICEID SliceId,
    IN      UINT TickDelta                  OPTIONAL
    );

#define IsmCheckCancel()    (IsmTickProgressBar(0,0)==FALSE)

BOOL
WINAPI
IsmCurrentlyExecuting (
    VOID
    );

VOID
WINAPI
IsmSetCancel (
    VOID
    );

//
// encoded strings support
//

MIG_OBJECTSTRINGHANDLE
WINAPI
TrackedIsmCreateObjectHandle (
    IN      PCTSTR Node,
    IN      PCTSTR Leaf
            TRACKING_DEF
    );
#define IsmCreateObjectHandle(n,l) TrackedIsmCreateObjectHandle(n,l TRACKING_CALL)

BOOL
WINAPI
TrackedIsmCreateObjectStringsFromHandleEx (
    IN      MIG_OBJECTSTRINGHANDLE Handle,
    OUT     PCTSTR *Node,               OPTIONAL
    OUT     PCTSTR *Leaf,               OPTIONAL
    IN      BOOL DoNotDecode
            TRACKING_DEF
    );

#define IsmCreateObjectStringsFromHandleEx(h,n,l,d) TrackedIsmCreateObjectStringsFromHandleEx(h,n,l,d TRACKING_CALL)
#define IsmCreateObjectStringsFromHandle(handle,node,leaf)  IsmCreateObjectStringsFromHandleEx(handle,node,leaf,FALSE)

BOOL
WINAPI
IsmIsObjectHandleNodeOnly (
    IN      MIG_OBJECTSTRINGHANDLE Handle
    );

BOOL
WINAPI
IsmIsObjectHandleLeafOnly (
    IN      MIG_OBJECTSTRINGHANDLE Handle
    );


VOID
WINAPI
IsmDestroyObjectString (
    IN      PCTSTR String
    );

VOID
WINAPI
IsmDestroyObjectHandle (
    IN      MIG_OBJECTSTRINGHANDLE Handle
    );

MIG_OBJECTSTRINGHANDLE
WINAPI
TrackedIsmCreateObjectPattern (
    IN      PMIG_SEGMENTS NodeSegments,     OPTIONAL
    IN      UINT NodeSegmentsNr,
    IN      PMIG_SEGMENTS LeafSegments,     OPTIONAL
    IN      UINT LeafSegmentsNr
            TRACKING_DEF
    );

#define IsmCreateObjectPattern(node,ncnt,leaf,lcnt) TrackedIsmCreateObjectPattern(node,ncnt,leaf,lcnt TRACKING_CALL)

MIG_OBJECTSTRINGHANDLE
WINAPI
TrackedIsmCreateSimpleObjectPattern (
    IN      PCTSTR BaseNode,                    OPTIONAL
    IN      BOOL EnumTree,
    IN      PCTSTR Leaf,                        OPTIONAL
    IN      BOOL LeafIsPattern
            TRACKING_DEF
    );

#define IsmCreateSimpleObjectPattern(base,tree,leaf,pat) TrackedIsmCreateSimpleObjectPattern(base,tree,leaf,pat TRACKING_CALL)

MIG_PARSEDPATTERN
IsmCreateParsedPattern (
    IN      MIG_OBJECTSTRINGHANDLE EncodedObject
    );

VOID
IsmDestroyParsedPattern (
    IN      MIG_PARSEDPATTERN ParsedPattern
    );

BOOL
WINAPI
IsmParsedPatternMatchEx (
    IN      MIG_PARSEDPATTERN ParsedPattern,
    IN      MIG_OBJECTTYPEID ObjectTypeId,      OPTIONAL
    IN      PCTSTR Node,                        OPTIONAL
    IN      PCTSTR Leaf                         OPTIONAL
    );

BOOL
WINAPI
IsmParsedPatternMatch (
    IN      MIG_PARSEDPATTERN ParsedPattern,
    IN      MIG_OBJECTTYPEID ObjectTypeId,      OPTIONAL
    IN      MIG_OBJECTSTRINGHANDLE ObjectName
    );

//
// objects
//

MIG_OBJECTID
WINAPI
IsmGetObjectIdFromName (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      BOOL MustExist
    );

VOID
WINAPI
IsmLockObjectId (
    IN      MIG_OBJECTID ObjectId
    );

VOID
WINAPI
IsmLockObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

MIG_OBJECTSTRINGHANDLE
WINAPI
IsmFilterObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    OUT     MIG_OBJECTTYPEID *NewObjectTypeId,          OPTIONAL
    OUT     PBOOL ObjectDeleted,                        OPTIONAL
    OUT     PBOOL ObjectReplaced                        OPTIONAL
    );

BOOL
WINAPI
IsmEnumFirstSourceObjectEx (
    OUT     PMIG_OBJECT_ENUM ObjectEnum,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      BOOL EnumerateVirtualObjects
    );
#define IsmEnumFirstSourceObject(e,t,p) IsmEnumFirstSourceObjectEx(e,t,p,FALSE)

BOOL
WINAPI
IsmEnumFirstDestinationObjectEx (
    OUT     PMIG_OBJECT_ENUM ObjectEnum,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      BOOL EnumerateVirtualObjects
    );
#define IsmEnumFirstDestinationObject(e,t,p) IsmEnumFirstDestinationObjectEx(e,t,p,FALSE)

BOOL
WINAPI
IsmEnumNextObject (
    IN OUT  PMIG_OBJECT_ENUM ObjectEnum
    );

VOID
WINAPI
IsmAbortObjectEnum (
    IN      PMIG_OBJECT_ENUM ObjectEnum
    );

//
// persistence, apply, AbandonOnCollision, and NonCritical flags
//

BOOL
WINAPI
IsmMakePersistentObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmMakePersistentObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmClearPersistenceOnObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmClearPersistenceOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmIsPersistentObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmIsPersistentObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmEnumFirstPersistentObject (
    OUT     PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

BOOL
WINAPI
IsmEnumNextPersistentObject (
    IN OUT  PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortPersistentObjectEnum (
    IN      PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

BOOL
WINAPI
IsmMakeApplyObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmMakeApplyObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmClearApplyOnObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmClearApplyOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmIsApplyObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmIsApplyObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmEnumFirstApplyObject (
    OUT     PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

BOOL
WINAPI
IsmEnumNextApplyObject (
    IN OUT  PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortApplyObjectEnum (
    IN      PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

BOOL
WINAPI
IsmAbandonObjectIdOnCollision (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmAbandonObjectOnCollision (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmClearAbandonObjectIdOnCollision (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmClearAbandonObjectOnCollision (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmIsObjectIdAbandonedOnCollision (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmIsObjectAbandonedOnCollision (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmMakeNonCriticalObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmMakeNonCriticalObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmClearNonCriticalFlagOnObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmClearNonCriticalFlagOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmIsNonCriticalObjectId (
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmIsNonCriticalObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );



//
// attributes
//

MIG_ATTRIBUTEID
WINAPI
IsmRegisterAttribute (
    IN      PCTSTR AttributeName,
    IN      BOOL Private
    );

BOOL
WINAPI
IsmGetAttributeName (
    IN      MIG_ATTRIBUTEID AttributeId,
    OUT     PTSTR AttributeName,            OPTIONAL
    IN      UINT AttributeNameBufChars,
    OUT     PBOOL Private,                  OPTIONAL
    OUT     PBOOL BelongsToMe,              OPTIONAL
    OUT     PUINT ObjectReferences          OPTIONAL
    );

MIG_ATTRIBUTEID
WINAPI
IsmGetAttributeGroup (
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmSetAttributeOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmSetAttributeOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_ATTRIBUTEID AttributeId
    );

VOID
WINAPI
IsmLockAttribute (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmClearAttributeOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmClearAttributeOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmIsAttributeSetOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmIsAttributeSetOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmEnumFirstObjectAttributeById (
    OUT     PMIG_OBJECTATTRIBUTE_ENUM EnumPtr,
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmEnumFirstObjectAttribute (
    OUT     PMIG_OBJECTATTRIBUTE_ENUM EnumPtr,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmEnumNextObjectAttribute (
    IN OUT  PMIG_OBJECTATTRIBUTE_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortObjectAttributeEnum (
    IN OUT  PMIG_OBJECTATTRIBUTE_ENUM EnumPtr
    );

BOOL
WINAPI
IsmEnumFirstObjectWithAttribute (
    OUT     PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr,
    IN      MIG_ATTRIBUTEID AttributeId
    );

BOOL
WINAPI
IsmEnumNextObjectWithAttribute (
    IN OUT  PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortObjectWithAttributeEnum (
    IN OUT  PMIG_OBJECTWITHATTRIBUTE_ENUM EnumPtr
    );


//
// properties
//

MIG_PROPERTYID
WINAPI
IsmRegisterProperty (
    IN      PCTSTR PropertyName,
    IN      BOOL Private
    );

BOOL
WINAPI
IsmGetPropertyName (
    IN      MIG_PROPERTYID PropertyId,
    OUT     PTSTR PropertyName,             OPTIONAL
    IN      UINT PropertyNameBufChars,
    OUT     PBOOL Private,                  OPTIONAL
    OUT     PBOOL BelongsToMe,              OPTIONAL
    OUT     PUINT ObjectReferences          OPTIONAL
    );

MIG_PROPERTYID
WINAPI
IsmGetPropertyGroup (
    IN      MIG_PROPERTYID PropertyId
    );

MIG_PROPERTYDATAID
WINAPI
IsmAddPropertyToObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID PropertyId,
    IN      PCMIG_BLOB Property
    );

MIG_PROPERTYDATAID
WINAPI
IsmAddPropertyToObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_PROPERTYID PropertyId,
    IN      PCMIG_BLOB Property
    );

MIG_PROPERTYDATAID
WINAPI
IsmRegisterPropertyData (
    IN      PCMIG_BLOB Property
    );

BOOL
WINAPI
IsmAddPropertyDataToObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID PropertyId,
    IN      MIG_PROPERTYDATAID PropertyDataId
    );

BOOL
WINAPI
IsmAddPropertyDataToObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_PROPERTYID PropertyId,
    IN      MIG_PROPERTYDATAID PropertyDataId
    );

VOID
WINAPI
IsmLockProperty (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID PropertyId
    );

BOOL
WINAPI
IsmGetPropertyData (
    IN      MIG_PROPERTYDATAID PropertyDataId,
    OUT     PBYTE Buffer,                               OPTIONAL
    IN      UINT BufferSize,
    OUT     PUINT PropertyDataSize,                     OPTIONAL
    OUT     PMIG_BLOBTYPE PropertyDataType              OPTIONAL
    );

BOOL
WINAPI
IsmRemovePropertyData (
    IN      MIG_PROPERTYDATAID PropertyDataId
    );

BOOL
WINAPI
IsmRemovePropertyFromObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_PROPERTYDATAID PropertyId
    );

BOOL
WINAPI
IsmRemovePropertyFromObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID PropertyId
    );

BOOL
WINAPI
IsmIsPropertySetOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName,
    IN      MIG_PROPERTYID PropertyId
    );

BOOL
WINAPI
IsmIsPropertySetOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID PropertyId
    );

BOOL
WINAPI
IsmEnumFirstObjectProperty (
    OUT     PMIG_OBJECTPROPERTY_ENUM EnumPtr,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_PROPERTYID FilterProperty           OPTIONAL
    );

BOOL
WINAPI
IsmEnumFirstObjectPropertyById (
    OUT     PMIG_OBJECTPROPERTY_ENUM EnumPtr,
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID FilterProperty           OPTIONAL
    );

BOOL
WINAPI
IsmEnumNextObjectProperty (
    IN OUT  PMIG_OBJECTPROPERTY_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortObjectPropertyEnum (
    IN OUT  PMIG_OBJECTPROPERTY_ENUM EnumPtr
    );

MIG_PROPERTYDATAID
WINAPI
IsmGetPropertyFromObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_PROPERTYID ObjectProperty
    );

MIG_PROPERTYDATAID
WINAPI
IsmGetPropertyFromObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_PROPERTYID ObjectProperty
    );

BOOL
WINAPI
IsmEnumFirstObjectWithProperty (
    OUT     PMIG_OBJECTWITHPROPERTY_ENUM EnumPtr,
    IN      MIG_PROPERTYID PropertyId
    );

BOOL
WINAPI
IsmEnumNextObjectWithProperty (
    IN OUT  PMIG_OBJECTWITHPROPERTY_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortObjectWithPropertyEnum (
    IN OUT  PMIG_OBJECTWITHPROPERTY_ENUM EnumPtr
    );


//
// operations
//

MIG_OPERATIONID
WINAPI
IsmRegisterOperation (
    IN      PCTSTR Name,
    IN      BOOL Private
    );

BOOL
WINAPI
IsmGetOperationName (
    IN      MIG_OPERATIONID OperationId,
    OUT     PTSTR OperationName,            OPTIONAL
    IN      UINT OperationNameBufChars,
    OUT     PBOOL Private,                  OPTIONAL
    OUT     PBOOL BelongsToMe,              OPTIONAL
    OUT     PUINT ObjectReferences          OPTIONAL
    );

MIG_OPERATIONID
WINAPI
IsmGetOperationGroup (
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmSetOperationOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_OPERATIONID OperationId,
    IN      PCMIG_BLOB SourceData,          OPTIONAL
    IN      PCMIG_BLOB DestinationData      OPTIONAL
    );

BOOL
WINAPI
IsmSetOperationOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_OPERATIONID OperationId,
    IN      PCMIG_BLOB SourceData,          OPTIONAL
    IN      PCMIG_BLOB DestinationData      OPTIONAL
    );

MIG_DATAHANDLE
WINAPI
IsmRegisterOperationData (
    IN      PCMIG_BLOB Data
    );

BOOL
WINAPI
IsmSetOperationOnObjectId2 (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_OPERATIONID OperationId,
    IN      MIG_DATAHANDLE SourceData,      OPTIONAL
    IN      MIG_DATAHANDLE DestinationData  OPTIONAL
    );

BOOL
WINAPI
IsmSetOperationOnObject2 (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_OPERATIONID OperationId,
    IN      MIG_DATAHANDLE SourceData,      OPTIONAL
    IN      MIG_DATAHANDLE DestinationData  OPTIONAL
    );

VOID
WINAPI
IsmLockOperation (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmClearOperationOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmClearOperationOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmIsOperationSetOnObjectId (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmIsOperationSetOnObject (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmGetObjectOperationDataById (
    IN      MIG_OBJECTID ObjectId,
    IN      MIG_OPERATIONID OperationId,
    OUT     PBYTE Buffer,                   OPTIONAL
    IN      UINT BufferSize,
    OUT     PUINT BufferSizeNeeded,         OPTIONAL
    OUT     PMIG_BLOBTYPE Type,             OPTIONAL
    IN      BOOL DestinationData
    );

BOOL
WINAPI
IsmGetObjectOperationData (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      MIG_OPERATIONID OperationId,
    OUT     PBYTE Buffer,                   OPTIONAL
    IN      UINT BufferSize,
    OUT     PUINT BufferSizeNeeded,         OPTIONAL
    OUT     PMIG_BLOBTYPE Type,             OPTIONAL
    IN      BOOL DestinationData
    );


BOOL
WINAPI
IsmEnumFirstObjectOperationById (
    OUT     PMIG_OBJECTOPERATION_ENUM EnumPtr,
    IN      MIG_OBJECTID ObjectId
    );

BOOL
WINAPI
IsmEnumFirstObjectOperation (
    OUT     PMIG_OBJECTOPERATION_ENUM EnumPtr,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName
    );

BOOL
WINAPI
IsmEnumNextObjectOperation (
    IN OUT  PMIG_OBJECTOPERATION_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortObjectOperationEnum (
    IN OUT  PMIG_OBJECTOPERATION_ENUM EnumPtr
    );

BOOL
WINAPI
IsmEnumFirstObjectWithOperation (
    OUT     PMIG_OBJECTWITHOPERATION_ENUM EnumPtr,
    IN      MIG_OPERATIONID OperationId
    );

BOOL
WINAPI
IsmEnumNextObjectWithOperation (
    IN OUT  PMIG_OBJECTWITHOPERATION_ENUM EnumPtr
    );

VOID
WINAPI
IsmAbortObjectWithOperationEnum (
    IN OUT  PMIG_OBJECTWITHOPERATION_ENUM EnumPtr
    );

BOOL
WINAPI
IsmRegisterOperationFilterCallback (
    IN      MIG_OPERATIONID OperationId,
    IN      POPMFILTERCALLBACK Callback,
    IN      BOOL TreeFilter,
    IN      BOOL HighPriority,
    IN      BOOL CanHandleNoRestore
    );

BOOL
WINAPI
IsmRegisterGlobalFilterCallback (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      PCTSTR FunctionId,
    IN      POPMFILTERCALLBACK Callback,
    IN      BOOL TreeFilter,
    IN      BOOL CanHandleNoRestore
    );

BOOL
WINAPI
IsmRegisterOperationApplyCallback (
    IN      MIG_OPERATIONID OperationId,
    IN      POPMAPPLYCALLBACK Callback,
    IN      BOOL HighPriority
    );

BOOL
WINAPI
IsmRegisterGlobalApplyCallback (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      PCTSTR FunctionId,
    IN      POPMAPPLYCALLBACK Callback
    );

//
// enumeration and object types
//

BOOL
WINAPI
IsmQueueEnumeration (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      PMIG_OBJECTENUMCALLBACK Callback,       OPTIONAL
    IN      ULONG_PTR CallbackArg,                  OPTIONAL
    IN      PCTSTR FunctionId                       OPTIONAL
    );

BOOL
WINAPI
IsmHookEnumeration (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      PMIG_OBJECTENUMCALLBACK Callback,
    IN      ULONG_PTR CallbackArg,                  OPTIONAL
    IN      PCTSTR FunctionId                       OPTIONAL
    );

BOOL
WINAPI
IsmRegisterStaticExclusion (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

BOOL
WINAPI
IsmRegisterDynamicExclusion (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectPattern,
    IN      PMIG_DYNAMICEXCLUSIONCALLBACK Callback,
    IN      ULONG_PTR CallbackArg,                  OPTIONAL
    IN      PCTSTR FunctionId                       OPTIONAL
    );

BOOL
WINAPI
IsmRegisterPreEnumerationCallback (
    IN      PMIG_PREENUMCALLBACK Callback,
    IN      PCTSTR FunctionId                       OPTIONAL
    );

BOOL
WINAPI
IsmRegisterTypePreEnumerationCallback (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      PMIG_PREENUMCALLBACK Callback,
    IN      PCTSTR FunctionId                       OPTIONAL
    );

BOOL
WINAPI
IsmRegisterPostEnumerationCallback (
    IN      PMIG_POSTENUMCALLBACK Callback,
    IN      PCTSTR FunctionId                       OPTIONAL
    );

BOOL
WINAPI
IsmRegisterTypePostEnumerationCallback (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      PMIG_POSTENUMCALLBACK Callback,
    IN      PCTSTR FunctionId                       OPTIONAL
    );

MIG_OBJECTTYPEID
WINAPI
IsmGetObjectTypeId (
    IN      PCTSTR ObjectTypeName
    );

PCTSTR
WINAPI
IsmGetObjectTypeName (
    IN      MIG_OBJECTTYPEID TypeId
    );

VOID
WINAPI
IsmExecuteHooks (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE EncodedObjectName
    );

//
// transport interface
//

BOOL
IsmDoesObjectExist (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName
    );

BOOL
WINAPI
IsmAcquireObjectEx (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    OUT     PMIG_CONTENT ObjectContent,
    IN      MIG_CONTENTTYPE ContentType,
    IN      UINT MemoryContentLimit
    );

#define IsmAcquireObject(type,name,content)   IsmAcquireObjectEx(type,name,content,CONTENTTYPE_ANY,0)

BOOL
WINAPI
IsmReleaseObject (
    IN OUT  PMIG_CONTENT ObjectContent
    );

PMIG_CONTENT
IsmConvertObjectContentToUnicode (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      PMIG_CONTENT ObjectContent
    );

PMIG_CONTENT
IsmConvertObjectContentToAnsi (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      PMIG_CONTENT ObjectContent
    );

BOOL
IsmFreeConvertedObjectContent (
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      PMIG_CONTENT ObjectContent
    );

BOOL
WINAPI
IsmRegisterRestoreCallback (
    IN      PMIG_RESTORECALLBACK RestoreCallback
    );

MIG_TRANSPORTSTORAGEID
WINAPI
IsmRegisterTransport (
    IN      PCTSTR TypeString
    );

BOOL
WINAPI
IsmGetMappedUserData (
    OUT     PMIG_USERDATA UserData
    );

BOOL
WINAPI
IsmAddControlFile (
    IN      PCTSTR ObjectName,
    IN      PCTSTR NativePath
    );

BOOL
WINAPI
IsmGetControlFile (
    MIG_OBJECTTYPEID ObjectTypeId,
    IN      PCTSTR ObjectName,
    IN      PTSTR Buffer
    );

BOOL
WINAPI
IsmSetRollbackJournalType (
    IN      BOOL Common
    );

BOOL
WINAPI
IsmCanWriteRollbackJournal (
    VOID
    );

BOOL
IsmDoesRollbackDataExist (
    OUT     PCTSTR *UserName,
    OUT     PCTSTR *UserDomain,
    OUT     PCTSTR *UserStringSid,
    OUT     PCTSTR *UserProfilePath,
    OUT     BOOL *UserProfileCreated
    );

VOID
WINAPI
IsmRecordOperation (
    IN      DWORD OperationType,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName
    );

BOOL
WINAPI
IsmRollback (
    VOID
    );

BOOL
IsmPreserveJournal (
    IN      BOOL Preserve
    );

BOOL
WINAPI
IsmSetDelayedOperationsCommand (
    IN      PCTSTR DelayedOperationsCommand
    );

VOID
IsmRecordDelayedOperation (
    IN      DWORD OperationType,
    IN      MIG_OBJECTTYPEID ObjectTypeId,
    IN      MIG_OBJECTSTRINGHANDLE ObjectName,
    IN      PMIG_CONTENT ObjectContent
    );

PMIG_OBJECTCOUNT
IsmGetObjectsStatistics (
    IN      MIG_OBJECTTYPEID ObjectTypeId   OPTIONAL
    );

BOOL
IsmGetOsVersionInfo (
    IN      MIG_PLATFORMTYPEID Platform,
    OUT     PMIG_OSVERSIONINFO VersionInfo
    );

BOOL
IsmGetTempStorage (
    OUT     PTSTR Path,
    IN      UINT PathTchars
    );

BOOL
IsmGetTempDirectory (
    OUT     PTSTR Path,
    IN      UINT PathTchars
    );

BOOL
IsmGetTempFile (
    OUT     PTSTR Path,
    IN      UINT PathTchars
    );

BOOL
IsmExecuteFunction (
    IN      UINT ExecutionPhase,
    IN      PCTSTR FunctionMultiSz
    );

BOOL
IsmReplacePhysicalObject (
    IN    MIG_OBJECTTYPEID ObjectTypeId,
    IN    MIG_OBJECTSTRINGHANDLE ObjectName,
    IN    PMIG_CONTENT ObjectContent
    );

BOOL
IsmRemovePhysicalObject (
    IN    MIG_OBJECTTYPEID ObjectTypeId,
    IN    MIG_OBJECTSTRINGHANDLE ObjectName
    );

PCTSTR
IsmGetCurrentSidString (
    VOID
    );

//
// ANSI/UNICODE macros
//

// None


#ifdef __cplusplus
}
#endif