;
; verinfex – макрос для вставки информации о версии на любом языке.
; Подходит для создания любых исполняемых файлов ОС Windows.
;
; Copyright © 2021 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять её и/или
; изменять её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она может быть полезна,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <http://www.gnu.org/licenses/>.
;
macro versioninfoex vilabel, fileos, filetype, filesubtype, lang, cp, [namevalue] {
common
local vidata
local visize
local invalue
local insize
local version
local count
local shift
local char
local filever
local prodver
local isname
local isfilever
local isprodver
local sfidata
local sfisize
local strdata
local strsize
local vsdata
local vldata
local vfidata
local vfisize
local vardata
local varsize
vilabel:
dd rva vidata, visize, 0, 0
vidata: dw visize, insize, 0
du "VS_VERSION_INFO", 0, 0
invalue:
dd $feef04bd, 00010000
filever = 0
prodver = 0
isname = 0
forward
if(~(namevalue eq))
if(namevalue eqtype 0)
isname = 0
else if(namevalue eqtype "")
isname = isname xor 1
end if
if(isname)
if(namevalue eq "FileVersion")
isfilever = 1
isprodver = 0
else if(namevalue eq "ProductVersion")
isfilever = 0
isprodver = 1
else
isfilever = 0
isprodver = 0
end if
else
if(isfilever | isprodver)
virtual at 0
db namevalue
count = $
version = $00
shift = $10
repeat(count)
load char from %-1
if(char = '.')
if(shift mod $20 <> 0)
shift = shift - $10
else
shift = shift + $30
end if
else
version = (version and not($ffff shl shift)) or ((version shr shift and $ffff)*10+char-'0') shl shift
end if
end repeat
end virtual
if(isfilever)
filever = version
end if
if(isprodver)
prodver = version
end if
end if
isfilever = 0
isprodver = 0
end if
end if
common
dq filever, prodver
dd 0, 0, fileos, filetype+0, filesubtype+0, 0, 0
insize = $-invalue
sfidata:
dd sfisize
du 1, "StringFileInfo", 0
strdata:
dd strsize
du 1, "040904E4", 0
count = 0
isname = 0
forward
if(~(namevalue eq))
if(namevalue eqtype 0)
isname = 0
else if(namevalue eqtype "")
isname = isname xor 1
end if
if(isname)
if(count > 0)
dw 0
store word $-vsdata at vsdata+$00
store word ($-vldata)/2 at vsdata+$02
end if
align $04
vsdata = $
dw 0, 0
du 1, namevalue, 0
align $04
vldata = $
else
if(namevalue eqtype 0)
dw namevalue
else if(namevalue eqtype "")
du namevalue
end if
end if
count = 1
end if
common
if(count > 0)
dw 0
store word $-vsdata at vsdata+$00
store word ($-vldata)/2 at vsdata+$02
end if
align $04
strsize = $-strdata
sfisize = $-sfidata
vfidata:
dd vfisize
du 1, "VarFileInfo", 0, 0
vardata:
dw varsize, 4
du 0, "Translation", 0, 0
dw lang, cp+0
varsize = $-vardata
vfisize = $-vfidata
visize = $-vidata
}