ExportProc proc uses ebx esi edi, lParam LOCAL @dwMaxOffset, @Buffer[110]:BYTE, @szFileName[MAX_PATH]:BYTE LOCAL @dwNumberOfBytesWritten, @szPath[MAX_PATH]:BYTE LOCAL @szCreatePath[MAX_PATH]:BYTE LOCAL @dwErro, @lpDest, @dwSuccess, @dwFilePoint mov @dwErro, 0 mov @dwSuccess, 0 invoke _BrowseFolder, lParam, addr @szPath .if eax push dwBaseAddress pop @dwFilePoint add @dwFilePoint, 20h mov ebx, dwBaseAddress add ebx, dwFileSize mov @dwMaxOffset, ebx ;设置循环结束的位置 imul eax, dwFilelnfoSize, 120h sub ebx, eax assume ebx:ptr FILEINFO .while ebx<@dwMaxOffset invoke wsprintf, addr @szFileName, CTXT(〃%s\%s〃),addr @szPath, addr [ebx]. szFileName ;将文件名追加到路径名后面 invoke Replace, addr @szFileName ;将路径中的 /转换为\ invoke CreateFile, addr @szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, \ CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ;创建出出文件 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;第一次创建文件失败可能是因为文件夹不存在, 则再创建所需要的文件夹再创建一遍该文件* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * i f i .if eax==-l invoke InitOutputPath, addr @szFileName, addr @szCreatePath invoke SHCreateDirectoryEx, lParam, addr @szCreatePath, NULL invoke CreateFile, addr @szFileName, GENERIC_ffRITE, FILE_SHARE_READ, \ NULL, CREATE_ALffAYS, FILE_ATTRIBUTE_NORMAL, NULL .if eax==-l inc @dwErro invoke SetDlgItemInt, lParam, STC_ERROR, @dwErro, FALSE jmp CONTINUE .endif .endif mov hCreateFile, eax ;保存创建的文件的句柄 ;;;;;;;;计算导出后文件(实际文件)的大小 * * • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • mov eax, [ebx]. dwRealSize mov byte ptr dwExpFileSize[3], al mov byte ptr dwExpFileSize[2], ah shr eax, 16 mov byte ptr dwExpFileSize[l], al mov byte ptr dwExpFileSize, ah invoke GlobalAlloc, GPTR, dwExpFileSize ;根据要导出 的实际文件大小申请一块内存,提供21化解压函数使用 .if eax mov @lpDest, eax ;;;;;;;;;;;;;;;;; 计算未解压缩前的数据的大小 * * • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • * * * mov eax, [ebx]. dwFileSize mov byte ptr dwSrcFileSize[3], al mov byte ptr dwSrcFileSize[2], ah shr eax, 16 mov byte ptr dwSrcFileSize[l], al mov byte ptr dwSrcFileSize, ah ;;;;;;;;; 调 用 zlib 的 解 压 函 数 解 压 >ur_. 数 ^^ • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • * * * * invoke uncompress, @lpDest, offset dwExpFileSize, @dwFilePoint, dwSrcFileSize • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • * * * * invoke WriteFile, hCreateFile, @lpDest, dwExpFileSize, \ addr @dwNumberOfBytesWrit ten, NULL .if eax inc @dwSuccess invoke SetDlgItemInt, lParam, STC_SUCCESS, @dwSuccess, FALSE jmp CONTINUE .else inc @dwErro invoke SetDlgItemInt, lParam, STC_ERROR, @dwSuccess, FALSE .endif invoke CloseHandle, hCreateFile invoke GlobalFree, @lpDest .else inc @dwErro invoke |