mirror of
https://github.com/reactos/reactos.git
synced 2025-02-21 16:04:57 +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
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* 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"
|
||||
|
@ -14,7 +14,7 @@
|
|||
using tinyxml2::XMLText;
|
||||
|
||||
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)
|
||||
#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));
|
||||
}
|
||||
|
||||
DWORD ReadDWordNode(XMLHandle dbNode, const char* nodeName)
|
||||
DWORD ReadQWordNode(XMLHandle dbNode, const char* nodeName)
|
||||
{
|
||||
std::string value = ReadStringNode(dbNode, nodeName);
|
||||
int base = 10;
|
||||
|
@ -97,7 +97,12 @@ DWORD ReadDWordNode(XMLHandle dbNode, const char* nodeName)
|
|||
base = 16;
|
||||
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)
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -349,6 +406,7 @@ bool Layer::fromXml(XMLHandle dbNode)
|
|||
{
|
||||
Name = ReadStringNode(dbNode, "NAME");
|
||||
ReadGeneric(dbNode, ShimRefs, "SHIM_REF");
|
||||
ReadGeneric(dbNode, FlagRefs, "FLAG_REF");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -358,6 +416,8 @@ bool Layer::toSdb(PDB pdb, Database& db)
|
|||
db.WriteString(pdb, TAG_NAME, Name, true);
|
||||
if (!WriteGeneric(pdb, ShimRefs, db))
|
||||
return false;
|
||||
if (!WriteGeneric(pdb, FlagRefs, db))
|
||||
return false;
|
||||
return !!db.EndWriteListTag(pdb, Tagid);
|
||||
}
|
||||
|
||||
|
@ -430,6 +490,7 @@ bool Exe::fromXml(XMLHandle dbNode)
|
|||
ReadGeneric(dbNode, MatchingFiles, "MATCHING_FILE");
|
||||
|
||||
ReadGeneric(dbNode, ShimRefs, "SHIM_REF");
|
||||
ReadGeneric(dbNode, FlagRefs, "FLAG_REF");
|
||||
|
||||
return !Name.empty();
|
||||
}
|
||||
|
@ -451,6 +512,8 @@ bool Exe::toSdb(PDB pdb, Database& db)
|
|||
return false;
|
||||
if (!WriteGeneric(pdb, ShimRefs, db))
|
||||
return false;
|
||||
if (!WriteGeneric(pdb, FlagRefs, db))
|
||||
return false;
|
||||
|
||||
return !!db.EndWriteListTag(pdb, Tagid);
|
||||
}
|
||||
|
@ -489,6 +552,12 @@ void Database::WriteDWord(PDB pdb, TAG tag, DWORD value, bool always)
|
|||
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)
|
||||
{
|
||||
return SdbBeginWriteListTag(pdb, tag);
|
||||
|
@ -516,7 +585,9 @@ bool Database::fromXml(XMLHandle dbNode)
|
|||
}
|
||||
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")
|
||||
{
|
||||
|
@ -561,6 +632,8 @@ bool Database::toSdb(LPCWSTR path)
|
|||
return false;
|
||||
if (!WriteGeneric(pdb, Library.Shims, *this))
|
||||
return false;
|
||||
if (!WriteGeneric(pdb, Library.Flags, *this))
|
||||
return false;
|
||||
EndWriteListTag(pdb, tidLibrary);
|
||||
if (!WriteGeneric(pdb, Layers, *this))
|
||||
return false;
|
||||
|
@ -615,6 +688,15 @@ TAGID Database::FindPatchTagid(const sdbstring& name)
|
|||
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)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* PROJECT: xml2sdb
|
||||
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
|
||||
* PURPOSE: .
|
||||
* COPYRIGHT: Copyright 2016,2017 Mark Jansen (mark.jansen@reactos.org)
|
||||
* PURPOSE: Define mapping of all shim database types to xml
|
||||
* COPYRIGHT: Copyright 2016-2018 Mark Jansen (mark.jansen@reactos.org)
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
@ -51,6 +51,17 @@ struct ShimRef
|
|||
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
|
||||
{
|
||||
Shim() : Tagid(0) { ; }
|
||||
|
@ -65,6 +76,21 @@ struct Shim
|
|||
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
|
||||
{
|
||||
Layer() : Tagid(0) { ; }
|
||||
|
@ -75,6 +101,7 @@ struct Layer
|
|||
std::string Name;
|
||||
TAGID Tagid;
|
||||
std::list<ShimRef> ShimRefs;
|
||||
std::list<FlagRef> FlagRefs;
|
||||
};
|
||||
|
||||
struct MatchingFile
|
||||
|
@ -115,12 +142,14 @@ struct Exe
|
|||
TAGID Tagid;
|
||||
std::list<MatchingFile> MatchingFiles;
|
||||
std::list<ShimRef> ShimRefs;
|
||||
std::list<FlagRef> FlagRefs;
|
||||
};
|
||||
|
||||
struct Library
|
||||
{
|
||||
std::list<InExclude> InExcludes;
|
||||
std::list<Shim> Shims;
|
||||
std::list<Flag> Flags;
|
||||
};
|
||||
|
||||
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 std::vector<BYTE>& data, 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);
|
||||
BOOL EndWriteListTag(PDB pdb, TAGID tagid);
|
||||
|
||||
|
@ -161,6 +191,17 @@ struct Database
|
|||
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;
|
||||
GUID ID;
|
||||
|
||||
|
@ -171,5 +212,6 @@ struct Database
|
|||
private:
|
||||
std::map<sdbstring, TAGID> KnownShims;
|
||||
std::map<sdbstring, TAGID> KnownPatches;
|
||||
std::map<sdbstring, TAGID> KnownFlags;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue