/*
 * Copyright (C) 2011 Alistair Leslie-Hughes
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "unknwn.idl";
import "objidl.idl";

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef CreateProcess")
cpp_quote("#endif")

interface ICorDebugAppDomain;
interface ICorDebugAppDomainEnum;
interface ICorDebugAssembly;
interface ICorDebugAssemblyEnum;
interface ICorDebugBreakpoint;
interface ICorDebugBreakpointEnum;
interface ICorDebugChain;
interface ICorDebugChainEnum;
interface ICorDebugClass;
interface ICorDebugCode;
interface ICorDebugContext;
interface ICorDebugEditAndContinueSnapshot;
interface ICorDebugEditAndContinueErrorInfo;
interface ICorDebugEnum;
interface ICorDebugErrorInfoEnum;
interface ICorDebugEval;
interface ICorDebugFrame;
interface ICorDebugFrameEnum;
interface ICorDebugFunction;
interface ICorDebugFunctionBreakpoint;
interface ICorDebugManagedCallback;
interface ICorDebugManagedCallback2;
interface ICorDebugMDA;
interface ICorDebugModule;
interface ICorDebugModuleBreakpoint;
interface ICorDebugModuleEnum;
interface ICorDebugObjectEnum;
interface ICorDebugObjectValue;
interface ICorDebugProcess;
interface ICorDebugProcessEnum;
interface ICorDebugRegisterSet;
interface ICorDebugStepper;
interface ICorDebugStepperEnum;
interface ICorDebugThreadEnum;
interface ICorDebugUnmanagedCallback;
interface ICorDebugValue;
interface ICorDebugValueBreakpoint;


typedef [wire_marshal(unsigned long)] void *HPROCESS;
typedef [wire_marshal(unsigned long)] void *HTHREAD;

/* These are defined in corhrd.idl but used here. */
cpp_quote("#if 0")

typedef UINT32 mdToken;
typedef mdToken mdModule;
typedef SIZE_T  mdScope;
typedef mdToken mdTypeDef;
typedef mdToken mdSourceFile;
typedef mdToken mdMemberRef;
typedef mdToken mdMethodDef;
typedef mdToken mdFieldDef;
typedef mdToken mdSignature;
typedef ULONG CorElementType;
typedef SIZE_T PCCOR_SIGNATURE;

typedef SIZE_T LPDEBUG_EVENT;

typedef SIZE_T LPSTARTUPINFOW;
typedef SIZE_T LPPROCESS_INFORMATION;

cpp_quote("#endif")

typedef ULONG64 CORDB_ADDRESS;
typedef ULONG64 CORDB_REGISTER;

typedef UINT64 TASKID;
typedef DWORD CONNID;


cpp_quote("#ifndef _COR_IL_MAP")
cpp_quote("#define _COR_IL_MAP")

typedef struct _COR_IL_MAP
{
    ULONG32 oldOffset;
    ULONG32 newOffset;
    BOOL    fAccurate;
} COR_IL_MAP;

cpp_quote("#endif /* _COR_IL_MAP */")

cpp_quote("#ifndef _COR_DEBUG_IL_TO_NATIVE_MAP_")
cpp_quote("#define _COR_DEBUG_IL_TO_NATIVE_MAP_")

typedef enum CorDebugIlToNativeMappingTypes
{
    NO_MAPPING = -1,
    PROLOG     = -2,
    EPILOG     = -3
} CorDebugIlToNativeMappingTypes;

typedef struct COR_DEBUG_IL_TO_NATIVE_MAP
{
    ULONG32 ilOffset;
    ULONG32 nativeStartOffset;
    ULONG32 nativeEndOffset;
} COR_DEBUG_IL_TO_NATIVE_MAP;

cpp_quote("#endif /* _COR_DEBUG_IL_TO_NATIVE_MAP_ */")


typedef enum CorDebugThreadState
{
    THREAD_RUN,
    THREAD_SUSPEND
} CorDebugThreadState;

typedef enum CorDebugCreateProcessFlags
{
    DEBUG_NO_SPECIAL_OPTIONS        = 0x0000
} CorDebugCreateProcessFlags;

[
    object,
    local,
    uuid(CC7BCAF7-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugValue : IUnknown
{
    HRESULT GetType([out] CorElementType *pType);
    HRESULT GetSize([out] ULONG32 *pSize);
    HRESULT GetAddress([out] CORDB_ADDRESS *pAddress);
    HRESULT CreateBreakpoint([out] ICorDebugValueBreakpoint **ppBreakpoint);
};

[
    object,
    local,
    uuid(938c6d66-7fb6-4f69-b389-425b8987329b),
    pointer_default(unique)
]
interface ICorDebugThread : IUnknown
{
    HRESULT GetProcess([out] ICorDebugProcess **ppProcess);
    HRESULT GetID([out] DWORD *pdwThreadId);
    HRESULT GetHandle([out] HTHREAD *phThreadHandle);
    HRESULT GetAppDomain([out] ICorDebugAppDomain **ppAppDomain);
    HRESULT SetDebugState([in] CorDebugThreadState state);
    HRESULT GetDebugState([out] CorDebugThreadState *pState);

    typedef enum CorDebugUserState
    {
        USER_STOP_REQUESTED     = 0x01,
        USER_SUSPEND_REQUESTED  = 0x02,
        USER_BACKGROUND         = 0x04,
        USER_UNSTARTED          = 0x08,
        USER_STOPPED            = 0x10,
        USER_WAIT_SLEEP_JOIN    = 0x20,
        USER_SUSPENDED          = 0x40,

        USER_UNSAFE_POINT       = 0x80,
    } CorDebugUserState;

    HRESULT GetUserState([out] CorDebugUserState *pState);
    HRESULT GetCurrentException([out] ICorDebugValue **ppExceptionObject);
    HRESULT ClearCurrentException();
    HRESULT CreateStepper([out] ICorDebugStepper **ppStepper);
    HRESULT EnumerateChains([out] ICorDebugChainEnum **ppChains);
    HRESULT GetActiveChain([out] ICorDebugChain **ppChain);
    HRESULT GetActiveFrame([out] ICorDebugFrame **ppFrame);
    HRESULT GetRegisterSet([out] ICorDebugRegisterSet **ppRegisters);
    HRESULT CreateEval([out] ICorDebugEval **ppEval);
    HRESULT GetObject([out] ICorDebugValue **ppObject);
};

[
    object,
    local,
    uuid(3d6f5f62-7538-11d3-8d5b-00104b35e7ef),
    pointer_default(unique)
]

interface ICorDebugController : IUnknown
{
    HRESULT Stop([in] DWORD dwTimeoutIgnored);
    HRESULT Continue([in] BOOL fIsOutOfBand);
    HRESULT IsRunning([out] BOOL *pbRunning);
    HRESULT HasQueuedCallbacks([in] ICorDebugThread *pThread,
                               [out] BOOL *pbQueued);
    HRESULT EnumerateThreads([out] ICorDebugThreadEnum **ppThreads);
    HRESULT SetAllThreadsDebugState([in] CorDebugThreadState state,
                                    [in] ICorDebugThread *pExceptThisThread);
    HRESULT Detach();
    HRESULT Terminate([in] UINT exitCode);
    HRESULT CanCommitChanges([in] ULONG cSnapshots,
                             [in] ICorDebugEditAndContinueSnapshot *pSnapshots[],
                             [out] ICorDebugErrorInfoEnum **pError);
    HRESULT CommitChanges([in] ULONG cSnapshots,
                          [in] ICorDebugEditAndContinueSnapshot *pSnapshots[],
                          [out] ICorDebugErrorInfoEnum **pError);
};

[
    object,
    local,
    uuid(3d6f5f64-7538-11d3-8d5b-00104b35e7ef),
    pointer_default(unique)
]
interface ICorDebugProcess : ICorDebugController
{
    HRESULT GetID([out] DWORD *pdwProcessId);
    HRESULT GetHandle([out] HPROCESS *phProcessHandle);
    HRESULT GetThread([in] DWORD dwThreadId, [out] ICorDebugThread **ppThread);
    HRESULT EnumerateObjects([out] ICorDebugObjectEnum **ppObjects);
    HRESULT IsTransitionStub([in] CORDB_ADDRESS address, [out] BOOL *pbTransitionStub);
    HRESULT IsOSSuspended([in] DWORD threadID, [out] BOOL *pbSuspended);
    HRESULT GetThreadContext([in] DWORD threadID, [in] ULONG32 contextSize,
                             [in, out] BYTE context[]);
    HRESULT SetThreadContext([in] DWORD threadID, [in] ULONG32 contextSize, [in] BYTE context[]);
    HRESULT ReadMemory([in] CORDB_ADDRESS address, [in] DWORD size, [out] BYTE buffer[], [out] SIZE_T *read);
    HRESULT WriteMemory([in] CORDB_ADDRESS address, [in] DWORD size, [in] BYTE buffer[], [out] SIZE_T *written);
    HRESULT ClearCurrentException([in] DWORD threadID);
    HRESULT EnableLogMessages([in]BOOL fOnOff);
    HRESULT ModifyLogSwitch([in] WCHAR *pLogSwitchName,
                            [in]LONG lLevel);
    HRESULT EnumerateAppDomains([out] ICorDebugAppDomainEnum **ppAppDomains);
    HRESULT GetObject([out] ICorDebugValue **ppObject);
    HRESULT ThreadForFiberCookie([in] DWORD fiberCookie, [out] ICorDebugThread **ppThread);
    HRESULT GetHelperThreadID([out] DWORD *pThreadID);
};

[
    object,
    local,
    uuid(3d6f5f63-7538-11d3-8d5b-00104b35e7ef),
    pointer_default(unique)
]
interface ICorDebugAppDomain : ICorDebugController
{
    HRESULT GetProcess([out] ICorDebugProcess **ppProcess);
    HRESULT EnumerateAssemblies([out] ICorDebugAssemblyEnum **ppAssemblies);
    HRESULT GetModuleFromMetaDataInterface([in] IUnknown *pIMetaData,
                                           [out] ICorDebugModule **ppModule);
    HRESULT EnumerateBreakpoints([out] ICorDebugBreakpointEnum **ppBreakpoints);
    HRESULT EnumerateSteppers([out] ICorDebugStepperEnum **ppSteppers);
    HRESULT IsAttached([out] BOOL *pbAttached);
    HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]);
    HRESULT GetObject([out] ICorDebugValue **ppObject);
    HRESULT Attach();
    HRESULT GetID([out] ULONG32 *pId);
};

[
    object,
    local,
    uuid(3d6f5f60-7538-11d3-8d5b-00104b35e7ef),
    pointer_default(unique)
]
interface ICorDebugManagedCallback : IUnknown
{
    HRESULT Breakpoint([in] ICorDebugAppDomain *pAppDomain,
                       [in] ICorDebugThread *pThread,
                       [in] ICorDebugBreakpoint *pBreakpoint);

    typedef enum CorDebugStepReason
    {
        STEP_NORMAL,
        STEP_RETURN,
        STEP_CALL,
        STEP_EXCEPTION_FILTER,
        STEP_EXCEPTION_HANDLER,
        STEP_INTERCEPT,
        STEP_EXIT
    } CorDebugStepReason;

    HRESULT StepComplete([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                         [in] ICorDebugStepper *pStepper, [in] CorDebugStepReason reason);
    HRESULT Break([in] ICorDebugAppDomain *pAppDomain,
                  [in] ICorDebugThread *thread);
    HRESULT Exception([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                      [in] BOOL unhandled);
    HRESULT EvalComplete([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                         [in] ICorDebugEval *pEval);
    HRESULT EvalException([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                          [in] ICorDebugEval *pEval);
    HRESULT CreateProcess([in] ICorDebugProcess *pProcess);
    HRESULT ExitProcess([in] ICorDebugProcess *pProcess);
    HRESULT CreateThread([in] ICorDebugAppDomain *pAppDomain,[in] ICorDebugThread *thread);
    HRESULT ExitThread([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *thread);
    HRESULT LoadModule([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugModule *pModule);
    HRESULT UnloadModule([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugModule *pModule);
    HRESULT LoadClass([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugClass *c);
    HRESULT UnloadClass([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugClass *c);
    HRESULT DebuggerError([in] ICorDebugProcess *pProcess, [in] HRESULT errorHR,
                          [in] DWORD errorCode);

    typedef enum LoggingLevelEnum
    {
        LTraceLevel0   = 0,
        LTraceLevel1,
        LTraceLevel2,
        LTraceLevel3,
        LTraceLevel4,
        LStatusLevel0  = 20,
        LStatusLevel1,
        LStatusLevel2,
        LStatusLevel3,
        LStatusLevel4,
        LWarningLevel  = 40,
        LErrorLevel    = 50,
        LPanicLevel    = 100
    } LoggingLevelEnum;

    typedef enum LogSwitchCallReason
    {
        SWITCH_CREATE,
        SWITCH_MODIFY,
        SWITCH_DELETE
    } LogSwitchCallReason;

    HRESULT LogMessage([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                       [in] LONG lLevel, [in] WCHAR *pLogSwitchName, [in] WCHAR *pMessage);
    HRESULT LogSwitch([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                      [in] LONG lLevel, [in] ULONG ulReason, [in] WCHAR *pLogSwitchName,
                      [in] WCHAR *pParentName);
    HRESULT CreateAppDomain([in] ICorDebugProcess *pProcess, [in] ICorDebugAppDomain *pAppDomain);
    HRESULT ExitAppDomain([in] ICorDebugProcess *pProcess, [in] ICorDebugAppDomain *pAppDomain);
    HRESULT LoadAssembly([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugAssembly *pAssembly);
    HRESULT UnloadAssembly([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugAssembly *pAssembly);
    HRESULT ControlCTrap([in] ICorDebugProcess *pProcess);
    HRESULT NameChange([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread);
    HRESULT UpdateModuleSymbols([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugModule *pModule,
                                [in] IStream *pSymbolStream);
    HRESULT EditAndContinueRemap([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                                 [in] ICorDebugFunction *pFunction, [in] BOOL fAccurate);

    HRESULT BreakpointSetError([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                               [in] ICorDebugBreakpoint *pBreakpoint, [in] DWORD dwError);
};

[
    object,
    local,
    uuid(250E5EEA-DB5C-4C76-B6F3-8C46F12E3203),
    pointer_default(unique)
]
interface ICorDebugManagedCallback2 : IUnknown
{
    HRESULT FunctionRemapOpportunity([in] ICorDebugAppDomain *pAppDomain,
                   [in] ICorDebugThread *pThread, [in] ICorDebugFunction *pOldFunction,
                   [in] ICorDebugFunction *pNewFunction, [in] ULONG32 oldILOffset);

    HRESULT CreateConnection([in] ICorDebugProcess *pProcess, [in] CONNID dwConnectionId,
                                [in] WCHAR *pConnName);

    HRESULT ChangeConnection([in] ICorDebugProcess *pProcess, [in] CONNID dwConnectionId );

    HRESULT DestroyConnection([in] ICorDebugProcess *pProcess, [in] CONNID dwConnectionId );


    typedef enum CorDebugExceptionCallbackType
    {
        DEBUG_EXCEPTION_FIRST_CHANCE = 1,
        DEBUG_EXCEPTION_USER_FIRST_CHANCE = 2,
        DEBUG_EXCEPTION_CATCH_HANDLER_FOUND = 3,
        DEBUG_EXCEPTION_UNHANDLED = 4
    } CorDebugExceptionCallbackType;

    typedef enum CorDebugExceptionFlags
    {
        DEBUG_EXCEPTION_CAN_BE_INTERCEPTED = 0x0001
    } CorDebugExceptionFlags;

    HRESULT Exception( [in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                       [in] ICorDebugFrame *pFrame, [in] ULONG32 nOffset,
                       [in] CorDebugExceptionCallbackType dwEventType, [in] DWORD dwFlags );

    typedef enum CorDebugExceptionUnwindCallbackType
    {
        DEBUG_EXCEPTION_UNWIND_BEGIN = 1,
        DEBUG_EXCEPTION_INTERCEPTED = 2
    } CorDebugExceptionUnwindCallbackType;

    HRESULT ExceptionUnwind( [in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread,
                             [in] CorDebugExceptionUnwindCallbackType dwEventType,
                             [in] DWORD dwFlags );

    HRESULT FunctionRemapComplete([in] ICorDebugAppDomain *pAppDomain,
                             [in] ICorDebugThread *pThread, [in] ICorDebugFunction *pFunction);

    HRESULT MDANotification([in] ICorDebugController * pController,
                            [in] ICorDebugThread *pThread, [in] ICorDebugMDA * pMDA
    );

};
[
    object,
    local,
    uuid(3d6f5f61-7538-11d3-8d5b-00104b35e7ef),
    pointer_default(unique)
]
interface ICorDebug : IUnknown
{
    HRESULT Initialize();
    HRESULT Terminate();
    HRESULT SetManagedHandler([in] ICorDebugManagedCallback *pCallback);
    HRESULT SetUnmanagedHandler([in] ICorDebugUnmanagedCallback *pCallback);
    HRESULT CreateProcess([in] LPCWSTR lpApplicationName, [in] LPWSTR lpCommandLine,
                          [in] LPSECURITY_ATTRIBUTES lpProcessAttributes,
                          [in] LPSECURITY_ATTRIBUTES lpThreadAttributes,
                          [in] BOOL bInheritHandles, [in] DWORD dwCreationFlags,
                          [in] PVOID lpEnvironment, [in] LPCWSTR lpCurrentDirectory,
                          [in] LPSTARTUPINFOW lpStartupInfo,
                          [in] LPPROCESS_INFORMATION lpProcessInformation,
                          [in] CorDebugCreateProcessFlags debuggingFlags,
                          [out] ICorDebugProcess **ppProcess);

    HRESULT DebugActiveProcess([in] DWORD id, [in] BOOL win32Attach,
                               [out] ICorDebugProcess **ppProcess);
    HRESULT EnumerateProcesses([out] ICorDebugProcessEnum **ppProcess);
    HRESULT GetProcess([in] DWORD dwProcessId, [out] ICorDebugProcess **ppProcess);
    HRESULT CanLaunchOrAttach([in] DWORD dwProcessId, [in] BOOL win32DebuggingEnabled);
};


[
    object,
    local,
    uuid(CC7BCAE8-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugBreakpoint : IUnknown
{
    HRESULT Activate([in] BOOL bActive);
    HRESULT IsActive([out] BOOL *pbActive);
};

[
    object,
    local,
    uuid(CC7BCAE9-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugFunctionBreakpoint : ICorDebugBreakpoint
{
    HRESULT GetFunction([out] ICorDebugFunction **ppFunction);
    HRESULT GetOffset([out] ULONG32 *pnOffset);
};

[
    object,
    local,
    uuid(CC7BCAEA-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugModuleBreakpoint : ICorDebugBreakpoint
{
    HRESULT GetModule([out] ICorDebugModule **ppModule);
};

[
    object,
    local,
    uuid(CC7BCAEB-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugValueBreakpoint : ICorDebugBreakpoint
{
    HRESULT GetValue([out] ICorDebugValue **ppValue);
};

[
    object,
    local,
    uuid(CC7BCAEC-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugStepper : IUnknown
{
    HRESULT IsActive([out] BOOL *pbActive);
    HRESULT Deactivate();

    typedef enum CorDebugIntercept
    {
          INTERCEPT_NONE                = 0x0 ,
          INTERCEPT_CLASS_INIT          = 0x01,
          INTERCEPT_EXCEPTION_FILTER    = 0x02,
          INTERCEPT_SECURITY            = 0x04,
          INTERCEPT_CONTEXT_POLICY      = 0x08,
          INTERCEPT_INTERCEPTION        = 0x10,
          INTERCEPT_ALL                 = 0xffff
    } CorDebugIntercept;

    HRESULT SetInterceptMask([in] CorDebugIntercept mask);

    typedef enum CorDebugUnmappedStop
    {
        STOP_NONE               = 0x0,
        STOP_PROLOG             = 0x01,
        STOP_EPILOG             = 0x02,
        STOP_NO_MAPPING_INFO    = 0x04,
        STOP_OTHER_UNMAPPED     = 0x08,
        STOP_UNMANAGED          = 0x10,

        STOP_ALL                = 0xffff,

    } CorDebugUnmappedStop;

    HRESULT SetUnmappedStopMask([in] CorDebugUnmappedStop mask);
    HRESULT Step([in] BOOL bStepIn);

    typedef struct COR_DEBUG_STEP_RANGE
    {
        ULONG32 startOffset, endOffset;
    } COR_DEBUG_STEP_RANGE;

    HRESULT StepRange([in] BOOL bStepIn, [in] COR_DEBUG_STEP_RANGE ranges[], [in] ULONG32 cRangeCount);
    HRESULT StepOut();
    HRESULT SetRangeIL([in] BOOL bIL);
};

[
    object,
    local,
    uuid(CC7BCB01-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugEnum : IUnknown
{
    HRESULT Skip([in] ULONG celt);
    HRESULT Reset();
    HRESULT Clone([out] ICorDebugEnum **ppEnum);
    HRESULT GetCount([out] ULONG *pcelt);
};

[
    object,
    local,
    uuid(63ca1b24-4359-4883-bd57-13f815f58744),
    pointer_default(unique)
]

interface ICorDebugAppDomainEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugAppDomain *values[], [out] ULONG *pceltFetched);

};

[
    object,
    local,
    uuid(4a2a1ec9-85ec-4bfb-9f15-a89fdfe0fe83),
    pointer_default(unique)
]
interface ICorDebugAssemblyEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugAssembly *values[], [out] ULONG *pceltFetched);

};

[
    object,
    local,
    uuid(CC7BCB03-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugBreakpointEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugBreakpoint *breakpoints[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB08-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugChainEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugChain *chains[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(F0E18809-72B5-11d2-976F-00A0C9B4D50C),
    pointer_default(unique)
]
interface ICorDebugErrorInfoEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugEditAndContinueErrorInfo *errors[],
                 [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB07-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugFrameEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugFrame *frames[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB09-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugModuleEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugModule *modules[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB02-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugObjectEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] CORDB_ADDRESS objects[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB05-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugProcessEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugProcess *processes[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB04-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugStepperEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugStepper *steppers[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCB06-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugThreadEnum : ICorDebugEnum
{
    HRESULT Next([in] ULONG celt, [out] ICorDebugThread *threads[], [out] ULONG *pceltFetched);
};

[
    object,
    local,
    uuid(CC7BCAEE-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugChain : IUnknown
{
    HRESULT GetThread([out] ICorDebugThread **ppThread);
    HRESULT GetStackRange([out] CORDB_ADDRESS *pStart, [out] CORDB_ADDRESS *pEnd);
    HRESULT GetContext([out] ICorDebugContext **ppContext);
    HRESULT GetCaller([out] ICorDebugChain **ppChain);
    HRESULT GetCallee([out] ICorDebugChain **ppChain);
    HRESULT GetPrevious([out] ICorDebugChain **ppChain);
    HRESULT GetNext([out] ICorDebugChain **ppChain);
    HRESULT IsManaged([out] BOOL *pManaged);
    HRESULT EnumerateFrames([out] ICorDebugFrameEnum **ppFrames);
    HRESULT GetActiveFrame([out] ICorDebugFrame **ppFrame);
    HRESULT GetRegisterSet([out] ICorDebugRegisterSet **ppRegisters);
    typedef enum CorDebugChainReason
    {
        CHAIN_NONE              = 0x000,
        CHAIN_CLASS_INIT        = 0x001,
        CHAIN_EXCEPTION_FILTER  = 0x002,
        CHAIN_SECURITY          = 0x004,
        CHAIN_CONTEXT_POLICY    = 0x008,
        CHAIN_INTERCEPTION      = 0x010,
        CHAIN_PROCESS_START     = 0x020,
        CHAIN_THREAD_START      = 0x040,
        CHAIN_ENTER_MANAGED     = 0x080,
        CHAIN_ENTER_UNMANAGED   = 0x100,
        CHAIN_DEBUGGER_EVAL     = 0x200,
        CHAIN_CONTEXT_SWITCH    = 0x400,
        CHAIN_FUNC_EVAL         = 0x800,
    } CorDebugChainReason;

    HRESULT GetReason([out] CorDebugChainReason *pReason);
};

[
    object,
    local,
    uuid(CC7BCAEF-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugFrame : IUnknown
{
    HRESULT GetChain([out] ICorDebugChain **ppChain);
    HRESULT GetCode([out] ICorDebugCode **ppCode);
    HRESULT GetFunction([out] ICorDebugFunction **ppFunction);
    HRESULT GetFunctionToken([out] mdMethodDef *pToken);
    HRESULT GetStackRange([out] CORDB_ADDRESS *pStart, [out] CORDB_ADDRESS *pEnd);
    HRESULT GetCaller([out] ICorDebugFrame **ppFrame);
    HRESULT GetCallee([out] ICorDebugFrame **ppFrame);
    HRESULT CreateStepper([out] ICorDebugStepper **ppStepper);
};


[
    object,
    local,
    uuid(CC7BCB0B-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugRegisterSet : IUnknown
{
    typedef enum CorDebugRegister
    {
        REGISTER_INSTRUCTION_POINTER = 0,
        REGISTER_STACK_POINTER,
        REGISTER_FRAME_POINTER,

        REGISTER_X86_EIP = 0,
        REGISTER_X86_ESP,
        REGISTER_X86_EBP,

        REGISTER_X86_EAX,
        REGISTER_X86_ECX,
        REGISTER_X86_EDX,
        REGISTER_X86_EBX,

        REGISTER_X86_ESI,
        REGISTER_X86_EDI,

        REGISTER_X86_FPSTACK_0,
        REGISTER_X86_FPSTACK_1,
        REGISTER_X86_FPSTACK_2,
        REGISTER_X86_FPSTACK_3,
        REGISTER_X86_FPSTACK_4,
        REGISTER_X86_FPSTACK_5,
        REGISTER_X86_FPSTACK_6,
        REGISTER_X86_FPSTACK_7,

        REGISTER_AMD64_RIP = 0,
        REGISTER_AMD64_RSP,
        REGISTER_AMD64_RBP,

        REGISTER_AMD64_RAX,
        REGISTER_AMD64_RCX,
        REGISTER_AMD64_RDX,
        REGISTER_AMD64_RBX,

        REGISTER_AMD64_RSI,
        REGISTER_AMD64_RDI,

        REGISTER_AMD64_R8,
        REGISTER_AMD64_R9,
        REGISTER_AMD64_R10,
        REGISTER_AMD64_R11,
        REGISTER_AMD64_R12,
        REGISTER_AMD64_R13,
        REGISTER_AMD64_R14,
        REGISTER_AMD64_R15,

        REGISTER_AMD64_XMM0,
        REGISTER_AMD64_XMM1,
        REGISTER_AMD64_XMM2,
        REGISTER_AMD64_XMM3,
        REGISTER_AMD64_XMM4,
        REGISTER_AMD64_XMM5,
        REGISTER_AMD64_XMM6,
        REGISTER_AMD64_XMM7,
        REGISTER_AMD64_XMM8,
        REGISTER_AMD64_XMM9,
        REGISTER_AMD64_XMM10,
        REGISTER_AMD64_XMM11,
        REGISTER_AMD64_XMM12,
        REGISTER_AMD64_XMM13,
        REGISTER_AMD64_XMM14,
        REGISTER_AMD64_XMM15,

        REGISTER_IA64_BSP = REGISTER_FRAME_POINTER,

        REGISTER_IA64_R0  = REGISTER_IA64_BSP + 1,
        REGISTER_IA64_F0  = REGISTER_IA64_R0  + 128,

    } CorDebugRegister;

    HRESULT GetRegistersAvailable([out] ULONG64 *pAvailable);

    HRESULT GetRegisters([in] ULONG64 mask, [in] ULONG32 regCount,
                         [out] CORDB_REGISTER regBuffer[]);
    HRESULT SetRegisters([in] ULONG64 mask, [in] ULONG32 regCount,
                         [in] CORDB_REGISTER regBuffer[]);
    HRESULT GetThreadContext([in] ULONG32 contextSize, [in, out] BYTE context[]);
    HRESULT SetThreadContext([in] ULONG32 contextSize, [in] BYTE context[]);
}

[
    object,
    local,
    uuid(CC7BCAF6-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugEval : IUnknown
{
    HRESULT CallFunction([in] ICorDebugFunction *pFunction, [in] ULONG32 nArgs,
                         [in] ICorDebugValue *ppArgs[]);
    HRESULT NewObject([in] ICorDebugFunction *pConstructor, [in] ULONG32 nArgs,
                      [in] ICorDebugValue *ppArgs[]);
    HRESULT NewObjectNoConstructor([in] ICorDebugClass *pClass);
    HRESULT NewString([in] LPCWSTR string);
    HRESULT NewArray([in] CorElementType elementType, [in] ICorDebugClass *pElementClass,
                     [in] ULONG32 rank, [in] ULONG32 dims[], [in] ULONG32 lowBounds[]);
    HRESULT IsActive([out] BOOL *pbActive);
    HRESULT Abort();
    HRESULT GetResult([out] ICorDebugValue **ppResult);
    HRESULT GetThread([out] ICorDebugThread **ppThread);
    HRESULT CreateValue([in] CorElementType elementType, [in] ICorDebugClass *pElementClass,
                        [out] ICorDebugValue **ppValue);
};

[
    object,
    local,
    uuid(6DC3FA01-D7CB-11d2-8A95-0080C792E5D8),
    pointer_default(unique)
]
interface ICorDebugEditAndContinueSnapshot : IUnknown
{
    HRESULT CopyMetaData([in] IStream *pIStream, [out] GUID *pMvid);
    HRESULT GetMvid([out] GUID *pMvid);
    HRESULT GetRoDataRVA([out] ULONG32 *pRoDataRVA);
    HRESULT GetRwDataRVA([out] ULONG32 *pRwDataRVA);
    HRESULT SetPEBytes([in] IStream *pIStream);
    HRESULT SetILMap([in] mdToken mdFunction, [in] ULONG cMapSize, [in] COR_IL_MAP map[]);
    HRESULT SetPESymbolBytes([in] IStream *pIStream);
};

[
    object,
    local,
    uuid(dba2d8c1-e5c5-4069-8c13-10a7c6abf43d),
    pointer_default(unique)
]
interface ICorDebugModule : IUnknown
{
    HRESULT GetProcess([out] ICorDebugProcess **ppProcess);
    HRESULT GetBaseAddress([out] CORDB_ADDRESS *pAddress);
    HRESULT GetAssembly([out] ICorDebugAssembly **ppAssembly);
    HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]);
    HRESULT EnableJITDebugging([in] BOOL bTrackJITInfo, [in] BOOL bAllowJitOpts);
    HRESULT EnableClassLoadCallbacks([in] BOOL bClassLoadCallbacks);
    HRESULT GetFunctionFromToken([in] mdMethodDef methodDef, [out] ICorDebugFunction **ppFunction);
    HRESULT GetFunctionFromRVA([in] CORDB_ADDRESS rva, [out] ICorDebugFunction **ppFunction);
    HRESULT GetClassFromToken([in] mdTypeDef typeDef, [out] ICorDebugClass **ppClass);
    HRESULT CreateBreakpoint([out] ICorDebugModuleBreakpoint **ppBreakpoint);
    HRESULT GetEditAndContinueSnapshot([out] ICorDebugEditAndContinueSnapshot **ppEditAndContinueSnapshot);
    HRESULT GetMetaDataInterface([in] REFIID riid, [out] IUnknown **ppObj);
    HRESULT GetToken([out] mdModule *pToken);
    HRESULT IsDynamic([out] BOOL *pDynamic);
    HRESULT GetGlobalVariableValue([in] mdFieldDef fieldDef, [out] ICorDebugValue **ppValue);
    HRESULT GetSize([out] ULONG32 *pcBytes);
    HRESULT IsInMemory([out] BOOL *pInMemory);
};

[
    object,
    local,
    uuid(CC7BCAF5-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugClass : IUnknown
{
    HRESULT GetModule([out] ICorDebugModule **pModule);
    HRESULT GetToken([out] mdTypeDef *pTypeDef);
    HRESULT GetStaticFieldValue([in] mdFieldDef fieldDef, [in] ICorDebugFrame *pFrame,
                                [out] ICorDebugValue **ppValue);
};

[
    object,
    local,
    uuid(df59507c-d47a-459e-bce2-6427eac8fd06),
    pointer_default(unique)
]
interface ICorDebugAssembly : IUnknown
{
    HRESULT GetProcess([out] ICorDebugProcess **ppProcess);
    HRESULT GetAppDomain([out] ICorDebugAppDomain **ppAppDomain);
    HRESULT EnumerateModules([out] ICorDebugModuleEnum **ppModules);
    HRESULT GetCodeBase([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]);
    HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]);
};


[
    object,
    local,
    uuid(CC7BCAF3-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugFunction : IUnknown
{
    HRESULT GetModule([out] ICorDebugModule **ppModule);
    HRESULT GetClass([out] ICorDebugClass **ppClass);
    HRESULT GetToken([out] mdMethodDef *pMethodDef);
    HRESULT GetILCode([out] ICorDebugCode **ppCode);
    HRESULT GetNativeCode([out] ICorDebugCode **ppCode);
    HRESULT CreateBreakpoint([out] ICorDebugFunctionBreakpoint **ppBreakpoint);
    HRESULT GetLocalVarSigToken([out] mdSignature *pmdSig);
    HRESULT GetCurrentVersionNumber([out] ULONG32 *pnCurrentVersion);
};

[
    object,
    local,
    uuid(5263E909-8CB5-11d3-BD2F-0000F80849BD),
    pointer_default(unique)
]
interface ICorDebugUnmanagedCallback : IUnknown
{
    HRESULT DebugEvent([in] LPDEBUG_EVENT pDebugEvent, [in] BOOL fOutOfBand);
};

[
    object,
    local,
    uuid(8D600D41-F4F6-4cb3-B7EC-7BD164944036),
    pointer_default(unique)
]
interface ICorDebugEditAndContinueErrorInfo : IUnknown
{
    HRESULT GetModule([out] ICorDebugModule **ppModule);
    HRESULT GetToken([out]mdToken *pToken);
    HRESULT GetErrorCode([out]HRESULT *pHr);
    HRESULT GetString([in] ULONG32 cchString, [out] ULONG32 *pcchString,
                      [out] WCHAR szString[]);
}

[
    object,
    local,
    uuid(18AD3D6E-B7D2-11d2-BD04-0000F80849BD),
    pointer_default(unique)
]
interface ICorDebugObjectValue : ICorDebugValue
{
    HRESULT GetClass([out] ICorDebugClass **ppClass);
    HRESULT GetFieldValue([in] ICorDebugClass *pClass, [in] mdFieldDef fieldDef,
                          [out] ICorDebugValue **ppValue);
    HRESULT GetVirtualMethod([in] mdMemberRef memberRef, [out] ICorDebugFunction **ppFunction);
    HRESULT GetContext([out] ICorDebugContext **ppContext);
    HRESULT IsValueClass([out] BOOL *pbIsValueClass);
    HRESULT GetManagedCopy([out] IUnknown **ppObject);
    HRESULT SetFromManagedCopy([in] IUnknown *pObject);
};

[
    object,
    local,
    uuid(CC7BCB00-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugContext : ICorDebugObjectValue
{
};

[
    object,
    local,
    uuid(CC7BCAF4-8A68-11d2-983C-0000F808342D),
    pointer_default(unique)
]
interface ICorDebugCode : IUnknown
{
    HRESULT IsIL([out] BOOL *pbIL);
    HRESULT GetFunction([out] ICorDebugFunction **ppFunction);
    HRESULT GetAddress([out] CORDB_ADDRESS *pStart);
    HRESULT GetSize([out] ULONG32 *pcBytes);
    HRESULT CreateBreakpoint([in] ULONG32 offset, [out] ICorDebugFunctionBreakpoint **ppBreakpoint);
    HRESULT GetCode([in] ULONG32 startOffset, [in] ULONG32 endOffset,
                    [in] ULONG32 cBufferAlloc, [out] BYTE buffer[], [out] ULONG32 *pcBufferSize);
    HRESULT GetVersionNumber([out] ULONG32 *nVersion);
    HRESULT GetILToNativeMapping([in] ULONG32 cMap, [out] ULONG32 *pcMap,
                                 [out] COR_DEBUG_IL_TO_NATIVE_MAP map[]);
    HRESULT GetEnCRemapSequencePoints([in] ULONG32 cMap,[out] ULONG32 *pcMap,
                                      [out] ULONG32 offsets[]);
};

[
    object,
    local,
    uuid(CC726F2F-1DB7-459b-B0EC-05F01D841B42),
    pointer_default(unique)
]
interface ICorDebugMDA : IUnknown
{
    HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 * pcchName, [out] WCHAR szName[]);

    HRESULT GetDescription([in] ULONG32 cchName, [out] ULONG32 * pcchName, [out] WCHAR szName[]);

    HRESULT GetXML([in] ULONG32 cchName, [out] ULONG32 * pcchName, [out] WCHAR szName[]);

    typedef enum CorDebugMDAFlags
    {
        MDA_FLAG_SLIP = 0x2
    } CorDebugMDAFlags;

    HRESULT GetFlags([in] CorDebugMDAFlags * pFlags);

    HRESULT GetOSThreadId([out] DWORD * pOsTid);
};
