resource.inc
;
; Реализация среды исполнения языка программирования
; Объектно-ориентированный продвинутый векторный транслятор
;
; Copyright © 2021, 2024, 2026 Малик Разработчик
;
; Это свободная программа: вы можете перераспространять ее и/или изменять
; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
; в каком она была опубликована Фондом свободного программного обеспечения;
; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
;
; Эта программа распространяется в надежде, что она будет полезной,
; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
; общественной лицензии GNU.
;
; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
; вместе с этой программой. Если это не так, см.
; <https://www.gnu.org/licenses/>.
;
; <fold типы ресурсов — можно использовать как возможное значение аргумента rsrcType>
RT_ICON = 3
RT_GROUP_ICON = 14
RT_VERSION = 16
; </fold>
; <fold идентификаторы языков — можно использовать в сочетании с идентификатором разновидности языка как возможное значение аргумента lang>
LANG_NEUTRAL = $00
LANG_BULGARIAN = $02
LANG_CHINESE = $04
LANG_CROATIAN = $1a
LANG_CZECH = $05
LANG_DANISH = $06
LANG_DUTCH = $13
LANG_ENGLISH = $09
LANG_FINNISH = $0b
LANG_FRENCH = $0c
LANG_GERMAN = $07
LANG_GREEK = $08
LANG_HUNGARIAN = $0e
LANG_ICELANDIC = $0f
LANG_ITALIAN = $10
LANG_JAPANESE = $11
LANG_KOREAN = $12
LANG_NORWEGIAN = $14
LANG_POLISH = $15
LANG_PORTUGUESE = $16
LANG_ROMANIAN = $18
LANG_RUSSIAN = $19
LANG_SLOVAK = $1b
LANG_SLOVENIAN = $24
LANG_SPANISH = $0a
LANG_SWEDISH = $1d
LANG_THAI = $1e
LANG_TURKISH = $1f
; </fold>
; <fold идентификаторы разновидностей языков — можно использовать в сочетании с идентификатором языка как возможное значение аргумента lang>
SUBLANG_NEUTRAL = $00 shl $0a
SUBLANG_DEFAULT = $01 shl $0a
SUBLANG_SYS_DEFAULT = $02 shl $0a
SUBLANG_CHINESE_TRADITIONAL = $01 shl $0a
SUBLANG_CHINESE_SIMPLIFIED = $02 shl $0a
SUBLANG_CHINESE_HONGKONG = $03 shl $0a
SUBLANG_CHINESE_SINGAPORE = $04 shl $0a
SUBLANG_DUTCH = $01 shl $0a
SUBLANG_DUTCH_BELGIAN = $02 shl $0a
SUBLANG_ENGLISH_US = $01 shl $0a
SUBLANG_ENGLISH_UK = $02 shl $0a
SUBLANG_ENGLISH_AUS = $03 shl $0a
SUBLANG_ENGLISH_CAN = $04 shl $0a
SUBLANG_ENGLISH_NZ = $05 shl $0a
SUBLANG_ENGLISH_EIRE = $06 shl $0a
SUBLANG_FRENCH = $01 shl $0a
SUBLANG_FRENCH_BELGIAN = $02 shl $0a
SUBLANG_FRENCH_CANADIAN = $03 shl $0a
SUBLANG_FRENCH_SWISS = $04 shl $0a
SUBLANG_GERMAN = $01 shl $0a
SUBLANG_GERMAN_SWISS = $02 shl $0a
SUBLANG_GERMAN_AUSTRIAN = $03 shl $0a
SUBLANG_ITALIAN = $01 shl $0a
SUBLANG_ITALIAN_SWISS = $02 shl $0a
SUBLANG_NORWEGIAN_BOKMAL = $01 shl $0a
SUBLANG_NORWEGIAN_NYNORSK = $02 shl $0a
SUBLANG_PORTUGUESE = $02 shl $0a
SUBLANG_PORTUGUESE_BRAZILIAN = $01 shl $0a
SUBLANG_SPANISH = $01 shl $0a
SUBLANG_SPANISH_MEXICAN = $02 shl $0a
SUBLANG_SPANISH_MODERN = $03 shl $0a
; </fold>
; <fold макросы для вставки иконок в приложение — в соответствии со спецификацией формата исполняемого модуля>
macro pedirectory rootLabel*, [rsrcType, subdirLabel] {
common
local max
local count
max = 0
count = 0
forward
count = count+1
if((rsrcType) > max)
max = rsrcType
end if
common
dd $00000000
dd %t
dd $00000000
dd count shl $10
repeat(max)
forward
if((rsrcType) = %)
dd rsrcType
dd $80000000+(subdirLabel)-(rootLabel)
end if
common
end repeat
}
macro peresource subdirLabel*, rootLabel*, [id, lang, contentLabel] {
common
local i
local j
local k
local v1
local v2
local min
local max
local count
local current
forward
min = id
max = id
common
count = 0
forward
count = count+1
if((id) < min)
min = id
else if((id) > max)
max = id
end if
common
subdirLabel:
dd $00000000
dd %t
dd $00000000
dd count shl $10
repeat(max-min+1)
current = $
forward
if((id) = min+%-1 & current = $)
dd id
dd $80000000+(contentLabel#.dir)-(rootLabel)
end if
common
end repeat
repeat(max-min+1)
current = $
forward
if((id) = min+%-1)
if(current = $)
contentLabel#.dir:
dd $00000000
dd %t
dd $00000000
dd $00010000
dd lang
dd (contentLabel)-(rootLabel)
count = 1
else
dd lang
dd (contentLabel)-(rootLabel)
count = count+1
end if
end if
contentLabel#.resid = id
common
if(count > 1)
store word count at current+$0e
i = count shr 1
while(i > 0)
j = i
while(j < count)
k = j
while(k-i >= 0)
load v1 dword from current+k*8+$10
load v2 dword from current+(k-i)*8+$10
if(v1 >= v2)
break
end if
store dword v1 at current+(k-i)*8+$10
store dword v2 at current+k*8+$10
load v1 dword from current+k*8+$14
load v2 dword from current+(k-i)*8+$14
store dword v1 at current+(k-i)*8+$14
store dword v2 at current+k*8+$14
k = k-i
end while
j = j+1
end while
i = i shr 1
end while
end if
end repeat
}
macro peicon groupLabel*, [contentLabel, fileRelaPath] {
common
local count
local header
count = 0
forward
local content
local size
local position
contentLabel:
dd rva(content)
dd size
dd $00000000
dd $00000000
virtual at 0
file fileRelaPath: $06, $10
load size dword from $08
load position dword from $0c
end virtual
content: file fileRelaPath: position, size
count = count+1
common
align_d $04
groupLabel: dd rva(header)
dd count*$0e+$06
dd $00000000
dd $00000000
header: dw $0000
dw $0001
dw count
forward
file fileRelaPath: $06, $0c
dw contentLabel#.resid
common
align_d $04
}
; </fold>
; <fold типы операционных систем — можно использовать как возможное значение аргумента fileOS>
VOS_UNKNOWN = $00000000
VOS_DOS = $00010000
VOS_OS216 = $00020000
VOS_OS232 = $00030000
VOS_NT = $00040000
VOS__BASE = $00000000
VOS__WINDOWS16 = $00000001
VOS__PM16 = $00000002
VOS__PM32 = $00000003
VOS__WINDOWS32 = $00000004
VOS_DOS_WINDOWS16 = $00010001
VOS_DOS_WINDOWS32 = $00010004
VOS_OS216_PM16 = $00020002
VOS_OS232_PM32 = $00030003
VOS_NT_WINDOWS32 = $00040004
; </fold>
; <fold типы исполняемых файлов — можно использовать как возможное значение аргумента fileType>
VFT_UNKNOWN = $00000000
VFT_APP = $00000001
VFT_DLL = $00000002
VFT_DRV = $00000003
VFT_FONT = $00000004
VFT_VXD = $00000005
VFT_STATIC_LIB = $00000007
; </fold>
; <fold подтипы исполняемых файлов — можно использовать как возможное значение аргумента fileSubtype>
VFT2_UNKNOWN = $00000000
VFT2_DRV_PRINTER = $00000001
VFT2_DRV_KEYBOARD = $00000002
VFT2_DRV_LANGUAGE = $00000003
VFT2_DRV_DISPLAY = $00000004
VFT2_DRV_MOUSE = $00000005
VFT2_DRV_NETWORK = $00000006
VFT2_DRV_SYSTEM = $00000007
VFT2_DRV_INSTALLABLE = $00000008
VFT2_DRV_SOUND = $00000009
VFT2_DRV_COMM = $0000000a
VFT2_DRV_INPUTMETHOD = $0000000b
VFT2_DRV_VERSIONED_PRINTER = $0000000c
VFT2_FONT_RASTER = $00000001
VFT2_FONT_VECTOR = $00000002
VFT2_FONT_TRUETYPE = $00000003
; </fold>
; <fold управляющие сигналы консоли — можно использовать как возможное значение аргумента ctrl>
CTRL_C_EVENT = 0
CTRL_BREAK_EVENT = 1
CTRL_CLOSE_EVENT = 2
CTRL_LOGOFF_EVENT = 5
CTRL_SHUTDOWN_EVENT = 6
; </fold>
; <fold макрос для вставки расширенной, с поддержкой уникода, информации о версии программного обеспечения — в соответствии со спецификацией формата исполняемого модуля>
macro peverinfoex contentLabel, fileOS, fileType, fileSubtype, lang, ctrl, [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 lvsdata
local lvldata
local sfidata
local sfisize
local strdata
local strsize
local vfidata
local vfisize
local vardata
local varsize
contentLabel:
dd rva(vidata)
dd visize
dd $00000000
dd $00000000
vidata: dw visize
dw insize
dw $0000
du "VS_VERSION_INFO"
du $0000
du $0000
invalue: dd $feef04bd
dd $00010000
filever = 0
prodver = 0
isname = 0
forward
local vsdata
local vldata
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)*$0a+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
dq prodver
dd $00000000
dd $00000000
dd fileOS
dd fileType
dd fileSubtype
dd $00000000
dd $00000000
insize = $-invalue
sfidata: dd sfisize
du $0001
du "StringFileInfo"
du $0000
strdata: dd strsize
du $0001
du "040904E4"
du $0000
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 $0000
store word $-lvsdata at lvsdata+$00
store word ($-lvldata)/2 at lvsdata+$02
end if
align_d $04
vsdata: dw $0000
dw $0000
du $0001
du namevalue
du $0000
align_d $04
vldata: lvsdata = vsdata
lvldata = vldata
count = 1
else
if(namevalue eqtype 0)
dw namevalue
else if(namevalue eqtype "")
du namevalue
end if
end if
end if
common
if(count > 0)
dw $0000
store word $-lvsdata at lvsdata+$00
store word ($-lvldata)/2 at lvsdata+$02
end if
align_d $04
strsize = $-strdata
sfisize = $-sfidata
vfidata: dd vfisize
du $0001
du "VarFileInfo"
du $0000
du $0000
vardata: dw varsize
dw $0004
du $0000
du "Translation"
du $0000
du $0000
dw lang
dw ctrl
varsize = $-vardata
vfisize = $-vfidata
visize = $-vidata
}
; </fold>