This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
6de9c9b7264177aa6267f9d7ef1d5c989f0fbba0
[perl5.git] / win32 / win32.h
1 /* WIN32.H
2  *
3  * (c) 1995 Microsoft Corporation. All rights reserved.
4  *              Developed by hip communications inc.
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  */
9 #ifndef  _INC_WIN32_PERL5
10 #define  _INC_WIN32_PERL5
11
12 #ifndef _WIN32_WINNT
13 #  define _WIN32_WINNT 0x0500     /* needed for CreateHardlink() etc. */
14 #endif
15
16 /* Win32 only optimizations for faster building */
17 #ifdef PERL_IS_MINIPERL
18 /* this macro will remove Winsock only on miniperl, PERL_IMPLICIT_SYS and
19  * makedef.pl create dependencies that will keep Winsock linked in even with
20  * this macro defined, even though sockets will be umimplemented from a script
21  * level in full perl
22  */
23 #  define WIN32_NO_SOCKETS
24 /* less I/O calls during each require */
25 #  define PERL_DISABLE_PMC
26
27 /* unnecessery for miniperl to lookup anything from an "installed" perl */
28 #  define WIN32_NO_REGISTRY
29
30 /* allow minitest to work */
31 #  define PERL_TEXTMODE_SCRIPTS
32 #endif
33
34 #ifdef WIN32_NO_SOCKETS
35 #  undef HAS_SOCKET
36 #  undef HAS_GETPROTOBYNAME
37 #  undef HAS_GETPROTOBYNUMBER
38 #  undef HAS_GETPROTOENT
39 #  undef HAS_GETNETBYNAME
40 #  undef HAS_GETNETBYADDR
41 #  undef HAS_GETNETENT
42 #  undef HAS_GETSERVBYNAME
43 #  undef HAS_GETSERVBYPORT
44 #  undef HAS_GETSERVENT
45 #  undef HAS_GETHOSTBYNAME
46 #  undef HAS_GETHOSTBYADDR
47 #  undef HAS_GETHOSTENT
48 #  undef HAS_SELECT
49 #  undef HAS_IOCTL
50 #  undef HAS_NTOHL
51 #  undef HAS_HTONL
52 #  undef HAS_HTONS
53 #  undef HAS_NTOHS
54 #  define WIN32SCK_IS_STDSCK
55 #endif
56
57 #if defined(PERL_IMPLICIT_SYS)
58 #  define DYNAMIC_ENV_FETCH
59 #  define HAS_GETENV_LEN
60 #  define prime_env_iter()
61 #  define WIN32IO_IS_STDIO              /* don't pull in custom stdio layer */
62 #  define WIN32SCK_IS_STDSCK            /* don't pull in custom wsock layer */
63 #  ifdef PERL_GLOBAL_STRUCT
64 #    error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS
65 #  endif
66 #endif
67
68 #ifdef __GNUC__
69 #  ifndef __int64               /* some versions seem to #define it already */
70 #    define __int64 long long
71 #  endif
72 #  define Win32_Winsock
73 #ifdef __cplusplus
74 /* Mingw32 gcc -xc++ objects to __attribute((unused)) at least */
75 #undef  PERL_UNUSED_DECL
76 #define PERL_UNUSED_DECL
77 #endif
78 #endif
79
80
81 /* Define DllExport akin to perl's EXT,
82  * If we are in the DLL then Export the symbol,
83  * otherwise import it.
84  */
85
86 /* now even GCC supports __declspec() */
87 /* miniperl has no reason to export anything */
88 #if defined(PERL_IS_MINIPERL) && !defined(UNDER_CE) && defined(_MSC_VER)
89 #  define DllExport
90 #else
91 #  if defined(PERLDLL)
92 #    define DllExport __declspec(dllexport)
93 #  else
94 #    define DllExport __declspec(dllimport)
95 #  endif
96 #endif
97
98 /* The Perl APIs can only be called directly inside the perl5xx.dll.
99  * All other code has to import them.  By declaring them as "dllimport"
100  * we tell the compiler to generate an indirect call instruction and
101  * avoid redirection through a call thunk.
102  *
103  * The XS code in the re extension is special, in that it redefines
104  * core APIs locally, so don't mark them as "dllimport" because GCC
105  * cannot handle this situation.
106  */
107 #if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD)
108 #  ifdef __cplusplus
109 #    define PERL_CALLCONV extern "C" __declspec(dllimport)
110 #    ifdef _MSC_VER
111 #      define PERL_CALLCONV_NO_RET extern "C" __declspec(dllimport) __declspec(noreturn)
112 #    endif
113 #  else
114 #    define PERL_CALLCONV __declspec(dllimport)
115 #    ifdef _MSC_VER
116 #      define PERL_CALLCONV_NO_RET __declspec(dllimport) __declspec(noreturn)
117 #    endif
118 #  endif
119 #else /* MSVC noreturn support inside the interp */
120 #  ifdef _MSC_VER
121 #    define PERL_CALLCONV_NO_RET __declspec(noreturn)
122 #  endif
123 #endif
124
125 #ifdef _MSC_VER
126 #  define PERL_STATIC_NO_RET __declspec(noreturn) static
127 #  define PERL_STATIC_INLINE_NO_RET __declspec(noreturn) PERL_STATIC_INLINE
128 #endif
129
130 #define  WIN32_LEAN_AND_MEAN
131 #include <windows.h>
132
133 /*
134  * Bug in winbase.h in mingw-w64 4.4.0-1 at least... they
135  * do #define GetEnvironmentStringsA GetEnvironmentStrings and fail
136  * to declare GetEnvironmentStringsA.
137  */
138 #if defined(__MINGW64__) && defined(GetEnvironmentStringsA) && !defined(UNICODE)
139 #ifdef __cplusplus
140 extern "C" {
141 #endif
142 #undef GetEnvironmentStringsA
143 WINBASEAPI LPCH WINAPI GetEnvironmentStringsA(VOID);
144 #define GetEnvironmentStrings GetEnvironmentStringsA
145 #ifdef __cplusplus
146 }
147 #endif
148 #endif
149
150 #ifdef   WIN32_LEAN_AND_MEAN            /* C file is NOT a Perl5 original. */
151 #define  CONTEXT        PERL_CONTEXT    /* Avoid conflict of CONTEXT defs. */
152 #endif /*WIN32_LEAN_AND_MEAN */
153
154 #ifndef TLS_OUT_OF_INDEXES
155 #define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
156 #endif
157
158 #include <dirent.h>
159 #include <io.h>
160 #include <process.h>
161 #include <stdio.h>
162 #include <direct.h>
163 #include <stdlib.h>
164 #include <stddef.h>
165 #include <fcntl.h>
166 #ifndef EXT
167 #include "EXTERN.h"
168 #endif
169
170 struct tms {
171         long    tms_utime;
172         long    tms_stime;
173         long    tms_cutime;
174         long    tms_cstime;
175 };
176
177 #ifndef SYS_NMLN
178 #define SYS_NMLN        257
179 #endif
180
181 struct utsname {
182     char sysname[SYS_NMLN];
183     char nodename[SYS_NMLN];
184     char release[SYS_NMLN];
185     char version[SYS_NMLN];
186     char machine[SYS_NMLN];
187 };
188
189 #ifndef START_EXTERN_C
190 #undef EXTERN_C
191 #ifdef __cplusplus
192 #  define START_EXTERN_C extern "C" {
193 #  define END_EXTERN_C }
194 #  define EXTERN_C extern "C"
195 #else
196 #  define START_EXTERN_C
197 #  define END_EXTERN_C
198 #  define EXTERN_C
199 #endif
200 #endif
201
202 #define  STANDARD_C     1
203 #define  DOSISH         1               /* no escaping our roots */
204 #define  OP_BINARY      O_BINARY        /* mistake in in pp_sys.c? */
205
206 /* read() and write() aren't transparent for socket handles */
207 #ifndef WIN32_NO_SOCKETS
208 #  define PERL_SOCK_SYSREAD_IS_RECV
209 #  define PERL_SOCK_SYSWRITE_IS_SEND
210 #endif
211
212 #ifdef WIN32_NO_REGISTRY
213 /* the last _ in WIN32_NO_REGISTRY_M_ is like the _ in aTHX_ */
214 #  define WIN32_NO_REGISTRY_M_(x)
215 #else
216 #  define WIN32_NO_REGISTRY_M_(x) x,
217 #endif
218
219 #define PERL_NO_FORCE_LINK              /* no need for PL_force_link_funcs */
220
221 #define ENV_IS_CASELESS
222
223 #define PIPESOCK_MODE   "b"             /* pipes, sockets default to binmode */
224
225 /* access() mode bits */
226 #ifndef R_OK
227 #  define       R_OK    4
228 #  define       W_OK    2
229 #  define       X_OK    1
230 #  define       F_OK    0
231 #endif
232
233 /* for waitpid() */
234 #ifndef WNOHANG
235 #  define WNOHANG       1
236 #endif
237
238 #define PERL_GET_CONTEXT_DEFINED
239
240 /* Compiler-specific stuff. */
241
242 /* VC uses non-standard way to determine the size and alignment if bit-fields */
243 /* MinGW will compile with -mms-bitfields, so should use the same types */
244 #define PERL_BITFIELD8  unsigned char
245 #define PERL_BITFIELD16 unsigned short
246 #define PERL_BITFIELD32 unsigned int
247
248 #ifdef _MSC_VER                 /* Microsoft Visual C++ */
249
250 #ifndef UNDER_CE
251 typedef long            uid_t;
252 typedef long            gid_t;
253 typedef unsigned short  mode_t;
254 #endif
255
256 #if _MSC_VER < 1800
257 #define isnan           _isnan  /* Defined already in VC++ 12.0 */
258 #endif
259 #ifdef UNDER_CE /* revisit what function this becomes celib vs corelibc, prv warning here*/
260 #  undef snprintf
261 #endif
262 #define snprintf        _snprintf
263 #define vsnprintf       _vsnprintf
264
265 /* on VS2003, msvcrt.lib is missing these symbols */
266 #if _MSC_VER >= 1300 && _MSC_VER < 1400
267 #  pragma intrinsic(_rotl64,_rotr64)
268 #endif
269
270 #pragma warning(push)
271 #pragma warning(disable:4756;disable:4056)
272 PERL_STATIC_INLINE
273 double S_Infinity() {
274     /* this is a real C literal which can get further constant folded
275        unlike using HUGE_VAL/_HUGE which are data symbol imports from the CRT
276        and therefore can not by folded by VC, an example of constant
277        folding INF is creating -INF */
278     return (DBL_MAX+DBL_MAX);
279 }
280 #pragma warning(pop)
281 #define NV_INF S_Infinity()
282
283 /* selectany allows duplicate and unused data symbols to be removed by
284    VC linker, if this were static, each translation unit will have its own,
285    usually unused __PL_nan_u, if this were plain extern it will cause link
286    to fail due to multiple definitions, since we dont know if we are being
287    compiled as static or DLL XS, selectany simply always works, the cost of
288    importing __PL_nan_u across DLL boundaries in size in the importing DLL
289    will be more than the 8 bytes it will take up being in each XS DLL if
290    that DLL actually uses __PL_nan_u */
291 extern const __declspec(selectany) union { unsigned __int64 __q; double __d; }
292 __PL_nan_u = { 0x7FF8000000000000UI64 };
293 #define NV_NAN ((NV)__PL_nan_u.__d)
294
295 /* The CRT was rewritten in VS2015. */
296 #if _MSC_VER >= 1900
297
298 /* No longer declared in stdio.h */
299 char *gets(char* buffer);
300
301 #define tzname _tzname
302
303 /* From corecrt_internal_stdio.h: */
304 typedef struct
305 {
306     union
307     {
308         FILE  _public_file;
309         char* _ptr;
310     };
311
312     char*            _base;
313     int              _cnt;
314     long             _flags;
315     long             _file;
316     int              _charbuf;
317     int              _bufsiz;
318     char*            _tmpfname;
319     CRITICAL_SECTION _lock;
320 } __crt_stdio_stream_data;
321
322 #define PERLIO_FILE_flag_RD 0x0001 /* _IOREAD   */
323 #define PERLIO_FILE_flag_WR 0x0002 /* _IOWRITE  */
324 #define PERLIO_FILE_flag_RW 0x0004 /* _IOUPDATE */
325 #define PERLIO_FILE_ptr(f)  (((__crt_stdio_stream_data*)(f))->_ptr)
326 #define PERLIO_FILE_base(f) (((__crt_stdio_stream_data*)(f))->_base)
327 #define PERLIO_FILE_cnt(f)  (((__crt_stdio_stream_data*)(f))->_cnt)
328 #define PERLIO_FILE_flag(f) ((int)(((__crt_stdio_stream_data*)(f))->_flags))
329 #define PERLIO_FILE_file(f) ((int)(((__crt_stdio_stream_data*)(f))->_file))
330
331 #endif
332
333 #endif /* _MSC_VER */
334
335 #if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
336
337 /* Note: PERLIO_FILE_ptr/base/cnt are not actually used for GCC or <VS2015
338  * since FILE_ptr/base/cnt do the same thing anyway but it doesn't hurt to
339  * define them all here for completeness. */
340 #define PERLIO_FILE_flag_RD _IOREAD /* 0x001 */
341 #define PERLIO_FILE_flag_WR _IOWRT  /* 0x002 */
342 #define PERLIO_FILE_flag_RW _IORW   /* 0x080 */
343 #define PERLIO_FILE_ptr(f)  ((f)->_ptr)
344 #define PERLIO_FILE_base(f) ((f)->_base)
345 #define PERLIO_FILE_cnt(f)  ((f)->_cnt)
346 #define PERLIO_FILE_flag(f) ((f)->_flag)
347 #define PERLIO_FILE_file(f) ((f)->_file)
348
349 #endif
350
351 #ifdef __MINGW32__              /* Minimal Gnu-Win32 */
352
353 typedef long            uid_t;
354 typedef long            gid_t;
355 #ifndef _environ
356 #define _environ        environ
357 #endif
358 #define flushall        _flushall
359 #define fcloseall       _fcloseall
360 #ifndef isnan
361 #define isnan           _isnan  /* ...same libraries as MSVC */
362 #endif
363
364 #ifndef _O_NOINHERIT
365 #  define _O_NOINHERIT  0x0080
366 #  ifndef _NO_OLDNAMES
367 #    define O_NOINHERIT _O_NOINHERIT
368 #  endif
369 #endif
370
371 /* <stdint.h>, pulled in by <io.h> as of mingw-runtime-3.3, typedef's
372  * (u)intptr_t but doesn't set the _(U)INTPTR_T_DEFINED defines */
373 #ifdef _STDINT_H
374 #  ifndef _INTPTR_T_DEFINED
375 #    define _INTPTR_T_DEFINED
376 #  endif
377 #  ifndef _UINTPTR_T_DEFINED
378 #    define _UINTPTR_T_DEFINED
379 #  endif
380 #endif
381
382 #ifndef CP_UTF8
383 #  define CP_UTF8       65001
384 #endif
385
386 #endif /* __MINGW32__ */
387
388 #ifndef _INTPTR_T_DEFINED
389 typedef int             intptr_t;
390 #  define _INTPTR_T_DEFINED
391 #endif
392
393 #ifndef _UINTPTR_T_DEFINED
394 typedef unsigned int    uintptr_t;
395 #  define _UINTPTR_T_DEFINED
396 #endif
397
398 START_EXTERN_C
399
400 /* For UNIX compatibility. */
401
402 #ifdef PERL_CORE
403 extern  uid_t   getuid(void);
404 extern  gid_t   getgid(void);
405 extern  uid_t   geteuid(void);
406 extern  gid_t   getegid(void);
407 extern  int     setuid(uid_t uid);
408 extern  int     setgid(gid_t gid);
409 extern  int     kill(int pid, int sig);
410 #ifndef USE_PERL_SBRK
411 extern  void    *sbrk(ptrdiff_t need);
412 #  define HAS_SBRK_PROTO
413 #endif
414 extern  char *  getlogin(void);
415 extern  int     chown(const char *p, uid_t o, gid_t g);
416 #if !defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 4
417 extern  int     mkstemp(const char *path);
418 #endif
419 #endif
420
421 #undef   Stat
422 #define  Stat           win32_stat
423
424 #undef   init_os_extras
425 #define  init_os_extras Perl_init_os_extras
426
427 DllExport void          Perl_win32_init(int *argcp, char ***argvp);
428 DllExport void          Perl_win32_term(void);
429 DllExport void          Perl_init_os_extras(void);
430 DllExport void          win32_str_os_error(void *sv, DWORD err);
431 DllExport int           RunPerl(int argc, char **argv, char **env);
432
433 typedef struct {
434     HANDLE      childStdIn;
435     HANDLE      childStdOut;
436     HANDLE      childStdErr;
437     /*
438      * the following correspond to the fields of the same name
439      * in the STARTUPINFO structure. Embedders can use these to
440      * control the spawning process' look.
441      * Example - to hide the window of the spawned process:
442      *    dwFlags = STARTF_USESHOWWINDOW;
443      *    wShowWindow = SW_HIDE;
444      */
445     DWORD       dwFlags;
446     DWORD       dwX;
447     DWORD       dwY;
448     DWORD       dwXSize;
449     DWORD       dwYSize;
450     DWORD       dwXCountChars;
451     DWORD       dwYCountChars;
452     DWORD       dwFillAttribute;
453     WORD        wShowWindow;
454 } child_IO_table;
455
456 DllExport void          win32_get_child_IO(child_IO_table* ptr);
457 DllExport HWND          win32_create_message_window(void);
458 DllExport int           win32_async_check(pTHX);
459
460 extern int              my_fclose(FILE *);
461 extern char *           win32_get_privlib(WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len);
462 extern char *           win32_get_sitelib(const char *pl, STRLEN *const len);
463 extern char *           win32_get_vendorlib(const char *pl, STRLEN *const len);
464
465 #ifdef PERL_IMPLICIT_SYS
466 extern void             win32_delete_internal_host(void *h);
467 #endif
468
469 extern int              win32_get_errno(int err);
470
471 extern const char * const               staticlinkmodules[];
472
473 END_EXTERN_C
474
475 typedef  char *         caddr_t;        /* In malloc.c (core address). */
476
477 /*
478  * handle socket stuff, assuming socket is always available
479  */
480 #include <sys/socket.h>
481 #include <netdb.h>
482
483 #ifdef MYMALLOC
484 #define EMBEDMYMALLOC   /**/
485 /* #define USE_PERL_SBRK        / **/
486 /* #define PERL_SBRK_VIA_MALLOC / **/
487 #endif
488
489 #ifdef PERL_TEXTMODE_SCRIPTS
490 #  define PERL_SCRIPT_MODE              "r"
491 #else
492 #  define PERL_SCRIPT_MODE              "rb"
493 #endif
494
495 /*
496  * Now Win32 specific per-thread data stuff
497  */
498
499 /* Leave the first couple ids after WM_USER unused because they
500  * might be used by an embedding application, and on Windows
501  * version before 2000 we might end up eating those messages
502  * if they were not meant for us.
503  */
504 #define WM_USER_MIN     (WM_USER+30)
505 #define WM_USER_MESSAGE (WM_USER_MIN)
506 #define WM_USER_KILL    (WM_USER_MIN+1)
507 #define WM_USER_MAX     (WM_USER_MIN+1)
508
509 struct thread_intern {
510     /* XXX can probably use one buffer instead of several */
511     char                Wstrerror_buffer[512];
512     struct servent      Wservent;
513     char                Wgetlogin_buffer[128];
514     int                 Winit_socktype;
515     char                Wcrypt_buffer[30];
516 #    ifdef USE_RTL_THREAD_API
517     void *              retv;   /* slot for thread return value */
518 #    endif
519     BOOL               Wuse_showwindow;
520     WORD               Wshowwindow;
521 };
522
523 #define HAVE_INTERP_INTERN
524 typedef struct {
525     long        num;
526     DWORD       pids[MAXIMUM_WAIT_OBJECTS];
527     HANDLE      handles[MAXIMUM_WAIT_OBJECTS];
528 } child_tab;
529
530 #ifdef USE_ITHREADS
531 typedef struct {
532     long        num;
533     DWORD       pids[MAXIMUM_WAIT_OBJECTS];
534     HANDLE      handles[MAXIMUM_WAIT_OBJECTS];
535     HWND        message_hwnds[MAXIMUM_WAIT_OBJECTS];
536     char        sigterm[MAXIMUM_WAIT_OBJECTS];
537 } pseudo_child_tab;
538 #endif
539
540 #ifndef Sighandler_t
541 typedef Signal_t (*Sighandler_t) (int);
542 #define Sighandler_t    Sighandler_t
543 #endif
544
545 struct interp_intern {
546     char *      perlshell_tokens;
547     char **     perlshell_vec;
548     long        perlshell_items;
549     struct av * fdpid;
550     child_tab * children;
551 #ifdef USE_ITHREADS
552     DWORD       pseudo_id;
553     pseudo_child_tab * pseudo_children;
554 #endif
555     void *      internal_host;
556     struct thread_intern        thr_intern;
557     HWND        message_hwnd;
558     UINT        timerid;
559     unsigned    poll_count;
560     Sighandler_t sigtable[SIG_SIZE];
561     bool sloppystat;
562 };
563
564 #define WIN32_POLL_INTERVAL 32768
565 #define PERL_ASYNC_CHECK() if (w32_do_async || PL_sig_pending) win32_async_check(aTHX)
566
567 #define w32_perlshell_tokens    (PL_sys_intern.perlshell_tokens)
568 #define w32_perlshell_vec       (PL_sys_intern.perlshell_vec)
569 #define w32_perlshell_items     (PL_sys_intern.perlshell_items)
570 #define w32_fdpid               (PL_sys_intern.fdpid)
571 #define w32_children            (PL_sys_intern.children)
572 #define w32_num_children        (w32_children->num)
573 #define w32_child_pids          (w32_children->pids)
574 #define w32_child_handles       (w32_children->handles)
575 #define w32_pseudo_id           (PL_sys_intern.pseudo_id)
576 #define w32_pseudo_children     (PL_sys_intern.pseudo_children)
577 #define w32_num_pseudo_children         (w32_pseudo_children->num)
578 #define w32_pseudo_child_pids           (w32_pseudo_children->pids)
579 #define w32_pseudo_child_handles        (w32_pseudo_children->handles)
580 #define w32_pseudo_child_message_hwnds  (w32_pseudo_children->message_hwnds)
581 #define w32_pseudo_child_sigterm        (w32_pseudo_children->sigterm)
582 #define w32_internal_host               (PL_sys_intern.internal_host)
583 #define w32_timerid                     (PL_sys_intern.timerid)
584 #define w32_message_hwnd                (PL_sys_intern.message_hwnd)
585 #define w32_sighandler                  (PL_sys_intern.sigtable)
586 #define w32_poll_count                  (PL_sys_intern.poll_count)
587 #define w32_do_async                    (w32_poll_count++ > WIN32_POLL_INTERVAL)
588 #define w32_strerror_buffer     (PL_sys_intern.thr_intern.Wstrerror_buffer)
589 #define w32_getlogin_buffer     (PL_sys_intern.thr_intern.Wgetlogin_buffer)
590 #define w32_crypt_buffer        (PL_sys_intern.thr_intern.Wcrypt_buffer)
591 #define w32_servent             (PL_sys_intern.thr_intern.Wservent)
592 #define w32_init_socktype       (PL_sys_intern.thr_intern.Winit_socktype)
593 #define w32_use_showwindow      (PL_sys_intern.thr_intern.Wuse_showwindow)
594 #define w32_showwindow  (PL_sys_intern.thr_intern.Wshowwindow)
595 #define w32_sloppystat  (PL_sys_intern.sloppystat)
596
597 #ifdef USE_ITHREADS
598 void win32_wait_for_children(pTHX);
599 #  define PERL_WAIT_FOR_CHILDREN win32_wait_for_children(aTHX)
600 #endif
601
602 /* The following ioinfo struct manipulations had been removed but were
603  * reinstated to fix RT#120091/118059. However, they do not work with
604  * the rewritten CRT in VS2015 so they are removed once again for VS2015
605  * onwards, which will therefore suffer from the reintroduction of the
606  * close socket bug. */
607 #if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
608
609 #ifdef PERL_CORE
610
611 /* C doesn't like repeat struct definitions */
612 #if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
613 #  undef _CRTIMP
614 #endif
615 #ifndef _CRTIMP
616 #  define _CRTIMP __declspec(dllimport)
617 #endif
618
619
620 /* VS2005 has multiple ioinfo struct definitions through VS2005's release life
621  * VS2008-2012 have been stable but do not assume future VSs will have the
622  * same ioinfo struct, just because past struct stability. If research is done
623  * on the CRTs of future VSs, the version check can be bumped up so the newer
624  * VS uses a fixed ioinfo size. (Actually, only VS2013 (_MSC_VER 1800) hasn't
625  * been looked at; after that we cannot use the ioinfo struct anyway (see the
626  * #if above).)
627  */
628 #if ! (_MSC_VER < 1400 || (_MSC_VER >= 1500 && _MSC_VER <= 1700) \
629   || defined(__MINGW32__))
630 /* size of ioinfo struct is determined at runtime */
631 #  define WIN32_DYN_IOINFO_SIZE
632 #endif
633
634 #ifndef WIN32_DYN_IOINFO_SIZE
635 /*
636  * Control structure for lowio file handles
637  */
638 typedef struct {
639     intptr_t osfhnd;/* underlying OS file HANDLE */
640     char osfile;    /* attributes of file (e.g., open in text mode?) */
641     char pipech;    /* one char buffer for handles opened on pipes */
642     int lockinitflag;
643     CRITICAL_SECTION lock;
644 /* this struct definition breaks ABI compatibility with
645  * not using, cl.exe's native VS version specitfic CRT. */
646 #  if _MSC_VER >= 1400 && _MSC_VER < 1500
647 #    error "This ioinfo struct is incomplete for Visual C 2005"
648 #  endif
649 /* VS2005 CRT has at least 3 different definitions of this struct based on the
650  * CRT DLL's build number. */
651 #  if _MSC_VER >= 1500
652 #    ifndef _SAFECRT_IMPL
653     /* Not used in the safecrt downlevel. We do not define them, so we cannot
654      * use them accidentally */
655     char textmode : 7;/* __IOINFO_TM_ANSI or __IOINFO_TM_UTF8 or __IOINFO_TM_UTF16LE */
656     char unicode : 1; /* Was the file opened as unicode? */
657     char pipech2[2];  /* 2 more peak ahead chars for UNICODE mode */
658     __int64 startpos;      /* File position that matches buffer start */
659     BOOL utf8translations; /* Buffer contains translations other than CRLF*/
660     char dbcsBuffer;       /* Buffer for the lead byte of dbcs when converting from dbcs to unicode */
661     BOOL dbcsBufferUsed;   /* Bool for the lead byte buffer is used or not */
662 #    endif
663 #  endif
664 } ioinfo;
665 #else
666 typedef intptr_t ioinfo;
667 #endif
668
669 /*
670  * Array of arrays of control structures for lowio files.
671  */
672 EXTERN_C _CRTIMP ioinfo* __pioinfo[];
673
674 /*
675  * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
676  * array of ioinfo structs.
677  */
678 #define IOINFO_L2E          5
679
680 /*
681  * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
682  */
683 #define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
684
685 /*
686  * Access macros for getting at an ioinfo struct and its fields from a
687  * file handle
688  */
689 #ifdef WIN32_DYN_IOINFO_SIZE
690 #  define _pioinfo(i) ((intptr_t *) \
691      (((Size_t)__pioinfo[(i) >> IOINFO_L2E])/* * to head of array ioinfo [] */\
692       /* offset to the head of a particular ioinfo struct */ \
693       + (((i) & (IOINFO_ARRAY_ELTS - 1)) * w32_ioinfo_size)) \
694    )
695 /* first slice of ioinfo is always the OS handle */
696 #  define _osfhnd(i)  (*(_pioinfo(i)))
697 #else
698 #  define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
699 #  define _osfhnd(i)  (_pioinfo(i)->osfhnd)
700 #endif
701
702 /* since we are not doing a dup2(), this works fine */
703 #define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
704
705 #endif /* PERL_CORE */
706
707 #endif /* !defined(_MSC_VER) || _MSC_VER<1900 */
708
709 /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
710 #if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
711 #undef  PERLIO_NOT_STDIO
712 #endif
713 #define PERLIO_NOT_STDIO 0
714
715 #define EXEC_ARGV_CAST(x) ((const char *const *) x)
716
717 DllExport void *win32_signal_context(void);
718 #define PERL_GET_SIG_CONTEXT win32_signal_context()
719
720 #ifdef UNDER_CE
721 #define Win_GetModuleHandle   XCEGetModuleHandleA
722 #define Win_GetProcAddress    XCEGetProcAddressA
723 #define Win_GetModuleFileName XCEGetModuleFileNameA
724 #define Win_CreateSemaphore   CreateSemaphoreW
725 #else
726 #define Win_GetModuleHandle   GetModuleHandle
727 #define Win_GetProcAddress    GetProcAddress
728 #define Win_GetModuleFileName GetModuleFileName
729 #define Win_CreateSemaphore   CreateSemaphore
730 #endif
731
732 #endif /* _INC_WIN32_PERL5 */
733