⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 make.asm

📁 MasmEd是一款专门针对Masm32做的汇编代码编辑器
💻 ASM
字号:
MAKE struct
	hThread		dd ?
	hRead		dd ?
	hWrite		dd ?
	pInfo		PROCESS_INFORMATION <?>
	uExit		dd ?
	buffer		db 512 dup(?)
MAKE ends

.data

;原版代码定义
;CompileRC				db '\masm32\bin\rc /v ',0
;ExtRC					db '.rc',0
;ExtRes					db '.res',0
;Assemble				db '\masm32\bin\ml /c /coff /Cp /I\masm32\include ',0
;ExtObj					db '.obj',0
;Link					db '\masm32\bin\link /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:\masm32\lib ',0
;ExtExe					db '.exe',0
;--------------------------------------------------------------------------------
;修改代码定义,
CompileRC				db 512 dup (0)
ExtRC					db '.rc',0
ExtRes					db '.res',0
Assemble				db 512 dup (0)
ExtObj					db '.obj',0
Link					db 512 dup (0)
ExtExe					db '.exe',0
;--------------------------------------------------------------------------------

rsrcrc					db 'rsrc.rc',0
rsrcres					db 'rsrc.res',0

MakeDone				db 0Dh,'任务完成!',0Dh,0
Errors					db 0Dh,'发生错误!',0Dh,0
Terminated				db 0Dh,'用户原因终止!',0
NoRC					db 0Dh,'找不到资源脚本文件(*.rc)!',0Dh,0
Exec					db 0Dh,'正在执行:',0
NoDel					db 0Dh,'无法删除:',0Dh,0

CreatePipeError			db 'CreatePipe函数调用失败!',0
CreateProcessError		db '进程创建失败!',0Dh,0Ah,'请检查路径设置是否正确以及文件是否存在',0Dh,0ah,0

;--------------------------------------------------------------------------------
;用于下面的格式化输出,更改编译链接字符串
szFormCRC				db	'%s\bin\rc /I%s\include /v ',0
szFormASS				db	'%s\bin\ml /c /coff /Cp /I%s\include ',0
szFormLIN				db	'%s\bin\link /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:%s\lib ',0
;--------------------------------------------------------------------------------
.data?

make					MAKE <>

.code

MakeThreadProc proc uses ebx,Param:DWORD
	LOCAL	sat:SECURITY_ATTRIBUTES
	LOCAL	startupinfo:STARTUPINFO
	LOCAL	bytesRead:DWORD
	LOCAL	buffer[256]:BYTE

	invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset szCr
	invoke SendMessage,hOut,EM_REPLACESEL,FALSE,addr make.buffer
	invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset szCr
	invoke SendMessage,hOut,EM_SCROLLCARET,0,0
	.if Param==IDM_MAKE_RUN
		invoke WinExec,addr make.buffer,SW_SHOWNORMAL
		.if eax>=32
			xor		eax,eax
		.endif
	.else
		mov sat.nLength,sizeof SECURITY_ATTRIBUTES
		mov sat.lpSecurityDescriptor,NULL
		mov sat.bInheritHandle,TRUE
		invoke CreatePipe,addr make.hRead,addr make.hWrite,addr sat,NULL
		.if eax==NULL
			;CreatePipe failed
			invoke LoadCursor,0,IDC_ARROW
			invoke SetCursor,eax
			invoke MessageBox,hWnd,addr CreatePipeError,addr szAppName,MB_ICONERROR+MB_OK
			xor		eax,eax
		.else
			mov startupinfo.cb,sizeof STARTUPINFO
			invoke GetStartupInfo,addr startupinfo
			mov eax,make.hWrite
			mov startupinfo.hStdOutput,eax
			mov startupinfo.hStdError,eax
			mov startupinfo.dwFlags,STARTF_USESHOWWINDOW+STARTF_USESTDHANDLES
			mov startupinfo.wShowWindow,SW_HIDE
			;Create process
			invoke CreateProcess,NULL,addr make.buffer,NULL,NULL,TRUE,NULL,NULL,NULL,addr startupinfo,addr make.pInfo
			.if eax==NULL
				;CreateProcess failed
				invoke CloseHandle,make.hRead
				invoke CloseHandle,make.hWrite
				invoke LoadCursor,0,IDC_ARROW
				invoke SetCursor,eax
				invoke lstrcpy,addr buffer,addr CreateProcessError
				invoke lstrcat,addr buffer,addr make.buffer
				invoke MessageBox,hWnd,addr buffer,addr szAppName,MB_ICONERROR+MB_OK
				xor		eax,eax
			.else
				invoke CloseHandle,make.hWrite
				invoke RtlZeroMemory,addr make.buffer,sizeof make.buffer
				xor		ebx,ebx
				.while TRUE
					invoke ReadFile,make.hRead,addr make.buffer[ebx],1,addr bytesRead,NULL
					.if eax==NULL
						.if ebx
							call	OutputText
						.endif
						.break
					.else
						.if make.buffer[ebx]==0Ah || ebx==511
							call	OutputText
						.else
							inc		ebx
						.endif
					.endif
				.endw
				invoke GetExitCodeProcess,make.pInfo.hProcess,addr make.uExit
				invoke CloseHandle,make.hRead
				invoke CloseHandle,make.pInfo.hProcess
				invoke CloseHandle,make.pInfo.hThread
				mov		eax,TRUE
			.endif
		.endif
	.endif
	invoke ExitThread,eax
	ret

OutputText:
	mov		make.buffer[ebx+1],0
	invoke SendMessage,hOut,EM_REPLACESEL,FALSE,addr make.buffer
	invoke SendMessage,hOut,EM_SCROLLCARET,0,0
	xor		ebx,ebx
	retn

MakeThreadProc endp

OutputMake proc uses ebx,nCommand:DWORD,lpFileName:DWORD,fClear:DWORD
	LOCAL	buffer[256]:BYTE
	LOCAL	buffer2[256]:BYTE
	LOCAL	fExitCode:DWORD
	LOCAL	ThreadID:DWORD
	LOCAL	msg:MSG
	
;--------------------------------------------------------------------------------
	LOCAL	szBuff
	LOCAL	lszBuff
	;invoke _RegQueryValue,addr szBuff,addr lszBuff
	mov lszBuff,MAX_PATH
	
	invoke _RegQueryValue,addr szBuff,addr lszBuff

	invoke wsprintf,addr CompileRC,addr szFormCRC,addr szBuff,addr szBuff
	invoke wsprintf,addr Assemble,addr szFormASS,addr szBuff,addr szBuff
	invoke wsprintf,addr Link,addr szFormLIN,addr szBuff,addr szBuff
;--------------------------------------------------------------------------------	

	invoke SetCurDir,lpFileName,FALSE
	mov		fExitCode,0
	invoke LoadCursor,0,IDC_WAIT
	invoke SetCursor,eax
	test	wpos.fView,4
	.if ZERO?
		or		wpos.fView,4
		invoke ShowWindow,hOut,SW_SHOWNA
		invoke SendMessage,hWnd,WM_SIZE,0,1
	.endif
	invoke SetFocus,hOut
	mov		make.buffer,0
	.if fClear==1 || fClear==2
		invoke SendMessage,hOut,WM_SETTEXT,0,addr make.buffer
		invoke SendMessage,hOut,EM_SCROLLCARET,0,0
	.endif
	mov		eax,nCommand
	.if eax==IDM_MAKE_COMPILE
		invoke lstrcpy,addr make.buffer,offset CompileRC
		;Try FileName.rc
		invoke lstrcpy,addr buffer2,lpFileName
		invoke RemoveFileExt,addr buffer2
		invoke lstrcat,addr buffer2,offset ExtRC
		invoke GetFileAttributes,addr buffer2
		.if eax==-1
			;FileName.rc not found, try rsrc.rc
			mov		lpFileName,offset rsrcrc
			invoke RemoveFileName,addr buffer2
			invoke lstrcat,addr buffer2,lpFileName
			invoke GetFileAttributes,addr buffer2
			.if eax==-1
				;FileName.rc nor rsrc.rc found, give message and exit
				invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset NoRC
				invoke SendMessage,hOut,EM_SCROLLCARET,0,0
				jmp		Ex
			.endif
		.endif
		invoke lstrcat,addr make.buffer,offset szQuote
		invoke lstrcat,addr make.buffer,addr buffer2
		invoke lstrcat,addr make.buffer,offset szQuote
		mov		eax,offset ExtRes
	.elseif eax==IDM_MAKE_ASSEMBLE
		invoke lstrcpy,addr make.buffer,offset Assemble
		invoke lstrcat,addr make.buffer,offset szQuote
		invoke lstrcat,addr make.buffer,lpFileName
		invoke lstrcat,addr make.buffer,offset szQuote
		mov		eax,offset ExtObj
	.elseif eax==IDM_MAKE_LINK
		invoke lstrcpy,addr make.buffer,offset Link
		invoke lstrcpy,addr buffer2,lpFileName
		invoke RemoveFileExt,addr buffer2
		invoke lstrcat,addr buffer2,offset ExtObj
		invoke lstrcat,addr make.buffer,offset szQuote
		invoke lstrcat,addr make.buffer,addr buffer2
		invoke lstrcat,addr make.buffer,offset szQuote
		invoke RemoveFileExt,addr buffer2
		invoke lstrcat,addr buffer2,offset ExtRes
		invoke GetFileAttributes,addr buffer2
		.if eax==-1
			;FileName.res not found, try if rsrc.res exist
			invoke RemoveFileName,addr buffer2
			invoke lstrcat,addr buffer2,offset rsrcres
			invoke GetFileAttributes,addr buffer2
			.if eax!=-1
				;rsrc.res found
				invoke lstrcat,addr make.buffer,offset szSpc
				invoke lstrcat,addr make.buffer,offset szQuote
				invoke lstrcat,addr make.buffer,addr buffer2
				invoke lstrcat,addr make.buffer,offset szQuote
			.endif
		.else
			;FileName.res found
			invoke lstrcat,addr make.buffer,offset szSpc
			invoke lstrcat,addr make.buffer,offset szQuote
			invoke lstrcat,addr make.buffer,addr buffer2
			invoke lstrcat,addr make.buffer,offset szQuote
		.endif
		mov		eax,offset ExtExe
	.elseif eax==IDM_MAKE_RUN
		invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset Exec
		invoke lstrcpy,addr make.buffer,lpFileName
		invoke RemoveFileExt,addr make.buffer
		invoke lstrcat,addr make.buffer,offset ExtExe
		xor		eax,eax
	.else
		jmp		Ex
	.endif
	.if eax
		;Delete old file
		push	eax
		invoke lstrcpy,addr buffer2,lpFileName
		invoke RemoveFileExt,addr buffer2
		pop		eax
		invoke lstrcat,addr buffer2,eax
		invoke GetFileAttributes,addr buffer2
		.if eax!=INVALID_HANDLE_VALUE
			invoke DeleteFile,addr buffer2
			.if !eax
				mov		fExitCode,-1
				invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset NoDel
				invoke SendMessage,hOut,EM_REPLACESEL,FALSE,addr buffer2
				invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset szCr
				invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset Errors
				jmp		Ex
			.endif
		.endif
	.endif
	invoke CreateThread,NULL,NULL,addr MakeThreadProc,nCommand,NORMAL_PRIORITY_CLASS,addr ThreadID
	mov		make.hThread,eax
	.while TRUE
		invoke LoadCursor,0,IDC_WAIT
		invoke SetCursor,eax
		invoke GetMessage,addr msg,NULL,0,0
		mov		eax,msg.message
		.if eax!=WM_CHAR
			.if msg.wParam==VK_ESCAPE
				invoke TerminateProcess,make.pInfo.hProcess,1
			.endif
		.elseif eax!=WM_KEYDOWN && eax!=WM_CLOSE && (eax<WM_MOUSEFIRST || eax>WM_MOUSELAST)
			invoke TranslateMessage,addr msg
			invoke DispatchMessage,addr msg
		.endif
		invoke GetExitCodeThread,make.hThread,addr ThreadID
		.break .if ThreadID!=STILL_ACTIVE
	.endw
	invoke CloseHandle,make.hThread
	.if ThreadID
		.if !make.uExit
			;Check if file exists
			invoke GetFileAttributes,addr buffer2
			.if eax==-1
				mov		fExitCode,eax
				invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset Errors
			.else
				.if fClear==1 || fClear==3
					invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset MakeDone
				.endif
			.endif
		.else
			mov		fExitCode,-1
			invoke SendMessage,hOut,EM_REPLACESEL,FALSE,offset Terminated
		.endif
		invoke SendMessage,hOut,EM_SCROLLCARET,0,0
		invoke SetFocus,hOut
	.endif
  Ex:
	invoke LoadCursor,0,IDC_ARROW
	invoke SetCursor,eax
	mov		eax,fExitCode
	ret

OutputMake endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -