.NET 2.x X64 GetThreadContext Error 998: Invalid Access Memory Location - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. При попытке получить контекст потока
Листинг программы
  1. if (!GetThreadContext(handle, ref context))
  2. throw new Win32Exception();
выскакивает ошибка 998. Вообще-то эта ошибка должна появляться в том случае, если пытаться получить контекст х86 процесса. И так что имеется: OS - Windows 10 TP (x64) & Visual Studio 2013 Update 3 Приложение на C# x64. Так вот сама ошибка появляется если скомпилировать данное приложение на этом компьютере с ОС Windows 10 TP (x64). Если скомпилировать аналогичное приложение на С++ все работает. Если скомпилировать приложение на С# но на

другом компьютере (OS Windows 7 x64 & Visual Studio 2013 Update 3) - все работает

. Может какие-то настройки Visual Studio? Вот тестовый исходник на С#:
Листинг программы
  1. using System;
  2. using System.ComponentModel;
  3. using System.Runtime.InteropServices;
  4. namespace TestGetContext
  5. {
  6. class Program
  7. {
  8. [DllImport("kernel32", SetLastError = true)]
  9. public static extern IntPtr OpenThread(int DesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwThreadId);
  10. [DllImport("kernel32", SetLastError = true)]
  11. public static extern uint SuspendThread(IntPtr thandle);
  12. [DllImport("kernel32", SetLastError = true)]
  13. public static extern uint ResumeThread(IntPtr thandle);
  14. [DllImport("kernel32", SetLastError = true)]
  15. public static extern bool GetThreadContext(IntPtr thandle, ref CONTEXT context);
  16. static void Main(string[] args)
  17. {
  18. Console.Write("Plese enter the thread Id: ");
  19. int id;
  20. if (!int.TryParse(Console.ReadLine(), out id))
  21. return;
  22. // open thread
  23. var handle = OpenThread(0x1FFFFF, false, id);
  24. try
  25. {
  26. if (handle == IntPtr.Zero)
  27. throw new Win32Exception();
  28. if (SuspendThread(handle) == 0xFFFFFFFF)
  29. throw new Win32Exception();
  30. var context = new CONTEXT { ContextFlags = 0x100001u /* CONTROL */ };
  31. if (!GetThreadContext(handle, ref context))
  32. throw new Win32Exception();
  33. Console.WriteLine("Rip: 0x{0:X}", context.Rip);
  34. }
  35. catch (Exception ex)
  36. {
  37. Console.WriteLine(ex.Message);
  38. }
  39. finally
  40. {
  41. ResumeThread(handle);
  42. Console.ReadLine();
  43. }
  44. }
  45. }
  46. [StructLayout(LayoutKind.Sequential/*, Size = 1232*/)]
  47. public struct CONTEXT
  48. {
  49. public ulong P1Home;
  50. public ulong P2Home;
  51. public ulong P3Home;
  52. public ulong P4Home;
  53. public ulong P5Home;
  54. public ulong P6Home;
  55. public uint ContextFlags;
  56. public uint MxCsr;
  57. public ushort SegCs;
  58. public ushort SegDs;
  59. public ushort SegEs;
  60. public ushort SegFs;
  61. public ushort SegGs;
  62. public ushort SegSs;
  63. public uint EFlags;
  64. public ulong Dr0;
  65. public ulong Dr1;
  66. public ulong Dr2;
  67. public ulong Dr3;
  68. public ulong Dr6;
  69. public ulong Dr7;
  70. public ulong Rax;
  71. public ulong Rcx;
  72. public ulong Rdx;
  73. public ulong Rbx;
  74. public ulong Rsp;
  75. public ulong Rbp;
  76. public ulong Rsi;
  77. public ulong Rdi;
  78. public ulong R8;
  79. public ulong R9;
  80. public ulong R10;
  81. public ulong R11;
  82. public ulong R12;
  83. public ulong R13;
  84. public ulong R14;
  85. public ulong R15;
  86. public ulong Rip;
  87. [MarshalAs(UnmanagedType.ByValArray, SizeConst=976)]
  88. private byte[] buff;
  89. };
  90. }
Аналогичное приложение на С++ работает нормально:
Листинг программы
  1. #include <stdio.h>
  2. #include <tchar.h>
  3. #include <Windows.h>
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. DWORD threadId = -1;
  7. printf("Please enter thread ID: ");
  8. scanf("%i", &threadId);
  9. if (threadId > 0)
  10. {
  11. HANDLE handle = OpenThread(THREAD_ALL_ACCESS, FALSE, threadId);
  12. SuspendThread(handle);
  13. CONTEXT context;
  14. context.ContextFlags = CONTEXT_CONTROL;
  15. GetThreadContext(handle, &context);
  16. printf("\nRip: 0x%X\n", context.Rip);
  17. ResumeThread(handle);
  18. CloseHandle(handle);
  19. }
  20. system("pause");
  21. return 0;
  22. }
Есть у кого-то какие-то соображения по этому поводу?

Решение задачи: «.NET 2.x X64 GetThreadContext Error 998: Invalid Access Memory Location»

textual
Листинг программы
  1. typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
  2.  
  3.     //
  4.     // Register parameter home addresses.
  5.     //
  6.     // N.B. These fields are for convience - they could be used to extend the
  7.     //      context record in the future.
  8.     //
  9.  
  10.     DWORD64 P1Home;
  11.     DWORD64 P2Home;
  12.     DWORD64 P3Home;
  13.     DWORD64 P4Home;
  14.     DWORD64 P5Home;
  15.     DWORD64 P6Home;
  16.  
  17.     // ...

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы