1/*
2 * tclWinInt.h --
3 *
4 *	Declarations of Windows-specific shared variables and procedures.
5 *
6 * Copyright (c) 1994-1996 Sun Microsystems, Inc.
7 *
8 * See the file "license.terms" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
10 *
11 * RCS: @(#) $Id: tclWinInt.h,v 1.20.2.5 2006/03/10 10:35:25 vincentdarley Exp $
12 */
13
14#ifndef _TCLWININT
15#define _TCLWININT
16
17#ifndef _TCLINT
18#include "tclInt.h"
19#endif
20#ifndef _TCLPORT
21#include "tclPort.h"
22#endif
23
24/*
25 * The following specifies how much stack space TclpCheckStackSpace()
26 * ensures is available.  TclpCheckStackSpace() is called by Tcl_EvalObj()
27 * to help avoid overflowing the stack in the case of infinite recursion.
28 */
29
30#define TCL_WIN_STACK_THRESHOLD 0x8000
31
32#ifdef BUILD_tcl
33# undef TCL_STORAGE_CLASS
34# define TCL_STORAGE_CLASS DLLEXPORT
35#endif
36
37/*
38 * Some versions of Borland C have a define for the OSVERSIONINFO for
39 * Win32s and for NT, but not for Windows 95.
40 * Define VER_PLATFORM_WIN32_CE for those without newer headers.
41 */
42
43#ifndef VER_PLATFORM_WIN32_WINDOWS
44#define VER_PLATFORM_WIN32_WINDOWS 1
45#endif
46#ifndef VER_PLATFORM_WIN32_CE
47#define VER_PLATFORM_WIN32_CE 3
48#endif
49
50/*
51 * The following structure keeps track of whether we are using the
52 * multi-byte or the wide-character interfaces to the operating system.
53 * System calls should be made through the following function table.
54 */
55
56typedef union {
57    WIN32_FIND_DATAA a;
58    WIN32_FIND_DATAW w;
59} WIN32_FIND_DATAT;
60
61typedef struct TclWinProcs {
62    int useWide;
63
64    BOOL (WINAPI *buildCommDCBProc)(CONST TCHAR *, LPDCB);
65    TCHAR *(WINAPI *charLowerProc)(TCHAR *);
66    BOOL (WINAPI *copyFileProc)(CONST TCHAR *, CONST TCHAR *, BOOL);
67    BOOL (WINAPI *createDirectoryProc)(CONST TCHAR *, LPSECURITY_ATTRIBUTES);
68    HANDLE (WINAPI *createFileProc)(CONST TCHAR *, DWORD, DWORD,
69	    LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);
70    BOOL (WINAPI *createProcessProc)(CONST TCHAR *, TCHAR *,
71	    LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD,
72	    LPVOID, CONST TCHAR *, LPSTARTUPINFOA, LPPROCESS_INFORMATION);
73    BOOL (WINAPI *deleteFileProc)(CONST TCHAR *);
74    HANDLE (WINAPI *findFirstFileProc)(CONST TCHAR *, WIN32_FIND_DATAT *);
75    BOOL (WINAPI *findNextFileProc)(HANDLE, WIN32_FIND_DATAT *);
76    BOOL (WINAPI *getComputerNameProc)(WCHAR *, LPDWORD);
77    DWORD (WINAPI *getCurrentDirectoryProc)(DWORD, WCHAR *);
78    DWORD (WINAPI *getFileAttributesProc)(CONST TCHAR *);
79    DWORD (WINAPI *getFullPathNameProc)(CONST TCHAR *, DWORD nBufferLength,
80	    WCHAR *, TCHAR **);
81    DWORD (WINAPI *getModuleFileNameProc)(HMODULE, WCHAR *, int);
82    DWORD (WINAPI *getShortPathNameProc)(CONST TCHAR *, WCHAR *, DWORD);
83    UINT (WINAPI *getTempFileNameProc)(CONST TCHAR *, CONST TCHAR *, UINT,
84	    WCHAR *);
85    DWORD (WINAPI *getTempPathProc)(DWORD, WCHAR *);
86    BOOL (WINAPI *getVolumeInformationProc)(CONST TCHAR *, WCHAR *, DWORD,
87	    LPDWORD, LPDWORD, LPDWORD, WCHAR *, DWORD);
88    HINSTANCE (WINAPI *loadLibraryProc)(CONST TCHAR *);
89    TCHAR (WINAPI *lstrcpyProc)(WCHAR *, CONST TCHAR *);
90    BOOL (WINAPI *moveFileProc)(CONST TCHAR *, CONST TCHAR *);
91    BOOL (WINAPI *removeDirectoryProc)(CONST TCHAR *);
92    DWORD (WINAPI *searchPathProc)(CONST TCHAR *, CONST TCHAR *,
93	    CONST TCHAR *, DWORD, WCHAR *, TCHAR **);
94    BOOL (WINAPI *setCurrentDirectoryProc)(CONST TCHAR *);
95    BOOL (WINAPI *setFileAttributesProc)(CONST TCHAR *, DWORD);
96    /*
97     * These two function pointers will only be set when
98     * Tcl_FindExecutable is called.  If you don't ever call that
99     * function, the application will crash whenever WinTcl tries to call
100     * functions through these null pointers.  That is not a bug in Tcl
101     * -- Tcl_FindExecutable is obligatory in recent Tcl releases.
102     */
103    BOOL (WINAPI *getFileAttributesExProc)(CONST TCHAR *,
104	    GET_FILEEX_INFO_LEVELS, LPVOID);
105    BOOL (WINAPI *createHardLinkProc)(CONST TCHAR*, CONST TCHAR*,
106				      LPSECURITY_ATTRIBUTES);
107
108    INT (__cdecl *utimeProc)(CONST TCHAR*, struct _utimbuf *);
109    /* These two are also NULL at start; see comment above */
110    HANDLE (WINAPI *findFirstFileExProc)(CONST TCHAR*, UINT,
111					 LPVOID, UINT,
112					 LPVOID, DWORD);
113    BOOL (WINAPI *getVolumeNameForVMPProc)(CONST TCHAR*, TCHAR*, DWORD);
114
115    DWORD (WINAPI *getLongPathNameProc)(CONST TCHAR*, TCHAR*, DWORD);
116    /*
117     * These six are for the security sdk to get correct file
118     * permissions on NT, 2000, XP, etc.  On 95,98,ME they are
119     * always null.
120     */
121    BOOL (WINAPI *getFileSecurityProc)(LPCTSTR lpFileName,
122		     SECURITY_INFORMATION RequestedInformation,
123		     PSECURITY_DESCRIPTOR pSecurityDescriptor,
124		     DWORD nLength,
125		     LPDWORD lpnLengthNeeded);
126    BOOL (WINAPI *impersonateSelfProc) (SECURITY_IMPERSONATION_LEVEL
127		      ImpersonationLevel);
128    BOOL (WINAPI *openThreadTokenProc) (HANDLE ThreadHandle,
129		      DWORD DesiredAccess, BOOL OpenAsSelf,
130		      PHANDLE TokenHandle);
131    BOOL (WINAPI *revertToSelfProc) (void);
132    VOID (WINAPI *mapGenericMaskProc) (PDWORD AccessMask,
133		      PGENERIC_MAPPING GenericMapping);
134    BOOL (WINAPI *accessCheckProc)(PSECURITY_DESCRIPTOR pSecurityDescriptor,
135		    HANDLE ClientToken, DWORD DesiredAccess,
136		    PGENERIC_MAPPING GenericMapping,
137		    PPRIVILEGE_SET PrivilegeSet,
138		    LPDWORD PrivilegeSetLength,
139		    LPDWORD GrantedAccess,
140		    LPBOOL AccessStatus);
141   /*
142    * Unicode console support. WriteConsole and ReadConsole
143    */
144    BOOL (WINAPI *readConsoleProc)(HANDLE hConsoleInput,
145	                           LPVOID lpBuffer,
146	                           DWORD nNumberOfCharsToRead,
147	                           LPDWORD lpNumberOfCharsRead,
148	                           LPVOID lpReserved);
149    BOOL (WINAPI *writeConsoleProc)(HANDLE hConsoleOutput,
150				    const VOID* lpBuffer,
151				    DWORD nNumberOfCharsToWrite,
152				    LPDWORD lpNumberOfCharsWritten,
153				    LPVOID lpReserved);
154} TclWinProcs;
155
156EXTERN TclWinProcs *tclWinProcs;
157
158/*
159 * Declarations of functions that are not accessible by way of the
160 * stubs table.
161 */
162
163EXTERN void		TclWinEncodingsCleanup();
164EXTERN void		TclWinResetInterfaceEncodings();
165EXTERN void		TclWinInit(HINSTANCE hInst);
166EXTERN int              TclWinSymLinkCopyDirectory(CONST TCHAR* LinkOriginal,
167						   CONST TCHAR* LinkCopy);
168EXTERN int              TclWinSymLinkDelete(CONST TCHAR* LinkOriginal,
169					    int linkOnly);
170EXTERN char TclWinDriveLetterForVolMountPoint(CONST WCHAR *mountPoint);
171#if defined(TCL_THREADS) && defined(USE_THREAD_ALLOC)
172EXTERN void		TclWinFreeAllocCache(void);
173EXTERN void		TclFreeAllocCache(void *);
174EXTERN Tcl_Mutex	*TclpNewAllocMutex(void);
175EXTERN void		*TclpGetAllocCache(void);
176EXTERN void		TclpSetAllocCache(void *);
177#endif /* TCL_THREADS */
178
179/* Needed by tclWinFile.c and tclWinFCmd.c */
180#ifndef FILE_ATTRIBUTE_REPARSE_POINT
181#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
182#endif
183
184#include "tclIntPlatDecls.h"
185
186# undef TCL_STORAGE_CLASS
187# define TCL_STORAGE_CLASS DLLIMPORT
188
189#endif	/* _TCLWININT */
190