Форум программистов, компьютерный форум, киберфорум
Наши страницы
C (Си)
Войти
Регистрация
Восстановить пароль
 
Acuna
0 / 0 / 0
Регистрация: 02.08.2016
Сообщений: 6
1

Прога на С падает с ошибкой нарушение прав записи

07.05.2017, 00:26. Просмотров 443. Ответов 3

Всем привет!

Я просто в шоке, если честно. Нет, может быть это и нормально, просто я ни разу c таким не сталкивался... Пишу расширение для PHP. Набросал код, который меняет иконку в любом экзешнике, который даже не имеет ресурсов изначально. Пользуйтесь, мне не жалко) Компилится и под С, и под С++.

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
        HANDLE hUpdateRes = BeginUpdateResource ("файл", FALSE);
        
        if (hUpdateRes == NULL) {
 
             zend_error (E_WARNING, "res_set (): error opening module: %s", win32_strerror (buffer, WIN32_STRERROR_BUFFER_LEN));
             RETURN_FALSE;
 
        }
 
        HANDLE icoFile = CreateFile ((_TCHAR *) "иконка", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
        
        if (icoFile == INVALID_HANDLE_VALUE) {
            
            zend_error (E_WARNING, "res_set (): icon file not found or incorrect: %s", data);
            CloseHandle (icoFile);
            RETURN_FALSE;
 
        }
 
        DWORD read;
        DWORD size = GetFileSize (icoFile, NULL);
        BYTE *temp = (BYTE *) GlobalAlloc (GMEM_FIXED, size);
 
        ReadFile (icoFile, temp, size, &read, NULL);
        
        ICONDIR *ig = (ICONDIR *) temp;
 
        DWORD newSize = sizeof (GRPICONDIR) + (sizeof (GRPICONDIRENTRY)* (ig->idCount - 1));
        GRPICONDIR *newDir = (GRPICONDIR*) GlobalAlloc (GMEM_FIXED, newSize);
        newDir->idReserved = ig->idReserved;
        newDir->idType = ig->idType;
        newDir->idCount = ig->idCount;
 
        DWORD rv, size1;
        BYTE *offset;
        
        for (int i = 0; i < ig->idCount; i++) {
            
            offset = (temp + ig->idEntries[i].dwImageOffset);
            size1 = ig->idEntries[i].dwBytesInRes;
 
            newDir->idEntries[i].bWidth = ig->idEntries[i].bWidth;
            newDir->idEntries[i].bHeight = ig->idEntries[i].bHeight;
            newDir->idEntries[i].bColorCount = ig->idEntries[i].bColorCount;
            newDir->idEntries[i].bReserved = ig->idEntries[i].bReserved;
            newDir->idEntries[i].wPlanes = ig->idEntries[i].wPlanes;
            newDir->idEntries[i].wBitCount = ig->idEntries[i].wBitCount;
            newDir->idEntries[i].dwBytesInRes = ig->idEntries[i].dwBytesInRes;
            newDir->idEntries[i].nID = (i + 1);
            
            if (UpdateResource (hUpdateRes, RT_ICON, MAKEINTRESOURCE (i + 1), lang, (LPVOID) offset, size1) == 0) {
                
                zend_error (E_WARNING, "res_set (): error updating module: %s", win32_strerror (buffer, WIN32_STRERROR_BUFFER_LEN));
                RETURN_FALSE;
 
            }
            
        }
 
        if (UpdateResource (hUpdateRes, RT_GROUP_ICON, name, lang, (LPVOID) newDir, newSize) == 0) {
            
            zend_error (E_WARNING, "res_set (): error updating module: %s", win32_strerror (buffer, WIN32_STRERROR_BUFFER_LEN));
            RETURN_FALSE;
 
        }
 
        EndUpdateResource (hUpdateRes, FALSE);
        CloseHandle (icoFile);
 
        if (newDir != NULL) GlobalFree (newDir);
        if (temp != NULL) GlobalFree (temp);
Если я пользую его как отдельную прогу - все работает прекрасно, однако когда я переношу его в основной проект (по сути копипастом), все падает когда я обращаюсь к нему уже через PHP. Сам PHP никаких ограничений не накладывает, это просто ретранслятор.

Ругается на эту строку:

C
1
    if (UpdateResource (hUpdateRes, RT_ICON, MAKEINTRESOURCE (i + 1), lang, (LPVOID) offset, size1) == 0) {
Ну как ругается, сам он ни на что не ругается, я наставил бряков и пришел к этой строке, потом проверил все переменные. Вылетает конкретно из-за offset и size1. Цикл работает нормально, ибо если закомментить этот кусок - он проходит его как нужно. Все вылетает не только конкретно в этой строке, но и если попытаться вывести значение этих переменных на экран. Так же сама UpdateResource () отрабатывает нормально, если заменить эти две переменные на вообще рандомные, тогда все правильно пихается в ресурсы (разве что данные при этом фейковые, это да). То есть дело по-любому в них. Ну думаю ладно, не проблема, наверное цикл неверно их формирует, может пустые элементы имеются, однако та же переменная newDir, которая используется во второй UpdateResource (), работает нормально (то есть с ней все работает нормально), хотя она точно так же формируется в этом цикле.

В общем реально, как так можно арканиться?

Заранее благодарен!

Добавлено через 6 часов 30 минут
Ну елки! Нарушение прав на чтение же конечно же! А отредактировать уже нельзя. Вот дела(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2017, 00:26
Ответы с готовыми решениями:

Нарушение прав доступа при записи
Здравствуйте! Я новичок на вашем форуме, буду рад различного рода советам,...

Нарушение прав доступа при записи
подскажите почему возникает ошибка void ChangeBrightness(HDC hdc, RECT In,...

Нарушение прав доступа при записи
Подскажите, пожалуйста, почему при запуске такой программы(она должна в файле...

Нарушение прав доступа при записи (работа с файлами)
вообщем такая проблема (на скринах),если я правильно понял то что то с...

Нарушение прав доступа при записи по адресу 0x00007430
Подскажите, пожалуйста, почему при выполнении программы появляется Вызвано...

3
Acuna
0 / 0 / 0
Регистрация: 02.08.2016
Сообщений: 6
08.05.2017, 17:56  [ТС] 2
C первой переменной расквитался, нужно было просто привести ее к типу BYTE (то есть вот так):

C++
1
offset = (temp + (BYTE) ig->idEntries[i].dwImageOffset);
Но вторая никак не дается. UpdateResource () принимает DWORD последним аргументом, поэтому пробовал привести ее к DWORD (а от безысходности даже к int), но безрезультатно(

P. S. У всех в темах по десять ответов, хотя вопросы тоже касаются банального приведения типов, а у меня ноль уже какой день... Как-то нездорОво это все... Может под другим акком попробовать запостить, вдруг прокатит, ибо может какие предрассудки тут ко мне имеются, хотя оставил-то 4 сообщения всего))
0
shvyrevvg
547 / 515 / 261
Регистрация: 12.05.2016
Сообщений: 1,493
08.05.2017, 19:29 3
Цитата Сообщение от Acuna Посмотреть сообщение
Если я пользую его как отдельную прогу - все работает прекрасно
А компилится без варнингов?
0
Acuna
0 / 0 / 0
Регистрация: 02.08.2016
Сообщений: 6
08.05.2017, 21:29  [ТС] 4
В отдельной проге? Точно, сейчас гляну...

Добавлено через 20 минут
Нет, все чисто( И привести offset принудительно к BYTE не получится, иконка будет битая. Что ж за непруха-то такая?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2017, 21:29

Структуры и связные списки. Нарушение прав доступа при записи
исполняемый файл запускаеться , а когда начинаю вводить данные с клавиатуры...

Динамические массивы: Нарушение прав доступа при записи по адресу 0xCCCCCCCC
При запуске возникает ошибка &quot;Нарушение прав доступа при записи по адресу...

Сортировка qsort - Stack overflow, нарушение прав доступа при записи по адресу
Найдите, пожалуйста, ошибку в коде. Программа завершается с ошиибкой Stack...


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

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

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