谁能把这段代码写成masm32的汇编?

nicotine 2006-04-17 04:22:36
取得文件的版本,版本取得api的那些所谓的缓冲区以及指针真的很难理解,那位能够帮帮忙?谢谢!
Function GetFileVer(filename: String; Var VerBlk: VS_FIXEDFILEINFO): boolean;
Var
InfoSize, puLen: DWord;
Pt, InfoPtr: Pointer;
Begin
InfoSize := GetFileVersionInfoSize(PChar(filename), puLen);
fillchar(VerBlk, sizeof(VS_FIXEDFILEINFO), 0);
If InfoSize > 0 Then
Begin
GetMem(Pt, InfoSize);
GetFileVersionInfo(PChar(filename), 0, InfoSize, Pt);
VerQueryValue(Pt, '\', InfoPtr, puLen);
move(InfoPtr^, VerBlk, sizeof(VS_FIXEDFILEINFO));
FreeMem(Pt);
result := true;
End
Else
result := false;
End;
...全文
156 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Source_Code 2006-04-18
  • 打赏
  • 举报
回复
.const

szRoot db '\',0
szVarInfo db '\VarFileInfo\Translation',0
szStrInfoFmt db '\StringFileInfo\%08x\',0
szArrow db ' --> ',0
szReturn db 0dh,0ah,0
szFixFileInfo db '固定版本信息属性:',0dh,0ah
db 'FileVersion: %d.%d.%d.%d',0dh,0ah
db 'ProductVersion: %d.%d.%d.%d',0dh,0ah
db 'FileOS: %08x',0dh,0ah
db 'FileType: %08x',0dh,0ah,0dh,0ah
db '字符串版本属性:',0dh,0ah,0

szStr1 db 'Comments',0
szStr2 db 'CompanyName',0
szStr3 db 'FileDescription',0
szStr4 db 'FileVersion',0
szStr5 db 'InternalName',0
szStr6 db 'LegalCopyright',0
szStr7 db 'LegalTrademarks',0
szStr8 db 'OriginalFilename',0
szStr9 db 'PrivateBuild',0
szStr10 db 'ProductName',0
szStr11 db 'ProductVersion',0
szStr12 db 'SpecialBuild',0

lpStr1 dd szStr1
lpStr2 dd szStr2
lpStr3 dd szStr3
lpStr4 dd szStr4
lpStr5 dd szStr5
lpStr6 dd szStr6
lpStr7 dd szStr7
lpStr8 dd szStr8
lpStr9 dd szStr9
lpStr10 dd szStr10
lpStr11 dd szStr11
lpStr12 dd szStr12

.code

_GetVersionInfo proc _lpFileName,_lpBuffer
local @dbVerInfo[4096]:byte
local @szStringInfo[128]:byte
local @szString[128]:byte
local @lpBuffer,@dwLen
local @dwVer1,@dwVer2,@dwVer3,@dwVer4
local @dwVer5,@dwVer6,@dwVer7,@dwVer8

pushad
invoke GetFileVersionInfoSize,_lpFileName,NULL
.if !eax
popad
xor eax,eax
ret
.endif
invoke GetFileVersionInfo,_lpFileName,NULL,sizeof @dbVerInfo,addr @dbVerInfo

invoke VerQueryValue,addr @dbVerInfo,addr szRoot,addr @lpBuffer,addr @dwLen
mov esi,@lpBuffer
assume esi:ptr VS_FIXEDFILEINFO
mov eax,[esi].dwFileVersionMS
movzx ecx,ax
mov @dwVer2,ecx
shr eax,16
mov @dwVer1,eax

mov eax,[esi].dwFileVersionLS
movzx ecx,ax
mov @dwVer4,ecx
shr eax,16
mov @dwVer3,eax

mov eax,[esi].dwProductVersionMS
movzx ecx,ax
mov @dwVer6,ecx
shr eax,16
mov @dwVer5,eax

mov eax,[esi].dwProductVersionLS
movzx ecx,ax
mov @dwVer8,ecx
shr eax,16
mov @dwVer7,eax
invoke wsprintf,_lpBuffer,addr szFixFileInfo,\
@dwVer1,@dwVer2,@dwVer3,@dwVer4,\
@dwVer5,@dwVer6,@dwVer7,@dwVer8,\
[esi].dwFileOS,[esi].dwFileType

assume esi:nothing
invoke VerQueryValue,addr @dbVerInfo,addr szVarInfo,addr @lpBuffer,addr @dwLen
mov eax,@lpBuffer
mov eax,[eax]
ror eax,16
invoke wsprintf,addr @szStringInfo,addr szStrInfoFmt,eax

mov ebx,offset lpStr1
.while ebx <= offset lpStr12
invoke lstrcpy,addr @szString,addr @szStringInfo
mov eax,[ebx]
invoke lstrcat,addr @szString,eax
mov eax,[ebx]
invoke lstrcat,_lpBuffer,eax
invoke lstrcat,_lpBuffer,addr szArrow
invoke VerQueryValue,addr @dbVerInfo,addr @szString,addr @lpBuffer,addr @dwLen
.if eax
invoke lstrcat,_lpBuffer,@lpBuffer
.endif
invoke lstrcat,_lpBuffer,addr szReturn add ebx,4
.endw
popad
mov eax,TRUE
ret

_GetVersionInfo endp
和你那个不全一样。.但是可以取文件版本!
langziji 2006-04-18
  • 打赏
  • 举报
回复
楼主,我学习来的.帮UP

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧