Рекурсивный поиск. Проблема.

Тема в разделе "WASM.BEGINNERS", создана пользователем m0rphX, 21 янв 2007.

  1. m0rphX

    m0rphX New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2007
    Сообщения:
    2
    Доброго времени суток.
    Недавно начал изучать МАСМ и столкнулся с проблемой.
    Пытаюсь написать рекурсивный поиск файлов, но что то не совсем получается.
    Вот код:

    Код (Text):
    1. .386
    2. .model  flat, stdcall
    3. option  casemap:none
    4.  
    5. include     windows.inc
    6. include     kernel32.inc
    7. include     user32.inc
    8.  
    9. includelib  user32.lib
    10. includelib  kernel32.lib
    11.  
    12. .data
    13. MsgCaption      db "C:\FileList.txt",0
    14. CRLF    db 13,10,0
    15.  
    16. .data?
    17.    
    18. .code
    19.  
    20. proba proc FullPath : DWORD
    21.     LOCAL   hFile       : DWORD
    22.     LOCAL   dwByte  : DWORD
    23.     LOCAL   Buff[1024]: byte
    24.  
    25.     pushad
    26.    
    27.     invoke  lstrcpy, addr Buff, FullPath   
    28.     invoke  lstrcat, addr Buff, offset CRLF
    29.     invoke  CreateFile, offset MsgCaption, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
    30.     mov hFile, eax
    31.     invoke  SetFilePointer, hFile, 0, 0, FILE_END
    32.     invoke  lstrlen, addr Buff
    33.     mov dwByte, eax
    34.     invoke  WriteFile, hFile, addr Buff, dwByte, addr dwByte, 0
    35.     invoke  CloseHandle, hFile
    36.  
    37.     popad
    38.  
    39.     ret
    40. proba endp
    41.  
    42.  
    43. Find_Files proc uses edi FilePath : DWORD, lpFunction : DWORD
    44.     LOCAL   hFind       : DWORD
    45.     LOCAL   FindFileData    : WIN32_FIND_DATA
    46.    
    47.     mov esi, FilePath                                      
    48.     invoke  lstrlenA, esi                                          
    49.     mov byte ptr [esi + eax], 02Ah                                 
    50.     mov byte ptr [esi + eax + 1], 00h
    51.     mov edi, eax                                                   
    52.     invoke  FindFirstFileA, FilePath, addr FindFileData                
    53.     mov hFind, eax                                             
    54.     inc eax
    55.     jz  @exit
    56.    
    57. @loop_search:
    58.     mov byte ptr [esi + edi], 00h                          
    59.     lea edx, FindFileData.cFileName                                
    60.     cmp byte ptr [edx], 02Eh                                       
    61.     jz  @next_search                                           
    62.     invoke  lstrcatA, esi, edx                         
    63.     lea edx, FindFileData.dwFileAttributes                             
    64.     test    dword ptr [edx], 010h
    65.     jz  @file_found                                            
    66.    
    67.     invoke  lstrlenA, esi
    68.     mov byte ptr [esi + eax], 05Ch                                 
    69.     mov byte ptr [esi + eax + 1], 00h
    70.    
    71.     invoke  Find_Files, FilePath, lpFunction                           
    72.    
    73.     jmp @next_search                                               
    74.  
    75. @file_found:                                                       
    76.     push esi
    77.     call    lpFunction
    78.    
    79. @next_search:
    80.  
    81.     invoke  FindNextFileA, hFind, addr FindFileData                
    82.     test    eax, eax
    83.     jnz @loop_search                                               
    84.     invoke  FindClose, hFind                                       
    85. @exit:
    86.     ret
    87. Find_Files endp
    88.  
    89.  
    90. SearchForFiles proc StartDir : DWORD, lpFunction : DWORD       
    91.     LOCAL   Count   : BYTE
    92.  
    93.     invoke  SetErrorMode, 01h                              
    94.     invoke  lstrlenA, StartDir                                     
    95.     test    eax, eax
    96.     jz  @drive_search                                          
    97.    
    98.     mov esi, StartDir
    99.     mov byte ptr [esi + eax], 05Ch                             
    100.     mov byte ptr [esi + eax + 1], 00h
    101.    
    102.     invoke  Find_Files, esi, lpFunction                        
    103.     jmp @exit  
    104.    
    105. @drive_search:
    106.     mov Count, 041h
    107.    
    108. @loop_drive:
    109.     mov cl, Count
    110.     mov byte ptr [ebx], cl
    111.     mov byte ptr [ebx + 1], 03Ah
    112.     mov byte ptr [ebx + 2], 05Ch
    113.     mov byte ptr [ebx + 3], 00h
    114.                
    115.     inc Count  
    116.     invoke  GetDriveType, ebx
    117.     test    eax, eax
    118.     jz  @next_drive
    119.    
    120.     dec eax
    121.     test    eax, eax
    122.     jz  @next_drive
    123.    
    124.     invoke  Find_Files, ebx, lpFunction
    125.    
    126. ;   invoke  MessageBox, 0, ebx,ebx, 0      
    127. @next_drive:
    128.     cmp Count, 05Bh
    129.     jne @loop_drive
    130.  
    131. @exit:
    132.     ret
    133. SearchForFiles endp
    134.  
    135.  
    136.  
    137. start:
    138.     invoke  SearchForFiles, 0, offset proba
    139.     invoke  ExitProcess,0    
    140. end start
    Даже не знаю где ошибка - программа отказывается искать файлы когда пытаюсь перечислить доступные диски.
    Буду очень признателен если направите на путь истинный.
    Благодарю за внимание.
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    masm32\examples\exampl05\findfile\findfile.asm