;#Mode=CON
.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
szStartPath db 'c:/windows',0
szFilter db '*.exe',0
szEnter db 10,13,0
.data?
buffer db 100 dup(?)
dwCounter dd ?
.CODE
ProcessFile proc
ret
ProcessFile Endp
FindFile proc lpszPath
local stFindFile:WIN32_FIND_DATA
local hFindFile
;MAX_PATH在Windows.inc中有定义=260,注意大小写
local szPath[MAX_PATH] :byte ;当前要搜索的路径
local szSearch[MAX_PATH] :byte ;当前要搜索的路径/*.dll
local szFindFile[MAX_PATH]:byte ;路径/找到的文件
pushad
invoke lstrcpy,addr szPath,lpszPath ;生成当前要搜索的路径
invoke lstrlen,addr szPath
lea esi,szPath
add esi,eax ;指向 szPath 中最后一个字符
xor eax,eax
mov al,'/'
.if BYTE ptr [esi-1] != al ;判断最后一个字符的前一个字符是否为 /
mov word ptr [esi],ax ;不是,补全 szPath的形式就是 db 'xxxx/',0
.endif
invoke lstrcpy,addr szSearch,addr szPath ;复制到 szSearch
invoke lstrcat,addr szSearch,addr szFilter ;szSearch 的形式就是 db 'xxxx/*.dll',0
invoke FindFirstFile,addr szSearch,addr stFindFile
.if eax != INVALID_HANDLE_VALUE ; INVALID_HANDLE_VALUE 错误的句柄!无法创建这个文件
mov hFindFile,eax ;保存查找的handle
.repeat
invoke lstrcpy,addr szFindFile,addr szPath ;因为找到的文件是不带路径 ;所以,结果上要补全路径
invoke lstrcat,addr szFindFile,addr stFindFile.cFileName ;加上找到的文件名
.if stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ;找到的是目录
.if stFindFile.cFileName != '.' ;如果找到的目录不是"."
invoke FindFile,addr szFindFile ;递归,进入这个目录
.endif
.else ;找到的不是目录,就是文件
inc dwCounter ;文件计数器加一
invoke StdOut,addr szFindFile ;输出文件名
invoke StdOut,addr szEnter
.endif
;继续在这个目录中查找
invoke FindNextFile,hFindFile,addr stFindFile
.until (eax==FALSE) ;直到找不到满足条件的文件
invoke FindClose,hFindFile
.endif
popad
ret
FindFile endp
START:
mov dwCounter,0
invoke FindFile,addr szStartPath ;起始路径
invoke wsprintf,addr buffer,CTXT("%s %d %s"),CTXT('一共找到'),dwCounter,CTXT('个文件')
invoke StdOut,addr buffer
;暂停显示,回车键关闭
invoke StdIn,addr buffer,sizeof buffer
invoke ExitProcess,0
end START