Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.10.2022
Сообщений: 27
MASM32

Чтение и запись в файл: нарушение прав доступа при записи по адресу

11.12.2022, 11:23. Показов 1547. Ответов 6

Студворк — интернет-сервис помощи студентам
Реализую программу чтения с файла и записи в файл на ассемблере при помощи winApi , но столкнулся с проблемой нарушение прав доступа при записи по адресу в 115 строке и никак не могу понять в чем проблема
Assembler
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
.386
    .model flat, stdcall
    includelib kernel32.lib
 
GetStdHandle            PROTO,                    ;//возвращается дескриптор для стандартного устройства ввода , стандартного устройства вывода либоя устройства вывода сообщений об ошибках 
                        handle:             DWORD 
 
WriteConsoleA           PROTO,                      ;//Выводит строку символов в буфер экрана терминала , начиная с текущего положения курсора 
                        handle:             DWORD,
                        bufferPtr:          PTR BYTE,
                        maxBytes:           DWORD,
                        bytesWrittenPtr:    DWORD,
                        __reserved:         DWORD
 
ReadConsoleA            PROTO,
                        handle:             DWORD,
                        bufferPtr:          PTR BYTE,
                        maxBytes:           DWORD,
                        bytesReadPtr:       DWORD,
                        __reserved:         DWORD
 
ExitProcess             PROTO,
                        code:               DWORD
 
SetConsoleTextAttribute PROTO,                     ;//устанавливает атрибуты цвета символов и фона выводимых на экран
                        handle:             DWORD,
                        attribute:          WORD
 
FlushConsoleInputBuffer PROTO,
                        handle:                 DWORD
 
AllocConsole            PROTO
 
AttachConsole           PROTO,
                        processId:              DWORD
 
CreateFileA             PROTO,
                        filename:               PTR BYTE,
                        desiredAccess:          DWORD,
                        shareMode:              DWORD,
                        securityAttributes:     DWORD,
                        creationDisposition:    DWORD,
                        flagsAndAttributes:     DWORD,
                        templateFile:           DWORD
 
GetLastError            PROTO
 
WriteFile               PROTO,
                        hFile:                  DWORD,
                        lpBuffer:               PTR BYTE,
                        nNumberOfBytesToWrite:  DWORD,
                        lpNumberOfBytesWritten: DWORD,
                        lpOverlapped:           DWORD
 
ReadFile                PROTO,
                        hFile:                  DWORD,        
                        lpBuffer:               PTR BYTE,
                        nNumberOfBytesToRead:   DWORD,
                        lpNumberOfBytesRead:    DWORD,      ;   %optional
                        lpOverlapped:           DWORD       ;   %optional
 
 
 
.data
    Ln                      EQU                 <0dh, 0ah>      ; The end of line - breaks a line if printed.              
    LnLength                EQU                 ($-Ln)          ; The end of line length.
    Filename                BYTE                1024 DUP(?)     ; The file name that should be read
    Text                    BYTE                8192 DUP(?)     ; The text that will be in the file
    ConsoleHandleInput      DWORD               0               ; Got console input handle. Is used for ReadConsoleA function. 
    ConsoleHandleOutput     DWORD               0               ; Got console output handle. Is used for WriteConsoleA function.     
    MaxInputBytes           DWORD               1024            ; Max bytes that can be written. It means that you can write not more than 1024 characters
    BytesWritten            DWORD               ?               ; Byte count actually written
    BytesRead               DWORD               ?               ; Byte count actually read
    EnterStringMessage      DB                  "Enter string that will be written and read: "
    EnterStringMessageL     DD                  ($-EnterStringMessage)
    EnterFilenameMessage    DB                  "Enter the name of a file where the text will be written to: "
    EnterFilenameMessageL   DD                  ($-EnterFilenameMessage)
    BeforeMessage           DB                  Ln, "String was written and read at the same time. ", Ln, Ln, "Your string before writting: ", 9, 9
    BeforeMessageL          DD                  ($-BeforeMessage)
    AfterMessage            DB                  "Your string after writting: ", 9, 9
    AfterMessageL           DD                  ($-AfterMessage)
    ExitMessage             DB                  " ", Ln, Ln, Ln, Ln, Ln, Ln, Ln, Ln, Ln, Ln, Ln, Ln, Ln
    ExitMessageL            DD                  ($-ExitMessage)
    FileHandle              DWORD               ?
 
 
 
.code
    fread PROC 
        push 0
        push 8192
        push OFFSET BytesWritten
        push OFFSET Text
        push FileHandle
        call ReadFile
    fread ENDP
 
    fwrite PROC
        push 0                  ; No template file
        push 128                ; FILE_ATTRIBUTE_NORMAL
        push 2                  ; CREATE_ALWAYS
        push 0                  ; NULL
        push 0                  ; DO_NOT_SHARE
        push 80000000h          ; GENERIC_READ
        push OFFSET Filename    ; File name to read
        call CreateFileA
        mov  FileHandle, eax
        
        push 0
        push 8192
        push OFFSET BytesWritten
        push OFFSET Text
        push FileHandle
        call WriteFile
        ret
    fwrite ENDP
 
    main PROC
        ; Console setup:
        push -1
        call AttachConsole
 
        push -10
        call GetStdHandle
        mov ConsoleHandleInput, eax
 
        push -11
        call GetStdHandle
        mov ConsoleHandleOutput, eax
        ; --- --- --- --- --- --- ---
 
        ; Requesting the text
        push 15
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push EnterStringMessageL
        push OFFSET EnterStringMessage
        push ConsoleHandleOutput
        call WriteConsoleA 
 
        push 8
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesRead
        push MaxInputBytes
        push OFFSET Text
        push ConsoleHandleInput
        call ReadConsoleA
        ; --- --- --- ---
 
        ; Requesting the filename
        push 15
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push EnterFilenameMessageL
        push OFFSET EnterFilenameMessage
        push ConsoleHandleOutput
        call WriteConsoleA 
 
        push 8
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesRead
        push 1024
        push OFFSET Filename
        push ConsoleHandleInput
        call ReadConsoleA
        ; --- --- --- ---
 
        push 15
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push BeforeMessageL
        push OFFSET BeforeMessage
        push ConsoleHandleOutput
        call WriteConsoleA
 
        push 10
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push 8192
        push OFFSET Text
        push ConsoleHandleOutput
        call WriteConsoleA
 
        ; Function call
        call fwrite
        call fread
 
        push 15
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push AfterMessageL
        push OFFSET AfterMessage
        push ConsoleHandleOutput
        call WriteConsoleA
 
        push 10
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push 8192
        push OFFSET Text
        push ConsoleHandleOutput
        call WriteConsoleA
 
        push 0
        push ConsoleHandleOutput
        call SetConsoleTextAttribute
 
        push 0
        push OFFSET BytesWritten
        push ExitMessageL
        push OFFSET ExitMessage
        push ConsoleHandleOutput
        call WriteConsoleA
 
        ; Exiting a program
        push 0
        call ExitProcess
    main ENDP
END main
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2022, 11:23
Ответы с готовыми решениями:

Необработанное исключение по адресу, нарушение прав доступа при записи по адресу
вот само задание: Авиарейсы (номер рейса, пункт назначения, время вылета, дата вылета, стоимость билета, количество мест). Выбор по дате...

Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу
Помогите, пожалуйста, исправит ошибку. Необработанное исключение по адресу 0x77D88E19 (ntdll.dll) в Lab11.exe: 0xC0000005: нарушение...

Вызвано исключение по адресу 0x003F2357 в Лабораторна 15.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x
Что это такое и как это исправить? Вот фрагмент кода где и есть проблема: ... int size = 9; int **intMas =...

6
16 / 13 / 3
Регистрация: 09.05.2021
Сообщений: 58
11.12.2022, 12:49
Подробно не вникал, но в процедуре fread, после строки 95, нет RET. Проверте может в этом проблема.
0
0 / 0 / 0
Регистрация: 22.10.2022
Сообщений: 27
11.12.2022, 12:54  [ТС]
hryapacowСпасибо за ваш ответ , к сожалению не помогло(
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8609 / 4450 / 1663
Регистрация: 01.02.2015
Сообщений: 13,823
Записей в блоге: 10
11.12.2022, 13:53
Лучший ответ Сообщение было отмечено radZZe как решение

Решение

radZZe, сделайте минимальную тестовую программу, содержащую только обращения к файлу - все имена файлов определите константами, чтобы и размер кода для анализа уменьшить и видеть только суть.
Кроме того, для чтения открывал файл с другими параметрами
Assembler
1
2
3
4
5
6
7
8
9
        invoke  CreateFile,\
                        ADDR aszFileName,\      ;file name
                        GENERIC_READ,\          ;open for reading
                        0,\                     ;do not share
                        NULL,\                  ;default security (no security)
                        OPEN_EXISTING,\         ;existing file only
                        FILE_ATTRIBUTE_NORMAL,\ ;normal file
                        NULL                    ;no attr. template
        mov     [hFile],        eax
Для записи параметры открытия были
Assembler
1
2
3
4
5
6
7
        invoke  CreateFile,     ADDR aszFileName,\      ;lpFileName
                                GENERIC_WRITE,\         ;dwDesiredAccess
                                NULL,\                  ;dwShareMode
                                NULL,\
                                CREATE_ALWAYS,\
                                FILE_ATTRIBUTE_NORMAL,\
                                NULL
Это к тому, что у Вас параметры противоречивые - GENERIC_READ и CREATE_ALWAYS.

Далее, не вижу команду закрытия файла ни после записи ни после чтения
Assembler
1
        invoke  CloseHandle,    [hFile]
Также, все обращения к внешним устройствам должны проверяться на правильное завершение.
https://www.cyberforum.ru/post14452061.html
чтобы было понятно, какая причина ошибки.

Добавлено через 1 минуту
Проверка корректности открытия для чтения
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        ;открытие файла на чтение
        mov     [hFile],        INVALID_HANDLE_VALUE
        invoke  CreateFile,\
                        ADDR aszFileName,\      ;file name
                        GENERIC_READ,\          ;open for reading
                        0,\                     ;do not share
                        NULL,\                  ;default security (no security)
                        OPEN_EXISTING,\         ;existing file only
                        FILE_ATTRIBUTE_NORMAL,\ ;normal file
                        NULL                    ;no attr. template
        mov     [hFile],        eax
        cmp     eax,    INVALID_HANDLE_VALUE
        jne     @@ReadFromFile
        invoke  WriteConsole, hConsoleOutput, ADDR aszErrorFileOpen,\
                LENGTHOF aszErrorFileOpen - 1, ADDR BufLen, NULL
        jmp     @@CloseFile
        ;чтение файла и вывод на экран
@@ReadFromFile:
Добавлено через 1 минуту
Проверка корректности открытия на запись с использованием библиотечной функции ил masm32
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        invoke  CreateFile,     ADDR aszFileName,\      ;lpFileName
                                GENERIC_WRITE,\         ;dwDesiredAccess
                                NULL,\                  ;dwShareMode
                                NULL,\
                                CREATE_ALWAYS,\
                                FILE_ATTRIBUTE_NORMAL,\
                                NULL
        cmp     eax,    INVALID_HANDLE_VALUE
        jne     @f
                ;сообщение об ошибке открытия на запись
                invoke  GetErrDescription,      0
                jmp     @@Exit
        @@:
        mov     [hFile],        eax
Добавлено через 1 минуту
Запись в файл с проверкой корректности
Assembler
1
2
3
4
5
6
7
8
        invoke  WriteFile,      [hFile], ADDR aBuffer, [nBufLen],
                ADDR temp, NULL
        test    eax,    eax
        jne     @f
                ;сообщение об ошибке при записи
                invoke  GetErrDescription,      0
                jmp     @f
        @@:
Добавлено через 51 секунду
Чтение из файла с проверкой корректности
Assembler
1
2
3
4
5
6
7
8
9
10
        ;чтение файла и вывод на экран
@@ReadFromFile:
        invoke  ReadFile,      hFile, ADDR Buffer, SIZEOF Buffer,\
                                ADDR dwBytesRead, NULL
        or      eax,    eax
        jnz     @@ShowFile
        invoke  WriteConsole, hConsoleOutput, ADDR aszErrorFileRead,\
                LENGTHOF aszErrorFileWrite - 1, ADDR BufLen, NULL
        jmp     @@BreakRead
@@ShowFile:
Добавлено через 19 минут
Примеры программ
чтение файла
Построчное чтение и вывод из текстового файла
запись в файл
Программа ничего не записывает в файл
Длина строки, считанной из текстового файла
Запись в текстовый файл (txt) строк и чисел
0
0 / 0 / 0
Регистрация: 22.10.2022
Сообщений: 27
11.12.2022, 15:22  [ТС]
ФедосеевПавел огромное спасибо за решение понял свои ошибки , щас решил проверить пример чтения из файла из предложенных вами решений но почему то выдает ошибку constant expected в winextra.inc
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6180 / 2416 / 400
Регистрация: 29.07.2014
Сообщений: 3,151
Записей в блоге: 4
11.12.2022, 17:07
Ахренеть! 200 овер строк для чтения/записи в файл?
Именно вот с таких примеров и начинается говно-кодерство.
ТС, советую в корень пересмотреть подход, иначе это войдёт в привычку.
Вместо Read/Write/CreateFile() в кучей ненужных параметров, используйте простые _lread/_lwrite/_lcreat из той-же либы Kernel32.dll. В конечном счёте они всё равно вызывают ваши функции, но зато имеют всего по 2 реально нужных аргумента. Компилятор должен работать на вас, а не вы на него. Как результат, всю вашу задачу можно будет запихать всего в пару десятков строк, и это вместе с запросом на ввод-вывод.
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8609 / 4450 / 1663
Регистрация: 01.02.2015
Сообщений: 13,823
Записей в блоге: 10
11.12.2022, 21:33
Цитата Сообщение от radZZe Посмотреть сообщение
выдает ошибку constant expected в winextra.inc
Затрудняюсь ответить.
Скопировал исходник из сообщения
компилировал командами
Windows Batch file
1
2
c:\masm32\bin\ml.exe /Fl /c /coff /X main.asm
c:\masm32\bin\link.exe /SUBSYSTEM:CONSOLE main.obj
Создал файл infile.txt со случайным текстом в той же папке, что и main.exe
Запустил - работает
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.12.2022, 21:33
Помогаю со студенческими работами здесь

Вызвано исключение по адресу 0x01068781 в 2nd.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCCCCCCCC
Доброго времени суток, кто может помочь по вопросу? Постоянно выбивает ошибку. Мне кажется, там еще память не выделена, но я не полностью...

Вызвано исключение по адресу 0x010F2FF7 в Project25.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xFDFDF
Всплывает окно на 45ой строке с сообщением: &quot;Вызвано исключение по адресу 0x010F2FF7 в Project25.exe: 0xC0000005: нарушение прав доступа...

Вызвано исключение по адресу 0x00391083 в TEST.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000
#include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; #include &lt;ctime&gt; using namespace std; int main() { ...

Нарушение прав доступа при записи по адресу
Здравствуйте! Мне нужно организовать циклическую очередь используя массив указателей на структуры. Я вроде сделал, но при добавлении...

Нарушение прав доступа при записи по адресу
Нужно просуммировать двухмерный динамический массив. Если я ввожу a1 &gt;= b1 то программа работает, а если ввожу a1&lt; b1 например 1,3...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »