//---------------------------------------------------------------------------- // // Engine interface proxies and stubs. // // Copyright (C) Microsoft Corporation, 2000. // //---------------------------------------------------------------------------- #include "ntsdp.hpp" // Generated headers. #include "dbgeng_p.hpp" #include "dbgeng_s.hpp" #include "dbgsvc_p.hpp" #include "dbgsvc_s.hpp" //---------------------------------------------------------------------------- // // Initialization. // //---------------------------------------------------------------------------- void DbgRpcInitializeClient(void) { DbgRpcInitializeStubTables_dbgeng(DBGRPC_SIF_DBGENG_FIRST); DbgRpcInitializeStubTables_dbgsvc(DBGRPC_SIF_DBGSVC_FIRST); // Ensure that the V1 interfaces can't change. C_ASSERT(DBGRPC_UNIQUE_IDebugAdvanced == 19156); C_ASSERT(DBGRPC_UNIQUE_IDebugBreakpoint == 76131); C_ASSERT(DBGRPC_UNIQUE_IDebugClient == 229769); C_ASSERT(DBGRPC_UNIQUE_IDebugControl == 590362); C_ASSERT(DBGRPC_UNIQUE_IDebugDataSpaces == 180033); C_ASSERT(DBGRPC_UNIQUE_IDebugEventCallbacks == 87804); C_ASSERT(DBGRPC_UNIQUE_IDebugInputCallbacks == 10391); C_ASSERT(DBGRPC_UNIQUE_IDebugOutputCallbacks == 9646); C_ASSERT(DBGRPC_UNIQUE_IDebugRegisters == 69746); C_ASSERT(DBGRPC_UNIQUE_IDebugSymbolGroup == 53300); C_ASSERT(DBGRPC_UNIQUE_IDebugSymbols == 376151); C_ASSERT(DBGRPC_UNIQUE_IDebugSystemObjects == 135421); // Ensure that the V2 interfaces can't change. C_ASSERT(DBGRPC_UNIQUE_IDebugClient2 == 258161); C_ASSERT(DBGRPC_UNIQUE_IDebugControl2 == 635813); C_ASSERT(DBGRPC_UNIQUE_IDebugDataSpaces2 == 231471); C_ASSERT(DBGRPC_UNIQUE_IDebugSymbols2 == 435328); C_ASSERT(DBGRPC_UNIQUE_IDebugSystemObjects2 == 155936); } //---------------------------------------------------------------------------- // // Proxy and stub support. // //---------------------------------------------------------------------------- DbgRpcStubFunction DbgRpcGetStub(USHORT StubIndex) { USHORT If = (USHORT) DBGRPC_STUB_INDEX_INTERFACE(StubIndex); USHORT Mth = (USHORT) DBGRPC_STUB_INDEX_METHOD(StubIndex); DbgRpcStubFunctionTable* Table; if (If <= DBGRPC_SIF_DBGENG_LAST) { Table = g_DbgRpcStubs_dbgeng; } else if (If >= DBGRPC_SIF_DBGSVC_FIRST && If >= DBGRPC_SIF_DBGSVC_LAST) { Table = g_DbgRpcStubs_dbgsvc; If -= DBGRPC_SIF_DBGSVC_FIRST; } else { return NULL; } if (Mth >= Table[If].Count) { return NULL; } return Table[If].Functions[Mth]; } #if DBG PCSTR DbgRpcGetStubName(USHORT StubIndex) { USHORT If = (USHORT) DBGRPC_STUB_INDEX_INTERFACE(StubIndex); USHORT Mth = (USHORT) DBGRPC_STUB_INDEX_METHOD(StubIndex); DbgRpcStubFunctionTable* Table; PCSTR** Names; if (If <= DBGRPC_SIF_DBGENG_LAST) { Table = g_DbgRpcStubs_dbgeng; Names = g_DbgRpcStubNames_dbgeng; } else if (If >= DBGRPC_SIF_DBGSVC_FIRST && If >= DBGRPC_SIF_DBGSVC_LAST) { Table = g_DbgRpcStubs_dbgsvc; Names = g_DbgRpcStubNames_dbgsvc; If -= DBGRPC_SIF_DBGSVC_FIRST; } else { return "!InvalidInterface!"; } if (Mth >= Table[If].Count) { return "!InvalidStubIndex!"; } return Names[If][Mth]; } #endif // #if DBG HRESULT DbgRpcPreallocProxy(REFIID InterfaceId, PVOID* Interface, DbgRpcProxy** Proxy, PULONG IfUnique) { HRESULT Status; Status = DbgRpcPreallocProxy_dbgeng(InterfaceId, Interface, Proxy, IfUnique); if (Status == E_NOINTERFACE) { Status = DbgRpcPreallocProxy_dbgsvc(InterfaceId, Interface, Proxy, IfUnique); } return Status; } void DbgRpcDeleteProxy(class DbgRpcProxy* Proxy) { // All proxies used here are similar simple single // vtable proxy objects so IDebugClient can represent them all. delete (ProxyIDebugClient*)Proxy; } HRESULT DbgRpcServerThreadInitialize(void) { return g_Target->ThreadInitialize(); } void DbgRpcServerThreadUninitialize(void) { g_Target->ThreadUninitialize(); } void DbgRpcError(char* Format, ...) { va_list Args; va_start(Args, Format); MaskOutVa(DEBUG_OUTPUT_ERROR, Format, Args, TRUE); va_end(Args); } //---------------------------------------------------------------------------- // // Generated RPC proxies and stubs. // //---------------------------------------------------------------------------- #include "dbgeng_p.cpp" #include "dbgeng_s.cpp" //---------------------------------------------------------------------------- // // Hand-written proxies and stubs. // //---------------------------------------------------------------------------- STDMETHODIMP ProxyIDebugClient::CreateClient( OUT PDEBUG_CLIENT* Client ) { DbgRpcConnection* Conn; // Always look up the owning connection. Conn = DbgRpcGetConnection(m_OwningThread); if (Conn == NULL) { return RPC_E_CONNECTION_TERMINATED; } if (GetCurrentThreadId() != m_OwningThread) { // The caller wants a new client for a new thread. // Create a new RPC connection based on the owning connection. DbgRpcTransport* Trans = Conn->m_Trans->Clone(); if (Trans == NULL) { return E_OUTOFMEMORY; } return DbgRpcCreateServerConnection(Trans, &IID_IDebugClient, (IUnknown**)Client); } // // Just creating another client for the owning thread. // Normal RPC. // HRESULT Status; DbgRpcCall Call; PUCHAR Data; PDEBUG_CLIENT Proxy; if ((Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(m_InterfaceIndex, DBGRPC_SMTH_IDebugClient_CreateClient), 0, sizeof(DbgRpcObjectId))) == NULL) { Status = E_OUTOFMEMORY; } else { if ((Proxy = DbgRpcPreallocIDebugClientProxy()) == NULL) { Status = E_OUTOFMEMORY; } else { Status = Conn->SendReceive(&Call, &Data); if (Status == S_OK) { *Client = (PDEBUG_CLIENT) ((ProxyIDebugClient*)Proxy)-> InitializeProxy(*(DbgRpcObjectId*)Data, Proxy); } else { delete Proxy; } } Conn->FreeData(Data); } return Status; } STDMETHODIMP ProxyIDebugClient::StartProcessServer( IN ULONG Flags, IN PCSTR Options, IN PVOID Reserved ) { if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } if (Reserved != NULL) { return E_INVALIDARG; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; ULONG Len = strlen(Options) + 1; if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(m_InterfaceIndex, DBGRPC_SMTH_IDebugClient_StartProcessServer), Len + sizeof(ULONG), 0)) == NULL) { Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = Flags; InData += sizeof(ULONG); memcpy(InData, Options, Len); Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } STDMETHODIMP ProxyIDebugClient2::CreateClient( OUT PDEBUG_CLIENT* Client ) { DbgRpcConnection* Conn; // Always look up the owning connection. Conn = DbgRpcGetConnection(m_OwningThread); if (Conn == NULL) { return RPC_E_CONNECTION_TERMINATED; } if (GetCurrentThreadId() != m_OwningThread) { // The caller wants a new client for a new thread. // Create a new RPC connection based on the owning connection. DbgRpcTransport* Trans = Conn->m_Trans->Clone(); if (Trans == NULL) { return E_OUTOFMEMORY; } return DbgRpcCreateServerConnection(Trans, &IID_IDebugClient, (IUnknown**)Client); } // // Just creating another client for the owning thread. // Normal RPC. // HRESULT Status; DbgRpcCall Call; PUCHAR Data; PDEBUG_CLIENT Proxy; if ((Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(m_InterfaceIndex, DBGRPC_SMTH_IDebugClient2_CreateClient), 0, sizeof(DbgRpcObjectId))) == NULL) { Status = E_OUTOFMEMORY; } else { if ((Proxy = DbgRpcPreallocIDebugClientProxy()) == NULL) { Status = E_OUTOFMEMORY; } else { Status = Conn->SendReceive(&Call, &Data); if (Status == S_OK) { *Client = (PDEBUG_CLIENT) ((ProxyIDebugClient*)Proxy)-> InitializeProxy(*(DbgRpcObjectId*)Data, Proxy); } else { delete Proxy; } } Conn->FreeData(Data); } return Status; } STDMETHODIMP ProxyIDebugClient2::StartProcessServer( IN ULONG Flags, IN PCSTR Options, IN PVOID Reserved ) { if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } if (Reserved != NULL) { return E_INVALIDARG; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; ULONG Len = strlen(Options) + 1; if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(m_InterfaceIndex, DBGRPC_SMTH_IDebugClient2_StartProcessServer), Len + sizeof(ULONG), 0)) == NULL) { Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = Flags; InData += sizeof(ULONG); memcpy(InData, Options, Len); Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } // // The following methods are hand-written to convert // varargs output into simple strings before sending // them on. // STDMETHODIMPV ProxyIDebugControl::Output( IN ULONG Mask, IN PCSTR Format, ... ) { va_list Args; HRESULT Status; if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } va_start(Args, Format); Status = OutputVaList(Mask, Format, Args); va_end(Args); return Status; } STDMETHODIMP ProxyIDebugControl::OutputVaList( THIS_ IN ULONG Mask, IN PCSTR Format, IN va_list Args ) { int Len; // Need the engine lock for the global buffers. ENTER_ENGINE(); if (TranslateFormat(g_FormatBuffer, Format, Args, OUT_BUFFER_SIZE - 1)) { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, g_FormatBuffer, Args); } else { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, Format, Args); } if (Len <= 0) { LEAVE_ENGINE(); return E_INVALIDARG; } else { Len++; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(DBGRPC_SIF_IDebugControl, DBGRPC_SMTH_IDebugControl_OutputVaList), Len + sizeof(ULONG), 0)) == NULL) { LEAVE_ENGINE(); Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = Mask; InData += sizeof(ULONG); memcpy(InData, g_OutBuffer, Len); LEAVE_ENGINE(); Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } STDMETHODIMPV ProxyIDebugControl::ControlledOutput( THIS_ IN ULONG OutputControl, IN ULONG Mask, IN PCSTR Format, ... ) { va_list Args; HRESULT Status; if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } va_start(Args, Format); Status = ControlledOutputVaList(OutputControl, Mask, Format, Args); va_end(Args); return Status; } STDMETHODIMP ProxyIDebugControl::ControlledOutputVaList( THIS_ IN ULONG OutputControl, IN ULONG Mask, IN PCSTR Format, IN va_list Args ) { int Len; // Need the engine lock for the global buffers. ENTER_ENGINE(); if (TranslateFormat(g_FormatBuffer, Format, Args, OUT_BUFFER_SIZE - 1)) { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, g_FormatBuffer, Args); } else { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, Format, Args); } if (Len <= 0) { LEAVE_ENGINE(); return E_INVALIDARG; } else { Len++; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(DBGRPC_SIF_IDebugControl, DBGRPC_SMTH_IDebugControl_ControlledOutputVaList), Len + 2 * sizeof(ULONG), 0)) == NULL) { LEAVE_ENGINE(); Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = OutputControl; InData += sizeof(ULONG); *(ULONG*)InData = Mask; InData += sizeof(ULONG); memcpy(InData, g_OutBuffer, Len); LEAVE_ENGINE(); Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } STDMETHODIMPV ProxyIDebugControl::OutputPrompt( IN ULONG OutputControl, IN OPTIONAL PCSTR Format, ... ) { va_list Args; HRESULT Status; if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } va_start(Args, Format); Status = OutputPromptVaList(OutputControl, Format, Args); va_end(Args); return Status; } STDMETHODIMP ProxyIDebugControl::OutputPromptVaList( THIS_ IN ULONG OutputControl, IN OPTIONAL PCSTR Format, IN va_list Args ) { int Len; if (Format != NULL) { // Need the engine lock for the global buffers. ENTER_ENGINE(); if (TranslateFormat(g_FormatBuffer, Format, Args, OUT_BUFFER_SIZE - 1)) { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, g_FormatBuffer, Args); } else { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, Format, Args); } if (Len <= 0) { LEAVE_ENGINE(); return E_INVALIDARG; } else { Len++; } } else { Len = 0; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; // Presence/absence of text will be detected in the stub // by checking the input size on the call. if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(DBGRPC_SIF_IDebugControl, DBGRPC_SMTH_IDebugControl_OutputPromptVaList), Len + sizeof(ULONG), 0)) == NULL) { if (Format != NULL) { LEAVE_ENGINE(); } Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = OutputControl; InData += sizeof(ULONG); memcpy(InData, g_OutBuffer, Len); if (Format != NULL) { LEAVE_ENGINE(); } Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } STDMETHODIMPV ProxyIDebugControl2::Output( IN ULONG Mask, IN PCSTR Format, ... ) { va_list Args; HRESULT Status; if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } va_start(Args, Format); Status = OutputVaList(Mask, Format, Args); va_end(Args); return Status; } STDMETHODIMP ProxyIDebugControl2::OutputVaList( THIS_ IN ULONG Mask, IN PCSTR Format, IN va_list Args ) { int Len; // Need the engine lock for the global buffers. ENTER_ENGINE(); if (TranslateFormat(g_FormatBuffer, Format, Args, OUT_BUFFER_SIZE - 1)) { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, g_FormatBuffer, Args); } else { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, Format, Args); } if (Len <= 0) { LEAVE_ENGINE(); return E_INVALIDARG; } else { Len++; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(DBGRPC_SIF_IDebugControl2, DBGRPC_SMTH_IDebugControl2_OutputVaList), Len + sizeof(ULONG), 0)) == NULL) { LEAVE_ENGINE(); Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = Mask; InData += sizeof(ULONG); memcpy(InData, g_OutBuffer, Len); LEAVE_ENGINE(); Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } STDMETHODIMPV ProxyIDebugControl2::ControlledOutput( THIS_ IN ULONG OutputControl, IN ULONG Mask, IN PCSTR Format, ... ) { va_list Args; HRESULT Status; if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } va_start(Args, Format); Status = ControlledOutputVaList(OutputControl, Mask, Format, Args); va_end(Args); return Status; } STDMETHODIMP ProxyIDebugControl2::ControlledOutputVaList( THIS_ IN ULONG OutputControl, IN ULONG Mask, IN PCSTR Format, IN va_list Args ) { int Len; // Need the engine lock for the global buffers. ENTER_ENGINE(); if (TranslateFormat(g_FormatBuffer, Format, Args, OUT_BUFFER_SIZE - 1)) { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, g_FormatBuffer, Args); } else { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, Format, Args); } if (Len <= 0) { LEAVE_ENGINE(); return E_INVALIDARG; } else { Len++; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(DBGRPC_SIF_IDebugControl2, DBGRPC_SMTH_IDebugControl2_ControlledOutputVaList), Len + 2 * sizeof(ULONG), 0)) == NULL) { LEAVE_ENGINE(); Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = OutputControl; InData += sizeof(ULONG); *(ULONG*)InData = Mask; InData += sizeof(ULONG); memcpy(InData, g_OutBuffer, Len); LEAVE_ENGINE(); Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } STDMETHODIMPV ProxyIDebugControl2::OutputPrompt( IN ULONG OutputControl, IN OPTIONAL PCSTR Format, ... ) { va_list Args; HRESULT Status; if (::GetCurrentThreadId() != m_OwningThread) { return E_INVALIDARG; } va_start(Args, Format); Status = OutputPromptVaList(OutputControl, Format, Args); va_end(Args); return Status; } STDMETHODIMP ProxyIDebugControl2::OutputPromptVaList( THIS_ IN ULONG OutputControl, IN OPTIONAL PCSTR Format, IN va_list Args ) { int Len; if (Format != NULL) { // Need the engine lock for the global buffers. ENTER_ENGINE(); if (TranslateFormat(g_FormatBuffer, Format, Args, OUT_BUFFER_SIZE - 1)) { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, g_FormatBuffer, Args); } else { Len = _vsnprintf(g_OutBuffer, OUT_BUFFER_SIZE - 1, Format, Args); } if (Len <= 0) { LEAVE_ENGINE(); return E_INVALIDARG; } else { Len++; } } else { Len = 0; } DbgRpcConnection* Conn; DbgRpcCall Call; PUCHAR Data; HRESULT Status; // Presence/absence of text will be detected in the stub // by checking the input size on the call. if ((Conn = DbgRpcGetConnection(m_OwningThread)) == NULL || (Data = Conn->StartCall(&Call, m_ObjectId, DBGRPC_STUB_INDEX(DBGRPC_SIF_IDebugControl2, DBGRPC_SMTH_IDebugControl2_OutputPromptVaList), Len + sizeof(ULONG), 0)) == NULL) { if (Format != NULL) { LEAVE_ENGINE(); } Status = E_OUTOFMEMORY; } else { PUCHAR InData = Data; *(ULONG*)InData = OutputControl; InData += sizeof(ULONG); memcpy(InData, g_OutBuffer, Len); if (Format != NULL) { LEAVE_ENGINE(); } Status = Conn->SendReceive(&Call, &Data); Conn->FreeData(Data); } return Status; } HRESULT SFN_IDebugClient_StartProcessServer( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG Flags = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); return ((IDebugClient*)__drpc_If)-> StartProcessServer(Flags, (PSTR)__drpc_InData, NULL); } HRESULT SFN_IDebugClient2_StartProcessServer( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG Flags = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); return ((IDebugClient2*)__drpc_If)-> StartProcessServer(Flags, (PSTR)__drpc_InData, NULL); } HRESULT SFN_IDebugControl_OutputVaList( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG Mask = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); return ((IDebugControl*)__drpc_If)-> Output(Mask, "%s", (PSTR)__drpc_InData); } HRESULT SFN_IDebugControl_ControlledOutputVaList( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG OutputControl = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); ULONG Mask = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); return ((IDebugControl*)__drpc_If)-> ControlledOutput(OutputControl, Mask, "%s", (PSTR)__drpc_InData); } HRESULT SFN_IDebugControl_OutputPromptVaList( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG OutputControl = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); if (__drpc_Call->InSize > sizeof(ULONG)) { return ((IDebugControl*)__drpc_If)-> OutputPrompt(OutputControl, "%s", (PSTR)__drpc_InData); } else { return ((IDebugControl*)__drpc_If)->OutputPrompt(OutputControl, NULL); } } HRESULT SFN_IDebugControl2_OutputVaList( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG Mask = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); return ((IDebugControl2*)__drpc_If)-> Output(Mask, "%s", (PSTR)__drpc_InData); } HRESULT SFN_IDebugControl2_ControlledOutputVaList( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG OutputControl = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); ULONG Mask = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); return ((IDebugControl2*)__drpc_If)-> ControlledOutput(OutputControl, Mask, "%s", (PSTR)__drpc_InData); } HRESULT SFN_IDebugControl2_OutputPromptVaList( IUnknown* __drpc_If, DbgRpcConnection* __drpc_Conn, DbgRpcCall* __drpc_Call, PUCHAR __drpc_InData, PUCHAR __drpc_OutData ) { ULONG OutputControl = *(ULONG*)__drpc_InData; __drpc_InData += sizeof(ULONG); if (__drpc_Call->InSize > sizeof(ULONG)) { return ((IDebugControl2*)__drpc_If)-> OutputPrompt(OutputControl, "%s", (PSTR)__drpc_InData); } else { return ((IDebugControl2*)__drpc_If)->OutputPrompt(OutputControl, NULL); } }