ReactOS 0.4.17-dev-1190-g4c812f4
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-2026 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 bool KShim = false;
77};
78
79struct FlagRef
80{
81 bool fromXml(XMLHandle dbNode);
82 bool toSdb(Database& db);
83
84 std::string Name;
86};
87
88struct Shim
89{
90 bool fromXml(XMLHandle dbNode);
91 bool toSdb(Database& db);
92
93 std::string Name;
94 std::string DllFile;
95 GUID FixID = {};
97 std::list<InExclude> InExcludes;
99 bool KShim = false;
100};
101
102struct Flag
103{
104 bool fromXml(XMLHandle dbNode);
105 bool toSdb(Database& db);
106
107 std::string Name;
112};
113
114
115struct Data
116{
117 bool fromXml(XMLHandle dbNode);
118 bool toSdb(Database& db);
119
120 std::string Name;
123
124 std::string StringData;
127};
128
129struct Layer
130{
131 bool fromXml(XMLHandle dbNode);
132 bool toSdb(Database& db);
133
134 std::string Name;
136 std::list<ShimRef> ShimRefs;
137 std::list<FlagRef> FlagRefs;
138 std::list<Data> Datas;
140};
141
143{
144 bool fromXml(XMLHandle dbNode);
145 bool toSdb(Database& db);
146
147 std::string Name;
150 std::string CompanyName;
151 std::string InternalName;
152 std::string ProductName;
153 std::string ProductVersion;
154 std::string FileVersion;
155 std::string BinFileVersion;
157 std::string VerLanguage;
158 std::string FileDescription;
159 std::string OriginalFilename;
162};
163
164struct Exe
165{
166 bool fromXml(XMLHandle dbNode);
167 bool toSdb(Database& db);
168
169 std::string Name;
171 std::string AppName;
172 std::string Vendor;
174 std::list<MatchingFile> MatchingFiles;
175 std::list<ShimRef> ShimRefs;
176 std::list<FlagRef> FlagRefs;
178 bool KDriver = false;
179};
180
182{
183 std::list<InExclude> InExcludes;
184 std::list<Shim> Shims;
185 std::list<Flag> Flags;
186};
187
189{
190 bool fromXml(const char* fileName, PlatformType platform);
191 bool fromXml(XMLHandle dbNode);
192 bool toSdb(LPCWSTR path);
193
194 void WriteString(TAG tag, const sdbstring& str, bool always = false);
195 void WriteString(TAG tag, const std::string& str, bool always = false);
196 void WriteBinary(TAG tag, const GUID& guid, bool always = false);
197 void WriteBinary(TAG tag, const std::vector<BYTE>& data, bool always = false);
198 void WriteDWord(TAG tag, DWORD value, bool always = false);
199 void WriteQWord(TAG tag, QWORD value, bool always = false);
200 void WriteNull(TAG tag);
203
204 void InsertShimTagid(const sdbstring& name, TAGID tagid);
205 inline void InsertShimTagid(const std::string& name, TAGID tagid)
206 {
207 InsertShimTagid(sdbstring(name.begin(), name.end()), tagid);
208 }
210 inline TAGID FindShimTagid(const std::string& name)
211 {
212 return FindShimTagid(sdbstring(name.begin(), name.end()));
213 }
214
215
216 void InsertPatchTagid(const sdbstring& name, TAGID tagid);
217 inline void InsertPatchTagid(const std::string& name, TAGID tagid)
218 {
219 InsertPatchTagid(sdbstring(name.begin(), name.end()), tagid);
220 }
222 inline TAGID FindPatchTagid(const std::string& name)
223 {
224 return FindPatchTagid(sdbstring(name.begin(), name.end()));
225 }
226
227 void InsertFlagTagid(const sdbstring& name, TAGID tagid);
228 inline void InsertFlagTagid(const std::string& name, TAGID tagid)
229 {
230 InsertFlagTagid(sdbstring(name.begin(), name.end()), tagid);
231 }
233 inline TAGID FindFlagTagid(const std::string& name)
234 {
235 return FindFlagTagid(sdbstring(name.begin(), name.end()));
236 }
237
238 std::string FindKShimModule(const std::string& name);
239
240 std::string Name;
241 GUID ID = {};
242
244 std::list<Layer> Layers;
245 std::list<Exe> Exes;
246
247 // Driver database (drvmain.sdb)
248 std::list<Exe> KDrivers;
249 std::list<Shim> KShims;
250
251private:
252 std::map<sdbstring, TAGID> KnownShims;
253 std::map<sdbstring, TAGID> KnownPatches;
254 std::map<sdbstring, TAGID> KnownFlags;
255 PDB pdb = nullptr;
257};
258
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:120
DWORD DWordData
Definition: xml2sdb.h:125
bool toSdb(Database &db)
Definition: xml2sdb.cpp:517
std::string StringData
Definition: xml2sdb.h:124
QWORD QWordData
Definition: xml2sdb.h:126
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:490
TAGID Tagid
Definition: xml2sdb.h:121
void InsertPatchTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:217
PDB pdb
Definition: xml2sdb.h:255
void InsertShimTagid(const sdbstring &name, TAGID tagid)
Definition: xml2sdb.cpp:835
TAGID FindShimTagid(const sdbstring &name)
Definition: xml2sdb.cpp:840
GUID ID
Definition: xml2sdb.h:241
TAGID FindShimTagid(const std::string &name)
Definition: xml2sdb.h:210
void WriteString(TAG tag, const sdbstring &str, bool always=false)
Definition: xml2sdb.cpp:688
TAGID FindPatchTagid(const sdbstring &name)
Definition: xml2sdb.cpp:850
void WriteQWord(TAG tag, QWORD value, bool always=false)
Definition: xml2sdb.cpp:705
TAGID FindFlagTagid(const std::string &name)
Definition: xml2sdb.h:233
void InsertShimTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:205
BOOL EndWriteListTag(TAGID tagid)
Definition: xml2sdb.cpp:721
void WriteBinary(TAG tag, const GUID &guid, bool always=false)
Definition: xml2sdb.cpp:676
void InsertFlagTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:228
TAGID FindFlagTagid(const sdbstring &name)
Definition: xml2sdb.cpp:860
TAGID FindPatchTagid(const std::string &name)
Definition: xml2sdb.h:222
std::map< sdbstring, TAGID > KnownPatches
Definition: xml2sdb.h:253
std::string FindKShimModule(const std::string &name)
Definition: xml2sdb.cpp:865
std::list< Exe > Exes
Definition: xml2sdb.h:245
void WriteNull(TAG tag)
Definition: xml2sdb.cpp:711
std::map< sdbstring, TAGID > KnownFlags
Definition: xml2sdb.h:254
std::list< Shim > KShims
Definition: xml2sdb.h:249
bool toSdb(LPCWSTR path)
Definition: xml2sdb.cpp:773
void InsertPatchTagid(const sdbstring &name, TAGID tagid)
Definition: xml2sdb.cpp:845
TAGID BeginWriteListTag(TAG tag)
Definition: xml2sdb.cpp:716
bool fromXml(const char *fileName, PlatformType platform)
Definition: xml2sdb.cpp:764
void InsertFlagTagid(const sdbstring &name, TAGID tagid)
Definition: xml2sdb.cpp:855
std::map< sdbstring, TAGID > KnownShims
Definition: xml2sdb.h:252
std::list< Layer > Layers
Definition: xml2sdb.h:244
void WriteDWord(TAG tag, DWORD value, bool always=false)
Definition: xml2sdb.cpp:699
std::list< Exe > KDrivers
Definition: xml2sdb.h:248
std::string Name
Definition: xml2sdb.h:240
Definition: xml2sdb.h:165
PlatformType Platform
Definition: xml2sdb.h:177
std::list< MatchingFile > MatchingFiles
Definition: xml2sdb.h:174
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:623
TAGID Tagid
Definition: xml2sdb.h:173
std::string Name
Definition: xml2sdb.h:169
std::string AppName
Definition: xml2sdb.h:171
GUID ExeID
Definition: xml2sdb.h:170
std::list< ShimRef > ShimRefs
Definition: xml2sdb.h:175
bool KDriver
Definition: xml2sdb.h:178
bool toSdb(Database &db)
Definition: xml2sdb.cpp:648
std::string Vendor
Definition: xml2sdb.h:172
std::list< FlagRef > FlagRefs
Definition: xml2sdb.h:176
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:394
TAGID FlagTagid
Definition: xml2sdb.h:85
bool toSdb(Database &db)
Definition: xml2sdb.cpp:400
std::string Name
Definition: xml2sdb.h:84
Definition: xml2sdb.h:103
std::string Name
Definition: xml2sdb.h:107
TAGID Tagid
Definition: xml2sdb.h:108
bool toSdb(Database &db)
Definition: xml2sdb.cpp:464
QWORD ProcessParamFlags
Definition: xml2sdb.h:111
QWORD KernelFlags
Definition: xml2sdb.h:109
QWORD UserFlags
Definition: xml2sdb.h:110
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:453
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:130
PlatformType Platform
Definition: xml2sdb.h:139
std::string Name
Definition: xml2sdb.h:134
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:545
std::list< FlagRef > FlagRefs
Definition: xml2sdb.h:137
std::list< Data > Datas
Definition: xml2sdb.h:138
std::list< ShimRef > ShimRefs
Definition: xml2sdb.h:136
TAGID Tagid
Definition: xml2sdb.h:135
bool toSdb(Database &db)
Definition: xml2sdb.cpp:554
std::list< Shim > Shims
Definition: xml2sdb.h:184
std::list< InExclude > InExcludes
Definition: xml2sdb.h:183
std::list< Flag > Flags
Definition: xml2sdb.h:185
std::string OriginalFilename
Definition: xml2sdb.h:159
std::string InternalName
Definition: xml2sdb.h:151
DWORD LinkDate
Definition: xml2sdb.h:156
std::string ProductVersion
Definition: xml2sdb.h:153
DWORD LinkerVersion
Definition: xml2sdb.h:161
std::string FileDescription
Definition: xml2sdb.h:158
std::string ProductName
Definition: xml2sdb.h:152
std::string Name
Definition: xml2sdb.h:147
std::string BinFileVersion
Definition: xml2sdb.h:155
std::string CompanyName
Definition: xml2sdb.h:150
std::string UptoBinFileVersion
Definition: xml2sdb.h:160
bool toSdb(Database &db)
Definition: xml2sdb.cpp:592
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:572
DWORD Checksum
Definition: xml2sdb.h:149
std::string VerLanguage
Definition: xml2sdb.h:157
std::string FileVersion
Definition: xml2sdb.h:154
std::string CommandLine
Definition: xml2sdb.h:73
bool toSdb(Database &db)
Definition: xml2sdb.cpp:363
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
bool KShim
Definition: xml2sdb.h:76
Definition: xml2sdb.h:89
GUID FixID
Definition: xml2sdb.h:95
bool toSdb(Database &db)
Definition: xml2sdb.cpp:433
std::list< InExclude > InExcludes
Definition: xml2sdb.h:97
bool KShim
Definition: xml2sdb.h:99
PlatformType Platform
Definition: xml2sdb.h:98
std::string DllFile
Definition: xml2sdb.h:94
TAGID Tagid
Definition: xml2sdb.h:96
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:416
std::string Name
Definition: xml2sdb.h:93
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