.NET 2.x X64 GetThreadContext Error 998: Invalid Access Memory Location - C#
Формулировка задачи:
Доброго времени суток.
При попытке получить контекст потока
выскакивает ошибка 998.
Вообще-то эта ошибка должна появляться в том случае, если пытаться получить контекст х86 процесса.
И так что имеется:
OS - Windows 10 TP (x64) & Visual Studio 2013 Update 3
Приложение на C# x64.
Так вот сама ошибка появляется если скомпилировать данное приложение на этом компьютере с ОС Windows 10 TP (x64).
Если скомпилировать аналогичное приложение на С++ все работает.
Если скомпилировать приложение на С# но на Аналогичное приложение на С++ работает нормально:
Есть у кого-то какие-то соображения по этому поводу?
if (!GetThreadContext(handle, ref context))
throw new Win32Exception();другом компьютере (OS Windows 7 x64 & Visual Studio 2013 Update 3) - все работает
. Может какие-то настройки Visual Studio? Вот тестовый исходник на С#:using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace TestGetContext
{
class Program
{
[DllImport("kernel32", SetLastError = true)]
public static extern IntPtr OpenThread(int DesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwThreadId);
[DllImport("kernel32", SetLastError = true)]
public static extern uint SuspendThread(IntPtr thandle);
[DllImport("kernel32", SetLastError = true)]
public static extern uint ResumeThread(IntPtr thandle);
[DllImport("kernel32", SetLastError = true)]
public static extern bool GetThreadContext(IntPtr thandle, ref CONTEXT context);
static void Main(string[] args)
{
Console.Write("Plese enter the thread Id: ");
int id;
if (!int.TryParse(Console.ReadLine(), out id))
return;
// open thread
var handle = OpenThread(0x1FFFFF, false, id);
try
{
if (handle == IntPtr.Zero)
throw new Win32Exception();
if (SuspendThread(handle) == 0xFFFFFFFF)
throw new Win32Exception();
var context = new CONTEXT { ContextFlags = 0x100001u /* CONTROL */ };
if (!GetThreadContext(handle, ref context))
throw new Win32Exception();
Console.WriteLine("Rip: 0x{0:X}", context.Rip);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
ResumeThread(handle);
Console.ReadLine();
}
}
}
[StructLayout(LayoutKind.Sequential/*, Size = 1232*/)]
public struct CONTEXT
{
public ulong P1Home;
public ulong P2Home;
public ulong P3Home;
public ulong P4Home;
public ulong P5Home;
public ulong P6Home;
public uint ContextFlags;
public uint MxCsr;
public ushort SegCs;
public ushort SegDs;
public ushort SegEs;
public ushort SegFs;
public ushort SegGs;
public ushort SegSs;
public uint EFlags;
public ulong Dr0;
public ulong Dr1;
public ulong Dr2;
public ulong Dr3;
public ulong Dr6;
public ulong Dr7;
public ulong Rax;
public ulong Rcx;
public ulong Rdx;
public ulong Rbx;
public ulong Rsp;
public ulong Rbp;
public ulong Rsi;
public ulong Rdi;
public ulong R8;
public ulong R9;
public ulong R10;
public ulong R11;
public ulong R12;
public ulong R13;
public ulong R14;
public ulong R15;
public ulong Rip;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=976)]
private byte[] buff;
};
}#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD threadId = -1;
printf("Please enter thread ID: ");
scanf("%i", &threadId);
if (threadId > 0)
{
HANDLE handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadId);
SuspendThread(handle);
CONTEXT context;
context.ContextFlags = CONTEXT_CONTROL;
GetThreadContext(handle, &context);
printf("\nRip: 0x%X\n", context.Rip);
ResumeThread(handle);
CloseHandle(handle);
}
system("pause");
return 0;
}Решение задачи: «.NET 2.x X64 GetThreadContext Error 998: Invalid Access Memory Location»
textual
Листинг программы
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
//
// Register parameter home addresses.
//
// N.B. These fields are for convience - they could be used to extend the
// context record in the future.
//
DWORD64 P1Home;
DWORD64 P2Home;
DWORD64 P3Home;
DWORD64 P4Home;
DWORD64 P5Home;
DWORD64 P6Home;
// ...