反编译用
目录只支持'/'
.386
.model flat, stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include comdlg32.inc
includelib comdlg32.lib
;定义对话框 id
IDBEGIN equ 1007
IDEDIT equ 1005
IDFILE equ 1002
IDPATH equ 1008
BufferSize equ 256
State_Begin equ 1
State_Stop equ 2
Heap_Start = 1024 * 2 * 1024
Heap_Alloc_Size = 1024*1024 * 100
.data?
hInstance dd ?
hMainWin dd ?
hThread dd ?
hHeap dd ?
hMem dd ?
szSearchPath db MAX_PATH dup(?)
dwSearchPathLen dd ?
dwFileCount dd ?
dwDirCount dd ?
dwFileSizeHight dd ?
dwFileSizeLow dd ?
dbState db ?
dwPos dd ?
.const
szErrorPath db '路径错误',0
szStart db '开始',0
szStop db '停止',0
szFilter db '/*.*',0
szNextLine db '\r\n',0
.code
__get_dir_path proc pOutDir:dword,pInPath:dword,pathLen:dword
local dwLen
pushad
mov al,'/'
mov edi,pInPath
add edi,pathLen
mov ecx,pathLen
std
repne scasb
jz found
popad
mov eax,0
ret
found:
mov edx,ecx
mov ecx,pathLen
sub ecx,edx
mov dwLen,ecx
mov esi, pInPath
mov edi , pOutDir
cld
rep movsb
mov byte ptr [edi],0
popad
mov eax,dwLen
ret
__get_dir_path endp
__show_file proc uses esi edx , pInPath
local pCur:dword
local dwLen
inc dwFileCount
mov esi,hMem
invoke lstrcat,pInPath,offset szNextLine
invoke lstrlen,pInPath
mov dwLen,eax
add esi,dwPos
mov pCur,esi
mov edx,dwPos
add edx,dwLen
mov dwPos,edx
invoke lstrcpy,pCur,pInPath
invoke SetDlgItemText,hMainWin,IDEDIT,hMem
ret
__show_file endp
__find_files proc pInPath:dword
local stFindFile:WIN32_FIND_DATA
local hFindFile
local szPath[MAX_PATH]:byte
local szFindFile[MAX_PATH]:byte
local szDir[MAX_PATH]:byte
local dwLen
pushad
invoke lstrcpy ,addr szPath , pInPath
invoke lstrlen,addr szPath
mov dwLen, eax
mov ecx,eax
xor eax,eax
lea edi,pInPath
mov al,'*'
cld
repne scasb
jz find_orignal
invoke lstrcat,addr szPath, addr szFilter
add dwLen,sizeof szFilter
invoke __get_dir_path,addr szDir,addr szPath,dwLen
.if eax == 0
jmp quit
.endif
jmp find_begin
find_orignal:
invoke __get_dir_path,addr szDir,addr szPath,dwLen
.if eax == 0
jmp quit
.endif
find_begin:
invoke FindFirstFile,addr szPath,addr stFindFile
.if eax != INVALID_HANDLE_VALUE
mov hFindFile,eax
.repeat
invoke lstrcpy,addr szFindFile,addr szDir
invoke lstrcat, addr szFindFile,addr stFindFile.cFileName
.if stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
.if stFindFile.cFileName != '.'
inc dwDirCount
invoke __find_files,addr szFindFile
.endif
.else
invoke __show_file, addr szFindFile
.endif
invoke FindNextFile,hFindFile,addr stFindFile
.until (dbState & State_Stop) || (eax == 0)
invoke FindClose,hFindFile
.endif
quit:
popad
xor eax,eax
ret
__find_files endp
__process_search proc uses ebx edi esi, args:dword
mov dwFileCount,0
mov dwDirCount,0
mov dwFileSizeHight ,0
mov dwFileSizeLow ,0
mov dwPos,0
or dbState,State_Begin
invoke GetDlgItem,hMainWin,IDBEGIN
invoke EnableWindow,eax,TRUE
invoke __find_files,addr szSearchPath
mov dbState,0
mov eax,0
ret
__process_search endp
__dlg_proc proc uses ebx edi esi, hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,0
.elseif eax == WM_INITDIALOG
push hWnd
pop hMainWin
mov dbState,0
mov hThread,0
.elseif eax == WM_COMMAND
mov eax, wParam
.if ax == IDBEGIN
.if dbState & State_Begin
invoke GetDlgItem,hWnd,IDBEGIN
invoke EnableWindow,eax,FALSE
or dbState,State_Stop
invoke WaitForSingleObject,hThread,INFINITE
INVOKE CloseHandle,hThread
mov hThread,0
invoke SetDlgItemText,hWnd,IDBEGIN,addr szStart
invoke GetDlgItem,hWnd,IDBEGIN
invoke EnableWindow,eax,TRUE
.else
INVOKE RtlZeroMemory,addr szSearchPath,sizeof szSearchPath
invoke GetDlgItemText,hWnd,IDPATH,addr szSearchPath,MAX_PATH
invoke lstrlen,addr szSearchPath
.if eax == 0 || eax > (MAX_PATH - sizeof szFilter)
invoke MessageBox,hWnd,addr szErrorPath,addr szErrorPath,MB_OK
.else
mov dwSearchPathLen,eax
invoke GetDlgItem,hWnd,IDBEGIN
invoke EnableWindow,eax,FALSE
invoke SetDlgItemText,hWnd,IDBEGIN,addr szStop
invoke CreateThread,0,0,offset __process_search,0,0,0
mov hThread,eax
invoke CloseHandle,eax
.endif
.endif
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
__dlg_proc endp
main proc
invoke GetModuleHandle,0
mov hInstance,eax
invoke HeapCreate,0,Heap_Start,0
.if eax == NULL
jmp done
.endif
mov hHeap,eax
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,Heap_Alloc_Size
.if eax == NULL
jmp done
.endif
mov hMem,eax
invoke DialogBoxParam,hInstance,IDFILE,0,offset __dlg_proc,0
invoke HeapFree,hHeap,0,hMem
invoke HeapDestroy,hHeap
done:
INVOKE ExitProcess,0
ret
main endp
end main
资源:
resource.h
#define IDFILE 1002
#define IDEDIT 1005
#define IDBEGIN 1007
#define IDPATH 1008
rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/
#undef APSTUDIO_READONLY_SYMBOLS
/
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/
//
// Dialog
//
IDFILE DIALOGEX 0, 0, 427, 218
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
EDITTEXT IDEDIT,19,49,352,125,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | NOT WS_TABSTOP
LTEXT "路径",IDC_STATIC,18,27,18,17
PUSHBUTTON "开始",IDBEGIN,298,180,102,23
EDITTEXT IDPATH,45,27,208,14,ES_AUTOHSCROLL,WS_EX_DLGMODALFRAME
END
/
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDFILE, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 420
TOPMARGIN, 7
BOTTOMMARGIN, 211
END
END
#endif // APSTUDIO_INVOKED
/
//
// AFX_DIALOG_LAYOUT
//
IDFILE AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // 中文(简体,中国) resources
/
#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
/
#endif // not APSTUDIO_INVOKED