Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/coreclr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ if(CLR_CMAKE_HOST_UNIX)

add_subdirectory(src/pal)
add_subdirectory(src/hosts)
else(CLR_CMAKE_HOST_UNIX)
if(CLR_CMAKE_TARGET_UNIX)
add_subdirectory(src/pal/src/libunwind)
endif(CLR_CMAKE_TARGET_UNIX)
endif(CLR_CMAKE_HOST_UNIX)

# Add this subdir. We install the headers for the jit.
Expand Down
12 changes: 10 additions & 2 deletions src/coreclr/src/debug/daccess/dacfn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,16 @@ static BOOL DacReadAllAdapter(PVOID address, PVOID buffer, SIZE_T size)
return TRUE;
}

#ifdef HOST_WINDOWS
// For the cross OS dac, we don't have the full pal layer
// Use these minimal prototypes instead of the full pal header
typedef BOOL(*UnwindReadMemoryCallback)(PVOID address, PVOID buffer, SIZE_T size);

extern
BOOL
PAL_VirtualUnwindOutOfProc(PT_CONTEXT context, PT_KNONVOLATILE_CONTEXT_POINTERS contextPointers, SIZE_T baseAddress, UnwindReadMemoryCallback readMemoryCallback);
#endif

HRESULT
DacVirtualUnwind(ULONG32 threadId, PT_CONTEXT context, PT_KNONVOLATILE_CONTEXT_POINTERS contextPointers)
{
Expand Down Expand Up @@ -273,9 +283,7 @@ DacVirtualUnwind(ULONG32 threadId, PT_CONTEXT context, PT_KNONVOLATILE_CONTEXT_P
#endif
{
SIZE_T baseAddress = DacGlobalBase();
#ifdef HOST_UNIX
if (baseAddress == 0 || !PAL_VirtualUnwindOutOfProc(context, contextPointers, baseAddress, DacReadAllAdapter))
#endif
{
hr = E_FAIL;
}
Expand Down
6 changes: 6 additions & 0 deletions src/coreclr/src/dlls/mscordac/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,12 @@ else(CLR_CMAKE_HOST_WIN32)
)
endif(CLR_CMAKE_HOST_WIN32)

if(CLR_CMAKE_HOST_WIN32 AND CLR_CMAKE_TARGET_UNIX)
list(APPEND COREDAC_LIBRARIES
libunwind_xdac
)
endif(CLR_CMAKE_HOST_WIN32 AND CLR_CMAKE_TARGET_UNIX)

target_link_libraries(mscordaccore PRIVATE ${COREDAC_LIBRARIES})

# Create the DAC module index header file containing the DAC build id
Expand Down
59 changes: 47 additions & 12 deletions src/coreclr/src/pal/src/exception/remote-unwind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

--*/

#ifdef HOST_UNIX
#include "config.h"
#include "pal/palinternal.h"
#include "pal/dbgmsg.h"
Expand All @@ -64,18 +65,51 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

SET_DEFAULT_DEBUG_CHANNEL(EXCEPT);

#else // HOST_UNIX

#include <windows.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <libunwind.h>
#include "debugmacros.h"
#include "crosscomp.h"

#define KNONVOLATILE_CONTEXT_POINTERS T_KNONVOLATILE_CONTEXT_POINTERS
#define CONTEXT T_CONTEXT

typedef BOOL(*UnwindReadMemoryCallback)(PVOID address, PVOID buffer, SIZE_T size);

#define ASSERT(x, ...)
#define TRACE(x, ...)
#undef ERROR
#define ERROR(x, ...)


#ifdef TARGET_64BIT
#define ElfW(foo) Elf64_ ## foo
#else // TARGET_64BIT
#define ElfW(foo) Elf32_ ## foo
#endif // TARGET_64BIT

#define PALAPI

#endif // HOST_UNIX

#if defined(HAVE_UNW_GET_ACCESSORS)

#include <elf.h>
#ifdef HOST_UNIX
#include <link.h>
#endif // HOST_UNIX

#include <elf.h>

#if defined(HOST_X86) || defined(HOST_ARM)
#if defined(TARGET_X86) || defined(TARGET_ARM)
#define PRIx PRIx32
#define PRIu PRIu32
#define PRId PRId32
#define PRIA "08"
#define PRIxA PRIA PRIx
#elif defined(HOST_AMD64) || defined(HOST_ARM64)
#elif defined(TARGET_AMD64) || defined(TARGET_ARM64)
#define PRIx PRIx64
#define PRIu PRIu64
#define PRId PRId64
Expand All @@ -92,6 +126,7 @@ SET_DEFAULT_DEBUG_CHANNEL(EXCEPT);
#define Nhdr ElfW(Nhdr)
#define Dyn ElfW(Dyn)


extern "C" int
_OOP_find_proc_info(
unw_word_t start_ip,
Expand Down Expand Up @@ -120,7 +155,7 @@ typedef struct _libunwindInfo

static void UnwindContextToContext(unw_cursor_t *cursor, CONTEXT *winContext)
{
#if defined(HOST_AMD64)
#if (defined(HOST_UNIX) && defined(HOST_AMD64)) || (defined(HOST_WINDOWS) && defined(TARGET_AMD64))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Rip);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Rsp);
unw_get_reg(cursor, UNW_X86_64_RBP, (unw_word_t *) &winContext->Rbp);
Expand All @@ -129,14 +164,14 @@ static void UnwindContextToContext(unw_cursor_t *cursor, CONTEXT *winContext)
unw_get_reg(cursor, UNW_X86_64_R13, (unw_word_t *) &winContext->R13);
unw_get_reg(cursor, UNW_X86_64_R14, (unw_word_t *) &winContext->R14);
unw_get_reg(cursor, UNW_X86_64_R15, (unw_word_t *) &winContext->R15);
#elif defined(HOST_X86)
#elif (defined(HOST_UNIX) && defined(HOST_X86)) || (defined(HOST_WINDOWS) && defined(TARGET_X86))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Eip);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Esp);
unw_get_reg(cursor, UNW_X86_EBP, (unw_word_t *) &winContext->Ebp);
unw_get_reg(cursor, UNW_X86_EBX, (unw_word_t *) &winContext->Ebx);
unw_get_reg(cursor, UNW_X86_ESI, (unw_word_t *) &winContext->Esi);
unw_get_reg(cursor, UNW_X86_EDI, (unw_word_t *) &winContext->Edi);
#elif defined(HOST_ARM)
#elif (defined(HOST_UNIX) && defined(HOST_ARM)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Pc);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Sp);
unw_get_reg(cursor, UNW_ARM_R4, (unw_word_t *) &winContext->R4);
Expand All @@ -149,7 +184,7 @@ static void UnwindContextToContext(unw_cursor_t *cursor, CONTEXT *winContext)
unw_get_reg(cursor, UNW_ARM_R11, (unw_word_t *) &winContext->R11);
unw_get_reg(cursor, UNW_ARM_R14, (unw_word_t *) &winContext->Lr);
TRACE("sp %p pc %p lr %p\n", winContext->Sp, winContext->Pc, winContext->Lr);
#elif defined(HOST_ARM64)
#elif (defined(HOST_UNIX) && defined(HOST_ARM64)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM64))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Pc);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Sp);
unw_get_reg(cursor, UNW_AARCH64_X19, (unw_word_t *) &winContext->X19);
Expand Down Expand Up @@ -210,7 +245,7 @@ access_reg(unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valp, int write

switch (regnum)
{
#if defined(HOST_AMD64)
#if (defined(HOST_UNIX) && defined(HOST_AMD64)) || (defined(HOST_WINDOWS) && defined(TARGET_AMD64))
case UNW_REG_IP: *valp = (unw_word_t)winContext->Rip; break;
case UNW_REG_SP: *valp = (unw_word_t)winContext->Rsp; break;
case UNW_X86_64_RBP: *valp = (unw_word_t)winContext->Rbp; break;
Expand All @@ -219,14 +254,14 @@ access_reg(unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valp, int write
case UNW_X86_64_R13: *valp = (unw_word_t)winContext->R13; break;
case UNW_X86_64_R14: *valp = (unw_word_t)winContext->R14; break;
case UNW_X86_64_R15: *valp = (unw_word_t)winContext->R15; break;
#elif defined(HOST_X86)
#elif (defined(HOST_UNIX) && defined(HOST_X86)) || (defined(HOST_WINDOWS) && defined(TARGET_X86))
case UNW_REG_IP: *valp = (unw_word_t)winContext->Eip; break;
case UNW_REG_SP: *valp = (unw_word_t)winContext->Esp; break;
case UNW_X86_EBX: *valp = (unw_word_t)winContext->Ebx; break;
case UNW_X86_ESI: *valp = (unw_word_t)winContext->Esi; break;
case UNW_X86_EDI: *valp = (unw_word_t)winContext->Edi; break;
case UNW_X86_EBP: *valp = (unw_word_t)winContext->Ebp; break;
#elif defined(HOST_ARM)
#elif (defined(HOST_UNIX) && defined(HOST_ARM)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM))
case UNW_ARM_R4: *valp = (unw_word_t)winContext->R4; break;
case UNW_ARM_R5: *valp = (unw_word_t)winContext->R5; break;
case UNW_ARM_R6: *valp = (unw_word_t)winContext->R6; break;
Expand All @@ -238,7 +273,7 @@ access_reg(unw_addr_space_t as, unw_regnum_t regnum, unw_word_t *valp, int write
case UNW_ARM_R13: *valp = (unw_word_t)winContext->Sp; break;
case UNW_ARM_R14: *valp = (unw_word_t)winContext->Lr; break;
case UNW_ARM_R15: *valp = (unw_word_t)winContext->Pc; break;
#elif defined(HOST_ARM64)
#elif (defined(HOST_UNIX) && defined(HOST_ARM64)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM64))
case UNW_AARCH64_X19: *valp = (unw_word_t)winContext->X19; break;
case UNW_AARCH64_X20: *valp = (unw_word_t)winContext->X20; break;
case UNW_AARCH64_X21: *valp = (unw_word_t)winContext->X21; break;
Expand Down Expand Up @@ -479,4 +514,4 @@ PAL_VirtualUnwindOutOfProc(CONTEXT *context, KNONVOLATILE_CONTEXT_POINTERS *cont
return FALSE;
}

#endif // defined(HOST_AMD64) && defined(HAVE_UNW_GET_ACCESSORS)
#endif // defined(HAVE_UNW_GET_ACCESSORS)
59 changes: 41 additions & 18 deletions src/coreclr/src/pal/src/exception/seh-unwind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Module Name:

--*/

#ifdef HOST_UNIX
#include "pal/context.h"
#include "pal.h"
#include <dlfcn.h>
Expand All @@ -35,14 +36,32 @@ Module Name:
#ifdef __llvm__
#pragma clang diagnostic pop
#endif
#else // HOST_UNIX

#include <windows.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <libunwind.h>
#include "debugmacros.h"
#include "crosscomp.h"

#define KNONVOLATILE_CONTEXT_POINTERS T_KNONVOLATILE_CONTEXT_POINTERS
#define CONTEXT T_CONTEXT

#define ASSERT(x, ...)
#define TRACE(x, ...)

#define PALAPI

#endif // HOST_UNIX

//----------------------------------------------------------------------
// Virtual Unwinding
//----------------------------------------------------------------------

#if UNWIND_CONTEXT_IS_UCONTEXT_T

#if defined(HOST_AMD64)
#if (defined(HOST_UNIX) && defined(HOST_AMD64)) || (defined(HOST_WINDOWS) && defined(TARGET_AMD64))
#define ASSIGN_UNWIND_REGS \
ASSIGN_REG(Rip) \
ASSIGN_REG(Rsp) \
Expand All @@ -52,7 +71,7 @@ Module Name:
ASSIGN_REG(R13) \
ASSIGN_REG(R14) \
ASSIGN_REG(R15)
#elif defined(HOST_ARM64)
#elif (defined(HOST_UNIX) && defined(HOST_ARM64)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM64))
#define ASSIGN_UNWIND_REGS \
ASSIGN_REG(Pc) \
ASSIGN_REG(Sp) \
Expand All @@ -68,7 +87,7 @@ Module Name:
ASSIGN_REG(X26) \
ASSIGN_REG(X27) \
ASSIGN_REG(X28)
#elif defined(HOST_X86)
#elif (defined(HOST_UNIX) && defined(HOST_X86)) || (defined(HOST_WINDOWS) && defined(TARGET_X86))
#define ASSIGN_UNWIND_REGS \
ASSIGN_REG(Eip) \
ASSIGN_REG(Esp) \
Expand All @@ -89,7 +108,7 @@ static void WinContextToUnwindContext(CONTEXT *winContext, unw_context_t *unwCon
#else
static void WinContextToUnwindContext(CONTEXT *winContext, unw_context_t *unwContext)
{
#if defined(HOST_ARM)
#if (defined(HOST_UNIX) && defined(HOST_ARM)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM))
// Assuming that unw_set_reg() on cursor will point the cursor to the
// supposed stack frame is dangerous for libunwind-arm in Linux.
// It is because libunwind's unw_cursor_t has other data structure
Expand Down Expand Up @@ -132,7 +151,7 @@ static void WinContextToUnwindContext(CONTEXT *winContext, unw_context_t *unwCon

static void WinContextToUnwindCursor(CONTEXT *winContext, unw_cursor_t *cursor)
{
#if defined(HOST_AMD64)
#if (defined(HOST_UNIX) && defined(HOST_AMD64)) || (defined(HOST_WINDOWS) && defined(TARGET_AMD64))
unw_set_reg(cursor, UNW_REG_IP, winContext->Rip);
unw_set_reg(cursor, UNW_REG_SP, winContext->Rsp);
unw_set_reg(cursor, UNW_X86_64_RBP, winContext->Rbp);
Expand All @@ -141,7 +160,7 @@ static void WinContextToUnwindCursor(CONTEXT *winContext, unw_cursor_t *cursor)
unw_set_reg(cursor, UNW_X86_64_R13, winContext->R13);
unw_set_reg(cursor, UNW_X86_64_R14, winContext->R14);
unw_set_reg(cursor, UNW_X86_64_R15, winContext->R15);
#elif defined(HOST_X86)
#elif (defined(HOST_UNIX) && defined(HOST_X86)) || (defined(HOST_WINDOWS) && defined(TARGET_X86))
unw_set_reg(cursor, UNW_REG_IP, winContext->Eip);
unw_set_reg(cursor, UNW_REG_SP, winContext->Esp);
unw_set_reg(cursor, UNW_X86_EBP, winContext->Ebp);
Expand All @@ -154,7 +173,7 @@ static void WinContextToUnwindCursor(CONTEXT *winContext, unw_cursor_t *cursor)

void UnwindContextToWinContext(unw_cursor_t *cursor, CONTEXT *winContext)
{
#if defined(HOST_AMD64)
#if (defined(HOST_UNIX) && defined(HOST_AMD64)) || (defined(HOST_WINDOWS) && defined(TARGET_AMD64))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Rip);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Rsp);
unw_get_reg(cursor, UNW_X86_64_RBP, (unw_word_t *) &winContext->Rbp);
Expand All @@ -163,14 +182,14 @@ void UnwindContextToWinContext(unw_cursor_t *cursor, CONTEXT *winContext)
unw_get_reg(cursor, UNW_X86_64_R13, (unw_word_t *) &winContext->R13);
unw_get_reg(cursor, UNW_X86_64_R14, (unw_word_t *) &winContext->R14);
unw_get_reg(cursor, UNW_X86_64_R15, (unw_word_t *) &winContext->R15);
#elif defined(HOST_X86)
#elif (defined(HOST_UNIX) && defined(HOST_X86)) || (defined(HOST_WINDOWS) && defined(TARGET_X86))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Eip);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Esp);
unw_get_reg(cursor, UNW_X86_EBP, (unw_word_t *) &winContext->Ebp);
unw_get_reg(cursor, UNW_X86_EBX, (unw_word_t *) &winContext->Ebx);
unw_get_reg(cursor, UNW_X86_ESI, (unw_word_t *) &winContext->Esi);
unw_get_reg(cursor, UNW_X86_EDI, (unw_word_t *) &winContext->Edi);
#elif defined(HOST_ARM)
#elif (defined(HOST_UNIX) && defined(HOST_ARM)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM))
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Sp);
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Pc);
unw_get_reg(cursor, UNW_ARM_R14, (unw_word_t *) &winContext->Lr);
Expand All @@ -182,7 +201,7 @@ void UnwindContextToWinContext(unw_cursor_t *cursor, CONTEXT *winContext)
unw_get_reg(cursor, UNW_ARM_R9, (unw_word_t *) &winContext->R9);
unw_get_reg(cursor, UNW_ARM_R10, (unw_word_t *) &winContext->R10);
unw_get_reg(cursor, UNW_ARM_R11, (unw_word_t *) &winContext->R11);
#elif defined(HOST_ARM64)
#elif (defined(HOST_UNIX) && defined(HOST_ARM64)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM64))
unw_get_reg(cursor, UNW_REG_IP, (unw_word_t *) &winContext->Pc);
unw_get_reg(cursor, UNW_REG_SP, (unw_word_t *) &winContext->Sp);
unw_get_reg(cursor, UNW_AARCH64_X29, (unw_word_t *) &winContext->Fp);
Expand Down Expand Up @@ -222,19 +241,19 @@ static void GetContextPointer(unw_cursor_t *cursor, unw_context_t *unwContext, i

void GetContextPointers(unw_cursor_t *cursor, unw_context_t *unwContext, KNONVOLATILE_CONTEXT_POINTERS *contextPointers)
{
#if defined(HOST_AMD64)
#if (defined(HOST_UNIX) && defined(HOST_AMD64)) || (defined(HOST_WINDOWS) && defined(TARGET_AMD64))
GetContextPointer(cursor, unwContext, UNW_X86_64_RBP, &contextPointers->Rbp);
GetContextPointer(cursor, unwContext, UNW_X86_64_RBX, &contextPointers->Rbx);
GetContextPointer(cursor, unwContext, UNW_X86_64_R12, &contextPointers->R12);
GetContextPointer(cursor, unwContext, UNW_X86_64_R13, &contextPointers->R13);
GetContextPointer(cursor, unwContext, UNW_X86_64_R14, &contextPointers->R14);
GetContextPointer(cursor, unwContext, UNW_X86_64_R15, &contextPointers->R15);
#elif defined(HOST_X86)
#elif (defined(HOST_UNIX) && defined(HOST_X86)) || (defined(HOST_WINDOWS) && defined(TARGET_X86))
GetContextPointer(cursor, unwContext, UNW_X86_EBX, &contextPointers->Ebx);
GetContextPointer(cursor, unwContext, UNW_X86_EBP, &contextPointers->Ebp);
GetContextPointer(cursor, unwContext, UNW_X86_ESI, &contextPointers->Esi);
GetContextPointer(cursor, unwContext, UNW_X86_EDI, &contextPointers->Edi);
#elif defined(HOST_ARM)
#elif (defined(HOST_UNIX) && defined(HOST_ARM)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM))
GetContextPointer(cursor, unwContext, UNW_ARM_R4, &contextPointers->R4);
GetContextPointer(cursor, unwContext, UNW_ARM_R5, &contextPointers->R5);
GetContextPointer(cursor, unwContext, UNW_ARM_R6, &contextPointers->R6);
Expand All @@ -243,7 +262,7 @@ void GetContextPointers(unw_cursor_t *cursor, unw_context_t *unwContext, KNONVOL
GetContextPointer(cursor, unwContext, UNW_ARM_R9, &contextPointers->R9);
GetContextPointer(cursor, unwContext, UNW_ARM_R10, &contextPointers->R10);
GetContextPointer(cursor, unwContext, UNW_ARM_R11, &contextPointers->R11);
#elif defined(HOST_ARM64)
#elif (defined(HOST_UNIX) && defined(HOST_ARM64)) || (defined(HOST_WINDOWS) && defined(TARGET_ARM64))
GetContextPointer(cursor, unwContext, UNW_AARCH64_X19, &contextPointers->X19);
GetContextPointer(cursor, unwContext, UNW_AARCH64_X20, &contextPointers->X20);
GetContextPointer(cursor, unwContext, UNW_AARCH64_X21, &contextPointers->X21);
Expand All @@ -260,6 +279,8 @@ void GetContextPointers(unw_cursor_t *cursor, unw_context_t *unwContext, KNONVOL
#endif
}

#ifndef HOST_WINDOWS

extern int g_common_signal_handler_context_locvar_offset;

BOOL PAL_VirtualUnwind(CONTEXT *context, KNONVOLATILE_CONTEXT_POINTERS *contextPointers)
Expand Down Expand Up @@ -329,16 +350,16 @@ BOOL PAL_VirtualUnwind(CONTEXT *context, KNONVOLATILE_CONTEXT_POINTERS *contextP
if (unw_is_signal_frame(&cursor) > 0)
{
context->ContextFlags |= CONTEXT_EXCEPTION_ACTIVE;
#if defined(HOST_ARM) || defined(HOST_ARM64) || defined(HOST_X86)
#if defined(CONTEXT_UNWOUND_TO_CALL)
context->ContextFlags &= ~CONTEXT_UNWOUND_TO_CALL;
#endif // HOST_ARM || HOST_ARM64
#endif // CONTEXT_UNWOUND_TO_CALL
}
else
{
context->ContextFlags &= ~CONTEXT_EXCEPTION_ACTIVE;
#if defined(HOST_ARM) || defined(HOST_ARM64) || defined(HOST_X86)
#if defined(CONTEXT_UNWOUND_TO_CALL)
context->ContextFlags |= CONTEXT_UNWOUND_TO_CALL;
#endif // HOST_ARM || HOST_ARM64
#endif // CONTEXT_UNWOUND_TO_CALL
}

// Update the passed in windows context to reflect the unwind
Expand Down Expand Up @@ -535,3 +556,5 @@ RaiseException(IN DWORD dwExceptionCode,

LOGEXIT("RaiseException returns\n");
}

#endif // !HOST_WINDOWS
Loading