64,650
社区成员
发帖
与我相关
我的任务
分享
BOOL CSymEngine::GetCurrentThreadContext(PCONTEXT pContext)
{
#if defined _M_IX86
__asm
{
push eax
push edi
push es
push ecx
// EDI = pContext
mov edi, [pContext]
// ES = DS
push ds
pop es
// ECX = sizeof(*pContext)
mov ecx, size CONTEXT
// EAX = 0
xor eax, eax
// store EDI
push edi
// ZeroMemory(pContext, sizeof(*pContext))
cld
rep stosb
// restore EDI
pop edi
pop ecx
pop es
// fill pContext
mov dword ptr [edi] CONTEXT.ContextFlags, CONTEXT_FULL
mov dword ptr [edi] CONTEXT.Eax, eax
mov dword ptr [edi] CONTEXT.Ecx, ecx
mov dword ptr [edi] CONTEXT.Edx, edx
mov dword ptr [edi] CONTEXT.Ebx, ebx
mov dword ptr [edi] CONTEXT.Esi, esi
mov dword ptr [edi] CONTEXT.Edi, edi
mov word ptr [edi] CONTEXT.SegSs, ss
mov word ptr [edi] CONTEXT.SegCs, cs
mov word ptr [edi] CONTEXT.SegDs, ds
mov word ptr [edi] CONTEXT.SegEs, es
mov word ptr [edi] CONTEXT.SegFs, fs
mov word ptr [edi] CONTEXT.SegGs, gs
// pContext->EFlags = flags
pushfd
pop [edi] CONTEXT.EFlags
// extract caller's EBP, EIP (return address) and ESP
mov eax, [ebp]
mov dword ptr [edi] CONTEXT.Ebp, eax
mov eax, [ebp + 4]
mov dword ptr [edi] CONTEXT.Eip, eax
lea eax, [ebp + 8]
mov dword ptr [edi] CONTEXT.Esp, eax
pop edi
pop eax
}
#elif defined _M_X64
RtlCaptureContext(pContext);
#else
#error CPU architecture is not supported.
#endif
return TRUE;
}