Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
.NET 2.x

X64 GetThreadContext Error 998: Invalid Access Memory Location

09.11.2014, 21:46. Показов 3804. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
При попытке получить контекст потока
C#
1
2
if (!GetThreadContext(handle, ref context))
    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?

Вот тестовый исходник на С#:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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;
    };
}
Аналогичное приложение на С++ работает нормально:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#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;
}
Есть у кого-то какие-то соображения по этому поводу?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2014, 21:46
Ответы с готовыми решениями:

Error 1606. Could not access network location \.
Только вот недавно начал общаться с Windows 7 (Номе Basic 32-разрядная) и по началу всё было просто великолепно, все программы...

I/O error 998
написал процедурку для чтения из файла имя файла input (без расширения), файл существует, обладаю всеми нужными правами для его открытия...

Run time error 94 invalid use of null access
Помогите пожалуйста!!!! Вот событие кнопки при нажатии: Private Sub cmdOpenReport_Click() Dim S As String, _ i As Byte 'For i = 1...

18
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
09.11.2014, 23:23
Возможно это происходит потому что программа запускается как x86 (проверте в task manager). Попробуйте настроить платформу в меню построения visual studio. Ещё есть утилита "CorFlags Conversion Tool (CorFlags.exe)" от M$ для настройки платформы и прочих нужд.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 00:00  [ТС]
Процесс x64, это я в первую очередь посмотрел.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
10.11.2014, 00:46
Запускайте debugger ставте breakpoint на GetThreadContext и смотрите что не так.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 01:02  [ТС]
я же написал что не так...
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
10.11.2014, 01:05
Для x64 нужно использовать Wow64GetThreadContext может в этом проблема ?
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 08:14  [ТС]
Такс, вообще-то Wow64GetThreadContext используется для вызова контекста х64 приложением из х86 процесса.

И еще раз, этот код корректно работает если его скомпилировать на другой машине и запустить на текущей, и аналогичный код на С++ тоже работает.
Не работает только компиляция на С# под текущей ОС.

Я еще попробую установить виртуальную машину и проделать все там.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.11.2014, 09:24
Цитата Сообщение от Konctantin Посмотреть сообщение
Есть у кого-то какие-то соображения по этому поводу?
Для начала нужно проверку ошибок сделать. В коде выше она отсутствует, а
без нее выполнить какую-то диагностику проблемы невозможно.
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 10:56  [ТС]
А как же это:
C#
1
2
if (!GetThreadContext(handle, ref context))
    throw new Win32Exception();
Возвращает
Code
1
2
Error code: 998
Message: Invalid Access Memory Location
Или вы что-то другое имеете ввиду?
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
10.11.2014, 12:35
Цитата Сообщение от Konctantin Посмотреть сообщение
вообще-то Wow64GetThreadContext используется для вызова контекста х64 приложением из х86 процесса.
Из msdn "A 64-bit application can retrieve the context of a WOW64 thread using the Wow64GetThreadContext function."
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 13:19  [ТС]
Мда уж... вы тему читали? Wow64GetThreadContext - здесь ни при чем. Не для того он.
Да и если вам так хочется знать то Wow64GetThreadContext принимает в качестве параметра указатель на структуру WOW64_CONTEXT, и если вы посмотрите ниже, то увидите что это структура для контекста х86.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
typedef struct _WOW64_CONTEXT {
 
    //
    // The flags values within this flag control the contents of
    // a CONTEXT record.
    //
    // If the context record is used as an input parameter, then
    // for each portion of the context record controlled by a flag
    // whose value is set, it is assumed that that portion of the
    // context record contains valid context. If the context record
    // is being used to modify a threads context, then only that
    // portion of the threads context will be modified.
    //
    // If the context record is used as an IN OUT parameter to capture
    // the context of a thread, then only those portions of the thread's
    // context corresponding to set flags will be returned.
    //
    // The context record is never used as an OUT only parameter.
    //
 
    DWORD ContextFlags;
 
    //
    // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
    // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT
    // included in CONTEXT_FULL.
    //
 
    DWORD   Dr0;
    DWORD   Dr1;
    DWORD   Dr2;
    DWORD   Dr3;
    DWORD   Dr6;
    DWORD   Dr7;
 
    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
    //
 
    WOW64_FLOATING_SAVE_AREA FloatSave;
 
    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_SEGMENTS.
    //
 
    DWORD   SegGs;
    DWORD   SegFs;
    DWORD   SegEs;
    DWORD   SegDs;
 
    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_INTEGER.
    //
 
    DWORD   Edi;
    DWORD   Esi;
    DWORD   Ebx;
    DWORD   Edx;
    DWORD   Ecx;
    DWORD   Eax;
 
    //
    // This section is specified/returned if the
    // ContextFlags word contians the flag CONTEXT_CONTROL.
    //
 
    DWORD   Ebp;
    DWORD   Eip;
    DWORD   SegCs;              // MUST BE SANITIZED
    DWORD   EFlags;             // MUST BE SANITIZED
    DWORD   Esp;
    DWORD   SegSs;
 
    //
    // This section is specified/returned if the ContextFlags word
    // contains the flag CONTEXT_EXTENDED_REGISTERS.
    // The format and contexts are processor specific
    //
 
    BYTE    ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
 
} WOW64_CONTEXT;
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.11.2014, 13:54
Konctantin, структура CONTEXT для этой функции должна быть
выравнена по 16-байтовой границе.
Windows 7 SDK, WinNT.h:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
 
    // ...
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 14:05  [ТС]
Оно то так, но ошибка не из-за этого, я игрался с Pack в StructLayout.
Да я же говорю что если скомпилировать это приложение на другом компьютере - все работает (и на этом тоже).

У меня все такие подозрения на саму студию, возможно что-то с настройками или даже хз.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.11.2014, 14:20
Konctantin, Pack здесь не причем, выравнен должен быть сам адрес,
который выделяется под структуру CONTEXT. Вот выведите его на экран перед
вызовом GetThreadContext.

Добавлено через 32 секунды
Цитата Сообщение от Konctantin Посмотреть сообщение
У меня все такие подозрения на саму студию
Уверен на 99.9999999%, что Студия, Windows и Билл Гейтс тут не при чем

Добавлено через 8 минут
В качестве теста можете вместо new попробовать VirtualAlloc, например -
она выделяет память, выравненную по размеру страницы (4096 байт).
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 14:30  [ТС]
Уверен на 99.9999999%, что Студия, Windows и Билл Гейтс тут не при чем
Ну я согласен что вышеперечисленное здесь не причем
возможно что-то с настройками
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
10.11.2014, 14:53
C++
1
typedef struct DECLSPEC_ALIGN(16) _CONTEXT
Да это сто пудов из за выравнивания.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 16:48  [ТС]
На виртуальную машину поставил Windows 10 TP x64 & Visual Studio 2013
Скомпилировал код из первого поста, запустил - все работает.

Значит что-то с настройками.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.11.2014, 17:09
Лучший ответ Сообщение было отмечено Konctantin как решение

Решение

Konctantin, проблема именно из-за выравнивание адреса по которому расположена структура, как и написал Убежденный.

Пример: (Win 10 TP Enterprise x64 & VS 2013)
C#
1
2
3
4
5
6
7
8
Addr: new - 1047924105264 (aligned), alloc - 1047925696624 (aligned)
alloc Rip: 0x7FFE1CE4941A
new Rip: 0x7FFE1CE4941A
 
Plese enter the thread Id: 1032
Addr: new - 64112221656 (not aligned), alloc - 64114338032 (aligned)
alloc Rip: 0x7FFE1CE4941A
Invalid access to memory location
Причем проявляться может из-за последовательности инициализации объектов в коде, пример:
Вот так не работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                var pMem = (void*)Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CONTEXT)));
                ((CONTEXT*)pMem)->ContextFlags = 0x100001u;
                var context = new CONTEXT { ContextFlags = 0x100001u /* CONTROL */ };
                var ptr = &context;
 
                Console.WriteLine("Addr: new - {0}, alloc - {1}", (ulong)ptr, (ulong)pMem);
                if (!GetThreadContext(handle, (CONTEXT*)pMem))
                    throw new Win32Exception(); 
 
                Console.WriteLine("alloc Rip: 0x{0:X}", ((CONTEXT*)pMem)->Rip);
 
                if (!GetThreadContext(handle, ref context))
                    throw new Win32Exception();
 
                Console.WriteLine("new Rip: 0x{0:X}", context.Rip);
А вот так уже заработало:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                var context = new CONTEXT { ContextFlags = 0x100001u /* CONTROL */ };
                var pMem = (void*)Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CONTEXT)));
                ((CONTEXT*)pMem)->ContextFlags = 0x100001u;
                var ptr = &context;
 
                Console.WriteLine("Addr: new - {0}, alloc - {1}", (ulong)ptr, (ulong)pMem);
                if (!GetThreadContext(handle, (CONTEXT*)pMem))
                    throw new Win32Exception(); 
 
                Console.WriteLine("alloc Rip: 0x{0:X}", ((CONTEXT*)pMem)->Rip);
 
                if (!GetThreadContext(handle, ref context))
                    throw new Win32Exception();
 
                Console.WriteLine("new Rip: 0x{0:X}", context.Rip);
2
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
10.11.2014, 21:28  [ТС]
Спасибо, да уж... и все же совсем не понятно почему скомпилированный код на другой машине работает нормально.
Аптайм уже пару дней (около 10000 срабатываний).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2014, 21:28
Помогаю со студенческими работами здесь

Ошибки: "invalid use of non-static data member", "error: from this location"
Здравствуйте. Помогите пожалуйста понять в чём я не прав. Почему компилятор не даёт объявить указатель на структуру и почему я не могу...

Ошибка "Error 1606. Could not access network location 0\" при установке Delphi 7
Здравствуйте! Нужна ваша помощь. При установке Delphi 7 выдает ошибку &quot;Error 1606. Could not access network location 0\&quot;....

Ошибка bad_alloc at memory location
Мне нужно создать метод для обработки массива. И в методе мне нужно создать динамический массив типа дабл. Когда я компилирию код...

Unhandled exception.std::out_of_range at memory location. ошибка
Доброго времени суток! Задача такая: Если с четырёхцифрового убрать любую цифру, получим трёхцифровое число, которое будет его...

Std::invalid_argument at memory location 0x004ff460|Visual Studio
Ребята кто може помочь написал вот програму запускаю и тут вылетает https://**********/a/QvQhCM3 Что делать не знаю 1 раз такое.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru