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

📄 xhex.asm

📁 一个十六进制编辑器源代码,cool!
💻 ASM
字号:
;----------------
;编译模式="EXE"
;----------------
;制表符的长度请设置为3
;=================================================
.386
.Model Flat, StdCall
Option Casemap :None
include xhex.inc
.CODE
START:
	invoke _InitCommCtl
	invoke GetModuleHandle,NULL
	mov hInstance, eax
	invoke WinMain,eax,0,0,0
	invoke ExitProcess,0
;=============================================
_InitApp proc uses esi edi ecx
	local lf:LOGFONTA
	invoke GetMenu,hWnd
	mov hMenu,eax
	call _IniInit
	invoke _IniGetStr,0,ctext("font")
	.if eax==0
		invoke lstrcpy,lpIniBuf,ctext("Fixedsys")
	.endif
	invoke RtlZeroMemory,addr lf,sizeof LOGFONTA
   mov lf.lfWeight,FW_NORMAL
   mov lf.lfCharSet,DEFAULT_CHARSET
   mov lf.lfOutPrecision,OUT_DEFAULT_PRECIS
   mov lf.lfClipPrecision,CLIP_DEFAULT_PRECIS
   mov lf.lfQuality,PROOF_QUALITY
   mov lf.lfPitchAndFamily,DEFAULT_PITCH
   invoke lstrcpy,addr lf.lfFaceName,lpIniBuf
   invoke CreateFontIndirect,addr lf
	mov hFont,eax
	invoke LoadLibrary,ctext("xHexCom.dll")
	mov hInstDll,eax
	call _GetPrivileges
	call _InitOpenSaveDlg
	call _InitUndo
	invoke _HisMenuLoad
	invoke GetCmdLine,TRUE 
	.if eax<=1
	@@:
		invoke _NewFile,0,sizeofabout
		mov ecx,sizeofabout
		lea esi,szAboutStr
		mov edi,lpMemFile
		rep movsb
	.else		
		invoke _OpenFile,lpCmdLine[1*4]
		test eax,eax
		jz @b
	.endif
	call CmdLineEnd
	invoke SetTimer,hWnd,1000,700,0;申请计时器,作为闪烁光标
	ret
_InitApp endp
;---------------------------------------------------
_AppEnd proc
	call _IniEnd
	call _UndoEnd
	invoke KillTimer,hWnd,1000
	invoke DeleteObject,hFont
	invoke FreeLibrary,hInstDll
	call _Release
	call _del_readme
	ret
_AppEnd endp
;----------------------------------------
;释放内存
_Release	proc
	.if lpMemFile
		.if dwFileType ==FILE_MAP
			invoke UnmapViewOfFile,lpMemFile
		.else
			__free lpMemFile
		.endif
		mov lpMemFile,0
	.endif
	ret
_Release endp
;----------------------------------------------------
_SetWindowTitle proc @hwnd,lpBuf
local @szBuf[255]:BYTE
	lea esi,@szBuf
	mov DWORD ptr [esi],'xeHx'
	mov BYTE ptr [esi+4],' '
	add esi,5
	invoke _GetFileTitle,lpBuf,esi
	.if eax==0
		invoke lstrcpy,esi,lpBuf
	.elseif dwFileType==FILE_MAP
		invoke lstrcat,esi,ctext(" [直接模式]")
	.endif
	invoke SetWindowText,hWnd,addr @szBuf
	call _DrawCursor
	ret
_SetWindowTitle endp
;---------------------------------------------------
_InitData proc lParam
local sci:SCROLLINFO
;初始化数据,决定滚动条的数值
	mov eax,dwFileSize
	push lpMemFile
	pop lpMemFileEnd
	add lpMemFileEnd,eax
	dec lpMemFileEnd
	shr eax,4;eax=eax/16
	mov sci.nMax,eax
	dec eax
	mov g_TotalLine,eax
	xor eax,eax
	mov g_TopLine,eax
	mov dwBlockStart,eax
	mov dwBlockEnd,eax
	mov dwCurPos,eax
	mov sci.cbSize,sizeof SCROLLINFO
	mov sci.fMask,SIF_POS or SIF_RANGE  
	mov sci.nPos,eax
	mov sci.nMin,eax
	mov dwPrePos,eax
	invoke SetScrollInfo,hWnd,SB_VERT ,addr sci,TRUE
	call _SetPages
	call _InitUndo
	;将历史位置缓冲区回复
	ret
_InitData endp
;-------------------------------------------------
;根据窗体的高度来求出一页有多少行
;设置滚动条的nPage可以设置滚动块的大小(不使用)
_SetPages proc uses ecx edx
local @rc:RECT 
;local sci:SCROLLINFO
	;mov sci.cbSize,sizeof SCROLLINFO
	;mov sci.fMask,SIF_ALL 
	;invoke GetScrollInfo,hWnd,SB_VERT ,addr sci
	invoke GetClientRect,hWnd,addr @rc
	mov eax,@rc.bottom
	sub eax,@rc.top
	sub eax,STATUSBAR_HEIGHT+HEX_TOP
	mov ecx,Y_CELL_SPACE
	xor edx,edx
	div ecx
	mov dwVisibleLines, eax
	;mov sci.nPage,eax
	;invoke SetScrollInfo,hWnd,SB_VERT ,addr sci,TRUE
	ret
_SetPages endp
;--------------------------------------
;设置位置
_SetPos proc uses edi nPos 
	mov eax,nPos
	.if SDWORD ptr eax<0
		xor eax ,eax
	.elseif eax>=dwFileSize
		mov eax,dwFileSize
		dec eax
	.endif
	mov dwBlockStart,eax
	mov dwBlockEnd,eax
	mov dwCurPos,eax
	call _Scroll2Visible
	ret
_SetPos endp
;----------------------------------------------------
;滚动到可见部分
_Scroll2Visible proc
	mov eax,dwBlockStart
	.if eax<g_FirstVisible || eax>g_LastVisible
		;如果超出可见范围,滚动至可见部分
		shr eax,4
		mov g_TopLine,eax
		shl eax,4
	.endif
	invoke SetScrollPos,hWnd,SB_VERT ,g_TopLine,TRUE
	call _ReDraw
	ret
_Scroll2Visible endp
;//----------------------------
;_Point2Pos

;将鼠标的坐标转换为文件绝对位置
;传入:鼠标的坐标
;返回:
;eax:文件的绝对位置

;dl:鼠标所在的区域
;0-偏移(00..01..0F),
;1-地址
;2-HEX显示区
;3-ASC显示区

;dh为1则表示当前位置超出文件的大小或超出可见部分
;-------------------------------------------------//
_Point2Pos proc uses ecx esi edi lParam
Local nCol,nRow,x,y
Local x_hex_left,y_hex_top,x_cell
	mov eax,lParam
	mov ecx,eax
	movzx eax,ax
	mov x,eax
	shr ecx,16
	mov y,ecx
	.if y<HEX_TOP+TOP_CELL
		mov eax,dwBlockStart
		mov edx,0;偏移区  ;鬼
		ret
	.elseif x<HEX_LEFT
		mov eax,dwBlockStart
		mov edx,1;地址
		ret
	.elseif x>=ASC_LEFT
		mov edi,ASC_LEFT
		mov esi,g_asc_width;ASC字符的宽度
		push DWORD ptr 3;ASC
		jmp _calc_x_y_
	.else
		mov edi,HEX_LEFT
		mov esi,X_CELL_SPACE
		push DWORD ptr 2
	_calc_x_y_:
		;所在列
		mov eax,lParam	
		movzx eax,ax
		sub eax,edi
		test eax,eax
		jge @f
		mov nCol,0
		jmp _calc_y_
	@@:
		xor edx,edx
		mov ecx,esi
		div ecx
		mov nCol,eax
	;--------所在行------
	_calc_y_:
		mov eax,lParam
		shr eax,16
		sub eax,HEX_TOP+TOP_CELL
		test eax,eax
		jge @f
		mov nRow,0
		xor eax,eax
		jmp _calc_pos_
	@@:
		xor edx,edx
		mov cx,Y_CELL_SPACE
		div cx
		mov nRow,eax
	;--------绝对位置--- pos=y*16+x ----
	_calc_pos_:
		shl eax,4
		add eax,nCol
		mov ecx,g_TopLine
		shl ecx,4;ecx=当前可见的第一个地址(即最左上角的那个)
		add eax,ecx
		pop edx
	.endif
	.if edx==3
		or FLAG_ALL,FLAG_INPUTCHAR
	.else
		and FLAG_ALL,not FLAG_INPUTCHAR
	.endif
	;PrintHex g_LastVisible
	.if eax>=dwFileSize || eax>g_LastVisible
		mov eax,dwCurPos;dwFileSize
		mov dh,1
	.endif
	ret
_Point2Pos endp
;-------------------------------------------------------------------------------
;显示错误提示
_ShowError proc uses ebx
local err_code,lang_ID,@szBuf[512]:BYTE 
	invoke GetLastError
	mov err_code,eax
	lea ebx,@szBuf
	invoke GetSystemDefaultLangID
	invoke FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM,0,err_code,eax,ebx,512,0
	invoke MessageBox,hWnd,ebx,0,MB_ICONSTOP
	xor eax,eax
	ret
_ShowError endp
;---------------------------------------------
;是否被修改
_GetModify proc
	.if (FLAG_ALL & FLAG_FILECHANGE) && (dwFileType != FILE_MAP)
		invoke MessageBox,hWnd,addr szModified,addr szWindowName,MB_YESNOCANCEL or 20h
		push eax
		.if eax==IDYES 
			invoke SendMessage,hWnd,WM_COMMAND ,IDM_FILE_SAVE,0
		.endif
	.else
		push IDNO
	.endif
	pop eax
	ret
_GetModify endp
;-----------------------------------------------
;重画
_ReDraw proc uses eax
local rc:RECT 
	invoke GetWindowRect,hWnd,addr rc
	add rc.top,HEX_TOP+TOP_CELL
	sub rc.bottom,STATUSBAR_HEIGHT
	invoke InvalidateRect,hWnd,addr rc,0
	ret
_ReDraw	endp

END START


⌨️ 快捷键说明

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