Win32汇编如何获取文件夹的大小

Win32汇编如何获取文件夹的大小,第1张

汗……不会MATLAB,给个常规思路吧

用API中的FindFirstFile和FindNextFile遍历文件夹,然后用GetFileSize取得各个文件大小,累加,即可得出……

FindFile.ASM

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386

.model flat, stdcall

option casemap :none

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Include 文件定义

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc

include user32.inc

includelib user32.lib

include kernel32.inc

includelib kernel32.lib

include ole32.inc

includelib ole32.lib

include shell32.inc

includelib shell32.lib

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Equ 等值定义

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ICO_MAIN equ 1000

DLG_MAIN equ 100

IDC_PATH equ 101

IDC_BROWSE equ 102

IDC_NOWFILE equ 103

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

数据段

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

hInstance dd ?

hWinMain dd ?

dwFileSizeHigh dd ?

dwFileSizeLow dd ?

dwFileCount dd ?

dwFolderCount dd ?

szPath db MAX_PATH dup (?)

dwOption db ?

F_SEARCHING equ 0001h

F_STOP equ 0002h

.const

szStart db '开始(&S)',0

szStop db '停止(&S)',0

szFilter db '*.*',0

szSearchInfo db '共找到 %d 个文件夹,%d 个文件,共 %luK 字节',0

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

代码段

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

include _BrowseFolder.asm

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

处理找到的文件

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcessFile proc _lpszFile

local @hFile

inc dwFileCount

invoke SetDlgItemText,hWinMain,IDC_NOWFILE,_lpszFile

invoke CreateFile,_lpszFile,GENERIC_READ,FILE_SHARE_READ,0,\

OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0

.if eax != INVALID_HANDLE_VALUE

mov @hFile,eax

invoke GetFileSize,eax,NULL

add dwFileSizeLow,eax

adc dwFileSizeHigh,0

invoke CloseHandle,@hFile

.endif

ret

_ProcessFile endp

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_FindFile proc _lpszPath

local @stFindFile:WIN32_FIND_DATA

local @hFindFile

local @szPath[MAX_PATH]:byte 用来存放“路径\”

local @szSearch[MAX_PATH]:byte 用来存放“路径\*.*”

local @szFindFile[MAX_PATH]:byte 用来存放“路径\找到的文件”

pushad

invoke lstrcpy,addr @szPath,_lpszPath

********************************************************************

在路径后面加上\*.*

********************************************************************

@@:

invoke lstrlen,addr @szPath

lea esi,@szPath

add esi,eax

xor eax,eax

mov al,'\'

.if byte ptr [esi-1] != al

mov word ptr [esi],ax

.endif

invoke lstrcpy,addr @szSearch,addr @szPath

invoke lstrcat,addr @szSearch,addr szFilter

********************************************************************

寻找文件

********************************************************************

invoke FindFirstFile,addr @szSearch,addr @stFindFile

.if eax != INVALID_HANDLE_VALUE

mov @hFindFile,eax

.repeat

invoke lstrcpy,addr @szFindFile,addr @szPath

invoke lstrcat,addr @szFindFile,addr @stFindFile.cFileName

.if @stFindFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY

.if @stFindFile.cFileName != '.'

inc dwFolderCount

invoke _FindFile,addr @szFindFile

.endif

.else

invoke _ProcessFile,addr @szFindFile

.endif

invoke FindNextFile,@hFindFile,addr @stFindFile

.until (eax == FALSE) || (dwOption &F_STOP)

invoke FindClose,@hFindFile

.endif

popad

ret

_FindFile endp

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcThread proc uses ebx ecx edx esi edi,lParam

local @szBuffer[256]:byte

********************************************************************

设置标志位,并灰化“浏览”按钮和路径输入栏

********************************************************************

and dwOption,not F_STOP

or dwOption,F_SEARCHING

invoke GetDlgItem,hWinMain,IDC_PATH

invoke EnableWindow,eax,FALSE

invoke GetDlgItem,hWinMain,IDC_BROWSE

invoke EnableWindow,eax,FALSE

invoke SetDlgItemText,hWinMain,IDOK,addr szStop

xor eax,eax

mov dwFileSizeHigh,eax

mov dwFileSizeLow,eax

mov dwFileCount,eax

mov dwFolderCount,eax

invoke _FindFile,addr szPath

********************************************************************

退出时显示找到文件的总大小

********************************************************************

mov edx,dwFileSizeHigh

mov eax,dwFileSizeLow

mov ecx,1000

div ecx

invoke wsprintf,addr @szBuffer,addr szSearchInfo,dwFolderCount,dwFileCount,eax

invoke SetDlgItemText,hWinMain,IDC_NOWFILE,addr @szBuffer

********************************************************************

设置标志位,并启用“浏览”按钮和路径输入栏

********************************************************************

invoke GetDlgItem,hWinMain,IDC_BROWSE

invoke EnableWindow,eax,TRUE

invoke GetDlgItem,hWinMain,IDC_PATH

invoke EnableWindow,eax,TRUE

invoke SetDlgItemText,hWinMain,IDOK,addr szStart

invoke SetDlgItemText,hWinMain,IDC_PATH,addr szPath

and dwOption,not F_SEARCHING

ret

_ProcThread endp

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam

local @dwTemp,@szBuffer[MAX_PATH]:byte

mov eax,wMsg

.if eax == WM_CLOSE

.if ! (dwOption &F_SEARCHING)

invoke EndDialog,hWnd,NULL

.endif

********************************************************************

.elseif eax == WM_INITDIALOG

push hWnd

pop hWinMain

invoke LoadIcon,hInstance,ICO_MAIN

invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax

invoke SendDlgItemMessage,hWnd,IDC_PATH,EM_SETLIMITTEXT,MAX_PATH,0

********************************************************************

.elseif eax == WM_COMMAND

mov eax,wParam

.if ax == IDC_BROWSE

invoke _BrowseFolder,hWnd,addr szPath

.if eax

invoke SetDlgItemText,hWnd,IDC_PATH,addr szPath

.endif

.elseif ax == IDC_PATH

invoke GetDlgItemText,hWnd,IDC_PATH,addr @szBuffer,MAX_PATH

mov ebx,eax

invoke GetDlgItem,hWnd,IDOK

invoke EnableWindow,eax,ebx

********************************************************************

按下开始按钮,如果在寻找中则设置停止标志

如果没有开始寻找则建立一个寻找文件的线程

********************************************************************

.elseif ax == IDOK

.if dwOption &F_SEARCHING

or dwOption,F_STOP

.else

invoke GetDlgItemText,hWnd,IDC_PATH,addr szPath,MAX_PATH

invoke CreateThread,NULL,0,offset _ProcThread,NULL,\

NULL,addr @dwTemp

invoke CloseHandle,eax

.endif

.endif

********************************************************************

.else

mov eax,FALSE

ret

.endif

mov eax,TRUE

ret

_ProcDlgMain endp

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:

invoke GetModuleHandle,NULL

mov hInstance,eax

invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL

invoke ExitProcess,NULL

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

FindFile.RC

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include <resource.h>

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#define ICO_MAIN 1000

#define DLG_MAIN 100

#define IDC_PATH 101

#define IDC_BROWSE 102

#define IDC_NOWFILE 103

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ICO_MAIN ICON "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DLG_MAIN DIALOG 141, 208, 344, 38

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION "全盘文件搜索"

FONT 9, "宋体"

{

EDITTEXT IDC_PATH, 43, 5, 211, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP

PUSHBUTTON "浏览(&B)", IDC_BROWSE, 259, 4, 40, 14

PUSHBUTTON "开始(&S)", IDOK, 299, 4, 40, 14, WS_DISABLED | WS_TABSTOP

LTEXT "起始目录", -1, 7, 8, 35, 8

LTEXT "", IDC_NOWFILE, 7, 24, 330, 8

}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_BrowseFolder.asm

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

定义几个基本的 COM 接口

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

IUnknown interface

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

externdefIID_IUnknown:IID

LPUNKNOWNtypedef DWORD

LPPUNKNOWN typedef ptr LPUNKNOWN

IUnknown_QueryInterfaceProto typedef proto :DWORD, :DWORD, :DWORD

IUnknown_AddRefProto typedef proto :DWORD

IUnknown_ReleasePrototypedef proto :DWORD

IUnknown_QueryInterface typedef ptr IUnknown_QueryInterfaceProto

IUnknown_AddRef typedef ptr IUnknown_AddRefProto

IUnknown_Release typedef ptr IUnknown_ReleaseProto

IUnknown struct DWORD

QueryInterfaceIUnknown_QueryInterface ?

AddRefIUnknown_AddRef ?

Release IUnknown_Release ?

IUnknown ends

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

IMalloc Interface

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

externdefIID_IMalloc:IID

LPMALLOC typedef DWORD

LPPMALLOCtypedef ptr LPMALLOC

IMalloc_AllocProto typedef proto :DWORD, :DWORD

IMalloc_ReallocProto typedef proto :DWORD, :DWORD, :DWORD

IMalloc_FreePrototypedef proto :DWORD, :DWORD

IMalloc_GetSizeProto typedef proto :DWORD, :DWORD

IMalloc_DidAllocPrototypedef proto :DWORD, :DWORD

IMalloc_HeapMinimizePrototypedef proto :DWORD

IMalloc_Alloctypedef ptr IMalloc_AllocProto

IMalloc_Realloc typedef ptr IMalloc_ReallocProto

IMalloc_Free typedef ptr IMalloc_FreeProto

IMalloc_GetSize typedef ptr IMalloc_GetSizeProto

IMalloc_DidAlloc typedef ptr IMalloc_DidAllocProto

IMalloc_HeapMinimize typedef ptr IMalloc_HeapMinimizeProto

IMalloc struct DWORD

QueryInterfaceIUnknown_QueryInterface ?

AddRefIUnknown_AddRef ?

Release IUnknown_Release ?

Alloc IMalloc_Alloc?

Realloc IMalloc_Realloc ?

Free IMalloc_Free ?

GetSize IMalloc_GetSize ?

DidAlloc IMalloc_DidAlloc ?

HeapMinimize IMalloc_HeapMinimize ?

IMalloc ends

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

_BrowseFolderTmp dd ?

.const

_szDirInfo db '请选择目录:',0

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

d出选择目录的对话框

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_BrowseFolderCallBack proc hWnd,uMsg,lParam,lpData

local @szBuffer[260]:byte

mov eax,uMsg

.if eax == BFFM_INITIALIZED

invoke SendMessage,hWnd,BFFM_SETSELECTION,TRUE,_BrowseFolderTmp

.elseif eax == BFFM_SELCHANGED

invoke SHGetPathFromIDList,lParam,addr @szBuffer

invoke SendMessage,hWnd,BFFM_SETSTATUSTEXT,0,addr @szBuffer

.endif

xor eax,eax

ret

_BrowseFolderCallBack endp

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_BrowseFolder proc _hWnd,_lpszBuffer

local @stBrowseInfo:BROWSEINFO

local @stMalloc

local @pidlParent,@dwReturn

pushad

invoke CoInitialize,NULL

invoke SHGetMalloc,addr @stMalloc

.if eax == E_FAIL

mov @dwReturn,FALSE

jmp @F

.endif

invoke RtlZeroMemory,addr @stBrowseInfo,sizeof @stBrowseInfo

********************************************************************

SHBrowseForFolder 选择一个目录,把不含路径的目录名放入

stBrowseInfo.pszDisplayName 中,SHGetPathFromIDList 把

stBrowseInfo.pszDisplayName 转换成含全部路径的目录名

********************************************************************

push _hWnd

pop @stBrowseInfo.hwndOwner

push _lpszBuffer

pop _BrowseFolderTmp

mov @stBrowseInfo.lpfn,offset _BrowseFolderCallBack

mov @stBrowseInfo.lpszTitle,offset _szDirInfo

mov @stBrowseInfo.ulFlags,BIF_RETURNONLYFSDIRS or BIF_STATUSTEXT

invoke SHBrowseForFolder,addr @stBrowseInfo

mov @pidlParent,eax

.if eax != NULL

invoke SHGetPathFromIDList,eax,_lpszBuffer

mov eax,TRUE

.else

mov eax,FALSE

.endif

mov @dwReturn,eax

mov eax,@stMalloc

mov eax,[eax]

invoke (IMalloc PTR [eax]).Free,@stMalloc,@pidlParent

mov eax,@stMalloc

mov eax,[eax]

invoke (IMalloc PTR [eax]).Release,@stMalloc

@@:

invoke CoUninitialize

popad

mov eax,@dwReturn

ret

_BrowseFolder endp

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Sample code for <Win32ASM Programming 2nd Edition>

by 罗云彬

用MasmPuls 编译、连接

计算机语言从低级到高级可以分为:

机器语言,即由0、1组成的机器硬件可以识别的语言;

低级语言,即汇编语言

中级语言,如C语言

高级语言,如C++,JAVA,C#,Delphi等。

汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示,以便于理解和程序员编程。汇编语言通常用于对硬件的直接 *** 控。由于汇编语言编写的程序很小,所以通常在程序中最核心的、控制硬件的代码可以采用汇编语言编写,一方面是安全,另一方面提高运行速度。

汇编语言(Assembly Language)是面向机器的程序设计语言。

在汇编语合中,用助记符(Memoni)代替 *** 作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语音变成了汇编语言。于是汇编语言亦称为符号语言。

使用汇编语言编写的程序,机器个能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言把汇编程序翻译成机器语言的过程称为汇编。

汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。

■对于不同型号的计算机,有着不同的结构的汇编语言

汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。

汇编语言是面向具体机型的,它离不开具体计算机的指令系统,因此,对于不同型号的计算机,有着不同的结构的汇编语言,而且,对于同一问题所编制的汇编语言程序在不同种类的计算机间是互不相通的。

汇编语言中由于使用了助记符号,用汇编语言编制的程序输入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的"汇编程序"的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。

汇编语言像机器指令一样,是硬件 *** 作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。

至于汇编与编程的区别是显而易见的,汇编语言是一种用于编写某些程序的语言。而编程则是程序员用某种语言编写程序的过程。

高级语言可以做的一切,汇编语言都可以实现,而高级语言不能做的,汇编照样可以,汇编语言的功能不是受限于语言,而是受限于你的思路,没有什么做不出来的。但人们不事事都用汇编的原因就是编程的效率低,汇编语言可以用来编 *** 作系统,但很少使用,都使用c语言,unix,linux,windows等都是用c,原因就是汇编的编程效率低,汇编用在代码量少,执行效率要求高,空间占用少,硬件编程等领域,比如做病毒,硬件驱动,单片机等领域。

高级语言是一种人工设计的语言,它对具体的算法进行描述,所以又称为算法语言。高级语言独立于计算机的硬件(即与具体的硬件无关),是依靠软件来译为机器语言的。这就导致了汇编语言有更好的适应性,不依赖软件的环境。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11741070.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存