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