Reactos
1/*
2 * PROJECT: ReactOS Application compatibility module
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: common structures / functions
5 * COPYRIGHT: Copyright 2013 Mislav Blažević
6 * Copyright 2017-2019 Mark Jansen (mark.jansen@reactos.org)
7 */
8
9#ifndef APPHELP_H
10#define APPHELP_H
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16#include <appcompat/sdbtypes.h>
17
18/* Flags for SdbInitDatabase */
19#define HID_DOS_PATHS 0x1
20#define HID_DATABASE_FULLPATH 0x2
21#define HID_NO_DATABASE 0x4
22#define HID_DATABASE_TYPE_MASK 0xF00F0000
23#define SDB_DATABASE_MAIN_MSI 0x80020000
24#define SDB_DATABASE_MAIN_SHIM 0x80030000
25#define SDB_DATABASE_MAIN_DRIVERS 0x80040000
26
27// Shim database types
28#define SDB_DATABASE_SHIM 0x00010000
29
30typedef struct _SDB {
31 PDB pdb;
32 BOOL auto_loaded;
33} SDB, *HSDB;
34
35typedef struct tagATTRINFO {
36 TAG type;
37 DWORD flags;
38 union {
39 QWORD qwattr;
40 DWORD dwattr;
41 WCHAR *lpattr;
42 };
43} ATTRINFO, *PATTRINFO;
44
45#define SDB_MAX_SDBS 16
46#define SDB_MAX_EXES 16
47#define SDB_MAX_LAYERS 8
48
49/* Flags for adwExeFlags */
50#define SHIMREG_DISABLE_SHIM (0x00000001)
51#define SHIMREG_DISABLE_APPHELP (0x00000002)
52#define SHIMREG_APPHELP_NOUI (0x00000004)
53#define SHIMREG_APPHELP_CANCEL (0x10000000)
54#define SHIMREG_DISABLE_SXS (0x00000010)
55#define SHIMREG_DISABLE_LAYER (0x00000020)
56#define SHIMREG_DISABLE_DRIVER (0x00000040)
57
58/* Flags for dwFlags */
59#define SHIMREG_HAS_ENVIRONMENT (0x1)
60
61/* Flags for SdbGetMatchingExe */
62#define SDBGMEF_IGNORE_ENVIRONMENT (0x1)
63
64typedef struct tagSDBQUERYRESULT {
65 TAGREF atrExes[SDB_MAX_EXES];
66 DWORD adwExeFlags[SDB_MAX_EXES];
67 TAGREF atrLayers[SDB_MAX_LAYERS];
68 DWORD dwLayerFlags;
69 TAGREF trApphelp;
70 DWORD dwExeCount;
71 DWORD dwLayerCount;
72 GUID guidID;
73 DWORD dwFlags;
74 DWORD dwCustomSDBMap;
75 GUID rgGuidDB[SDB_MAX_SDBS];
76} SDBQUERYRESULT, *PSDBQUERYRESULT;
77
78
79#define DB_INFO_FLAGS_VALID_GUID 1
80
81typedef struct _DB_INFORMATION
82{
83 DWORD dwFlags;
84 DWORD dwMajor;
85 DWORD dwMinor;
86 LPCWSTR Description;
87 GUID Id;
88 /* Win10+ has an extra field here */
89} DB_INFORMATION, *PDB_INFORMATION;
90
91
92#ifndef APPHELP_NOSDBPAPI
93#include "sdbpapi.h"
94#endif
95
96/* sdbapi.c */
97PWSTR SdbpStrDup(LPCWSTR string);
98DWORD SdbpStrsize(PCWSTR string);
99HSDB WINAPI SdbInitDatabase(DWORD, LPCWSTR);
100void WINAPI SdbReleaseDatabase(HSDB);
101BOOL WINAPI SdbGUIDToString(CONST GUID *Guid, PWSTR GuidString, SIZE_T Length);
102LPCWSTR WINAPI SdbTagToString(TAG tag);
103
104PDB WINAPI SdbOpenDatabase(LPCWSTR path, PATH_TYPE type);
105void WINAPI SdbCloseDatabase(PDB);
106BOOL WINAPI SdbIsNullGUID(CONST GUID *Guid);
107HRESULT WINAPI SdbGetAppPatchDir(HSDB db, LPWSTR path, DWORD size);
108LPWSTR WINAPI SdbGetStringTagPtr(PDB pdb, TAGID tagid);
109TAGID WINAPI SdbFindFirstNamedTag(PDB pdb, TAGID root, TAGID find, TAGID nametag, LPCWSTR find_name);
110DWORD WINAPI SdbQueryDataExTagID(PDB pdb, TAGID tiExe, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize, TAGID *ptiData);
111BOOL WINAPI SdbGetDatabaseInformation(PDB pdb, PDB_INFORMATION information);
112VOID WINAPI SdbFreeDatabaseInformation(_In_opt_ PDB_INFORMATION information);
113BOOL WINAPI SdbRegisterDatabaseEx(_In_ LPCWSTR pszDatabasePath, _In_ DWORD dwDatabaseType, _In_opt_ const PULONGLONG pTimeStamp);
114BOOL WINAPI SdbUnregisterDatabase(_In_ const GUID *pguidDB);
115
116/* sdbread.c */
117BOOL WINAPI SdbpReadData(PDB pdb, PVOID dest, DWORD offset, DWORD num);
118TAG WINAPI SdbGetTagFromTagID(PDB pdb, TAGID tagid);
119TAGID WINAPI SdbFindFirstTag(PDB pdb, TAGID parent, TAG tag);
120TAGID WINAPI SdbFindNextTag(PDB pdb, TAGID parent, TAGID prev_child);
121BOOL WINAPI SdbGetDatabaseID(PDB pdb, GUID* Guid);
122DWORD WINAPI SdbReadDWORDTag(PDB pdb, TAGID tagid, DWORD ret);
123QWORD WINAPI SdbReadQWORDTag(PDB pdb, TAGID tagid, QWORD ret);
124TAGID WINAPI SdbGetFirstChild(PDB pdb, TAGID parent);
125TAGID WINAPI SdbGetNextChild(PDB pdb, TAGID parent, TAGID prev_child);
126DWORD WINAPI SdbGetTagDataSize(PDB pdb, TAGID tagid);
127LPWSTR WINAPI SdbpGetString(PDB pdb, TAGID tagid, PDWORD size);
128BOOL WINAPI SdbReadBinaryTag(PDB pdb, TAGID tagid, PBYTE buffer, DWORD size);
129
130/* sdbfileattr.c*/
131BOOL WINAPI SdbGetFileAttributes(LPCWSTR path, PATTRINFO *attr_info_ret, LPDWORD attr_count);
132BOOL WINAPI SdbFreeFileAttributes(PATTRINFO attr_info);
133
134/* layer.c */
135BOOL WINAPI AllowPermLayer(PCWSTR path);
136BOOL WINAPI SdbGetPermLayerKeys(PCWSTR wszPath, PWSTR pwszLayers, PDWORD pdwBytes, DWORD dwFlags);
137BOOL WINAPI SetPermLayerState(PCWSTR wszPath, PCWSTR wszLayer, DWORD dwFlags, BOOL bMachine, BOOL bEnable);
138
139/* hsdb.c */
140BOOL WINAPI SdbGetMatchingExe(HSDB hsdb, LPCWSTR path, LPCWSTR module_name, LPCWSTR env, DWORD flags, PSDBQUERYRESULT result);
141BOOL WINAPI SdbTagIDToTagRef(HSDB hsdb, PDB pdb, TAGID tiWhich, TAGREF* ptrWhich);
142BOOL WINAPI SdbTagRefToTagID(HSDB hsdb, TAGREF trWhich, PDB* ppdb, TAGID* ptiWhich);
143BOOL WINAPI SdbUnpackAppCompatData(HSDB hsdb, LPCWSTR pszImageName, PVOID pData, PSDBQUERYRESULT pQueryResult);
144DWORD WINAPI SdbQueryData(HSDB hsdb, TAGREF trWhich, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize);
145
146#define ATTRIBUTE_AVAILABLE 0x1
147#define ATTRIBUTE_FAILED 0x2
148
149#include <appcompat/sdbtagid.h>
150
151#ifdef __cplusplus
152} // extern "C"
153#endif
154
155#endif // APPHELP_H