[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