"Fossies" - the Fresh Open Source Software Archive

Member "install-tl-20200916/tlpkg/tlperl/lib/CORE/win32.h" (7 Mar 2020, 22649 Bytes) of package /windows/misc/install-tl.zip:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

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