[RAPPS]
authorThomas Faber <thomas.faber@reactos.org>
Sat, 18 Jan 2014 11:21:48 +0000 (11:21 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sat, 18 Jan 2014 11:21:48 +0000 (11:21 +0000)
- Do not write to the application directory. Welcome to Windows NT...

svn path=/trunk/; revision=61669

reactos/base/applications/rapps/available.c
reactos/base/applications/rapps/loaddlg.c
reactos/base/applications/rapps/misc.c
reactos/base/applications/rapps/parser.c
reactos/base/applications/rapps/rapps.h

index ec43a8b..9df29ca 100644 (file)
@@ -47,7 +47,7 @@ DeleteCurrentAppsDB(VOID)
     WCHAR szPath[MAX_PATH];
     WCHAR szTmp[MAX_PATH];
 
-    if (!GetCurrentDirectoryW(MAX_PATH, szPath))
+    if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
         return FALSE;
 
     swprintf(szCabPath, L"%s\\rappmgr.cab", szPath);
@@ -94,7 +94,7 @@ UpdateAppsDB(VOID)
 
     DownloadApplicationsDB(APPLICATION_DATEBASE_URL);
 
-    if (!GetCurrentDirectoryW(MAX_PATH, szPath))
+    if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
         return FALSE;
 
     swprintf(szCabPath, L"%s\\rappmgr.cab", szPath);
@@ -120,7 +120,7 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
     WCHAR szLocale[4 + 1];
     APPLICATION_INFO Info;
 
-    if (!GetCurrentDirectoryW(MAX_PATH, szPath))
+    if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
     {
         return FALSE;
     }
index ae2ca11..d886a80 100644 (file)
@@ -227,7 +227,7 @@ ThreadFunc(LPVOID Context)
             AppInfo->szUrlDownload[len - 1] == 'b')
         {
             bCab = TRUE;
-            if (!GetCurrentDirectoryW(MAX_PATH, path))
+            if (!GetStorageDirectory(path, sizeof(path) / sizeof(path[0])))
                 goto end;
         }
         else
index 348404e..f398df1 100644 (file)
@@ -208,6 +208,26 @@ StartProcess(LPWSTR lpPath, BOOL Wait)
     return TRUE;
 }
 
+BOOL
+GetStorageDirectory(PWCHAR lpDirectory, DWORD cch)
+{
+    if (cch < MAX_PATH)
+        return FALSE;
+
+    if (!SHGetSpecialFolderPathW(NULL, lpDirectory, CSIDL_LOCAL_APPDATA, TRUE))
+        return FALSE;
+
+    if (FAILED(StringCchCatW(lpDirectory, cch, L"\\rapps")))
+        return FALSE;
+
+    if (!CreateDirectoryW(lpDirectory, NULL) &&
+        GetLastError() != ERROR_ALREADY_EXISTS)
+    {
+        return FALSE;
+    }
+
+    return TRUE;
+}
 
 BOOL
 ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath)
@@ -261,13 +281,13 @@ InitLogs(VOID)
     if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,
                         szBuf, 0, NULL,
                         REG_OPTION_NON_VOLATILE,
-                        KEY_WRITE, NULL, &hKey, &dwDisp) != ERROR_SUCCESS) 
+                        KEY_WRITE, NULL, &hKey, &dwDisp) != ERROR_SUCCESS)
     {
         return;
     }
 
-    if (!GetCurrentDirectoryW(MAX_PATH, szPath)) return;
-    wcscat(szPath, L"\\rapps.exe");
+    if (!GetModuleFileName(NULL, szPath, sizeof(szPath) / sizeof(szPath[0])))
+        return;
 
     if (RegSetValueExW(hKey,
                        L"EventMessageFile",
@@ -276,13 +296,13 @@ InitLogs(VOID)
                        (LPBYTE)szPath,
                        (DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
-    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
-             EVENTLOG_INFORMATION_TYPE; 
+    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
+             EVENTLOG_INFORMATION_TYPE;
+
     if (RegSetValueExW(hKey,
                        L"TypesSupported",
                        0,
@@ -290,7 +310,7 @@ InitLogs(VOID)
                        (LPBYTE)&dwData,
                        sizeof(DWORD)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
@@ -301,7 +321,7 @@ InitLogs(VOID)
                        (LPBYTE)szPath,
                        (DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
@@ -312,7 +332,7 @@ InitLogs(VOID)
                        (LPBYTE)&dwCategoryNum,
                        sizeof(DWORD)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
index 807ffca..e9073f0 100644 (file)
@@ -557,7 +557,7 @@ ParserOpen(LPCWSTR filename, BOOL write_access)
             ItemsArray[i]->encoding = ENCODING_UTF8;
         }
 
-    GetCurrentDirectoryW(MAX_PATH, szDir);
+    GetStorageDirectory(szDir, sizeof(szDir) / sizeof(szDir[0]));
 
     wcscpy(buffer, szDir);
     wcscat(buffer, wszSeparator);
index 28744f8..7841890 100644 (file)
@@ -15,6 +15,7 @@
 #include <richedit.h>
 #include <shlobj.h>
 #include <stdio.h>
+#include <strsafe.h>
 
 #include <rappsmsg.h>
 
@@ -150,6 +151,7 @@ VOID CopyTextToClipboard(LPCWSTR lpszText);
 VOID SetWelcomeText(VOID);
 VOID ShowPopupMenu(HWND hwnd, UINT MenuID);
 BOOL StartProcess(LPWSTR lpPath, BOOL Wait);
+BOOL GetStorageDirectory(PWCHAR lpDirectory, DWORD cch);
 BOOL ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath);
 VOID InitLogs(VOID);
 VOID FreeLogs(VOID);