Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KyouFujibayashi
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 12
#1

Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 - C++

05.06.2016, 14:24. Просмотров 1193. Ответов 3

Есть задача
Основное приложение запускает 2 приложения с приостановленными основными потоками. Запускаемые приложения однотипны и содержат единственный поток с логикой: сканирует перебором пространство идентификаторов процессов и пытается "получить доступ" к ним. Попеременно запуская эти два потока на случайное время (равномерно распределено от 5 до 10 мс) 3 раза, основной процесс если обнаруживает, что один из процессов получил доступ более чем к 10-ти процессам - уничтожает его
Есть решение
Основное приложение:
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <Windows.h>
#include <locale.h>
using namespace std;
 
#define BUF_SIZE 256
#define _CRT_SECURE_NO_WARNINGS
 
 
TCHAR szName[] = TEXT("MyFileMappingObject");
TCHAR szNameSecond[] = TEXT("MyFileMappingObjectSecond");
TCHAR szMsg[] = TEXT("10");
 
void Mythread(PROCESS_INFORMATION myTh)
{
    srand(time(NULL));
    double t = 1000 + rand() % 2000;
    ResumeThread(myTh.hThread);
    Sleep(t);
    SuspendThread(myTh.hThread);
}
 
 
DWORD WINAPI mainThread()
{
 
    // Zadanie peremennyh
    STARTUPINFO si;                     // struktura s informaciej o zapuske processa
    PROCESS_INFORMATION pi[2];          // struktura s informaciej o 2 processah
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    HANDLE hMapFile;                    // mapping file handle
    LPCTSTR pBuf;                       // ukazatel' na nachal'nyj adres
    TCHAR *ProcessName = new TCHAR;
    bool flag = true, flag2 = true;
 
 
    // sozdanie, zapusk i unichtozhenie 2h processov
 
    mbstowcs(ProcessName, "C:\\Users\\Username\\os2\\OsLab2FProc\\Debug\\OsLab2FProc.exe", 250);
    if (!CreateProcess(ProcessName,
        NULL,
        NULL,
        NULL,
        FALSE,
        CREATE_NEW_CONSOLE,
        NULL,
        NULL,
        &si,
        &pi[0])
        )
        printf("CreateProcess failed, error - %d.\n", GetLastError());
    SuspendThread(pi[0].hThread);
 
    mbstowcs(ProcessName, "C:\\Users\\Username\\os2\\OsLab2SProc\\Debug\\OsLab2SProc.exe", 250);
    if (!CreateProcess(ProcessName, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi[1]))
        printf("CreateProcess failed, error - %d.\n", GetLastError());
    SuspendThread(pi[1].hThread);
 
    for (int i = 0; i < 3; i++)         // zaderzhki mezhdu iteracijami u odnogo potoka net, ona voznikaet tol'ko pri zapuske vtorogo
    {
        // pervyj potok
        if (flag == true)
        {
            Mythread(pi[0]);
            hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szName);
            if (hMapFile == NULL)
            {
                printf("Can not open file mapping object (%d).\n", GetLastError());
                _getch();
                return 1;
            }
 
            pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
            if (pBuf == NULL)
            {
                printf("Presentation of the file can not be projected (%d).\n", GetLastError());
                _getch();
                CloseHandle(hMapFile);
                return 1;
            }
 
            if (lstrcmp(pBuf, szMsg) == 0)
            {
                TerminateProcess(pi[0].hProcess, 0);
                UnmapViewOfFile(pBuf);
                CloseHandle(hMapFile);
                flag = false;
            }
        }
 
 
        // vtoroj potok
        if (flag2 == true)
        {
            Mythread(pi[1]);
            hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szNameSecond);
            if (hMapFile == NULL)
            {
                printf("Can not open file mapping object (%d).\n", GetLastError());
                _getch();
                return 1;
            }
 
            pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
            if (pBuf == NULL)
            {
                printf("Presentation of the file can not be projected (%d).\n", GetLastError());
                _getch();
                CloseHandle(hMapFile);
                return 1;
            }
 
            if (lstrcmp(pBuf, szMsg) == 0)
            {
                TerminateProcess(pi[1].hProcess, 0);
                UnmapViewOfFile(pBuf);
                CloseHandle(hMapFile);
                flag2 = false;
            }
        }
    }
 
    if (pi[0].hProcess != NULL) TerminateProcess(pi[0].hProcess, 0);
    if (pi[1].hProcess != NULL) TerminateProcess(pi[1].hProcess, 0);
 
 
    // zakrytie deskriptorov processov i potokov.
 
    CloseHandle(pi[0].hProcess);
    CloseHandle(pi[0].hThread);
    CloseHandle(pi[1].hProcess);
    CloseHandle(pi[1].hThread);
    return 0;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE mT = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(&mainThread), 0, 0, 0);
    WaitForSingleObject(mT,INFINITE);
    CloseHandle(mT);
    return 0;
}
Дополнительные приложения:
OsLab2FProc
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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <locale.h>
#include <tlhelp32.h>
 
#define BUF_SIZE 256
TCHAR szName[] = TEXT("MyFileMappingObject");
TCHAR szMsg[] = TEXT("10");
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hMapFile, hProcessSnap;
    LPCTSTR pBuf;
    PROCESSENTRY32 pe32;
 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) return 1;
 
    pe32.dwSize = sizeof(PROCESSENTRY32);
 
    hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // ispol'zovanie fajla podkachki
        NULL,                    // zashhita po umolchaniju
        PAGE_READWRITE,          // dostup k chteniju/zapisi
        0,                       // maks. razmer objekta
        BUF_SIZE,                // razmer bufera
        szName);                 // imja otrazhennogo v pamjati ob#ekta
    if (hMapFile == NULL)
    {
        printf("Can not open file mapping object (%d).\n", GetLastError());
        _getch();
        return 1;
    }
 
    pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
    if (pBuf == NULL)
    {
        printf("Presentation of the file can not be projected (%d).\n", GetLastError());
        _getch();
        CloseHandle(hMapFile);
        return 1;
    }
 
    int i = 0;
 
    while (Process32Next(hProcessSnap, &pe32)) {
        printf("pe32.th32ProcessID= %x\n", pe32.th32ProcessID);
        Sleep(100);
        if (i == 10) CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
        i++;
    }
 
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    CloseHandle(hProcessSnap);
    return 0;
}
OsLab2SProc
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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
#include <locale.h>
#include <tlhelp32.h>
 
#define BUF_SIZE 256
TCHAR szNameSecond[] = TEXT("MyFileMappingObjectSecond");
TCHAR szMsg[] = TEXT("10");
 
int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hMapFile, hProcessSnap;
    LPCTSTR pBuf;
    PROCESSENTRY32 pe32;
 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) return 1;
 
    pe32.dwSize = sizeof(PROCESSENTRY32);
 
    hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // ispol'zovanie fajla podkachki
        NULL,                    // zashhita po umolchaniju
        PAGE_READWRITE,          // dostup k chteniju/zapisi
        0,                       // maks. razmer objekta
        BUF_SIZE,                // razmer bufera 
        szNameSecond);                 // imja otrazhennogo v pamjati objekta
    if (hMapFile == NULL)
    {
        printf("Can not open file mapping object (%d).\n", GetLastError());
        _getch();
        return 1;
    }
 
    pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
    if (pBuf == NULL)
    {
        printf("Presentation of the file can not be projected (%d).\n", GetLastError());
        _getch();
        CloseHandle(hMapFile);
        return 1;
    }
 
    int i = 0;
 
    while (Process32Next(hProcessSnap, &pe32)) {
        printf("pe32.th32ProcessID= %x\n", pe32.th32ProcessID);
        Sleep(100);
        if (i == 10) CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
        i++;
    }
 
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    CloseHandle(hProcessSnap);
    return 0;
}
Во время работы выбрасывается ошибка
Exception thrown at 0x77D75BCA (ntdll.dll) in OsLab2.exe: 0xC0000005: Access violation reading location 0x0000792E.
Вот что я смог выяснить:
1). Метод mainThread выполняется без ошибок(я ставил брейкпоинт на в конце этого метода и он успешно срабатывал).
2). Насколько я понимаю, ошибка выбрасывается в методе _tmain во время вызова WaitForSingleObject(mT, INFINITE);
0
Вложения
Тип файла: 7z os2.7z (8.37 Мб, 2 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2016, 14:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 (C++):

Ошибка: Unhandled exception at 0x772115de in TimeShift.exe: 0xC0000005: Access violation reading location 0x00041000. - C++
всем привет! При использовании двумерного массива постоянно появляется ошибка :Unhandled exception at 0x772115de in TimeShift.exe:...

Unhandled exception at 0x0F73DF62 | 0xC0000005: Access violation writing location - C++
Многоуважаемые форумчане, необходима небольшая консультация по следующему коду: #include&lt;iostream&gt; #include&lt;fstream&gt; ...

Перегрузка assing operator. Unhandled exception at 0x103157aa (msvcr100d.dll) in 1exColonSynt_withColonSynt.exe: 0xC0000005: Access violation read - C++
Значит есть линия (класс Line ) , которая состоит из точек (Class Point). Хочется Одной линии передать значения другой. Я перегрузил...

access violation reading location - C++
access violation reading location такая проблема если вести информацию про двух и больше студентов помогите пожалуйста очень срочно надо ...

Access violation reading location - C++
Помогите пожалуйста! Создаю программу, которая ведет учет данных. В бинарный dat-файл записываются объекты класса (Account) -...

Access violation reading location - C++
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На...

3
nonedark2008
933 / 672 / 148
Регистрация: 28.07.2012
Сообщений: 1,837
05.06.2016, 14:41 #2
Цитата Сообщение от KyouFujibayashi Посмотреть сообщение
TCHAR *ProcessName = new TCHAR;
Ты похоже очень жадный на память под строки...
0
KyouFujibayashi
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 12
08.06.2016, 18:08  [ТС] #3
проблема актуальна
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
08.06.2016, 19:12 #4
А ничего, что Вы выделяете под ProcessName 1 символ, но при этом указываете в mbstowcs, что доступно по этому адресу 250?
C++
1
2
3
4
5
...
TCHAR *ProcessName = new TCHAR;  //выделили 1 символ TCHAR
...
mbstowcs(ProcessName, "C:\\Users\\Username\\os2\\OsLab2FProc\\Debug\\OsLab2FProc.exe", 250); //а тут указываем, что доступно 250
...
0
08.06.2016, 19:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2016, 19:12
Привет! Вот еще темы с ответами:

ошибка Access violation reading location 0x00000066 - C++
Ошибка : Unhandled exception at 0x100e14cf (msvcr100d.dll) in 3.4.exe: 0xC0000005: Access violation reading location 0x00000066. ...

Помогите с ошибкой Access violation reading location 0x1ed1d9f8. - C++
Не могу разобраться с VS.... У меня был хороший, проверенный проект, в котором все хорошо работало и небыло проблем. Тут я стал добавлять в...

Массивы указателей и ошибка Access violation reading location - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class Number { public: int x; int calc(Number* start,...

Ошибка вида "Unhandled exception thrown: read access violation" - C++
Использую парсер tinyXML2. Программа собирается в режиме Debug. При запуске ее из студии - все работает. Но если запустить ее .exe файл из...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.