主程序代码如下:

代码:


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  Programmed by nohacks, nohacks@163.com
;  Website: http://hi.baidu.com/nohacks
;           Win32 ASM is Masm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  版本信息
;  WinMD5 for ASM V1.1   - 可以取得文本或文件的MD5值
;     
;                         2007年11月21日
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


.386
.model  flat,  stdcall
option  casemap  :none

include    windows.inc
include    user32.inc
include         shell32.inc
include    kernel32.inc
includelib  user32.lib
includelib  kernel32.lib
include    comdlg32.inc
includelib  comdlg32.lib
includelib      shell32.lib
include          debug.inc
include        Stdlib.Inc
includelib  Stdlib.lib

m2m  Macro M1,M2
  push  M2
  pop    M1
endm
    
.const          
 ICO_ICO                EQU             1
 DLG_MAIN    EQU    1000
 IDC_EDT_FILE           EQU             1001
 IDC_EDT_OUT            EQU             1002
 IDC_PGB                EQU             1003
 IDC_BTN_EXIT           EQU             1004
.data? 
hWinMain    dd    ?
hInstance    dd    ?
hMenu HANDLE dword ? 
TheThread DWORD ?
                            
.data
FileName          db      MAX_PATH  dup(0)
temp              db      '%s',0DH,0AH,0
FilterString    db   "全部文件(*.*)",0,"*.*",0,0
szReceive         db       '文件名   :%s',0dh,0ah
                  db       '文件大小 :%d','字节',0dh,0ah
                  db       '文件MD5值:%s ',0dh,0ah,0
TEMP              db       '.',0
 
include    md5.asm



_SetWindowCenter proc _hWnd:DWORD
LOCAL swidth,sheight,dwidth,dheight
LOCAL rect:RECT
invoke GetSystemMetrics,SM_CXSCREEN    
        mov swidth,eax                          
        invoke GetSystemMetrics,SM_CYSCREEN    
        mov sheight,eax                          
        invoke GetWindowRect,_hWnd,addr  rect   
        mov eax,rect.right                      
        sub eax,rect.left                       
        mov dwidth,eax                         
        sub swidth,eax                         
        mov eax,rect.bottom                 
        sub eax,rect.top                    
        mov dheight,eax                       
        sub sheight,eax                         
        shr sheight,1                           
        shr swidth,1                            
        invoke SetWindowPos,_hWnd,HWND_NOTOPMOST,swidth,sheight,dwidth,dheight,SWP_SHOWWINDOW
ret
_SetWindowCenter endp

;********************************************************************
CloseMapFile PROC hMapFile:DWORD,hFileRead:DWORD
        invoke CloseHandle,hMapFile 
        ;mov    hMapFile,0 
        invoke CloseHandle,hFileRead 
        ret 
CloseMapFile endp 

GetMd5Thread PROC PFile:DWORD
       
        LOCAL   @FileText[MAX_PATH]:BYTE
  LOCAL   @TEMP[MAX_PATH]:BYTE
  LOCAL  @hFileRead,@hMapFile,@pMemory,@FileSize    
       
      invoke CreateFile, PFile,\ 
                                                GENERIC_READ ,\ 
                                                0,\ 
                                                NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\ 
                                                NULL 
        .if eax==0 
          jmp reterr
        .endif
        
      
      mov    @hFileRead,eax
      invoke ExtractFileName,PFile,addr @FileText  ; 取短文件名 
      
      invoke CreateFileMapping,@hFileRead,NULL,PAGE_READONLY,0,0,NULL 
         .if eax==0
             invoke CloseHandle,@hFileRead
             jmp reterr
          ret  
         .endif
      
      mov @hMapFile,eax

      invoke MapViewOfFile,@hMapFile,FILE_MAP_READ,0,0,0 
       .if eax==0  
             invoke CloseMapFile,@hMapFile,@hFileRead
             jmp reterr
         .endif
      
                        mov @pMemory,eax  
                        invoke  SendDlgItemMessage,hWinMain,IDC_PGB,PBM_SETPOS,1,0   ;进度开始(注意:这里并不是实时进度)                      
                        invoke  GetFileSize,@hFileRead,0  
                        mov @FileSize,eax                               
      invoke   _MD5,@pMemory,eax                                                 
                        invoke wsprintf ,addr  @TEMP,addr  szReceive, addr @FileText, @FileSize,eax                                                                                                                                 
      invoke  SendDlgItemMessage,hWinMain,IDC_EDT_OUT,EM_REPLACESEL,0,addr @TEMP      
      invoke  SendDlgItemMessage,hWinMain,IDC_PGB,PBM_SETPOS,100,0  ;进度结束  
      invoke  RtlZeroMemory,addr FileName,MAX_PATH                  ;  清空数据    
      INVOKE SendDlgItemMessage,hWinMain,IDC_EDT_FILE,WM_SETTEXT,0, addr FileName          
      invoke UnmapViewOfFile,@pMemory  
      invoke CloseMapFile,@hMapFile,@hFileRead
                        ret
       
       reterr:
       
       invoke MessageBox,0,CTEXT("文件打开失败,请检查是否为有效文件!"),CTEXT("WinMd5 for ASM v1.1"),MB_ICONERROR OR MB_OK
       
        ret

GetMd5Thread endp

_ProcDlgMain  proc  uses ebx edi esi, \
                hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
     
  LOCAL  @hMem,@hFile,@Size,@Read  
        mov  eax,wMsg
  cmp     eax ,WM_DROPFILES
  je      GetFile  
  cmp  eax,WM_COMMAND                                  
  je  Exit
  cmp  eax,WM_INITDIALOG                             
  je  boxStart
  cmp  eax,WM_CLOSE
  je  boxClose  
          
retFalse:
  mov  eax,FALSE
  ret

boxClose:
                                           
   invoke  EndDialog,hWnd,NULL
   jmp  retTrue

boxStart:

        push  hWnd
  pop  hWinMain
    invoke LoadIcon,hInstance,ICO_ICO
    invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax    ;设置窗口图标  
    invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE ;窗口置顶
    INVOKE _SetWindowCenter,hWinMain     ;使窗体出现在屏幕中心
    invoke DragAcceptFiles,hWnd,TRUE     ;允许拖放文件
    jmp  retTrue

GetFile:
 
     invoke DragQueryFile,wParam,0,addr FileName,MAX_PATH                          ;取拖放文件名
     invoke SendDlgItemMessage,hWnd,IDC_EDT_FILE,EM_REPLACESEL,0, addr FileName    ;输出到编辑框 
     invoke  DragFinish,wParam                                                     ;释放拖放资源
     invoke CreateThread,NULL,0,addr  GetMd5Thread,addr FileName,0,NULL             ;创建线程
     
     
     
     
  Exit:
   mov     eax,wParam
    .if          eax==IDC_BTN_EXIT
   invoke  ExitProcess,NULL
   .endif
   
              
retTrue:
  mov  eax,TRUE
  ret
_ProcDlgMain  endp

Start:
  invoke  GetModuleHandle,NULL
  mov    hInstance,eax
  invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,_ProcDlgMain,0
  invoke  ExitProcess,NULL
End  Start



想对于1.0版

增加了对拖放文件的支持,取消了文本加密,修改美化了下界面,代码更加简练