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

📄 parserc.asm

📁 汇编资源编辑器
💻 ASM
📖 第 1 页 / 共 4 页
字号:
				or		[edi].MNUITEM.shortcut,200h
				jmp		NxtKey
			.elseif dword ptr [ebx]=='+tlA'
				add		ebx,4
				or		[edi].MNUITEM.shortcut,400h
				jmp		NxtKey
			.elseif word ptr [ebx]>='A' && word ptr [ebx]<='Z'
				movzx	eax,byte ptr [ebx]
				or		[edi].MNUITEM.shortcut,eax
			.elseif byte ptr [ebx]=='F'
				invoke ResEdDecToBin,addr [ebx+1]
				add		eax,6Fh
				or		[edi].MNUITEM.shortcut,eax
			.endif
			pop		ebx
			.if eax
				mov		byte ptr [ebx],0
			.else
				mov		[edi].MNUITEM.shortcut,eax
			.endif
		.endif
		invoke lstrcpy,addr [edi].MNUITEM.itemcaption,offset wordbuff
		.if byte ptr [esi] && byte ptr [esi]!=0Dh
			invoke GetWord,offset wordbuff,esi
			mov		ecx,eax
			invoke IsBegin,offset wordbuff
			or		eax,eax
			jz		NxtBegin
			invoke IsEnd,offset wordbuff
			or		eax,eax
			jz		NxtEnd
			add		esi,ecx
			;Name / ID
			invoke GetName,lpProMem,offset wordbuff,addr [edi].MNUITEM.itemname,addr [edi].MNUITEM.itemid
			Call	SetOptions
		.endif
	  NxtBegin:
		add		edi,sizeof MNUITEM
		jmp		@b
	.endif
  NxtEnd:
	invoke lstrcmpi,offset wordbuff,offset szEND
	.if eax
		invoke lstrcmpi,offset wordbuff,offset szENDSHORT
	.endif
	.if !eax
		dec		nNest
		je		Ex
		jmp		@b
	.endif
  Ex:
	mov		eax,esi
	sub		eax,lpRCMem
	ret

SetOptions:
	.if byte ptr [esi] && byte ptr [esi]!=0Dh
		;Type
		invoke GetStyle,esi,offset menutypedef
		test	edx,MFT_SEPARATOR
		.if !ZERO?
			xor		edx,MFT_SEPARATOR
			mov		word ptr [edi].MNUITEM.itemcaption,'-'
		.endif
		mov		[edi].MNUITEM.ntype,edx
		add		esi,eax
	.endif
	.if byte ptr [esi] && byte ptr [esi]!=0Dh
		;State
		invoke GetStyle,esi,offset menustatedef
		mov		[edi].MNUITEM.nstate,edx
		add		esi,eax
	.endif
	.if byte ptr [esi] && byte ptr [esi]!=0Dh
		;HelpID
		invoke GetNum,lpProMem
	.endif
	retn

ParseMenuEx endp

ParseAccelerators proc uses ebx esi edi,lpRCMem:DWORD,lpProMem:DWORD

	invoke AddTypeMem,lpProMem,64*1024,TPE_ACCEL
	mov		edi,eax
	;Name / ID
	invoke GetName,lpProMem,offset namebuff,addr [edi].ACCELMEM.szname,addr [edi].ACCELMEM.value
	add		edi,sizeof ACCELMEM
	mov		esi,lpRCMem
	invoke GetLoadOptions,esi
	add		esi,eax
  @@:
	invoke GetWord,offset wordbuff,esi
	add		esi,eax
	mov		ebx,eax
	invoke lstrcmpi,offset wordbuff,offset szCHARACTERISTICS
	.if !eax
		invoke GetNum,lpProMem
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szVERSION
	.if !eax
		invoke GetNum,lpProMem
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szLANGUAGE
	.if !eax
		invoke GetWord,offset wordbuff,esi
		add		esi,eax
		invoke GetWord,offset wordbuff,esi
		add		esi,eax
		jmp		@b
	.endif
	sub		esi,ebx
	invoke GetWord,offset wordbuff,esi
	add		esi,eax
	invoke lstrcmpi,offset wordbuff,offset szBEGIN
	.if eax
		invoke lstrcmpi,offset wordbuff,offset szBEGINSHORT
	.endif
	.if !eax
	  Nxt:
		invoke GetWord,offset wordbuff,esi
		add		esi,eax
		invoke lstrcmpi,offset wordbuff,offset szEND
		.if eax
			invoke lstrcmpi,offset wordbuff,offset szENDSHORT
		.endif
		.if eax
			mov		eax,dword ptr wordbuff
			and		eax,0FFFFFFh
			.if al=='"'
				invoke UnQuoteWord,offset wordbuff
				movzx	eax,wordbuff
			.elseif ax=='x0'
				invoke HexToBin,offset wordbuff+2
			.elseif al>='0' && al<='9'
				invoke ResEdDecToBin,offset wordbuff
			.elseif eax=='_KV'
				push	esi
				mov		esi,offset szAclKeys
				.while byte ptr [esi]
					lea		eax,[esi+1]
					invoke lstrcmp,offset wordbuff+3,eax
					.if !eax
						movzx	eax,byte ptr [esi]
						jmp		@f
					.endif
					invoke lstrlen,esi
					lea		esi,[esi+eax+1]
				.endw
				mov		eax,41h
			  @@:
				pop		esi
			.else
				mov		eax,41h
			.endif
			mov		ebx,eax
			push	esi
			push	edi
			xor		edi,edi
			mov		esi,offset szAclKeys
			.while byte ptr [esi]
				.break .if bl==byte ptr [esi]
				invoke lstrlen,esi
				inc		edi
				lea		esi,[esi+eax+1]
			.endw
			mov		eax,edi
			pop		edi
			pop		esi
			mov		[edi].ACCELMEM.nkey,eax
			invoke GetWord,offset wordbuff,esi
			add		esi,eax
			invoke GetName,lpProMem,offset wordbuff,addr [edi].ACCELMEM.szname,addr [edi].ACCELMEM.value
			xor		ebx,ebx
			.while byte ptr [esi]!=0Dh
				invoke GetWord,offset wordbuff,esi
				add		esi,eax
				invoke lstrcmpi,offset wordbuff,offset szVIRTKEY
				.if !eax
					jmp		@f
				.endif
				invoke lstrcmpi,offset wordbuff,offset szNOINVERT
				.if !eax
					jmp		@f
				.endif
				invoke lstrcmpi,offset wordbuff,offset szCONTROL
				.if !eax
					or		ebx,1
					jmp		@f
				.endif
				invoke lstrcmpi,offset wordbuff,offset szSHIFT
				.if !eax
					or		ebx,2
					jmp		@f
				.endif
				invoke lstrcmpi,offset wordbuff,offset szALT
				.if !eax
					or		ebx,4
				.endif
			  @@:
			.endw
			mov		[edi].ACCELMEM.flag,ebx
			add		edi,sizeof ACCELMEM
			jmp		Nxt
		.endif
	.endif
	mov		eax,esi
	sub		eax,lpRCMem
	ret

ParseAccelerators endp

ParseVersioninfo proc uses ebx esi edi,lpRCMem:DWORD,lpProMem:DWORD
	LOCAL	nNest:DWORD

	invoke AddTypeMem,lpProMem,64*1024,TPE_VERSION
	mov		edi,eax
	;Name / ID
	invoke GetName,lpProMem,offset namebuff,addr [edi].VERSIONMEM.szname,addr [edi].VERSIONMEM.value
	mov		esi,lpRCMem
	invoke GetLoadOptions,esi
	add		esi,eax
  @@:
	invoke GetWord,offset wordbuff,esi
	add		esi,eax
	invoke lstrcmpi,offset wordbuff,offset szFILEVERSION
	.if !eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.fv[0],eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.fv[4],eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.fv[8],eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.fv[12],eax
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szPRODUCTVERSION
	.if !eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.pv[0],eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.pv[4],eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.pv[8],eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.pv[12],eax
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szFILEFLAGSMASK
	.if !eax
		invoke GetNum,lpProMem
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szFILEFLAGS
	.if !eax
		invoke GetNum,lpProMem
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szFILEOS
	.if !eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.os,eax
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szFILETYPE
	.if !eax
		invoke GetNum,lpProMem
		mov		[edi].VERSIONMEM.ft,eax
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szFILESUBTYPE
	.if !eax
		invoke GetNum,lpProMem
		jmp		@b
	.endif
	invoke lstrcmpi,offset wordbuff,offset szBEGIN
	.if !eax
		mov		ebx,edi
		add		edi,sizeof VERSIONMEM
		mov		nNest,1
	  @@:
		invoke GetWord,offset wordbuff,esi
		add		esi,eax
		invoke lstrcmpi,offset wordbuff,offset szBEGIN
		.if eax
			invoke lstrcmpi,offset wordbuff,offset szBEGINSHORT
		.endif
		.if !eax
			inc		nNest
			jmp		@b
		.endif
		invoke lstrcmpi,offset wordbuff,offset szBLOCK
		.if !eax
			invoke GetWord,offset wordbuff,esi
			add		esi,eax
			jmp		@b
		.endif
		invoke lstrcmpi,offset wordbuff,offset szVALUE
		.if !eax
			invoke GetWord,offset wordbuff,esi
			add		esi,eax
			invoke UnQuoteWord,offset wordbuff
			invoke lstrcmpi,offset wordbuff,offset szTranslation
			.if !eax
				invoke GetNum,lpProMem
				mov		[ebx].VERSIONMEM.lng,eax
				invoke GetNum,lpProMem
				mov		[ebx].VERSIONMEM.chs,eax
			.else
				invoke lstrcpyn,addr [edi].VERSIONITEM.szname,offset wordbuff,sizeof VERSIONITEM.szname
				invoke GetWord,offset wordbuff,esi
				add		esi,eax
				invoke UnQuoteWord,offset wordbuff
				invoke lstrlen,offset wordbuff
				.if word ptr wordbuff[eax-2]=='0\'
					mov		byte ptr wordbuff[eax-2],0
				.endif
				invoke lstrcpyn,addr [edi].VERSIONITEM.szvalue,offset wordbuff,sizeof VERSIONITEM.szvalue
				add		edi,sizeof VERSIONITEM
			.endif
			jmp		@b
		.endif
		invoke lstrcmpi,offset wordbuff,offset szEND
		.if eax
			invoke lstrcmpi,offset wordbuff,offset szENDSHORT
		.endif
		.if !eax
			dec		nNest
			jne		@b
		.endif
	.endif
  Ex:
	mov		eax,esi
	sub		eax,lpRCMem
	ret

ParseVersioninfo endp

GetLineNo proc hRCMem:DWORD,lpRCMem:DWORD

	mov		edx,hRCMem
	xor		eax,eax
	.while edx<=lpRCMem
		.if byte ptr [edx]==VK_RETURN
			inc		eax
		.endif
		inc		edx
	.endw
	ret

GetLineNo endp

ParseRC proc uses esi edi,lpRCMem:DWORD,hRCMem:DWORD,lpProMem:DWORD

	mov		esi,lpRCMem
	mov		edi,lpProMem
	.while [edi].PROJECT.hmem
		add		edi,sizeof PROJECT
	.endw
	invoke GetWord,offset wordbuff,esi
	add		esi,eax
	invoke GetLineNo,hRCMem,esi
	mov		[edi].PROJECT.lnstart,eax
	invoke lstrcmpi,offset wordbuff,offset szDEFINE
	.if !eax
		invoke ParseDefine,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szINCLUDE
	.if !eax
		invoke ParseInclude,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szUNDEF
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szIF
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szELIF
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szELSE
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szENDIF
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szIFDEF
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szIFNDEF
	.if !eax
		invoke SkipToEol
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szSTRINGTABLE
	.if !eax
		invoke ParseStringTable,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcpy,offset namebuff,offset wordbuff
	invoke GetWord,offset wordbuff,esi
	add		esi,eax
	invoke lstrcmpi,offset wordbuff,offset szDESIGNINFO
	.if !eax
		invoke ParseSkip,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szBITMAP
	.if !eax
		invoke ParseResource,esi,lpProMem,0
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szCURSOR
	.if !eax
		invoke ParseResource,esi,lpProMem,1
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szICON
	.if !eax
		invoke ParseResource,esi,lpProMem,2
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szAVI
	.if !eax
		invoke ParseResource,esi,lpProMem,3
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szRCDATA
	.if !eax
		invoke ParseResource,esi,lpProMem,4
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szWAVE
	.if !eax
		invoke ParseResource,esi,lpProMem,5
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szIMAGE
	.if !eax
		invoke ParseResource,esi,lpProMem,6
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szMANIFEST
	.if !eax
		invoke ParseResource,esi,lpProMem,7
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szACCELERATORS
	.if !eax
		invoke ParseAccelerators,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szVERSIONINFO
	.if !eax
		invoke ParseVersioninfo,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szDIALOGEX
	.if !eax
		invoke ParseDialogEx,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szDIALOG
	.if !eax
		invoke ParseDialog,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szMENU
	.if !eax
		invoke ParseMenu,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
	invoke lstrcmpi,offset wordbuff,offset szMENUEX
	.if !eax
		invoke ParseMenuEx,esi,lpProMem
		add		esi,eax
		jmp		Ex
	.endif
  Ex:
	invoke GetLineNo,hRCMem,esi
	mov		[edi].PROJECT.lnend,eax
;PrintDec [edi].PROJECT.lnstart
;PrintDec [edi].PROJECT.lnend
	mov		eax,esi
	sub		eax,lpRCMem
	ret

ParseRC endp

ParseRCMem proc uses esi,hRCMem:DWORD,lpProMem:DWORD

	mov		esi,hRCMem
	.while TRUE
		invoke ParseRC,esi,hRCMem,lpProMem
		.break .if !eax
		add		esi,eax
	.endw
	mov		eax,lpProMem
	ret

ParseRCMem endp

⌨️ 快捷键说明

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