[APPHELP] Register AppPatch directory with cmake, import SdbGetAppPatchDir implementa...
authorMark Jansen <mark.jansen@reactos.org>
Sat, 28 May 2016 16:47:39 +0000 (16:47 +0000)
committerMark Jansen <mark.jansen@reactos.org>
Sat, 28 May 2016 16:47:39 +0000 (16:47 +0000)
svn path=/trunk/; revision=71440

reactos/boot/bootdata/packages/reactos.dff.in
reactos/dll/appcompat/apphelp/apphelp.h
reactos/dll/appcompat/apphelp/apphelp.spec
reactos/dll/appcompat/apphelp/sdbapi.c
reactos/sdk/cmake/CMakeMacros.cmake

index 791aee1..c9ad5a6 100644 (file)
@@ -69,6 +69,7 @@ Signature = "$ReactOS$"
 50 = security\templates
 51 = system32\CatRoot
 52 = system32\CatRoot2
+53 = AppPatch
 
 .InfEnd
 
index 4d7531d..56e1cb9 100644 (file)
@@ -50,6 +50,11 @@ typedef struct _DB {
 #define SDB_DATABASE_MAIN_SHIM 0x80030000
 #define SDB_DATABASE_MAIN_DRIVERS 0x80040000
 
+typedef struct _SDB {
+    PDB db;
+    BOOL auto_loaded;
+} SDB, *HSDB;
+
 typedef struct tagATTRINFO {
   TAG   type;
   DWORD flags;
index 27bb181..011c1cb 100644 (file)
@@ -52,7 +52,7 @@
 @ stub SdbFreeFileInfo
 @ stub SdbFreeFlagInfo
 @ stub SdbGetAppCompatDataSize
-@ stub SdbGetAppPatchDir
+@ stdcall SdbGetAppPatchDir(ptr wstr long)
 @ stdcall SdbGetBinaryTagData(ptr long)
 @ stdcall SdbGetDatabaseID(ptr ptr)
 @ stub SdbGetDatabaseInformation
index 143933a..4dc1cf6 100644 (file)
@@ -433,6 +433,53 @@ void WINAPI SdbCloseDatabase(PDB db)
     SdbFree(db);
 }
 
+/**
+ * Retrieves AppPatch directory.
+ *
+ * @param [in]  db      Handle to the shim database.
+ * @param [out] path    Pointer to memory in which path shall be written.
+ * @param [in]  size    Size of the buffer in characters.
+ */
+BOOL WINAPI SdbGetAppPatchDir(HSDB db, LPWSTR path, DWORD size)
+{
+    static WCHAR* default_dir = NULL;
+
+    if(!default_dir)
+    {
+        WCHAR* tmp = NULL;
+        UINT len = GetSystemWindowsDirectoryW(NULL, 0) + lstrlenW((CONST WCHAR[]){'\\','A','p','p','P','a','t','c','h',0});
+        tmp = SdbAlloc((len + 1)* sizeof(WCHAR));
+        if(tmp)
+        {
+            UINT r = GetSystemWindowsDirectoryW(tmp, len+1);
+            if (r && r < len)
+            {
+                if (SUCCEEDED(StringCchCatW(tmp, len+1, (CONST WCHAR[]){'\\','A','p','p','P','a','t','c','h',0})))
+                {
+                    if(InterlockedCompareExchangePointer((void**)&default_dir, tmp, NULL) == NULL)
+                        tmp = NULL;
+                }
+            }
+            if (tmp)
+                SdbFree(tmp);
+        }
+    }
+
+    /* In case function fails, path holds empty string */
+    if (size > 0)
+        *path = 0;
+
+    if (!db)
+    {
+        return SUCCEEDED(StringCchCopyW(path, size, default_dir));
+    }
+    else
+    {
+        /* fixme */
+        return FALSE;
+    }
+}
+
 /**
  * Parses a string to retrieve a GUID.
  *
index e64c5a9..86b931a 100644 (file)
@@ -261,6 +261,8 @@ macro(dir_to_num dir var)
         set(${var} 51)
     elseif(${dir} STREQUAL reactos/system32/CatRoot2)
         set(${var} 52)
+    elseif(${dir} STREQUAL reactos/AppPatch)
+        set(${var} 53)
     else()
         message(FATAL_ERROR "Wrong destination: ${dir}")
     endif()