3. 有兴趣的朋友可以用masm64对其编辑,看一看会有啥不同结果。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; File Property Change
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include comdlg32.inc
includelib comdlg32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000
DLG_MAIN equ 100
IDC_FILE equ 101
IDC_BROWSE equ 102
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IDC_ATTRIBUTE equ 103
IDC_ATTRCHANGE equ 104
IDC_FILETIME equ 105
IDC_YEAR equ 106
IDC_MONTH equ 107
IDC_DAY equ 108
IDC_HOUR equ 109
IDC_MINUTE equ 110
IDC_TIMECHANGE equ 111
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
szFileName db MAX_PATH dup (?)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FileAttr dd ?
FileTime dd ?
TimeSelection dd ?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.const
szFileExt db 'All File',0,'*.*',0,0
szErrOpenFile db 'Cant open file!',0
szErrInfo db 'Invalid Input!',0
szSuccees db 'The Following File Properties has been changed:',0dh,0ah,'%s',0
szSucceesCap db 'Note',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;File Attributes selection
szText1 db 'Please make a selection',0
szText2 db 'FILE_ATTRIBUTE_NORMAL',0
szText3 db 'FILE_ATTRIBUTE_READONLY',0
szText4 db 'CreationTime',0
szText5 db 'LastAccessTime',0
szText6 db 'LastWriteTime',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;********************************************************************
_AttributeChange proc
local @hFile
local @szReadBufferAttr[512]:byte
;********************************************************************
; 打开文件
;********************************************************************
.if FileAttr==1
invoke SetFileAttributes, addr szFileName, FILE_ATTRIBUTE_NORMAL
.elseif FileAttr==2
invoke SetFileAttributes, addr szFileName, FILE_ATTRIBUTE_READONLY
.endif
;;;; 'GENERIC_WRITE' has to be set for writing file and change file time
;;;; 'GENERIC_READ' setting does not affect file to chnage attribute
invoke CreateFile,addr szFileName,GENERIC_READ,FILE_SHARE_WRITE,0,\
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,hWinMain,addr szErrOpenFile,NULL,MB_OK or MB_ICONEXCLAMATION
ret
.endif
mov @hFile,eax
invoke CloseHandle,@hFile
invoke wsprintf,addr @szReadBufferAttr,addr szSuccees,addr szFileName
invoke MessageBox,hWinMain,addr @szReadBufferAttr,addr szSucceesCap,MB_OK
ret
_AttributeChange endp
;********************************************************************
_TimeChange proc
local @hFile
local @szReadBuffer[MAX_PATH]:byte
local @myFileTime
local @sysTime:SYSTEMTIME
;Set System Time
invoke GetDlgItemInt,hWinMain,IDC_YEAR,NULL,FALSE
mov @sysTime.wYear, ax
invoke GetDlgItemInt,hWinMain,IDC_MONTH,NULL,FALSE
mov @sysTime.wMonth, ax
invoke GetDlgItemInt,hWinMain,IDC_DAY,NULL,FALSE
mov @sysTime.wDay, ax
invoke GetDlgItemInt,hWinMain,IDC_HOUR,NULL,FALSE
mov @sysTime.wHour, ax
invoke GetDlgItemInt,hWinMain,IDC_MINUTE,NULL,FALSE
mov @sysTime.wMinute, ax
invoke SystemTimeToFileTime, addr @sysTime, addr @myFileTime
;check the error
.if eax == 0
invoke MessageBox,hWinMain,addr szErrInfo,NULL,MB_OK or MB_ICONEXCLAMATION
ret
.endif
;********************************************************************
; 'GENERIC_WRITE' has to be set for writing file and changing file time
; 'GENERIC_READ' setting does not affect file to change its attributes
;********************************************************************
invoke CreateFile,addr szFileName,GENERIC_WRITE,FILE_SHARE_READ,0,\
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,hWinMain,addr szErrOpenFile,NULL,MB_OK or MB_ICONEXCLAMATION
ret
.endif
mov @hFile,eax
;-------------------------------------------------------------------------------------
.if FileTime==1
invoke SetFileTime, @hFile, addr @myFileTime, NULL, NULL
.elseif FileTime==2
invoke SetFileTime, @hFile, NULL, addr @myFileTime, NULL
.elseif FileTime==3
invoke SetFileTime, @hFile, NULL, NULL, addr @myFileTime
.endif
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;invoke SetFileTime, @hFile, addr @myFileTime, NULL, NULL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
invoke CloseHandle,@hFile
invoke wsprintf,addr @szReadBuffer,addr szSuccees,addr szFileName
invoke MessageBox,hWinMain,addr @szReadBuffer,addr szSucceesCap,MB_OK
ret
_TimeChange endp
;********************************************************************
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @stOpenFileName:OPENFILENAME
mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
;********************************************************************
.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_FILE,EM_SETLIMITTEXT,MAX_PATH,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;********************************************************************
; 初始化组合框
;********************************************************************
;;;;File Attribute Selection
invoke SendDlgItemMessage,hWnd,IDC_ATTRIBUTE,CB_ADDSTRING,0,addr szText1
invoke SendDlgItemMessage,hWnd,IDC_ATTRIBUTE,CB_ADDSTRING,0,addr szText2
invoke SendDlgItemMessage,hWnd,IDC_ATTRIBUTE,CB_ADDSTRING,0,addr szText3
invoke SendDlgItemMessage,hWnd,IDC_ATTRIBUTE,CB_SETCURSEL,0,0
;;;;File Time Selection
invoke SendDlgItemMessage,hWnd,IDC_FILETIME,CB_ADDSTRING,0,addr szText1
invoke SendDlgItemMessage,hWnd,IDC_FILETIME,CB_ADDSTRING,0,addr szText4
invoke SendDlgItemMessage,hWnd,IDC_FILETIME,CB_ADDSTRING,0,addr szText5
invoke SendDlgItemMessage,hWnd,IDC_FILETIME,CB_ADDSTRING,0,addr szText6
invoke SendDlgItemMessage,hWnd,IDC_FILETIME,CB_SETCURSEL,0,0
;;;;Set Up Time Inputs Format
invoke SendDlgItemMessage,hWnd,IDC_YEAR,EM_LIMITTEXT,4,0
invoke SendDlgItemMessage,hWnd,IDC_MONTH,EM_LIMITTEXT,2,0
invoke SendDlgItemMessage,hWnd,IDC_DAY,EM_LIMITTEXT,2,0
invoke SendDlgItemMessage,hWnd,IDC_HOUR,EM_LIMITTEXT,2,0
invoke SendDlgItemMessage,hWnd,IDC_MINUTE,EM_LIMITTEXT,2,0
mov FileAttr, 0 ;Set them to 0 if none is selected
mov FileTime, 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDC_BROWSE
;********************************************************************
invoke RtlZeroMemory,addr @stOpenFileName,sizeof OPENFILENAME
mov @stOpenFileName.lStructSize,SIZEOF @stOpenFileName
mov @stOpenFileName.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
push hWinMain
pop @stOpenFileName.hwndOwner
mov @stOpenFileName.lpstrFilter,offset szFileExt
mov @stOpenFileName.lpstrFile,offset szFileName
mov @stOpenFileName.nMaxFile,MAX_PATH
invoke GetOpenFileName,addr @stOpenFileName
.if eax
invoke SetDlgItemText,hWnd,IDC_FILE,addr szFileName
.endif
;********************************************************************
.elseif ax == IDC_FILE
invoke GetDlgItemText,hWnd,IDC_FILE,addr szFileName,MAX_PATH
mov ebx,eax
invoke EnableWindow,eax,ebx
;********************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Set FileAttr=0 if none attribute is selected
;mov FileAttr, 0
.elseif ax == IDC_ATTRIBUTE
shr eax,16
.if ax == CBN_SELENDOK
invoke SendDlgItemMessage,hWnd,IDC_ATTRIBUTE,CB_GETCURSEL,0,0
;;;;the return value is according to the selection
.if eax == 1
mov ebx,eax
mov FileAttr, 1
.elseif eax == 2
mov ebx,eax
mov FileAttr, 2
.else
mov FileAttr, 0
.endif
.endif
;--------------------------------------------------------------------
;;;;;;;;Set FileTime=0 if none time is selected
;mov FileTime, 0
.elseif ax == IDC_FILETIME
shr eax, 16
.if ax == CBN_SELENDOK
invoke SendDlgItemMessage,hWnd,IDC_FILETIME,CB_GETCURSEL,0,0
mov TimeSelection, 1
.if eax == 1
mov ebx,eax
mov FileTime, 1
.elseif eax == 2
mov ebx,eax
mov FileTime, 2
.elseif eax == 3
mov ebx,eax
mov FileTime, 3
.else
mov FileTime, 0
.endif
.endif
;*******************************************************************
.elseif ax == IDC_ATTRCHANGE
shr eax, 16
.if FileAttr == 1 || FileAttr == 2
call _AttributeChange
.elseif FileAttr == 0
invoke MessageBox,hWinMain,addr szErrInfo,NULL,MB_OK or MB_ICONEXCLAMATION
.endif
;********************************************************************
.elseif ax == IDC_TIMECHANGE
shr eax, 16
.if FileTime == 1 || FileTime == 2 || FileTime == 3
call _TimeChange
.elseif FileTime == 0
invoke MessageBox,hWinMain,addr szErrInfo,NULL,MB_OK or MB_ICONEXCLAMATION
.endif
;********************************************************************
.elseif ax == IDCANCEL
invoke EndDialog,hWnd,NULL
.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