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

📄 tabtool.asm

📁 MasmEd是一款专门针对Masm32做的汇编代码编辑器
💻 ASM
字号:
.code

UpdateFileTime proc uses ebx,lpMem:DWORD
	LOCAL	hFile:DWORD

	mov		ebx,lpMem
	invoke CreateFile,addr [ebx].TABMEM.filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
	.if eax!=INVALID_HANDLE_VALUE
		mov		hFile,eax
		invoke GetFileTime,hFile,NULL,NULL,addr [ebx].TABMEM.ft
		invoke CloseHandle,hFile
	.endif
	ret

UpdateFileTime endp

ThreadProc proc uses ebx esi edi,Param:DWORD
	LOCAL	buffer[MAX_PATH]:BYTE
	LOCAL	filet:FILETIME
	LOCAL	nInx:DWORD
	LOCAL	tci:TCITEM

	mov		esi,fn.lpPath
	mov		edi,fn.lpHandle
	mov		ebx,fn.lpPtrPth
	.while [esi].FILENOTIFYPATH.path
		.if [esi].FILENOTIFYPATH.nCount
			invoke FindFirstChangeNotification,addr [esi].FILENOTIFYPATH.path,FALSE,FILE_NOTIFY_CHANGE_LAST_WRITE 
			mov		[edi],eax
			lea		eax,[esi].FILENOTIFYPATH.path
			mov		[ebx],eax
			add		edi,4
			add		ebx,4
			inc		fn.nCount
		.endif
		add		esi,sizeof FILENOTIFYPATH
	.endw
	.while TRUE
		; Wait for notification.		
		invoke WaitForMultipleObjects,fn.nCount,fn.lpHandle,FALSE,INFINITE
		.if eax<MAXIMUM_WAIT_OBJECTS
			mov		esi,fn.lpPtrPth
			lea		esi,[esi+eax*4]
			mov		edi,fn.lpHandle
			lea		edi,[edi+eax*4]
			mov		nInx,-1
			mov		tci.imask,TCIF_PARAM
			.while TRUE
				inc		nInx
				invoke SendMessage,hTab,TCM_GETITEM,nInx,addr tci
				.break .if !eax
				mov		ebx,tci.lParam
				invoke lstrcpy,addr buffer,addr [ebx].TABMEM.filename
				invoke lstrlen,addr buffer
				.while eax
					.if byte ptr buffer[eax]=='\'
						mov		byte ptr buffer[eax],0
						.break
					.endif
					dec		eax
				.endw
				invoke lstrcmpi,addr buffer,[esi]
				.if !eax
					mov		eax,[ebx].TABMEM.ft.dwLowDateTime
					mov		filet.dwLowDateTime,eax
					mov		eax,[ebx].TABMEM.ft.dwHighDateTime
					mov		filet.dwHighDateTime,eax
					invoke UpdateFileTime,ebx
					invoke CompareFileTime,addr [ebx].TABMEM.ft,addr filet
					.if sdword ptr eax!=0
						inc		[ebx].TABMEM.nchange
					.endif
				.endif
			.endw
			invoke FindNextChangeNotification,[edi]
			.if eax==FALSE
				.break
			.endif
		.elseif eax==WAIT_ABANDONED || eax==WAIT_TIMEOUT || eax==WAIT_FAILED
			.break
		.endif
	.endw
	ret

ThreadProc ENDP

CloseNotify proc uses esi

	mov		esi,fn.lpHandle
	.while fn.nCount
		invoke FindCloseChangeNotification,[esi]
		mov		dword ptr [esi],0
		add		esi,4
		dec		fn.nCount
	.endw
	.if fn.hThread
		invoke CloseHandle,fn.hThread
		mov		fn.hThread,0
	.endif
	ret

CloseNotify endp

SetNotify proc uses esi
	LOCAL	ThreadID:DWORD

	invoke CloseNotify
	xor		eax,eax
	mov		esi,fn.lpPath
	.while [esi].FILENOTIFYPATH.path
		.if [esi].FILENOTIFYPATH.nCount
			inc		eax
		.endif
		add		esi,sizeof FILENOTIFYPATH
	.endw
	.if eax
		invoke CreateThread,NULL,NULL,addr ThreadProc,0,NORMAL_PRIORITY_CLASS,addr ThreadID
		mov		fn.hThread,eax
	.endif
	ret

SetNotify endp

AddPath proc uses esi edi,lpFileName:DWORD
	LOCAL	buffer[MAX_PATH]:BYTE

	invoke lstrcpy,addr buffer,lpFileName
	invoke lstrlen,addr buffer
	.while eax
		.if byte ptr buffer[eax]=='\'
			mov		byte ptr buffer[eax],0
			.break
		.endif
		dec		eax
	.endw
	invoke GetFileAttributes,addr buffer
	.if eax!=INVALID_HANDLE_VALUE
		xor		edi,edi
		mov		esi,fn.lpPath
		.while [esi].FILENOTIFYPATH.path
			.if [esi].FILENOTIFYPATH.nCount
				invoke lstrcmp,addr [esi].FILENOTIFYPATH.path,addr buffer
				or		eax,eax
				je		Found
			.elseif !edi
				mov		edi,esi
			.endif
			add		esi,sizeof FILENOTIFYPATH
		.endw
		.if edi
			mov		esi,edi
		.endif
		invoke lstrcpy,addr [esi].FILENOTIFYPATH.path,addr buffer
	  Found:
		inc		[esi].FILENOTIFYPATH.nCount
		.if [esi].FILENOTIFYPATH.nCount==1
			invoke SetNotify
		.endif
	.endif
	ret

AddPath endp

DelPath proc uses esi,lpFileName:DWORD
	LOCAL	buffer[MAX_PATH]:BYTE

	invoke lstrcpy,addr buffer,lpFileName
	invoke lstrlen,addr buffer
	.while eax
		.if byte ptr buffer[eax]=='\'
			mov		byte ptr buffer[eax],0
			.break
		.endif
		dec		eax
	.endw
	invoke GetFileAttributes,addr buffer
	.if eax!=INVALID_HANDLE_VALUE
		mov		esi,fn.lpPath
		.while [esi].FILENOTIFYPATH.path
			.if [esi].FILENOTIFYPATH.nCount
				invoke lstrcmp,addr [esi].FILENOTIFYPATH.path,addr buffer
				or		eax,eax
				je		Found
			.endif
			add		esi,sizeof FILENOTIFYPATH
		.endw
	.endif
	ret
  Found:
	dec		[esi].FILENOTIFYPATH.nCount
	.if ![esi].FILENOTIFYPATH.nCount
		invoke SetNotify
	.endif
	ret

DelPath endp

TabToolGetMem proc uses ebx,hWin:DWORD
	LOCAL	nInx:DWORD
	LOCAL	tci:TCITEM

	mov		nInx,-1
	mov		tci.imask,TCIF_PARAM
	mov		eax,TRUE
	.while eax
		inc		nInx
		invoke SendMessage,hTab,TCM_GETITEM,nInx,addr tci
		.if eax
			mov		ebx,tci.lParam
			mov		eax,[ebx].TABMEM.hwnd
			.break .if eax==hWin
		.endif
	.endw
	mov		eax,ebx
	ret

TabToolGetMem endp

TabToolGetInx proc uses ebx,hWin:DWORD
	LOCAL	nInx:DWORD
	LOCAL	tci:TCITEM

	mov		nInx,-1
	mov		tci.imask,TCIF_PARAM
	mov		eax,TRUE
	.while eax
		inc		nInx
		invoke SendMessage,hTab,TCM_GETITEM,nInx,addr tci
		.if eax
			mov		ebx,tci.lParam
			mov		eax,[ebx].TABMEM.hwnd
			.break .if eax==hWin
		.endif
	.endw
	mov		eax,nInx
	ret

TabToolGetInx endp

TabToolSetText proc nInx:DWORD,lpFileName:DWORD
	LOCAL	tci:TCITEM

	mov		tci.imask,TCIF_PARAM
	invoke SendMessage,hTab,TCM_GETITEM,nInx,addr tci
	mov		eax,tci.lParam
	invoke lstrcpy,addr [eax].TABMEM.filename,lpFileName
	invoke lstrlen,lpFileName
	mov		ecx,eax
	mov		edx,lpFileName
	.while ecx
		mov		al,[edx+ecx-1]
		.break .if al=='\'
		dec		ecx
	.endw
	lea		eax,[edx+ecx]
	mov		tci.pszText,eax
	mov		tci.imask,TCIF_TEXT
	invoke SendMessage,hTab,TCM_SETITEM,nInx,addr tci
	ret

TabToolSetText endp

TabToolActivate proc uses ebx
	LOCAL	tci:TCITEM

	invoke SendMessage,hTab,TCM_GETCURSEL,0,0
	mov		tci.imask,TCIF_PARAM
	mov		edx,eax
	invoke SendMessage,hTab,TCM_GETITEM,edx,addr tci
	push	hREd
	mov		ebx,tci.lParam
	mov		eax,[ebx].TABMEM.hwnd
	mov		hREd,eax
	invoke lstrcpy,offset FileName,addr [ebx].TABMEM.filename
	invoke SetWinCaption,offset FileName
	invoke SendMessage,hWnd,WM_SIZE,0,0
	invoke ShowWindow,hREd,SW_SHOW
	invoke SetFocus,hREd
	mov		fTimer,1
	invoke RefreshCombo,hREd
	pop		eax
	.if eax!=hREd
		invoke ShowWindow,eax,SW_HIDE
	.endif
	invoke SendMessage,hBrowse,FBM_SETSELECTED,0,addr [ebx].TABMEM.filename
	ret

TabToolActivate endp

TabToolAdd proc uses ebx,hWin:HWND,lpFileName:DWORD
	LOCAL	tci:TCITEM
	LOCAL	ThreadID:DWORD
	LOCAL	msg:MSG

	invoke GetProcessHeap
	invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,sizeof TABMEM
	mov		ebx,eax
	mov		eax,hWin
	mov		[ebx].TABMEM.hwnd,eax
	invoke lstrcpy,addr [ebx].TABMEM.filename,lpFileName
	invoke lstrlen,lpFileName
	mov		ecx,eax
	mov		edx,lpFileName
	.while ecx
		mov		al,[edx+ecx-1]
		.break .if al=='\'
		dec		ecx
	.endw
	mov		tci.imask,TCIF_TEXT or TCIF_PARAM
	lea		eax,[edx+ecx]
	mov		tci.pszText,eax
	mov		tci.cchTextMax,20
	mov		tci.lParam,ebx
	invoke SendMessage,hTab,TCM_INSERTITEM,999,addr tci
	invoke SendMessage,hTab,TCM_SETCURSEL,eax,0
	invoke UpdateFileTime,ebx
	invoke AddPath,lpFileName
	invoke SendMessage,hBrowse,FBM_SETSELECTED,0,lpFileName
	ret

TabToolAdd endp

TabToolDel proc uses ebx,hWin:HWND
	LOCAL	nInx:DWORD
	LOCAL	tci:TCITEM

	mov		nInx,-1
	mov		tci.imask,TCIF_PARAM
	mov		eax,TRUE
	.while eax
		inc		nInx
		invoke SendMessage,hTab,TCM_GETITEM,nInx,addr tci
		.if eax
			mov		ebx,tci.lParam
			mov		eax,[ebx].TABMEM.hwnd
			.if eax==hWin
				invoke DelPath,addr [ebx].TABMEM.filename
				invoke SendMessage,hTab,TCM_DELETEITEM,nInx,0
				invoke GetProcessHeap
				invoke HeapFree,eax,NULL,ebx
				xor eax,eax
			.endif
		.endif
	.endw
	invoke SendMessage,hTab,TCM_GETITEMCOUNT,0,0
	.if !eax
		invoke CreateNew
		mov		nInx,0
	.endif
  @@:
	invoke SendMessage,hTab,TCM_SETCURSEL,nInx,0
	invoke SendMessage,hTab,TCM_GETCURSEL,0,0
	.if eax==-1
		dec		nInx
		jmp		@b
	.endif
	invoke TabToolActivate
	ret

TabToolDel endp

⌨️ 快捷键说明

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