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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Создать стек http://www.cyberforum.ru/cpp-beginners/thread1755119.html
Задание: Создать стек. Написать функцию, определяющую, есть ли заданная компонента в стеке. В программу включить меню работы с программой, которое должно содержать пункты: а) создание исходной...
C++ Алгоритм действий Всем привет. Мне требуется проделать такие действия: 1. Запускается приложение. Допустим, samp.exe 2. После запуска samp.exe автоматически должен отправиться php-запрос. Ну, и у меня есть пару... http://www.cyberforum.ru/cpp-beginners/thread1755116.html
C++ Последние значения из файла выводятся два раза
#include <iostream> #include <conio.h> #include <stdlib.h> #include <fstream> #include <stdio.h> bool ff = false; using namespace std; typedef unsigned int ui; /*3. Дана информация о пяти...
C++ Не выводется результат
Вот код програмы не получаестя вывесть результат если метод summ прописать как обычную функцию то всё работает нормально а как метод не хочет подскажите пожалуйста в чём проблема #include...
C++ Двумерный массив http://www.cyberforum.ru/cpp-beginners/thread1755077.html
Двумерный массив n на m содержит некоторые буквы русского алфавита, расположенные в произвольном порядке. Написать программу, проверяющую, можно ли из этих букв составить данное слово S. Каждая буква...
C++ Функции и массивы Доброго времени суток.Помогите кому не в тягость с заданием.. Выполнить задание третьего семинара(1).. В одномерном массиве,состоящем из N целых элементов,вычислить: 1)произведение элементов... подробнее

Показать сообщение отдельно
KyouFujibayashi
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 12

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

05.06.2016, 14:24. Просмотров 1054. Ответов 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 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru