2013-03-31 2 views
0

эй Я использую masm в течение 2 недель, и я пытаюсь читать из текстовой строки линия, которая имеет пути файлов в нихПочему этот код сборки masm не работает в цикле, код работает отлично в первый раз, но в цикле не работает

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 байт на filebuffer так что я могу открыть 50000 байт или меньший размер файла. как я могу открыть любой размер файла без сохранения все, что память, потому что некоторые из этих файлов может составлять 100 Мб или более

спасибо

+1

Если код не так длинный, вставьте его, выделите его и нажмите Ctrl + K, чтобы превратить его в блок кода. – Neil

+0

ok Я получил код на их теперь – patchariadog

+1

Насколько ваш вопрос о том, как обрабатывать большие файлы без огромного статического буфера, подумайте о том, как вы можете это сделать в C. Обычно вы не читаете весь файл в один буфер, вместо этого у вас есть цикл, который считывает блоки файла в меньший буфер и обрабатывает файл за один раз. –

ответ

0

Вот несколько аннотированный версия вашего 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 не сможет открыть файл.

+0

Большое вам спасибо Майкл Берр, который работает! Я добавил еще один вызов ReadFile, hFile, ADDR Buffer2,1, ADDR BytesWritten, 0 под .if Buffer2 == 13 частью моего кода, чтобы заставить его работать. еще один быстрый вопрос: если у меня есть файл размером 20 МБ, как я могу его прочитать в FileBuffer, потому что вы не можете зарезервировать его 20971520 байт (20 Мб), и если бы я разделил его на куски, как бы объединить их в один кусок к md5 это. может быть, если Майкл Берр или у кого есть хороший способ сделать это, они могут опубликовать его. благодаря! – patchariadog

+0

@patchariadog: Я не знаю подробностей библиотеки MD5, которую вы используете, но обычно есть функция, которая вычисляет промежуточные значения MD5, которые вы можете передать буферу после буфера. Похоже, что функция 'MD5_Read()' в вашей библиотеке может быть такой; если да, просто передайте содержимое (и длину) каждого буфера, который вы читаете из файла, на «MD5_Read()», а затем, когда вызывается «MD5_Digest()», он завершит работу над MD5. Имейте в виду, я просто догадываюсь о поведении вашей MD5-библиотеки. Но учитывая, что у вас есть MD5_Init() '/' MD5_Digest() ''bookends', я думаю, что это разумная догадка. –

+0

спасибо Майкл Берр, который отлично работает! – patchariadog

 Смежные вопросы

  • Нет связанных вопросов^_^