/*++

Copyright (c) 2000 Microsoft Corporation

Module Name:

    ismproc.h

Abstract:

    Callback function prototype definitions for the Intermediate State Manager.

Author:

    Jim Schmidt (jimschm) 15-Nov-1999

Revision History:

    <alias> <date> <comments>

--*/

#pragma once

//
// Types
//

//
// misc types
//

#define ISM_VERSION         0x10000

typedef VOID (WINAPI MIG_LOGCALLBACK)(PVOID Arg);
typedef MIG_LOGCALLBACK * PMIG_LOGCALLBACK;

typedef VOID(PROGRESSBARFN)(
                MIG_PROGRESSPHASE Phase,
                MIG_PROGRESSSTATE State,
                UINT WorkDone,
                UINT TotalWork,
                ULONG_PTR Arg
                );

typedef PROGRESSBARFN * PPROGRESSBARFN;

//
// transport
//

typedef BOOL(WINAPI TRANSPORTINITIALIZE)(PMIG_LOGCALLBACK LogCallback);
typedef TRANSPORTINITIALIZE *PTRANSPORTINITIALIZE;

typedef VOID(WINAPI TRANSPORTESTIMATEPROGRESSBAR)(MIG_PLATFORMTYPEID PlatformTypeId);
typedef TRANSPORTESTIMATEPROGRESSBAR *PTRANSPORTESTIMATEPROGRESSBAR;

typedef BOOL(WINAPI TRANSPORTQUERYCAPABILITIES)(
                        IN      MIG_TRANSPORTSTORAGEID TransportStorageId,
                        OUT     PMIG_TRANSPORTTYPE TransportType,
                        OUT     PMIG_TRANSPORTCAPABILITIES Capabilities,
                        OUT     PCTSTR *FriendlyDescription
                        );
typedef TRANSPORTQUERYCAPABILITIES *PTRANSPORTQUERYCAPABILITIES;

typedef BOOL(WINAPI TRANSPORTSETSTORAGE)(
                        IN      MIG_PLATFORMTYPEID Platform,
                        IN      MIG_TRANSPORTSTORAGEID TransportStorageId,
                        IN      MIG_TRANSPORTCAPABILITIES Capabilities,
                        IN      PCTSTR StoragePath,
                        OUT     PBOOL Valid,
                        OUT     PBOOL ImageExists
                        );
typedef TRANSPORTSETSTORAGE *PTRANSPORTSETSTORAGE;

typedef VOID(WINAPI TRANSPORTRESETSTORAGE)(MIG_TRANSPORTSTORAGEID TransportStorageId);
typedef TRANSPORTRESETSTORAGE *PTRANSPORTRESETSTORAGE;

typedef VOID(WINAPI TRANSPORTTERMINATE)(VOID);
typedef TRANSPORTTERMINATE *PTRANSPORTTERMINATE;

typedef BOOL(WINAPI TRANSPORTSAVESTATE)(VOID);
typedef TRANSPORTSAVESTATE *PTRANSPORTSAVESTATE;

typedef BOOL(WINAPI TRANSPORTRESUMESAVESTATE)(VOID);
typedef TRANSPORTRESUMESAVESTATE *PTRANSPORTRESUMESAVESTATE;

typedef BOOL(WINAPI TRANSPORTBEGINAPPLY)(VOID);
typedef TRANSPORTBEGINAPPLY *PTRANSPORTBEGINAPPLY;

typedef BOOL(WINAPI TRANSPORTRESUMEAPPLY)(VOID);
typedef TRANSPORTRESUMEAPPLY *PTRANSPORTRESUMEAPPLY;

typedef BOOL(WINAPI TRANSPORTACQUIREOBJECT)(
                            IN      MIG_OBJECTTYPEID ObjectTypeId,
                            IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                            IN OUT  PMIG_CONTENT ObjectContent,
                            IN      MIG_CONTENTTYPE ContentType,
                            IN      UINT MemoryContentLimit
                            );
typedef TRANSPORTACQUIREOBJECT *PTRANSPORTACQUIREOBJECT;

typedef BOOL(WINAPI TRANSPORTRELEASEOBJECT)(PMIG_CONTENT ObjectContent);
typedef TRANSPORTRELEASEOBJECT *PTRANSPORTRELEASEOBJECT;

typedef VOID(WINAPI TRANSPORTENDAPPLY)(VOID);
typedef TRANSPORTENDAPPLY *PTRANSPORTENDAPPLY;

typedef struct {
    UINT Version;
    PTRANSPORTINITIALIZE TransportInitialize;
    PTRANSPORTESTIMATEPROGRESSBAR TransportEstimateProgressBar;
    PTRANSPORTQUERYCAPABILITIES TransportQueryCapabilities;
    PTRANSPORTSETSTORAGE TransportSetStorage;
    PTRANSPORTRESETSTORAGE TransportResetStorage;
    PTRANSPORTTERMINATE TransportTerminate;
    PTRANSPORTSAVESTATE TransportSaveState;
    PTRANSPORTRESUMESAVESTATE TransportResumeSaveState;
    PTRANSPORTBEGINAPPLY TransportBeginApply;
    PTRANSPORTRESUMEAPPLY TransportResumeApply;
    PTRANSPORTACQUIREOBJECT TransportAcquireObject;
    PTRANSPORTRELEASEOBJECT TransportReleaseObject;
    PTRANSPORTENDAPPLY TransportEndApply;
} TRANSPORT_ENTRYPOINTS, *PTRANSPORT_ENTRYPOINTS;

//
// operations
//

typedef BOOL (WINAPI OPMFILTERCALLBACK)(
                        PCMIG_FILTERINPUT InputData,
                        PMIG_FILTEROUTPUT OutputData,
                        BOOL NoRestoreObject,
                        PCMIG_BLOB SourceOperationData,             OPTIONAL
                        PCMIG_BLOB DestinationOperationData         OPTIONAL
                        );
typedef OPMFILTERCALLBACK *POPMFILTERCALLBACK;

typedef BOOL (WINAPI OPMAPPLYCALLBACK)(
                        MIG_OBJECTTYPEID SrcObjectTypeId,
                        MIG_OBJECTSTRINGHANDLE SrcObjectName,
                        PCMIG_CONTENT OriginalContent,
                        PCMIG_CONTENT CurrentContent,
                        PMIG_CONTENT NewContent,
                        PCMIG_BLOB SourceOperationData,             OPTIONAL
                        PCMIG_BLOB DestinationOperationData         OPTIONAL
                        );
typedef OPMAPPLYCALLBACK *POPMAPPLYCALLBACK;

//
// message passing
//

typedef ULONG_PTR(CALLBACK MESSAGECALLBACK)(UINT Message, ULONG_PTR Arg);
typedef MESSAGECALLBACK *PMESSAGECALLBACK;

//
// ETM entry points
//

typedef BOOL(WINAPI TYPE_ENUMFIRSTPHYSICALOBJECT)(
                IN OUT  PMIG_TYPEOBJECTENUM EnumPtr,
                IN      MIG_OBJECTSTRINGHANDLE Pattern,
                IN      UINT MaxLevel
                );
typedef TYPE_ENUMFIRSTPHYSICALOBJECT *PTYPE_ENUMFIRSTPHYSICALOBJECT;

typedef BOOL(WINAPI TYPE_ENUMNEXTPHYSICALOBJECT)(
                IN OUT  PMIG_TYPEOBJECTENUM EnumPtr
                );
typedef TYPE_ENUMNEXTPHYSICALOBJECT *PTYPE_ENUMNEXTPHYSICALOBJECT;

typedef VOID(WINAPI TYPE_ABORTENUMCURRENTPHYSICALNODE)(
                IN OUT  PMIG_TYPEOBJECTENUM EnumPtr
                );
typedef TYPE_ABORTENUMCURRENTPHYSICALNODE *PTYPE_ABORTENUMCURRENTPHYSICALNODE;

typedef VOID(WINAPI TYPE_ABORTENUMPHYSICALOBJECT)(
                IN OUT  PMIG_TYPEOBJECTENUM EnumPtr
                );
typedef TYPE_ABORTENUMPHYSICALOBJECT *PTYPE_ABORTENUMPHYSICALOBJECT;

typedef PCTSTR(WINAPI TYPE_CONVERTOBJECTTOMULTISZ)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                IN      PMIG_CONTENT ObjectContent
                );
typedef TYPE_CONVERTOBJECTTOMULTISZ *PTYPE_CONVERTOBJECTTOMULTISZ;

typedef BOOL(WINAPI TYPE_CONVERTMULTISZTOOBJECT)(
                IN      PCTSTR ObjectMultiSz,
                OUT     MIG_OBJECTSTRINGHANDLE *ObjectName,
                OUT     PMIG_CONTENT ObjectContent          OPTIONAL
                );
typedef TYPE_CONVERTMULTISZTOOBJECT *PTYPE_CONVERTMULTISZTOOBJECT;

typedef PCTSTR(WINAPI TYPE_GETNATIVEOBJECTNAME)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName
                );
typedef TYPE_GETNATIVEOBJECTNAME *PTYPE_GETNATIVEOBJECTNAME;

typedef BOOL(WINAPI TYPE_ACQUIREPHYSICALOBJECT)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                OUT     PMIG_CONTENT ObjectContent,
                IN      MIG_CONTENTTYPE ContentType,
                IN      UINT MemoryContentLimit
                );
typedef TYPE_ACQUIREPHYSICALOBJECT *PTYPE_ACQUIREPHYSICALOBJECT;

typedef BOOL(WINAPI TYPE_RELEASEPHYSICALOBJECT)(
                IN OUT  PMIG_CONTENT ObjectContent
                );
typedef TYPE_RELEASEPHYSICALOBJECT *PTYPE_RELEASEPHYSICALOBJECT;

typedef BOOL(WINAPI TYPE_DOESPHYSICALOBJECTEXIST)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName
                );
typedef TYPE_DOESPHYSICALOBJECTEXIST *PTYPE_DOESPHYSICALOBJECTEXIST;

typedef BOOL(WINAPI TYPE_REMOVEPHYSICALOBJECT)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName
                );
typedef TYPE_REMOVEPHYSICALOBJECT *PTYPE_REMOVEPHYSICALOBJECT;

typedef BOOL(WINAPI TYPE_CREATEPHYSICALOBJECT)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                IN      PMIG_CONTENT ObjectContent
                );
typedef TYPE_CREATEPHYSICALOBJECT *PTYPE_CREATEPHYSICALOBJECT;

typedef BOOL(WINAPI TYPE_REPLACEPHYSICALOBJECT)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                IN      PMIG_CONTENT ObjectContent
                );
typedef TYPE_REPLACEPHYSICALOBJECT *PTYPE_REPLACEPHYSICALOBJECT;

typedef PMIG_CONTENT(WINAPI TYPE_CONVERTOBJECTCONTENTTOUNICODE)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                IN      PMIG_CONTENT ObjectContent
                );
typedef TYPE_CONVERTOBJECTCONTENTTOUNICODE *PTYPE_CONVERTOBJECTCONTENTTOUNICODE;

typedef PMIG_CONTENT(WINAPI TYPE_CONVERTOBJECTCONTENTTOANSI)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                IN      PMIG_CONTENT ObjectContent
                );
typedef TYPE_CONVERTOBJECTCONTENTTOANSI *PTYPE_CONVERTOBJECTCONTENTTOANSI;

typedef BOOL(WINAPI TYPE_FREECONVERTEDOBJECTCONTENT)(
                IN      PMIG_CONTENT ObjectContent
                );
typedef TYPE_FREECONVERTEDOBJECTCONTENT *PTYPE_FREECONVERTEDOBJECTCONTENT;

typedef struct {
    PTYPE_ENUMFIRSTPHYSICALOBJECT EnumFirstPhysicalObject;
    PTYPE_ENUMNEXTPHYSICALOBJECT EnumNextPhysicalObject;
    PTYPE_ABORTENUMCURRENTPHYSICALNODE AbortEnumCurrentPhysicalNode;
    PTYPE_ABORTENUMPHYSICALOBJECT AbortEnumPhysicalObject;
    PTYPE_CONVERTOBJECTTOMULTISZ ConvertObjectToMultiSz;
    PTYPE_CONVERTMULTISZTOOBJECT ConvertMultiSzToObject;
    PTYPE_GETNATIVEOBJECTNAME GetNativeObjectName;
    PTYPE_ACQUIREPHYSICALOBJECT AcquirePhysicalObject;
    PTYPE_RELEASEPHYSICALOBJECT ReleasePhysicalObject;
    PTYPE_DOESPHYSICALOBJECTEXIST DoesPhysicalObjectExist;
    PTYPE_REMOVEPHYSICALOBJECT RemovePhysicalObject;
    PTYPE_CREATEPHYSICALOBJECT CreatePhysicalObject;
    PTYPE_REPLACEPHYSICALOBJECT ReplacePhysicalObject;
    PTYPE_CONVERTOBJECTCONTENTTOUNICODE ConvertObjectContentToUnicode;
    PTYPE_CONVERTOBJECTCONTENTTOANSI ConvertObjectContentToAnsi;
    PTYPE_FREECONVERTEDOBJECTCONTENT FreeConvertedObjectContent;
} TYPE_REGISTER, *PTYPE_REGISTER;

typedef BOOL (WINAPI MIG_PHYSICALENUMCHECK)(
                IN      PMIG_TYPEOBJECTENUM ObjectEnum,
                IN      ULONG_PTR Arg
                );

typedef MIG_PHYSICALENUMCHECK *PMIG_PHYSICALENUMCHECK;

typedef BOOL (WINAPI MIG_PHYSICALENUMADD)(
                IN OUT  PMIG_TYPEOBJECTENUM ObjectEnum,
                IN      MIG_OBJECTSTRINGHANDLE Pattern,     // NULL if Abort is TRUE
                IN      MIG_PARSEDPATTERN ParsedPattern,    // NULL if Abort is TRUE
                IN      ULONG_PTR Arg,
                IN      BOOL Abort
                );

typedef MIG_PHYSICALENUMADD *PMIG_PHYSICALENUMADD;

typedef BOOL (WINAPI MIG_PHYSICALACQUIREHOOK)(
                IN      MIG_OBJECTSTRINGHANDLE ObjectName,
                IN      PMIG_CONTENT ObjectContent,
                IN      MIG_CONTENTTYPE ContentType,
                IN      UINT MemoryContentLimit,
                OUT     PMIG_CONTENT *NewObjectContent,         CALLER_INITIALIZED OPTIONAL
                IN      BOOL ReleaseContent,
                IN      ULONG_PTR Arg
                );

typedef MIG_PHYSICALACQUIREHOOK *PMIG_PHYSICALACQUIREHOOK;

typedef VOID (WINAPI MIG_PHYSICALACQUIREFREE)(PMIG_CONTENT ObjectContent);

typedef MIG_PHYSICALACQUIREFREE *PMIG_PHYSICALACQUIREFREE;


//
// module entry points
//

typedef BOOL(WINAPI MODULEINITIALIZE)(VOID);
typedef MODULEINITIALIZE * PMODULEINITIALIZE;

typedef VOID(WINAPI MODULETERMINATE)(VOID);
typedef MODULETERMINATE * PMODULETERMINATE;

typedef BOOL(WINAPI ETMINITIALIZE)(MIG_PLATFORMTYPEID Platform, PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef ETMINITIALIZE * PETMINITIALIZE;

typedef BOOL(WINAPI ETMPARSE)(PVOID Reserved);
typedef ETMPARSE *PETMPARSE;

typedef VOID(WINAPI ETMTERMINATE)(VOID);
typedef ETMTERMINATE * PETMTERMINATE;

typedef VOID(WINAPI ETMNEWUSERCREATED)(PCTSTR UserName, PCTSTR DomainName, PCTSTR UserProfileRoot, PSID UserSid);
typedef ETMNEWUSERCREATED * PETMNEWUSERCREATED;

typedef struct {
    UINT Version;
    PETMINITIALIZE EtmInitialize;
    PETMPARSE EtmParse;
    PETMTERMINATE EtmTerminate;
    PETMNEWUSERCREATED EtmNewUserCreated;
} TYPE_ENTRYPOINTS, *PTYPE_ENTRYPOINTS;

typedef BOOL(WINAPI VCMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef VCMINITIALIZE * PVCMINITIALIZE;

typedef BOOL(WINAPI VCMPARSE)(PVOID Reserved);
typedef VCMPARSE * PVCMPARSE;

typedef BOOL(WINAPI VCMQUEUEENUMERATION)(PVOID Reserved);
typedef VCMQUEUEENUMERATION * PVCMQUEUEENUMERATION;

typedef BOOL(WINAPI VCMQUEUEHIGHPRIORITYENUMERATION)(PVOID Reserved);
typedef VCMQUEUEHIGHPRIORITYENUMERATION * PVCMQUEUEHIGHPRIORITYENUMERATION;

typedef UINT(WINAPI VCMENUMERATIONCALLBACK)(
                IN      PCMIG_OBJECTENUMDATA Data,
                IN      ULONG_PTR CallerArg
                );
typedef VCMENUMERATIONCALLBACK * PVCMENUMERATIONCALLBACK;

typedef VOID(WINAPI VCMTERMINATE)(VOID);
typedef VCMTERMINATE * PVCMTERMINATE;

typedef struct {
    UINT Version;
    PVCMINITIALIZE VcmInitialize;
    PVCMPARSE VcmParse;
    PVCMQUEUEENUMERATION VcmQueueEnumeration;
    PVCMQUEUEHIGHPRIORITYENUMERATION VcmQueueHighPriorityEnumeration;
    PVCMTERMINATE VcmTerminate;
} VIRTUAL_COMPUTER_ENTRYPOINTS, *PVIRTUAL_COMPUTER_ENTRYPOINTS;

typedef BOOL(WINAPI SGMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef SGMINITIALIZE * PSGMINITIALIZE;

typedef BOOL(WINAPI SGMPARSE)(PVOID Reserved);
typedef SGMPARSE * PSGMPARSE;

typedef BOOL(WINAPI SGMQUEUEENUMERATION)(PVOID Reserved);
typedef SGMQUEUEENUMERATION * PSGMQUEUEENUMERATION;

typedef BOOL(WINAPI SGMQUEUEHIGHPRIORITYENUMERATION)(PVOID Reserved);
typedef SGMQUEUEHIGHPRIORITYENUMERATION * PSGMQUEUEHIGHPRIORITYENUMERATION;

typedef UINT(WINAPI SGMENUMERATIONCALLBACK)(
                IN      PCMIG_OBJECTENUMDATA Data,
                IN      ULONG_PTR CallerArg
                );
typedef SGMENUMERATIONCALLBACK * PSGMENUMERATIONCALLBACK;

typedef VOID(WINAPI SGMTERMINATE)(VOID);
typedef SGMTERMINATE * PSGMTERMINATE;

typedef BOOL(WINAPI SAMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef SAMINITIALIZE * PSAMINITIALIZE;

typedef BOOL(WINAPI SAMEXECUTE)(VOID);
typedef SAMEXECUTE * PSAMEXECUTE;

typedef VOID(WINAPI SAMESTIMATEPROGRESSBAR)(VOID);
typedef SAMESTIMATEPROGRESSBAR *PSAMESTIMATEPROGRESSBAR;

typedef VOID(WINAPI SAMTERMINATE)(VOID);
typedef SAMTERMINATE * PSAMTERMINATE;

typedef struct {
    UINT Version;
    PSGMINITIALIZE SgmInitialize;
    PSGMPARSE SgmParse;
    PSGMQUEUEENUMERATION SgmQueueEnumeration;
    PSGMQUEUEHIGHPRIORITYENUMERATION SgmQueueHighPriorityEnumeration;
    PSGMTERMINATE SgmTerminate;
    PSAMINITIALIZE SamInitialize;
    PSAMEXECUTE SamExecute;
    PSAMESTIMATEPROGRESSBAR SamEstimateProgressBar;
    PSAMTERMINATE SamTerminate;
} SOURCE_ENTRYPOINTS, *PSOURCE_ENTRYPOINTS;

typedef BOOL(WINAPI DGMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef DGMINITIALIZE * PDGMINITIALIZE;

typedef BOOL(WINAPI DGMQUEUEENUMERATION)(PVOID Reserved);
typedef DGMQUEUEENUMERATION * PDGMQUEUEENUMERATION;

typedef BOOL(WINAPI DGMQUEUEHIGHPRIORITYENUMERATION)(PVOID Reserved);
typedef DGMQUEUEHIGHPRIORITYENUMERATION * PDGMQUEUEHIGHPRIORITYENUMERATION;

typedef UINT(WINAPI DGMENUMERATIONCALLBACK)(
                IN      PCMIG_OBJECTENUMDATA Data,
                IN      ULONG_PTR CallerArg
                );
typedef DGMENUMERATIONCALLBACK * PDGMENUMERATIONCALLBACK;

typedef VOID(WINAPI DGMTERMINATE)(VOID);
typedef DGMTERMINATE * PDGMTERMINATE;

typedef BOOL(WINAPI DAMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef DAMINITIALIZE * PDAMINITIALIZE;

typedef BOOL(WINAPI DAMEXECUTE)(VOID);
typedef DAMEXECUTE * PDAMEXECUTE;

typedef VOID(WINAPI DAMESTIMATEPROGRESSBAR)(VOID);
typedef DAMESTIMATEPROGRESSBAR *PDAMESTIMATEPROGRESSBAR;

typedef VOID(WINAPI DAMTERMINATE)(VOID);
typedef DAMTERMINATE * PDAMTERMINATE;

typedef BOOL(WINAPI CSMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef CSMINITIALIZE * PCSMINITIALIZE;

typedef BOOL(WINAPI CSMEXECUTE)(VOID);
typedef CSMEXECUTE * PCSMEXECUTE;

typedef VOID(WINAPI CSMESTIMATEPROGRESSBAR)(VOID);
typedef CSMESTIMATEPROGRESSBAR *PCSMESTIMATEPROGRESSBAR;

typedef VOID(WINAPI CSMTERMINATE)(VOID);
typedef CSMTERMINATE * PCSMTERMINATE;

typedef BOOL(WINAPI OPMINITIALIZE)(PMIG_LOGCALLBACK LogCallback, PVOID Reserved);
typedef OPMINITIALIZE * POPMINITIALIZE;

typedef VOID(WINAPI OPMTERMINATE)(VOID);
typedef OPMTERMINATE * POPMTERMINATE;

typedef struct {
    UINT Version;
    PDGMINITIALIZE DgmInitialize;
    PDGMQUEUEENUMERATION DgmQueueEnumeration;
    PDGMQUEUEHIGHPRIORITYENUMERATION DgmQueueHighPriorityEnumeration;
    PDGMTERMINATE DgmTerminate;
    PDAMINITIALIZE DamInitialize;
    PDAMEXECUTE DamExecute;
    PDAMESTIMATEPROGRESSBAR DamEstimateProgressBar;
    PDAMTERMINATE DamTerminate;
    PCSMINITIALIZE CsmInitialize;
    PCSMEXECUTE CsmExecute;
    PCSMESTIMATEPROGRESSBAR CsmEstimateProgressBar;
    PCSMTERMINATE CsmTerminate;
    POPMINITIALIZE OpmInitialize;
    POPMTERMINATE OpmTerminate;
} DESTINATION_ENTRYPOINTS, *PDESTINATION_ENTRYPOINTS;

//
// callback prototypes
//

typedef UINT (WINAPI MIG_OBJECTENUMCALLBACK)(PCMIG_OBJECTENUMDATA Data, ULONG_PTR CallerArg);
typedef MIG_OBJECTENUMCALLBACK *PMIG_OBJECTENUMCALLBACK;

typedef BOOL (WINAPI MIG_PREENUMCALLBACK)(VOID);
typedef MIG_PREENUMCALLBACK *PMIG_PREENUMCALLBACK;

typedef BOOL (WINAPI MIG_POSTENUMCALLBACK)(VOID);
typedef MIG_POSTENUMCALLBACK *PMIG_POSTENUMCALLBACK;

typedef BOOL (WINAPI MIG_DYNAMICEXCLUSIONCALLBACK)(
                    MIG_OBJECTTYPEID ObjectTypeId,
                    MIG_OBJECTSTRINGHANDLE EncodedObjectName,
                    ULONG_PTR Arg
                    );

typedef MIG_DYNAMICEXCLUSIONCALLBACK *PMIG_DYNAMICEXCLUSIONCALLBACK;

typedef BOOL (WINAPI MIG_RESTORECALLBACK)(MIG_OBJECTTYPEID,MIG_OBJECTID,MIG_OBJECTSTRINGHANDLE);
typedef MIG_RESTORECALLBACK *PMIG_RESTORECALLBACK;

//
// entry points that return module funciton addresses
//

typedef BOOL(WINAPI VIRTUALCOMPUTERMODULE)(
                IN      PCTSTR ModuleId,
                IN OUT  PVIRTUAL_COMPUTER_ENTRYPOINTS VirtualComputerEntryPoints
                );
typedef VIRTUALCOMPUTERMODULE *PVIRTUALCOMPUTERMODULE;

typedef BOOL(WINAPI SOURCEMODULE)(
                IN      PCTSTR ModuleId,
                IN OUT  PSOURCE_ENTRYPOINTS SourceEntryPoints
                );
typedef SOURCEMODULE *PSOURCEMODULE;

typedef BOOL(WINAPI DESTINATIONMODULE)(
                IN      PCTSTR ModuleId,
                IN OUT  PDESTINATION_ENTRYPOINTS DestinationEntryPoints
                );
typedef DESTINATIONMODULE *PDESTINATIONMODULE;

typedef BOOL(WINAPI TYPEMODULE)(
                IN      PCTSTR ModuleId,
                IN OUT  PTYPE_ENTRYPOINTS TypeEntryPoints
                );
typedef TYPEMODULE *PTYPEMODULE;

typedef BOOL(WINAPI TRANSPORTMODULE)(
                IN      PCTSTR ModuleId,
                IN OUT  PTRANSPORT_ENTRYPOINTS TransportEntryPoints
                );
typedef TRANSPORTMODULE *PTRANSPORTMODULE;