/* * PROJECT: xml2sdb * LICENSE: MIT (https://spdx.org/licenses/MIT) * PURPOSE: Define mapping of all shim database types to xml * COPYRIGHT: Copyright 2016-2025 Mark Jansen */ #pragma once #include #include #include #include #include #include #include #include "sdbwrite.h" #include namespace tinyxml2 { class XMLHandle; } using tinyxml2::XMLHandle; typedef std::basic_string sdbstring; struct Database; enum PlatformType { PLATFORM_NONE = 0, // This is all we support for now PLATFORM_X86 = 1, // There is another platform here, but we don't support it yet // https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/kshim/drvmain.htm PLATFORM_AMD64 = 4, PLATFORM_ANY = PLATFORM_X86 | PLATFORM_AMD64 }; struct str_to_flag { const char *name; DWORD flag; }; extern str_to_flag platform_to_flag[]; DWORD str_to_enum(const std::string &str, const str_to_flag *table); struct InExclude { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Module; bool Include = false; }; struct ShimRef { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; std::string CommandLine; TAGID ShimTagid = 0; std::list InExcludes; }; struct FlagRef { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; TAGID FlagTagid = 0; }; struct Shim { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; std::string DllFile; GUID FixID = {}; TAGID Tagid = 0; std::list InExcludes; PlatformType Platform = PLATFORM_ANY; }; struct Flag { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; TAGID Tagid = 0; QWORD KernelFlags = 0; QWORD UserFlags = 0; QWORD ProcessParamFlags = 0; }; struct Data { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; TAGID Tagid = 0; DWORD DataType = 0; std::string StringData; DWORD DWordData = 0; QWORD QWordData = 0; }; struct Layer { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; TAGID Tagid = 0; std::list ShimRefs; std::list FlagRefs; std::list Datas; PlatformType Platform = PLATFORM_ANY; }; struct MatchingFile { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; DWORD Size = 0; DWORD Checksum = 0; std::string CompanyName; std::string InternalName; std::string ProductName; std::string ProductVersion; std::string FileVersion; std::string BinFileVersion; DWORD LinkDate = 0; std::string VerLanguage; std::string FileDescription; std::string OriginalFilename; std::string UptoBinFileVersion; DWORD LinkerVersion = 0; }; struct Exe { bool fromXml(XMLHandle dbNode); bool toSdb(Database& db); std::string Name; GUID ExeID = {}; std::string AppName; std::string Vendor; TAGID Tagid = 0; std::list MatchingFiles; std::list ShimRefs; std::list FlagRefs; PlatformType Platform = PLATFORM_ANY; }; struct Library { std::list InExcludes; std::list Shims; std::list Flags; }; struct Database { bool fromXml(const char* fileName, PlatformType platform); bool fromXml(XMLHandle dbNode); bool toSdb(LPCWSTR path); void WriteString(TAG tag, const sdbstring& str, bool always = false); void WriteString(TAG tag, const std::string& str, bool always = false); void WriteBinary(TAG tag, const GUID& guid, bool always = false); void WriteBinary(TAG tag, const std::vector& data, bool always = false); void WriteDWord(TAG tag, DWORD value, bool always = false); void WriteQWord(TAG tag, QWORD value, bool always = false); void WriteNull(TAG tag); TAGID BeginWriteListTag(TAG tag); BOOL EndWriteListTag(TAGID tagid); void InsertShimTagid(const sdbstring& name, TAGID tagid); inline void InsertShimTagid(const std::string& name, TAGID tagid) { InsertShimTagid(sdbstring(name.begin(), name.end()), tagid); } TAGID FindShimTagid(const sdbstring& name); inline TAGID FindShimTagid(const std::string& name) { return FindShimTagid(sdbstring(name.begin(), name.end())); } void InsertPatchTagid(const sdbstring& name, TAGID tagid); inline void InsertPatchTagid(const std::string& name, TAGID tagid) { InsertPatchTagid(sdbstring(name.begin(), name.end()), tagid); } TAGID FindPatchTagid(const sdbstring& name); inline TAGID FindPatchTagid(const std::string& name) { 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 = {}; struct Library Library; std::list Layers; std::list Exes; private: std::map KnownShims; std::map KnownPatches; std::map KnownFlags; PDB pdb = nullptr; PlatformType platform = PLATFORM_ANY; };