aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-10-22 13:30:42 +0000
committerCorinna Vinschen <corinna@vinschen.de>2008-10-22 13:30:42 +0000
commit3e97726f98fae9a1acdc4dd26f837782047397bb (patch)
tree8b62da09dd6cadc3cfb977fc3a68499b916f30a6
parentdf54adb746cf0f3cb92b38abc030db5d52465f51 (diff)
downloadnewlib-3e97726f98fae9a1acdc4dd26f837782047397bb.zip
newlib-3e97726f98fae9a1acdc4dd26f837782047397bb.tar.gz
newlib-3e97726f98fae9a1acdc4dd26f837782047397bb.tar.bz2
* autoload.cc (GetSystemWindowsDirectoryW): Define.
* kernel32.cc (GetWindowsDirectoryW): Implement to abstract from running under Terminal Services or not. (GetWindowsDirectoryA): Ditto.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/autoload.cc1
-rw-r--r--winsup/cygwin/kernel32.cc35
3 files changed, 43 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 676aea8..38b4beb 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2008-10-22 Corinna Vinschen <corinna@vinschen.de>
+
+ * autoload.cc (GetSystemWindowsDirectoryW): Define.
+ * kernel32.cc (GetWindowsDirectoryW): Implement to abstract from
+ running under Terminal Services or not.
+ (GetWindowsDirectoryA): Ditto.
+
2008-10-21 Corinna Vinschen <corinna@vinschen.de>
* passwd.cc (pwdgrp::read_passwd): Check if we're called within
diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index f1a4abd..c86deb9 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -411,6 +411,7 @@ LoadDLLfuncEx (FindFirstVolumeA, 8, kernel32, 1)
LoadDLLfuncEx (FindNextVolumeA, 12, kernel32, 1)
LoadDLLfuncEx (FindVolumeClose, 4, kernel32, 1)
LoadDLLfuncEx (GetConsoleWindow, 0, kernel32, 1)
+LoadDLLfuncEx (GetSystemWindowsDirectoryW, 8, kernel32, 1)
LoadDLLfuncEx (GetVolumeNameForVolumeMountPointA, 12, kernel32, 1)
LoadDLLfunc (SHGetDesktopFolder, 4, shell32)
diff --git a/winsup/cygwin/kernel32.cc b/winsup/cygwin/kernel32.cc
index ce83c56..47bd284 100644
--- a/winsup/cygwin/kernel32.cc
+++ b/winsup/cygwin/kernel32.cc
@@ -11,6 +11,7 @@ details. */
#include "winsup.h"
#include "shared_info.h"
#include "ntdll.h"
+#include <wchar.h>
/* Implement CreateEvent/OpenEvent so that named objects are always created in
Cygwin shared object namespace. */
@@ -402,3 +403,37 @@ OpenFileMappingA (DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName)
}
return OpenFileMappingW (dwDesiredAccess, bInheritHandle, lpName ? name : NULL);
}
+
+/* When Terminal Services are installed, the GetWindowsDirectory function
+ does not return the system installation dir, but a user specific directory
+ instead. That's not what we have in mind when calling GetWindowsDirectory
+ from within Cygwin. So we're calling GetSystemWindowsDirectory from here,
+ except on NT4 where we use the method as described in KB186498. */
+
+#define SYSTEM32 (sizeof ("\\System32") - 1)
+
+UINT WINAPI
+GetWindowsDirectoryW (LPWSTR buf, UINT size)
+{
+ if (wincap.has_terminal_services ())
+ return GetSystemWindowsDirectoryW (buf, size);
+ /* NT4 */
+ WCHAR name [size + SYSTEM32];
+ UINT ret = GetSystemDirectoryW (name, size + SYSTEM32);
+ if (ret < size + SYSTEM32)
+ {
+ name[ret - SYSTEM32] = L'\0';
+ wcscpy (buf, name);
+ }
+ return ret - SYSTEM32;
+}
+
+UINT WINAPI
+GetWindowsDirectoryA (LPSTR buf, UINT size)
+{
+ WCHAR name[MAX_PATH];
+ UINT ret = GetWindowsDirectoryW (name, min (size, MAX_PATH));
+ if (ret < size)
+ sys_wcstombs (buf, size, name);
+ return ret;
+}