[PATCH 4/11] apphelp: SdbOpenDatabase.
Mislav Blazevic
krofnica996 at gmail.com
Wed Jul 31 17:58:41 CDT 2013
---
dlls/apphelp/apphelp.c | 128 +++++++++++++++++++++++++++++++++++++++++++++-
dlls/apphelp/apphelp.spec | 2 +-
include/appcompatapi.h | 1 +
3 files changed, 129 insertions(+), 2 deletions(-)
diff --git a/dlls/apphelp/apphelp.c b/dlls/apphelp/apphelp.c
index 14b1264..3692a25 100644
--- a/dlls/apphelp/apphelp.c
+++ b/dlls/apphelp/apphelp.c
@@ -342,7 +342,7 @@ LPCWSTR WINAPI SdbTagToString(TAG tag)
* Closes specified database and frees its memory
*
* PARAMS
- * db [I] Handle to the shim database
+ * db [I] Handle to the shim database
*
* RETURNS
* This function does not return a value.
@@ -353,3 +353,129 @@ void WINAPI SdbCloseDatabase(PDB db)
HeapFree(GetProcessHeap(), 0, db->data);
HeapFree(GetProcessHeap(), 0, db);
}
+
+static BOOL WINAPI SdbSafeAdd(DWORD a, DWORD b, PDWORD c)
+{
+ if ((a + b) >= a)
+ {
+ *c = a + b;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static BOOL WINAPI SdbReadData(PDB db, PVOID dest, DWORD offset, DWORD num)
+{
+ DWORD size;
+
+ if (!SdbSafeAdd(offset, num, &size))
+ {
+ TRACE("Failed to add %u and %u, overflow!", offset, num);
+ return FALSE;
+ }
+
+ if (db->size < size)
+ {
+ TRACE("Cannot read %u bytes starting at %u from database of
size %u, overflow!",
+ num, offset, db->size);
+ return FALSE;
+ }
+
+ memcpy(dest, db->data + offset, num);
+ return TRUE;
+}
+
+static PDB WINAPI SdbAlloc()
+{
+ PDB db;
+
+ db = (PDB)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DB));
+
+ if (db)
+ db->file = INVALID_HANDLE_VALUE;
+
+ return db;
+}
+
+/**************************************************************************
+ * SdbOpenDatabase [APPHELP.@]
+ *
+ * Opens specified shim database file
+ *
+ * PARAMS
+ * path [I] Path to the shim database
+ * type [I] Type of path. Either DOS_PATH or NT_PATH
+ *
+ * RETURNS
+ * Success: Handle to the shim database
+ * Failure: NULL handle
+ */
+PDB WINAPI SdbOpenDatabase(LPCWSTR path, PATH_TYPE type)
+{
+ NTSTATUS status;
+ IO_STATUS_BLOCK io;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING str;
+ PDB db;
+ BYTE header[12];
+
+ TRACE("%s, 0x%x\n", debugstr_w(path), type);
+
+ db = SdbAlloc();
+ if (!db)
+ {
+ TRACE("Failed to allocate memory for shim database\n");
+ return NULL;
+ }
+
+ if (type == DOS_PATH)
+ {
+ if (!RtlDosPathNameToNtPathName_U(path, &str, NULL, NULL))
+ return NULL;
+ }
+ else
+ RtlInitUnicodeString(&str, path);
+
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, NULL, NULL);
+
+ status = NtCreateFile(&db->file, FILE_GENERIC_READ,
+ &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
+ FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0);
+
+ if (type == DOS_PATH)
+ RtlFreeUnicodeString(&str);
+
+ if (status != STATUS_SUCCESS)
+ {
+ SdbCloseDatabase(db);
+ TRACE("Failed to open shim database file\n");
+ return NULL;
+ }
+
+ db->size = GetFileSize(db->file, NULL);
+ db->data = HeapAlloc(GetProcessHeap(), 0, db->size);
+ ReadFile(db->file, db->data, db->size, NULL, NULL);
+
+ if (!SdbReadData(db, &header, 0, 12))
+ {
+ SdbCloseDatabase(db);
+ TRACE("Failed to read shim database header\n");
+ return NULL;
+ }
+
+ if (memcmp(&header[8], "sdbf", 4) != 0)
+ {
+ SdbCloseDatabase(db);
+ TRACE("Shim database header is invalid\n");
+ return NULL;
+ }
+
+ if (*(DWORD*)&header[0] != (DWORD)2)
+ {
+ SdbCloseDatabase(db);
+ TRACE("Invalid version\n");
+ return NULL;
+ }
+
+ return db;
+}
diff --git a/dlls/apphelp/apphelp.spec b/dlls/apphelp/apphelp.spec
index 1de6c25..bd98c77 100644
--- a/dlls/apphelp/apphelp.spec
+++ b/dlls/apphelp/apphelp.spec
@@ -96,7 +96,7 @@
@ stub SdbOpenApphelpInformation
@ stub SdbOpenApphelpInformationByID
@ stub SdbOpenApphelpResourceFile
-@ stub SdbOpenDatabase
+@ stdcall SdbOpenDatabase(wstr long)
@ stub SdbOpenDbFromGuid
@ stub SdbOpenLocalDatabase
@ stub SdbPackAppCompatData
diff --git a/include/appcompatapi.h b/include/appcompatapi.h
index c3e1843..27212d4 100644
--- a/include/appcompatapi.h
+++ b/include/appcompatapi.h
@@ -27,6 +27,7 @@ extern "C" {
BOOL WINAPI ApphelpCheckShellObject(REFCLSID, BOOL, ULONGLONG *);
LPCWSTR WINAPI SdbTagToString(TAG);
void WINAPI SdbCloseDatabase(PDB);
+PDB WINAPI SdbOpenDatabase(LPCWSTR, PATH_TYPE);
typedef enum _PATH_TYPE {
DOS_PATH,
--
1.8.3.4
More information about the wine-patches
mailing list