summaryrefslogtreecommitdiff
path: root/src/debug/di
diff options
context:
space:
mode:
authordanmosemsft <danmose@microsoft.com>2017-02-10 16:07:45 -0800
committerdanmosemsft <danmose@microsoft.com>2017-02-10 17:05:57 -0800
commit751771a8976f909af772e35c167bd7e3ffbe44c8 (patch)
treebc9ed8f9312625626e3547c3c3ca1201a37bb81f /src/debug/di
parente5f2df239b546ac9ed2417506c90af222eaf1013 (diff)
downloadcoreclr-751771a8976f909af772e35c167bd7e3ffbe44c8.tar.gz
coreclr-751771a8976f909af772e35c167bd7e3ffbe44c8.tar.bz2
coreclr-751771a8976f909af772e35c167bd7e3ffbe44c8.zip
Remove always defined FEATURE_CORESYSTEM
Diffstat (limited to 'src/debug/di')
-rw-r--r--src/debug/di/cordb.cpp9
-rw-r--r--src/debug/di/module.cpp2
-rw-r--r--src/debug/di/process.cpp37
-rw-r--r--src/debug/di/publish.cpp18
-rw-r--r--src/debug/di/rsmain.cpp12
-rw-r--r--src/debug/di/rspriv.h4
-rw-r--r--src/debug/di/shimprocess.cpp149
-rw-r--r--src/debug/di/windowspipeline.cpp127
8 files changed, 2 insertions, 356 deletions
diff --git a/src/debug/di/cordb.cpp b/src/debug/di/cordb.cpp
index 497225fd67..7f8c087399 100644
--- a/src/debug/di/cordb.cpp
+++ b/src/debug/di/cordb.cpp
@@ -86,15 +86,6 @@ HINSTANCE g_hInst; // Instance handle to this piece of code
//*****************************************************************************
STDAPI CreateCordbObject(int iDebuggerVersion, IUnknown ** ppCordb)
{
-#if defined(FEATURE_CORECLR) && !defined(FEATURE_DBGIPC_TRANSPORT_DI) && !defined(FEATURE_CORESYSTEM)
- // This API should not be called for Windows CoreCLR unless we are doing interop-debugging
- // (which is only supported internally). Use code:CoreCLRCreateCordbObject instead.
- if (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_DbgEnableMixedModeDebugging) == 0)
- {
- _ASSERTE(!"Deprecated entry point CreateCordbObject() is called on Windows CoreCLR\n");
- return E_NOTIMPL;
- }
-#endif // FEATURE_CORECLR && !FEATURE_DBGIPC_TRANSPORT_DI
if (ppCordb == NULL)
{
diff --git a/src/debug/di/module.cpp b/src/debug/di/module.cpp
index 36cc6f5f9e..46487b92c9 100644
--- a/src/debug/di/module.cpp
+++ b/src/debug/di/module.cpp
@@ -5153,7 +5153,7 @@ HRESULT CordbNativeCode::GetReturnValueLiveOffsetImpl(Instantiation *currentInst
int skipBytes = 0;
-#if defined(DBG_TARGET_X86) && defined(FEATURE_CORESYSTEM)
+#if defined(DBG_TARGET_X86)
// Skip nop sleds on x86 coresystem. The JIT adds these instructions as a security measure,
// and incorrectly reports to us the wrong offset of the call instruction.
const BYTE nop_opcode = 0x90;
diff --git a/src/debug/di/process.cpp b/src/debug/di/process.cpp
index a5496eee54..53fb2ca0f6 100644
--- a/src/debug/di/process.cpp
+++ b/src/debug/di/process.cpp
@@ -381,7 +381,6 @@ IMDInternalImport * CordbProcess::LookupMetaDataFromDebugger(
WCHAR *mutableFilePath = (WCHAR *)filePath;
-#if defined(FEATURE_CORESYSTEM)
size_t pathLen = wcslen(mutableFilePath);
const wchar_t *nidll = W(".ni.dll");
@@ -403,7 +402,6 @@ IMDInternalImport * CordbProcess::LookupMetaDataFromDebugger(
{
wcscpy_s(mutableFilePath+pathLen-winmdLen, winmdLen, W(".winmd"));
}
-#endif//FEATURE_CORESYSTEM
ALLOW_DATATARGET_MISSING_MEMORY(
pMDII = LookupMetaDataFromDebuggerForSingleFile(pModule, mutableFilePath, dwImageTimeStamp, dwImageSize);
@@ -7605,27 +7603,7 @@ HRESULT CordbProcess::GetRuntimeOffsets()
{
-#if !defined FEATURE_CORESYSTEM
- // kernel32!OpenThread does not exist on all platforms (missing on Win98).
- // So we need to delay load it.
- typedef HANDLE (WINAPI *FPOPENTHREAD)(DWORD dwDesiredAccess,
- BOOL bInheritHandle,
- DWORD dwThreadId);
-
-
-
- HMODULE mod = WszGetModuleHandle(W("kernel32.dll"));
-
- _ASSERTE(mod != NULL); // can't fail since Kernel32.dll is already loaded.
-
- const FPOPENTHREAD pfnOpenThread = (FPOPENTHREAD)GetProcAddress(mod, "OpenThread");
-
- if (pfnOpenThread != NULL)
- {
- m_hHelperThread = pfnOpenThread(SYNCHRONIZE, FALSE, dwHelperTid);
- CONSISTENCY_CHECK_MSGF(m_hHelperThread != NULL, ("Failed to get helper-thread handle. tid=0x%x\n", dwHelperTid));
- }
-#elif FEATURE_PAL
+#if FEATURE_PAL
m_hHelperThread = NULL; //RS is supposed to be able to live without a helper thread handle.
#else
m_hHelperThread = OpenThread(SYNCHRONIZE, FALSE, dwHelperTid);
@@ -9798,13 +9776,11 @@ HRESULT CordbProcess::EnsureClrInstanceIdSet()
if (m_clrInstanceId == 0)
{
-#ifdef FEATURE_CORESYSTEM
if(m_cordb->GetTargetCLR() != 0)
{
m_clrInstanceId = PTR_TO_CORDB_ADDRESS(m_cordb->GetTargetCLR());
return S_OK;
}
-#endif
// The only case in which we're allowed to request the "default" CLR instance
// ID is when we're running in V2 mode. In V3, the client is required to pass
@@ -14947,17 +14923,6 @@ HRESULT CordbProcess::IsReadyForDetach()
// and hard detach failures (after which the process object is neutered).
if (m_pShim != NULL)
{
-#if !defined(FEATURE_CORESYSTEM) // CORESYSTEM TODO
- HModuleHolder hKernel32;
- hKernel32 = WszLoadLibrary(W("kernel32"));
- if (hKernel32 == NULL)
- return HRESULT_FROM_GetLastError();
- typedef BOOL (*DebugActiveProcessStopSig) (DWORD);
- DebugActiveProcessStopSig pDebugActiveProcessStop =
- reinterpret_cast<DebugActiveProcessStopSig>(GetProcAddress(hKernel32, "DebugActiveProcessStop"));
- if (pDebugActiveProcessStop == NULL)
- return COR_E_PLATFORMNOTSUPPORTED;
-#endif
}
return S_OK;
diff --git a/src/debug/di/publish.cpp b/src/debug/di/publish.cpp
index 888988a10f..a7e2ebb9c2 100644
--- a/src/debug/di/publish.cpp
+++ b/src/debug/di/publish.cpp
@@ -44,19 +44,6 @@ BOOL GetAllProcessesInSystem(DWORD *ProcessId,
{
HandleHolder hSnapshotHolder;
-#if !defined(FEATURE_CORESYSTEM)
- // Load the dll "kernel32.dll".
- HModuleHolder hDll = WszLoadLibrary(W("kernel32"));
- _ASSERTE(hDll != NULL);
-
- if (hDll == NULL)
- {
- LOG((LF_CORDB, LL_INFO1000,
- "Unable to load the dll for enumerating processes. "
- "LoadLibrary (kernel32.dll) failed.\n"));
- return FALSE;
- }
-#else
// Load the dll "api-ms-win-obsolete-kernel32-l1-1-0.dll".
HModuleHolder hDll = WszLoadLibrary(W("api-ms-win-obsolete-kernel32-l1-1-0.dll"));
_ASSERTE(hDll != NULL);
@@ -68,7 +55,6 @@ BOOL GetAllProcessesInSystem(DWORD *ProcessId,
"LoadLibrary (api-ms-win-obsolete-kernel32-l1-1-0.dll) failed.\n"));
return FALSE;
}
-#endif
// Create the Process' Snapshot
@@ -183,11 +169,7 @@ CorpubPublish::CorpubPublish()
{
// Try to get psapi!GetModuleFileNameExW once, and then every process object can use it.
// If we can't get it, then we'll fallback to getting information from the IPC block.
-#if !defined(FEATURE_CORESYSTEM)
- m_hPSAPIdll = WszLoadLibrary(W("psapi.dll"));
-#else
m_hPSAPIdll = WszLoadLibrary(W("api-ms-win-obsolete-psapi-l1-1-0.dll"));
-#endif
if (m_hPSAPIdll != NULL)
{
diff --git a/src/debug/di/rsmain.cpp b/src/debug/di/rsmain.cpp
index 0f5778789f..6e0ccf8872 100644
--- a/src/debug/di/rsmain.cpp
+++ b/src/debug/di/rsmain.cpp
@@ -864,10 +864,8 @@ Cordb::Cordb(CorDebugInterfaceVersion iDebuggerVersion)
m_processes(11),
m_initialized(false),
m_debuggerSpecifiedVersion(iDebuggerVersion)
-#ifdef FEATURE_CORESYSTEM
,
m_targetCLR(0)
-#endif
{
g_pRSDebuggingInfo->m_Cordb = this;
@@ -1314,9 +1312,7 @@ HRESULT Cordb::SetTargetCLR(HMODULE hmodTargetCLR)
if (m_initialized)
return E_FAIL;
-#ifdef FEATURE_CORESYSTEM
m_targetCLR = hmodTargetCLR;
-#endif
// @REVIEW: are we happy with this workaround? It allows us to use the existing
// infrastructure for instance name decoration, but it really doesn't fit
@@ -1425,14 +1421,6 @@ bool Cordb::IsInteropDebuggingSupported()
// ICorDebug::SetUnmanagedHandler for details.
#ifdef FEATURE_INTEROP_DEBUGGING
-#if defined(FEATURE_CORECLR) && !defined(FEATURE_CORESYSTEM)
- // Interop debugging is only supported internally on CoreCLR.
- // Check if the special reg key is set. If not, then we don't allow interop debugging.
- if (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_DbgEnableMixedModeDebugging) == 0)
- {
- return false;
- }
-#endif // FEATURE_CORECLR
return true;
#else
diff --git a/src/debug/di/rspriv.h b/src/debug/di/rspriv.h
index 8f369b7414..1db784b636 100644
--- a/src/debug/di/rspriv.h
+++ b/src/debug/di/rspriv.h
@@ -2317,9 +2317,7 @@ public:
CorDebugInterfaceVersion GetDebuggerVersion() const;
-#ifdef FEATURE_CORESYSTEM
HMODULE GetTargetCLR() { return m_targetCLR; }
-#endif
private:
bool IsCreateProcessSupported();
@@ -2339,9 +2337,7 @@ private:
//Note - this code could be useful outside coresystem, but keeping the change localized
// because we are late in the win8 release
-#ifdef FEATURE_CORESYSTEM
HMODULE m_targetCLR;
-#endif
};
diff --git a/src/debug/di/shimprocess.cpp b/src/debug/di/shimprocess.cpp
index a6fc15407e..6572f2ac29 100644
--- a/src/debug/di/shimprocess.cpp
+++ b/src/debug/di/shimprocess.cpp
@@ -18,9 +18,6 @@
#include <limits.h>
#include "shimpriv.h"
-#if !defined(FEATURE_CORESYSTEM)
-#include <tlhelp32.h>
-#endif
//---------------------------------------------------------------------------------------
//
@@ -1082,114 +1079,8 @@ HRESULT ShimProcess::QueueFakeThreadAttachEventsNoOrder()
// sends the threads in an arbitrary order.
HRESULT ShimProcess::QueueFakeThreadAttachEventsNativeOrder()
{
-#ifdef FEATURE_CORESYSTEM
_ASSERTE("NYI");
return E_FAIL;
-#else
- ICorDebugProcess * pProcess = GetProcess();
-
- DWORD dwProcessId;
- HRESULT hr = pProcess->GetID(&dwProcessId);
- SIMPLIFYING_ASSUMPTION_SUCCEEDED(hr);
- if (FAILED(hr))
- {
- return hr;
- }
-
- HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
- THREADENTRY32 te32;
-
- // Take a snapshot of all running threads
- hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
- if (hThreadSnap == INVALID_HANDLE_VALUE)
- {
- hr = HRESULT_FROM_GetLastError();
- SIMPLIFYING_ASSUMPTION_SUCCEEDED(hr);
- return hr;
- }
- // HandleHolder doesn't deal with INVALID_HANDLE_VALUE, so we only assign if we have a legal value.
- HandleHolder hSnapshotHolder(hThreadSnap);
-
- // Fill in the size of the structure before using it.
- te32.dwSize = sizeof(THREADENTRY32);
-
- // Retrieve information about the first thread, and exit if unsuccessful
- if (!Thread32First(hThreadSnap, &te32))
- {
- hr = HRESULT_FROM_GetLastError();
- return hr;
- }
-
- // Now walk the thread list of the system,
- // and display information about each thread
- // associated with the specified process
- do
- {
- if (te32.th32OwnerProcessID == dwProcessId)
- {
- RSExtSmartPtr<ICorDebugThread> pThread;
- pProcess->GetThread(te32.th32ThreadID, &pThread);
- if (pThread != NULL)
- {
- // If we fail to get the appdomain for some reason, then then
- // we can't dispatch this thread callback. But we can still
- // finish enumerating.
- RSExtSmartPtr<ICorDebugAppDomain> pAppDomain;
- HRESULT hrGetAppDomain = pThread->GetAppDomain(&pAppDomain);
- SIMPLIFYING_ASSUMPTION_SUCCEEDED(hrGetAppDomain);
- if (pAppDomain != NULL)
- {
- GetShimCallback()->CreateThread(pAppDomain, pThread);
- AddDuplicateCreationEvent(pThread);
-
- //fix for issue DevDiv2\DevDiv 77523 - threads are switched out in SQL don't get thread create notifications
- // mark that this thread has queued a create event
- CordbThread* pThreadInternal = static_cast<CordbThread*>(pThread.GetValue());
- pThreadInternal->SetCreateEventQueued();
- }
- }
- }
- } while(Thread32Next(hThreadSnap, &te32));
-
-
- //fix for issue DevDiv2\DevDiv 77523 - threads are switched out in SQL don't get thread create notifications
- //
-
-
- // Threads which were switched out won't be present in the native thread order enumeration above.
- // In order to not miss them we will enumerate all the managed thread objects and for any that we haven't
- // already queued a notification for, we will queue a notification now.
- RSExtSmartPtr<ICorDebugThreadEnum> pThreadEnum;
- RSExtSmartPtr<ICorDebugThread> pThread;
- hr = pProcess->EnumerateThreads(&pThreadEnum);
- if (FAILED(hr))
- {
- return hr;
- }
-
- ULONG cDummy;
-
- while(SUCCEEDED(pThreadEnum->Next(1, &pThread, &cDummy)) && (pThread != NULL))
- {
- RSExtSmartPtr<ICorDebugAppDomain> pAppDomain;
- hr = pThread->GetAppDomain(&pAppDomain);
- CordbThread* pThreadInternal = static_cast<CordbThread*>(pThread.GetValue());
-
- // Getting the appdomain shouldn't fail. If it does, we can't dispatch
- // this callback, but we can still dispatch the other thread creates.
- SIMPLIFYING_ASSUMPTION_SUCCEEDED(hr);
- if (pAppDomain != NULL && !pThreadInternal->CreateEventWasQueued())
- {
- GetShimCallback()->CreateThread(pAppDomain, pThread);
- AddDuplicateCreationEvent(pThread);
- pThreadInternal->SetCreateEventQueued();
- }
- pThread.Clear();
- }
-
-
- return S_OK;
-#endif
}
//---------------------------------------------------------------------------------------
@@ -1477,15 +1368,9 @@ void ShimProcess::QueueFakeAttachEvents()
//
// Third, Queue all Threads
//
-#if !defined(FEATURE_DBGIPC_TRANSPORT_DI) && !defined(FEATURE_CORESYSTEM)
- // Use OS thread enumeration facilities to ensure that the managed thread
- // thread order is the same as the corresponding native thread order.
- QueueFakeThreadAttachEventsNativeOrder();
-#else
// Use ICorDebug to enumerate threads. The order of managed threads may
// not match the order the threads were created in.
QueueFakeThreadAttachEventsNoOrder();
-#endif
// Forth, Queue all Connections.
// Enumerate connections is not exposed through ICorDebug, so we need to go use a private hook on CordbProcess.
@@ -1742,42 +1627,8 @@ CORDB_ADDRESS ShimProcess::GetCLRInstanceBaseAddress()
CORDB_ADDRESS baseAddress = CORDB_ADDRESS(NULL);
DWORD dwPid = m_pLiveDataTarget->GetPid();
-#if defined(FEATURE_CORESYSTEM)
// Debugger attaching to CoreCLR via CoreCLRCreateCordbObject should have already specified CLR module address.
// Code that help to find it now lives in dbgshim.
-#else
- // get a "snapshot" of all modules in the target
- HandleHolder hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid);
- MODULEENTRY32 moduleEntry = { 0 };
-
- if (hSnapshot == INVALID_HANDLE_VALUE)
- {
- // we haven't got a loaded CLR yet
- baseAddress = CORDB_ADDRESS(NULL);
- }
- else
- {
- // we need to loop through the modules until we find mscorwks.dll
- moduleEntry.dwSize = sizeof(MODULEENTRY32);
-
- if (!Module32First(hSnapshot, &moduleEntry))
- {
- baseAddress = CORDB_ADDRESS(NULL);
- }
- else
- {
-
- do
- {
- if (!_wcsicmp(moduleEntry.szModule, MAKEDLLNAME_W(MAIN_CLR_MODULE_NAME_W)))
- {
- // we found it, so save the base address
- baseAddress = PTR_TO_CORDB_ADDRESS(moduleEntry.modBaseAddr);
- }
- } while (Module32Next(hSnapshot, &moduleEntry));
- }
- }
-#endif
return baseAddress;
} // ShimProcess::GetCLRInstanceBaseAddress
diff --git a/src/debug/di/windowspipeline.cpp b/src/debug/di/windowspipeline.cpp
index c3050e3290..073a412608 100644
--- a/src/debug/di/windowspipeline.cpp
+++ b/src/debug/di/windowspipeline.cpp
@@ -134,36 +134,8 @@ BOOL WindowsNativePipeline::DebugSetProcessKillOnExit(bool fKillOnExit)
// Enforces the bit set in code:WindowsNativePipeline::DebugSetProcessKillOnExit
void WindowsNativePipeline::UpdateDebugSetProcessKillOnExit()
{
-#if !defined(FEATURE_CORESYSTEM)
- // Late bind to DebugSetProcessKillOnExit - WinXP and above only
- HModuleHolder hKernel32;
- hKernel32 = WszLoadLibrary(W("kernel32"));
- SIMPLIFYING_ASSUMPTION(hKernel32 != NULL);
- if (hKernel32 == NULL)
- return;
-
- typedef BOOL (*DebugSetProcessKillOnExitSig) (BOOL);
- DebugSetProcessKillOnExitSig pDebugSetProcessKillOnExit =
- reinterpret_cast<DebugSetProcessKillOnExitSig>(GetProcAddress(hKernel32, "DebugSetProcessKillOnExit"));
-
- // If the API doesn't exist (eg. Win2k) - there isn't anything we can do, just
- // silently ignore the request.
- if (pDebugSetProcessKillOnExit == NULL)
- return;
-
- BOOL ret = pDebugSetProcessKillOnExit(m_fKillOnExit);
-
- // Not a good failure path here.
- // 1) This shouldn't fail.
- // 2) Even if it does, this is likely called after the debuggee
- // has already been created, and if this API fails, most scenarios will
- // be unaffected, so we don't want to fail the overall debugging session.
- SIMPLIFYING_ASSUMPTION(ret);
-
-#else
// The API doesn't exit on CoreSystem, just return
return;
-#endif
}
// Create an process under the debugger.
@@ -249,69 +221,20 @@ HRESULT WindowsNativePipeline::DebugActiveProcess(MachineInfo machineInfo, DWORD
// Determine (if possible) whether a debugger is attached to the target process
HRESULT WindowsNativePipeline::IsRemoteDebuggerPresent(DWORD processId, BOOL* pfDebuggerPresent)
{
-#if !defined(FEATURE_CORESYSTEM)
-
- // Get a process handle for the process ID.
- HandleHolder hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, processId);
- if (hProc == NULL)
- return HRESULT_FROM_GetLastError();
-
- // Delay-bind to CheckRemoteDebuggerPresent - WinXP SP1 and above only
- HModuleHolder hKernel32;
- hKernel32 = WszLoadLibrary(W("kernel32"));
- if (hKernel32 == NULL)
- return HRESULT_FROM_GetLastError();
-
- typedef BOOL (*CheckRemoteDebuggerPresentSig) (HANDLE, PBOOL);
- CheckRemoteDebuggerPresentSig pCheckRemoteDebuggerPresent =
- reinterpret_cast<CheckRemoteDebuggerPresentSig>(GetProcAddress(hKernel32, "CheckRemoteDebuggerPresent"));
- if (pCheckRemoteDebuggerPresent == NULL)
- return HRESULT_FROM_GetLastError();
-
- // API exists - call it
- if (!pCheckRemoteDebuggerPresent(hProc, pfDebuggerPresent))
- return HRESULT_FROM_GetLastError();
-
- return S_OK;
-#else
//CoreSystem doesn't have this API
return E_FAIL;
-#endif
}
// Detach
HRESULT WindowsNativePipeline::DebugActiveProcessStop(DWORD processId)
{
-#if !defined(FEATURE_CORESYSTEM)
- // Late-bind to DebugActiveProcessStop since it's WinXP and above only
- HModuleHolder hKernel32;
- hKernel32 = WszLoadLibrary(W("kernel32"));
- if (hKernel32 == NULL)
- return HRESULT_FROM_GetLastError();
-
- typedef BOOL (*DebugActiveProcessStopSig) (DWORD);
- DebugActiveProcessStopSig pDebugActiveProcessStop =
- reinterpret_cast<DebugActiveProcessStopSig>(GetProcAddress(hKernel32, "DebugActiveProcessStop"));
-
- // Win2K will fail here - can't find DebugActiveProcessStop
- if (pDebugActiveProcessStop == NULL)
- return HRESULT_FROM_GetLastError();
-
- // Ok, the API exists, call it
- if (!pDebugActiveProcessStop(processId))
- {
- // Detach itself failed
- return HRESULT_FROM_GetLastError();
- }
-#else
// The API exists, call it
if (!::DebugActiveProcessStop(processId))
{
// Detach itself failed
return HRESULT_FROM_GetLastError();
}
-#endif
return S_OK;
}
@@ -364,56 +287,6 @@ BOOL WindowsNativePipeline::TerminateProcess(UINT32 exitCode)
// Resume any suspended threads (but just once)
HRESULT WindowsNativePipeline::EnsureThreadsRunning()
{
-#ifdef FEATURE_CORESYSTEM
_ASSERTE("NYI");
return E_FAIL;
-#else
- _ASSERTE(m_dwProcessId != 0);
-
- // Take a snapshot of all running threads (similar to ShimProcess::QueueFakeThreadAttachEventsNativeOrder)
- // Alternately we could return thread creation/exit in WaitForDebugEvent. But we expect this to be used
- // very rarely, so no need to complicate more common codepaths.
- HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
- THREADENTRY32 te32;
-
- hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
- if (hThreadSnap == INVALID_HANDLE_VALUE)
- return HRESULT_FROM_GetLastError();
-
- // HandleHolder doesn't deal with INVALID_HANDLE_VALUE, so we only assign if we have a legal value.
- HandleHolder hSnapshotHolder(hThreadSnap);
-
- // Fill in the size of the structure before using it.
- te32.dwSize = sizeof(THREADENTRY32);
-
- // Retrieve information about the first thread, and exit if unsuccessful
- if (!Thread32First(hThreadSnap, &te32))
- return HRESULT_FROM_GetLastError();
-
- // Now walk the thread list of the system and attempt to resume any that are part of this process
- // Ignore errors - this is a best effort (but ASSERT in CHK builds since we don't expect errors
- // in practice - we expect the process to be frozen at a debug event, so no races etc.)
-
- HRESULT hr = S_FALSE; // no thread was resumed
- do
- {
- if (te32.th32OwnerProcessID == m_dwProcessId)
- {
- HandleHolder hThread = ::OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);
- _ASSERTE(hThread != NULL);
- if (hThread != NULL)
- {
- // Resume each thread exactly once (if they were suspended multiple times,
- // then EnsureThreadsRunning would need to be called multiple times until it
- // returned S_FALSE.
- DWORD prevCount = ::ResumeThread(hThread);
- _ASSERTE(prevCount >= 0);
- if (prevCount >= 1)
- hr = S_OK; // some thread was resumed
- }
- }
- } while(Thread32Next(hThreadSnap, &te32));
-
- return hr;
-#endif
}