diff --git a/conf/CMakeLists.txt b/conf/CMakeLists.txt index dc3ff9d..0d90d85 100644 --- a/conf/CMakeLists.txt +++ b/conf/CMakeLists.txt @@ -4,7 +4,7 @@ set(OUTPUT_CONFS ad.json anongame_infos.conf address_translation.conf bnissue.txt bnmaps.conf bnxpcalc.conf bnxplevel.conf channel.conf command_groups.conf realm.conf sql_DB_layout.conf supportfile.conf topics.conf - tournament.conf versioncheck.conf icons.conf) + tournament.conf versioncheck.json icons.conf) foreach(CONF ${OUTPUT_CONFS}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${CONF}.in ${CMAKE_CURRENT_BINARY_DIR}/${CONF} @ONLY) endforeach(CONF) @@ -20,7 +20,7 @@ if(WITH_BNETD) bnetd_default_user.plain bnissue.txt bnmaps.conf bnxpcalc.conf bnxplevel.conf channel.conf command_groups.conf realm.conf sql_DB_layout.conf supportfile.conf topics.conf - tournament.conf versioncheck.conf icons.conf) + tournament.conf versioncheck.json icons.conf) # special treatment for non .in files install(FILES bnetd_default_user.cdb DESTINATION ${SYSCONFDIR}) diff --git a/conf/bnetd.conf.in b/conf/bnetd.conf.in index 0615ce5..f8cfb5c 100644 --- a/conf/bnetd.conf.in +++ b/conf/bnetd.conf.in @@ -85,7 +85,7 @@ mpqfile = "${SYSCONFDIR}/autoupdate.conf" logfile = "${LOCALSTATEDIR}/bnetd.log" realmfile = "${SYSCONFDIR}/realm.conf" maildir = "${LOCALSTATEDIR}/bnmail" -versioncheck_file = "${SYSCONFDIR}/versioncheck.conf" +versioncheck_file = "${SYSCONFDIR}/versioncheck.json" mapsfile = "${SYSCONFDIR}/bnmaps.conf" xplevelfile = "${SYSCONFDIR}/bnxplevel.conf" xpcalcfile = "${SYSCONFDIR}/bnxpcalc.conf" @@ -232,18 +232,10 @@ allow_bad_version = true # is a good idea. allow_unknown_version = true -# This defines how the exeinfo field in the versioncheck file is being -# checked. You can choose between no match at all [none] (default), -# exact match [exact], exact case-sensitive match [exactcase], dumb wildcard -# match [wildcard], and parsed value comparison [parse]. -# NOTE: [parse] needs the mktime() function and might therefore not work on -# every system. -version_exeinfo_match = none - -# If you have choosen [parse] above, this is the tolerance with which -# the time can differ. The value must be given in seconds. If it's 0 this -# check is disabled. -version_exeinfo_maxdiff = 0 +# Globally enable or disable versioncheck exeinfo matching +# If set to false, a client can pass any exeinfo string to pvpgn +# and will be allowed to connect. +version_exeinfo_match = true # # ############################################################################## @@ -448,7 +440,7 @@ max_friends = 20 # Set track=0 to disable tracking. Any other number will set number # of seconds between sending tracking packets. This is ON by default. #track = 0 -track = 60 +track = 0 # Tracking server(s) # Use a comma delimited list of hostnames with optional UDP port numbers diff --git a/conf/bnetd.conf.win32 b/conf/bnetd.conf.win32 index a2a0cc0..d0ae4fa 100644 --- a/conf/bnetd.conf.win32 +++ b/conf/bnetd.conf.win32 @@ -68,7 +68,7 @@ transfile = conf\address_translation.conf mpqfile = conf\autoupdate.conf logfile = var\bnetd.log realmfile = conf\realm.conf -versioncheck_file = conf\versioncheck.conf +versioncheck_file = conf\versioncheck.json mapsfile = conf\bnmaps.conf xplevelfile = conf\bnxplevel.conf xpcalcfile = conf\bnxpcalc.conf diff --git a/conf/versioncheck.conf.in b/conf/versioncheck.conf.in deleted file mode 100644 index 8907d9d..0000000 --- a/conf/versioncheck.conf.in +++ /dev/null @@ -1,2447 +0,0 @@ -############################################################################## -# versioncheck.conf - Version Check Configuration # -#----------------------------------------------------------------------------# -# # -# This file is used to verify that clients are the same version they claim # -# to be and to tag certain versions for autoupgrades (see autoupdate.conf). # -# # -# Every combination of archtag/clienttag/version/equation/mpqfile needs to # -# be listed seperately. Each combination has a unique checksum. # -# # -# If the exeinfo field is "NULL" then the string comparison will be disabled # -# for that entry. If the checksum field is 0 then the checksum verification # -# is disabled for that entry. If the versionid is 0 then the verification # -# of versionid is disabled for that entry The versiontag is optional. # -# It is used to identify a particular version even when the version number # -# is identical to another (e.g. 109c and 109d are both version 1.0.9.0). # -# These tags can be used in the autoupdate file allowing it to know the # -# difference because of the different checksums. # -# # -# Multiple matching: # -# exeinfo = NULL will match all client exeinfos # -# exeinfo = "war3.exe ??/??/?? ??:??:?? 1568211" will match war3.exe with # -# filesize 1568211 but won't care about the file's date/time # -# versionid = 0x0 will match all client versionids # -# gameversion = 0.0.0.0 will match all client's versions # -# checksum = 0x0 will match all client checksums # -# # -# Note: if you use multiple equations/mpqfiles be sure to put entries with # -# corresponding checksum for each archtag/clienttag # -# # -# versioncheck entries work like a firewall chains, bnetd will match the # -# first entry, then is safe to use entries in descending order, so if we # -# found a badversion, it will be tagged with the tag of entry with the lower # -# version. Last line can be used to match all version unmatched so far # -# # -# Do not include "/" in any of the filenames. # -# # -# The version number can be in two forms. If it does not contain a period # -# then 123 is assumed to mean 1.2.3.0. Otherwise it may contain up to three # -# periods. If fewer than four parts are present, the latter ones will be # -# assumed to be zero. For example, 1.8 would be interpreted as 1.8.0.0. # -# Sections will overflow if they are greater than 255. # -# # -# Typically Blizzard will add a 1 in the fourth position to signify an # -# expansion pack and 10 to signify "b" versions. So Brood War 1.08b would # -# have a version of 1.0.8.11. # -# # -# ---------------------------equation--------------------------- \ # -# ---mpqfile---- \ # -# archtag \ # -# clienttag \ # -# ----------------exeinfo----------------- \ # -# versionid- \ # -# --verstr-- \ # -# -checksum- \ # -# -versiontag- # -# # -############################################################################## - -##### Intel (IX86) ########################################################### - -# -=-=-=-=-=-=- Latest Versions -=-=-=-=-=-=- No Update Required -=-=-=-=-=-=- - -# Warcraft III - TFT (Expansion) 1.28.5. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "Warcraft III.exe 07/07/17 20:15:59 562152" \ - 0x0000001c \ - 1.28.5.0 \ - 0x60743fc9 \ - W3XP_1285 - -# Warcraft III - ROC 1.28.5. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "Warcraft III.exe 07/07/17 20:15:59 562152" \ - 0x0000001c \ - 1.28.5.0 \ - 0x60743fc9 \ - WAR3_1285 - -# Diablo II - LoD (Expansion) 1.14d -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - ver-IX86-1.mpq \ - IX86 \ - D2XP \ - "Game.exe 05/31/16 19:02:24 3618792" \ - 0x0000000e \ - 1.14.3.0 \ - 0x43f51a83 \ - D2XP_114D - -# Diablo II 1.14d -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - ver-IX86-1.mpq \ - IX86 \ - D2DV \ - "Game.exe 05/31/16 19:02:32 3614696" \ - 0x0000000e \ - 1.14.3.0 \ - 0x6b6a21b5 \ - D2DV_114D - -# Starcraft - Broodwar (Expansion) 1.16.1 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "StarCraft.exe 01/09/09 22:57:43 1220608" \ - 0x000000d3 \ - 1.16.1.1 \ - 0x0a85372d \ - SEXP_1161 - -# Starcraft - Broodwar (Expansion) 1.16.1 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 01/09/09 22:57:43 1220608" \ - 0x000000d3 \ - 1.16.1.1 \ - 0x0a85372d \ - STAR_1161 - -# Starcraft (Standalone) 1.16.1 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 01/08/09 05:23:44 1220608" \ - 0x000000d3 \ - 1.16.1.0 \ - 0x02623d85 \ - STAR_1161 - -# Starcraft - Broodwar (Expansion) 1.16.1 - (Broodwar mode) - MAC - "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "XMACver1.mpq" \ - XMAC \ - SEXP \ - "Starcraft (Carbon) 100/50/58 100:50:46 1402780" \ - 0x000000d3 \ - 0x010a6425 \ - 0xd6802c9e \ - SEXP_1161 - -# -=-=-=-=-=- Older Versions -=-=-=-=-=-=- Update Required -=-=-=-=-=- - -# =================== WarCraft 3 Expansion Entries ================== - -# Warcraft III - TFT (Expansion) 1.28.4. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "Warcraft III.exe 06/21/17 16:24:03 561128" \ - 0x0000001c \ - 1.28.4.184 \ - 0xce7bb7ee \ - W3XP_1284 - -# Warcraft III - TFT (Expansion) 1.28.2. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "War3.exe 05/20/17 13:25:29 558568" \ - 0x0000001c \ - 1.28.2.227 \ - 0x2dc96bf5 \ - W3XP_1282 - -# Warcraft III - TFT (Expansion) 1.28.1. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "War3.exe 04/28/17 19:10:24 558568" \ - 0x0000001c \ - 1.28.1.197 \ - 0x1fbde0fd \ - W3XP_1281 - -# Warcraft III - TFT (Expansion) 1.28. -"A=4159479319 C=1286227868 B=2524979557 4 A=A+S B=B^C C=C+A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "War3.exe 04/17/17 12:06:57 536040" \ - 0x0000001c \ - 1.28.0.37 \ - 0xe00c3096 \ - W3XP_128 - -# Warcraft III - TFT (Expansion) 1.27b -"B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "War3.exe 12/09/16 06:05:09 515048" \ - 0x0000001b \ - 1.27.1.173 \ - 0x4026b5b0 \ - W3XP_127B - -# Warcraft III - TFT (Expansion) 1.27a -# Note: this version check is sent in both FT and ROC mode -"B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "War3.exe 08/05/16 03:15:27 514536" \ - 0x0000001b \ - 1.27.0.16 \ - 0x960947fd \ - W3XP_127A - -# Warcraft III - TFT (Expansion) 1.26a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 03/18/11 20:03:55 471040" \ - 0x0000001a \ - 1.26.0.1 \ - 0xf2e7cec2 \ - W3XP_126A - -# Warcraft III - TFT (Expansion) 1.25b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 02/12/11 03:32:48 471040" \ - 0x00000019 \ - 1.25.1.253 \ - 0x41a8664c \ - W3XP_125B - -# Warcraft III - TFT (Expansion) 1.24e -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 02/26/10 20:41:08 471040" \ - 0x00000018 \ - 1.24.4.243 \ - 0xde4443c5 \ - W3XP_124E - -# Warcraft III - TFT (Expansion) 1.24d -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 01/13/10 00:35:02 471040" \ - 0x00000018 \ - 1.24.3.240 \ - 0x2a7b4a96 \ - W3XP_124D - -# Warcraft III - TFT (Expansion) 1.24c -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 10/21/09 19:14:23 471040" \ - 0x00000018 \ - 1.24.2.234 \ - 0x307c4598 \ - W3XP_124C - -# Warcraft III - TFT (Expansion) 1.24b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 08/07/09 19:20:53 471040" \ - 0x00000018 \ - 1.24.1.230 \ - 0xcaa59e30 \ - W3XP_124B - -# Warcraft III - TFT (Expansion) 1.24a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 07/23/09 20:15:12 471040" \ - 0x00000018 \ - 1.24.0.228 \ - 0xf3c22f0b \ - W3XP_124A - -# Warcraft III - TFT (Expansion) 1.23a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 03/12/09 23:23:40 471040" \ - 0x00000017 \ - 1.23.0.208 \ - 0xfad9bc05 \ - W3XP_123A - -# Warcraft III - TFT (Expansion) 1.22a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 06/27/08 00:01:35 471040" \ - 0x00000016 \ - 1.22.0.184 \ - 0x909998db \ - W3XP_122A - -# Warcraft III - TFT (Expansion) 1.21b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 07/19/07 18:41:12 409660" \ - 0x00000015 \ - 1.21.1.156 \ - 0x1b735294 \ - W3XP_121B - -# Warcraft III - TFT (Expansion) 1.21a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 12/28/06 20:35:21 1572307" \ - 0x00000015 \ - 1.21.0.119 \ - 0xab35b5f1 \ - W3XP_121A - -# Warcraft III - TFT (Expansion) 1.20e -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 06/13/06 06:13:05 1572307" \ - 0x00000014 \ - 1.20.4.186 \ - 0x8771b225 \ - W3XP_120E - -# Warcraft III - TFT (Expansion) 1.20d -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 04/06/06 00:19:58 1572307" \ - 0x00000014 \ - 1.20.3.182 \ - 0xbbd3e672 \ - W3XP_120D - -# Warcraft III - TFT (Expansion) 1.20c -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 01/05/06 02:50:54 1572307" \ - 0x00000014 \ - 1.20.2.177 \ - 0x97c8e59b \ - W3XP_120C - -# Warcraft III - TFT (Expansion) 1.20b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 12/07/05 23:59:26 1572307" \ - 0x00000014 \ - 1.0.20.168 \ - 0x57e714c1 \ - W3XP_120B - -# Warcraft III - TFT (Expansion) 1.20a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 09/23/05 03:16:24 1572307" \ - 0x00000014 \ - 1.0.20.160 \ - 0xdfe00da5 \ - W3XP_120A - -# Warcraft III - TFT (Expansion) 1.19b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 09/20/05 04:03:24 1572307" \ - 0x00000013 \ - 1.0.19.158 \ - 0x9c73744d \ - W3XP_119B - -# Warcraft III - TFT (Expansion) 1.19a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 09/07/05 18:58:53 1572307" \ - 0x00000013 \ - 1.0.19.153 \ - 0x892fa500 \ - W3XP_119A - -# Warcraft III - TFT (Expansion) 1.18a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 02/18/05 04:38:43 1572307" \ - 0x00000012 \ - 1.0.18.142 \ - 0x087fb830 \ - W3XP_118A - -# Warcraft III - TFT (Expansion) 1.17a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 09/15/04 22:42:18 1568211" \ - 0x00000011 \ - 1.0.17.100 \ - 0xd1d89b0e \ - W3XP_117A - -# Warcraft III - TFT (Expansion) 1.16a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 06/28/04 23:37:02 1568211" \ - 0x00000010 \ - 1.0.16.38 \ - 0xcc882269 \ - W3XP_116A - -# Warcraft III - TFT (Expansion) 1.15a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 05/04/04 01:18:12 1568211" \ - 0x0000000f \ - 1.0.15.156 \ - 0x39b3974b \ - W3XP_115A - -# Warcraft III - TFT (Expansion) 1.14b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 01/09/04 06:11:44 1568211" \ - 0x0000000e \ - 1.0.14.152 \ - 0x36fd6e73 \ - W3XP_114B - -# Warcraft III - TFT (Expansion) 1.14a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 01/06/04 03:44:50 1568211" \ - 0x0000000e \ - 1.0.14.151 \ - 0xa842edef \ - W3XP_114A - -# Warcraft III - TFT (Expansion) 1.13b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "War3.exe 12/18/03 00:53:06 1568211" \ - 0x0000000d \ - 1.0.13.149 \ - 0x0bb5600d \ - W3XP_113B - -# Warcraft III - TFT (Expansion) 1.13a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 12/10/03 23:42:46 2150400" \ - 0x0000000d \ - 1.0.13.149 \ - 0xaf284a18 \ - W3XP_113A - -# Warcraft III - TFT (Expansion) 1.12a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 07/22/03 22:43:15 1568211" \ - 0x0000000c \ - 1.0.12.148 \ - 0xa9c022bd \ - W3XP_112A - -# Warcraft III - TFT (Expansion) 1.11a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 07/01/03 18:22:52 1568211" \ - 0x0000000b \ - 1.0.11.147 \ - 0x5fce4f04 \ - W3XP_111A - -# Warcraft III - TFT (Expansion) 1.10a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - "war3.exe 06/17/03 16:37:46 1568211" \ - 0x0000000a \ - 1.0.10.146 \ - 0x75d1c16f \ - W3XP_110A - -# Warcraft III - TFT (Expansion) 1.07a -# Note: this version check is sent in both FT and ROC mode -# exeinfo is NULL here because it's the date of install -# but that's ok because we have the checksum -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W3XP \ - NULL \ - 0x00000007 \ - 1.0.7.142 \ - 0xde80b55b \ - W3XP_107A - -# ====================== WarCraft 3 Entries ======================== - -# Warcraft III - ROC 1.28.4. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - W3XP \ - "Warcraft III.exe 06/21/17 16:24:03 561128" \ - 0x0000001c \ - 1.28.4.184 \ - 0xce7bb7ee \ - W3XP_1284 - -# Warcraft III - ROC 1.28.2. -"A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 05/20/17 13:25:29 558568" \ - 0x0000001c \ - 1.28.2.227 \ - 0x2dc96bf5 \ - WAR3_1282 - -# Warcraft III - ROC 1.28.1. -"C=2765988015 A=1961381685 B=3183936986 4 A=A-S B=B+C C=C-A A=A^B" \ - ver-IX86-1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 04/17/17 12:06:57 536040" \ - 0x0000001c \ - 1.28.1.197 \ - 0x1fbde0fd \ - WAR3_1281 - -# Warcraft III - ROC 1.28 -"C=1210345628 B=2907417192 A=3489626739 4 A=A+S B=B+C C=C+A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 04/17/17 12:06:57 536040" \ - 0x0000001c \ - 1.28.0.37 \ - 0xe00c3096 \ - WAR3_128 - -# Warcraft III - ROC 1.27b -"B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 12/09/16 06:05:09 515048" \ - 0x0000001b \ - 1.27.1.173 \ - 0x4026b5b0 \ - WAR3_127B - -# Warcraft III - ROC 1.27a -# Note: this version check is sent in both FT and ROC mode -"B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B" \ - ver-IX86-1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 08/05/16 03:15:27 514536" \ - 0x0000001b \ - 1.27.0.16 \ - 0x960947fd \ - WAR3_127A - -# Warcraft III - ROC 1.26a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 03/18/11 20:03:55 471040" \ - 0x0000001a \ - 1.26.0.1 \ - 0xf2e7cec2 \ - WAR3_126A - -# Warcraft III - ROC 1.25b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 02/12/11 03:32:48 471040" \ - 0x00000019 \ - 1.25.1.253 \ - 0x41a8664c \ - W3XP_125B - -# Warcraft III - ROC 1.24e -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 02/26/10 20:41:08 471040" \ - 0x00000018 \ - 1.24.4.243 \ - 0xde4443c5 \ - W3XP_124E - -# Warcraft III - ROC 1.24d -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 01/13/10 00:35:02 471040" \ - 0x00000018 \ - 1.24.3.240 \ - 0x2a7b4a96 \ - WAR3_124D - -# Warcraft III - ROC 1.24c -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 10/21/09 19:14:23 471040" \ - 0x00000018 \ - 1.24.2.234 \ - 0x307c4598 \ - WAR3_124C - -# Warcraft III - ROC 1.24b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 08/07/09 19:20:53 471040" \ - 0x00000018 \ - 1.24.1.230 \ - 0xcaa59e30 \ - WAR3_124B - -# Warcraft III - ROC 1.24a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 07/23/09 20:15:12 471040" \ - 0x00000018 \ - 1.24.0.228 \ - 0xf3c22f0b \ - WAR3_124A - -# Warcraft III - ROC 1.23a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 03/12/09 23:23:40 471040" \ - 0x00000017 \ - 1.23.0.208 \ - 0xfad9bc05 \ - WAR3_123A - -# Warcraft III - ROC 1.22a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 06/27/08 00:01:35 471040" \ - 0x00000016 \ - 1.22.0.184 \ - 0x909998db \ - WAR3_122A - -# Warcraft III - ROC 1.21b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 07/19/07 18:41:12 409660" \ - 0x00000015 \ - 1.21.1.156 \ - 0x1b735294 \ - WAR3_121B - -# Warcraft III - ROC 1.21a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 12/28/06 20:35:21 1572307" \ - 0x00000015 \ - 1.21.0.119 \ - 0xab35b5f1 \ - WAR3_121A - -# Warcraft III - ROC 1.20e -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 06/13/06 06:13:05 1572307" \ - 0x00000014 \ - 1.20.4.186 \ - 0x8771b225 \ - WAR3_120E - -# Warcraft III - ROC 1.20d -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 04/06/06 00:19:58 1572307" \ - 0x00000014 \ - 1.20.3.182 \ - 0xbbd3e672 \ - WAR3_120D - -# Warcraft III - ROC 1.20c -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 01/05/06 02:50:54 1572307" \ - 0x00000014 \ - 1.20.2.177 \ - 0x97c8e59b \ - WAR3_120C - -# Warcraft III - ROC 1.20b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 12/07/05 23:59:26 1572307" \ - 0x00000014 \ - 1.0.20.168 \ - 0x57e714c1 \ - WAR3_120B - -# Warcraft III - ROC 1.20a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 09/23/05 03:16:24 1572307" \ - 0x00000014 \ - 1.0.20.160 \ - 0xdfe00da5 \ - WAR3_120A - -# Warcraft III - ROC 1.19b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 09/20/05 04:03:24 1572307" \ - 0x00000013 \ - 1.0.19.158 \ - 0x9c73744d \ - WAR3_119B - -# Warcraft III - ROC 1.19a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 09/07/05 18:58:53 1572307" \ - 0x00000013 \ - 1.0.19.153 \ - 0x892fa500 \ - WAR3_119A - -# Warcraft III - ROC 1.18a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 02/18/05 04:38:43 1572307" \ - 0x00000012 \ - 1.0.18.142 \ - 0x087fb830 \ - WAR3_118A - -# Warcraft III - ROC 1.17a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 09/15/04 22:42:18 1568211" \ - 0x00000011 \ - 1.0.17.100 \ - 0xd1d89b0e \ - WAR3_117A - -# Warcraft III - ROC 1.16a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 06/28/04 23:37:02 1568211" \ - 0x00000010 \ - 1.0.16.38 \ - 0xcc882269 \ - WAR3_116A - -# Warcraft III - ROC 1.15a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 05/04/04 01:18:12 1568211" \ - 0x0000000f \ - 1.0.15.156 \ - 0x39b3974b \ - WAR3_115A - -# Warcraft III - ROC 1.14b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 01/09/04 06:11:44 1568211" \ - 0x0000000e \ - 1.0.14.152 \ - 0x36fd6e73 \ - WAR3_114B - -# Warcraft III - ROC 1.14a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 01/06/04 03:44:50 1568211" \ - 0x0000000e \ - 1.0.14.151 \ - 0xa842edef \ - WAR3_114A - -# Warcraft III - ROC 1.13b -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "War3.exe 12/18/03 00:53:06 1568211" \ - 0x0000000d \ - 1.0.13.149 \ - 0x0bb5600d \ - WAR3_113B - -# Warcraft III - ROC 1.13a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 12/10/03 23:42:46 2150400" \ - 0x0000000d \ - 1.0.13.149 \ - 0xaf284a18 \ - WAR3_113A - -# Warcraft III - ROC 1.12a -# Note: this version check is sent in both FT and ROC mode -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 07/22/03 22:43:15 1568211" \ - 0x0000000c \ - 1.0.12.148 \ - 0xa9c022bd \ - WAR3_112A - -# Warcraft III - RoC 1.11a -#"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 07/01/03 18:22:52 1568211" \ - 0x0000000b \ - 1.0.11.147 \ - 0x5fce4f04 \ - WAR3_111A - -# Warcraft III - RoC 1.10a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 06/17/03 16:37:46 1568211" \ - 0x0000000a \ - 1.0.10.146 \ - 0x75d1c16f \ - WAR3_110A - -# Warcraft III - RoC 1.07 (Used for TFT 1.07a in RoC Mode) -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - NULL \ - 0x00000007 \ - 1.0.7.142 \ - 0xde80b55b \ - WAR3_107A - -# WarCraft III - RoC 1.06a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 05/23/03 19:50:08 1461715" \ - 0x00000006 \ - 1.0.6.0 \ - 0x302dca19 \ - WAR3_106A - -# WarCraft III - RoC 1.05a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 01/30/03 03:08:10 1170899" \ - 0x00000005 \ - 1.0.5.0 \ - 0xbe284ba9 \ - WAR3_105A - -# WarCraft III - RoC 1.04c -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 01/16/03 02:44:48 1166807" \ - 0x00000004 \ - 1.0.4.1 \ - 0x3f06d9fa \ - WAR3_104C - -# WarCraft III - RoC 1.04b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 10/31/02 17:29:22 1068499" \ - 0x00000004 \ - 1.0.3.0 \ - 0x56f4cc37 \ - WAR3_104B - -# WarCraft III - RoC 1.04a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 10/29/02 23:26:17 713495" \ - 0x00000004 \ - 1.0.3.0 \ - 0x0e529b2d \ - WAR3_104A - -# Warcraft III - RoC 1.03a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 10/08/02 20:54:49 713495" \ - 0x00000003 \ - 1.0.3.0 \ - 0xae4ac7fa \ - WAR3_103A - -# Warcraft III - RoC 1.02a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 09/06/02 02:41:02 713495" \ - 0x00000002 \ - 1.0.1.0 \ - 0xa67d9a0e \ - WAR3_102A - -# Warcraft III - RoC 1.02 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 08/12/02 18:21:15 713495" \ - 0x00000002 \ - 1.0.1.0 \ - 0x03d8be54 \ - WAR3_102 - -# Warcraft III - RoC 1.01b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 07/10/02 18:59:10 713495" \ - 0x00000001 \ - 1.0.1.1 \ - 0x062ef7dc \ - WAR3_101B - -# Warcraft III - RoC 1.01 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - "war3.exe 06/28/02 18:41:18 713495" \ - 0x00000001 \ - 1.0.1.0 \ - 0x62c2e1a2 \ - WAR3_101 - -# Warcraft III - RoC 1.00 -# exeinfo is NULL here because it's the date of install -# but that's ok because we have the checksum -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - WAR3 \ - NULL \ - 0x00000000 \ - 1.0.0.0 \ - 0xf891f129 \ - WAR3_100 - -# ====================== Diablo II LOD entries =========================== - -# Diablo II - LoD (Expansion) 1.14c -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - ver-IX86-1.mpq \ - IX86 \ - D2XP \ - "Game.exe 05/06/16 18:15:44 3586024" \ - 0x0000000e \ - 1.14.2.0 \ - 0x6123b0f2 \ - D2XP_114C - -# Diablo II - LoD (Expansion) 1.14b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - ver-IX86-1.mpq \ - IX86 \ - D2XP \ - "Game.exe 03/31/16 01:09:01 3590120" \ - 0x0000000e \ - 1.14.1.0 \ - 0x1373c295 \ - D2XP_114B - -# Diablo II - LoD (Expansion) 1.14a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - ver-IX86-1.mpq \ - IX86 \ - D2XP \ - "Game.exe 02/29/16 17:34:46 3590120" \ - 0x0000000e \ - 1.14.0.0 \ - 0xbcb5b3bb \ - D2XP_114A - -# Diablo II - LoD (Expansion) 1.13c -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 03/09/10 04:10:51 61440" \ - 0x0000000d \ - 1.0.13.0 \ - 0x7686beca \ - D2XP_113C - -# Diablo II - LoD (Expansion) 1.12a - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 05/28/08 01:44:02 61440" \ - 0x0000000c \ - 1.0.12.0 \ - 0x3d421510 \ - D2XP_112A - -# Diablo II - LoD (Expansion) 1.11b - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 08/17/05 01:12:38 2129920" \ - 0x0000000b \ - 1.0.11.0 \ - 0xbfc36199 \ - D2XP_111B - -# Diablo II - LoD (Expansion) 1.11 - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 07/26/05 23:22:13 2129920" \ - 0x0000000b \ - 1.0.11.0 \ - 0xfb0c59b2 \ - D2XP_111 - -# Diablo II - LoD (Expansion) 1.10 - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 10/13/03 08:35:30 1198857" \ - 0x0000000a \ - 1.0.10.0 \ - 0x210126ec \ - D2XP_110 - -# Diablo II - LoD (Expansion) 1.09d - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 11/30/01 04:00:17 448675" \ - 9 \ - 1.0.9.0 \ - 0xfa39efbb \ - D2XP_109D - -# Diablo II - LoD (Expansion) 1.09b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 08/31/01 22:40:56 428163" \ - 9 \ - 1.0.9.0 \ - 0x1436c138 \ - D2XP_109B - -# Diablo II - LoD (Expansion) 1.09 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 08/16/01 23:05:03 428163" \ - 9 \ - 1.0.9.0 \ - 0x15abc72d \ - D2XP_109 - -# Diablo II - LoD (Expansion) 1.08 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 06/19/01 02:24:32 428163" \ - 8 \ - 1.0.8.0 \ - 0x3a8664ff \ - D2XP_108 - -# Diablo II - LoD (Expansion) 1.07 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2XP \ - "Game.exe 01/23/02 06:39:26 424067" \ - 7 \ - 1.0.7.0 \ - 0x4f3079e6 \ - D2XP_107 - -# ==================== Diablo 2 (original) entries ===================== - -# Diablo II 1.14c -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 05/06/16 18:15:49 3581928" \ - 0x0000000e \ - 1.14.2.0 \ - 0x7d54f650 \ - D2DV_114C - -# Diablo II 1.14b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 06/13/16 02:02:21 3586024" \ - 0x0000000e \ - 1.14.1.0 \ - 0x77f3db54 \ - D2DV_114B - -# Diablo II 1.14a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - ver-IX86-1.mpq \ - IX86 \ - D2DV \ - "Game.exe 02/29/16 17:34:50 3586024" \ - 0x0000000e \ - 1.14.0.0 \ - 0xd9e9368a \ - D2DV_114A - -# Diablo II 1.13c -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 03/09/10 04:11:00 57344" \ - 0x0000000d \ - 1.0.13.0 \ - 0xfc04b9f6 \ - D2DV_113C - -# Diablo II 1.12a - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 07/05/08 17:19:40 57344" \ - 0x0000000c \ - 1.0.12.0 \ - 0x243ac143 \ - D2DV_112A - -# Diablo II 1.11b - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 08/17/05 01:11:43 2125824" \ - 0x0000000b \ - 1.0.11.0 \ - 0x602f8323 \ - D2DV_111B - -# Diablo II 1.11 - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 27/06/05 23:21:18 2125824" \ - 0x0000000b \ - 1.0.11.0 \ - 0xbdf86a85 \ - D2DV_111 - -# Diablo II 1.10 - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 10/13/03 08:34:46 1194761" \ - 0x0000000a \ - 1.0.10.0 \ - 0x3132dda6 \ - D2DV_110 - -# Diablo II 1.09d - -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 11/30/01 03:59:45 444579" \ - 9 \ - 1.0.9.0 \ - 0x41e223a3 \ - D2DV_109D - -# Diablo II 1.09b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 08/31/01 22:40:35 424067" \ - 9 \ - 1.0.9.0 \ - 0xb9cb2cb1 \ - D2DV_109B - -# Diablo II 1.09 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 08/16/01 23:04:40 424067" \ - 9 \ - 1.0.9.0 \ - 0xc43f1764 \ - D2DV_109 - -# Diablo II 1.08 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 06/19/01 02:24:04 424067" \ - 8 \ - 1.0.8.0 \ - 0x9e488d3d \ - D2DV_108 - -# Diablo II 1.06b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 05/16/01 18:55:11 419971" \ - 6 \ - 1.0.6.0 \ - 0xb2fb38b7 \ - D2DV_106B - -# Diablo II 1.06 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 04/19/01 02:05:33 419971" \ - 6 \ - 1.0.6.0 \ - 0xaa348e13 \ - D2DV_106 - -# Diablo II 1.05b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 02/01/01 21:21:16 399491" \ - 5 \ - 1.0.5.1 \ - 0x36869f98 \ - D2DV_105B - -# Diablo II 1.05 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 01/27/01 01:16:00 399491" \ - 5 \ - 1.0.5.0 \ - 0xd6dec09b \ - D2DV_105 - -# Diablo II 1.04c -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 12/23/00 18:28:04 387107" \ - 4 \ - 1.0.4.2 \ - 0xc6d40aaf \ - D2DV_104B - -# Diablo II 1.04b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 12/22/00 18:08:34 403587" \ - 4 \ - 1.0.4.1 \ - 0x3882960e \ - D2DV_104B - -# Diablo II 1.03 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 08/01/00 00:34:00 346243" \ - 3 \ - 1.0.3.0 \ - 0x0120ed90 \ - D2DV_103 - -# Diablo II 1.01 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 06/26/00 22:31:00 346243" \ - 1 \ - 1.0.0.1 \ - 0x5aef7e66 \ - D2DV_101 - -# Diablo II 1.00 (installation) -# 1.00 have 0 versionid used as a wildchar in versioncheck -# but we don't care because we have exeinfo and checksum -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - D2DV \ - "Game.exe 01/01/97 02:05:09 309379" \ - 0 \ - 1.0.0.1 \ - 0xac5e46cb \ - D2DV_100 - -# ==================== StarCraft Broodwar entries ============================ - -# Starcraft - Broodwar (Expansion) 1.16 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "StarCraft.exe 11/06/08 01:10:59 1220608" \ - 0x000000d3 \ - 1.16.0.1 \ - 0xd206c475 \ - SEXP_116 - -# Starcraft - Broodwar (Expansion) 1.16 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 11/06/08 01:10:59 1220608" \ - 0x000000d3 \ - 1.16.0.1 \ - 0xd206c475 \ - STAR_116 - -# Starcraft - Broodwar (Expansion) 1.15.3 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "StarCraft.exe 07/25/08 23:34:58 1220608" \ - 0x000000d1 \ - 1.15.3.1 \ - 0x2abff892 \ - SEXP_1153 - -# Starcraft - Broodwar (Expansion) 1.15.3 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 07/25/08 23:34:58 1220608" \ - 0x000000d1 \ - 1.15.3.1 \ - 0x2abff892 \ - STAR_1153 - -# Starcraft - Broodwar (Expansion) 1.15.2 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "StarCraft.exe 01/10/08 20:23:42 1220608" \ - 0x000000d1 \ - 1.15.2.1 \ - 0x8fbdf18d \ - SEXP_1152 - -# Starcraft - Broodwar (Expansion) 1.15.2 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 01/10/08 20:23:42 1220608" \ - 0x000000d1 \ - 1.15.2.1 \ - 0x8fbdf18d \ - STAR_1152 - -# Starcraft - Broodwar (Expansion) 1.15.1 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 07/19/07 02:30:05 1220608" \ - 0x000000d1 \ - 1.15.1.0 \ - 0x99e92077 \ - SEXP_1151 - -# Starcraft - Broodwar (Expansion) 1.15.1 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 07/19/07 02:30:05 1220608" \ - 0x000000d1 \ - 1.15.1.0 \ - 0x99e92077 \ - STAR_1151 - -# Starcraft - Broodwar (Expansion) 1.15 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 05/08/07 19:13:26 1220608" \ - 0x000000d1 \ - 1.15.0.1 \ - 0x1eec4ebc \ - SEXP_115 - -# Starcraft - Broodwar (Expansion) 1.15 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/08/07 19:13:26 1220608" \ - 0x000000d1 \ - 1.15.0.1 \ - 0x1eec4ebc \ - STAR_115 - -# Starcraft Broodwar (Expansion) 1.14 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 05/10/06 00:13:58 1216512" \ - 0x000000cf \ - 1.14.0.1 \ - 0xf5280a9e \ - SEXP_114 - -# Starcraft - Broodwar (Expansion) 1.14 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/10/06 00:13:58 1216512" \ - 0x000000cf \ - 1.14.0.1 \ - 0xf5280a9e \ - STAR_114 - -# Starcraft - Broodwar (Expansion) 1.13f - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 01/13/06 05:42:48 1146939" \ - 0x000000cd \ - 1.1.3.11 \ - 0x5c5e4509 \ - SEXP_113F - -# Starcraft - Broodwar (Expansion) 1.13f - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 01/13/06 05:42:48 1146939" \ - 0x000000cd \ - 1.1.3.11 \ - 0x5c5e4509 \ - STAR_113F - -# Starcraft - Broodwar (Expansion) 1.13e - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 09/07/05 19:06:42 1093632" \ - 0x000000cd \ - 1.1.3.9 \ - 0xdee278b8 \ - SEXP_113E - -# Starcraft - Broodwar (Expansion) 1.13e - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 09/07/05 19:06:42 1093632" \ - 0x000000cd \ - 1.1.3.9 \ - 0xdee278b8 \ - STAR_113E - -# Starcraft - Broodwar (Expansion) 1.13d - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 08/25/05 22:23:54 1093632" \ - 0x000000cd \ - 1.1.3.7 \ - 0x5b3cbe07 \ - SEXP_113D - -# Starcraft - Broodwar (Expansion) 1.13d - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 08/25/05 22:23:54 1093632" \ - 0x000000cd \ - 1.1.3.7 \ - 0x5b3cbe07 \ - SEXP_113D_STAR - -# Starcraft - Broodwar (Expansion) 1.13c - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 08/18/05 23:42:08 1093632" \ - 0x000000cd \ - 1.1.3.5 \ - 0xbd7aca6e \ - SEXP_113C - -# Starcraft - Broodwar (Expansion) 1.13c - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 08/18/05 23:42:08 1093632" \ - 0x000000cd \ - 1.1.3.5 \ - 0xbd7aca6e \ - SEXP_113C_STAR - -# Starcraft - Broodwar (Expansion) 1.13b - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 08/10/05 22:19:41 1093632" \ - 0x000000cd \ - 1.1.3.3 \ - 0x02cfab16 \ - SEXP_113B - -# Starcraft - Broodwar (Expansion) 1.13b - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 08/10/05 22:19:41 1093632" \ - 0x000000cd \ - 1.1.3.3 \ - 0x02cfab16 \ - SEXP_113B_STAR - -# Starcraft - Broodwar (Expansion) 1.13 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 06/24/05 17:19:30 1093632" \ - 0x000000cd \ - 1.1.3.1 \ - 0x02bb0696 \ - SEXP_113 - -# Starcraft - Broodwar (Expansion) 1.13 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 06/24/05 17:19:30 1093632" \ - 0x000000cd \ - 1.1.3.1 \ - 0x02bb0696 \ - SEXP_113_STAR - -# Starcraft - Broodwar (Expansion) 1.12b - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 02/18/05 02:14:10 1093632" \ - 0x000000cb \ - 1.1.2.3 \ - 0x0eea30bc \ - SEXP_112B - -# Starcraft - Broodwar (Expansion) 1.12b - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/10/05 02:14:10 1093632" \ - 0x000000cb \ - 1.1.2.3 \ - 0x0eea30bc \ - SEXP_112B_STAR - -# Starcraft - Broodwar (Expansion) 1.12 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 02/10/05 05:36:14 1093632" \ - 0x000000cb \ - 1.1.2.1 \ - 0x796786fe \ - SEXP_112 - -# Starcraft - Broodwar (Expansion) 1.12 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/10/05 05:36:14 1093632" \ - 0x000000cb \ - 1.1.2.1 \ - 0x796786fe \ - SEXP_112_STAR - -# Starcraft - Broodwar (Expansion) 1.11b - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 05/26/04 00:46:00 1048576" \ - 0x000000c9 \ - 1.1.1.3 \ - 0xd1ef9ca4 \ - SEXP_111B - -# Starcraft - Broodwar (Expansion) 1.11b - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/26/04 00:46:00 1048576" \ - 0x000000c9 \ - 1.1.1.3 \ - 0xd1ef9ca4 \ - SEXP_111B_STAR - -# Starcraft - Broodwar (Expansion) 1.11 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 04/27/04 05:12:02 1048576" \ - 0x000000c9 \ - 1.1.1.1 \ - 0x706c67e6 \ - SEXP_111 - -# Starcraft - Broodwar (Expansion) 1.11 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 04/27/04 05:12:02 1048576" \ - 0x000000c9 \ - 1.1.1.1 \ - 0x706c67e6 \ - SEXP_111_STAR - -# Starcraft - Broodwar (Expansion) 1.10 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 03/28/03 04:21:58 1064960" \ - 0x000000c7 \ - 1.1.0.1 \ - 0xe20a2ca1 \ - SEXP_110 - -# Starcraft - Broodwar (Expansion) 1.10 - (Starcraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 03/28/03 04:21:58 1064960" \ - 0x000000c7 \ - 1.1.0.1 \ - 0xe20a2ca1 \ - SEXP_110_STAR - -# Starcraft - Broodwar (Expansion) 1.09b - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 02/21/02 20:54:04 1083392" \ - 0x000000c5 \ - 1.0.9.3 \ - 0xf76df1ed \ - SEXP_109B - -# Starcraft - Broodwar (Expansion) 1.09b - (Starcraft mode) -#"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/21/02 20:54:04 1083392" \ - 0x000000c5 \ - 1.0.9.3 \ - 0xf76df1ed \ - SEXP_109B_STAR - -# Starcraft - Broodwar (Expansion) 1.09 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 02/05/02 07:17:26 1083392" \ - 0x000000c5 \ - 1.0.9.1 \ - 0x9333e69f \ - SEXP_109 - -# Starcraft - Broodwar (Expansion) 1.09 - (StarCraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/05/02 07:17:26 1083392" \ - 0x000000c5 \ - 1.0.9.1 \ - 0x9333e69f \ - SEXP_109_STAR - -# Starcraft - Broodwar (Expansion) 1.08b - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 05/19/01 02:28:22 1082880" \ - 0x000000c3 \ - 1.0.8.11 \ - 0x95b346ec \ - SEXP_108B - -# Starcraft - Broodwar (Expansion) 1.08b - (StarCraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/19/01 02:28:22 1082880" \ - 0x000000c3 \ - 1.0.8.11 \ - 0x95b346ec \ - SEXP_108B_STAR - -# Starcraft - Broodwar (Expansion) 1.08 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 05/17/01 03:51:08 1082880" \ - 0x000000c3 \ - 1.0.8.1 \ - 0x5063884e \ - SEXP_108 - -# Starcraft - Broodwar (Expansion) 1.08 - (StarCraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/17/01 03:51:08 1082880" \ - 0x000000c3 \ - 1.0.8.1 \ - 0x5063884e \ - SEXP_108_STAR - -# Starcraft - Broodwar (Expansion) 1.07 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 10/30/99 03:54:30 1043456" \ - 0x000000c1 \ - 1.0.7.1 \ - 0xacf13dce \ - SEXP_107 - -# Starcraft - Broodwar (Expansion) 1.07 - (StarCraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 10/30/99 03:54:30 1043456" \ - 0x000000c1 \ - 1.0.7.1 \ - 0xacf13dce \ - SEXP_107_STAR - -# Starcraft - Broodwar (Expansion) 1.06 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 09/28/99 19:41:34 1042432" \ - 0x000000bd \ - 1.0.6.1 \ - 0x1acce912 \ - SEXP_106 - -# Starcraft - Broodwar (Expansion) 1.06 - (StarCraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 09/28/99 19:41:34 1042432" \ - 0x000000bd \ - 1.0.6.1 \ - 0x1acce912 \ - SEXP_106_STAR - -# Starcraft - Broodwar (Expansion) 1.05 - (Broodwar mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - SEXP \ - "starcraft.exe 03/08/99 22:37:32 1042432" \ - 0x000000bd \ - 1.0.5.1 \ - 0x9a2d64e6 \ - SEXP_105 - -# Starcraft - Broodwar (Expansion) 1.05 - (StarCraft mode) -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 03/08/99 22:37:32 1042432" \ - 0x000000bd \ - 1.0.5.1 \ - 0x9a2d64e6 \ - SEXP_105_STAR - -# Starcraft - Broodwar (Expansion) 1.04 - (Broodwar mode) -# exeinfo is NULL here because it's the date of install -# but that's ok because we have the checksum -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - SEXP \ - NULL \ - 0x000000bb \ - 1.0.4.1 \ - 0xfd581427 \ - SEXP_104 - -# Starcraft - Broodwar (Expansion) 1.04 - (StarCraft mode) -# exeinfo is NULL here because it's the date of install -# but that's ok because we have the checksum -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - NULL \ - 0x000000bb \ - 1.0.4.1 \ - 0xfd581427 \ - SEXP_104_STAR - -# ==================== StarCraft (original) entries ========================== - -# Starcraft (Standalone) 1.16 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 11/06/08 01:14:14 1220608" \ - 0x000000d3 \ - 1.16.0.0 \ - 0xcab35ce0 \ - STAR_116 - -# Starcraft (Standalone) 1.15.3 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 07/25/08 23:36:39 1220608" \ - 0x000000d1 \ - 1.15.3.0 \ - 0xc9fc7927 \ - STAR_1153 - -# Starcraft (Standalone) 1.15.2 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "StarCraft.exe 01/08/08 23:45:36 1220608" \ - 0x000000d1 \ - 1.15.2.0 \ - 0x91c0f907 \ - STAR_1152 - -# Starcraft (Standalone) 1.15.1 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 07/19/07 02:30:53 1220608" \ - 0x000000d1 \ - 1.15.1.0 \ - 0x34702730 \ - STAR_1151 - -# Starcraft (Standalone) 1.15 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/08/07 19:14:08 1220608" \ - 0x000000d1 \ - 1.15.0.0 \ - 0xd892b992 \ - STAR_115 - -# Starcraft (Standalone) 1.14 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/19/06 00:05:06 1216512" \ - 0x000000cf \ - 1.14.0.0 \ - 0x1f109657 \ - STAR_114 - -# Starcraft (Standalone) 1.13f -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 01/13/06 05:46:36 1146939" \ - 0x000000cd \ - 1.1.3.10 \ - 0x0e3d3732 \ - STAR_113F - -# Starcraft (Standalone) 1.13e -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 09/07/05 19:31:20 1093632" \ - 0x000000cd \ - 1.1.3.8 \ - 0xa21f8b5c \ - STAR_113E - -# Starcraft (Standalone) 1.13d -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 08/25/05 22:36:16 1093632" \ - 0x000000cd \ - 1.1.3.6 \ - 0xdef3af2b \ - STAR_113D - -# Starcraft (Standalone) 1.13c -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 08/18/05 23:52:34 1093632" \ - 0x000000cd \ - 1.1.3.4 \ - 0xe888a7ce \ - STAR_113C - -# Starcraft (Standalone) 1.13b -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 08/10/05 22:24:39 1093632" \ - 0x000000cd \ - 1.1.3.2 \ - 0x934ce3ac \ - STAR_113B - -# Starcraft (Standalone) 1.13 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 06/24/05 17:26:11 1093632" \ - 0x000000cd \ - 1.1.3.0 \ - 0x3462622c \ - STAR_113 - -# Starcraft (Standalone) 1.12b -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/18/05 02:18:55 1093632" \ - 0x000000cb \ - 1.1.2.2 \ - 0x90abd67f \ - STAR_112B - -# Starcraft (Standalone) 1.12 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/10/05 05:37:38 1093632" \ - 0x000000cb \ - 1.1.2.0 \ - 0x2132ae0b \ - STAR_112 - -# Starcraft 1.11b -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/26/04 01:25:14 1048576" \ - 0x000000c9 \ - 1.1.1.2 \ - 0x7e9ce2f1 \ - STAR_111B - -# Starcraft 1.11 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 04/27/04 05:46:02 1048576" \ - 0x000000c9 \ - 1.1.1.1 \ - 0xff88c010 \ - STAR_111 - -# Starcraft 1.10 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 03/27/03 04:30:39 1064960" \ - 0x000000c7 \ - 1.1.0.0 \ - 0x8515bf6a \ - STAR_110 - -# Starcraft 1.09b -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/21/02 21:48:41 1083392" \ - 0x000000c5 \ - 1.0.9.2 \ - 0x96d28df0 \ - STAR_109B - -# Starcraft 1.09 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 02/05/02 07:37:20 1083392" \ - 0x000000c5 \ - 1.0.9.0 \ - 0x251098be \ - STAR_109 - -# Starcraft 1.08b -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/19/01 02:01:50 1082880" \ - 0x000000c3 \ - 1.0.8.10 \ - 0x7859c173 \ - STAR_108B - -# Starcraft 1.08 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 05/17/01 04:12:40 1082880" \ - 0x000000c3 \ - 1.0.8.0 \ - 0x7b58b906 \ - STAR_108 - -# Starcraft 1.07 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 10/30/99 02:20:12 1043456" \ - 0x000000c1 \ - 1.0.7.0 \ - 0x79126108 \ - STAR_107 - -# Starcraft 1.06 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 09/25/99 22:40:10 1042432" \ - 0x000000bd \ - 1.0.6.0 \ - 0xfea28485 \ - STAR_106 - -# Starcraft 1.05 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 03/08/99 22:41:50 1042432" \ - 0x000000bd \ - 1.0.5.0 \ - 0xc243123c \ - STAR_105 - -# # Starcraft 1.04 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 12/16/98 22:24:18 1041408" \ - 0x000000bb \ - 1.0.4.0 \ - 0x2779bdc8 \ - STAR_104 - -# Starcraft 1.03 -"A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B" \ - "IX86ver1.mpq" \ - IX86 \ - STAR \ - "starcraft.exe 10/09/98 23:18:22 987648" \ - 0x000000a9 \ - 1.0.3.0 \ - 0x1309eaad \ - STAR_103 - -# ==================== Diablo (original) entries ======================= - -# Diablo 109b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - DRTL \ - "Diablo.exe 05/18/01 23:10:57 757760" \ - 0x0000002a \ - 1.0.9.2 \ - 0x23135c73 \ - DRTL_109B - -# Diablo 109 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - DRTL \ - "Diablo.exe 05/12/01 00:53:17 757760" \ - 0x0000002a \ - 1.0.9.1 \ - 0x0dcb0513 \ - DRTL_109 - -# Diablo 108 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - DRTL \ - "Diablo.exe 05/24/00 01:16:01 764928" \ - 0x00000028 \ - 1.0.8.1 \ - 0x09eb1213 \ - DRTL_108 - -# =========================== WARCRAFT2 BNE =========================== - -# Warcraft II BNE 2.02b -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - W2BN \ - "Warcraft II BNE.exe 05/21/01 21:52:22 712704" \ - 0x0000004f \ - 2.0.2.1 \ - 0xff0d4c4a \ - W2BN_202B - -# Warcraft II BNE 2.02a -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - "ver-IX86-1.mpq" \ - IX86 \ - W2BN \ - "Warcraft II BNE.exe 05/15/01 20:53:19 712704" \ - 0x0000004f \ - 2.0.2.0 \ - 0xb52bad87 \ - W2BN_202A - -# Warcraft II BNE v2.01 -"A=2383634235 B=711286254 C=3710735432 4 A=A+S B=B^C C=C+A A=A^B" \ - "IX86ver4.mpq" \ - IX86 \ - W2BN \ - "Warcraft II BNE.exe ??/??/?? ??:??:?? 704512" \ - 0x0000004b \ - 2.0.0.154 \ - 0x0 \ - W2BN_201 - -# Warcraft II BNE v2.00 -"A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B" \ - IX86ver1.mpq \ - IX86 \ - W2BN \ - NULL \ - 0x0000004b \ - 2.0.0.154 \ - 0x7133f5ed \ - W2BN_200 diff --git a/conf/versioncheck.json.in b/conf/versioncheck.json.in new file mode 100644 index 0000000..f00bdfe --- /dev/null +++ b/conf/versioncheck.json.in @@ -0,0 +1,2163 @@ +{ + "WAR3": [ + { + "title": "Warcraft III - ROC 1.28.2.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.2.227", + "versionbyte": "0x1c", + "hash": "0x2dc96bf5", + "file_metadata": "War3.exe 05/20/17 13:25:29 558568", + "versiontag": "WAR3_1282" + }, + { + "title": "Warcraft III - ROC 1.28.1.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "C=2765988015 A=1961381685 B=3183936986 4 A=A-S B=B+C C=C-A A=A^B", + "version": "1.28.1.197", + "versionbyte": "0x1c", + "hash": "0x1fbde0fd", + "file_metadata": "War3.exe 04/17/17 12:06:57 536040", + "versiontag": "WAR3_1281" + }, + { + "title": "Warcraft III - ROC 1.28", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "C=1210345628 B=2907417192 A=3489626739 4 A=A+S B=B+C C=C+A A=A+B", + "version": "1.28.0.37", + "versionbyte": "0x1c", + "hash": "0xe00c3096", + "file_metadata": "War3.exe 04/17/17 12:06:57 536040", + "versiontag": "WAR3_128" + }, + { + "title": "Warcraft III - ROC 1.27b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B", + "version": "1.27.1.173", + "versionbyte": "0x1b", + "hash": "0x4026b5b0", + "file_metadata": "War3.exe 12/09/16 06:05:09 515048", + "versiontag": "WAR3_127B" + }, + { + "title": "Warcraft III - ROC 1.27a", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B", + "version": "1.27.0.16", + "versionbyte": "0x1b", + "hash": "0x960947fd", + "file_metadata": "War3.exe 08/05/16 03:15:27 514536", + "versiontag": "WAR3_127A" + }, + { + "title": "Warcraft III - ROC 1.26a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.26.0.1", + "versionbyte": "0x1a", + "hash": "0xf2e7cec2", + "file_metadata": "war3.exe 03/18/11 20:03:55 471040", + "versiontag": "WAR3_126A" + }, + { + "title": "Warcraft III - ROC 1.25b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.25.1.253", + "versionbyte": "0x19", + "hash": "0x41a8664c", + "file_metadata": "war3.exe 02/12/11 03:32:48 471040", + "versiontag": "W3XP_125B" + }, + { + "title": "Warcraft III - ROC 1.24e", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.4.243", + "versionbyte": "0x18", + "hash": "0xde4443c5", + "file_metadata": "war3.exe 02/26/10 20:41:08 471040", + "versiontag": "W3XP_124E" + }, + { + "title": "Warcraft III - ROC 1.24d", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.3.240", + "versionbyte": "0x18", + "hash": "0x2a7b4a96", + "file_metadata": "war3.exe 01/13/10 00:35:02 471040", + "versiontag": "WAR3_124D" + }, + { + "title": "Warcraft III - ROC 1.24c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.2.234", + "versionbyte": "0x18", + "hash": "0x307c4598", + "file_metadata": "war3.exe 10/21/09 19:14:23 471040", + "versiontag": "WAR3_124C" + }, + { + "title": "Warcraft III - ROC 1.24b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.1.230", + "versionbyte": "0x18", + "hash": "0xcaa59e30", + "file_metadata": "war3.exe 08/07/09 19:20:53 471040", + "versiontag": "WAR3_124B" + }, + { + "title": "Warcraft III - ROC 1.24a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.0.228", + "versionbyte": "0x18", + "hash": "0xf3c22f0b", + "file_metadata": "war3.exe 07/23/09 20:15:12 471040", + "versiontag": "WAR3_124A" + }, + { + "title": "Warcraft III - ROC 1.23a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.23.0.208", + "versionbyte": "0x17", + "hash": "0xfad9bc05", + "file_metadata": "war3.exe 03/12/09 23:23:40 471040", + "versiontag": "WAR3_123A" + }, + { + "title": "Warcraft III - ROC 1.22a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.22.0.184", + "versionbyte": "0x16", + "hash": "0x909998db", + "file_metadata": "war3.exe 06/27/08 00:01:35 471040", + "versiontag": "WAR3_122A" + }, + { + "title": "Warcraft III - ROC 1.21b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.21.1.156", + "versionbyte": "0x15", + "hash": "0x1b735294", + "file_metadata": "war3.exe 07/19/07 18:41:12 409660", + "versiontag": "WAR3_121B" + }, + { + "title": "Warcraft III - ROC 1.21a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.21.0.119", + "versionbyte": "0x15", + "hash": "0xab35b5f1", + "file_metadata": "war3.exe 12/28/06 20:35:21 1572307", + "versiontag": "WAR3_121A" + }, + { + "title": "Warcraft III - ROC 1.20e", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.20.4.186", + "versionbyte": "0x14", + "hash": "0x8771b225", + "file_metadata": "war3.exe 06/13/06 06:13:05 1572307", + "versiontag": "WAR3_120E" + }, + { + "title": "Warcraft III - ROC 1.20d", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.20.3.182", + "versionbyte": "0x14", + "hash": "0xbbd3e672", + "file_metadata": "War3.exe 04/06/06 00:19:58 1572307", + "versiontag": "WAR3_120D" + }, + { + "title": "Warcraft III - ROC 1.20c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.20.2.177", + "versionbyte": "0x14", + "hash": "0x97c8e59b", + "file_metadata": "War3.exe 01/05/06 02:50:54 1572307", + "versiontag": "WAR3_120C" + }, + { + "title": "Warcraft III - ROC 1.20b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.20.168", + "versionbyte": "0x14", + "hash": "0x57e714c1", + "file_metadata": "War3.exe 12/07/05 23:59:26 1572307", + "versiontag": "WAR3_120B" + }, + { + "title": "Warcraft III - ROC 1.20a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.20.160", + "versionbyte": "0x14", + "hash": "0xdfe00da5", + "file_metadata": "War3.exe 09/23/05 03:16:24 1572307", + "versiontag": "WAR3_120A" + }, + { + "title": "Warcraft III - ROC 1.19b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.19.158", + "versionbyte": "0x13", + "hash": "0x9c73744d", + "file_metadata": "war3.exe 09/20/05 04:03:24 1572307", + "versiontag": "WAR3_119B" + }, + { + "title": "Warcraft III - ROC 1.19a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.19.153", + "versionbyte": "0x13", + "hash": "0x892fa500", + "file_metadata": "war3.exe 09/07/05 18:58:53 1572307", + "versiontag": "WAR3_119A" + }, + { + "title": "Warcraft III - ROC 1.18a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.18.142", + "versionbyte": "0x12", + "hash": "0x087fb830", + "file_metadata": "war3.exe 02/18/05 04:38:43 1572307", + "versiontag": "WAR3_118A" + }, + { + "title": "Warcraft III - ROC 1.17a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.17.100", + "versionbyte": "0x11", + "hash": "0xd1d89b0e", + "file_metadata": "war3.exe 09/15/04 22:42:18 1568211", + "versiontag": "WAR3_117A" + }, + { + "title": "Warcraft III - ROC 1.16a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.16.38", + "versionbyte": "0x10", + "hash": "0xcc882269", + "file_metadata": "War3.exe 06/28/04 23:37:02 1568211", + "versiontag": "WAR3_116A" + }, + { + "title": "Warcraft III - ROC 1.15a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.15.156", + "versionbyte": "0x0f", + "hash": "0x39b3974b", + "file_metadata": "war3.exe 05/04/04 01:18:12 1568211", + "versiontag": "WAR3_115A" + }, + { + "title": "Warcraft III - ROC 1.14b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.14.152", + "versionbyte": "0x0e", + "hash": "0x36fd6e73", + "file_metadata": "War3.exe 01/09/04 06:11:44 1568211", + "versiontag": "WAR3_114B" + }, + { + "title": "Warcraft III - ROC 1.14a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.14.151", + "versionbyte": "0x0e", + "hash": "0xa842edef", + "file_metadata": "War3.exe 01/06/04 03:44:50 1568211", + "versiontag": "WAR3_114A" + }, + { + "title": "Warcraft III - ROC 1.13b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.13.149", + "versionbyte": "0x0d", + "hash": "0x0bb5600d", + "file_metadata": "War3.exe 12/18/03 00:53:06 1568211", + "versiontag": "WAR3_113B" + }, + { + "title": "Warcraft III - ROC 1.13a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.13.149", + "versionbyte": "0x0d", + "hash": "0xaf284a18", + "file_metadata": "war3.exe 12/10/03 23:42:46 2150400", + "versiontag": "WAR3_113A" + }, + { + "title": "Warcraft III - ROC 1.12a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.12.148", + "versionbyte": "0x0c", + "hash": "0xa9c022bd", + "file_metadata": "war3.exe 07/22/03 22:43:15 1568211", + "versiontag": "WAR3_112A" + }, + { + "title": "Warcraft III - RoC 1.10a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.10.146", + "versionbyte": "0x0a", + "hash": "0x75d1c16f", + "file_metadata": "war3.exe 06/17/03 16:37:46 1568211", + "versiontag": "WAR3_110A" + }, + { + "title": "Warcraft III - RoC 1.07 (Used for TFT 1.07a in RoC Mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.7.142", + "versionbyte": "0x07", + "hash": "0xde80b55b", + "file_metadata": "NULL", + "versiontag": "WAR3_107A" + }, + { + "title": "WarCraft III - RoC 1.06a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.6.0", + "versionbyte": "0x06", + "hash": "0x302dca19", + "file_metadata": "war3.exe 05/23/03 19:50:08 1461715", + "versiontag": "WAR3_106A" + }, + { + "title": "WarCraft III - RoC 1.05a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.5.0", + "versionbyte": "0x05", + "hash": "0xbe284ba9", + "file_metadata": "war3.exe 01/30/03 03:08:10 1170899", + "versiontag": "WAR3_105A" + }, + { + "title": "WarCraft III - RoC 1.04c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.4.1", + "versionbyte": "0x04", + "hash": "0x3f06d9fa", + "file_metadata": "war3.exe 01/16/03 02:44:48 1166807", + "versiontag": "WAR3_104C" + }, + { + "title": "WarCraft III - RoC 1.04b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.3.0", + "versionbyte": "0x04", + "hash": "0x56f4cc37", + "file_metadata": "war3.exe 10/31/02 17:29:22 1068499", + "versiontag": "WAR3_104B" + }, + { + "title": "WarCraft III - RoC 1.04a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.3.0", + "versionbyte": "0x04", + "hash": "0x0e529b2d", + "file_metadata": "war3.exe 10/29/02 23:26:17 713495", + "versiontag": "WAR3_104A" + }, + { + "title": "Warcraft III - RoC 1.03a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.3.0", + "versionbyte": "0x03", + "hash": "0xae4ac7fa", + "file_metadata": "war3.exe 10/08/02 20:54:49 713495", + "versiontag": "WAR3_103A" + }, + { + "title": "Warcraft III - RoC 1.02a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.1.0", + "versionbyte": "0x02", + "hash": "0xa67d9a0e", + "file_metadata": "war3.exe 09/06/02 02:41:02 713495", + "versiontag": "WAR3_102A" + }, + { + "title": "Warcraft III - RoC 1.02", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.1.0", + "versionbyte": "0x02", + "hash": "0x03d8be54", + "file_metadata": "war3.exe 08/12/02 18:21:15 713495", + "versiontag": "WAR3_102" + }, + { + "title": "Warcraft III - RoC 1.01b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.1.1", + "versionbyte": "0x01", + "hash": "0x062ef7dc", + "file_metadata": "war3.exe 07/10/02 18:59:10 713495", + "versiontag": "WAR3_101B" + }, + { + "title": "Warcraft III - RoC 1.01", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.1.0", + "versionbyte": "0x01", + "hash": "0x62c2e1a2", + "file_metadata": "war3.exe 06/28/02 18:41:18 713495", + "versiontag": "WAR3_101" + }, + { + "title": "Warcraft III - RoC 1.00", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.0.0", + "versionbyte": "0x00", + "hash": "0xf891f129", + "file_metadata": "NULL", + "versiontag": "WAR3_100" + } + ], + "W3XP": [ + { + "title": "Warcraft III - TFT (Expansion) 1.28.5.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.5.0", + "versionbyte": "0x1c", + "hash": "0x60743fc9", + "file_metadata": "Warcraft III.exe 07/07/17 20:15:59 562152", + "versiontag": "W3XP_1285" + }, + { + "title": "Warcraft III - ROC 1.28.5.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.5.0", + "versionbyte": "0x1c", + "hash": "0x60743fc9", + "file_metadata": "Warcraft III.exe 07/07/17 20:15:59 562152", + "versiontag": "WAR3_1285" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.28.4.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.4.184", + "versionbyte": "0x1c", + "hash": "0xce7bb7ee", + "file_metadata": "Warcraft III.exe 06/21/17 16:24:03 561128", + "versiontag": "W3XP_1284" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.28.2.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.2.227", + "versionbyte": "0x1c", + "hash": "0x2dc96bf5", + "file_metadata": "War3.exe 05/20/17 13:25:29 558568", + "versiontag": "W3XP_1282" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.28.1.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.1.197", + "versionbyte": "0x1c", + "hash": "0x1fbde0fd", + "file_metadata": "War3.exe 04/28/17 19:10:24 558568", + "versiontag": "W3XP_1281" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.28.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=4159479319 C=1286227868 B=2524979557 4 A=A+S B=B^C C=C+A A=A+B", + "version": "1.28.0.37", + "versionbyte": "0x1c", + "hash": "0xe00c3096", + "file_metadata": "War3.exe 04/17/17 12:06:57 536040", + "versiontag": "W3XP_128" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.27b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B", + "version": "1.27.1.173", + "versionbyte": "0x1b", + "hash": "0x4026b5b0", + "file_metadata": "War3.exe 12/09/16 06:05:09 515048", + "versiontag": "W3XP_127B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.27a", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "B=454282227 C=2370009462 A=2264812340 4 A=A^S B=B-C C=C-A A=A+B", + "version": "1.27.0.16", + "versionbyte": "0x1b", + "hash": "0x960947fd", + "file_metadata": "War3.exe 08/05/16 03:15:27 514536", + "versiontag": "W3XP_127A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.26a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.26.0.1", + "versionbyte": "0x1a", + "hash": "0xf2e7cec2", + "file_metadata": "war3.exe 03/18/11 20:03:55 471040", + "versiontag": "W3XP_126A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.25b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.25.1.253", + "versionbyte": "0x19", + "hash": "0x41a8664c", + "file_metadata": "war3.exe 02/12/11 03:32:48 471040", + "versiontag": "W3XP_125B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.24e", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.4.243", + "versionbyte": "0x18", + "hash": "0xde4443c5", + "file_metadata": "war3.exe 02/26/10 20:41:08 471040", + "versiontag": "W3XP_124E" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.24d", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.3.240", + "versionbyte": "0x18", + "hash": "0x2a7b4a96", + "file_metadata": "war3.exe 01/13/10 00:35:02 471040", + "versiontag": "W3XP_124D" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.24c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.2.234", + "versionbyte": "0x18", + "hash": "0x307c4598", + "file_metadata": "war3.exe 10/21/09 19:14:23 471040", + "versiontag": "W3XP_124C" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.24b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.1.230", + "versionbyte": "0x18", + "hash": "0xcaa59e30", + "file_metadata": "war3.exe 08/07/09 19:20:53 471040", + "versiontag": "W3XP_124B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.24a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.24.0.228", + "versionbyte": "0x18", + "hash": "0xf3c22f0b", + "file_metadata": "war3.exe 07/23/09 20:15:12 471040", + "versiontag": "W3XP_124A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.23a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.23.0.208", + "versionbyte": "0x17", + "hash": "0xfad9bc05", + "file_metadata": "war3.exe 03/12/09 23:23:40 471040", + "versiontag": "W3XP_123A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.22a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.22.0.184", + "versionbyte": "0x16", + "hash": "0x909998db", + "file_metadata": "war3.exe 06/27/08 00:01:35 471040", + "versiontag": "W3XP_122A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.21b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.21.1.156", + "versionbyte": "0x15", + "hash": "0x1b735294", + "file_metadata": "war3.exe 07/19/07 18:41:12 409660", + "versiontag": "W3XP_121B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.21a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.21.0.119", + "versionbyte": "0x15", + "hash": "0xab35b5f1", + "file_metadata": "war3.exe 12/28/06 20:35:21 1572307", + "versiontag": "W3XP_121A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.20e", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.20.4.186", + "versionbyte": "0x14", + "hash": "0x8771b225", + "file_metadata": "war3.exe 06/13/06 06:13:05 1572307", + "versiontag": "W3XP_120E" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.20d", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.20.3.182", + "versionbyte": "0x14", + "hash": "0xbbd3e672", + "file_metadata": "War3.exe 04/06/06 00:19:58 1572307", + "versiontag": "W3XP_120D" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.20c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.20.2.177", + "versionbyte": "0x14", + "hash": "0x97c8e59b", + "file_metadata": "War3.exe 01/05/06 02:50:54 1572307", + "versiontag": "W3XP_120C" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.20b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.20.168", + "versionbyte": "0x14", + "hash": "0x57e714c1", + "file_metadata": "War3.exe 12/07/05 23:59:26 1572307", + "versiontag": "W3XP_120B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.20a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.20.160", + "versionbyte": "0x14", + "hash": "0xdfe00da5", + "file_metadata": "War3.exe 09/23/05 03:16:24 1572307", + "versiontag": "W3XP_120A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.19b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.19.158", + "versionbyte": "0x13", + "hash": "0x9c73744d", + "file_metadata": "war3.exe 09/20/05 04:03:24 1572307", + "versiontag": "W3XP_119B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.19a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.19.153", + "versionbyte": "0x13", + "hash": "0x892fa500", + "file_metadata": "war3.exe 09/07/05 18:58:53 1572307", + "versiontag": "W3XP_119A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.18a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.18.142", + "versionbyte": "0x12", + "hash": "0x087fb830", + "file_metadata": "war3.exe 02/18/05 04:38:43 1572307", + "versiontag": "W3XP_118A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.17a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.17.100", + "versionbyte": "0x11", + "hash": "0xd1d89b0e", + "file_metadata": "war3.exe 09/15/04 22:42:18 1568211", + "versiontag": "W3XP_117A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.16a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.16.38", + "versionbyte": "0x10", + "hash": "0xcc882269", + "file_metadata": "War3.exe 06/28/04 23:37:02 1568211", + "versiontag": "W3XP_116A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.15a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.15.156", + "versionbyte": "0x0f", + "hash": "0x39b3974b", + "file_metadata": "war3.exe 05/04/04 01:18:12 1568211", + "versiontag": "W3XP_115A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.14b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.14.152", + "versionbyte": "0x0e", + "hash": "0x36fd6e73", + "file_metadata": "War3.exe 01/09/04 06:11:44 1568211", + "versiontag": "W3XP_114B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.14a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.14.151", + "versionbyte": "0x0e", + "hash": "0xa842edef", + "file_metadata": "War3.exe 01/06/04 03:44:50 1568211", + "versiontag": "W3XP_114A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.13b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.13.149", + "versionbyte": "0x0d", + "hash": "0x0bb5600d", + "file_metadata": "War3.exe 12/18/03 00:53:06 1568211", + "versiontag": "W3XP_113B" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.13a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.13.149", + "versionbyte": "0x0d", + "hash": "0xaf284a18", + "file_metadata": "war3.exe 12/10/03 23:42:46 2150400", + "versiontag": "W3XP_113A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.12a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.12.148", + "versionbyte": "0x0c", + "hash": "0xa9c022bd", + "file_metadata": "war3.exe 07/22/03 22:43:15 1568211", + "versiontag": "W3XP_112A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.11a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.11.147", + "versionbyte": "0x0b", + "hash": "0x5fce4f04", + "file_metadata": "war3.exe 07/01/03 18:22:52 1568211", + "versiontag": "W3XP_111A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.10a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.10.146", + "versionbyte": "0x0a", + "hash": "0x75d1c16f", + "file_metadata": "war3.exe 06/17/03 16:37:46 1568211", + "versiontag": "W3XP_110A" + }, + { + "title": "Warcraft III - TFT (Expansion) 1.07a", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.7.142", + "versionbyte": "0x07", + "hash": "0xde80b55b", + "file_metadata": "NULL", + "versiontag": "W3XP_107A" + }, + { + "title": "Warcraft III - ROC 1.28.4.", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=1239576727 C=1604096186 B=4198521212 4 A=A+S B=B-C C=C^A A=A+B", + "version": "1.28.4.184", + "versionbyte": "0x1c", + "hash": "0xce7bb7ee", + "file_metadata": "Warcraft III.exe 06/21/17 16:24:03 561128", + "versiontag": "W3XP_1284" + } + ], + "W2BN": [ + { + "title": "Warcraft II BNE 2.02b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "2.0.2.1", + "versionbyte": "0x4f", + "hash": "0xff0d4c4a", + "file_metadata": "Warcraft II BNE.exe 05/21/01 21:52:22 712704", + "versiontag": "W2BN_202B" + }, + { + "title": "Warcraft II BNE 2.02a", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "2.0.2.0", + "versionbyte": "0x4f", + "hash": "0xb52bad87", + "file_metadata": "Warcraft II BNE.exe 05/15/01 20:53:19 712704", + "versiontag": "W2BN_202A" + }, + { + "title": "Warcraft II BNE v2.01", + "architecture": "IX86", + "checkrevision_file": "IX86ver4.mpq", + "equation": "A=2383634235 B=711286254 C=3710735432 4 A=A+S B=B^C C=C+A A=A^B", + "version": "2.0.0.154", + "versionbyte": "0x4b", + "hash": "0x0", + "file_metadata": "Warcraft II BNE.exe ??/??/?? ??:??:?? 704512", + "versiontag": "W2BN_201" + }, + { + "title": "Warcraft II BNE v2.00", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "2.0.0.154", + "versionbyte": "0x4b", + "hash": "0x7133f5ed", + "file_metadata": "NULL", + "versiontag": "W2BN_200" + } + ], + "STAR": [ + { + "title": "Starcraft - Broodwar (Expansion) 1.16.1 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.16.1.1", + "versionbyte": "0xd3", + "hash": "0x0a85372d", + "file_metadata": "StarCraft.exe 01/09/09 22:57:43 1220608", + "versiontag": "STAR_1161" + }, + { + "title": "Starcraft (Standalone) 1.16.1", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.16.1.0", + "versionbyte": "0xd3", + "hash": "0x02623d85", + "file_metadata": "StarCraft.exe 01/08/09 05:23:44 1220608", + "versiontag": "STAR_1161" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.16 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.16.0.1", + "versionbyte": "0xd3", + "hash": "0xd206c475", + "file_metadata": "StarCraft.exe 11/06/08 01:10:59 1220608", + "versiontag": "STAR_116" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15.3 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.3.1", + "versionbyte": "0xd1", + "hash": "0x2abff892", + "file_metadata": "StarCraft.exe 07/25/08 23:34:58 1220608", + "versiontag": "STAR_1153" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15.2 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.2.1", + "versionbyte": "0xd1", + "hash": "0x8fbdf18d", + "file_metadata": "StarCraft.exe 01/10/08 20:23:42 1220608", + "versiontag": "STAR_1152" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15.1 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.1.0", + "versionbyte": "0xd1", + "hash": "0x99e92077", + "file_metadata": "starcraft.exe 07/19/07 02:30:05 1220608", + "versiontag": "STAR_1151" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.0.1", + "versionbyte": "0xd1", + "hash": "0x1eec4ebc", + "file_metadata": "starcraft.exe 05/08/07 19:13:26 1220608", + "versiontag": "STAR_115" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.14 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.14.0.1", + "versionbyte": "0xcf", + "hash": "0xf5280a9e", + "file_metadata": "starcraft.exe 05/10/06 00:13:58 1216512", + "versiontag": "STAR_114" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13f - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.11", + "versionbyte": "0xcd", + "hash": "0x5c5e4509", + "file_metadata": "starcraft.exe 01/13/06 05:42:48 1146939", + "versiontag": "STAR_113F" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13e - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.9", + "versionbyte": "0xcd", + "hash": "0xdee278b8", + "file_metadata": "starcraft.exe 09/07/05 19:06:42 1093632", + "versiontag": "STAR_113E" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13d - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.7", + "versionbyte": "0xcd", + "hash": "0x5b3cbe07", + "file_metadata": "starcraft.exe 08/25/05 22:23:54 1093632", + "versiontag": "SEXP_113D_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13c - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.5", + "versionbyte": "0xcd", + "hash": "0xbd7aca6e", + "file_metadata": "starcraft.exe 08/18/05 23:42:08 1093632", + "versiontag": "SEXP_113C_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13b - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.3", + "versionbyte": "0xcd", + "hash": "0x02cfab16", + "file_metadata": "starcraft.exe 08/10/05 22:19:41 1093632", + "versiontag": "SEXP_113B_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.1", + "versionbyte": "0xcd", + "hash": "0x02bb0696", + "file_metadata": "starcraft.exe 06/24/05 17:19:30 1093632", + "versiontag": "SEXP_113_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.12b - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.2.3", + "versionbyte": "0xcb", + "hash": "0x0eea30bc", + "file_metadata": "starcraft.exe 02/10/05 02:14:10 1093632", + "versiontag": "SEXP_112B_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.12 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.2.1", + "versionbyte": "0xcb", + "hash": "0x796786fe", + "file_metadata": "starcraft.exe 02/10/05 05:36:14 1093632", + "versiontag": "SEXP_112_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.11b - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.1.3", + "versionbyte": "0xc9", + "hash": "0xd1ef9ca4", + "file_metadata": "starcraft.exe 05/26/04 00:46:00 1048576", + "versiontag": "SEXP_111B_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.11 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.1.1", + "versionbyte": "0xc9", + "hash": "0x706c67e6", + "file_metadata": "starcraft.exe 04/27/04 05:12:02 1048576", + "versiontag": "SEXP_111_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.10 - (Starcraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.0.1", + "versionbyte": "0xc7", + "hash": "0xe20a2ca1", + "file_metadata": "starcraft.exe 03/28/03 04:21:58 1064960", + "versiontag": "SEXP_110_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.09 - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.9.1", + "versionbyte": "0xc5", + "hash": "0x9333e69f", + "file_metadata": "starcraft.exe 02/05/02 07:17:26 1083392", + "versiontag": "SEXP_109_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.08b - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.8.11", + "versionbyte": "0xc3", + "hash": "0x95b346ec", + "file_metadata": "starcraft.exe 05/19/01 02:28:22 1082880", + "versiontag": "SEXP_108B_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.08 - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.8.1", + "versionbyte": "0xc3", + "hash": "0x5063884e", + "file_metadata": "starcraft.exe 05/17/01 03:51:08 1082880", + "versiontag": "SEXP_108_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.07 - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.7.1", + "versionbyte": "0xc1", + "hash": "0xacf13dce", + "file_metadata": "starcraft.exe 10/30/99 03:54:30 1043456", + "versiontag": "SEXP_107_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.06 - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.6.1", + "versionbyte": "0xbd", + "hash": "0x1acce912", + "file_metadata": "starcraft.exe 09/28/99 19:41:34 1042432", + "versiontag": "SEXP_106_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.05 - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.5.1", + "versionbyte": "0xbd", + "hash": "0x9a2d64e6", + "file_metadata": "starcraft.exe 03/08/99 22:37:32 1042432", + "versiontag": "SEXP_105_STAR" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.04 - (StarCraft mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.4.1", + "versionbyte": "0xbb", + "hash": "0xfd581427", + "file_metadata": "NULL", + "versiontag": "SEXP_104_STAR" + }, + { + "title": "Starcraft (Standalone) 1.16", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.16.0.0", + "versionbyte": "0xd3", + "hash": "0xcab35ce0", + "file_metadata": "StarCraft.exe 11/06/08 01:14:14 1220608", + "versiontag": "STAR_116" + }, + { + "title": "Starcraft (Standalone) 1.15.3", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.3.0", + "versionbyte": "0xd1", + "hash": "0xc9fc7927", + "file_metadata": "StarCraft.exe 07/25/08 23:36:39 1220608", + "versiontag": "STAR_1153" + }, + { + "title": "Starcraft (Standalone) 1.15.2", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.2.0", + "versionbyte": "0xd1", + "hash": "0x91c0f907", + "file_metadata": "StarCraft.exe 01/08/08 23:45:36 1220608", + "versiontag": "STAR_1152" + }, + { + "title": "Starcraft (Standalone) 1.15.1", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.1.0", + "versionbyte": "0xd1", + "hash": "0x34702730", + "file_metadata": "starcraft.exe 07/19/07 02:30:53 1220608", + "versiontag": "STAR_1151" + }, + { + "title": "Starcraft (Standalone) 1.15", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.0.0", + "versionbyte": "0xd1", + "hash": "0xd892b992", + "file_metadata": "starcraft.exe 05/08/07 19:14:08 1220608", + "versiontag": "STAR_115" + }, + { + "title": "Starcraft (Standalone) 1.14", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.14.0.0", + "versionbyte": "0xcf", + "hash": "0x1f109657", + "file_metadata": "starcraft.exe 05/19/06 00:05:06 1216512", + "versiontag": "STAR_114" + }, + { + "title": "Starcraft (Standalone) 1.13f", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.10", + "versionbyte": "0xcd", + "hash": "0x0e3d3732", + "file_metadata": "starcraft.exe 01/13/06 05:46:36 1146939", + "versiontag": "STAR_113F" + }, + { + "title": "Starcraft (Standalone) 1.13e", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.8", + "versionbyte": "0xcd", + "hash": "0xa21f8b5c", + "file_metadata": "starcraft.exe 09/07/05 19:31:20 1093632", + "versiontag": "STAR_113E" + }, + { + "title": "Starcraft (Standalone) 1.13d", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.6", + "versionbyte": "0xcd", + "hash": "0xdef3af2b", + "file_metadata": "starcraft.exe 08/25/05 22:36:16 1093632", + "versiontag": "STAR_113D" + }, + { + "title": "Starcraft (Standalone) 1.13c", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.4", + "versionbyte": "0xcd", + "hash": "0xe888a7ce", + "file_metadata": "starcraft.exe 08/18/05 23:52:34 1093632", + "versiontag": "STAR_113C" + }, + { + "title": "Starcraft (Standalone) 1.13b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.2", + "versionbyte": "0xcd", + "hash": "0x934ce3ac", + "file_metadata": "starcraft.exe 08/10/05 22:24:39 1093632", + "versiontag": "STAR_113B" + }, + { + "title": "Starcraft (Standalone) 1.13", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.0", + "versionbyte": "0xcd", + "hash": "0x3462622c", + "file_metadata": "starcraft.exe 06/24/05 17:26:11 1093632", + "versiontag": "STAR_113" + }, + { + "title": "Starcraft (Standalone) 1.12b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.2.2", + "versionbyte": "0xcb", + "hash": "0x90abd67f", + "file_metadata": "starcraft.exe 02/18/05 02:18:55 1093632", + "versiontag": "STAR_112B" + }, + { + "title": "Starcraft (Standalone) 1.12", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.2.0", + "versionbyte": "0xcb", + "hash": "0x2132ae0b", + "file_metadata": "starcraft.exe 02/10/05 05:37:38 1093632", + "versiontag": "STAR_112" + }, + { + "title": "Starcraft 1.11b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.1.2", + "versionbyte": "0xc9", + "hash": "0x7e9ce2f1", + "file_metadata": "starcraft.exe 05/26/04 01:25:14 1048576", + "versiontag": "STAR_111B" + }, + { + "title": "Starcraft 1.11", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.1.1", + "versionbyte": "0xc9", + "hash": "0xff88c010", + "file_metadata": "starcraft.exe 04/27/04 05:46:02 1048576", + "versiontag": "STAR_111" + }, + { + "title": "Starcraft 1.10", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.0.0", + "versionbyte": "0xc7", + "hash": "0x8515bf6a", + "file_metadata": "starcraft.exe 03/27/03 04:30:39 1064960", + "versiontag": "STAR_110" + }, + { + "title": "Starcraft 1.09b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.9.2", + "versionbyte": "0xc5", + "hash": "0x96d28df0", + "file_metadata": "starcraft.exe 02/21/02 21:48:41 1083392", + "versiontag": "STAR_109B" + }, + { + "title": "Starcraft 1.09", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.9.0", + "versionbyte": "0xc5", + "hash": "0x251098be", + "file_metadata": "starcraft.exe 02/05/02 07:37:20 1083392", + "versiontag": "STAR_109" + }, + { + "title": "Starcraft 1.08b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.8.10", + "versionbyte": "0xc3", + "hash": "0x7859c173", + "file_metadata": "starcraft.exe 05/19/01 02:01:50 1082880", + "versiontag": "STAR_108B" + }, + { + "title": "Starcraft 1.08", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.8.0", + "versionbyte": "0xc3", + "hash": "0x7b58b906", + "file_metadata": "starcraft.exe 05/17/01 04:12:40 1082880", + "versiontag": "STAR_108" + }, + { + "title": "Starcraft 1.07", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.7.0", + "versionbyte": "0xc1", + "hash": "0x79126108", + "file_metadata": "starcraft.exe 10/30/99 02:20:12 1043456", + "versiontag": "STAR_107" + }, + { + "title": "Starcraft 1.06", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.6.0", + "versionbyte": "0xbd", + "hash": "0xfea28485", + "file_metadata": "starcraft.exe 09/25/99 22:40:10 1042432", + "versiontag": "STAR_106" + }, + { + "title": "Starcraft 1.05", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.5.0", + "versionbyte": "0xbd", + "hash": "0xc243123c", + "file_metadata": "starcraft.exe 03/08/99 22:41:50 1042432", + "versiontag": "STAR_105" + }, + { + "title": "# Starcraft 1.04", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.4.0", + "versionbyte": "0xbb", + "hash": "0x2779bdc8", + "file_metadata": "starcraft.exe 12/16/98 22:24:18 1041408", + "versiontag": "STAR_104" + }, + { + "title": "Starcraft 1.03", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.3.0", + "versionbyte": "0xa9", + "hash": "0x1309eaad", + "file_metadata": "starcraft.exe 10/09/98 23:18:22 987648", + "versiontag": "STAR_103" + } + ], + "SEXP": [ + { + "title": "Starcraft - Broodwar (Expansion) 1.16.1 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.16.1.1", + "versionbyte": "0xd3", + "hash": "0x0a85372d", + "file_metadata": "StarCraft.exe 01/09/09 22:57:43 1220608", + "versiontag": "SEXP_1161" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.16 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.16.0.1", + "versionbyte": "0xd3", + "hash": "0xd206c475", + "file_metadata": "StarCraft.exe 11/06/08 01:10:59 1220608", + "versiontag": "SEXP_116" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15.3 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.3.1", + "versionbyte": "0xd1", + "hash": "0x2abff892", + "file_metadata": "StarCraft.exe 07/25/08 23:34:58 1220608", + "versiontag": "SEXP_1153" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15.2 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.2.1", + "versionbyte": "0xd1", + "hash": "0x8fbdf18d", + "file_metadata": "StarCraft.exe 01/10/08 20:23:42 1220608", + "versiontag": "SEXP_1152" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15.1 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.1.0", + "versionbyte": "0xd1", + "hash": "0x99e92077", + "file_metadata": "starcraft.exe 07/19/07 02:30:05 1220608", + "versiontag": "SEXP_1151" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.15 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.15.0.1", + "versionbyte": "0xd1", + "hash": "0x1eec4ebc", + "file_metadata": "starcraft.exe 05/08/07 19:13:26 1220608", + "versiontag": "SEXP_115" + }, + { + "title": "Starcraft Broodwar (Expansion) 1.14 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.14.0.1", + "versionbyte": "0xcf", + "hash": "0xf5280a9e", + "file_metadata": "starcraft.exe 05/10/06 00:13:58 1216512", + "versiontag": "SEXP_114" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13f - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.11", + "versionbyte": "0xcd", + "hash": "0x5c5e4509", + "file_metadata": "starcraft.exe 01/13/06 05:42:48 1146939", + "versiontag": "SEXP_113F" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13e - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.9", + "versionbyte": "0xcd", + "hash": "0xdee278b8", + "file_metadata": "starcraft.exe 09/07/05 19:06:42 1093632", + "versiontag": "SEXP_113E" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13d - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.7", + "versionbyte": "0xcd", + "hash": "0x5b3cbe07", + "file_metadata": "starcraft.exe 08/25/05 22:23:54 1093632", + "versiontag": "SEXP_113D" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13c - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.5", + "versionbyte": "0xcd", + "hash": "0xbd7aca6e", + "file_metadata": "starcraft.exe 08/18/05 23:42:08 1093632", + "versiontag": "SEXP_113C" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13b - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.3", + "versionbyte": "0xcd", + "hash": "0x02cfab16", + "file_metadata": "starcraft.exe 08/10/05 22:19:41 1093632", + "versiontag": "SEXP_113B" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.13 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.3.1", + "versionbyte": "0xcd", + "hash": "0x02bb0696", + "file_metadata": "starcraft.exe 06/24/05 17:19:30 1093632", + "versiontag": "SEXP_113" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.12b - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.2.3", + "versionbyte": "0xcb", + "hash": "0x0eea30bc", + "file_metadata": "starcraft.exe 02/18/05 02:14:10 1093632", + "versiontag": "SEXP_112B" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.12 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.2.1", + "versionbyte": "0xcb", + "hash": "0x796786fe", + "file_metadata": "starcraft.exe 02/10/05 05:36:14 1093632", + "versiontag": "SEXP_112" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.11b - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.1.3", + "versionbyte": "0xc9", + "hash": "0xd1ef9ca4", + "file_metadata": "starcraft.exe 05/26/04 00:46:00 1048576", + "versiontag": "SEXP_111B" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.11 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.1.1", + "versionbyte": "0xc9", + "hash": "0x706c67e6", + "file_metadata": "starcraft.exe 04/27/04 05:12:02 1048576", + "versiontag": "SEXP_111" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.10 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.1.0.1", + "versionbyte": "0xc7", + "hash": "0xe20a2ca1", + "file_metadata": "starcraft.exe 03/28/03 04:21:58 1064960", + "versiontag": "SEXP_110" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.09b - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.9.3", + "versionbyte": "0xc5", + "hash": "0xf76df1ed", + "file_metadata": "starcraft.exe 02/21/02 20:54:04 1083392", + "versiontag": "SEXP_109B" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.09 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.9.1", + "versionbyte": "0xc5", + "hash": "0x9333e69f", + "file_metadata": "starcraft.exe 02/05/02 07:17:26 1083392", + "versiontag": "SEXP_109" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.08b - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.8.11", + "versionbyte": "0xc3", + "hash": "0x95b346ec", + "file_metadata": "starcraft.exe 05/19/01 02:28:22 1082880", + "versiontag": "SEXP_108B" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.08 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.8.1", + "versionbyte": "0xc3", + "hash": "0x5063884e", + "file_metadata": "starcraft.exe 05/17/01 03:51:08 1082880", + "versiontag": "SEXP_108" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.07 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.7.1", + "versionbyte": "0xc1", + "hash": "0xacf13dce", + "file_metadata": "starcraft.exe 10/30/99 03:54:30 1043456", + "versiontag": "SEXP_107" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.06 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.6.1", + "versionbyte": "0xbd", + "hash": "0x1acce912", + "file_metadata": "starcraft.exe 09/28/99 19:41:34 1042432", + "versiontag": "SEXP_106" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.05 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.5.1", + "versionbyte": "0xbd", + "hash": "0x9a2d64e6", + "file_metadata": "starcraft.exe 03/08/99 22:37:32 1042432", + "versiontag": "SEXP_105" + }, + { + "title": "Starcraft - Broodwar (Expansion) 1.04 - (Broodwar mode)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=2521522835 B=3428392135 C=218673704 4 A=A^S B=B-C C=C+A A=A-B", + "version": "1.0.4.1", + "versionbyte": "0xbb", + "hash": "0xfd581427", + "file_metadata": "NULL", + "versiontag": "SEXP_104" + } + ], + "DRTL": [ + { + "title": "Diablo 109b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.9.2", + "versionbyte": "0x2a", + "hash": "0x23135c73", + "file_metadata": "Diablo.exe 05/18/01 23:10:57 757760", + "versiontag": "DRTL_109B" + }, + { + "title": "Diablo 109", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.9.1", + "versionbyte": "0x2a", + "hash": "0x0dcb0513", + "file_metadata": "Diablo.exe 05/12/01 00:53:17 757760", + "versiontag": "DRTL_109" + }, + { + "title": "Diablo 108", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.8.1", + "versionbyte": "0x28", + "hash": "0x09eb1213", + "file_metadata": "Diablo.exe 05/24/00 01:16:01 764928", + "versiontag": "DRTL_108" + } + ], + "D2XP": [ + { + "title": "Diablo II - LoD (Expansion) 1.14d", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.3.0", + "versionbyte": "0x0e", + "hash": "0x43f51a83", + "file_metadata": "Game.exe 05/31/16 19:02:24 3618792", + "versiontag": "D2XP_114D" + }, + { + "title": "Diablo II - LoD (Expansion) 1.14c", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.2.0", + "versionbyte": "0x0e", + "hash": "0x6123b0f2", + "file_metadata": "Game.exe 05/06/16 18:15:44 3586024", + "versiontag": "D2XP_114C" + }, + { + "title": "Diablo II - LoD (Expansion) 1.14b", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.1.0", + "versionbyte": "0x0e", + "hash": "0x1373c295", + "file_metadata": "Game.exe 03/31/16 01:09:01 3590120", + "versiontag": "D2XP_114B" + }, + { + "title": "Diablo II - LoD (Expansion) 1.14a", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.0.0", + "versionbyte": "0x0e", + "hash": "0xbcb5b3bb", + "file_metadata": "Game.exe 02/29/16 17:34:46 3590120", + "versiontag": "D2XP_114A" + }, + { + "title": "Diablo II - LoD (Expansion) 1.13c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.13.0", + "versionbyte": "0x0d", + "hash": "0x7686beca", + "file_metadata": "Game.exe 03/09/10 04:10:51 61440", + "versiontag": "D2XP_113C" + }, + { + "title": "Diablo II - LoD (Expansion) 1.09b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.9.0", + "versionbyte": "0x09", + "hash": "0x1436c138", + "file_metadata": "Game.exe 08/31/01 22:40:56 428163", + "versiontag": "D2XP_109B" + }, + { + "title": "Diablo II - LoD (Expansion) 1.09", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.9.0", + "versionbyte": "0x09", + "hash": "0x15abc72d", + "file_metadata": "Game.exe 08/16/01 23:05:03 428163", + "versiontag": "D2XP_109" + }, + { + "title": "Diablo II - LoD (Expansion) 1.08", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.8.0", + "versionbyte": "0x08", + "hash": "0x3a8664ff", + "file_metadata": "Game.exe 06/19/01 02:24:32 428163", + "versiontag": "D2XP_108" + }, + { + "title": "Diablo II - LoD (Expansion) 1.07", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.7.0", + "versionbyte": "0x07", + "hash": "0x4f3079e6", + "file_metadata": "Game.exe 01/23/02 06:39:26 424067", + "versiontag": "D2XP_107" + } + ], + "D2DV": [ + { + "title": "Diablo II 1.14d", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.3.0", + "versionbyte": "0x0e", + "hash": "0x6b6a21b5", + "file_metadata": "Game.exe 05/31/16 19:02:32 3614696", + "versiontag": "D2DV_114D" + }, + { + "title": "Diablo II 1.14c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.2.0", + "versionbyte": "0x0e", + "hash": "0x7d54f650", + "file_metadata": "Game.exe 05/06/16 18:15:49 3581928", + "versiontag": "D2DV_114C" + }, + { + "title": "Diablo II 1.14b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.1.0", + "versionbyte": "0x0e", + "hash": "0x77f3db54", + "file_metadata": "Game.exe 06/13/16 02:02:21 3586024", + "versiontag": "D2DV_114B" + }, + { + "title": "Diablo II 1.14a", + "architecture": "IX86", + "checkrevision_file": "ver-IX86-1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.14.0.0", + "versionbyte": "0x0e", + "hash": "0xd9e9368a", + "file_metadata": "Game.exe 02/29/16 17:34:50 3586024", + "versiontag": "D2DV_114A" + }, + { + "title": "Diablo II 1.13c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.13.0", + "versionbyte": "0x0d", + "hash": "0xfc04b9f6", + "file_metadata": "Game.exe 03/09/10 04:11:00 57344", + "versiontag": "D2DV_113C" + }, + { + "title": "Diablo II 1.09b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.9.0", + "versionbyte": "0x09", + "hash": "0xb9cb2cb1", + "file_metadata": "Game.exe 08/31/01 22:40:35 424067", + "versiontag": "D2DV_109B" + }, + { + "title": "Diablo II 1.09", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.9.0", + "versionbyte": "0x09", + "hash": "0xc43f1764", + "file_metadata": "Game.exe 08/16/01 23:04:40 424067", + "versiontag": "D2DV_109" + }, + { + "title": "Diablo II 1.08", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.8.0", + "versionbyte": "0x08", + "hash": "0x9e488d3d", + "file_metadata": "Game.exe 06/19/01 02:24:04 424067", + "versiontag": "D2DV_108" + }, + { + "title": "Diablo II 1.06b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.6.0", + "versionbyte": "0x06", + "hash": "0xb2fb38b7", + "file_metadata": "Game.exe 05/16/01 18:55:11 419971", + "versiontag": "D2DV_106B" + }, + { + "title": "Diablo II 1.06", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.6.0", + "versionbyte": "0x06", + "hash": "0xaa348e13", + "file_metadata": "Game.exe 04/19/01 02:05:33 419971", + "versiontag": "D2DV_106" + }, + { + "title": "Diablo II 1.05b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.5.1", + "versionbyte": "0x05", + "hash": "0x36869f98", + "file_metadata": "Game.exe 02/01/01 21:21:16 399491", + "versiontag": "D2DV_105B" + }, + { + "title": "Diablo II 1.05", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.5.0", + "versionbyte": "0x05", + "hash": "0xd6dec09b", + "file_metadata": "Game.exe 01/27/01 01:16:00 399491", + "versiontag": "D2DV_105" + }, + { + "title": "Diablo II 1.04c", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.4.2", + "versionbyte": "0x04", + "hash": "0xc6d40aaf", + "file_metadata": "Game.exe 12/23/00 18:28:04 387107", + "versiontag": "D2DV_104B" + }, + { + "title": "Diablo II 1.04b", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.4.1", + "versionbyte": "0x04", + "hash": "0x3882960e", + "file_metadata": "Game.exe 12/22/00 18:08:34 403587", + "versiontag": "D2DV_104B" + }, + { + "title": "Diablo II 1.03", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.3.0", + "versionbyte": "0x03", + "hash": "0x0120ed90", + "file_metadata": "Game.exe 08/01/00 00:34:00 346243", + "versiontag": "D2DV_103" + }, + { + "title": "Diablo II 1.01", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.0.1", + "versionbyte": "0x01", + "hash": "0x5aef7e66", + "file_metadata": "Game.exe 06/26/00 22:31:00 346243", + "versiontag": "D2DV_101" + }, + { + "title": "Diablo II 1.00 (installation)", + "architecture": "IX86", + "checkrevision_file": "IX86ver1.mpq", + "equation": "A=3845581634 B=880823580 C=1363937103 4 A=A-S B=B-C C=C-A A=A-B", + "version": "1.0.0.1", + "versionbyte": "0x00", + "hash": "0xac5e46cb", + "file_metadata": "Game.exe 01/01/97 02:05:09 309379", + "versiontag": "D2DV_100" + } + ] +} \ No newline at end of file diff --git a/src/bnetd/anongame.cpp b/src/bnetd/anongame.cpp index f0d5536..7042afa 100644 --- a/src/bnetd/anongame.cpp +++ b/src/bnetd/anongame.cpp @@ -72,7 +72,6 @@ namespace pvpgn /**********************************************************************************/ static t_connection *_connlist_find_connection_by_uid(int uid); - static char const *_conn_get_versiontag(t_connection * c); static int _anongame_gametype_to_queue(int type, int gametype); static int _anongame_level_by_queue(t_connection * c, int queue); @@ -95,11 +94,6 @@ namespace pvpgn return connlist_find_connection_by_account(accountlist_find_account_by_uid(uid)); } - static char const *_conn_get_versiontag(t_connection * c) - { - return versioncheck_get_versiontag(conn_get_versioncheck(c)); - } - /**********/ static char const *_anongame_queue_to_string(int queue) @@ -541,7 +535,7 @@ namespace pvpgn md = (t_matchdata*)xmalloc(sizeof(t_matchdata)); md->c = c; md->map_prefs = map_prefs; - md->versiontag = _conn_get_versiontag(c); + md->versiontag = conn_get_versioncheck(c)->get_version_tag().c_str(); list_append_data(matchlists[queue][level], md); @@ -834,7 +828,10 @@ namespace pvpgn LIST_TRAVERSE(matchlists[queue][level + delta], curr) { md = (t_matchdata*)elem_get_data(curr); - if (md->versiontag && _conn_get_versiontag(c) && !std::strcmp(md->versiontag, _conn_get_versiontag(c)) && (cur_prefs & md->map_prefs)) { + if (md->versiontag + && !std::strcmp(md->versiontag, conn_get_versioncheck(c)->get_version_tag().c_str()) + && (cur_prefs & md->map_prefs)) + { /* set maxlevel and minlevel to keep all players within 6 levels */ maxlevel = (level + delta + diff < maxlevel) ? level + delta + diff : maxlevel; minlevel = (level + delta - diff > minlevel) ? level + delta - diff : minlevel; diff --git a/src/bnetd/connection.cpp b/src/bnetd/connection.cpp index f1fe95d..ba83cc6 100644 --- a/src/bnetd/connection.cpp +++ b/src/bnetd/connection.cpp @@ -402,7 +402,7 @@ namespace pvpgn temp->protocol.client.clientexe = NULL; temp->protocol.client.owner = NULL; temp->protocol.client.cdkey = NULL; - temp->protocol.client.versioncheck = NULL; + temp->protocol.client.versioncheck = nullptr; temp->protocol.account = NULL; temp->protocol.chat.channel = NULL; temp->protocol.chat.last_message = now; @@ -617,9 +617,6 @@ namespace pvpgn if (c->protocol.account) watchlist->dispatch(c->protocol.account, NULL, c->protocol.client.clienttag, Watch::ET_logout); - if (c->protocol.client.versioncheck) - versioncheck_destroy((t_versioncheck*)c->protocol.client.versioncheck); /* avoid warning */ - if (c->protocol.chat.lastsender) xfree((void *)c->protocol.chat.lastsender); /* avoid warning */ @@ -3199,34 +3196,29 @@ namespace pvpgn } - extern t_versioncheck * conn_get_versioncheck(t_connection * c) + const VersionCheck *conn_get_versioncheck(t_connection *c) { if (!c) { eventlog(eventlog_level_error, __FUNCTION__, "got NULL connection"); - return NULL; + return nullptr; } return c->protocol.client.versioncheck; } - extern int conn_set_versioncheck(t_connection * c, t_versioncheck * versioncheck) + bool conn_set_versioncheck(t_connection *c, const VersionCheck& versioncheck) { if (!c) { eventlog(eventlog_level_error, __FUNCTION__, "got NULL connection"); - return -1; - } - if (!versioncheck) - { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL versioncheck"); - return -1; + return false; } - c->protocol.client.versioncheck = versioncheck; + c->protocol.client.versioncheck = &versioncheck; - return 0; + return true; } extern int conn_get_echoback(t_connection * c) diff --git a/src/bnetd/connection.h b/src/bnetd/connection.h index 396a9d1..19d3f93 100644 --- a/src/bnetd/connection.h +++ b/src/bnetd/connection.h @@ -150,7 +150,7 @@ namespace pvpgn char const * clientexe; char const * owner; char const * cdkey; - t_versioncheck * versioncheck; /* equation and MPQ file used to validate game checksum */ + const VersionCheck *versioncheck; } client; /* client program specific data */ struct { t_queue * outqueue; /* packets waiting to be sent */ @@ -382,8 +382,8 @@ namespace pvpgn extern int conn_quota_exceeded(t_connection * c, char const * message); extern int conn_set_lastsender(t_connection * c, char const * sender); extern char const * conn_get_lastsender(t_connection const * c); - extern t_versioncheck * conn_get_versioncheck(t_connection * c); - extern int conn_set_versioncheck(t_connection * c, t_versioncheck * versioncheck); + const VersionCheck *conn_get_versioncheck(t_connection *c); + bool conn_set_versioncheck(t_connection *c, const VersionCheck& versioncheck); extern int conn_get_echoback(t_connection * c); extern void conn_set_echoback(t_connection * c, int echoback); extern int conn_set_ircline(t_connection * c, char const * line); diff --git a/src/bnetd/handle_bnet.cpp b/src/bnetd/handle_bnet.cpp index 3b802fc..a8d1a37 100644 --- a/src/bnetd/handle_bnet.cpp +++ b/src/bnetd/handle_bnet.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include "compat/strcasecmp.h" @@ -570,11 +571,14 @@ namespace pvpgn packet_del_ref(rpacket); } - if ((rpacket = packet_create(packet_class_bnet))) { - t_versioncheck *vc; - + if ((rpacket = packet_create(packet_class_bnet))) + { eventlog(eventlog_level_debug, __FUNCTION__, "[{}] selecting version check", conn_get_socket(c)); - vc = versioncheck_create(conn_get_archtag(c), conn_get_clienttag(c)); + const VersionCheck& vc = select_versioncheck_entry( + conn_get_archtag(c), + conn_get_clienttag(c), + conn_get_versionid(c)); + conn_set_versioncheck(c, vc); packet_set_size(rpacket, sizeof(t_server_authreq_109)); packet_set_type(rpacket, SERVER_AUTHREQ_109); @@ -588,10 +592,10 @@ namespace pvpgn bn_int_set(&rpacket->u.server_authreq_109.sessionkey, conn_get_sessionkey(c)); bn_int_set(&rpacket->u.server_authreq_109.sessionnum, conn_get_sessionnum(c)); - file_to_mod_time(c, versioncheck_get_mpqfile(vc), &rpacket->u.server_authreq_109.timestamp); - packet_append_string(rpacket, versioncheck_get_mpqfile(vc)); - packet_append_string(rpacket, versioncheck_get_eqn(vc)); - eventlog(eventlog_level_debug, __FUNCTION__, "[{}] selected \"{}\" \"{}\"", conn_get_socket(c), versioncheck_get_mpqfile(vc), versioncheck_get_eqn(vc)); + file_to_mod_time(c, vc.get_checkrevision_filename().c_str(), &rpacket->u.server_authreq_109.timestamp); + packet_append_string(rpacket, vc.get_checkrevision_filename().c_str()); + packet_append_string(rpacket, vc.get_equation().c_str()); + eventlog(eventlog_level_debug, __FUNCTION__, "[{}] selected \"{}\" \"{}\"", conn_get_socket(c), vc.get_checkrevision_filename(), vc.get_equation()); if ((conn_get_clienttag(c) == CLIENTTAG_WARCRAFT3_UINT) || (conn_get_clienttag(c) == CLIENTTAG_WAR3XP_UINT)) { char padding[128]; @@ -646,19 +650,25 @@ namespace pvpgn packet_del_ref(rpacket); } } - else { - t_versioncheck *vc; - + else + { eventlog(eventlog_level_debug, __FUNCTION__, "[{}] selecting version check", conn_get_socket(c)); - vc = versioncheck_create(conn_get_archtag(c), conn_get_clienttag(c)); + + const VersionCheck& vc = select_versioncheck_entry( + conn_get_archtag(c), + conn_get_clienttag(c), + conn_get_versionid(c)); + conn_set_versioncheck(c, vc); - if ((rpacket = packet_create(packet_class_bnet))) { + + if ((rpacket = packet_create(packet_class_bnet))) + { packet_set_size(rpacket, sizeof(t_server_authreq1)); packet_set_type(rpacket, SERVER_AUTHREQ1); - file_to_mod_time(c, versioncheck_get_mpqfile(vc), &rpacket->u.server_authreq1.timestamp); - packet_append_string(rpacket, versioncheck_get_mpqfile(vc)); - packet_append_string(rpacket, versioncheck_get_eqn(vc)); - eventlog(eventlog_level_debug, __FUNCTION__, "[{}] selected \"{}\" \"{}\"", conn_get_socket(c), versioncheck_get_mpqfile(vc), versioncheck_get_eqn(vc)); + file_to_mod_time(c, vc.get_checkrevision_filename().c_str(), &rpacket->u.server_authreq1.timestamp); + packet_append_string(rpacket, vc.get_checkrevision_filename().c_str()); + packet_append_string(rpacket, vc.get_equation().c_str()); + eventlog(eventlog_level_debug, __FUNCTION__, "[{}] selected \"{}\" \"{}\"", conn_get_socket(c), vc.get_checkrevision_filename(), vc.get_equation()); conn_push_outqueue(c, rpacket); packet_del_ref(rpacket); } @@ -1000,104 +1010,116 @@ namespace pvpgn static int _client_authreq1(t_connection * c, t_packet const *const packet) { - t_packet *rpacket; - - if (packet_get_size(packet) < sizeof(t_client_authreq1)) { + if (packet_get_size(packet) < sizeof(t_client_authreq1)) + { eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad AUTHREQ1 packet (expected {} bytes, got {})", conn_get_socket(c), sizeof(t_client_authreq1), packet_get_size(packet)); return -1; } + bool failed = false; + + // The following if statements are sanity checks + // The client should have already sent this information in a previous packet and is resending it again in this packet + if (bn_int_get(packet->u.client_authreq1.archtag) != conn_get_archtag(c)) + failed = true; + + if (bn_int_get(packet->u.client_authreq1.clienttag) != conn_get_clienttag(c)) + failed = true; + + if (bn_int_get(packet->u.client_authreq1.versionid) != conn_get_versionid(c)) + failed = true; + + + const char *exeinfo = packet_get_str_const(packet, sizeof(t_client_authreq1), MAX_EXEINFO_STR); + if (exeinfo) { - char verstr[16]; - char const *exeinfo; - char const *versiontag; - int failed; - - failed = 0; - if (bn_int_get(packet->u.client_authreq1.archtag) != conn_get_archtag(c)) - failed = 1; - if (bn_int_get(packet->u.client_authreq1.clienttag) != conn_get_clienttag(c)) - failed = 1; - - if (!(exeinfo = packet_get_str_const(packet, sizeof(t_client_authreq1), MAX_EXEINFO_STR))) { - eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad AUTHREQ1 (missing or too long exeinfo)", conn_get_socket(c)); - exeinfo = "badexe"; - failed = 1; - } - conn_set_versionid(c, bn_int_get(packet->u.client_authreq1.versionid)); - conn_set_checksum(c, bn_int_get(packet->u.client_authreq1.checksum)); - conn_set_gameversion(c, bn_int_get(packet->u.client_authreq1.gameversion)); - std::strcpy(verstr, vernum_to_verstr(bn_int_get(packet->u.client_authreq1.gameversion))); - conn_set_clientver(c, verstr); conn_set_clientexe(c, exeinfo); + } + else + { + eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad AUTHREQ1 (missing or too long exeinfo)", conn_get_socket(c)); + conn_set_clientexe(c, "badexe"); + failed = true; + } - eventlog(eventlog_level_info, __FUNCTION__, "[{}] CLIENT_AUTHREQ1 archtag=0x{:08x} clienttag=0x{:08x} verstr={} exeinfo=\"{}\" versionid=0x{:08x} gameversion=0x{:08x} checksum=0x{:08x}", conn_get_socket(c), bn_int_get(packet->u.client_authreq1.archtag), bn_int_get(packet->u.client_authreq1.clienttag), verstr, exeinfo, conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c)); + std::string version_string = vernum_to_verstr(bn_int_get(packet->u.client_authreq1.gameversion)); + conn_set_clientver(c, version_string.c_str()); + eventlog(eventlog_level_info, __FUNCTION__, "[{}] CLIENT_AUTHREQ1 archtag=0x{:08x} clienttag=0x{:08x} verstr={} exeinfo=\"{}\" versionid=0x{:08x} gameversion=0x{:08x} checksum=0x{:08x}", conn_get_socket(c), bn_int_get(packet->u.client_authreq1.archtag), bn_int_get(packet->u.client_authreq1.clienttag), version_string, exeinfo == nullptr ? "badexe" : exeinfo, conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c)); + + conn_set_versionid(c, bn_int_get(packet->u.client_authreq1.versionid)); + conn_set_checksum(c, bn_int_get(packet->u.client_authreq1.checksum)); + conn_set_gameversion(c, bn_int_get(packet->u.client_authreq1.gameversion)); - if ((rpacket = packet_create(packet_class_bnet))) { - packet_set_size(rpacket, sizeof(t_server_authreply1)); - packet_set_type(rpacket, SERVER_AUTHREPLY1); - - - if (!conn_get_versioncheck(c) && prefs_get_skip_versioncheck()) - eventlog(eventlog_level_info, __FUNCTION__, "[{}] skip versioncheck enabled and client did not request validation", conn_get_socket(c)); + if (!conn_get_versioncheck(c) && prefs_get_skip_versioncheck()) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] skip versioncheck enabled and client did not request validation", conn_get_socket(c)); + } + else if (prefs_get_allow_unknown_version()) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] skipping versioncheck validation because allow_unknown_version is true", conn_get_socket(c)); + } + else + { + if (conn_get_versioncheck(c)) + { + if (conn_get_versioncheck(c)->validate_checkrevision_data(bn_int_get(packet->u.client_authreq1.gameversion), bn_int_get(packet->u.client_authreq1.checksum), exeinfo == nullptr ? "badexe" : exeinfo)) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] client matches versiontag \"{}\"", conn_get_socket(c), conn_get_versioncheck(c)->get_version_tag()); + } else - switch (versioncheck_validate(conn_get_versioncheck(c), conn_get_archtag(c), conn_get_clienttag(c), exeinfo, conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c))) { - case -1: /* failed test... client has been modified */ - if (!prefs_get_allow_bad_version()) { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client failed test (marking untrusted)", conn_get_socket(c)); - failed = 1; - } - else - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client failed test, allowing anyway", conn_get_socket(c)); - break; - case 0: /* not listed in table... can't tell if client has been modified */ - if (!prefs_get_allow_unknown_version()) { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] unable to test client (marking untrusted)", conn_get_socket(c)); - failed = 1; - } - else - eventlog(eventlog_level_info, __FUNCTION__, "[{}] unable to test client, allowing anyway", conn_get_socket(c)); - break; - /* 1 == test passed... client seems to be ok */ + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] client failed versioncheck", conn_get_socket(c)); + failed = true; } - - versiontag = versioncheck_get_versiontag(conn_get_versioncheck(c)); - - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client matches versiontag \"{}\"", conn_get_socket(c), versiontag); - - if (failed) { - conn_set_state(c, conn_state_untrusted); - bn_int_set(&rpacket->u.server_authreply1.message, SERVER_AUTHREPLY1_MESSAGE_BADVERSION); - packet_append_string(rpacket, ""); - } - else { - char *mpqfilename; - - mpqfilename = autoupdate_check(conn_get_archtag(c), conn_get_clienttag(c), conn_get_gamelang(c), versiontag, NULL); - - /* Only handle updates when there is an update file available. */ - if (mpqfilename != NULL) { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] an upgrade for version {} is available \"{}\"", conn_get_socket(c), versioncheck_get_versiontag(conn_get_versioncheck(c)), mpqfilename); - bn_int_set(&rpacket->u.server_authreply1.message, SERVER_AUTHREPLY1_MESSAGE_UPDATE); - packet_append_string(rpacket, mpqfilename); - } - else { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] no upgrade for {} is available", conn_get_socket(c), versioncheck_get_versiontag(conn_get_versioncheck(c))); - bn_int_set(&rpacket->u.server_authreply1.message, SERVER_AUTHREPLY1_MESSAGE_OK); - packet_append_string(rpacket, ""); - } - - if (mpqfilename) - xfree((void *)mpqfilename); - } - - packet_append_string(rpacket, ""); /* FIXME: what's the second string for? */ - conn_push_outqueue(c, rpacket); - packet_del_ref(rpacket); + } + else + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] client did not request validation", conn_get_socket(c)); } } + + t_packet *rpacket = packet_create(packet_class_bnet); + if (!rpacket) + { + return -1; + } + + packet_set_size(rpacket, sizeof(t_server_authreply1)); + packet_set_type(rpacket, SERVER_AUTHREPLY1); + + if (failed) + { + conn_set_state(c, conn_state_untrusted); + bn_int_set(&rpacket->u.server_authreply1.message, SERVER_AUTHREPLY1_MESSAGE_BADVERSION); + packet_append_string(rpacket, ""); + } + else + { + char *mpqfilename = autoupdate_check(conn_get_archtag(c), conn_get_clienttag(c), conn_get_gamelang(c), conn_get_versioncheck(c)->get_version_tag().c_str(), nullptr); + + /* Only handle updates when there is an update file available. */ + if (mpqfilename != nullptr) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] an upgrade for version {} is available \"{}\"", conn_get_socket(c), conn_get_versioncheck(c)->get_version_tag(), mpqfilename); + bn_int_set(&rpacket->u.server_authreply1.message, SERVER_AUTHREPLY1_MESSAGE_UPDATE); + packet_append_string(rpacket, mpqfilename); + xfree(static_cast(mpqfilename)); + } + else + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] no upgrade for {} is available", conn_get_socket(c), conn_get_versioncheck(c)->get_version_tag()); + bn_int_set(&rpacket->u.server_authreply1.message, SERVER_AUTHREPLY1_MESSAGE_OK); + packet_append_string(rpacket, ""); + } + } + + // FIXME: what's the second string for? + packet_append_string(rpacket, ""); + conn_push_outqueue(c, rpacket); + packet_del_ref(rpacket); + return 0; } @@ -1112,10 +1134,8 @@ namespace pvpgn { char verstr[16]; - char const *exeinfo; char const *versiontag; int failed; - char const *owner; unsigned int count; unsigned int pos; @@ -1123,19 +1143,23 @@ namespace pvpgn count = bn_int_get(packet->u.client_authreq_109.cdkey_number); pos = sizeof(t_client_authreq_109)+(count * sizeof(t_cdkey_info)); - if (!(exeinfo = packet_get_str_const(packet, pos, MAX_EXEINFO_STR))) { + const char * const exeinfo = packet_get_str_const(packet, pos, MAX_EXEINFO_STR); + if (!exeinfo) + { eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad AUTHREQ_109 (missing or too long exeinfo)", conn_get_socket(c)); - exeinfo = "badexe"; failed = 1; } - conn_set_clientexe(c, exeinfo); - pos += std::strlen(exeinfo) + 1; + conn_set_clientexe(c, exeinfo != nullptr ? exeinfo : "badexe"); + pos += std::strlen(exeinfo != nullptr ? exeinfo : "badexe") + 1; - if (!(owner = packet_get_str_const(packet, pos, MAX_OWNER_STR))) { - eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad AUTHREQ_109 (missing or too long owner)", conn_get_socket(c)); - owner = ""; /* maybe owner was missing, use empty string */ + { + const char * const owner = packet_get_str_const(packet, pos, MAX_OWNER_STR); + if (!owner) // maybe owner was missing, use empty string + { + eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad AUTHREQ_109 (missing or too long owner)", conn_get_socket(c)); + } + conn_set_owner(c, owner != nullptr ? owner : ""); } - conn_set_owner(c, owner); conn_set_checksum(c, bn_int_get(packet->u.client_authreq_109.checksum)); conn_set_gameversion(c, bn_int_get(packet->u.client_authreq_109.gameversion)); @@ -1143,63 +1167,67 @@ namespace pvpgn conn_set_clientver(c, verstr); conn_set_clientexe(c, exeinfo); - eventlog(eventlog_level_info, __FUNCTION__, "[{}] CLIENT_AUTHREQ_109 ticks=0x{:08x}, verstr={} exeinfo=\"{}\" versionid=0x{:08x} gameversion=0x{:08x} checksum=0x{:08x}", conn_get_socket(c), bn_int_get(packet->u.client_authreq_109.ticks), verstr, exeinfo, conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c)); + eventlog(eventlog_level_info, __FUNCTION__, "[{}] CLIENT_AUTHREQ_109 ticks=0x{:08x}, verstr={} exeinfo=\"{}\" versionid=0x{:08x} gameversion=0x{:08x} checksum=0x{:08x}", conn_get_socket(c), bn_int_get(packet->u.client_authreq_109.ticks), verstr, exeinfo != nullptr ? exeinfo : "badexe", conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c)); - if ((rpacket = packet_create(packet_class_bnet))) { + if ((rpacket = packet_create(packet_class_bnet))) + { packet_set_size(rpacket, sizeof(t_server_authreply_109)); packet_set_type(rpacket, SERVER_AUTHREPLY_109); if (!conn_get_versioncheck(c) && prefs_get_skip_versioncheck()) + { eventlog(eventlog_level_info, __FUNCTION__, "[{}] skip versioncheck enabled and client did not request validation", conn_get_socket(c)); + } + else if (prefs_get_allow_unknown_version()) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] skipping versioncheck validation because allow_unknown_version is true", conn_get_socket(c)); + } else - switch (versioncheck_validate(conn_get_versioncheck(c), conn_get_archtag(c), conn_get_clienttag(c), exeinfo, conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c))) { - case -1: /* failed test... client has been modified */ - if (!prefs_get_allow_bad_version()) { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client failed test (closing connection)", conn_get_socket(c)); - failed = 1; + { + if (conn_get_versioncheck(c)) + { + if (conn_get_versioncheck(c)->validate_checkrevision_data(bn_int_get(packet->u.client_authreq1.gameversion), bn_int_get(packet->u.client_authreq1.checksum), exeinfo == nullptr ? "badexe" : exeinfo)) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] client matches versiontag \"{}\"", conn_get_socket(c), conn_get_versioncheck(c)->get_version_tag()); } else - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client failed test, allowing anyway", conn_get_socket(c)); - break; - case 0: /* not listed in table... can't tell if client has been modified */ - if (!prefs_get_allow_unknown_version()) { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] unable to test client (closing connection)", conn_get_socket(c)); - failed = 1; + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] client failed versioncheck", conn_get_socket(c)); + failed = true; } - else - eventlog(eventlog_level_info, __FUNCTION__, "[{}] unable to test client, allowing anyway", conn_get_socket(c)); - break; - /* 1 == test passed... client seems to be ok */ + } + else + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] client did not request validation", conn_get_socket(c)); + } } - versiontag = versioncheck_get_versiontag(conn_get_versioncheck(c)); - - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client matches versiontag \"{}\"", conn_get_socket(c), versiontag); - - if (failed) { + if (failed) + { conn_set_state(c, conn_state_untrusted); bn_int_set(&rpacket->u.server_authreply_109.message, SERVER_AUTHREPLY_109_MESSAGE_BADVERSION); packet_append_string(rpacket, ""); } - else { - char *mpqfilename; - - mpqfilename = autoupdate_check(conn_get_archtag(c), conn_get_clienttag(c), conn_get_gamelang(c), versiontag, NULL); + else + { + char *mpqfilename = autoupdate_check(conn_get_archtag(c), conn_get_clienttag(c), conn_get_gamelang(c), conn_get_versioncheck(c)->get_version_tag().c_str(), NULL); /* Only handle updates when there is an update file available. */ - if (mpqfilename != NULL) { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] an upgrade for {} is available \"{}\"", conn_get_socket(c), versiontag, mpqfilename); + if (mpqfilename != nullptr) + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] an upgrade for {} is available \"{}\"", conn_get_socket(c), conn_get_versioncheck(c)->get_version_tag(), mpqfilename); bn_int_set(&rpacket->u.server_authreply_109.message, SERVER_AUTHREPLY_109_MESSAGE_UPDATE); packet_append_string(rpacket, mpqfilename); + + xfree((void *)mpqfilename); } - else { - eventlog(eventlog_level_info, __FUNCTION__, "[{}] no upgrade for {} is available", conn_get_socket(c), versiontag); + else + { + eventlog(eventlog_level_info, __FUNCTION__, "[{}] no upgrade for {} is available", conn_get_socket(c), conn_get_versioncheck(c)->get_version_tag()); bn_int_set(&rpacket->u.server_authreply_109.message, SERVER_AUTHREPLY_109_MESSAGE_OK); packet_append_string(rpacket, ""); } - if (mpqfilename) - xfree((void *)mpqfilename); } conn_push_outqueue(c, rpacket); @@ -2427,97 +2455,163 @@ namespace pvpgn static int _client_atfriendscreen(t_connection * c, t_packet const *const packet) { - char const *myusername; - char const *fname; - t_connection *dest_c; - unsigned char f_cnt = 0; - t_account *account; - t_packet *rpacket; - char const *vt; - char const *nvt; - t_friend *fr; - t_list *flist; - t_elem *curr; - t_channel *mychannel, *chan; - int publicchan = 1; + eventlog(eventlog_level_debug, __FUNCTION__, "[{}] got CLIENT_ARRANGEDTEAM_FRIENDSCREEN packet", conn_get_socket(c)); - eventlog(eventlog_level_info, __FUNCTION__, "[{}] got CLIENT_ARRANGEDTEAM_FRIENDSCREEN packet", conn_get_socket(c)); - - myusername = conn_get_username(c); - eventlog(eventlog_level_trace, "handle_bnet", "[{}] AT - Got Username %s", conn_get_socket(c), myusername); - - if (!(rpacket = packet_create(packet_class_bnet))) { - eventlog(eventlog_level_error, "handle_bnet", "[{}] AT - can't create friendscreen server packet", conn_get_socket(c)); + const char *my_username = conn_get_username(c); + if (!my_username) + { return -1; } + t_channel *my_channel = conn_get_channel(c); + int my_channel_is_public = 1; + if (my_channel) + { + my_channel_is_public = channel_get_flags(my_channel) & channel_flags_public; + } + + + t_packet *rpacket = packet_create(packet_class_bnet); + if (!rpacket) + { + eventlog(eventlog_level_error, __FUNCTION__, "[{}] could not create friendscreen server packet", conn_get_socket(c)); + return -1; + } packet_set_size(rpacket, sizeof(t_server_arrangedteam_friendscreen)); packet_set_type(rpacket, SERVER_ARRANGEDTEAM_FRIENDSCREEN); - mychannel = conn_get_channel(c); - if ((mychannel)) - publicchan = channel_get_flags(mychannel) & channel_flags_public; + std::uint8_t available_players = 0; - vt = versioncheck_get_versiontag(conn_get_versioncheck(c)); - flist = account_get_friends(conn_get_account(c)); - LIST_TRAVERSE(flist, curr) { - if (!(fr = (t_friend*)elem_get_data(curr))) { + // begin search for mutual and available friends + t_list *my_friend_list = account_get_friends(conn_get_account(c)); + t_elem *entry; + LIST_TRAVERSE(my_friend_list, entry) + { + t_friend *_friend = static_cast(elem_get_data(entry)); + if (!_friend) + { eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list"); continue; } - account = friend_get_account(fr); - if (!(dest_c = connlist_find_connection_by_account(account))) - continue; // if user is offline, then continue to next friend - nvt = versioncheck_get_versiontag(conn_get_versioncheck(dest_c)); - if (vt && nvt && std::strcmp(vt, nvt)) - continue; /* friend is using another game/version */ + if (available_players == std::numeric_limits::max()) + { + eventlog(eventlog_level_info, __FUNCTION__, "Reached maximum amount of available players to send in packet"); + break; + } - if (friend_get_mutual(fr)) { - if (conn_get_dndstr(dest_c)) - continue; // user is dnd - if (conn_get_awaystr(dest_c)) - continue; // user is away - if (conn_get_game(dest_c)) - continue; // user is some game - if (!(chan = conn_get_channel(dest_c))) + // skip non-mutual friends + if (friend_get_mutual(_friend) == FRIEND_NOTMUTUAL) + { + continue; + } + + t_account *friend_account = friend_get_account(_friend); + t_connection *friend_connection = connlist_find_connection_by_account(friend_account); + // if user is offline, then continue to next friend + if (!friend_connection) + { + continue; + } + + const std::string my_version_tag = conn_get_versioncheck(c) ? conn_get_versioncheck(c)->get_version_tag() : ""; + const std::string friend_version_tag = conn_get_versioncheck(c) ? conn_get_versioncheck(friend_connection)->get_version_tag() : ""; + // friend is using another game or is on a different version + if (my_version_tag != friend_version_tag) + { + continue; + } + + // friend has Do Not Disturb mode enabled + if (conn_get_dndstr(friend_connection)) + { + continue; + } + + // friend is away + if (conn_get_awaystr(friend_connection)) + { + continue; + } + + // friend is not in a channel + t_channel *friend_channel = conn_get_channel(friend_connection); + if (!friend_channel) + { + continue; + } + + // // don't list YET if in same private channel + if (!my_channel_is_public && (friend_channel == my_channel)) + { + continue; + } + + const char *friend_name = account_get_name(friend_account); + eventlog(eventlog_level_trace, __FUNCTION__, "Friend {} is available for an AT Game.", friend_name); + available_players += 1; + packet_append_string(rpacket, friend_name); + } + + + // now list matching users in same private chan + if (!my_channel_is_public) + { + for (t_connection *user_connection = channel_get_first(my_channel); user_connection; user_connection = channel_get_next()) + { + if (available_players == std::numeric_limits::max()) + { + eventlog(eventlog_level_info, __FUNCTION__, "Reached maximum amount of available players to send in packet"); + break; + } + + // skip self + if (user_connection == c) + { continue; - if (!publicchan && (chan == mychannel)) - continue; // don't list YET if in same private channel + } - fname = account_get_name(account); - eventlog(eventlog_level_trace, "handle_bnet", "AT - Friend: {} is available for a AT Game.", fname); - f_cnt++; - packet_append_string(rpacket, fname); + const std::string my_version_tag = conn_get_versioncheck(c) ? conn_get_versioncheck(c)->get_version_tag() : ""; + const std::string user_version_tag = conn_get_versioncheck(c) ? conn_get_versioncheck(user_connection)->get_version_tag() : ""; + // user is using another game or is on a different version + if (my_version_tag != user_version_tag) + { + continue; + } + + // user is dnd + if (conn_get_dndstr(user_connection)) + { + continue; + } + + // user is away + if (conn_get_awaystr(user_connection)) + { + continue; + } + + const char *username = account_get_name(conn_get_account(user_connection)); + if (!username) + { + continue; + } + + eventlog(eventlog_level_trace, __FUNCTION__, "user {} in private channel {} is available for an AT Game.", username, channel_get_name(my_channel)); + available_players += 1; + packet_append_string(rpacket, username); } } - if (!publicchan) { // now list matching users in same private chan - for (dest_c = channel_get_first(mychannel); dest_c; dest_c = channel_get_next()) { - if (dest_c == c) - continue; // don'tlist yourself - nvt = versioncheck_get_versiontag(conn_get_versioncheck(dest_c)); - if (vt && nvt && std::strcmp(vt, nvt)) - continue; /* user is using another game/version */ - if (conn_get_dndstr(dest_c)) - continue; // user is dnd - if (conn_get_awaystr(dest_c)) - continue; // user is away - if (!(conn_get_account(dest_c))) - continue; - fname = account_get_name(conn_get_account(dest_c)); - eventlog(eventlog_level_trace, "handle_bnet", "AT - user in private channel: {} is available for a AT Game.", fname); - f_cnt++; - packet_append_string(rpacket, fname); - } + if (available_players == 0) + { + eventlog(eventlog_level_info, __FUNCTION__, "No available players"); } - if (!f_cnt) - eventlog(eventlog_level_info, "handle_bnet", "AT - no friends available for AT game."); - bn_byte_set(&rpacket->u.server_arrangedteam_friendscreen.f_count, f_cnt); + bn_byte_set(&rpacket->u.server_arrangedteam_friendscreen.f_count, available_players); + conn_push_outqueue(c, rpacket); - packet_del_ref(rpacket); return 0; @@ -3653,12 +3747,12 @@ namespace pvpgn } if (conn_get_versioncheck(cbdata->c) && conn_get_versioncheck(game_get_owner(game)) && - versioncheck_get_versiontag(conn_get_versioncheck(cbdata->c)) && - versioncheck_get_versiontag(conn_get_versioncheck(game_get_owner(game))) && - std::strcmp(versioncheck_get_versiontag(conn_get_versioncheck(cbdata->c)), versioncheck_get_versiontag(conn_get_versioncheck(game_get_owner(game)))) != 0) { + conn_get_versioncheck(cbdata->c)->get_version_tag() != conn_get_versioncheck(game_get_owner(game))->get_version_tag()) + { eventlog(eventlog_level_debug, __FUNCTION__, "[{}] not listing because game is wrong versiontag", conn_get_socket(cbdata->c)); return 0; } + bn_short_set(&glgame.gametype, gtype_to_bngtype(game_get_type(game))); bn_short_set(&glgame.unknown1, SERVER_GAMELISTREPLY_GAME_UNKNOWN1); bn_short_set(&glgame.unknown3, SERVER_GAMELISTREPLY_GAME_UNKNOWN3); @@ -4716,33 +4810,23 @@ namespace pvpgn static int _client_changeclient(t_connection * c, t_packet const *const packet) { - t_versioncheck *vc; - - if (packet_get_size(packet) < sizeof(t_client_changeclient)) { + if (packet_get_size(packet) < sizeof(t_client_changeclient)) + { eventlog(eventlog_level_error, __FUNCTION__, "[{}] got bad CLIENT_CHANGECLIENT packet (expected {} bytes, got {})", conn_get_socket(c), sizeof(t_client_changeclient), packet_get_size(packet)); return -1; } - if (tag_check_in_list(bn_int_get(packet->u.client_changeclient.clienttag), prefs_get_allowed_clients())) { + if (conn_get_clienttag(c) != CLIENTTAG_WAR3XP_UINT + || bn_int_get(packet->u.client_changeclient.clienttag) != CLIENTTAG_WARCRAFT3_UINT) + { + eventlog(eventlog_level_error, __FUNCTION__, "[{}] invalid attempt to change client from {X} to {X}", conn_get_socket(c), conn_get_clienttag(c), bn_int_get(packet->u.client_changeclient.clienttag)); conn_set_state(c, conn_state_destroy); - return 0; + return -1; } conn_set_clienttag(c, bn_int_get(packet->u.client_changeclient.clienttag)); - vc = conn_get_versioncheck(c); - versioncheck_set_versiontag(vc, clienttag_uint_to_str(conn_get_clienttag(c))); - - if (vc && versioncheck_get_versiontag(vc)) { - switch (versioncheck_validate(vc, conn_get_archtag(c), conn_get_clienttag(c), conn_get_clientexe(c), conn_get_versionid(c), conn_get_gameversion(c), conn_get_checksum(c))) { - case -1: /* failed test... client has been modified */ - case 0: /* not listed in table... can't tell if client has been modified */ - eventlog(eventlog_level_error, __FUNCTION__, "[{}] error revalidating, allowing anyway", conn_get_socket(c)); - break; - } - - eventlog(eventlog_level_info, __FUNCTION__, "[{}] client versiontag set to \"{}\"", conn_get_socket(c), versioncheck_get_versiontag(vc)); - } + eventlog(eventlog_level_info, __FUNCTION__, "[{}] changed client to {X}", conn_get_socket(c), bn_int_get(packet->u.client_changeclient.clienttag)); return 0; } diff --git a/src/bnetd/main.cpp b/src/bnetd/main.cpp index 323226e..86508a9 100644 --- a/src/bnetd/main.cpp +++ b/src/bnetd/main.cpp @@ -380,8 +380,12 @@ int pre_server_startup(void) if (autoupdate_load(prefs_get_mpqfile()) < 0) eventlog(eventlog_level_error, __FUNCTION__, "could not load autoupdate list"); - if (versioncheck_load(prefs_get_versioncheck_file()) < 0) + + if (!load_versioncheck_conf(prefs_get_versioncheck_file())) + { eventlog(eventlog_level_error, __FUNCTION__, "could not load versioncheck list"); + } + if (news_load(prefs_get_newsfile()) < 0) eventlog(eventlog_level_error, __FUNCTION__, "could not load news list"); watchlist.reset(new WatchComponent()); @@ -449,7 +453,7 @@ void post_server_shutdown(int status) attrlayer_cleanup(); watchlist.reset(); news_unload(); - versioncheck_unload(); + unload_versioncheck_conf(); autoupdate_unload(); ipbanlist_save(prefs_get_ipbanfile()); ipbanlist_destroy(); diff --git a/src/bnetd/server.cpp b/src/bnetd/server.cpp index 97ac856..8b88fcf 100644 --- a/src/bnetd/server.cpp +++ b/src/bnetd/server.cpp @@ -1415,9 +1415,11 @@ namespace pvpgn if (do_restart == restart_mode_all || do_restart == restart_mode_versioncheck) { - versioncheck_unload(); - if (versioncheck_load(prefs_get_versioncheck_file()) < 0) + unload_versioncheck_conf(); + if (!load_versioncheck_conf(prefs_get_versioncheck_file())) + { eventlog(eventlog_level_error, __FUNCTION__, "could not load versioncheck list"); + } } if (do_restart == restart_mode_all || do_restart == restart_mode_ipbans) diff --git a/src/bnetd/versioncheck.cpp b/src/bnetd/versioncheck.cpp index 799cb06..3ae0862 100644 --- a/src/bnetd/versioncheck.cpp +++ b/src/bnetd/versioncheck.cpp @@ -22,638 +22,393 @@ #define VERSIONCHECK_INTERNAL_ACCESS #include "versioncheck.h" -#include -#include -#include -#include #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include #include "compat/strcasecmp.h" -#include "common/list.h" -#include "common/xalloc.h" +#include "common/format.h" #include "common/eventlog.h" #include "common/util.h" #include "common/field_sizes.h" #include "common/token.h" #include "common/proginfo.h" -#include "common/xstring.h" + +#include "json/json.hpp" #include "prefs.h" #include "common/setup_after.h" +using json = nlohmann::json; + + namespace pvpgn { namespace bnetd { - static t_list * versioninfo_head = NULL; - static t_versioncheck dummyvc = { "A=42 B=42 C=42 4 A=A^S B=B^B C=C^C A=A^S", "IX86ver1.mpq", "NoVC" }; + std::forward_list vc_entries = {}; - static int versioncheck_compare_exeinfo(t_parsed_exeinfo * pattern, t_parsed_exeinfo * match); + bool versioncheck_conf_is_loaded = false; - extern t_versioncheck * versioncheck_create(t_tag archtag, t_tag clienttag) + struct file_metadata parse_file_metadata(const std::string& unparsed_metadata); + bool compare_file_metadata(const struct file_metadata& pattern, const struct file_metadata& match, bool skip_timestamp_match); + + + bool load_versioncheck_conf(const std::string& filename) { - t_elem const * curr; - t_versioninfo * vi; - t_versioncheck * vc; - char archtag_str[5]; - char clienttag_str[5]; - - LIST_TRAVERSE_CONST(versioninfo_head, curr) + if (versioncheck_conf_is_loaded) { - if (!(vi = (t_versioninfo*)elem_get_data(curr))) /* should not happen */ - { - eventlog(eventlog_level_error, __FUNCTION__, "version list contains NULL item"); - continue; - } - - eventlog(eventlog_level_debug, __FUNCTION__, "version check entry archtag={}, clienttag={}", - tag_uint_to_str(archtag_str, vi->archtag), - tag_uint_to_str(clienttag_str, vi->clienttag)); - - if (vi->archtag != archtag) - continue; - if (vi->clienttag != clienttag) - continue; - - /* FIXME: randomize the selection if more than one match */ - vc = (t_versioncheck*)xmalloc(sizeof(t_versioncheck)); - vc->eqn = xstrdup(vi->eqn); - vc->mpqfile = xstrdup(vi->mpqfile); - vc->versiontag = xstrdup(tag_uint_to_str(clienttag_str, clienttag)); - - return vc; + eventlog(eventlog_level_error, __FUNCTION__, "Could not load {}, a versioncheck configuration file is already loaded", filename); + return false; } - /* - * No entries in the file that match, return the dummy because we have to send - * some equation and auth mpq to the client. The client is not going to pass the - * validation later unless skip_versioncheck or allow_unknown_version is enabled. - */ - return &dummyvc; - } - - - extern int versioncheck_destroy(t_versioncheck * vc) - { - if (!vc) + std::ifstream file_stream(filename, std::ios::in); + if (!file_stream.is_open()) { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL vc"); - return -1; + eventlog(eventlog_level_error, __FUNCTION__, "Could not open file \"{}\" for reading", filename); + return false; } - if (vc == &dummyvc) - return 0; - - xfree((void *)vc->versiontag); - xfree((void *)vc->mpqfile); - xfree((void *)vc->eqn); - xfree(vc); - - return 0; - } - - extern int versioncheck_set_versiontag(t_versioncheck * vc, char const * versiontag) - { - if (!vc) { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL vc"); - return -1; - } - if (!versiontag) { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL versiontag"); - return -1; - } - - if (vc->versiontag != NULL) xfree((void *)vc->versiontag); - vc->versiontag = xstrdup(versiontag); - return 0; - } - - - extern char const * versioncheck_get_versiontag(t_versioncheck const * vc) - { - if (!vc) { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL vc"); - return NULL; - } - - return vc->versiontag; - } - - - extern char const * versioncheck_get_mpqfile(t_versioncheck const * vc) - { - if (!vc) + json j; + try { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL vc"); - return NULL; + file_stream >> j; } - - return vc->mpqfile; - } - - - extern char const * versioncheck_get_eqn(t_versioncheck const * vc) - { - if (!vc) + catch (const std::exception& e) { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL vc"); - return NULL; + eventlog(eventlog_level_error, __FUNCTION__, "Could not parse JSON data: {}", e.what()); + return false; } - return vc->eqn; - } - - t_parsed_exeinfo * parse_exeinfo(char const * exeinfo) - { - t_parsed_exeinfo * parsed_exeinfo; - - if (!exeinfo) { - return NULL; - } - - parsed_exeinfo = (t_parsed_exeinfo*)xmalloc(sizeof(t_parsed_exeinfo)); - parsed_exeinfo->exe = xstrdup(exeinfo); - parsed_exeinfo->time = 0; - parsed_exeinfo->size = 0; - - if (std::strcmp(prefs_get_version_exeinfo_match(), "parse") == 0) + + int success_count = 0; + int total_count = 0; + for (auto jclient : json::iterator_wrapper(j)) { - struct std::tm t1; - char *exe; - char mask[MAX_EXEINFO_STR + 1]; - char * marker; - unsigned size; - char time_invalid = 0; - - if ((exeinfo[0] == '\0') || //happens when using war3-noCD and having deleted war3.org - (std::strcmp(exeinfo, "badexe") == 0)) //happens when AUTHREQ had no owner/exeinfo entry + total_count += jclient.value().size(); + for (const auto& entry : jclient.value()) { - xfree((void *)parsed_exeinfo->exe); - xfree((void *)parsed_exeinfo); - eventlog(eventlog_level_error, __FUNCTION__, "found empty exeinfo"); - return NULL; - } - - std::memset(&t1, 0, sizeof(t1)); - t1.tm_isdst = -1; - - exeinfo = strreverse((char *)exeinfo); - if (!(marker = std::strchr((char *)exeinfo, ' '))) - { - xfree((void *)parsed_exeinfo->exe); - xfree((void *)parsed_exeinfo); - return NULL; - } - for (; marker[0] == ' '; marker++); - - if (!(marker = std::strchr(marker, ' '))) - { - xfree((void *)parsed_exeinfo->exe); - xfree((void *)parsed_exeinfo); - return NULL; - } - for (; marker[0] == ' '; marker++); - - if (!(marker = std::strchr(marker, ' '))) - { - xfree((void *)parsed_exeinfo->exe); - xfree((void *)parsed_exeinfo); - return NULL; - } - for (; marker[0] == ' '; marker++); - marker--; - marker[0] = '\0'; - marker++; - - exe = xstrdup(marker); - xfree((void *)parsed_exeinfo->exe); - parsed_exeinfo->exe = strreverse((char *)exe); - - exeinfo = strreverse((char *)exeinfo); - - std::sprintf(mask, "%%02u/%%02u/%%u %%02u:%%02u:%%02u %%u"); - - if (std::sscanf(exeinfo, mask, &t1.tm_mon, &t1.tm_mday, &t1.tm_year, &t1.tm_hour, &t1.tm_min, &t1.tm_sec, &size) != 7) { - if (std::sscanf(exeinfo, "%*s %*s %u", &size) != 1) + try { + unsigned long versionid = std::strtoul(entry["versionbyte"].get().c_str(), nullptr, 0); + if (versionid == ULONG_MAX || versionid == 0) + { + throw std::runtime_error("Invalid versionbyte \"" + entry["versionbyte"].get() + "\" in entry \"" + entry["title"].get() + "\""); + } - eventlog(eventlog_level_warn, __FUNCTION__, "parser error while parsing pattern \"{}\"", exeinfo); - xfree((void *)parsed_exeinfo->exe); - xfree((void *)parsed_exeinfo); - return NULL; /* neq */ + unsigned long game_version; + if (verstr_to_vernum(entry["version"].get().c_str(), &game_version) < 0) + { + throw std::runtime_error("Invalid version \"" + entry["version"].get() + "\" in entry \"" + entry["title"].get() + "\""); + } + + unsigned long checksum = std::strtoul(entry["hash"].get().c_str(), nullptr, 0); + if (checksum == ULONG_MAX || checksum == 0) + { + throw std::runtime_error("Invalid hash \"" + entry["hash"].get() + "\" in entry \"" + entry["title"].get() + "\""); + } + + t_tag architecture = tag_str_to_uint(entry["architecture"].get().c_str()); + if (!tag_check_arch(architecture)) + { + throw std::runtime_error("Invalid architecture \"" + entry["architecture"].get() + "\" in entry \"" + entry["title"].get() + "\""); + } + + t_tag client = tag_str_to_uint(jclient.key().c_str()); + if (!tag_check_client(client)) + { + throw std::runtime_error("Invalid client \"" + entry["client"].get() + "\" in entry \"" + entry["title"].get() + "\""); + } + + struct file_metadata metadata; + if (entry["file_metadata"].get() == "NULL") + { + metadata = {}; + } + else + { + metadata = parse_file_metadata(entry["file_metadata"].get()); + if (metadata.filename.empty() + && metadata.file_size == 0 + && metadata.timestamp == 0) + { + throw std::runtime_error("Invalid file_metadata \"" + entry["file_metadata"].get() + "\" in entry \"" + entry["title"].get() + "\""); + } + } + + // unable to check for errors at this time + std::string equation = entry["equation"].get(); + + std::string checkrevision_filename = entry["checkrevision_file"].get(); + + std::string version_tag = entry["versiontag"].get(); + + vc_entries.push_front(VersionCheck(versionid, game_version, checksum, architecture, client, + metadata, equation, checkrevision_filename, version_tag)); + + success_count += 1; } - time_invalid = 1; - } - - /* Now we have a Y2K problem :) Thanks for using a 2 digit decimal years, Blizzard. */ - /* 00-79 -> 2000-2079 - * * 80-99 -> 1980-1999 - * * 100+ unchanged */ - if (t1.tm_year < 80) - t1.tm_year = t1.tm_year + 100; - - if (time_invalid) - parsed_exeinfo->time = static_cast(-1); - else - parsed_exeinfo->time = std::mktime(&t1); - parsed_exeinfo->size = size; - } - - return parsed_exeinfo; - } - - - /* This implements some dumb kind of pattern matching. Any '?' - * signs in the pattern are treated as "don't care" signs. This - * means that it doesn't matter what's on this place in the match. - */ - //static int versioncheck_compare_exeinfo(char const * pattern, char const * match) - static int versioncheck_compare_exeinfo(t_parsed_exeinfo * pattern, t_parsed_exeinfo * match) - { - assert(pattern); - assert(match); - - if (!strcasecmp(prefs_get_version_exeinfo_match(), "none")) - return 0; /* ignore exeinfo */ - - if (std::strlen(pattern->exe) != std::strlen(match->exe)) - return 1; /* neq */ - - if (std::strcmp(prefs_get_version_exeinfo_match(), "exact") == 0) { - return strcasecmp(pattern->exe, match->exe); - } - else if (std::strcmp(prefs_get_version_exeinfo_match(), "exactcase") == 0) { - return std::strcmp(pattern->exe, match->exe); - } - else if (std::strcmp(prefs_get_version_exeinfo_match(), "wildcard") == 0) { - unsigned int i; - size_t pattern_exelen = std::strlen(pattern->exe); - for (i = 0; i < pattern_exelen; i++) - if ((pattern->exe[i] != '?') && /* out "don't care" sign */ - (safe_toupper(pattern->exe[i]) != safe_toupper(match->exe[i]))) - return 1; /* neq */ - return 0; /* ok */ - } - else if (std::strcmp(prefs_get_version_exeinfo_match(), "parse") == 0) { - - if (strcasecmp(pattern->exe, match->exe) != 0) - { - eventlog(eventlog_level_trace, __FUNCTION__, "filename differs"); - return 1; /* neq */ - } - if (pattern->size != match->size) - { - eventlog(eventlog_level_trace, __FUNCTION__, "size differs"); - return 1; /* neq */ - } - if ((pattern->time != -1) && prefs_get_version_exeinfo_maxdiff() && (abs(pattern->time - match->time) > (signed)prefs_get_version_exeinfo_maxdiff())) - { - eventlog(eventlog_level_trace, __FUNCTION__, "time differs by {}", abs(pattern->time - match->time)); - return 1; - } - return 0; /* ok */ - } - else { - eventlog(eventlog_level_error, __FUNCTION__, "unknown version exeinfo match method \"{}\"", prefs_get_version_exeinfo_match()); - return -1; /* neq/fail */ - } - } - - void free_parsed_exeinfo(t_parsed_exeinfo * parsed_exeinfo) - { - if (parsed_exeinfo) - { - if (parsed_exeinfo->exe) - xfree((void *)parsed_exeinfo->exe); - xfree((void *)parsed_exeinfo); - } - } - - extern int versioncheck_validate(t_versioncheck * vc, t_tag archtag, t_tag clienttag, char const * exeinfo, unsigned long versionid, unsigned long gameversion, unsigned long checksum) - { - t_elem const * curr; - t_versioninfo * vi; - int badexe, badcs; - t_parsed_exeinfo * parsed_exeinfo; - - if (!vc) - { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL vc"); - return -1; - } - - badexe = badcs = 0; - parsed_exeinfo = parse_exeinfo(exeinfo); - LIST_TRAVERSE_CONST(versioninfo_head, curr) - { - if (!(vi = (t_versioninfo*)elem_get_data(curr))) /* should not happen */ - { - eventlog(eventlog_level_error, __FUNCTION__, "version list contains NULL item"); - continue; - } - - if (vi->archtag != archtag) - continue; - if (vi->clienttag != clienttag) - continue; - if (std::strcmp(vi->eqn, vc->eqn) != 0) - continue; - if (std::strcmp(vi->mpqfile, vc->mpqfile) != 0) - continue; - - if (vi->versionid && vi->versionid != versionid) - continue; - - if (vi->gameversion && vi->gameversion != gameversion) - continue; - - - if ((!(parsed_exeinfo)) || (vi->parsed_exeinfo && (versioncheck_compare_exeinfo(vi->parsed_exeinfo, parsed_exeinfo) != 0))) - { - /* - * Found an entry matching but the exeinfo doesn't match. - * We need to rember this because if no other matching versions are found - * we will return badversion. - */ - badexe = 1; - } - else - badexe = 0; - - if (vi->checksum && vi->checksum != checksum) - { - /* - * Found an entry matching but the checksum doesn't match. - * We need to rember this because if no other matching versions are found - * we will return badversion. - */ - badcs = 1; - } - else - badcs = 0; - - if (vc->versiontag) - xfree((void *)vc->versiontag); - vc->versiontag = xstrdup(vi->versiontag); - - if (badexe || badcs) - continue; - - /* Ok, version and checksum matches or exeinfo/checksum are disabled - * anyway we have found a complete match */ - eventlog(eventlog_level_info, __FUNCTION__, "got a matching entry: {}", vc->versiontag); - free_parsed_exeinfo(parsed_exeinfo); - return 1; - } - - if (badcs) /* A match was found but the checksum was different */ - { - eventlog(eventlog_level_info, __FUNCTION__, "bad checksum, closest match is: {}", vc->versiontag); - free_parsed_exeinfo(parsed_exeinfo); - return -1; - } - if (badexe) /* A match was found but the exeinfo string was different */ - { - eventlog(eventlog_level_info, __FUNCTION__, "bad exeinfo, closest match is: {}", vc->versiontag); - free_parsed_exeinfo(parsed_exeinfo); - return -1; - } - - /* No match in list */ - eventlog(eventlog_level_info, __FUNCTION__, "no match in list, setting to: {}", vc->versiontag); - free_parsed_exeinfo(parsed_exeinfo); - return 0; - } - - extern int versioncheck_load(char const * filename) - { - std::FILE * fp; - unsigned int line; - unsigned int pos; - char * buff; - char * temp; - char const * eqn; - char const * mpqfile; - char const * archtag; - char const * clienttag; - char const * exeinfo; - char const * versionid; - char const * gameversion; - char const * checksum; - char const * versiontag; - t_versioninfo * vi; - - if (!filename) - { - eventlog(eventlog_level_error, __FUNCTION__, "got NULL filename"); - return -1; - } - - if (!(versioninfo_head = list_create())) - { - eventlog(eventlog_level_error, __FUNCTION__, "could create list"); - return -1; - } - if (!(fp = std::fopen(filename, "r"))) - { - eventlog(eventlog_level_error, __FUNCTION__, "could not open file \"{}\" for reading (std::fopen: {})", filename, std::strerror(errno)); - list_destroy(versioninfo_head); - versioninfo_head = NULL; - return -1; - } - - line = 1; - for (; (buff = file_get_line(fp)); line++) - { - for (pos = 0; buff[pos] == '\t' || buff[pos] == ' '; pos++); - if (buff[pos] == '\0' || buff[pos] == '#') - { - continue; - } - if ((temp = std::strrchr(buff, '#'))) - { - unsigned int len; - unsigned int endpos; - - *temp = '\0'; - len = std::strlen(buff) + 1; - for (endpos = len - 1; buff[endpos] == '\t' || buff[endpos] == ' '; endpos--); - buff[endpos + 1] = '\0'; - } - - if (!(eqn = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing eqn near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(mpqfile = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing mpqfile near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(archtag = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing archtag near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(clienttag = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing clienttag near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(exeinfo = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing exeinfo near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(versionid = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing versionid near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(gameversion = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing gameversion near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(checksum = next_token(buff, &pos))) - { - eventlog(eventlog_level_error, __FUNCTION__, "missing checksum near line {} of file \"{}\"", line, filename); - continue; - } - line++; - if (!(versiontag = next_token(buff, &pos))) - { - versiontag = NULL; - } - - vi = (t_versioninfo*)xmalloc(sizeof(t_versioninfo)); - vi->eqn = xstrdup(eqn); - vi->mpqfile = xstrdup(mpqfile); - if (std::strlen(archtag) != 4) - { - eventlog(eventlog_level_error, __FUNCTION__, "invalid arch tag on line {} of file \"{}\"", line, filename); - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - xfree(vi); - continue; - } - if (!tag_check_arch((vi->archtag = tag_str_to_uint(archtag)))) - { - eventlog(eventlog_level_error, __FUNCTION__, "got unknown archtag \"{}\"", archtag); - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - xfree(vi); - continue; - } - if (std::strlen(clienttag) != 4) - { - eventlog(eventlog_level_error, __FUNCTION__, "invalid client tag on line {} of file \"{}\"", line, filename); - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - xfree(vi); - continue; - } - if (!tag_check_client((vi->clienttag = tag_str_to_uint(clienttag)))) - { - eventlog(eventlog_level_error, __FUNCTION__, "got unknown clienttag\"{}\"", clienttag); - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - xfree(vi); - continue; - } - if (std::strcmp(exeinfo, "NULL") == 0) - vi->parsed_exeinfo = NULL; - else - { - if (!(vi->parsed_exeinfo = parse_exeinfo(exeinfo))) + catch (const std::exception& e) { - eventlog(eventlog_level_error, __FUNCTION__, "encountered an error while parsing exeinfo"); - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - xfree(vi); + eventlog(eventlog_level_error, __FUNCTION__, "{}", e.what()); continue; } } - - vi->versionid = std::strtoul(versionid, NULL, 0); - if (verstr_to_vernum(gameversion, &vi->gameversion) < 0) - { - eventlog(eventlog_level_error, __FUNCTION__, "malformed version on line {} of file \"{}\"", line, filename); - xfree((void *)vi->parsed_exeinfo); /* avoid warning */ - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - xfree(vi); - continue; - } - - vi->checksum = std::strtoul(checksum, NULL, 0); - if (versiontag) - vi->versiontag = xstrdup(versiontag); - else - vi->versiontag = NULL; - - - list_append_data(versioninfo_head, vi); } - file_get_line(NULL); // clear file_get_line buffer - if (std::fclose(fp) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not close versioncheck file \"{}\" after reading (std::fclose: {})", filename, std::strerror(errno)); + eventlog(eventlog_level_info, __FUNCTION__, "Successfully loaded {} out of {} versioncheck entries", success_count, total_count); - return 0; + versioncheck_conf_is_loaded = true; + + return true; } - - extern int versioncheck_unload(void) + void unload_versioncheck_conf() { - t_elem * curr; - t_versioninfo * vi; - - if (versioninfo_head) + if (versioncheck_conf_is_loaded) { - LIST_TRAVERSE(versioninfo_head, curr) + vc_entries.clear(); + + eventlog(eventlog_level_info, __FUNCTION__, "Successfully unloaded all version check entries"); + + versioncheck_conf_is_loaded = false; + } + } + + const VersionCheck& select_versioncheck_entry(t_tag architecture, t_tag client, std::uint32_t version_id) + { + static const VersionCheck invalid_entry("IX86ver1.mpq", "A=42 B=42 C=42 4 A=A^S B=B^B C=C^C A=A^S", "NoVC"); + + for (const auto& entry : vc_entries) + { + if (entry.m_architecture == architecture + || entry.m_client == client + || entry.m_version_id == version_id) { - if (!(vi = (t_versioninfo*)elem_get_data(curr))) /* should not happen */ - { - eventlog(eventlog_level_error, __FUNCTION__, "version list contains NULL item"); - continue; - } - - if (list_remove_elem(versioninfo_head, &curr) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not remove item from list"); - - if (vi->parsed_exeinfo) - { - if (vi->parsed_exeinfo->exe) - xfree((void *)vi->parsed_exeinfo->exe); - xfree((void *)vi->parsed_exeinfo); /* avoid warning */ - } - xfree((void *)vi->mpqfile); /* avoid warning */ - xfree((void *)vi->eqn); /* avoid warning */ - if (vi->versiontag) - xfree((void *)vi->versiontag); /* avoid warning */ - xfree(vi); + return entry; } - - if (list_destroy(versioninfo_head) < 0) - return -1; - versioninfo_head = NULL; } - return 0; + return invalid_entry; + } + + VersionCheck::VersionCheck(std::uint32_t version_id, std::uint32_t game_version, std::uint32_t checksum, t_tag architecture, + t_tag client, const struct file_metadata& metadata, const std::string& equation, + const std::string& checkrevision_filename, const std::string& version_tag) + : m_version_id(version_id), + m_game_version(game_version), + m_checksum(checksum), + m_architecture(architecture), + m_client(client), + m_metadata(metadata), + m_equation(equation), + m_checkrevision_filename(checkrevision_filename), + m_version_tag(version_tag) + { + + } + + VersionCheck::VersionCheck(const std::string& checkrevision_filename, const std::string& equation, const std::string& version_tag) + : m_version_id(), + m_game_version(), + m_checksum(), + m_architecture(), + m_client(), + m_metadata(), + m_equation(equation), + m_checkrevision_filename(checkrevision_filename), + m_version_tag(version_tag) + { + + } + + bool VersionCheck::validate_checkrevision_data(std::uint32_t game_version, std::uint32_t checksum, const std::string& unparsed_file_metadata) const + { + if (this->m_version_tag == "NoVC") + { + return false; + } + + if (this->m_game_version != game_version) + { + eventlog(eventlog_level_debug, __FUNCTION__, "Failed CheckRevision: Invalid game version \"{X}\"", game_version); + return false; + } + + + if (this->m_checksum != 0 + && prefs_get_allow_bad_version()) + { + if (this->m_checksum != checksum) + { + eventlog(eventlog_level_debug, __FUNCTION__, "Failed CheckRevision: Invalid checksum \"{X}\"", checksum); + return false; + } + } + else + { + // checksum can be disabled globally via setting allow_bad_version = true in conf/bnetd.conf + // it can also be disabled on individual versioncheck entries by setting 0 in the checksum field in conf/versioncheck.conf + eventlog(eventlog_level_debug, __FUNCTION__, "Skipping checksum validation"); + } + + + if (unparsed_file_metadata != "NULL" + && std::strcmp(prefs_get_version_exeinfo_match(), "true") == 0) + { + if (unparsed_file_metadata == "badexe") + { + // missing or too long file metadata received + eventlog(eventlog_level_debug, __FUNCTION__, "Failed CheckRevision: Invalid file metadata \"{}\"", unparsed_file_metadata); + return false; + } + + struct file_metadata parsed_metadata = parse_file_metadata(unparsed_file_metadata);; + if (parsed_metadata.filename.empty() + && parsed_metadata.file_size == 0 + && parsed_metadata.timestamp == 0) + { + eventlog(eventlog_level_debug, __FUNCTION__, "Failed CheckRevision: Invalid file metadata \"{}\"", unparsed_file_metadata); + return false; + } + + // Skip timestamp matching if client is WC3 + // WC3 installers change the file timestamp to time of installation + if (!compare_file_metadata(this->m_metadata, parsed_metadata, + this->m_client == CLIENTTAG_WARCRAFT3_UINT || this->m_client == CLIENTTAG_WAR3XP_UINT ? true : false) + ) + { + eventlog(eventlog_level_debug, __FUNCTION__, "Failed CheckRevision: Invalid file metadata \"{}\"", unparsed_file_metadata); + return false; + } + } + else + { + // metadata matching can be disabled globally via setting version_exeinfo_match = false in conf/bnetd.conf + // it can also be disabled on individual versioncheck entries by setting "NULL" in the exeinfo field in conf/versioncheck.conf + eventlog(eventlog_level_debug, __FUNCTION__, "Skipping file metadata validation"); + } + + return true; + } + + std::string VersionCheck::get_equation() const noexcept + { + return this->m_equation; + } + + std::string VersionCheck::get_checkrevision_filename() const noexcept + { + return this->m_checkrevision_filename; + } + + std::string VersionCheck::get_version_tag() const noexcept + { + return this->m_version_tag; + } + + struct file_metadata parse_file_metadata(const std::string& unparsed_metadata) + { + // happens when using war3-noCD and having deleted war3.org + if (unparsed_metadata.empty()) + { + eventlog(eventlog_level_error, __FUNCTION__, "got empty file metadata string"); + return {}; + } + + // happens when AUTHREQ had no owner/exeinfo entry + if (unparsed_metadata == "badexe") + { + eventlog(eventlog_level_error, __FUNCTION__, "got \"badexe\" as file metadata string"); + return {}; + } + + std::smatch tokens; + try + { + if (std::regex_match(unparsed_metadata, tokens, std::regex{ R"(([[:print:]]+\.exe) (\d\d/\d\d/\d\d \d\d:\d\d:\d\d) (\d+))" }) == false) + { + eventlog(eventlog_level_error, __FUNCTION__, "got invalid file metadata string \"{}\"", unparsed_metadata); + return {}; + } + } + catch (const std::regex_error& e) + { + eventlog(eventlog_level_error, __FUNCTION__, "{} (code {})", e.what(), e.code()); + return {}; + } + + // Example metadata string + // "Warcraft III.exe 07/07/17 20:15:59 562152" + + std::string filename = tokens[1]; + + std::tm timestamp_raw; + timestamp_raw.tm_isdst = -1; + std::istringstream ss(tokens[2]); + // Since year is 2 digits, + // Range [69,99] results in values 1969 to 1999, range [00,68] results in 2000-2068 + ss >> std::get_time(×tamp_raw, "%D %T"); + if (ss.fail()) + { + eventlog(eventlog_level_error, __FUNCTION__, "got invalid date and time in file metadata string"); + return {}; + } + + std::time_t timestamp = std::mktime(×tamp_raw); + if (timestamp == -1) + { + eventlog(eventlog_level_error, __FUNCTION__, "time could not be represented as a std::time_t object"); + return {}; + } + + std::uint64_t filesize; + try + { + filesize = std::stoull(tokens[3]); + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, "could not convert file size in file metadata string: {}", e.what()); + return {}; + } + + return { timestamp, filesize, filename }; + } + + bool compare_file_metadata(const struct file_metadata& pattern, const struct file_metadata& match, bool skip_timestamp_match) + { + if (skip_timestamp_match == false + && pattern.timestamp != match.timestamp) + { + return false; + } + + if (pattern.file_size != match.file_size) + { + return false; + } + + // Case insensitive comparison of filename + if (strcasecmp(pattern.filename.c_str(), match.filename.c_str()) != 0) + { + return false; + } + + return true; } } diff --git a/src/bnetd/versioncheck.h b/src/bnetd/versioncheck.h index e1bef94..9752ea1 100644 --- a/src/bnetd/versioncheck.h +++ b/src/bnetd/versioncheck.h @@ -18,84 +18,78 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef INCLUDED_VERSIONCHECK_TYPES -#define INCLUDED_VERSIONCHECK_TYPES +#ifndef PVPGN_BNETD_VERSIONCHECK_H +#define PVPGN_BNETD_VERSIONCHECK_H +#include #include +#include #include "common/tag.h" -namespace pvpgn -{ - - namespace bnetd - { - -#ifdef VERSIONCHECK_INTERNAL_ACCESS - typedef struct - { - char const * exe; - std::time_t time; - int size; - } t_parsed_exeinfo; -#endif - -#ifdef VERSIONCHECK_INTERNAL_ACCESS - typedef struct - { - char const * eqn; - char const * mpqfile; - t_tag archtag; - t_tag clienttag; - char const * versiontag; - t_parsed_exeinfo * parsed_exeinfo; - unsigned long versionid; - unsigned long gameversion; - unsigned long checksum; - } t_versioninfo; -#endif - - typedef struct s_versioncheck -#ifdef VERSIONCHECK_INTERNAL_ACCESS - { - char const * eqn; - char const * mpqfile; - char const * versiontag; - } -#endif - t_versioncheck; - - } - -} - -#endif - -#ifndef JUST_NEED_TYPES -#ifndef INCLUDED_VERSIONCHECK_PROTOS -#define INCLUDED_VERSIONCHECK_PROTOS namespace pvpgn { namespace bnetd { + class VersionCheck; - extern t_versioncheck * versioncheck_create(t_tag archtag, t_tag clienttag); - extern int versioncheck_destroy(t_versioncheck * vc); - extern char const * versioncheck_get_mpqfile(t_versioncheck const * vc); - extern char const * versioncheck_get_eqn(t_versioncheck const * vc); - extern int versioncheck_validate(t_versioncheck * vc, t_tag archtag, t_tag clienttag, char const * exeinfo, unsigned long versionid, unsigned long gameversion, unsigned long checksum); + struct file_metadata + { + std::time_t timestamp; + std::uint64_t file_size; + std::string filename; + }; - extern int versioncheck_load(char const * filename); - extern int versioncheck_unload(void); + bool load_versioncheck_conf(const std::string& filename); + void unload_versioncheck_conf(); - extern char const * versioncheck_get_versiontag(t_versioncheck const * vc); - extern int versioncheck_set_versiontag(t_versioncheck * vc, char const * versiontag); + const VersionCheck& select_versioncheck_entry(t_tag architecture, t_tag client, std::uint32_t version_id); - } + class VersionCheck + { + public: + bool validate_checkrevision_data(std::uint32_t game_version, std::uint32_t checksum, const std::string& unparsed_file_metadata) const; -} + std::string get_equation() const noexcept; + std::string get_checkrevision_filename() const noexcept; + std::string get_version_tag() const noexcept; -#endif -#endif + ~VersionCheck() = default; + private: + /*******************************************************************************/ + // Friend functions + /*******************************************************************************/ + friend bool load_versioncheck_conf(const std::string& filename); + friend const VersionCheck& select_versioncheck_entry(t_tag architecture, t_tag client, std::uint32_t version_id); + + + /*******************************************************************************/ + // Constructors + /*******************************************************************************/ + VersionCheck(std::uint32_t version_id, std::uint32_t game_version, std::uint32_t checksum, t_tag architecture, + t_tag client, const struct file_metadata& exe_metadata, const std::string& equation, + const std::string& checkrevision_filename, const std::string& version_tag); + VersionCheck(const std::string& checkrevision_filename, const std::string& equation, const std::string& version_tag); + + + /*******************************************************************************/ + // Member variables + /*******************************************************************************/ + const std::uint32_t m_version_id; // AKA "Version Byte" + const std::uint32_t m_game_version; + const std::uint32_t m_checksum; + const t_tag m_architecture; + const t_tag m_client; + const struct file_metadata m_metadata; + const std::string m_equation; + const std::string m_checkrevision_filename; + const std::string m_version_tag; + }; + + } // namespace bnetd + +} // namespace pvpgn + +#endif //PVPGN_BNETD_VERSIONCHECK_H \ No newline at end of file diff --git a/src/common/setup_before.h b/src/common/setup_before.h index b84c9c5..a7bb72a 100644 --- a/src/common/setup_before.h +++ b/src/common/setup_before.h @@ -240,7 +240,7 @@ const unsigned BNETD_HASHTABLE_SIZE = 61; const int BNETD_REALM_PORT = 6113; /* where D2CS listens */ const char * const BNETD_TELNET_ADDRS = ""; /* this means none */ const int BNETD_TELNET_PORT = 23; /* used if port not specified */ -const char * const BNETD_EXEINFO_MATCH = "exact"; +const char * const BNETD_EXEINFO_MATCH = "true"; const unsigned PVPGN_VERSION_TIMEDIV = 0; /* no timediff check by default */ const int PVPGN_CACHE_MEMLIMIT = 5000000; /* bytes */ const char * const PVPGN_DEFAULT_SYMB = "-_[]";