; 功能:搜索C:\\下面的所有文件夹 并且打印出来

      .486                      ; create 32 bit code
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive

      include \masm32\include\kernel32.inc
      include \masm32\include\windows.inc
      includelib \masm32\lib\kernel32.lib
      serch PROTO :DWORD                    ;申明过程
    .stack
    .data
    despath db 'c:\\',0                        ; 要搜索的路径
    findtype db '*.*',0                        
    uppath  db  '..',0
    szCurDir db 1024 dup(0)                     
    endstr db '$'
    szFullNmae db 1024 dup(0)
    .code
start:
     invoke serch,addr despath                  ;启动过程
    jmp exitme

serch proc szPath:DWORD                           ;过程定义
    local fdata:WIN32_FIND_DATAA
    local hFind:HANDLE

    invoke SetCurrentDirectoryA,addr szPath             ;设置当前工作目录
    or eax,eax
    jz return
    invoke FindFirstFileA,addr findtype,addr fdata          ;查找文件开始
    mov hFind,eax
findloop:
    invoke FindNextFileA,hFind,addr fdata                   ;循环搜索当前目录的文件
    or eax,eax
    jz return 
    mov al, fdata.cFileName
    cmp al,'.'
    jz findloop                                             ; 如果 是'.'或者是'..'就continue  我只判断第一个字符
    mov eax,FILE_ATTRIBUTE_DIRECTORY
    and eax,fdata.dwFileAttributes                          ;是否是文件夹
    jz notdirc                                               ;不是文件夹
    invoke GetCurrentDirectoryA,1023,addr szCurDir          ;获取当前目录
    mov edx,ebx                                             ;打印
    mov al,9
    int 21
    invoke serch,fdata.cFileName
    invoke SetCurrentDirectoryA,addr uppath
notdirc:
    nop
return:
    mov eax,0
    ret 
    
serch endP 
exitme:nop
end start