ReactOS 0.4.15-dev-8131-g4988de4
sdbinst.c File Reference
#include <tchar.h>
#include <windef.h>
#include <winbase.h>
#include <winreg.h>
#include <strsafe.h>
#include <objbase.h>
#include <apphelp.h>
#include <shlwapi.h>
Include dependency graph for sdbinst.c:

Go to the source code of this file.

Macros

#define APPCOMPAT_CUSTOM_REG_PATH   L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Custom"
 
#define APPCOMPAT_LAYERS_REG_PATH   L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Custom\\Layers"
 
#define APPCOMPAT_INSTALLEDSDB_REG_PATH   L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\InstalledSDB"
 
#define UNINSTALL_REG_PATH   L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
 
#define DBPATH_KEY_NAME   L"DatabasePath"
 
#define SDB_EXT   L".sdb"
 
#define GUID_STR_LENGTH   38
 
#define GUID_SBD_NAME_LENGTH   (GUID_STR_LENGTH + ARRAYSIZE(SDB_EXT))
 

Functions

BOOL SdbUninstallByGuid (_In_ LPWSTR guidSdbStr)
 
HRESULT RegisterSdbEntry (_In_ PWCHAR sdbEntryName, _In_ LPCWSTR dbGuid, _In_ ULONGLONG time, _In_ BOOL isInstall, _In_ BOOL isExe)
 
HRESULT AddUninstallKey (_In_ LPCWSTR dbName, _In_ LPCWSTR sdbInstalledPath, _In_ LPCWSTR guidDbStr)
 
BOOL GetSdbGuid (_In_ PDB pdb, _In_ TAGID tagDb, _Out_ GUID *guid)
 
HRESULT ProcessLayers (_In_ PDB pdb, _In_ TAGID tagDb, _In_opt_ LPCWSTR guidDbStr, _In_opt_ ULONGLONG time, _In_ BOOL isInstall)
 
HRESULT ProcessExe (_In_ PDB pdb, _In_ TAGID tagDb, _In_opt_ LPCWSTR guidDbStr, _In_opt_ ULONGLONG time, _In_ BOOL isInstall)
 
HRESULT CopySdbToAppPatch (_In_ LPCWSTR sourceSdbPath, _In_ LPCWSTR destSdbPath)
 
HRESULT BuildPathToSdb (_In_ PWCHAR buffer, _In_ SIZE_T bufLen, _In_ LPCWSTR guidDbStr)
 
BOOL SdbInstall (_In_ LPCWSTR sdbPath)
 
HRESULT DeleteUninstallKey (_In_ LPCWSTR keyName)
 
BOOL SdbUninstall (_In_ LPWSTR sdbPath)
 
BOOL ValidateGuidString (_In_ PWCHAR guidStr)
 
BOOL SdbUninstallByName (_In_ LPWSTR nameSdbStr)
 
void ShowHelp ()
 
int _tmain (int argc, LPWSTR argv[])
 

Macro Definition Documentation

◆ APPCOMPAT_CUSTOM_REG_PATH

#define APPCOMPAT_CUSTOM_REG_PATH   L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Custom"

Definition at line 18 of file sdbinst.c.

◆ APPCOMPAT_INSTALLEDSDB_REG_PATH

#define APPCOMPAT_INSTALLEDSDB_REG_PATH   L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\InstalledSDB"

Definition at line 20 of file sdbinst.c.

◆ APPCOMPAT_LAYERS_REG_PATH

#define APPCOMPAT_LAYERS_REG_PATH   L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Custom\\Layers"

Definition at line 19 of file sdbinst.c.

◆ DBPATH_KEY_NAME

#define DBPATH_KEY_NAME   L"DatabasePath"

Definition at line 22 of file sdbinst.c.

◆ GUID_SBD_NAME_LENGTH

#define GUID_SBD_NAME_LENGTH   (GUID_STR_LENGTH + ARRAYSIZE(SDB_EXT))

Definition at line 25 of file sdbinst.c.

◆ GUID_STR_LENGTH

#define GUID_STR_LENGTH   38

Definition at line 24 of file sdbinst.c.

◆ SDB_EXT

#define SDB_EXT   L".sdb"

Definition at line 23 of file sdbinst.c.

◆ UNINSTALL_REG_PATH

#define UNINSTALL_REG_PATH   L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

Definition at line 21 of file sdbinst.c.

Function Documentation

◆ _tmain()

int _tmain ( int  argc,
LPWSTR  argv[] 
)

Definition at line 819 of file sdbinst.c.

820{
821 LPWSTR sdbPath = NULL;
822 BOOL isInstall = TRUE;
823 BOOL isUninstByGuid = FALSE;
824 BOOL isUninstByName = FALSE;
826 LPWSTR guidSdbStr = NULL;
827 LPWSTR nameSdbStr = NULL;
828
829 if (argc < 2)
830 {
831 ShowHelp();
832 }
833
834 for (int i = 1; i < argc; ++i)
835 {
836 if (argv[i][0] != L'-')
837 {
838 sdbPath = argv[i];
839 break;
840 }
841
842 switch (argv[i][1])
843 {
844 case L'?':
845 ShowHelp();
846 return ERROR_SUCCESS;
847 break;
848
849 case L'u':
850 isInstall = FALSE;
851 break;
852
853 case L'g':
854 ++i;
855
856 if (i >= argc)
857 {
859 }
860
861 guidSdbStr = argv[i];
862 wprintf(L"guidSdbStr %ls\n", guidSdbStr);
863
864 isUninstByGuid = TRUE;
865 isInstall = FALSE;
866 break;
867
868 case L'n':
869 ++i;
870
871 if (i >= argc)
872 {
874 }
875
876 nameSdbStr = argv[i];
877 wprintf(L"nameSdbStr %ls\n", nameSdbStr);
878
879 isUninstByName = TRUE;
880 isInstall = FALSE;
881 break;
882 }
883 }
884
885 if (isInstall)
886 {
887 wprintf(L"install\n");
888 success = SdbInstall(sdbPath);
889 }
890 else if (isUninstByGuid)
891 {
892 wprintf(L"uninstall by GUID\n");
893 success = SdbUninstallByGuid(guidSdbStr);
894 }
895 else if (isUninstByName)
896 {
897 wprintf(L"uninstall by name\n");
898 success = SdbUninstallByName(nameSdbStr);
899 }
900 else
901 {
902 wprintf(L"uninstall\n");
903 success = SdbUninstall(sdbPath);
904 }
905
906 if (!success)
907 {
908 wprintf(isInstall ? L"Sdb install failed\n" : L"Sdb uninstall failed\n");
909 return -1;
910 }
911
912 return ERROR_SUCCESS;
913}
static int argc
Definition: ServiceArgs.c:12
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define argv
Definition: mplay32.c:18
#define L(x)
Definition: ntvdm.h:50
BOOL SdbUninstallByName(_In_ LPWSTR nameSdbStr)
Definition: sdbinst.c:728
BOOL SdbUninstall(_In_ LPWSTR sdbPath)
Definition: sdbinst.c:551
void ShowHelp()
Definition: sdbinst.c:809
BOOL SdbUninstallByGuid(_In_ LPWSTR guidSdbStr)
Definition: sdbinst.c:672
BOOL SdbInstall(_In_ LPCWSTR sdbPath)
Definition: sdbinst.c:400
#define wprintf(...)
Definition: whoami.c:18
#define success(from, fromstr, to, tostr)
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ AddUninstallKey()

HRESULT AddUninstallKey ( _In_ LPCWSTR  dbName,
_In_ LPCWSTR  sdbInstalledPath,
_In_ LPCWSTR  guidDbStr 
)

Definition at line 104 of file sdbinst.c.

108{
109 WCHAR sdbinstPath[MAX_PATH];
110 WCHAR regName[MAX_PATH];
111 WCHAR uninstString[MAX_PATH];
112 HKEY hKey = NULL;
114
115 UINT count = GetSystemWindowsDirectory(sdbinstPath, MAX_PATH);
116 if (sdbinstPath[count - 1] != L'\\')
117 {
118 hres = StringCchCatW(sdbinstPath, MAX_PATH, L"\\");
119 if (FAILED(hres))
120 {
121 wprintf(L"StringCchCatW error: 0x%08X", hres);
122 goto end;
123 }
124 }
125
126 // Full path to sdbinst.exe
127 hres = StringCchCatW(sdbinstPath, MAX_PATH, L"System32\\sdbinst.exe");
128 if (FAILED(hres))
129 {
130 wprintf(L"StringCchCatW error: 0x%08X", hres);
131 goto end;
132 }
133
134 // Sdb GUID registry key
135 hres = StringCchPrintfW(regName, MAX_PATH, L"%ls\\%ls", UNINSTALL_REG_PATH, guidDbStr);
136 if (FAILED(hres))
137 {
138 wprintf(L"StringCchPrintfW error: 0x%08X", hres);
139 goto end;
140 }
141
142 // Create main key
144 regName,
145 0,
146 NULL,
149 NULL,
150 &hKey,
151 NULL);
152
153 if (status != ERROR_SUCCESS)
154 {
155 wprintf(L"RegKeyCreateEx error: 0x%08X", status);
157 goto end;
158 }
159
160 // Set Display name
161 DWORD length = wcslen(dbName) * sizeof(WCHAR);
163 L"DisplayName",
164 0,
165 REG_SZ,
166 (PBYTE)dbName,
167 length + sizeof(WCHAR));
168 if (status != ERROR_SUCCESS)
169 {
170 wprintf(L"RegSetValueExW error: 0x%08X", status);
172 goto end;
173 }
174
175 // Uninstall full string
176 hres = StringCchPrintfW(uninstString, MAX_PATH, L"%ls -u \"%ls\"", sdbinstPath, sdbInstalledPath);
177 if (FAILED(hres))
178 {
179 wprintf(L"StringCchPrintfW error: 0x%08X", hres);
180 goto end;
181 }
182
183 // Set uninstall string
184 length = wcslen(uninstString) * sizeof(WCHAR);
186 L"UninstallString",
187 0,
188 REG_SZ,
189 (PBYTE)uninstString,
190 length + sizeof(WCHAR));
191 if (status != ERROR_SUCCESS)
192 {
193 wprintf(L"RegSetValueExW error: 0x%08X", status);
195 goto end;
196 }
197
198end:
199 if (hKey)
200 {
202 }
203
204 return hres;
205}
#define RegCloseKey(hKey)
Definition: registry.h:49
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
#define MAX_PATH
Definition: compat.h:34
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLuint GLuint end
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define FAILED(hr)
Definition: intsafe.h:51
#define REG_SZ
Definition: layer.c:22
HRESULT hres
Definition: protocol.c:465
unsigned int UINT
Definition: ndis.h:50
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
BYTE * PBYTE
Definition: pedump.c:66
#define UNINSTALL_REG_PATH
Definition: sdbinst.c:21
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
Definition: ps.c:97
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by SdbInstall().

◆ BuildPathToSdb()

HRESULT BuildPathToSdb ( _In_ PWCHAR  buffer,
_In_ SIZE_T  bufLen,
_In_ LPCWSTR  guidDbStr 
)

Definition at line 373 of file sdbinst.c.

377{
378 ZeroMemory(buffer, bufLen * sizeof(WCHAR));
379
380 // Can't use here SdbGetAppPatchDir, because Windows XP haven't this function
381 UINT count = GetSystemWindowsDirectory(buffer, bufLen);
382 if (buffer[count - 1] != L'\\')
383 {
384 buffer[count] = L'\\';
385 }
386
387 HRESULT res = StringCchCatW(buffer, bufLen, L"AppPatch\\Custom\\");
388 if (FAILED(res))
389 {
390 goto end;
391 }
392
393 res = StringCchCatW(buffer, bufLen, guidDbStr);
394
395end:
396 return res;
397}
GLuint res
Definition: glext.h:9613
GLuint buffer
Definition: glext.h:5915
#define ZeroMemory
Definition: winbase.h:1712

Referenced by SdbInstall().

◆ CopySdbToAppPatch()

HRESULT CopySdbToAppPatch ( _In_ LPCWSTR  sourceSdbPath,
_In_ LPCWSTR  destSdbPath 
)

Definition at line 316 of file sdbinst.c.

319{
321 PWCHAR pTmpSysdir = NULL;
322 SIZE_T destLen = wcslen(destSdbPath);
323 PWCHAR sysdirPath = (PWCHAR)HeapAlloc(GetProcessHeap(), 0, destLen * sizeof(WCHAR));
324
325 if (sysdirPath == NULL)
326 {
328 goto end;
329 }
330
331 // Get parent folder fo sdb file
332 CopyMemory(sysdirPath, destSdbPath, destLen * sizeof(WCHAR));
333 pTmpSysdir = StrRChrW(sysdirPath, sysdirPath + destLen, L'\\');
334 if (pTmpSysdir == NULL)
335 {
336 wprintf(L"Can't find directory separator\n");
337 goto end;
338 }
339 else
340 {
341 *pTmpSysdir = UNICODE_NULL;
342 }
343
344 // Create directory if need
345 if (!CreateDirectory(sysdirPath, NULL))
346 {
349 {
350 wprintf(L"Can't create folder %ls\n Error: 0x%08X\n", sysdirPath, error);
351 goto end;
352 }
354 }
355
356 // Copy file
357 if (!CopyFile(sourceSdbPath, destSdbPath, TRUE))
358 {
360 wprintf(L"Can't copy sdb file");
361 }
362
363end:
364 if (sysdirPath)
365 {
366 HeapFree(GetProcessHeap(), 0, sysdirPath);
367 }
368
370}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
LPWSTR WINAPI StrRChrW(LPCWSTR str, LPCWSTR end, WORD ch)
Definition: string.c:556
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define error(str)
Definition: mkdosfs.c:1605
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define UNICODE_NULL
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint16_t * PWCHAR
Definition: typedefs.h:56
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CopyFile
Definition: winbase.h:3741
#define CreateDirectory
Definition: winbase.h:3746
#define CopyMemory
Definition: winbase.h:1710

Referenced by SdbInstall().

◆ DeleteUninstallKey()

HRESULT DeleteUninstallKey ( _In_ LPCWSTR  keyName)

Definition at line 513 of file sdbinst.c.

515{
516 HKEY hKey = NULL;
518
521 0,
522 NULL,
525 NULL,
526 &hKey,
527 NULL);
528
529 if (status != ERROR_SUCCESS)
530 {
532 goto end;
533 }
534
535 status = RegDeleteKeyW(hKey, keyName);
536 if (status != ERROR_SUCCESS)
537 {
539 }
540
541end:
542 if (hKey)
543 {
545 }
546
547 return hres;
548}
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239

Referenced by SdbUninstall().

◆ GetSdbGuid()

BOOL GetSdbGuid ( _In_ PDB  pdb,
_In_ TAGID  tagDb,
_Out_ GUID guid 
)

Definition at line 211 of file sdbinst.c.

215{
216 TAGID tagDbId;
217
218 tagDbId = SdbFindFirstTag(pdb, tagDb, TAG_DATABASE_ID);
219 if (!tagDbId)
220 {
221 wprintf(L"Can't find database id tag");
222 return FALSE;
223 }
224
225 if (!SdbReadBinaryTag(pdb, tagDbId, (PBYTE)guid, sizeof(GUID)))
226 {
227 wprintf(L"Can't read database id");
228 return FALSE;
229 }
230
231 return TRUE;
232}
TAGID WINAPI SdbFindFirstTag(PDB pdb, TAGID parent, TAG tag)
Definition: sdbread.c:208
BOOL WINAPI SdbReadBinaryTag(PDB pdb, TAGID tagid, PBYTE buffer, DWORD size)
Definition: sdbread.c:338
DWORD TAGID
static PDB pdb
Definition: db.cpp:172
#define TAG_DATABASE_ID
Definition: db.cpp:122
const GUID * guid

Referenced by SdbInstall(), and SdbUninstall().

◆ ProcessExe()

HRESULT ProcessExe ( _In_ PDB  pdb,
_In_ TAGID  tagDb,
_In_opt_ LPCWSTR  guidDbStr,
_In_opt_ ULONGLONG  time,
_In_ BOOL  isInstall 
)

Definition at line 275 of file sdbinst.c.

281{
283 TAGID tagExeName;
284 TAGID tagExePrev = 0;
285
286 TAGID tagExe = SdbFindFirstTag(pdb, tagDb, TAG_EXE);
287
288 // Add all exe to registry (AppCompatFlags)
289 while (tagExe != 0 && (tagExe != tagExePrev))
290 {
291 tagExeName = SdbFindFirstTag(pdb, tagExe, TAG_NAME);
292 if (!tagExeName)
293 {
294 wprintf(L"Can't find exe tag\n");
296 break;
297 }
298
299 LPWSTR name = SdbGetStringTagPtr(pdb, tagExeName);
300
301 res = RegisterSdbEntry(name, guidDbStr, time, isInstall, TRUE);
302 if (FAILED(res))
303 {
304 wprintf(L"Can't register exe 0x%08X\n", res);
305 break;
306 }
307
308 tagExePrev = tagExe;
309 tagExe = SdbFindNextTag(pdb, tagDb, tagExe);
310 }
311
312 return res;
313}
TAGID WINAPI SdbFindNextTag(PDB pdb, TAGID parent, TAGID prev_child)
Definition: sdbread.c:231
LPWSTR WINAPI SdbGetStringTagPtr(PDB pdb, TAGID tagid)
Definition: sdbread.c:375
#define TAG_EXE
Definition: db.cpp:87
__u16 time
Definition: mkdosfs.c:8
HRESULT RegisterSdbEntry(_In_ PWCHAR sdbEntryName, _In_ LPCWSTR dbGuid, _In_ ULONGLONG time, _In_ BOOL isInstall, _In_ BOOL isExe)
Definition: sdbinst.c:30
Definition: name.c:39
#define TAG_NAME
Definition: vfat.h:553
#define ERROR_NOT_FOUND
Definition: winerror.h:690

Referenced by SdbInstall(), and SdbUninstall().

◆ ProcessLayers()

HRESULT ProcessLayers ( _In_ PDB  pdb,
_In_ TAGID  tagDb,
_In_opt_ LPCWSTR  guidDbStr,
_In_opt_ ULONGLONG  time,
_In_ BOOL  isInstall 
)

Definition at line 235 of file sdbinst.c.

241{
243 TAGID tagLayerName;
244 TAGID prevTagLayer = 0;
245
246 TAGID tagLayer = SdbFindFirstTag(pdb, tagDb, TAG_LAYER);
247
248 // Add all layers to registry (AppCompatFlags)
249 while (tagLayer && (tagLayer != prevTagLayer))
250 {
251 tagLayerName = SdbFindFirstTag(pdb, tagLayer, TAG_NAME);
252 if (!tagLayerName)
253 {
255 break;
256 }
257
258 LPWSTR name = SdbGetStringTagPtr(pdb, tagLayerName);
259
260 res = RegisterSdbEntry(name, guidDbStr, time, isInstall, FALSE);
261 if (FAILED(res))
262 {
263 wprintf(L"Can't register layer\n");
264 break;
265 }
266
267 prevTagLayer = tagLayer;
268 tagLayer = SdbFindNextTag(pdb, tagDb, tagLayer);
269 }
270
271 return res;
272}
#define TAG_LAYER
Definition: db.cpp:90

Referenced by SdbInstall(), and SdbUninstall().

◆ RegisterSdbEntry()

HRESULT RegisterSdbEntry ( _In_ PWCHAR  sdbEntryName,
_In_ LPCWSTR  dbGuid,
_In_ ULONGLONG  time,
_In_ BOOL  isInstall,
_In_ BOOL  isExe 
)

Definition at line 30 of file sdbinst.c.

36{
37 WCHAR regName[MAX_PATH];
38 HKEY hKey = NULL;
41
42 hres = StringCchPrintfW(regName, MAX_PATH, L"%ls\\%ls",
44 sdbEntryName);
45 if (FAILED(hres))
46 {
47 wprintf(L"StringCchPrintfW error: 0x%08X\n", hres);
48 goto end;
49 }
50
51 // Remove key
52 if (!isInstall)
53 {
56 {
58 }
59
61 }
62
63 // Create main key
65 regName,
66 0,
67 NULL,
70 NULL,
71 &hKey,
72 NULL);
73 if (status != ERROR_SUCCESS)
74 {
75 wprintf(L"RegKeyCreateEx error: 0x%08X", status);
77 goto end;
78 }
79
80 // Set installed time
82 dbGuid,
83 0,
85 (PBYTE)&time,
86 sizeof(time));
87 if (status != ERROR_SUCCESS)
88 {
89 wprintf(L"RegSetValueExW error: 0x%08X", status);
91 goto end;
92 }
93
94end:
95 if (hKey)
96 {
98 }
99
100 return hres;
101}
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define REG_QWORD
Definition: sdbapi.c:597
#define APPCOMPAT_CUSTOM_REG_PATH
Definition: sdbinst.c:18
#define APPCOMPAT_LAYERS_REG_PATH
Definition: sdbinst.c:19

Referenced by ProcessExe(), and ProcessLayers().

◆ SdbInstall()

BOOL SdbInstall ( _In_ LPCWSTR  sdbPath)

Definition at line 400 of file sdbinst.c.

402{
403 BOOL res = FALSE;
404 PDB pdb = NULL;
405 TAGID tagDb;
406 TAGID tagDbName;
407 GUID dbGuid = {0};
408 FILETIME systemTime = {0};
409 ULARGE_INTEGER currentTime = {0};
410 WCHAR sysdirPatchPath[MAX_PATH];
411 WCHAR guidDbStr[GUID_SBD_NAME_LENGTH];
412
413 GetSystemTimeAsFileTime(&systemTime);
414 currentTime.LowPart = systemTime.dwLowDateTime;
415 currentTime.HighPart = systemTime.dwHighDateTime;
416
417 // Open database
418 pdb = SdbOpenDatabase(sdbPath, DOS_PATH);
419 if (pdb == NULL)
420 {
421 wprintf(L"Can't open database %ls\n", sdbPath);
422 goto end;
423 }
424
426 if (!tagDb)
427 {
428 wprintf(L"Can't find database tag\n");
429 goto end;
430 }
431
432 // Get database GUID
433 if (!GetSdbGuid(pdb, tagDb, &dbGuid))
434 {
435 wprintf(L"GetSdbGuid error\n");
436 goto end;
437 }
438
439 StringFromGUID2(&dbGuid, guidDbStr, GUID_SBD_NAME_LENGTH);
441 if (FAILED(hres))
442 {
443 wprintf(L"StringCchCatW error 0x%08X\n", hres);
444 goto end;
445 }
446
447 wprintf(L"Database guid %ls\n", guidDbStr);
448
449 tagDbName = SdbFindFirstTag(pdb, tagDb, TAG_NAME);
450 if (!tagDbName)
451 {
452 wprintf(L"Can't get tag name\n");
453 goto end;
454 }
455
456 LPWSTR dbName = SdbGetStringTagPtr(pdb, tagDbName);
457 wprintf(L"Database name %ls\n", dbName);
458
459 // Process exe tags
460 hres = ProcessExe(pdb, tagDb, guidDbStr, currentTime.QuadPart, TRUE);
461 if (FAILED(hres))
462 {
463 wprintf(L"Process exe failed. Status: 0x%08X", res);
464 goto end;
465 }
466
467 // Proess layer tags
468 hres = ProcessLayers(pdb, tagDb, guidDbStr, currentTime.QuadPart, TRUE);
469 if (FAILED(hres))
470 {
471 wprintf(L"Process layers failed. Status: 0x%08X", res);
472 goto end;
473 }
474
475 // Create full path to sdb in system folder
476 hres = BuildPathToSdb(sysdirPatchPath, ARRAYSIZE(sysdirPatchPath), guidDbStr);
477 if (FAILED(hres))
478 {
479 wprintf(L"Build path error\n");
480 goto end;
481 }
482
483 wprintf(L"file path %ls\n", sysdirPatchPath);
484
485 res = CopySdbToAppPatch(sdbPath, sysdirPatchPath);
486 if (FAILED(res))
487 {
488 wprintf(L"Copy sdb error. Status: 0x%08X\n", res);
489 goto end;
490 }
491
492 AddUninstallKey(dbName, sysdirPatchPath, guidDbStr);
493
494 // Registration
495 if (!SdbRegisterDatabaseEx(sysdirPatchPath, SDB_DATABASE_SHIM, &currentTime.QuadPart))
496 {
497 wprintf(L"SdbRegisterDatabaseEx failed");
498 goto end;
499 }
500
501 res = TRUE;
502
503end:
504 if (pdb)
505 {
507 }
508
509 return res;
510}
#define SDB_DATABASE_SHIM
Definition: apphelp.h:28
PDB WINAPI SdbOpenDatabase(LPCWSTR path, PATH_TYPE type)
Definition: sdbapi.c:329
void WINAPI SdbCloseDatabase(PDB)
Definition: sdbapi.c:373
#define DOS_PATH
Definition: db.cpp:32
#define TAGID_ROOT
Definition: db.cpp:39
#define TAG_DATABASE
Definition: db.cpp:85
BOOL WINAPI SdbRegisterDatabaseEx(_In_ LPCWSTR pszDatabasePath, _In_ DWORD dwDatabaseType, _In_opt_ const PULONGLONG pTimeStamp)
Definition: apphelp.c:261
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
HRESULT BuildPathToSdb(_In_ PWCHAR buffer, _In_ SIZE_T bufLen, _In_ LPCWSTR guidDbStr)
Definition: sdbinst.c:373
HRESULT CopySdbToAppPatch(_In_ LPCWSTR sourceSdbPath, _In_ LPCWSTR destSdbPath)
Definition: sdbinst.c:316
HRESULT ProcessLayers(_In_ PDB pdb, _In_ TAGID tagDb, _In_opt_ LPCWSTR guidDbStr, _In_opt_ ULONGLONG time, _In_ BOOL isInstall)
Definition: sdbinst.c:235
BOOL GetSdbGuid(_In_ PDB pdb, _In_ TAGID tagDb, _Out_ GUID *guid)
Definition: sdbinst.c:211
#define GUID_SBD_NAME_LENGTH
Definition: sdbinst.c:25
HRESULT ProcessExe(_In_ PDB pdb, _In_ TAGID tagDb, _In_opt_ LPCWSTR guidDbStr, _In_opt_ ULONGLONG time, _In_ BOOL isInstall)
Definition: sdbinst.c:275
HRESULT AddUninstallKey(_In_ LPCWSTR dbName, _In_ LPCWSTR sdbInstalledPath, _In_ LPCWSTR guidDbStr)
Definition: sdbinst.c:104
#define SDB_EXT
Definition: sdbinst.c:23
DWORD dwHighDateTime
Definition: mapidefs.h:66
DWORD dwLowDateTime
Definition: mapidefs.h:65
$ULONG LowPart
Definition: ntbasedef.h:569
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:570

Referenced by _tmain().

◆ SdbUninstall()

BOOL SdbUninstall ( _In_ LPWSTR  sdbPath)

Definition at line 551 of file sdbinst.c.

553{
554 BOOL res = FALSE;
555 PWCHAR sdbName = NULL;
556 PDB pdb;
557 TAGID tagDb;
558 GUID dbGuid = {0};
559 WCHAR guidDbStr[GUID_SBD_NAME_LENGTH];
560
561 SIZE_T sdbPathLen = wcslen(sdbPath);
562 sdbName = sdbPath + sdbPathLen;
563
564 wprintf(L"uninstall path %ls\n", sdbPath);
565 sdbName = StrRChrW(sdbPath, sdbPath + sdbPathLen, L'\\');
566 if (sdbName == NULL)
567 {
568 sdbName = sdbPath;
569 }
570 else
571 {
572 sdbName++;
573 }
574
575 wprintf(L"uninstall name %ls\n", sdbName);
576
577 // open sdb
578 pdb = SdbOpenDatabase(sdbPath, DOS_PATH);
579 if (pdb == NULL)
580 {
581 wprintf(L"Can't open database %ls\n", sdbPath);
582 return FALSE;
583 }
584
586 if (!tagDb)
587 {
588 wprintf(L"Can't find database tag\n");
589 goto end;
590 }
591
592 if (!GetSdbGuid(pdb, tagDb, &dbGuid))
593 {
594 wprintf(L"GetSdbGuid error\n");
595 goto end;
596 }
597
598 // Database name must be GUID string
599 if (wcslen(sdbName) + 1 != GUID_SBD_NAME_LENGTH)
600 {
601 StringFromGUID2(&dbGuid, guidDbStr, GUID_SBD_NAME_LENGTH);
603 return SdbUninstallByGuid(guidDbStr);
604 }
605
606 //remove regkey in appatch/custom
607 HRESULT hres = ProcessExe(pdb, tagDb, NULL, 0, FALSE);
608 if (FAILED(hres))
609 {
610 wprintf(L"Process exe fail\n");
611 goto end;
612 }
613
614 hres = ProcessLayers(pdb, tagDb, NULL, 0, FALSE);
615 if (FAILED(hres))
616 {
617 wprintf(L"Process layers fail\n");
618 goto end;
619 }
620
622 pdb = NULL;
623
624 hres = DeleteUninstallKey(sdbName);
625 if (FAILED(hres))
626 {
627 wprintf(L"Remove uninstall key fail\n");
628 }
629
630 if (!SdbUnregisterDatabase(&dbGuid))
631 {
632 wprintf(L"SdbUnregisterDatabase\n");
633 return FALSE;
634 }
635
637 if (!DeleteFileW(sdbPath))
638 {
639 wprintf(L"Remove file fail 0x%08X\n", GetLastError());
640 return FALSE;
641 }
642
643 res = TRUE;
644
645end:
646 if (pdb)
648 return res;
649}
BOOL WINAPI SdbUnregisterDatabase(_In_ const GUID *pguidDB)
Definition: apphelp.c:406
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI SetFileAttributesW(LPCWSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:794
HRESULT DeleteUninstallKey(_In_ LPCWSTR keyName)
Definition: sdbinst.c:513

Referenced by _tmain(), SdbUninstallByGuid(), and SdbUninstallByName().

◆ SdbUninstallByGuid()

BOOL SdbUninstallByGuid ( _In_ LPWSTR  guidSdbStr)

Definition at line 672 of file sdbinst.c.

674{
675 BOOL res = FALSE;
676 HKEY hKey = NULL;
677 HKEY guidKey = NULL;
679 WCHAR dbPath[MAX_PATH];
680 DWORD keyValSize = sizeof(dbPath);
681
682 if (!ValidateGuidString(guidSdbStr))
683 {
684 wprintf(L"Invalid GUID: %ls\n", guidSdbStr);
685 return res;
686 }
687
689
690 if (status != ERROR_SUCCESS)
691 {
692 wprintf(L"RegOpenKeyW error: 0x%08X", status);
693 goto end;
694 }
695
696 status = RegOpenKeyExW(hKey, guidSdbStr, 0, KEY_READ | KEY_QUERY_VALUE, &guidKey);
697
698 if (status != ERROR_SUCCESS)
699 {
700 wprintf(L"Cant open key: 0x%08X %ls\n", status, guidSdbStr);
701 goto end;
702 }
703
704 status = RegQueryValueExW(guidKey, DBPATH_KEY_NAME, NULL, NULL, (LPBYTE)dbPath, &keyValSize);
705 if (status != ERROR_SUCCESS)
706 {
707 wprintf(L"RegQueryValueExW: 0x%08X\n", status);
708 goto end;
709 }
710
711 res = SdbUninstall(dbPath);
712
713end:
714 if (hKey)
715 {
717 }
718
719 if (guidKey)
720 {
721 RegCloseKey(guidKey);
722 }
723
724 return res;
725}
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
BOOL ValidateGuidString(_In_ PWCHAR guidStr)
Definition: sdbinst.c:652
#define APPCOMPAT_INSTALLEDSDB_REG_PATH
Definition: sdbinst.c:20
#define DBPATH_KEY_NAME
Definition: sdbinst.c:22
unsigned char * LPBYTE
Definition: typedefs.h:53

Referenced by _tmain(), and SdbUninstall().

◆ SdbUninstallByName()

BOOL SdbUninstallByName ( _In_ LPWSTR  nameSdbStr)

Definition at line 728 of file sdbinst.c.

730{
731 BOOL res = FALSE;
733 HKEY hKey = NULL;
734 HKEY subKey = NULL;
735 DWORD index = 0;
736 WCHAR keyName[MAX_PATH];
737 DWORD keyNameLen = ARRAYSIZE(keyName);
738 DWORD keyValSize;
739 WCHAR dbDescript[MAX_PATH];
740 WCHAR dbPath[MAX_PATH];
741
743
744 if (status != ERROR_SUCCESS)
745 {
746 wprintf(L"RegOpenKeyW error: 0x%08X", status);
747 goto end;
748 }
749
750 status = RegEnumKeyEx(hKey, index, keyName, &keyNameLen, NULL, NULL, NULL, NULL);
751 wprintf(L"0x%08X %d %ls \n", status, keyNameLen, keyName);
752
753 // Search database GUID by name
754 while (status == ERROR_SUCCESS)
755 {
756 status = RegOpenKeyExW(hKey, keyName, 0, KEY_READ | KEY_QUERY_VALUE, &subKey);
757 if (status != ERROR_SUCCESS)
758 {
759 break;
760 }
761
762 keyValSize = sizeof(dbDescript);
763 status = RegQueryValueExW(subKey, L"DatabaseDescription", NULL, NULL, (LPBYTE)dbDescript, &keyValSize);
764 if (status != ERROR_SUCCESS)
765 {
766 break;
767 }
768
769 wprintf(L"dbdescript: %ls \n", dbDescript);
770
771 if (_wcsnicmp(dbDescript, nameSdbStr, keyNameLen) == 0)
772 {
773 // Take db full path
774 keyValSize = sizeof(dbPath);
775 status = RegQueryValueExW(subKey, DBPATH_KEY_NAME, NULL, NULL, (LPBYTE)dbPath, &keyValSize);
776 if (status != ERROR_SUCCESS)
777 {
778 dbPath[0] = UNICODE_NULL;
779 break;
780 }
781
782 wprintf(L"dbpath: 0x%08X %ls \n", status, dbPath);
783 RegCloseKey(subKey);
784 break;
785 }
786
787 RegCloseKey(subKey);
788
789 keyName[0] = UNICODE_NULL;
790
791 ++index;
792 keyNameLen = ARRAYSIZE(keyName);
793 status = RegEnumKeyExW(hKey, index, keyName, &keyNameLen, NULL, NULL, NULL, NULL);
794 }
795
797
798 if (dbPath[0] != UNICODE_NULL)
799 {
800 res = SdbUninstall(dbPath);
801 }
802
803end:
804 return res;
805}
#define index(s, c)
Definition: various.h:29
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
GLuint index
Definition: glext.h:6031
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
#define RegEnumKeyEx
Definition: winreg.h:510

Referenced by _tmain().

◆ ShowHelp()

void ShowHelp ( )

Definition at line 809 of file sdbinst.c.

810{
811 /* FIXME: to be localized */
812 wprintf(L"Using: sdbinst [-?][-q][-u][-g][-n] foo.sdb | {guid} | \"name\" \n"
813 L"-? - show help\n"
814 L"-u - uninstall\n"
815 L"-g - {guid} file GUID (only uninstall)\n"
816 L"-n - \"name\" - file name (only uninstall)\n");
817}

Referenced by _tmain(), and DECLARE_INTERFACE_().

◆ ValidateGuidString()

BOOL ValidateGuidString ( _In_ PWCHAR  guidStr)

Definition at line 652 of file sdbinst.c.

654{
656
657 if (length == GUID_STR_LENGTH &&
658 guidStr[0] == L'{' &&
659 guidStr[GUID_STR_LENGTH - 1] == L'}' &&
660 guidStr[9] == L'-' &&
661 guidStr[14] == L'-' &&
662 guidStr[19] == L'-' &&
663 guidStr[24] == L'-')
664 {
665 return TRUE;
666 }
667
668 return FALSE;
669}
static WCHAR guidStr[]
Definition: asn.c:531
#define GUID_STR_LENGTH
Definition: sdbinst.c:24
uint32_t ULONG
Definition: typedefs.h:59

Referenced by SdbUninstallByGuid().