X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fdll%2Fappcompat%2Fapphelp%2Fsdbapi.c;h=38ff2dab35b6203fb2b25a4d0c0f4eb3e2f2dfe6;hp=04a56624708e56f1a6e1fbd4c21ebbdc05cb9653;hb=22ba0b5aa5757ed153edb127c02f5b3d360cbb4a;hpb=705f7ce49e32eda22c1725abe83201a40d0daae2;ds=sidebyside diff --git a/reactos/dll/appcompat/apphelp/sdbapi.c b/reactos/dll/appcompat/apphelp/sdbapi.c index 04a56624708..38ff2dab35b 100644 --- a/reactos/dll/appcompat/apphelp/sdbapi.c +++ b/reactos/dll/appcompat/apphelp/sdbapi.c @@ -425,7 +425,7 @@ PDB WINAPI SdbOpenDatabase(LPCWSTR path, PATH_TYPE type) if (!db) return NULL; - if (major != 2) + if (major != 2 && major != 3) { SdbCloseDatabase(db); SHIM_ERR("Invalid shim database version\n"); @@ -563,6 +563,67 @@ BOOL WINAPI SdbGetDatabaseVersion(LPCWSTR database, PDWORD VersionHi, PDWORD Ver } +/** + * Find the first named child tag. + * + * @param [in] database The database. + * @param [in] root The tag to start at + * @param [in] find The tag type to find + * @param [in] nametag The child of 'find' that contains the name + * @param [in] find_name The name to find + * + * @return The found tag, or TAGID_NULL on failure + */ +TAGID WINAPI SdbFindFirstNamedTag(PDB db, TAGID root, TAGID find, TAGID nametag, LPCWSTR find_name) +{ + TAGID iter; + + iter = SdbFindFirstTag(db, root, find); + + while (iter != TAGID_NULL) + { + TAGID tmp = SdbFindFirstTag(db, iter, nametag); + if (tmp != TAGID_NULL) + { + LPCWSTR name = SdbGetStringTagPtr(db, tmp); + if (name && !lstrcmpiW(name, find_name)) + return iter; + } + iter = SdbFindNextTag(db, root, iter); + } + return TAGID_NULL; +} + + +/** + * Find a named layer in a multi-db. + * + * @param [in] hsdb The multi-database. + * @param [in] layerName The named tag to find. + * + * @return The layer, or TAGREF_NULL on failure + */ +TAGREF WINAPI SdbGetLayerTagRef(HSDB hsdb, LPCWSTR layerName) +{ + PDB db = hsdb->db; + + TAGID database = SdbFindFirstTag(db, TAGID_ROOT, TAG_DATABASE); + if (database != TAGID_NULL) + { + TAGID layer = SdbFindFirstNamedTag(db, database, TAG_LAYER, TAG_NAME, layerName); + if (layer != TAGID_NULL) + { + TAGREF tr; + if (SdbTagIDToTagRef(hsdb, db, layer, &tr)) + { + return tr; + } + } + } + return TAGREF_NULL; +} + + /** * Converts the specified string to an index key. *