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

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

Восстановить пароль Регистрация
 
KyouFujibayashi
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 12
05.06.2016, 14:24     Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 #1
Есть задача
Основное приложение запускает 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);
Вложения
Тип файла: 7z os2.7z (8.37 Мб, 2 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
05.06.2016, 14:41     Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 #2
Цитата Сообщение от KyouFujibayashi Посмотреть сообщение
TCHAR *ProcessName = new TCHAR;
Ты похоже очень жадный на память под строки...
KyouFujibayashi
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 12
08.06.2016, 18:08  [ТС]     Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 #3
проблема актуальна
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
08.06.2016, 19:12     Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000 #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
...
Yandex
Объявления
08.06.2016, 19:12     Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000
Ответ Создать тему

Метки
c++, лабораторные работы, потоки, процессы
Опции темы

Текущее время: 10:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru