ReactOS 0.4.16-dev-1946-g52006dd
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
21namespace tinyxml2
22{
23class XMLHandle;
24}
26
27typedef std::basic_string<WCHAR> sdbstring;
28
29struct Database;
30
32{
34
35 // This is all we support for now
37 // There is another platform here, but we don't support it yet
38 // https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/kshim/drvmain.htm
40
42};
43
45{
46 const char *name;
48};
49
51
52DWORD str_to_enum(const std::string &str, const str_to_flag *table);
53
55{
56 bool fromXml(XMLHandle dbNode);
57 bool toSdb(Database& db);
58
59 std::string Module;
60 bool Include = false;
61};
62
63struct ShimRef
64{
65 bool fromXml(XMLHandle dbNode);
66 bool toSdb(Database& db);
67
68 std::string Name;
69 std::string CommandLine;
71 std::list<InExclude> InExcludes;
72};
73
74struct FlagRef
75{
76 bool fromXml(XMLHandle dbNode);
77 bool toSdb(Database& db);
78
79 std::string Name;
81};
82
83struct Shim
84{
85 bool fromXml(XMLHandle dbNode);
86 bool toSdb(Database& db);
87
88 std::string Name;
89 std::string DllFile;
90 GUID FixID = {};
92 std::list<InExclude> InExcludes;
94};
95
96struct Flag
97{
98 bool fromXml(XMLHandle dbNode);
99 bool toSdb(Database& db);
100
101 std::string Name;
106};
107
108
109struct Data
110{
111 bool fromXml(XMLHandle dbNode);
112 bool toSdb(Database& db);
113
114 std::string Name;
117
118 std::string StringData;
121};
122
123struct Layer
124{
125 bool fromXml(XMLHandle dbNode);
126 bool toSdb(Database& db);
127
128 std::string Name;
130 std::list<ShimRef> ShimRefs;
131 std::list<FlagRef> FlagRefs;
132 std::list<Data> Datas;
134};
135
137{
138 bool fromXml(XMLHandle dbNode);
139 bool toSdb(Database& db);
140
141 std::string Name;
144 std::string CompanyName;
145 std::string InternalName;
146 std::string ProductName;
147 std::string ProductVersion;
148 std::string FileVersion;
149 std::string BinFileVersion;
151 std::string VerLanguage;
152 std::string FileDescription;
153 std::string OriginalFilename;
156};
157
158struct Exe
159{
160 bool fromXml(XMLHandle dbNode);
161 bool toSdb(Database& db);
162
163 std::string Name;
165 std::string AppName;
166 std::string Vendor;
168 std::list<MatchingFile> MatchingFiles;
169 std::list<ShimRef> ShimRefs;
170 std::list<FlagRef> FlagRefs;
172};
173
175{
176 std::list<InExclude> InExcludes;
177 std::list<Shim> Shims;
178 std::list<Flag> Flags;
179};
180
182{
183 bool fromXml(const char* fileName, PlatformType platform);
184 bool fromXml(XMLHandle dbNode);
185 bool toSdb(LPCWSTR path);
186
187 void WriteString(TAG tag, const sdbstring& str, bool always = false);
188 void WriteString(TAG tag, const std::string& str, bool always = false);
189 void WriteBinary(TAG tag, const GUID& guid, bool always = false);
190 void WriteBinary(TAG tag, const std::vector<BYTE>& data, bool always = false);
191 void WriteDWord(TAG tag, DWORD value, bool always = false);
192 void WriteQWord(TAG tag, QWORD value, bool always = false);
193 void WriteNull(TAG tag);
196
197 void InsertShimTagid(const sdbstring& name, TAGID tagid);
198 inline void InsertShimTagid(const std::string& name, TAGID tagid)
199 {
200 InsertShimTagid(sdbstring(name.begin(), name.end()), tagid);
201 }
203 inline TAGID FindShimTagid(const std::string& name)
204 {
205 return FindShimTagid(sdbstring(name.begin(), name.end()));
206 }
207
208
209 void InsertPatchTagid(const sdbstring& name, TAGID tagid);
210 inline void InsertPatchTagid(const std::string& name, TAGID tagid)
211 {
212 InsertPatchTagid(sdbstring(name.begin(), name.end()), tagid);
213 }
215 inline TAGID FindPatchTagid(const std::string& name)
216 {
217 return FindPatchTagid(sdbstring(name.begin(), name.end()));
218 }
219
220 void InsertFlagTagid(const sdbstring& name, TAGID tagid);
221 inline void InsertFlagTagid(const std::string& name, TAGID tagid)
222 {
223 InsertFlagTagid(sdbstring(name.begin(), name.end()), tagid);
224 }
226 inline TAGID FindFlagTagid(const std::string& name)
227 {
228 return FindFlagTagid(sdbstring(name.begin(), name.end()));
229 }
230
231 std::string Name;
232 GUID ID = {};
233
235 std::list<Layer> Layers;
236 std::list<Exe> Exes;
237
238private:
239 std::map<sdbstring, TAGID> KnownShims;
240 std::map<sdbstring, TAGID> KnownPatches;
241 std::map<sdbstring, TAGID> KnownFlags;
242 PDB pdb = nullptr;
244};
245
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:114
DWORD DWordData
Definition: xml2sdb.h:119
bool toSdb(Database &db)
Definition: xml2sdb.cpp:494
std::string StringData
Definition: xml2sdb.h:118
QWORD QWordData
Definition: xml2sdb.h:120
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:467
TAGID Tagid
Definition: xml2sdb.h:115
void InsertPatchTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:210
PDB pdb
Definition: xml2sdb.h:242
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:232
TAGID FindShimTagid(const std::string &name)
Definition: xml2sdb.h:203
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:226
void InsertShimTagid(const std::string &name, TAGID tagid)
Definition: xml2sdb.h:198
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:221
TAGID FindFlagTagid(const sdbstring &name)
Definition: xml2sdb.cpp:822
TAGID FindPatchTagid(const std::string &name)
Definition: xml2sdb.h:215
std::map< sdbstring, TAGID > KnownPatches
Definition: xml2sdb.h:240
std::list< Exe > Exes
Definition: xml2sdb.h:236
void WriteNull(TAG tag)
Definition: xml2sdb.cpp:680
std::map< sdbstring, TAGID > KnownFlags
Definition: xml2sdb.h:241
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:239
std::list< Layer > Layers
Definition: xml2sdb.h:235
void WriteDWord(TAG tag, DWORD value, bool always=false)
Definition: xml2sdb.cpp:668
std::string Name
Definition: xml2sdb.h:231
Definition: xml2sdb.h:159
PlatformType Platform
Definition: xml2sdb.h:171
std::list< MatchingFile > MatchingFiles
Definition: xml2sdb.h:168
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:600
TAGID Tagid
Definition: xml2sdb.h:167
std::string Name
Definition: xml2sdb.h:163
std::string AppName
Definition: xml2sdb.h:165
GUID ExeID
Definition: xml2sdb.h:164
std::list< ShimRef > ShimRefs
Definition: xml2sdb.h:169
bool toSdb(Database &db)
Definition: xml2sdb.cpp:617
std::string Vendor
Definition: xml2sdb.h:166
std::list< FlagRef > FlagRefs
Definition: xml2sdb.h:170
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:377
TAGID FlagTagid
Definition: xml2sdb.h:80
bool toSdb(Database &db)
Definition: xml2sdb.cpp:383
std::string Name
Definition: xml2sdb.h:79
Definition: xml2sdb.h:97
std::string Name
Definition: xml2sdb.h:101
TAGID Tagid
Definition: xml2sdb.h:102
bool toSdb(Database &db)
Definition: xml2sdb.cpp:441
QWORD ProcessParamFlags
Definition: xml2sdb.h:105
QWORD KernelFlags
Definition: xml2sdb.h:103
QWORD UserFlags
Definition: xml2sdb.h:104
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:430
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:284
std::string Module
Definition: xml2sdb.h:59
bool Include
Definition: xml2sdb.h:60
bool toSdb(Database &db)
Definition: xml2sdb.cpp:296
Definition: xml2sdb.h:124
PlatformType Platform
Definition: xml2sdb.h:133
std::string Name
Definition: xml2sdb.h:128
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:522
std::list< FlagRef > FlagRefs
Definition: xml2sdb.h:131
std::list< Data > Datas
Definition: xml2sdb.h:132
std::list< ShimRef > ShimRefs
Definition: xml2sdb.h:130
TAGID Tagid
Definition: xml2sdb.h:129
bool toSdb(Database &db)
Definition: xml2sdb.cpp:531
std::list< Shim > Shims
Definition: xml2sdb.h:177
std::list< InExclude > InExcludes
Definition: xml2sdb.h:176
std::list< Flag > Flags
Definition: xml2sdb.h:178
std::string OriginalFilename
Definition: xml2sdb.h:153
std::string InternalName
Definition: xml2sdb.h:145
DWORD LinkDate
Definition: xml2sdb.h:150
std::string ProductVersion
Definition: xml2sdb.h:147
DWORD LinkerVersion
Definition: xml2sdb.h:155
std::string FileDescription
Definition: xml2sdb.h:152
std::string ProductName
Definition: xml2sdb.h:146
std::string Name
Definition: xml2sdb.h:141
std::string BinFileVersion
Definition: xml2sdb.h:149
std::string CompanyName
Definition: xml2sdb.h:144
std::string UptoBinFileVersion
Definition: xml2sdb.h:154
bool toSdb(Database &db)
Definition: xml2sdb.cpp:569
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:549
DWORD Checksum
Definition: xml2sdb.h:143
std::string VerLanguage
Definition: xml2sdb.h:151
std::string FileVersion
Definition: xml2sdb.h:148
std::string CommandLine
Definition: xml2sdb.h:69
bool toSdb(Database &db)
Definition: xml2sdb.cpp:359
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:350
std::string Name
Definition: xml2sdb.h:68
std::list< InExclude > InExcludes
Definition: xml2sdb.h:71
TAGID ShimTagid
Definition: xml2sdb.h:70
Definition: xml2sdb.h:84
GUID FixID
Definition: xml2sdb.h:90
bool toSdb(Database &db)
Definition: xml2sdb.cpp:411
std::list< InExclude > InExcludes
Definition: xml2sdb.h:92
PlatformType Platform
Definition: xml2sdb.h:93
std::string DllFile
Definition: xml2sdb.h:89
TAGID Tagid
Definition: xml2sdb.h:91
bool fromXml(XMLHandle dbNode)
Definition: xml2sdb.cpp:399
std::string Name
Definition: xml2sdb.h:88
Definition: fs_rec.h:143
Definition: name.c:39
const char * name
Definition: xml2sdb.h:46
DWORD flag
Definition: xml2sdb.h:47
Definition: ecma_167.h:138
Definition: pdh_main.c:96
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
PlatformType
Definition: xml2sdb.h:32
@ PLATFORM_NONE
Definition: xml2sdb.h:33
@ PLATFORM_ANY
Definition: xml2sdb.h:41
@ PLATFORM_X86
Definition: xml2sdb.h:36
@ PLATFORM_AMD64
Definition: xml2sdb.h:39
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:27
str_to_flag platform_to_flag[]
Definition: xml2sdb.cpp:42
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185