// emsvc.idl : IDL source for emsvc.dll
//

// This file will be processed by the MIDL tool to
// produce the type library (emsvc.tlb) and marshalling code.
#define EM_MAX_PATH	256

import "oaidl.idl";
import "ocidl.idl";

[
	uuid(93409732-67DE-4B5F-BCEA-ADEF6D8F5596),
	version(1.0),
	helpstring("emsvc 1.0 Type Library")
]
library EMSVCLib
{
	importlib("stdole2.tlb");

    //
    // Debug Session Types
    //
    typedef enum SessionType {
        SessType_Automatic,
//        SessType_Recursive,
        SessType_Manual
    } SessionType;

	enum DebugExLParams {

		// When this flag is set, Automatic session will
		// be started in recursive mode.
		RECURSIVE_MODE			=	1 << 0,

		// If this flag is set, mini dump will be
		// generated soon after the session gets started.
		PRODUCE_MINI_DUMP		=	1 << 1,

		// User dump will be generated soon after the
		// session gets started.
		PRODUCE_USER_DUMP		=	1 << 2,

		//
		BLOCK_INCOMING_IPCALLS	=	1 << 3,
	};

	//
	// Objects in the EM System
	//
	typedef enum EmObjectType {

		// invalid object
		EMOBJ_UNKNOWNOBJECT	= 0,

		// Services registered in the system
		EMOBJ_SERVICE		= 1<<0,

		// Running processes (precludes Services)
		EMOBJ_PROCESS		= 1<<1,

		// Log files created by dbgengine
		EMOBJ_LOGFILE		= 1<<2,

		// Mini Dump files created by dbgengine
		EMOBJ_MINIDUMP		= 1<<3,

		// User Dump files created by dbgengine
		EMOBJ_USERDUMP		= 1<<4,

		// ecx files 
		EMOBJ_CMDSET		= 1<<5,

		// msinfo files
		EMOBJ_MSINFO		= 1<<6

	} EmObjectType;

	//
	// EmObject Fields
	//
	typedef enum EmObjectFields {

		// "type" of the EmObject
		EMOBJ_FLD_TYPE			=	1<<0,

		// "type2" of the EmObject
		EMOBJ_FLD_TYPE2			=	1<<1,

		// "guidstream" of the EmObject
		EMOBJ_FLD_GUIDSTREAM	=	1<<2,

		// "nId" of the EmObject
		EMOBJ_FLD_NID			=	1<<3,

		// "szName" of the EmObject
		EMOBJ_FLD_SZNAME		=	1<<4,

		// "szSecName" of the EmObject
		EMOBJ_FLD_SZSECNAME		=	1<<5,

		// "nStatus" of the EmObject
		EMOBJ_FLD_NSTATUS		=	1<<6,

		// "dateStart" of the EmObject
		EMOBJ_FLD_DATESTART		=	1<<7,

		// "dateEnd" of the EmObject
		EMOBJ_FLD_DATEEND		=	1<<8,

		// "szBucket1" of the EmObject
		EMOBJ_FLD_SZBUCKET1		=	1<<9,

		// "dwBucket1" of the EmObject
		EMOBJ_FLD_DWBUCKET1		=	1<<10,

		// "hr" of the EmObject
		EMOBJ_FLD_HR			=	1<<11,

		// all the members of EmObject
		EMOBJ_FLD_ALL			=	0xffff,

		// none of the members of EmObject
		EMOBJ_FLD_NONE			=	0x0

	} EmObjectFields;

	//
	// EmObject layout
	//
	typedef struct EmObject {

		// EmObjectType
		short	type;

		// type2
		short	type2;

        // GUID 
        unsigned char guidstream [ 16 ];

		// numeric id
		LONG	nId;

		// Basic name of this object
		TCHAR	szName [ EM_MAX_PATH ];

		// Secondary name
		TCHAR	szSecName [ EM_MAX_PATH ];

		// Status of this object
		LONG	nStatus;

        // Start time 
        DATE	dateStart;

        // End time
        DATE	dateEnd;

		// general purpose storage
		TCHAR	szBucket1 [64];

		// general purpose storage
		DWORD	dwBucket1;

		// error value recorded when an error occurs
		HRESULT hr;

	} EmObject, *PEmObject, **PPEmObject;

    //
    // Column definition
    //  - EMOBJ_SERVICE 
    //  - EMOBJ_PROCESS
    //
    enum {
        EXE_COL_TYPE,
        EXE_COL_ID,
        EXE_COL_NAME,
        EXE_COL_DESCRIPTION,
        EXE_COL_STATUS,
        EXE_COL_STARTDATE,
        EXE_COL_ENDDATE,
    };

    //
    // Column definition
    //  - EMOBJ_LOGFILE
    //  - EMOBJ_USERDUMP
    //  - EMOBJ_MINIDUMP
    //  - EMOBJ_CMDSET
    enum {
        FILE_COL_TYPE,
        FILE_COL_NAME,
        FILE_COL_SIZE,
        FILE_COL_DESCRIPTION,
    };

    //
    // Object Status - EmStatusHiWord + EmStatusLoWord
    // CAUTION : EmStatusLoWord should not exceed 16 bits.
	//
    typedef enum EmStatusHiWord {

		// 
		STAT_SESS_NONE						=	1 << 16,

		// The session has not yet started..
		STAT_SESS_NOT_STARTED				=	1 << 17,

		// Debug session has been started and is in progress
		STAT_SESS_DEBUG_IN_PROGRESS			=	1 << 18,

		// Debug session has stopped.
		STAT_SESS_STOPPED					=	1 << 19,
		
	} EmStatusHiWord;

	typedef enum EmStatusLoWord {

		// 
		STAT_NONE						=	0,

		//
		// This state is applicable to sessions that have been
		// started but the master is dead without calling
		// CloseSession..
		// CAUTION !!! Take care to see that any new state added
		// do this item is with in 0 to 14th bit of the lo word.
		//
		STAT_ORPHAN						=	1 << 15,

		//
		// The following 2 states are valid only when the
		// hi word is STAT_SESS_NOT_STARTED
		//

		// The debuggee is not running.
		STAT_NOTRUNNING					=	1 << 0,

		// The debuggee is running.
		STAT_RUNNING					=	1 << 1,

		//
		// The following 2 states are valid only when the
		// hi word is STAT_SESS_DEBUG_IN_PROGRESS
		//

		// The requested file was created successfully
		STAT_FILECREATED_SUCCESSFULLY	=	1 << 2,

		// The file creation process failed.
		STAT_FILECREATION_FAILED		=	1 << 3,

		//
		// The follwing states are valid only when the
		// hi word is STAT_SESS_STOPPED
		//

		// 
		STAT_SUCCESS					=	1 << 4,

		//
		STAT_FAILED						=	1 << 5,

		// The debuggee in a debugging session was killed externally
        STAT_DEBUGGEE_KILLED			=	1 << 6,

		// The debuggee exited.
		STAT_DEBUGGEE_EXITED			=	1 << 7,

		// The debuggee caused an exception to occur.
		STAT_EXCEPTION_OCCURED			=	1 << 8,

		// The debuggee caused an access violation.
		STAT_ACCESSVIOLATION_OCCURED	=	1 << 9,

	} EmStatusLoWord;

	typedef enum EmSessionStatus {

		// Session status NONE
		STAT_SESS_NONE_STAT_NONE									=	STAT_SESS_NONE + STAT_NONE,

		// Session is not started and the process is not running.
		STAT_SESS_NOT_STARTED_NOTRUNNING							=	STAT_SESS_NOT_STARTED + STAT_NOTRUNNING,

		// Session is not started and the process is running.
		STAT_SESS_NOT_STARTED_RUNNING								=	STAT_SESS_NOT_STARTED + STAT_RUNNING,

		// Session is not started and the file got create successfully.
		STAT_SESS_NOT_STARTED_FILECREATED_SUCCESSFULLY				=	STAT_SESS_NOT_STARTED + STAT_FILECREATED_SUCCESSFULLY,

		// Session is not started and the file creation failed.
		STAT_SESS_NOT_STARTED_FILECREATION_FAILED					=	STAT_SESS_NOT_STARTED + STAT_FILECREATION_FAILED,

		// Debug session is proceeding without events but the session has been orphaned.
		STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_NONE						=	STAT_SESS_DEBUG_IN_PROGRESS + STAT_ORPHAN + STAT_NONE,

		// Debug session is active and the file was created successfully but the session has been orphaned.
		STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATED_SUCESSFULLY	=	STAT_SESS_DEBUG_IN_PROGRESS + STAT_ORPHAN + STAT_FILECREATED_SUCCESSFULLY,

		// Debug sessoin is active but the file did not get created successfully and the session has been orphaned.
		STAT_SESS_DEBUG_IN_PROGRESS_ORPHAN_FILECREATION_FAILED		=	STAT_SESS_DEBUG_IN_PROGRESS + STAT_ORPHAN + STAT_FILECREATION_FAILED,

		// Session has been stopped successfully, but the session has been orphaned
		STAT_SESS_STOPPED_ORPHAN_SUCCESS							=	STAT_SESS_STOPPED + STAT_ORPHAN + STAT_SUCCESS,

		// Session could not be stopped successfully and the session has been orphaned
		STAT_SESS_STOPPED_ORPHAN_FAILED								=	STAT_SESS_STOPPED + STAT_ORPHAN + STAT_FAILED,

		// Debug session is stopped because the debuggee was killed and the session has been orphaned.
		STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_KILLED					=	STAT_SESS_STOPPED + STAT_ORPHAN + STAT_DEBUGGEE_KILLED,

		// Debug session is stopped because the debuggee exited and the session has been orphaned.
		STAT_SESS_STOPPED_ORPHAN_DEBUGGEE_EXITED					=	STAT_SESS_STOPPED + STAT_ORPHAN + STAT_DEBUGGEE_EXITED,

		// Debug session is stopped because the debuggee caused an exception and the session has been orphaned.
		STAT_SESS_STOPPED_ORPHAN_EXCEPTION_OCCURED					=	STAT_SESS_STOPPED + STAT_ORPHAN + STAT_EXCEPTION_OCCURED,

		// Debug session is stopped because the debuggee caused an access violation and the session has been orphaned.
		STAT_SESS_STOPPED_ORPHAN_ACCESSVIOLATION_OCCURED			=	STAT_SESS_STOPPED + STAT_ORPHAN + STAT_ACCESSVIOLATION_OCCURED,

		// Debug session is proceeding without events.
		STAT_SESS_DEBUG_IN_PROGRESS_NONE							=	STAT_SESS_DEBUG_IN_PROGRESS + STAT_NONE,

		// Debug session is active and the file was created successfully.
		STAT_SESS_DEBUG_IN_PROGRESS_FILECREATED_SUCESSFULLY			=	STAT_SESS_DEBUG_IN_PROGRESS + STAT_FILECREATED_SUCCESSFULLY,

		// Debug sessoin is active but the file did not get created successfully.
		STAT_SESS_DEBUG_IN_PROGRESS_FILECREATION_FAILED				=	STAT_SESS_DEBUG_IN_PROGRESS + STAT_FILECREATION_FAILED,

		// 
		STAT_SESS_STOPPED_SUCCESS									=	STAT_SESS_STOPPED + STAT_SUCCESS,

		// 
		STAT_SESS_STOPPED_FAILED									=	STAT_SESS_STOPPED + STAT_FAILED,

		// Debug session is stopped because the debuggee was killed.
		STAT_SESS_STOPPED_DEBUGGEE_KILLED							=	STAT_SESS_STOPPED + STAT_DEBUGGEE_KILLED,

		// Debug session is stopped because the debuggee exited.
		STAT_SESS_STOPPED_DEBUGGEE_EXITED							=	STAT_SESS_STOPPED + STAT_DEBUGGEE_EXITED,

		// Debug session is stopped because the debuggee caused an exception.
		STAT_SESS_STOPPED_EXCEPTION_OCCURED							=	STAT_SESS_STOPPED + STAT_EXCEPTION_OCCURED,

		// Debug session is stopped because the debuggee caused an access violation.
		STAT_SESS_STOPPED_ACCESSVIOLATION_OCCURED					=	STAT_SESS_STOPPED + STAT_ACCESSVIOLATION_OCCURED,

	} EmSessionStatus;

	[
		object,
		uuid(74FA475F-492D-406E-B267-BBCB28AF262A),
		dual,
		helpstring("IEmDebugSession Interface"),
		pointer_default(unique)
	]
	interface IEmDebugSession : IDispatch
	{
		[id(1), helpstring("method Debug")] HRESULT Debug([in, out] BSTR bstrEmObj, [in] SessionType eSessType);
		[id(2), helpstring("method StopDebug")] HRESULT StopDebug([in] BOOL bForceStop);
		[id(3), helpstring("method GenerateDumpFile")] HRESULT GenerateDumpFile([in] UINT nDumpType);
		[id(4), helpstring("method GetStatus")] HRESULT GetStatus([in, out] BSTR bstrEmObj);
		[id(5), helpstring("method DebugEx")] HRESULT DebugEx([in, out] BSTR bstrEmObj, [in] SessionType eSessType, [in] BSTR bstrEcxFilePath, [in] LONG lParam, [in, optional] VARIANT vtUserName, [in, optional] VARIANT vtPassword, [in, optional] VARIANT vtPort, [in, optional] VARIANT vtNotifyAdmin, [in, optional] VARIANT vtAltSymPath);
		[id(6), helpstring("method CancelDebug")] HRESULT CancelDebug([in] BOOL bForceCancel);
		[id(7), helpstring("method TakeOwnerShip")] HRESULT AdoptOrphan();
	};
	[
		object,
		uuid(1B60057D-B15A-4A30-A1FC-905B6AF24FB4),
		dual,
		helpstring("IEmManager Interface"),
		pointer_default(unique)
	]
	interface IEmManager : IDispatch
	{
		[id(1), helpstring("method EnumObjects")] HRESULT EnumObjects([in] EmObjectType eObjectType, [out] VARIANT *lpVariant);
		[id(2), helpstring("method OpenSession")] HRESULT OpenSession([in, out] BSTR bstrEmObj, [out]IEmDebugSession **ppEmDebugSession);
		[id(3), helpstring("method DeleteSession")] HRESULT DeleteSession([in] BSTR bstrEmObj);
		[id(4), helpstring("method EnumObjectsEx")] HRESULT EnumObjectsEx([in] BSTR bstrEmObj, [out] VARIANT *lpVariant);
		[id(5), helpstring("method GetEmFileInterface")] HRESULT GetEmFileInterface([in] BSTR bstrEmObj, [out] IStream **ppstrm);
		[id(6), helpstring("method GenerateDumpFile")] HRESULT GenerateDumpFile(BSTR bstrEmObj, UINT nDumpType);
		[id(7), helpstring("method DeleteFile")] HRESULT DeleteFile([in, out] BSTR bstrEmObj);
		[id(8), helpstring("method MakeNFO")] HRESULT MakeNFO([in] BSTR bstrPath, [in] BSTR bstrMachineName, [in] BSTR bstrCategories);
	};

	[
		uuid(32305ED8-359D-45C9-B996-74A97858B048),
		helpstring("_IEmManagerEvents Interface")
	]
	dispinterface _IEmManagerEvents
	{
		properties:
		methods:
	};

	[
		uuid(8424B9F5-6682-44D8-8D73-9BFEDE59DDC5),
		helpstring("EmManager Class")
	]
	coclass EmManager
	{
		[default] interface IEmManager;
		[default, source] dispinterface _IEmManagerEvents;
	};
	[
		uuid(8E2EE030-5E0C-481B-974D-510CA090F100),
		helpstring("_IEmDebugSessionEvents Interface")
	]
	dispinterface _IEmDebugSessionEvents
	{
		properties:
		methods:
	};
	[
		object,
		uuid(3939636C-5C12-44F6-A7F8-8FE5ECF46672),
		dual,
		helpstring("IEmFile Interface"),
		pointer_default(unique)
	]
	interface IEmFile : IDispatch
	{
		[id(1), helpstring("method Read")] HRESULT Read([out] void *pv, [in] ULONG cb, [out] ULONG *pcbRead);
		[id(2), helpstring("method Write")] HRESULT Write([in] void const *pv, [in] ULONG cb, [out] ULONG *pcbWritten);
		[id(3), helpstring("method Seek")] HRESULT Seek([in] LARGE_INTEGER dlibMove, [in] DWORD dwOrigin, [out] ULARGE_INTEGER *plibNewPosition);
		[id(4), helpstring("method SetSize")] HRESULT SetSize([in] ULARGE_INTEGER libNewSize);
		[id(5), helpstring("method CopyTo")] HRESULT CopyTo([in] IStream *pstm, [in] ULARGE_INTEGER cb, [out] ULARGE_INTEGER *pcbRead, [out] ULARGE_INTEGER *pcbWritten);
		[id(6), helpstring("method Commit")] HRESULT Commit([in] DWORD grfCommitFlags);
		[id(7), helpstring("method Revert")] HRESULT Revert(void);
		[id(8), helpstring("method LockRegion")] HRESULT LockRegion([in] ULARGE_INTEGER libOffset, [in] ULARGE_INTEGER cb, [in] DWORD dwLockType);
		[id(9), helpstring("method UnlockRegion")] HRESULT UnlockRegion([in] ULARGE_INTEGER libOffset, [in] ULARGE_INTEGER cb, [in] DWORD dwLockType);
		[id(10), helpstring("method Stat")] HRESULT Stat([out] STATSTG *pstatstg, DWORD grfStatFlag);
		[id(11), helpstring("method Clone")] HRESULT Clone([out] IStream **ppstm);
		[id(12), helpstring("method InitFile")] HRESULT InitFile(BSTR bstrFileName);
	};

	[
		uuid(AB959592-B2DC-4F57-B3F1-8D8116F74BAF),
		helpstring("EmDebugSession Class")
	]
	coclass EmDebugSession
	{
		[default] interface IEmDebugSession;
		[default, source] dispinterface _IEmDebugSessionEvents;
	};
	[
		uuid(30A533DF-9885-472E-8F8B-94AD3A6C6DE6),
		helpstring("EmFile Class")
	]
	coclass EmFile
	{
		[default] interface IEmFile;
	};
};
