ReactOS 0.4.17-dev-966-gf06eace
xml2sdb.h
Go to the documentation of this file.
1/*
2 * PROJECT: xml2sdb
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Define mapping of all shim database types to xml
5 * COPYRIGHT: Copyright 2016-2025 Mark Jansen <mark.jansen@reactos.org>
6 */
7
8#pragma once
9
10#include <string>
11#include <list>
12#include <vector>
13#include <map>
14
15#include <typedefs.h>
16#include <guiddef.h>
17#include <sdbtypes.h>
18#include "sdbwrite.h"
19#include <sdbtagid.h>
20
21#if _LIBCPP_VERSION >= 170000
22#include "char_traits.h"
23#endif
24
25namespace tinyxml2
26{
27class XMLHandle;
28}
30
31typedef std::basic_string<WCHAR> sdbstring;
32
33struct Database;
34
36{
38
39 // This is all we support for now
41 // There is another platform here, but we don't support it yet
42 // https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/kshim/drvmain.htm
44
46};
47
49{
50 const char *name;
52};
53
55
56DWORD str_to_enum(const std::string &str, const str_to_flag *table);
57
59{
60 bool fromXml(XMLHandle dbNode);
61 bool toSdb(Database& db);
62
63 std::string Module;
64 bool Include = false;
65};
66
67struct ShimRef
68{
69 bool fromXml(XMLHandle dbNode);
70 bool toSdb(Database& db);
71
72 std::string Name;
73 std::string CommandLine;
75 std::list<InExclude> InExcludes;
76};
77
78struct FlagRef
79{
80 bool fromXml(XMLHandle dbNode);
81 bool toSdb(Database& db);
82
83 std::string Name;
85};
86
87struct Shim
88{
89 bool fromXml(XMLHandle dbNode);
90 bool toSdb(Database& db);
91
92 std::string Name;
93 std::string DllFile;
94 GUID FixID = {};
96 std::list<InExclude> InExcludes;
98};
99
100struct Flag
101{
102 bool fromXml(XMLHandle dbNode);
103 bool toSdb(Database& db);
104
105 std::string Name;
110};
111
112
113struct Data
114{
115 bool fromXml(XMLHandle dbNode);
116 bool toSdb(Database& db);
117
118 std::string Name;
121
122 std::string StringData;
125};
126
127struct Layer
128{
129 bool fromXml(XMLHandle dbNode);
130 bool toSdb(Database& db);
131
132 std::string Name;
134 std::list<ShimRef> ShimRefs;
135 std::list<FlagRef> FlagRefs;
136 std::list<Data> Datas;
138};
139
141{
142 bool fromXml(XMLHandle dbNode);
143 bool toSdb(Database& db);
144
145 std::string Name;
148 std::string CompanyName;
149 std::string InternalName;
150 std::string ProductName;
151 std::string ProductVersion;
152 std::string FileVersion;
153 std::string BinFileVersion;
155 std::string VerLanguage;
156 std::string FileDescription;
157 std::string OriginalFilename;
160};
161
162struct Exe
163{
164 bool fromXml(XMLHandle dbNode);
165 bool toSdb(Database& db);
166
167 std::string Name;
169 std::string AppName;
170 std::string Vendor;
172 std::list<MatchingFile> MatchingFiles;
173 std::list<ShimRef> ShimRefs;
174 std::list<FlagRef> FlagRefs;
176};
177
179{
180 std::list<InExclude> InExcludes;
181 std::list<Shim> Shims;
182 std::list<Flag> Flags;
183};
184
186{
187 bool fromXml(const char* fileName, PlatformType platform);
188 bool fromXml(XMLHandle dbNode);
189 bool toSdb(LPCWSTR path);
190
191 void WriteString(TAG tag, const sdbstring& str, bool always = false);
192 void WriteString(TAG tag, const std::string& str, bool always = false);
193 void WriteBinary(TAG tag, const GUID& guid, bool always = false);
194 void WriteBinary(TAG tag, const std::vector<BYTE>& data, bool always = false);
195 void WriteDWord(TAG tag, DWORD value, bool always = false);
196 void WriteQWord(TAG tag, QWORD value, bool always = false);
197 void WriteNull(TAG tag);
200
201 void InsertShimTagid(const sdbstring& name, TAGID tagid);
202 inline void InsertShimTagid(const std::string& name, TAGID tagid)
203 {
204 InsertShimTagid(sdbstring(name.begin(), name.end()), tagid);
205 }
207 inline TAGID FindShimTagid(const std::string& name)
208 {
209 return FindShimTagid(sdbstring(name.begin(), name.end()));
210 }
211
212
213 void InsertPatchTagid(const sdbstring& name, TAGID tagid);
214 inline void InsertPatchTagid(const std::string& name, TAGID tagid)
215 {
216 InsertPatchTagid(sdbstring(name.begin(), name.end()), tagid);
217 }
219 inline TAGID FindPatchTagid(const std::string& name)
220 {
221 return FindPatchTagid(sdbstring(name.begin(), name.end()));
222 }
223
224 void InsertFlagTagid(const sdbstring& name, TAGID tagid);
225 inline void InsertFlagTagid(const std::string& name, TAGID tagid)
226 {
227 InsertFlagTagid(sdbstring(name.begin(), name.end()), tagid);
228 }
230 inline TAGID FindFlagTagid(const std::string& name)
231 {
232 return FindFlagTagid(sdbstring(name.begin(), name.end()));
233 }
234
235 std::string Name;
236 GUID ID = {};
237
239 std::list<Layer> Layers;
240 std::list<Exe> Exes;
241
242private:
243 std::map<sdbstring, TAGID> KnownShims;
244 std::map<sdbstring, TAGID> KnownPatches;
245 std::map<sdbstring, TAGID> KnownFlags;
246 PDB pdb = nullptr;
248};
249
DWORD TAGID
GUID guid
Definition: version.c:147
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
platform
Definition: msipriv.h:364
const WCHAR * str
UINT64 QWORD
Definition: shimdbg.c:104
DataType
Definition: simd.h:252
std::string Name
Definition: xml2sdb.h:118
DWORD DWordData
Definition: xml2sdb.h:123
bool toSdb(Database &db)
Definition: xml2sdb.cpp:494
std::string StringData
Definition: xml2sdb.h:122
QWORD QWordData
Definition: xml2sdb.h:124
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:467
TAGID Tagid
Definition: xml2sdb.h:119
void InsertPatchTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:214
PDB pdb
Definition: xml2sdb.h:246
void InsertShimTagid(const sdbstring &name, TAGID tagid)
Definition: xml2sdb.cpp:797
TAGID FindShimTagid(const sdbstring &name)
Definition: xml2sdb.cpp:802
GUID ID
Definition: xml2sdb.h:236
TAGID FindShimTagid(const std::string &name)
Definition: xml2sdb.h:207
void WriteString(TAG tag, const sdbstring &str, bool always=false)
Definition: xml2sdb.cpp:657
TAGID FindPatchTagid(const sdbstring &name)
Definition: xml2sdb.cpp:812
void WriteQWord(TAG tag, QWORD value, bool always=false)
Definition: xml2sdb.cpp:674
TAGID FindFlagTagid(const std::string &name)
Definition: xml2sdb.h:230
void InsertShimTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:202
BOOL EndWriteListTag(TAGID tagid)
Definition: xml2sdb.cpp:690
void WriteBinary(TAG tag, const GUID &guid, bool always=false)
Definition: xml2sdb.cpp:645
void InsertFlagTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:225
TAGID FindFlagTagid(const sdbstring &name)
Definition: xml2sdb.cpp:822
TAGID FindPatchTagid(const std::string &name)
Definition: xml2sdb.h:219
std::map< sdbstring, TAGID > KnownPatches
Definition: xml2sdb.h:244
std::list< Exe > Exes
Definition: xml2sdb.h:240
void WriteNull(TAG tag)
Definition: xml2sdb.cpp:680
std::map< sdbstring, TAGID > KnownFlags
Definition: xml2sdb.h:245
bool toSdb(LPCWSTR path)
Definition: xml2sdb.cpp:739
void InsertPatchTagid(const sdbstring &name, TAGID tagid)
Definition: xml2sdb.cpp:807
TAGID BeginWriteListTag(TAG tag)
Definition: xml2sdb.cpp:685
bool fromXml(const char *fileName, PlatformType platform)
Definition: xml2sdb.cpp:730
void InsertFlagTagid(const sdbstring &name, TAGID tagid)
Definition: xml2sdb.cpp:817
std::map< sdbstring, TAGID > KnownShims
Definition: xml2sdb.h:243
std::list< Layer > Layers
Definition: xml2sdb.h:239
void WriteDWord(TAG tag, DWORD value, bool always=false)
Definition: xml2sdb.cpp:668
std::string Name
Definition: xml2sdb.h:235
Definition: xml2sdb.h:163
PlatformType Platform
Definition: xml2sdb.h:175
std::list< MatchingFile > MatchingFiles
Definition: xml2sdb.h:172
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:600
TAGID Tagid
Definition: xml2sdb.h:171
std::string Name
Definition: xml2sdb.h:167
std::string AppName
Definition: xml2sdb.h:169
GUID ExeID
Definition: xml2sdb.h:168
std::list< ShimRef > ShimRefs
Definition: xml2sdb.h:173
bool toSdb(Database &db)
Definition: xml2sdb.cpp:617
std::string Vendor
Definition: xml2sdb.h:170
std::list< FlagRef > FlagRefs
Definition: xml2sdb.h:174
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:377
TAGID FlagTagid
Definition: xml2sdb.h:84
bool toSdb(Database &db)
Definition: xml2sdb.cpp:383
std::string Name
Definition: xml2sdb.h:83
Definition: xml2sdb.h:101
std::string Name
Definition: xml2sdb.h:105
TAGID Tagid
Definition: xml2sdb.h:106
bool toSdb(Database &db)
Definition: xml2sdb.cpp:441
QWORD ProcessParamFlags
Definition: xml2sdb.h:109
QWORD KernelFlags
Definition: xml2sdb.h:107
QWORD UserFlags
Definition: xml2sdb.h:108
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:430
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:284
std::string Module
Definition: xml2sdb.h:63
bool Include
Definition: xml2sdb.h:64
bool toSdb(Database &db)
Definition: xml2sdb.cpp:296
Definition: xml2sdb.h:128
PlatformType Platform
Definition: xml2sdb.h:137
std::string Name
Definition: xml2sdb.h:132
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:522
std::list< FlagRef > FlagRefs
Definition: xml2sdb.h:135
std::list< Data > Datas
Definition: xml2sdb.h:136
std::list< ShimRef > ShimRefs
Definition: xml2sdb.h:134
TAGID Tagid
Definition: xml2sdb.h:133
bool toSdb(Database &db)
Definition: xml2sdb.cpp:531
std::list< Shim > Shims
Definition: xml2sdb.h:181
std::list< InExclude > InExcludes
Definition: xml2sdb.h:180
std::list< Flag > Flags
Definition: xml2sdb.h:182
std::string OriginalFilename
Definition: xml2sdb.h:157
std::string InternalName
Definition: xml2sdb.h:149
DWORD LinkDate
Definition: xml2sdb.h:154
std::string ProductVersion
Definition: xml2sdb.h:151
DWORD LinkerVersion
Definition: xml2sdb.h:159
std::string FileDescription
Definition: xml2sdb.h:156
std::string ProductName
Definition: xml2sdb.h:150
std::string Name
Definition: xml2sdb.h:145
std::string BinFileVersion
Definition: xml2sdb.h:153
std::string CompanyName
Definition: xml2sdb.h:148
std::string UptoBinFileVersion
Definition: xml2sdb.h:158
bool toSdb(Database &db)
Definition: xml2sdb.cpp:569
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:549
DWORD Checksum
Definition: xml2sdb.h:147
std::string VerLanguage
Definition: xml2sdb.h:155
std::string FileVersion
Definition: xml2sdb.h:152
std::string CommandLine
Definition: xml2sdb.h:73
bool toSdb(Database &db)
Definition: xml2sdb.cpp:359
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:350
std::string Name
Definition: xml2sdb.h:72
std::list< InExclude > InExcludes
Definition: xml2sdb.h:75
TAGID ShimTagid
Definition: xml2sdb.h:74
Definition: xml2sdb.h:88
GUID FixID
Definition: xml2sdb.h:94
bool toSdb(Database &db)
Definition: xml2sdb.cpp:411
std::list< InExclude > InExcludes
Definition: xml2sdb.h:96
PlatformType Platform
Definition: xml2sdb.h:97
std::string DllFile
Definition: xml2sdb.h:93
TAGID Tagid
Definition: xml2sdb.h:95
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:399
std::string Name
Definition: xml2sdb.h:92
Definition: fs_rec.h:143
Definition: name.c:39
const char * name
Definition: xml2sdb.h:50
DWORD flag
Definition: xml2sdb.h:51
Definition: ecma_167.h:138
const uint16_t * LPCWSTR
Definition: typedefs.h:57
Definition: pdh_main.c:64
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
PlatformType
Definition: xml2sdb.h:36
@ PLATFORM_NONE
Definition: xml2sdb.h:37
@ PLATFORM_ANY
Definition: xml2sdb.h:45
@ PLATFORM_X86
Definition: xml2sdb.h:40
@ PLATFORM_AMD64
Definition: xml2sdb.h:43
DWORD str_to_enum(const std::string &str, const str_to_flag *table)
Definition: xml2sdb.cpp:51
std::basic_string< WCHAR > sdbstring
Definition: xml2sdb.h:31
str_to_flag platform_to_flag[]
Definition: xml2sdb.cpp:42