[3/11] apphelp: Implement SdbGetTagFromTagID.

Mislav Blazevic krofnica996 at gmail.com
Thu Aug 1 17:23:11 CDT 2013


---
 dlls/apphelp/apphelp.c    | 64 ++++++++++++++++++++++++++++++++++++++++++-----
 dlls/apphelp/apphelp.h    | 15 +++++++++++
 dlls/apphelp/apphelp.spec |  2 +-
 3 files changed, 74 insertions(+), 7 deletions(-)

diff --git a/dlls/apphelp/apphelp.c b/dlls/apphelp/apphelp.c
index f58fafa..e74529c 100644
--- a/dlls/apphelp/apphelp.c
+++ b/dlls/apphelp/apphelp.c
@@ -26,12 +26,6 @@

 WINE_DEFAULT_DEBUG_CHANNEL(apphelp);

-/* FIXME: don't know where to place that enum */
-typedef enum _PATH_TYPE {
-    DOS_PATH,
-    NT_PATH
-} PATH_TYPE;
-
 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
 {
     TRACE("%p, %u, %p\n", hinst, reason, reserved);
@@ -359,3 +353,61 @@ LPCWSTR WINAPI SdbTagToString(TAG tag)
     /* tag is valid */
     return switch_table ? table2[type_index][index] : table[type_index][index];
 }
+
+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;
+}
+
+/**************************************************************************
+ *        SdbGetTagFromTagID                [APPHELP.@]
+ *
+ * Searches shim database for the tag associated with specified tagid
+ *
+ * PARAMS
+ *  db      [I] Handle to the shim database
+ *  tagid   [I] The TAGID associated with the the tag
+ *
+ * RETURNS
+ *  Success: The tag associated with specified tagid
+ *  Failure: TAG_NULL
+ */
+TAG WINAPI SdbGetTagFromTagID(PDB db, TAGID tagid)
+{
+    TAG data;
+
+    /* A tag associated with tagid is first 2 bytes tagid bytes
offset from beginning */
+    if (!SdbReadData(db, &data, tagid, 2))
+    {
+        TRACE("Failed to read tag at tagid %u\n", tagid);
+        return TAG_NULL;
+    }
+
+    return data;
+}
diff --git a/dlls/apphelp/apphelp.h b/dlls/apphelp/apphelp.h
index 0cdd8c6..2eee762 100644
--- a/dlls/apphelp/apphelp.h
+++ b/dlls/apphelp/apphelp.h
@@ -26,6 +26,21 @@ typedef struct _DB {
     TAGID stringtable;
 } DB, *PDB;

+typedef enum _PATH_TYPE {
+    DOS_PATH,
+    NT_PATH
+} PATH_TYPE;
+
+#define TAGID_NULL 0x0
+#define TAGID_ROOT 0x0
+
+/* The above definition of TAGID_ROOT is used in winapi and can be found
+ * on msdn it but doesn't make sense, especially internally, because
+ * TAGID represents offset into database data and there is a header at
+ * offset 0, NOT a tag. Therfore, this definition should be used internally
+ * to represent first valid TAGID. Header size is 12 bytes. */
+#define _TAGID_ROOT 12
+
 #define TAG_TYPE_MASK 0xF000

 #define TAG_TYPE_NULL 0x1000
diff --git a/dlls/apphelp/apphelp.spec b/dlls/apphelp/apphelp.spec
index 1de6c25..ee5e96f 100644
--- a/dlls/apphelp/apphelp.spec
+++ b/dlls/apphelp/apphelp.spec
@@ -78,7 +78,7 @@
 @ stub SdbGetShowDebugInfoOptionValue
 @ stub SdbGetStandardDatabaseGUID
 @ stub SdbGetStringTagPtr
-@ stub SdbGetTagFromTagID
+@ stdcall SdbGetTagFromTagID(ptr long)
 @ stub SdbGrabMatchingInfo
 @ stub SdbGrabMatchingInfoEx
 @ stub SdbGUIDFromString
-- 
1.8.3.4



More information about the wine-patches mailing list