📄 rmecleaner.asm
字号:
.386
.model flat, stdcall
option casemap :none
include RMeCleaner.inc
include macros.inc
.code
start:
invoke GetModuleHandle, NULL
mov m_hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam, m_hInstance,IDD_MAIN,NULL,offset DlgProc,0
invoke ExitProcess, eax
DlgProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
; stStartUp STARTUPINFO <?>
; stProcInfo PROCESS_INFORMATION <?>
; ...
;
; invoke GetStartupInfo,addr stStartUp
; invoke CreateProcess,NULL,addr szFileName,NULL,NULL,NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,offset stStartUp,offset stProcInfo
; invoke TerminateProcess,stProcInfo.hProcess,0
; invoke GetExitCodeProcess, stProcInfo.hProcess,addr lpExitCode ;lpExitCode != STILL_ACTIVE
; invoke WaitForSingleObject,stProcInfo.hProcess,1000 ;等待 1 秒钟
; invoke WaitForSingleObject,stProcInfo.hProcess,INFINITE ;等到进程结束
; invoke CloseHandle,stProcInfo.hProcess
; invoke CloseHandle,stProcInfo.hThread
LOCAL lpPattern :DWORD
LOCAL lpFilePath :DWORD
LOCAL szBuffer[260] :BYTE
;设置背景颜色
; LOCAL hBrush :DWORD
; LOCAL rect :RECT
; LOCAL LogBrush :LOGBRUSH
mov eax,uMsg
.if eax == WM_INITDIALOG
mov eax,hWnd
mov m_hWndMain,eax
invoke LoadIcon, m_hInstance,IDI_MAIN
invoke SendMessage, hWnd,WM_SETICON,0,eax
;--------------------------------------------
;设置背景颜色
; .ELSEIF EAX==WM_ERASEBKGND
; mov LogBrush.lbStyle,BS_SOLID
; RGB 85,160,124
; mov LogBrush.lbColor,eax
; invoke CreateBrushIndirect,addr LogBrush
; mov hBrush,eax
; invoke GetClientRect,hWnd,addr rect
; invoke FillRect,wParam,addr rect,hBrush
;初始化窗体句柄
mov m_hWndProgress,FUNC(GetDlgItem,hWnd,IDC_PROGRESSBAR)
mov m_hWndEditPath,FUNC(GetDlgItem,hWnd,IDC_EDIT_FILEPATH)
mov m_hWndBtnBrower,FUNC(GetDlgItem,hWnd,IDC_BUTTON_BROWER)
mov m_hWndBtnRepair,FUNC(GetDlgItem,hWnd,IDC_BUTTON_REPAIR)
invoke CreateFont,14,6,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,FF_MODERN,CTEXT("MS Sans Serif")
invoke SendMessage, m_hWndBtnRepair,WM_SETFONT,eax,0
;初始化临时目录
invoke GetTempPath, 255,offset m_szRMecTmpDir
invoke lstrcat, offset m_szRMecTmpDir,CTEXT("rmecTmp\")
invoke lstrcpy, offset m_szRMecToolsDir, offset m_szRMecTmpDir
invoke lstrcat, offset m_szRMecToolsDir,CTEXT("tools\")
;初始化文件
invoke lstrcpy, offset m_szExecFilePath, offset m_szRMecTmpDir
invoke lstrcat, offset m_szExecFilePath,CTEXT("rmec.exe")
invoke lstrcpy, offset m_szDllFilePath, offset m_szRMecToolsDir
invoke lstrcat, offset m_szDllFilePath,CTEXT("rmtools.dll")
invoke lstrcpy, offset m_szEventsFilePath, offset m_szRMecToolsDir
invoke lstrcat, offset m_szEventsFilePath,CTEXT("events")
;--------------------------------------------
.elseif eax == WM_DROPFILES
invoke DragQueryFile, wParam,0,addr szBuffer,256
invoke SendMessage, m_hWndEditPath,WM_SETTEXT,0, addr szBuffer
ret
.elseif eax == WM_LBUTTONDOWN
;移动窗体
invoke UpdateWindow, hWnd
invoke ReleaseCapture
invoke SendMessage, hWnd,WM_NCLBUTTONDOWN,HTCAPTION, 0
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDC_EDIT_FILEPATH
mov eax, lParam
.if eax == m_hWndEditPath
;-------------------------------------------------------------------
;文本发生改变
invoke GetDlgItemText, hWnd,IDC_EDIT_FILEPATH,addr szBuffer,sizeof szBuffer
.if szBuffer[0] == 0
;文本为空,屏蔽[开始修复]
invoke EnableWindow, m_hWndBtnRepair,FALSE
.else
;文本不为空,激活[开始修复]
invoke lstrcpy, offset m_szSrcFilePath,addr szBuffer
invoke EnableWindow, m_hWndBtnRepair,TRUE
.endif
;-------------------------------------------------------------------
.endif
.elseif eax == IDC_BUTTON_REPAIR
;准备开始修复
invoke RepairRmEvents
; invoke SendMessage, hWnd, WM_CLOSE, 0, 0
.elseif eax == IDC_BUTTON_BROWER
;打开对话框
mov lpPattern, chr$("Real files (*.rm;*.rmvb)",0,"*.rm;*.rmvb",0,"All files (*.*)",0,"*.*",0,0)
mov lpFilePath,FUNC(OpenFileDialog,hWnd,m_hInstance,reparg("请选择要修复的文件"),reparg(lpPattern))
cmp BYTE PTR [eax], 0
jne @F ;已经选择文件
xor eax, eax
ret
@@:
;已经选择文件,设置EditPath为选择文件路径
invoke SendMessage,m_hWndEditPath,WM_SETTEXT,0,lpFilePath
.endif
.elseIf eax == WM_CTLCOLORSTATIC || eax == WM_CTLCOLOREDIT
;设置文字颜色
invoke GetDlgCtrlID,lParam
.if eax == IDC_STATIC_MSG
RGB 0,0,255
invoke SetTextColor,wParam,eax
invoke SetBkColor,wParam,FUNC(GetSysColor, COLOR_BTNFACE)
invoke GetStockObject,NULL_BRUSH
.else
mov eax,FALSE
ret
.endif
ret
.elseif eax == WM_TIMER
;计时器事件处理
invoke OnTimer
.elseif eax == WM_DESTROY
;退出前关闭计时器
invoke PostQuitMessage, NULL
.if m_dwTimerID != 0
invoke KillTimer, hWnd,m_dwTimerID
.endif
.elseif eax == WM_CLOSE
.if m_dwProcessID == 0
invoke DelTempFiles
invoke EndDialog, hWnd, 0
.else
.if FUNC(MessageBox, m_hWndMain,CTEXT("程序正在执行任务中, 终止程序将会导致修复文件失败, 确认要取消修复文件并关闭程序吗? "),CTEXT("警告"),MB_ICONWARNING or MB_YESNO) == IDYES
invoke OpenProcess, PROCESS_TERMINATE,TRUE,m_dwProcessID ;得到该进程的句柄
mov edx,eax
invoke TerminateProcess, eax,0
invoke CloseHandle, edx
invoke Sleep, 500
invoke EndDialog, hWnd, 0
invoke DeleteFile, addr m_szTempFilePath
invoke DelTempFiles
.else
mov eax,0
.endif
.endif
ret
.endif
xor eax,eax
ret
DlgProc endp
RepairRmEvents proc
LOCAL szTempBuffer[260] :BYTE
LOCAL szExecParameters[260] :BYTE
LOCAL hFileHandle :HANDLE
LOCAL hResHandle :HRSRC
LOCAL dwResSize :DWORD
;判断源文件是否存在
invoke lstrcpy, addr szTempBuffer,CTEXT("您选择的文件: ")
invoke lstrcat, addr szTempBuffer,offset m_szSrcFilePath
invoke lstrcat, addr szTempBuffer,CTEXT(" 不存在! ")
.if FUNC(FileExists, offset m_szSrcFilePath) == FALSE
invoke MessageBox, m_hWndMain,addr szTempBuffer,CTEXT("打开文件错误"),MB_ICONERROR
ret
.endif
;获得源文件长度
invoke CreateFile, offset m_szSrcFilePath, NULL, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
mov hFileHandle, eax
invoke GetFileSize, eax, NULL
mov m_dwSrcFileLength, eax
invoke CloseHandle, hFileHandle
;建立目录
invoke CreateDirectory, offset m_szRMecTmpDir, NULL
invoke CreateDirectory, addr m_szRMecToolsDir, NULL
;释放资源文件
;----------------------------------------------------------------------------------------------
.if FUNC(SaveResourceToFile, m_hInstance,CTEXT("rmec"),CTEXT("rmecfile"),addr m_szExecFilePath) == TRUE && \
FUNC(SaveResourceToFile, m_hInstance,CTEXT("events"),CTEXT("rmecfile"),addr m_szEventsFilePath) == TRUE && \
FUNC(SaveResourceToFile, m_hInstance,CTEXT("rmtools"),CTEXT("rmecfile"),addr m_szDllFilePath) == TRUE
jmp @ReadResourceSucceed
.else
;释放文件失败
;删除文件和目录
invoke DelTempFiles
invoke MessageBox, m_hWndMain,CTEXT("系统错误(13200): 程序初始化数据时遇到不可忽略的错误! "),CTEXT("程序错误"),MB_ICONERROR
invoke SendMessage, m_hWndMain, WM_SYSCOMMAND, SC_CLOSE, NULL
ret
.endif
@ReadResourceSucceed:
;判断修复文件是否存在
.if FUNC(FileExists,addr m_szExecFilePath) == FALSE || FUNC(FileExists,addr m_szDllFilePath) == FALSE || FUNC(FileExists,addr m_szEventsFilePath) == FALSE
;不存在则退出
invoke MessageBox, m_hWndMain, CTEXT("系统错误(13201): 程序初始化数据时遇到不可忽略的错误! "),CTEXT("程序错误"), MB_ICONERROR
invoke SendMessage, m_hWndMain, WM_SYSCOMMAND, SC_CLOSE, NULL
ret
.endif
;生成临时文件名
;-----------------------------------------------------------------------------------
invoke lstrcpy, offset m_szTempFilePath, offset m_szSrcFilePath
invoke lstrcat, offset m_szTempFilePath, CTEXT(".TMP")
;-----------------------------------------------------------------------------------
;生成运行参数
invoke lstrcpy, addr szExecParameters, CTEXT('-i "')
invoke lstrcat, addr szExecParameters, offset m_szSrcFilePath
invoke lstrcat, addr szExecParameters, CTEXT('" -o "')
invoke lstrcat, addr szExecParameters, addr m_szTempFilePath
invoke lstrcat, addr szExecParameters, CTEXT('" -e "')
invoke lstrcat, addr szExecParameters, addr m_szEventsFilePath
invoke lstrcat, addr szExecParameters, CTEXT('"')
;-----------------------------------------------------------------------------------
invoke ShellExecute, NULL,NULL,addr m_szExecFilePath,addr szExecParameters,NULL,SW_HIDE
.if FUNC(IsRmEventRunning) == FALSE
invoke DelTempFiles
invoke MessageBox, m_hWndMain,CTEXT("系统错误(13203): 程序初始化数据时遇到不可忽略的错误! "),CTEXT("程序错误"),MB_ICONERROR
invoke SendMessage, m_hWndMain, WM_SYSCOMMAND, SC_CLOSE, NULL
ret
.endif
invoke SendMessage, m_hWndProgress,PBM_SETRANGE32,0,m_dwSrcFileLength ;范围
invoke SendMessage, m_hWndProgress,PBM_SETPOS,10,0 ;位置
RGB 66,215,69
invoke SendMessage, m_hWndProgress,PBM_SETBARCOLOR,0,eax ;颜色
RGB 255,255,255
invoke SendMessage, m_hWndProgress,PBM_SETBKCOLOR,0,eax ;背景颜色
invoke ShowWindow, m_hWndProgress,SW_SHOW
invoke SendMessage, m_hWndMain,WM_SETTEXT,0,CTEXT("Real 文件弹出广告修复器 v1.0 - 正在初始化")
;打开计时器
invoke SetTimer,m_hWndMain, IDC_TIMER, 10, NULL
mov m_dwTimerID,eax
;屏蔽窗体状态
invoke EnableWindow, m_hWndBtnBrower,FALSE
invoke EnableWindow, m_hWndBtnRepair,FALSE
invoke EnableWindow, m_hWndEditPath,FALSE
invoke LoadCursor, 0, IDC_WAIT
invoke SetClassLong, m_hWndMain,GCL_HCURSOR,eax
Ret
RepairRmEvents EndP
OnTimer proc
LOCAL hFileHandle :HANDLE
LOCAL szTempBuffer[260] :BYTE
LOCAL szStrTemp[32] :BYTE
LOCAL dwTempLength :DWORD
LOCAL hProcess :DWORD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -