[6/11] apphelp: Implement SdbOpenDatabase.
Mislav Blazevic
krofnica996 at gmail.com
Thu Aug 1 17:23:19 CDT 2013
---
dlls/apphelp/apphelp.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/apphelp/apphelp.spec | 2 +-
2 files changed, 116 insertions(+), 1 deletion(-)
diff --git a/dlls/apphelp/apphelp.c b/dlls/apphelp/apphelp.c
index 94a0aff..8612062 100644
--- a/dlls/apphelp/apphelp.c
+++ b/dlls/apphelp/apphelp.c
@@ -21,9 +21,12 @@
#include "windef.h"
#include "winbase.h"
#include "apphelp.h"
+#include "winternl.h"
#include "wine/debug.h"
+#define STATUS_SUCCESS ((NTSTATUS)0)
+
WINE_DEFAULT_DEBUG_CHANNEL(apphelp);
BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
@@ -529,3 +532,115 @@ TAGID WINAPI SdbGetNextChild(PDB db, TAGID
parent, TAGID prev_child)
return next_child;
}
+
+static PDB WINAPI SdbAlloc(void)
+{
+ 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];
+ TAGID iter; /* iterator, used to locate stringtable */
+
+ 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 shim database version\n");
+ return NULL;
+ }
+
+ /* Find stringtable, if one exists */
+ iter = SdbGetFirstChild(db, TAGID_ROOT);
+ while (iter < db->size)
+ {
+ if (SdbGetTagFromTagID(db, iter) == TAG_STRINGTABLE)
+ {
+ db->stringtable = iter;
+ break;
+ }
+ iter = SdbGetNextChild(db, TAGID_ROOT, iter);
+
+ /* Prevent infinite loop in case of malformed file */
+ if (iter == TAGID_NULL)
+ break;
+ }
+
+ return db;
+}
diff --git a/dlls/apphelp/apphelp.spec b/dlls/apphelp/apphelp.spec
index cbe621b..013c784 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
--
1.8.3.4
More information about the wine-patches
mailing list