Почему этот код ассемблера masm не работает в цикле, код работает в первый раз, но в цикле не работает
Эй, я использую masm уже 2 недели и пытаюсь читать текстовые файлы построчно, в которых есть пути к файлам
example of text file
C:\a.rar
C:\a.txt
C:\a.png
тогда я хочу прочитать все содержимое пути к файлу и получить контрольную сумму md5 пути к файлу
приведенный ниже код отлично работает в первый раз (первое окно сообщения - путь к файлу, второе - содержимое файла и третье - контрольная сумма md5)
но затем после первого цикла он читает путь ко второму файлу, но не может прочитать содержимое второго файла, а затем вылетает, потому что у него нет контрольной суммы md5.
Должно быть, это простая ошибка - не сбрасывать что-либо или не закрывать что-то, но я потратил на это около 20 часов и не могу заставить его работать
например, приведенный ниже код находится в кнопке, и когда вы нажимаете кнопку, это то, что он должен делать
message box C:\a.rar
message box "contents of file"
message box 44644af7515bc4870d44fa688684798
message box C:\a.txt
message box "contents of file"
message box 6057f13c496ecf7fd777ceb9e79ae285
message box C:\a.png
message box "contents of file"
message box 01654ab48d84f484z446ba48453cb48
но это то, что происходит
message box C:\a.rar
message box "contents of file"
message box 44644af7515bc4870d44fa688684798
message box C:\a.txt
blank contents cant read the contents of the file on loop (this is the problem)
message box blank because it cant md5 no contents
авария
может кто-нибудь, пожалуйста, помогите
LOCAL Buffer3 :DWORD
invoke CreateFile, ADDR filestoscan, GENERIC_READ, 0, 0,OPEN_EXISTING, 0, 0
mov hFile, eax
invoke GetFileSize,hFile,NULL
mov Byteforstreamreader,eax
streamreader2:
.if Byteforstreamreader != 0
invoke ReadFile, hFile, ADDR Buffer2,1, ADDR BytesWritten, 0
.if Buffer2 == 13
invoke CreateFile, ADDR StringBuffer, GENERIC_READ, 0, 0,OPEN_EXISTING, 0, 0
mov hFile2, eax
invoke GetFileSize,hFile2,NULL
mov Bytes,eax
invoke ReadFile, hFile2, ADDR FileBuffer,Bytes, ADDR BytesWritten, 0
invoke CloseHandle,hFile2
invoke MessageBoxA, NULL, addr StringBuffer, offset BoxCaption, NULL
invoke MessageBoxA, NULL, addr FileBuffer, offset BoxCaption, NULL
invoke MD5_Startup
invoke MD5_Init, offset ctxt
invoke MD5_Read, offset ctxt, offset FileBuffer, Bytes
invoke MD5_Digest, offset ctxt, offset filehash
invoke MD52String, offset filehash, offset strn, 1
invoke MessageBoxA, NULL, addr strn, offset BoxCaption, NULL
mov FileBuffer,0
mov StringBuffer,0
dec Byteforstreamreader
jmp streamreader2
.endif
mov eax,offset Buffer2
mov Buffer3,eax
invoke lstrcat,ADDR StringBuffer,addr Buffer2
dec Byteforstreamreader
jmp streamreader2
.endif
.if Byteforstreamreader == 0
invoke CloseHandle,hFile
.endif
.data
filestoscan db "myfiles.txt",0
FileBuffer DB 50000 DUP(?)
Bytes dd ?
Bytes2 dd ?
BytesWritten dd ?
BytesWritten3 dd ?
hFile dd ?
hFile2 dd ?
.data ?
hFile dd ?
Byteforstreamreader dd ?
BytesWritten2 dd ?
StringBuffer DB 100 DUP(?)
Buffer2 db 500 dup (?)
ctxt db 1000 dup (?)
filehash db 1000 dup (?)
strn db 33 dup(?) ; use dw for unicode
Также в качестве дополнительного вопроса, если кто-то может ответить, мне кажется неправильным резервировать 50000 байт в файловом буфере, чтобы я мог открыть файл размером 50000 байт или меньше. Как я могу открыть файл любого размера без резервирования всей этой памяти, потому что некоторые из этих файлов могут быть 100 МБ или более
благодарю вас
1 ответ
Вот несколько аннотированная версия вашего streamreader2
цикл:
streamreader2:
.if Byteforstreamreader != 0
invoke ReadFile, hFile, ADDR Buffer2,1, ADDR BytesWritten, 0
; check for end-of-line (CR)
.if Buffer2 == 13
; open the file named in Buffer2 and
; do a bunch of stuff to it to get the MD5
;
; ...
mov FileBuffer,0
mov StringBuffer,0
dec Byteforstreamreader
jmp streamreader2
.endif
; I don't know what the purpose of these two lines are
mov eax,offset Buffer2
mov Buffer3,eax
; append the character just read from hFile to StringBuffer
invoke lstrcat,ADDR StringBuffer,addr Buffer2
dec Byteforstreamreader
jmp streamreader2
.endif
Так что никакие символы не читаются из hFile
обрабатываются специально за исключением 13 (CR). Тем не менее, я думаю, что есть хороший шанс, что окончания строк в этом файле являются CRLF, поэтому при открытии следующего файла имя будет иметь управляющий символ LF в начале. Итак CreateFile
или же fopen
вызов не сможет открыть файл.