summaryrefslogtreecommitdiffstats
path: root/win/tclWin32Dll.c
diff options
context:
space:
mode:
authornijtmans <nijtmans>2010-09-14 08:53:49 (GMT)
committernijtmans <nijtmans>2010-09-14 08:53:49 (GMT)
commit63c9caabab37581d13e0ccacca5e07416efbdf6a (patch)
tree86535eb38513f38381aa21e5d9e8fc8aef9f2048 /win/tclWin32Dll.c
parent73dc0175825d1e4fed0a449380e4d8148c84397f (diff)
downloadtcl-63c9caabab37581d13e0ccacca5e07416efbdf6a.zip
tcl-63c9caabab37581d13e0ccacca5e07416efbdf6a.tar.gz
tcl-63c9caabab37581d13e0ccacca5e07416efbdf6a.tar.bz2
Allow all Win2000+ API entries in Tcl
Eliminate dynamical loading of advapi23 and kernal32 symbols.
Diffstat (limited to 'win/tclWin32Dll.c')
-rw-r--r--win/tclWin32Dll.c164
1 files changed, 55 insertions, 109 deletions
diff --git a/win/tclWin32Dll.c b/win/tclWin32Dll.c
index 1a8250e..c3fb6f8 100644
--- a/win/tclWin32Dll.c
+++ b/win/tclWin32Dll.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWin32Dll.c,v 1.67 2010/09/10 20:56:36 nijtmans Exp $
+ * RCS: @(#) $Id: tclWin32Dll.c,v 1.68 2010/09/14 08:53:49 nijtmans Exp $
*/
#include "tclWinInt.h"
@@ -70,59 +70,61 @@ static Tcl_Encoding winTCharEncoding = NULL;
* versions of the operating system calls.
*/
-static TclWinProcs winProcs = {
+static const TclWinProcs winProcs = {
1,
- (BOOL (WINAPI *)(const TCHAR *, LPDCB)) BuildCommDCBW,
- (TCHAR *(WINAPI *)(TCHAR *)) CharLowerW,
- (BOOL (WINAPI *)(const TCHAR *, const TCHAR *, BOOL)) CopyFileW,
- (BOOL (WINAPI *)(const TCHAR *, LPSECURITY_ATTRIBUTES)) CreateDirectoryW,
+ (BOOL (WINAPI *)(const TCHAR *, LPDCB)) BuildCommDCB,
+ (TCHAR *(WINAPI *)(TCHAR *)) CharLower,
+ (BOOL (WINAPI *)(const TCHAR *, const TCHAR *, BOOL)) CopyFile,
+ (BOOL (WINAPI *)(const TCHAR *, LPSECURITY_ATTRIBUTES)) CreateDirectory,
(HANDLE (WINAPI *)(const TCHAR *, DWORD, DWORD, SECURITY_ATTRIBUTES *,
- DWORD, DWORD, HANDLE)) CreateFileW,
+ DWORD, DWORD, HANDLE)) CreateFile,
(BOOL (WINAPI *)(const TCHAR *, TCHAR *, LPSECURITY_ATTRIBUTES,
LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, const TCHAR *,
- LPSTARTUPINFO, LPPROCESS_INFORMATION)) CreateProcessW,
- (BOOL (WINAPI *)(const TCHAR *)) DeleteFileW,
- (HANDLE (WINAPI *)(const TCHAR *, WIN32_FIND_DATAT *)) FindFirstFileW,
- (BOOL (WINAPI *)(HANDLE, WIN32_FIND_DATAT *)) FindNextFileW,
- (BOOL (WINAPI *)(TCHAR *, LPDWORD)) GetComputerNameW,
- (DWORD (WINAPI *)(DWORD, TCHAR *)) GetCurrentDirectoryW,
- (DWORD (WINAPI *)(const TCHAR *)) GetFileAttributesW,
+ LPSTARTUPINFO, LPPROCESS_INFORMATION)) CreateProcess,
+ (BOOL (WINAPI *)(const TCHAR *)) DeleteFile,
+ (HANDLE (WINAPI *)(const TCHAR *, WIN32_FIND_DATAT *)) FindFirstFile,
+ (BOOL (WINAPI *)(HANDLE, WIN32_FIND_DATAT *)) FindNextFile,
+ (BOOL (WINAPI *)(TCHAR *, LPDWORD)) GetComputerName,
+ (DWORD (WINAPI *)(DWORD, TCHAR *)) GetCurrentDirectory,
+ (DWORD (WINAPI *)(const TCHAR *)) GetFileAttributes,
(DWORD (WINAPI *)(const TCHAR *, DWORD nBufferLength, TCHAR *,
- TCHAR **)) GetFullPathNameW,
- (DWORD (WINAPI *)(const TCHAR *, TCHAR *, DWORD)) GetShortPathNameW,
+ TCHAR **)) GetFullPathName,
+ (DWORD (WINAPI *)(const TCHAR *, TCHAR *, DWORD)) GetShortPathName,
(UINT (WINAPI *)(const TCHAR *, const TCHAR *, UINT uUnique,
- TCHAR *)) GetTempFileNameW,
- (DWORD (WINAPI *)(DWORD, TCHAR *)) GetTempPathW,
+ TCHAR *)) GetTempFileName,
+ (DWORD (WINAPI *)(DWORD, TCHAR *)) GetTempPath,
(BOOL (WINAPI *)(const TCHAR *, TCHAR *, DWORD, LPDWORD, LPDWORD, LPDWORD,
- TCHAR *, DWORD)) GetVolumeInformationW,
- (HINSTANCE (WINAPI *)(const TCHAR *, HANDLE, DWORD)) LoadLibraryExW,
- (BOOL (WINAPI *)(const TCHAR *, const TCHAR *)) MoveFileW,
- (BOOL (WINAPI *)(const TCHAR *)) RemoveDirectoryW,
+ TCHAR *, DWORD)) GetVolumeInformation,
+ (HINSTANCE (WINAPI *)(const TCHAR *, HANDLE, DWORD)) LoadLibraryEx,
+ (BOOL (WINAPI *)(const TCHAR *, const TCHAR *)) MoveFile,
+ (BOOL (WINAPI *)(const TCHAR *)) RemoveDirectory,
(DWORD (WINAPI *)(const TCHAR *, const TCHAR *, const TCHAR *, DWORD,
- TCHAR *, TCHAR **)) SearchPathW,
- (BOOL (WINAPI *)(const TCHAR *)) SetCurrentDirectoryW,
- (BOOL (WINAPI *)(const TCHAR *, DWORD)) SetFileAttributesW,
-
- /*
- * The three NULL function pointers will only be set when
- * Tcl_FindExecutable is called. If you don't ever call that function, the
- * application will crash whenever WinTcl tries to call functions through
- * these null pointers. That is not a bug in Tcl - Tcl_FindExecutable is
- * mandatory in recent Tcl releases.
- */
-
- NULL,
- NULL,
- NULL,
- NULL,
- /* getLongPathNameProc */
- NULL,
- /* Security SDK - will be filled in on NT,XP,2000,2003 */
- NULL, NULL, NULL, NULL, NULL, NULL,
+ TCHAR *, TCHAR **)) SearchPath,
+ (BOOL (WINAPI *)(const TCHAR *)) SetCurrentDirectory,
+ (BOOL (WINAPI *)(const TCHAR *, DWORD)) SetFileAttributes,
+ (BOOL (WINAPI *)(const TCHAR *, GET_FILEEX_INFO_LEVELS,
+ LPVOID)) GetFileAttributesEx,
+ (BOOL (WINAPI *)(const TCHAR *, const TCHAR*,
+ LPSECURITY_ATTRIBUTES)) CreateHardLink,
+ (HANDLE (WINAPI *)(const TCHAR*, UINT, LPVOID, UINT,
+ LPVOID, DWORD)) FindFirstFileEx,
+ (BOOL (WINAPI *)(const TCHAR*, TCHAR*,
+ DWORD)) GetVolumeNameForVolumeMountPoint,
+ (DWORD (WINAPI *)(const TCHAR*, TCHAR*,
+ DWORD)) GetLongPathName,
+ /* Security SDK */
+ (BOOL (WINAPI *)(LPCTSTR, SECURITY_INFORMATION,
+ PSECURITY_DESCRIPTOR, DWORD, LPDWORD)) GetFileSecurity,
+ (BOOL (WINAPI *) (SECURITY_IMPERSONATION_LEVEL)) ImpersonateSelf,
+ (BOOL (WINAPI *) (HANDLE, DWORD, BOOL, PHANDLE)) OpenThreadToken,
+ (BOOL (WINAPI *) (void)) RevertToSelf,
+ (void (WINAPI *) (PDWORD, PGENERIC_MAPPING)) MapGenericMask,
+ (BOOL (WINAPI *)(PSECURITY_DESCRIPTOR, HANDLE, DWORD,
+ PGENERIC_MAPPING, PPRIVILEGE_SET, LPDWORD, LPDWORD, LPBOOL)) AccessCheck,
/* ReadConsole and WriteConsole */
- (BOOL (WINAPI *)(HANDLE, LPVOID, DWORD, LPDWORD, LPVOID)) ReadConsoleW,
- (BOOL (WINAPI *)(HANDLE, const void*, DWORD, LPDWORD, LPVOID)) WriteConsoleW,
- (BOOL (WINAPI *)(LPTSTR, LPDWORD)) GetUserNameW,
+ (BOOL (WINAPI *)(HANDLE, LPVOID, DWORD, LPDWORD, LPVOID)) ReadConsole,
+ (BOOL (WINAPI *)(HANDLE, const void*, DWORD, LPDWORD, LPVOID)) WriteConsole,
+ (BOOL (WINAPI *)(LPTSTR, LPDWORD)) GetUserName,
(const TCHAR *(*)(const char *, int, Tcl_DString *)) Tcl_WinUtfToTChar,
(const char *(*)(const TCHAR *, int, Tcl_DString *)) Tcl_WinTCharToUtf
};
@@ -387,62 +389,6 @@ TclWinSetInterfaces(
if (wide) {
winTCharEncoding = Tcl_GetEncoding(NULL, "unicode");
- if (winProcs.getFileAttributesExProc == NULL) {
- HINSTANCE hInstance = LoadLibrary(TEXT("kernel32"));
-
- if (hInstance != NULL) {
- winProcs.getFileAttributesExProc =
- (BOOL (WINAPI *)(const TCHAR *, GET_FILEEX_INFO_LEVELS,
- LPVOID)) GetProcAddress(hInstance,
- "GetFileAttributesExW");
- winProcs.createHardLinkProc =
- (BOOL (WINAPI *)(const TCHAR *, const TCHAR*,
- LPSECURITY_ATTRIBUTES)) GetProcAddress(hInstance,
- "CreateHardLinkW");
- winProcs.findFirstFileExProc =
- (HANDLE (WINAPI *)(const TCHAR*, UINT, LPVOID, UINT,
- LPVOID, DWORD)) GetProcAddress(hInstance,
- "FindFirstFileExW");
- winProcs.getVolumeNameForVMPProc =
- (BOOL (WINAPI *)(const TCHAR*, TCHAR*,
- DWORD)) GetProcAddress(hInstance,
- "GetVolumeNameForVolumeMountPointW");
- winProcs.getLongPathNameProc =
- (DWORD (WINAPI *)(const TCHAR*, TCHAR*,
- DWORD)) GetProcAddress(hInstance, "GetLongPathNameW");
- FreeLibrary(hInstance);
- }
- hInstance = LoadLibrary(TEXT("advapi32"));
- if (hInstance != NULL) {
- winProcs.getFileSecurityProc = (BOOL (WINAPI *)(
- LPCTSTR lpFileName,
- SECURITY_INFORMATION RequestedInformation,
- PSECURITY_DESCRIPTOR pSecurityDescriptor,
- DWORD nLength, LPDWORD lpnLengthNeeded))
- GetProcAddress(hInstance, "GetFileSecurityW");
- winProcs.impersonateSelfProc = (BOOL (WINAPI *) (
- SECURITY_IMPERSONATION_LEVEL ImpersonationLevel))
- GetProcAddress(hInstance, "ImpersonateSelf");
- winProcs.openThreadTokenProc = (BOOL (WINAPI *) (
- HANDLE ThreadHandle, DWORD DesiredAccess,
- BOOL OpenAsSelf, PHANDLE TokenHandle))
- GetProcAddress(hInstance, "OpenThreadToken");
- winProcs.revertToSelfProc = (BOOL (WINAPI *) (void))
- GetProcAddress(hInstance, "RevertToSelf");
- winProcs.mapGenericMaskProc = (void (WINAPI *) (
- PDWORD AccessMask, PGENERIC_MAPPING GenericMapping))
- GetProcAddress(hInstance, "MapGenericMask");
- winProcs.accessCheckProc = (BOOL (WINAPI *)(
- PSECURITY_DESCRIPTOR pSecurityDescriptor,
- HANDLE ClientToken, DWORD DesiredAccess,
- PGENERIC_MAPPING GenericMapping,
- PPRIVILEGE_SET PrivilegeSet,
- LPDWORD PrivilegeSetLength, LPDWORD GrantedAccess,
- LPBOOL AccessStatus)) GetProcAddress(hInstance,
- "AccessCheck");
- FreeLibrary(hInstance);
- }
- }
}
}
@@ -555,7 +501,7 @@ TclWinDriveLetterForVolMountPoint(
Tcl_MutexLock(&mountPointMap);
dlIter = driveLetterLookup;
while (dlIter != NULL) {
- if (wcscmp((WCHAR *)dlIter->volumeName, mountPoint) == 0) {
+ if (wcscmp(dlIter->volumeName, mountPoint) == 0) {
/*
* We need to check whether this information is still valid, since
* either the user or various programs could have adjusted the
@@ -568,9 +514,9 @@ TclWinDriveLetterForVolMountPoint(
* Try to read the volume mount point and see where it points.
*/
- if (tclWinProcs->getVolumeNameForVMPProc((TCHAR *) drive,
- (TCHAR *) Target, 55) != 0) {
- if (wcscmp((WCHAR *) dlIter->volumeName, Target) == 0) {
+ if (GetVolumeNameForVolumeMountPoint(drive,
+ Target, 55) != 0) {
+ if (wcscmp(dlIter->volumeName, Target) == 0) {
/*
* Nothing has changed.
*/
@@ -627,13 +573,13 @@ TclWinDriveLetterForVolMountPoint(
* Try to read the volume mount point and see where it points.
*/
- if (tclWinProcs->getVolumeNameForVMPProc((TCHAR *) drive,
- (TCHAR *) Target, 55) != 0) {
+ if (GetVolumeNameForVolumeMountPoint(drive,
+ Target, 55) != 0) {
int alreadyStored = 0;
for (dlIter = driveLetterLookup; dlIter != NULL;
dlIter = dlIter->nextPtr) {
- if (wcscmp((WCHAR *) dlIter->volumeName, Target) == 0) {
+ if (wcscmp(dlIter->volumeName, Target) == 0) {
alreadyStored = 1;
break;
}
@@ -654,7 +600,7 @@ TclWinDriveLetterForVolMountPoint(
for (dlIter = driveLetterLookup; dlIter != NULL;
dlIter = dlIter->nextPtr) {
- if (wcscmp((WCHAR *)dlIter->volumeName, mountPoint) == 0) {
+ if (wcscmp(dlIter->volumeName, mountPoint) == 0) {
Tcl_MutexUnlock(&mountPointMap);
return dlIter->driveLetter;
}