diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-10-22 13:30:42 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-10-22 13:30:42 +0000 |
commit | 3e97726f98fae9a1acdc4dd26f837782047397bb (patch) | |
tree | 8b62da09dd6cadc3cfb977fc3a68499b916f30a6 | |
parent | df54adb746cf0f3cb92b38abc030db5d52465f51 (diff) | |
download | newlib-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/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/cygwin/autoload.cc | 1 | ||||
-rw-r--r-- | winsup/cygwin/kernel32.cc | 35 |
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; +} |