代码:
[注:转载请注明出处]
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\comctl32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\comctl32.lib
.const
IDD_DIALOG1 equ 1000
IDC_FILE_EDIT equ 1001
IDC_OPEN_BUTTON equ 1002
MAXSIZE equ 512
WndProc proto :DWORD, :DWORD, :DWORD, :DWORD
MakeTable proto
GetCrc32 proto
.data
szCaption db "获取文件Crc值", 0
szError db "打开文件出错!", 0
szTemplate db "%X",10, 0
OpenDialog OPENFILENAME <>
szFilter db "所有文件", 0, "*.*", 0, 0
szTitle db "打开一个要获取Crc32校验值的文件", 0
szFileName db MAXSIZE dup(0)
Crc32Table dd 256 dup(0)
szBuff db 20 dup(0)
.data?
hInt dd ?
szCRC32 dd 4 dup(?)
szText db 200 dup(?)
.code
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
mov hInt,eax
invoke DialogBoxParam,hInt,IDD_DIALOG1,NULL,offset WndProc,0
invoke ExitProcess,NULL
WndProc proc uses ebx ecx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hFile: HANDLE
LOCAL dwFileSize: DWORD
LOCAL dwNumberOfBytesReadWritten: DWORD
LOCAL hMemory: HANDLE
LOCAL pMemory: DWORD
MOV eax,uMsg
.if eax == WM_CLOSE
invoke EndDialog, hWnd, 0
.elseif eax == WM_COMMAND
mov eax,wParam
.if eax==IDC_OPEN_BUTTON
mov OpenDialog.lStructSize, sizeof OpenDialog
push hWnd
pop OpenDialog.hwndOwner
push hWnd
pop OpenDialog.hInstance
mov OpenDialog.lpstrFilter, offset szFilter
mov OpenDialog.lpstrFile, offset szFileName
mov OpenDialog.nMaxFile, MAXSIZE
mov OpenDialog.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER
mov OpenDialog.lpstrTitle, offset szTitle
invoke GetOpenFileName, addr OpenDialog
invoke CreateFile, addr szFileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
mov hFile, eax
.if hFile == INVALID_HANDLE_VALUE
invoke MessageBox, hWnd, addr szError, addr szCaption, MB_OK
.else
invoke GetFileSize, hFile, NULL
mov dwFileSize, eax
invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, dwFileSize
mov hMemory, eax
invoke GlobalLock, hMemory
mov pMemory, eax
invoke ReadFile, hFile, pMemory, dwFileSize, addr dwNumberOfBytesReadWritten, NULL
invoke MakeTable
mov ebx, pMemory
mov ecx, dwFileSize
invoke GetCrc32
mov szCRC32, eax
invoke wsprintf, addr szText, addr szTemplate, szCRC32
invoke SetDlgItemText,hWnd,IDC_FILE_EDIT,ADDR szText
invoke GlobalUnlock, pMemory
invoke GlobalFree, hMemory
invoke CloseHandle, hFile
.endif
.endif
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
WndProc endp
;动态生成码表
MakeTable proc
mov ecx, 256
$OneLoop:
lea eax, [ecx-1]
push ecx
mov ecx, 8
$TwoLoop:
shr eax, 1
jnc @F
xor eax, 0EDB88320h
@@:
dec ecx
jne $TwoLoop
pop ecx
mov [Crc32Table+ecx*4-4], eax
dec ecx
jne $OneLoop
ret
MakeTable endp
;计算Crc32值
GetCrc32 proc uses ebx
mov eax, -1
or ecx, ecx
jz $Exit
or ebx, ebx
jz $Exit
@@:
mov dl, [ebx]
xor dl, al
movzx edx, dl
shr eax, 8
xor eax, [Crc32Table+edx*4]
inc ebx
dec ecx
jne @B
not eax
$Exit:
ret
GetCrc32 endp
end start
资源文件:
#include "resource.h"
#define IDD_DIALOG1 1000
#define IDC_FILE_EDIT 1001
#define IDC_OPEN_BUTTON 1002
IDD_DIALOG1 DIALOG DISCARDABLE -2, 0, 258, 67
STYLE DS_SYSMODAL |DS_FIXEDSYS |DS_SETFONT |DS_MODALFRAME |DS_CENTER |WS_POPUP |WS_CAPTION |WS_VISIBLE |WS_SYSMENU |WS_MINIMIZEBOX
CAPTION "获取文件的Crc32校验值 By ksaiy"
FONT 9, "宋体"
BEGIN
CONTROL "",-1,"Static",SS_ETCHEDHORZ,5, 50, 248, 3
LTEXT "文件的CRC32校验值:", IDC_STATIC,3,3,100,12
EDITTEXT IDC_FILE_EDIT,4, 13, 252, 12, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP| ES_READONLY|WS_EX_STATICEDGE
PUSHBUTTON "获取文件CRC32值",IDC_OPEN_BUTTON,168, 30, 82, 14,BS_FLAT
LTEXT "By ksaiy 欢迎转载但请注明出处。", -1,121, 55, 128, 12, WS_DISABLED | WS_GROUP
END
[注:转载请注明出处]
本文地址:http://com.8s8s.com/it/it21819.htm