From 767fc4a6ade47be16125f1844e61f9836543c2ae Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Tue, 10 Apr 2018 22:39:29 +0200 Subject: [PATCH] [XML2SDB] Add support for DATA in Layers. --- sdk/tools/xml2sdb/xml2sdb.cpp | 68 ++++++++++++++++++++++++++++++++++- sdk/tools/xml2sdb/xml2sdb.h | 17 +++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/sdk/tools/xml2sdb/xml2sdb.cpp b/sdk/tools/xml2sdb/xml2sdb.cpp index 091177362f9..3478e0561bb 100644 --- a/sdk/tools/xml2sdb/xml2sdb.cpp +++ b/sdk/tools/xml2sdb/xml2sdb.cpp @@ -14,7 +14,7 @@ using tinyxml2::XMLText; static const GUID GUID_NULL = { 0 }; -static const char szCompilerVersion[] = "1.7.0.0"; +static const char szCompilerVersion[] = "1.7.0.1"; #if !defined(C_ASSERT) #define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1] @@ -398,6 +398,69 @@ bool Flag::toSdb(PDB pdb, Database& db) } +/*********************************************************************** + * Data + */ + +#ifndef REG_SZ +#define REG_SZ 1 +//#define REG_BINARY 3 +#define REG_DWORD 4 +#define REG_QWORD 11 +#endif + + +bool Data::fromXml(XMLHandle dbNode) +{ + Name = ReadStringNode(dbNode, "NAME"); + + StringData = ReadStringNode(dbNode, "DATA_STRING"); + if (!StringData.empty()) + { + DataType = REG_SZ; + return !Name.empty(); + } + DWordData = ReadDWordNode(dbNode, "DATA_DWORD"); + if (DWordData) + { + DataType = REG_DWORD; + return !Name.empty(); + } + QWordData = ReadQWordNode(dbNode, "DATA_QWORD"); + if (QWordData) + { + DataType = REG_QWORD; + return !Name.empty(); + } + + SHIM_ERR("Data node (%s) without value!\n", Name.c_str()); + return false; +} + +bool Data::toSdb(PDB pdb, Database& db) +{ + Tagid = db.BeginWriteListTag(pdb, TAG_DATA); + db.WriteString(pdb, TAG_NAME, Name, true); + db.WriteDWord(pdb, TAG_DATA_VALUETYPE, DataType, true); + switch (DataType) + { + case REG_SZ: + db.WriteString(pdb, TAG_DATA_STRING, StringData); + break; + case REG_DWORD: + db.WriteDWord(pdb, TAG_DATA_DWORD, DWordData); + break; + case REG_QWORD: + db.WriteQWord(pdb, TAG_DATA_QWORD, QWordData); + break; + default: + SHIM_ERR("Data node (%s) with unknown type (0x%x)\n", Name.c_str(), DataType); + return false; + } + + return !!db.EndWriteListTag(pdb, Tagid); +} + /*********************************************************************** * Layer */ @@ -407,6 +470,7 @@ bool Layer::fromXml(XMLHandle dbNode) Name = ReadStringNode(dbNode, "NAME"); ReadGeneric(dbNode, ShimRefs, "SHIM_REF"); ReadGeneric(dbNode, FlagRefs, "FLAG_REF"); + ReadGeneric(dbNode, Datas, "DATA"); return true; } @@ -418,6 +482,8 @@ bool Layer::toSdb(PDB pdb, Database& db) return false; if (!WriteGeneric(pdb, FlagRefs, db)) return false; + if (!WriteGeneric(pdb, Datas, db)) + return false; return !!db.EndWriteListTag(pdb, Tagid); } diff --git a/sdk/tools/xml2sdb/xml2sdb.h b/sdk/tools/xml2sdb/xml2sdb.h index 031b9ffceab..df9e391b440 100644 --- a/sdk/tools/xml2sdb/xml2sdb.h +++ b/sdk/tools/xml2sdb/xml2sdb.h @@ -91,6 +91,22 @@ struct Flag }; +struct Data +{ + Data() : Tagid(0), DataType(0), DWordData(0), QWordData(0) { ; } + + bool fromXml(XMLHandle dbNode); + bool toSdb(PDB pdb, Database& db); + + std::string Name; + TAGID Tagid; + DWORD DataType; + + std::string StringData; + DWORD DWordData; + QWORD QWordData; +}; + struct Layer { Layer() : Tagid(0) { ; } @@ -102,6 +118,7 @@ struct Layer TAGID Tagid; std::list ShimRefs; std::list FlagRefs; + std::list Datas; }; struct MatchingFile