[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