[ODBCCP32] Sync with Wine Staging 1.7.47. CORE-9924
authorAmine Khaldi <amine.khaldi@reactos.org>
Sun, 19 Jul 2015 23:09:04 +0000 (23:09 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sun, 19 Jul 2015 23:09:04 +0000 (23:09 +0000)
svn path=/trunk/; revision=68467

reactos/dll/win32/odbccp32/odbccp32.c
reactos/dll/win32/odbccp32/odbccp32.spec
reactos/media/doc/README.WINE

index f87c336..6a3d64b 100644 (file)
@@ -59,6 +59,7 @@ static const WCHAR odbc_error_invalid_buff_len[] = {'I','n','v','a','l','i','d',
 static const WCHAR odbc_error_component_not_found[] = {'C','o','m','p','o','n','e','n','t',' ','n','o','t',' ','f','o','u','n','d',0};
 static const WCHAR odbc_error_out_of_mem[] = {'O','u','t',' ','o','f',' ','m','e','m','o','r','y',0};
 static const WCHAR odbc_error_invalid_param_sequence[] = {'I','n','v','a','l','i','d',' ','p','a','r','a','m','e','t','e','r',' ','s','e','q','u','e','n','c','e',0};
+static const WCHAR odbc_error_invalid_param_string[] = {'I','n','v','a','l','i','d',' ','p','a','r','a','m','e','t','e','r',' ','s','t','r','i','n','g',0};
 
 /* Push an error onto the error stack, taking care of ranges etc. */
 static void push_error(int code, LPCWSTR msg)
@@ -77,6 +78,33 @@ static void clear_errors(void)
     num_errors = 0;
 }
 
+static inline void * heap_alloc(size_t len)
+{
+    return HeapAlloc(GetProcessHeap(), 0, len);
+}
+
+static inline BOOL heap_free(void *mem)
+{
+    return HeapFree(GetProcessHeap(), 0, mem);
+}
+
+static inline WCHAR *heap_strdupAtoW(const char *str)
+{
+    LPWSTR ret = NULL;
+
+    if(str) {
+        DWORD len;
+
+        len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+        ret = heap_alloc(len*sizeof(WCHAR));
+        if(ret)
+            MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
+    }
+
+    return ret;
+}
+
+
 BOOL WINAPI ODBCCPlApplet( LONG i, LONG j, LONG * p1, LONG * p2)
 {
     clear_errors();
@@ -239,7 +267,7 @@ BOOL WINAPI SQLConfigDriver(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver,
 BOOL WINAPI SQLCreateDataSourceW(HWND hwnd, LPCWSTR lpszDS)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p %s\n", hwnd, debugstr_w(lpszDS));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -247,7 +275,7 @@ BOOL WINAPI SQLCreateDataSourceW(HWND hwnd, LPCWSTR lpszDS)
 BOOL WINAPI SQLCreateDataSource(HWND hwnd, LPCSTR lpszDS)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p %s\n", hwnd, debugstr_a(lpszDS));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -256,7 +284,7 @@ BOOL WINAPI SQLGetAvailableDriversW(LPCWSTR lpszInfFile, LPWSTR lpszBuf,
                WORD cbBufMax, WORD *pcbBufOut)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %p %d %p\n", debugstr_w(lpszInfFile), lpszBuf, cbBufMax, pcbBufOut);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -265,7 +293,7 @@ BOOL WINAPI SQLGetAvailableDrivers(LPCSTR lpszInfFile, LPSTR lpszBuf,
                WORD cbBufMax, WORD *pcbBufOut)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %p %d %p\n", debugstr_a(lpszInfFile), lpszBuf, cbBufMax, pcbBufOut);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -273,6 +301,7 @@ BOOL WINAPI SQLGetAvailableDrivers(LPCSTR lpszInfFile, LPSTR lpszBuf,
 BOOL WINAPI SQLGetConfigMode(UWORD *pwConfigMode)
 {
     clear_errors();
+    TRACE("%p\n", pwConfigMode);
     if (pwConfigMode)
         *pwConfigMode = config_mode;
     return TRUE;
@@ -290,6 +319,9 @@ BOOL WINAPI SQLGetInstalledDriversW(LPWSTR lpszBuf, WORD cbBufMax,
     BOOL success = FALSE; /* The value we will return */
 
     clear_errors();
+
+    TRACE("%p %d %p\n", lpszBuf, cbBufMax, pcbBufOut);
+
     if (!lpszBuf || cbBufMax == 0)
     {
         push_error(ODBC_ERROR_INVALID_BUFF_LEN, odbc_error_invalid_buff_len);
@@ -345,6 +377,9 @@ BOOL WINAPI SQLGetInstalledDrivers(LPSTR lpszBuf, WORD cbBufMax,
     int size_wbuf = cbBufMax;
     LPWSTR wbuf;
     WORD size_used;
+
+    TRACE("%p %d %p\n", lpszBuf, cbBufMax, pcbBufOut);
+
     wbuf = HeapAlloc(GetProcessHeap(), 0, size_wbuf*sizeof(WCHAR));
     if (wbuf)
     {
@@ -372,7 +407,9 @@ int WINAPI SQLGetPrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry,
                LPCWSTR lpszFilename)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s %s %p %d %s\n", debugstr_w(lpszSection), debugstr_w(lpszEntry),
+               debugstr_w(lpszDefault), RetBuffer, cbRetBuffer,
+               debugstr_w(lpszFilename));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -382,7 +419,9 @@ int WINAPI SQLGetPrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry,
                LPCSTR lpszFilename)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s %s %p %d %s\n", debugstr_a(lpszSection), debugstr_a(lpszEntry),
+               debugstr_a(lpszDefault), RetBuffer, cbRetBuffer,
+               debugstr_a(lpszFilename));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -392,7 +431,8 @@ BOOL WINAPI SQLGetTranslatorW(HWND hwndParent, LPWSTR lpszName, WORD cbNameMax,
                WORD *pcbPathOut, DWORD *pvOption)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p %s %d %p %p %d %p %p\n", hwndParent, debugstr_w(lpszName), cbNameMax,
+               pcbNameOut, lpszPath, cbPathMax, pcbPathOut, pvOption);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -402,7 +442,8 @@ BOOL WINAPI SQLGetTranslator(HWND hwndParent, LPSTR lpszName, WORD cbNameMax,
                WORD *pcbPathOut, DWORD *pvOption)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p %s %d %p %p %d %p %p\n", hwndParent, debugstr_a(lpszName), cbNameMax,
+               pcbNameOut, lpszPath, cbPathMax, pcbPathOut, pvOption);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -582,7 +623,8 @@ BOOL WINAPI SQLInstallODBCW(HWND hwndParent, LPCWSTR lpszInfFile,
                LPCWSTR lpszSrcPath, LPCWSTR lpszDrivers)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p %s %s %s\n", hwndParent, debugstr_w(lpszInfFile),
+               debugstr_w(lpszSrcPath), debugstr_w(lpszDrivers));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -591,7 +633,8 @@ BOOL WINAPI SQLInstallODBC(HWND hwndParent, LPCSTR lpszInfFile,
                LPCSTR lpszSrcPath, LPCSTR lpszDrivers)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p %s %s %s\n", hwndParent, debugstr_a(lpszInfFile),
+               debugstr_a(lpszSrcPath), debugstr_a(lpszDrivers));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -795,21 +838,21 @@ BOOL WINAPI SQLInstallTranslatorW(LPCWSTR lpszInfFile, LPCWSTR lpszTranslator,
 BOOL WINAPI SQLManageDataSources(HWND hwnd)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%p\n", hwnd);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
 
 SQLRETURN WINAPI SQLPostInstallerErrorW(DWORD fErrorCode, LPCWSTR szErrorMsg)
 {
-    FIXME("\n");
+    FIXME("%u %s\n", fErrorCode, debugstr_w(szErrorMsg));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
 
 SQLRETURN WINAPI SQLPostInstallerError(DWORD fErrorCode, LPCSTR szErrorMsg)
 {
-    FIXME("\n");
+    FIXME("%u %s\n", fErrorCode, debugstr_a(szErrorMsg));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -819,7 +862,8 @@ BOOL WINAPI SQLReadFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName,
                WORD *pcbString)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s %s %s %d %p\n", debugstr_w(lpszFileName), debugstr_w(lpszAppName),
+               debugstr_w(lpszKeyName), debugstr_w(lpszString), cbString, pcbString);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -829,7 +873,8 @@ BOOL WINAPI SQLReadFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName,
                WORD *pcbString)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s %s %s %d %p\n", debugstr_a(lpszFileName), debugstr_a(lpszAppName),
+               debugstr_a(lpszKeyName), debugstr_a(lpszString), cbString, pcbString);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -846,7 +891,7 @@ BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL fRemoveDSN,
                LPDWORD lpdwUsageCount)
 {
     clear_errors();
-    FIXME("stub\n");
+    FIXME("%s %d %p\n", debugstr_w(lpszDriver), fRemoveDSN, lpdwUsageCount);
     if (lpdwUsageCount) *lpdwUsageCount = 1;
     return TRUE;
 }
@@ -855,7 +900,7 @@ BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN,
                LPDWORD lpdwUsageCount)
 {
     clear_errors();
-    FIXME("stub\n");
+    FIXME("%s %d %p\n", debugstr_a(lpszDriver), fRemoveDSN, lpdwUsageCount);
     if (lpdwUsageCount) *lpdwUsageCount = 1;
     return TRUE;
 }
@@ -863,7 +908,7 @@ BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN,
 BOOL WINAPI SQLRemoveDriverManager(LPDWORD pdwUsageCount)
 {
     clear_errors();
-    FIXME("stub\n");
+    FIXME("%p\n", pdwUsageCount);
     if (pdwUsageCount) *pdwUsageCount = 1;
     return TRUE;
 }
@@ -871,7 +916,7 @@ BOOL WINAPI SQLRemoveDriverManager(LPDWORD pdwUsageCount)
 BOOL WINAPI SQLRemoveDSNFromIniW(LPCWSTR lpszDSN)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s\n", debugstr_w(lpszDSN));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -879,7 +924,7 @@ BOOL WINAPI SQLRemoveDSNFromIniW(LPCWSTR lpszDSN)
 BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s\n", debugstr_a(lpszDSN));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -887,7 +932,7 @@ BOOL WINAPI SQLRemoveDSNFromIni(LPCSTR lpszDSN)
 BOOL WINAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, LPDWORD lpdwUsageCount)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %p\n", debugstr_w(lpszTranslator), lpdwUsageCount);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -895,7 +940,7 @@ BOOL WINAPI SQLRemoveTranslatorW(LPCWSTR lpszTranslator, LPDWORD lpdwUsageCount)
 BOOL WINAPI SQLRemoveTranslator(LPCSTR lpszTranslator, LPDWORD lpdwUsageCount)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %p\n", debugstr_a(lpszTranslator), lpdwUsageCount);
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -903,6 +948,8 @@ BOOL WINAPI SQLRemoveTranslator(LPCSTR lpszTranslator, LPDWORD lpdwUsageCount)
 BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
 {
     clear_errors();
+    TRACE("%u\n", wConfigMode);
+
     if (wConfigMode > ODBC_SYSTEM_DSN)
     {
         push_error(ODBC_ERROR_INVALID_PARAM_SEQUENCE, odbc_error_invalid_param_sequence);
@@ -918,7 +965,7 @@ BOOL WINAPI SQLSetConfigMode(UWORD wConfigMode)
 BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s\n", debugstr_w(lpszDSN));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -926,7 +973,7 @@ BOOL WINAPI SQLValidDSNW(LPCWSTR lpszDSN)
 BOOL WINAPI SQLValidDSN(LPCSTR lpszDSN)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s\n", debugstr_a(lpszDSN));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -934,7 +981,7 @@ BOOL WINAPI SQLValidDSN(LPCSTR lpszDSN)
 BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s\n", debugstr_w(lpszDSN), debugstr_w(lpszDriver));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -942,7 +989,7 @@ BOOL WINAPI SQLWriteDSNToIniW(LPCWSTR lpszDSN, LPCWSTR lpszDriver)
 BOOL WINAPI SQLWriteDSNToIni(LPCSTR lpszDSN, LPCSTR lpszDriver)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s\n", debugstr_a(lpszDSN), debugstr_a(lpszDriver));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -951,7 +998,8 @@ BOOL WINAPI SQLWriteFileDSNW(LPCWSTR lpszFileName, LPCWSTR lpszAppName,
                LPCWSTR lpszKeyName, LPCWSTR lpszString)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s %s %s\n", debugstr_w(lpszFileName), debugstr_w(lpszAppName),
+                 debugstr_w(lpszKeyName), debugstr_w(lpszString));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -960,7 +1008,8 @@ BOOL WINAPI SQLWriteFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName,
                LPCSTR lpszKeyName, LPCSTR lpszString)
 {
     clear_errors();
-    FIXME("\n");
+    FIXME("%s %s %s %s\n", debugstr_a(lpszFileName), debugstr_a(lpszAppName),
+                 debugstr_a(lpszKeyName), debugstr_a(lpszString));
     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     return FALSE;
 }
@@ -968,17 +1017,62 @@ BOOL WINAPI SQLWriteFileDSN(LPCSTR lpszFileName, LPCSTR lpszAppName,
 BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry,
                LPCWSTR lpszString, LPCWSTR lpszFilename)
 {
+    LONG ret;
+    HKEY hkey;
+    WCHAR softwareodbc[] = {'S','o','f','t','w','a','r','e','\\','O','D','B','C',0};
+
     clear_errors();
-    FIXME("\n");
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+    TRACE("%s %s %s %s\n", debugstr_w(lpszSection), debugstr_w(lpszEntry),
+                debugstr_w(lpszString), debugstr_w(lpszFilename));
+
+    if(!lpszFilename || !*lpszFilename)
+    {
+        push_error(ODBC_ERROR_INVALID_STR, odbc_error_invalid_param_string);
+        return FALSE;
+    }
+
+    if ((ret = RegCreateKeyW(HKEY_CURRENT_USER, softwareodbc, &hkey)) == ERROR_SUCCESS)
+    {
+         HKEY hkeyfilename;
+
+         if ((ret = RegCreateKeyW(hkey, lpszFilename, &hkeyfilename)) == ERROR_SUCCESS)
+         {
+              HKEY hkey_section;
+
+              if ((ret = RegCreateKeyW(hkeyfilename, lpszSection, &hkey_section)) == ERROR_SUCCESS)
+              {
+                  ret = RegSetValueExW(hkey_section, lpszEntry, 0, REG_SZ, (BYTE*)lpszString, (lstrlenW(lpszString)+1)*sizeof(WCHAR));
+                  RegCloseKey(hkey_section);
+              }
+
+              RegCloseKey(hkeyfilename);
+         }
+
+         RegCloseKey(hkey);
+    }
+
+    return ret == ERROR_SUCCESS;
 }
 
 BOOL WINAPI SQLWritePrivateProfileString(LPCSTR lpszSection, LPCSTR lpszEntry,
                LPCSTR lpszString, LPCSTR lpszFilename)
 {
+    BOOL ret;
+    WCHAR *sect, *entry, *string, *file;
     clear_errors();
-    FIXME("\n");
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return FALSE;
+    TRACE("%s %s %s %s\n", lpszSection, lpszEntry, lpszString, lpszFilename);
+
+    sect = heap_strdupAtoW(lpszSection);
+    entry = heap_strdupAtoW(lpszEntry);
+    string = heap_strdupAtoW(lpszString);
+    file = heap_strdupAtoW(lpszFilename);
+
+    ret = SQLWritePrivateProfileStringW(sect, entry, string, file);
+
+    heap_free(sect);
+    heap_free(entry);
+    heap_free(string);
+    heap_free(file);
+
+    return ret;
 }
index c90d98e..c4be93f 100644 (file)
@@ -1,6 +1,6 @@
 2 stdcall SQLInstallDriver(str str str long ptr)
 3 stdcall SQLInstallDriverManager(ptr long ptr)
-4 stdcall SQLGetInstalledDrivers(str long ptr)
+4 stdcall SQLGetInstalledDrivers(ptr long ptr)
 5 stdcall SQLGetAvailableDrivers(str ptr long ptr)
 6 stdcall SQLConfigDataSource(ptr long str str)
 7 stdcall SQLRemoveDefaultDataSource()
@@ -11,7 +11,7 @@
 12 stdcall SQLCreateDataSource(ptr str)
 13 stdcall SQLGetTranslator(ptr str long ptr ptr long ptr ptr)
 14 stdcall SQLWritePrivateProfileString(str str str str)
-15 stdcall SQLGetPrivateProfileString(str str str str long str)
+15 stdcall SQLGetPrivateProfileString(str str str ptr long str)
 16 stdcall SQLValidDSN(str)
 17 stdcall SQLRemoveDriverManager(ptr)
 18 stdcall SQLInstallTranslator(str str str ptr long ptr long ptr)
@@ -31,7 +31,7 @@
 112 stub SelectTransDlg
 202 stdcall SQLInstallDriverW(wstr wstr wstr long ptr)
 203 stdcall SQLInstallDriverManagerW(ptr long ptr)
-204 stdcall SQLGetInstalledDriversW(wstr long ptr)
+204 stdcall SQLGetInstalledDriversW(ptr long ptr)
 205 stdcall SQLGetAvailableDriversW(wstr ptr long ptr)
 206 stdcall SQLConfigDataSourceW(ptr long wstr wstr)
 208 stdcall SQLWriteDSNToIniW(wstr wstr)
@@ -40,7 +40,7 @@
 212 stdcall SQLCreateDataSourceW(ptr wstr)
 213 stdcall SQLGetTranslatorW(ptr wstr long ptr ptr long ptr ptr)
 214 stdcall SQLWritePrivateProfileStringW(wstr wstr wstr wstr)
-215 stdcall SQLGetPrivateProfileStringW(wstr wstr wstr wstr long wstr)
+215 stdcall SQLGetPrivateProfileStringW(wstr wstr wstr ptr long wstr)
 216 stdcall SQLValidDSNW(wstr)
 218 stdcall SQLInstallTranslatorW(wstr wstr wstr ptr long ptr long ptr)
 219 stdcall SQLRemoveTranslatorW(wstr ptr)
index a49fc50..056e8d4 100644 (file)
@@ -144,7 +144,7 @@ reactos/dll/win32/ntdsapi             # Synced to WineStaging-1.7.37
 reactos/dll/win32/ntprint             # Synced to WineStaging-1.7.37
 reactos/dll/win32/objsel              # Synced to WineStaging-1.7.37
 reactos/dll/win32/odbc32              # Synced to WineStaging-1.7.37. Depends on port of Linux ODBC.
-reactos/dll/win32/odbccp32            # Synced to WineStaging-1.7.37
+reactos/dll/win32/odbccp32            # Synced to WineStaging-1.7.47
 reactos/dll/win32/ole32               # Synced to WineStaging-1.7.37
 reactos/dll/win32/oleacc              # Synced to WineStaging-1.7.37
 reactos/dll/win32/oleaut32            # Synced to WineStaging-1.7.37