找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2322|回复: 1

【asm】遍历目录以及子目录所有文件 - 非递归

[复制链接]
发表于 2017-3-13 12:27:18 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 Ayala 于 2017-7-3 19:25 编辑

  1. fdata struc
  2.         h dword ?
  3.         n dword ?
  4.         k dword ?

  5. fdata ends

  6. llist struc
  7.         _next  dword ?
  8.         _last  dword ?
  9.         _data  fdata <>
  10. llist ends


  11. .code


  12. Dirtrav proc uses esi edi ebx fdir,fcallback,fcontext
  13.         LOCAL fd1:WIN32_FIND_DATA
  14.         LOCAL dp:llist
  15.         LOCAL dir[MAX_PATH*2]:word
  16.         LOCAL curDir[MAX_PATH]:word
  17.        

  18.         lea edi,fd1
  19.         assume edi:ptr WIN32_FIND_DATA
  20.         invoke GetCurrentDirectory,MAX_PATH,addr curDir
  21.        
  22.        
  23.         mov ebx,fdir
  24.         invoke SetCurrentDirectory,ebx
  25.         invoke FindFirstFile,$CTA0(".\\*"),edi
  26.        
  27.        
  28.         lea ebx,dp
  29.         assume ebx:ptr llist
  30.         mov [ebx]._next,0
  31.         mov [ebx]._last,0
  32.         mov [ebx]._data.h,eax
  33.        
  34.         .while [ebx]._data.h!=INVALID_HANDLE_VALUE
  35.                 mov esi,[ebx]._data.h
  36.                 mov eax,fcallback
  37.                 .if eax
  38.                         PROTO@8 TYPEDEF PROTO STDCALL :DWORD,:DWORD
  39.                         invoke (PROTO@8 ptr eax),edi,fcontext
  40.                         .break .if eax       
  41.                 .endif
  42.                 mov eax,dword ptr [edi].cFileName
  43.                 and eax,0FFFFFFh               
  44.                 .if [edi].dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY && eax!=".." && ax!="."
  45.                        
  46.                         invoke crt_malloc,sizeof dp
  47.                         .if !eax
  48.                                 jmp done
  49.                         .endif
  50.                         assume eax:ptr llist
  51.                         mov [eax]._next,0
  52.                         mov [eax]._last,ebx
  53.                         mov [ebx]._next,eax
  54.                         mov ebx,eax
  55.                         assume eax:ptr nothing
  56.                        
  57.                         invoke SetCurrentDirectory,addr [edi].cFileName
  58.                         invoke FindFirstFile,$CTA0(".\\*"),edi
  59.                         mov [ebx]._data.h,eax
  60.                 .else
  61.                         invoke FindNextFile,esi,edi
  62.                         .if !eax
  63.                                 invoke FindClose,esi
  64.                                 mov ebx,[ebx]._last
  65.                                 .break .if !ebx
  66.                                 invoke crt_free,[ebx]._next
  67.                                 ;invoke crt_system,$CTA0("PAUSE")
  68.                                 invoke SetCurrentDirectory,$CTA0("..\")
  69.                         .endif
  70.                 .endif
  71.         .endw
  72. done:
  73.         .while ebx
  74.                 invoke crt_free,[ebx]._next
  75.                 mov ebx,[ebx]._last
  76.         .endw
  77.         invoke SetCurrentDirectory,addr curDir
  78.         assume edi:nothing
  79.         xor eax,eax
  80.         ret
  81. Dirtrav endp
复制代码
回复

使用道具 举报

发表于 2017-3-22 20:29:48 | 显示全部楼层
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 06:21 , Processed in 0.036505 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表