mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[XML2SDB] Parse Flags.
This commit is contained in:
parent
06d7926e27
commit
1d0e7bddea
2 changed files with 131 additions and 7 deletions
|
@ -2,7 +2,7 @@
|
||||||
* PROJECT: xml2sdb
|
* PROJECT: xml2sdb
|
||||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||||
* PURPOSE: Conversion functions from xml -> db
|
* PURPOSE: Conversion functions from xml -> db
|
||||||
* COPYRIGHT: Copyright 2016,2017 Mark Jansen (mark.jansen@reactos.org)
|
* COPYRIGHT: Copyright 2016-2018 Mark Jansen (mark.jansen@reactos.org)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "xml2sdb.h"
|
#include "xml2sdb.h"
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
using tinyxml2::XMLText;
|
using tinyxml2::XMLText;
|
||||||
|
|
||||||
static const GUID GUID_NULL = { 0 };
|
static const GUID GUID_NULL = { 0 };
|
||||||
static const char szCompilerVersion[] = "1.6.0.0";
|
static const char szCompilerVersion[] = "1.7.0.0";
|
||||||
|
|
||||||
#if !defined(C_ASSERT)
|
#if !defined(C_ASSERT)
|
||||||
#define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
|
#define C_ASSERT(expr) extern char (*c_assert(void)) [(expr) ? 1 : -1]
|
||||||
|
@ -88,7 +88,7 @@ std::string ReadStringNode(XMLHandle dbNode, const char* nodeName)
|
||||||
return ToString(dbNode.FirstChildElement(nodeName));
|
return ToString(dbNode.FirstChildElement(nodeName));
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD ReadDWordNode(XMLHandle dbNode, const char* nodeName)
|
DWORD ReadQWordNode(XMLHandle dbNode, const char* nodeName)
|
||||||
{
|
{
|
||||||
std::string value = ReadStringNode(dbNode, nodeName);
|
std::string value = ReadStringNode(dbNode, nodeName);
|
||||||
int base = 10;
|
int base = 10;
|
||||||
|
@ -97,7 +97,12 @@ DWORD ReadDWordNode(XMLHandle dbNode, const char* nodeName)
|
||||||
base = 16;
|
base = 16;
|
||||||
value = value.substr(2);
|
value = value.substr(2);
|
||||||
}
|
}
|
||||||
return static_cast<DWORD>(strtoul(value.c_str(), NULL, base));
|
return static_cast<QWORD>(strtoul(value.c_str(), NULL, base));
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD ReadDWordNode(XMLHandle dbNode, const char* nodeName)
|
||||||
|
{
|
||||||
|
return static_cast<DWORD>(ReadQWordNode(dbNode, nodeName));
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char char2byte(char hexChar, bool* success = NULL)
|
unsigned char char2byte(char hexChar, bool* success = NULL)
|
||||||
|
@ -310,6 +315,29 @@ bool ShimRef::toSdb(PDB pdb, Database& db)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* FlagRef
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool FlagRef::fromXml(XMLHandle dbNode)
|
||||||
|
{
|
||||||
|
Name = ReadStringNode(dbNode, "NAME");
|
||||||
|
return !Name.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FlagRef::toSdb(PDB pdb, Database& db)
|
||||||
|
{
|
||||||
|
TAGID tagid = db.BeginWriteListTag(pdb, TAG_FLAG_REF);
|
||||||
|
db.WriteString(pdb, TAG_NAME, Name, true);
|
||||||
|
|
||||||
|
if (!FlagTagid)
|
||||||
|
FlagTagid = db.FindFlagTagid(Name);
|
||||||
|
SdbWriteDWORDTag(pdb, TAG_FLAG_TAGID, FlagTagid);
|
||||||
|
return !!db.EndWriteListTag(pdb, tagid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Shim
|
* Shim
|
||||||
*/
|
*/
|
||||||
|
@ -341,6 +369,35 @@ bool Shim::toSdb(PDB pdb, Database& db)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Flag
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Flag::fromXml(XMLHandle dbNode)
|
||||||
|
{
|
||||||
|
Name = ReadStringNode(dbNode, "NAME");
|
||||||
|
|
||||||
|
KernelFlags = ReadQWordNode(dbNode, "FLAG_MASK_KERNEL");
|
||||||
|
UserFlags = ReadQWordNode(dbNode, "FLAG_MASK_USER");
|
||||||
|
ProcessParamFlags = ReadQWordNode(dbNode, "FLAG_PROCESSPARAM");
|
||||||
|
|
||||||
|
return !Name.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Flag::toSdb(PDB pdb, Database& db)
|
||||||
|
{
|
||||||
|
Tagid = db.BeginWriteListTag(pdb, TAG_FLAG);
|
||||||
|
db.InsertFlagTagid(Name, Tagid);
|
||||||
|
db.WriteString(pdb, TAG_NAME, Name, true);
|
||||||
|
|
||||||
|
db.WriteQWord(pdb, TAG_FLAG_MASK_KERNEL, KernelFlags);
|
||||||
|
db.WriteQWord(pdb, TAG_FLAG_MASK_USER, UserFlags);
|
||||||
|
db.WriteQWord(pdb, TAG_FLAG_PROCESSPARAM, ProcessParamFlags);
|
||||||
|
|
||||||
|
return !!db.EndWriteListTag(pdb, Tagid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Layer
|
* Layer
|
||||||
*/
|
*/
|
||||||
|
@ -349,6 +406,7 @@ bool Layer::fromXml(XMLHandle dbNode)
|
||||||
{
|
{
|
||||||
Name = ReadStringNode(dbNode, "NAME");
|
Name = ReadStringNode(dbNode, "NAME");
|
||||||
ReadGeneric(dbNode, ShimRefs, "SHIM_REF");
|
ReadGeneric(dbNode, ShimRefs, "SHIM_REF");
|
||||||
|
ReadGeneric(dbNode, FlagRefs, "FLAG_REF");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,6 +416,8 @@ bool Layer::toSdb(PDB pdb, Database& db)
|
||||||
db.WriteString(pdb, TAG_NAME, Name, true);
|
db.WriteString(pdb, TAG_NAME, Name, true);
|
||||||
if (!WriteGeneric(pdb, ShimRefs, db))
|
if (!WriteGeneric(pdb, ShimRefs, db))
|
||||||
return false;
|
return false;
|
||||||
|
if (!WriteGeneric(pdb, FlagRefs, db))
|
||||||
|
return false;
|
||||||
return !!db.EndWriteListTag(pdb, Tagid);
|
return !!db.EndWriteListTag(pdb, Tagid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,6 +490,7 @@ bool Exe::fromXml(XMLHandle dbNode)
|
||||||
ReadGeneric(dbNode, MatchingFiles, "MATCHING_FILE");
|
ReadGeneric(dbNode, MatchingFiles, "MATCHING_FILE");
|
||||||
|
|
||||||
ReadGeneric(dbNode, ShimRefs, "SHIM_REF");
|
ReadGeneric(dbNode, ShimRefs, "SHIM_REF");
|
||||||
|
ReadGeneric(dbNode, FlagRefs, "FLAG_REF");
|
||||||
|
|
||||||
return !Name.empty();
|
return !Name.empty();
|
||||||
}
|
}
|
||||||
|
@ -451,6 +512,8 @@ bool Exe::toSdb(PDB pdb, Database& db)
|
||||||
return false;
|
return false;
|
||||||
if (!WriteGeneric(pdb, ShimRefs, db))
|
if (!WriteGeneric(pdb, ShimRefs, db))
|
||||||
return false;
|
return false;
|
||||||
|
if (!WriteGeneric(pdb, FlagRefs, db))
|
||||||
|
return false;
|
||||||
|
|
||||||
return !!db.EndWriteListTag(pdb, Tagid);
|
return !!db.EndWriteListTag(pdb, Tagid);
|
||||||
}
|
}
|
||||||
|
@ -489,6 +552,12 @@ void Database::WriteDWord(PDB pdb, TAG tag, DWORD value, bool always)
|
||||||
SdbWriteDWORDTag(pdb, tag, value);
|
SdbWriteDWORDTag(pdb, tag, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Database::WriteQWord(PDB pdb, TAG tag, QWORD value, bool always)
|
||||||
|
{
|
||||||
|
if (always || value)
|
||||||
|
SdbWriteQWORDTag(pdb, tag, value);
|
||||||
|
}
|
||||||
|
|
||||||
TAGID Database::BeginWriteListTag(PDB pdb, TAG tag)
|
TAGID Database::BeginWriteListTag(PDB pdb, TAG tag)
|
||||||
{
|
{
|
||||||
return SdbBeginWriteListTag(pdb, tag);
|
return SdbBeginWriteListTag(pdb, tag);
|
||||||
|
@ -516,7 +585,9 @@ bool Database::fromXml(XMLHandle dbNode)
|
||||||
}
|
}
|
||||||
else if (NodeName == "FLAG")
|
else if (NodeName == "FLAG")
|
||||||
{
|
{
|
||||||
SHIM_ERR("Unhanled FLAG type\n");
|
Flag flag;
|
||||||
|
if (flag.fromXml(libChild))
|
||||||
|
Library.Flags.push_back(flag);
|
||||||
}
|
}
|
||||||
else if (NodeName == "INCLUDE" || NodeName == "EXCLUDE")
|
else if (NodeName == "INCLUDE" || NodeName == "EXCLUDE")
|
||||||
{
|
{
|
||||||
|
@ -561,6 +632,8 @@ bool Database::toSdb(LPCWSTR path)
|
||||||
return false;
|
return false;
|
||||||
if (!WriteGeneric(pdb, Library.Shims, *this))
|
if (!WriteGeneric(pdb, Library.Shims, *this))
|
||||||
return false;
|
return false;
|
||||||
|
if (!WriteGeneric(pdb, Library.Flags, *this))
|
||||||
|
return false;
|
||||||
EndWriteListTag(pdb, tidLibrary);
|
EndWriteListTag(pdb, tidLibrary);
|
||||||
if (!WriteGeneric(pdb, Layers, *this))
|
if (!WriteGeneric(pdb, Layers, *this))
|
||||||
return false;
|
return false;
|
||||||
|
@ -615,6 +688,15 @@ TAGID Database::FindPatchTagid(const sdbstring& name)
|
||||||
return FindTagid(name, KnownPatches);
|
return FindTagid(name, KnownPatches);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Database::InsertFlagTagid(const sdbstring& name, TAGID tagid)
|
||||||
|
{
|
||||||
|
InsertTagid(name, tagid, KnownFlags, "Flag");
|
||||||
|
}
|
||||||
|
|
||||||
|
TAGID Database::FindFlagTagid(const sdbstring& name)
|
||||||
|
{
|
||||||
|
return FindTagid(name, KnownFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool xml_2_db(const char* xml, const WCHAR* sdb)
|
bool xml_2_db(const char* xml, const WCHAR* sdb)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* PROJECT: xml2sdb
|
* PROJECT: xml2sdb
|
||||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||||
* PURPOSE: .
|
* PURPOSE: Define mapping of all shim database types to xml
|
||||||
* COPYRIGHT: Copyright 2016,2017 Mark Jansen (mark.jansen@reactos.org)
|
* COPYRIGHT: Copyright 2016-2018 Mark Jansen (mark.jansen@reactos.org)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@ -51,6 +51,17 @@ struct ShimRef
|
||||||
std::list<InExclude> InExcludes;
|
std::list<InExclude> InExcludes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FlagRef
|
||||||
|
{
|
||||||
|
FlagRef() : FlagTagid(0) { ; }
|
||||||
|
|
||||||
|
bool fromXml(XMLHandle dbNode);
|
||||||
|
bool toSdb(PDB pdb, Database& db);
|
||||||
|
|
||||||
|
std::string Name;
|
||||||
|
TAGID FlagTagid;
|
||||||
|
};
|
||||||
|
|
||||||
struct Shim
|
struct Shim
|
||||||
{
|
{
|
||||||
Shim() : Tagid(0) { ; }
|
Shim() : Tagid(0) { ; }
|
||||||
|
@ -65,6 +76,21 @@ struct Shim
|
||||||
std::list<InExclude> InExcludes;
|
std::list<InExclude> InExcludes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Flag
|
||||||
|
{
|
||||||
|
Flag() : Tagid(0), KernelFlags(0), UserFlags(0), ProcessParamFlags(0) { ; }
|
||||||
|
|
||||||
|
bool fromXml(XMLHandle dbNode);
|
||||||
|
bool toSdb(PDB pdb, Database& db);
|
||||||
|
|
||||||
|
std::string Name;
|
||||||
|
TAGID Tagid;
|
||||||
|
QWORD KernelFlags;
|
||||||
|
QWORD UserFlags;
|
||||||
|
QWORD ProcessParamFlags;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Layer
|
struct Layer
|
||||||
{
|
{
|
||||||
Layer() : Tagid(0) { ; }
|
Layer() : Tagid(0) { ; }
|
||||||
|
@ -75,6 +101,7 @@ struct Layer
|
||||||
std::string Name;
|
std::string Name;
|
||||||
TAGID Tagid;
|
TAGID Tagid;
|
||||||
std::list<ShimRef> ShimRefs;
|
std::list<ShimRef> ShimRefs;
|
||||||
|
std::list<FlagRef> FlagRefs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MatchingFile
|
struct MatchingFile
|
||||||
|
@ -115,12 +142,14 @@ struct Exe
|
||||||
TAGID Tagid;
|
TAGID Tagid;
|
||||||
std::list<MatchingFile> MatchingFiles;
|
std::list<MatchingFile> MatchingFiles;
|
||||||
std::list<ShimRef> ShimRefs;
|
std::list<ShimRef> ShimRefs;
|
||||||
|
std::list<FlagRef> FlagRefs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Library
|
struct Library
|
||||||
{
|
{
|
||||||
std::list<InExclude> InExcludes;
|
std::list<InExclude> InExcludes;
|
||||||
std::list<Shim> Shims;
|
std::list<Shim> Shims;
|
||||||
|
std::list<Flag> Flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Database
|
struct Database
|
||||||
|
@ -135,6 +164,7 @@ struct Database
|
||||||
void WriteBinary(PDB pdb, TAG tag, const GUID& guid, bool always = false);
|
void WriteBinary(PDB pdb, TAG tag, const GUID& guid, bool always = false);
|
||||||
void WriteBinary(PDB pdb, TAG tag, const std::vector<BYTE>& data, bool always = false);
|
void WriteBinary(PDB pdb, TAG tag, const std::vector<BYTE>& data, bool always = false);
|
||||||
void WriteDWord(PDB pdb, TAG tag, DWORD value, bool always = false);
|
void WriteDWord(PDB pdb, TAG tag, DWORD value, bool always = false);
|
||||||
|
void WriteQWord(PDB pdb, TAG tag, QWORD value, bool always = false);
|
||||||
TAGID BeginWriteListTag(PDB pdb, TAG tag);
|
TAGID BeginWriteListTag(PDB pdb, TAG tag);
|
||||||
BOOL EndWriteListTag(PDB pdb, TAGID tagid);
|
BOOL EndWriteListTag(PDB pdb, TAGID tagid);
|
||||||
|
|
||||||
|
@ -161,6 +191,17 @@ struct Database
|
||||||
return FindPatchTagid(sdbstring(name.begin(), name.end()));
|
return FindPatchTagid(sdbstring(name.begin(), name.end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InsertFlagTagid(const sdbstring& name, TAGID tagid);
|
||||||
|
inline void InsertFlagTagid(const std::string& name, TAGID tagid)
|
||||||
|
{
|
||||||
|
InsertFlagTagid(sdbstring(name.begin(), name.end()), tagid);
|
||||||
|
}
|
||||||
|
TAGID FindFlagTagid(const sdbstring& name);
|
||||||
|
inline TAGID FindFlagTagid(const std::string& name)
|
||||||
|
{
|
||||||
|
return FindFlagTagid(sdbstring(name.begin(), name.end()));
|
||||||
|
}
|
||||||
|
|
||||||
std::string Name;
|
std::string Name;
|
||||||
GUID ID;
|
GUID ID;
|
||||||
|
|
||||||
|
@ -171,5 +212,6 @@ struct Database
|
||||||
private:
|
private:
|
||||||
std::map<sdbstring, TAGID> KnownShims;
|
std::map<sdbstring, TAGID> KnownShims;
|
||||||
std::map<sdbstring, TAGID> KnownPatches;
|
std::map<sdbstring, TAGID> KnownPatches;
|
||||||
|
std::map<sdbstring, TAGID> KnownFlags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue