3 * (c) 1995 Microsoft Corporation. All rights reserved.
4 * Developed by hip communications inc.
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.
9 #ifndef _INC_WIN32_PERL5
10 #define _INC_WIN32_PERL5
13 # define _WIN32_WINNT 0x0500 /* needed for CreateHardlink() etc. */
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
23 # define WIN32_NO_SOCKETS
24 /* less I/O calls during each require */
25 # define PERL_DISABLE_PMC
27 /* unnecessery for miniperl to lookup anything from an "installed" perl */
28 # define WIN32_NO_REGISTRY
30 /* allow minitest to work */
31 # define PERL_TEXTMODE_SCRIPTS
34 #ifdef WIN32_NO_SOCKETS
36 # undef HAS_GETPROTOBYNAME
37 # undef HAS_GETPROTOBYNUMBER
38 # undef HAS_GETPROTOENT
39 # undef HAS_GETNETBYNAME
40 # undef HAS_GETNETBYADDR
42 # undef HAS_GETSERVBYNAME
43 # undef HAS_GETSERVBYPORT
44 # undef HAS_GETSERVENT
45 # undef HAS_GETHOSTBYNAME
46 # undef HAS_GETHOSTBYADDR
47 # undef HAS_GETHOSTENT
54 # define WIN32SCK_IS_STDSCK
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 */
66 # ifndef __int64 /* some versions seem to #define it already */
67 # define __int64 long long
69 # define Win32_Winsock
73 /* Define DllExport akin to perl's EXT,
74 * If we are in the DLL then Export the symbol,
75 * otherwise import it.
78 /* now even GCC supports __declspec() */
79 /* miniperl has no reason to export anything */
80 #if defined(PERL_IS_MINIPERL)
84 # define DllExport __declspec(dllexport)
86 # define DllExport __declspec(dllimport)
90 /* The Perl APIs can only be called directly inside the perl5xx.dll.
91 * All other code has to import them. By declaring them as "dllimport"
92 * we tell the compiler to generate an indirect call instruction and
93 * avoid redirection through a call thunk.
95 * The XS code in the re extension is special, in that it redefines
96 * core APIs locally, so don't mark them as "dllimport" because GCC
97 * cannot handle this situation.
99 * Certain old GCCs will not allow the function pointer of dllimport marked
100 * function to be "const". This was fixed later on. Since this is a
101 * deoptimization, target "gcc version 3.4.5 (mingw-vista special r3)" only,
102 * The GCC bug was fixed in GCC patch "varasm.c (initializer_constant_valid_p):
103 * Don't deny DECL_DLLIMPORT_P on functions", which probably was first released
104 * in GCC 4.3.0, this #if can be expanded upto but not including 4.3.0 if more
105 * deployed GCC are found that wont build with the follow error, initializer
106 * element is a PerlIO func exported from perl5xx.dll.
108 * encoding.xs:610: error: initializer element is not constant
109 * encoding.xs:610: error: (near initialization for `PerlIO_encode.Open')
112 #if (defined(__GNUC__) && defined(__MINGW32__) && \
113 !defined(__MINGW64_VERSION_MAJOR) && !defined(__clang__) && \
114 ((__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 5))))
115 /* use default fallbacks from perl.h for this particular GCC */
117 # if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD)
119 # define PERL_CALLCONV extern "C" __declspec(dllimport)
121 # define PERL_CALLCONV_NO_RET extern "C" __declspec(dllimport) __declspec(noreturn)
124 # define PERL_CALLCONV __declspec(dllimport)
126 # define PERL_CALLCONV_NO_RET __declspec(dllimport) __declspec(noreturn)
129 # else /* MSVC noreturn support inside the interp */
131 # define PERL_CALLCONV_NO_RET __declspec(noreturn)
137 # define PERL_STATIC_NO_RET __declspec(noreturn) static
138 # define PERL_STATIC_INLINE_NO_RET __declspec(noreturn) PERL_STATIC_INLINE
139 # define PERL_STATIC_FORCE_INLINE __forceinline static
140 # define PERL_STATIC_FORCE_INLINE_NO_RET __declspec(noreturn) __forceinline static
143 #define WIN32_LEAN_AND_MEAN
147 * Bug in winbase.h in mingw-w64 4.4.0-1 at least... they
148 * do #define GetEnvironmentStringsA GetEnvironmentStrings and fail
149 * to declare GetEnvironmentStringsA.
151 #if defined(__MINGW64__) && defined(GetEnvironmentStringsA) && !defined(UNICODE)
155 #undef GetEnvironmentStringsA
156 WINBASEAPI LPCH WINAPI GetEnvironmentStringsA(VOID);
157 #define GetEnvironmentStrings GetEnvironmentStringsA
163 #ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */
164 #define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */
165 #endif /*WIN32_LEAN_AND_MEAN */
167 #ifndef TLS_OUT_OF_INDEXES
168 #define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
195 char sysname[SYS_NMLN];
196 char nodename[SYS_NMLN];
197 char release[SYS_NMLN];
198 char version[SYS_NMLN];
199 char machine[SYS_NMLN];
202 #ifndef START_EXTERN_C
205 # define START_EXTERN_C extern "C" {
206 # define END_EXTERN_C }
207 # define EXTERN_C extern "C"
209 # define START_EXTERN_C
210 # define END_EXTERN_C
215 #define DOSISH 1 /* no escaping our roots */
216 #define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */
218 /* read() and write() aren't transparent for socket handles */
219 #ifndef WIN32_NO_SOCKETS
220 # define PERL_SOCK_SYSREAD_IS_RECV
221 # define PERL_SOCK_SYSWRITE_IS_SEND
224 #ifdef WIN32_NO_REGISTRY
225 /* the last _ in WIN32_NO_REGISTRY_M_ is like the _ in aTHX_ */
226 # define WIN32_NO_REGISTRY_M_(x)
228 # define WIN32_NO_REGISTRY_M_(x) x,
231 #define ENV_IS_CASELESS
233 #define PIPESOCK_MODE "b" /* pipes, sockets default to binmode */
235 /* access() mode bits */
248 #define PERL_GET_CONTEXT_DEFINED
250 /* Compiler-specific stuff. */
252 /* VC uses non-standard way to determine the size and alignment if bit-fields */
253 /* MinGW will compile with -mms-bitfields, so should use the same types */
254 #define PERL_BITFIELD8 U8
255 #define PERL_BITFIELD16 U16
256 #define PERL_BITFIELD32 U32
258 #ifdef _MSC_VER /* Microsoft Visual C++ */
262 typedef unsigned short mode_t;
265 #define isnan _isnan /* Defined already in VC++ 12.0 */
267 #define snprintf _snprintf
268 #define vsnprintf _vsnprintf
270 /* on VS2003, msvcrt.lib is missing these symbols */
271 #if _MSC_VER >= 1300 && _MSC_VER < 1400
272 # pragma intrinsic(_rotl64,_rotr64)
275 MSVC_DIAG_IGNORE(4756 4056)
277 double S_Infinity() {
278 /* this is a real C literal which can get further constant folded
279 unlike using HUGE_VAL/_HUGE which are data symbol imports from the CRT
280 and therefore can not by folded by VC, an example of constant
281 folding INF is creating -INF */
282 return (DBL_MAX+DBL_MAX);
286 #define NV_INF S_Infinity()
288 /* selectany allows duplicate and unused data symbols to be removed by
289 VC linker, if this were static, each translation unit will have its own,
290 usually unused __PL_nan_u, if this were plain extern it will cause link
291 to fail due to multiple definitions, since we dont know if we are being
292 compiled as static or DLL XS, selectany simply always works, the cost of
293 importing __PL_nan_u across DLL boundaries in size in the importing DLL
294 will be more than the 8 bytes it will take up being in each XS DLL if
295 that DLL actually uses __PL_nan_u */
296 extern const __declspec(selectany) union { unsigned __int64 __q; double __d; }
297 __PL_nan_u = { 0x7FF8000000000000UI64 };
298 #define NV_NAN ((NV)__PL_nan_u.__d)
300 /* The CRT was rewritten in VS2015. */
303 /* No longer declared in stdio.h */
304 EXTERN_C char *gets(char* buffer);
306 #define tzname _tzname
308 /* From corecrt_internal_stdio.h: */
324 CRITICAL_SECTION _lock;
325 } __crt_stdio_stream_data;
327 #define PERLIO_FILE_flag_RD 0x0001 /* _IOREAD */
328 #define PERLIO_FILE_flag_WR 0x0002 /* _IOWRITE */
329 #define PERLIO_FILE_flag_RW 0x0004 /* _IOUPDATE */
330 #define PERLIO_FILE_ptr(f) (((__crt_stdio_stream_data*)(f))->_ptr)
331 #define PERLIO_FILE_base(f) (((__crt_stdio_stream_data*)(f))->_base)
332 #define PERLIO_FILE_cnt(f) (((__crt_stdio_stream_data*)(f))->_cnt)
333 #define PERLIO_FILE_flag(f) ((int)(((__crt_stdio_stream_data*)(f))->_flags))
334 #define PERLIO_FILE_file(f) (*(int*)(&((__crt_stdio_stream_data*)(f))->_file))
338 #endif /* _MSC_VER */
340 #if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
342 /* Note: PERLIO_FILE_ptr/base/cnt are not actually used for GCC or <VS2015
343 * since FILE_ptr/base/cnt do the same thing anyway but it doesn't hurt to
344 * define them all here for completeness. */
345 #define PERLIO_FILE_flag_RD _IOREAD /* 0x001 */
346 #define PERLIO_FILE_flag_WR _IOWRT /* 0x002 */
347 #define PERLIO_FILE_flag_RW _IORW /* 0x080 */
348 #define PERLIO_FILE_ptr(f) ((f)->_ptr)
349 #define PERLIO_FILE_base(f) ((f)->_base)
350 #define PERLIO_FILE_cnt(f) ((f)->_cnt)
351 #define PERLIO_FILE_flag(f) ((f)->_flag)
352 #define PERLIO_FILE_file(f) ((f)->_file)
356 #ifdef __MINGW32__ /* Minimal Gnu-Win32 */
361 #define _environ environ
363 #define flushall _flushall
364 #define fcloseall _fcloseall
366 #define isnan _isnan /* ...same libraries as MSVC */
370 # define _O_NOINHERIT 0x0080
371 # ifndef _NO_OLDNAMES
372 # define O_NOINHERIT _O_NOINHERIT
376 /* <stdint.h>, pulled in by <io.h> as of mingw-runtime-3.3, typedef's
377 * (u)intptr_t but doesn't set the _(U)INTPTR_T_DEFINED defines */
379 # ifndef _INTPTR_T_DEFINED
380 # define _INTPTR_T_DEFINED
382 # ifndef _UINTPTR_T_DEFINED
383 # define _UINTPTR_T_DEFINED
388 # define CP_UTF8 65001
391 #endif /* __MINGW32__ */
393 #ifndef _INTPTR_T_DEFINED
394 typedef int intptr_t;
395 # define _INTPTR_T_DEFINED
398 #ifndef _UINTPTR_T_DEFINED
399 typedef unsigned int uintptr_t;
400 # define _UINTPTR_T_DEFINED
405 /* For UNIX compatibility. */
408 extern uid_t getuid(void);
409 extern gid_t getgid(void);
410 extern uid_t geteuid(void);
411 extern gid_t getegid(void);
412 extern int setuid(uid_t uid);
413 extern int setgid(gid_t gid);
414 extern int kill(int pid, int sig);
415 #ifndef USE_PERL_SBRK
416 extern void *sbrk(ptrdiff_t need);
417 # define HAS_SBRK_PROTO
419 extern char * getlogin(void);
420 extern int chown(const char *p, uid_t o, gid_t g);
421 #if !defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 4
422 extern int mkstemp(const char *path);
427 #define Stat win32_stat
429 #undef init_os_extras
430 #define init_os_extras Perl_init_os_extras
432 DllExport void Perl_win32_init(int *argcp, char ***argvp);
433 DllExport void Perl_win32_term(void);
434 DllExport void Perl_init_os_extras(void);
435 DllExport void win32_str_os_error(void *sv, DWORD err);
436 DllExport int RunPerl(int argc, char **argv, char **env);
443 * the following correspond to the fields of the same name
444 * in the STARTUPINFO structure. Embedders can use these to
445 * control the spawning process' look.
446 * Example - to hide the window of the spawned process:
447 * dwFlags = STARTF_USESHOWWINDOW;
448 * wShowWindow = SW_HIDE;
457 DWORD dwFillAttribute;
461 DllExport void win32_get_child_IO(child_IO_table* ptr);
462 DllExport HWND win32_create_message_window(void);
463 DllExport int win32_async_check(pTHX);
465 extern int my_fclose(FILE *);
466 extern char * win32_get_privlib(WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len);
467 extern char * win32_get_sitelib(const char *pl, STRLEN *const len);
468 extern char * win32_get_vendorlib(const char *pl, STRLEN *const len);
470 #ifdef PERL_IMPLICIT_SYS
471 extern void win32_delete_internal_host(void *h);
474 extern int win32_get_errno(int err);
476 extern const char * const staticlinkmodules[];
480 typedef char * caddr_t; /* In malloc.c (core address). */
483 * handle socket stuff, assuming socket is always available
485 #include <sys/socket.h>
489 #define EMBEDMYMALLOC /**/
490 /* #define USE_PERL_SBRK / **/
491 /* #define PERL_SBRK_VIA_MALLOC / **/
494 #ifdef PERL_TEXTMODE_SCRIPTS
495 # define PERL_SCRIPT_MODE "r"
497 # define PERL_SCRIPT_MODE "rb"
501 * Now Win32 specific per-thread data stuff
504 /* Leave the first couple ids after WM_USER unused because they
505 * might be used by an embedding application, and on Windows
506 * version before 2000 we might end up eating those messages
507 * if they were not meant for us.
509 #define WM_USER_MIN (WM_USER+30)
510 #define WM_USER_MESSAGE (WM_USER_MIN)
511 #define WM_USER_KILL (WM_USER_MIN+1)
512 #define WM_USER_MAX (WM_USER_MIN+1)
514 struct thread_intern {
515 /* XXX can probably use one buffer instead of several */
516 char Wstrerror_buffer[512];
517 struct servent Wservent;
518 char Wgetlogin_buffer[128];
520 char Wcrypt_buffer[30];
521 # ifdef USE_RTL_THREAD_API
522 void * retv; /* slot for thread return value */
524 BOOL Wuse_showwindow;
528 #define HAVE_INTERP_INTERN
531 DWORD pids[MAXIMUM_WAIT_OBJECTS];
532 HANDLE handles[MAXIMUM_WAIT_OBJECTS];
538 DWORD pids[MAXIMUM_WAIT_OBJECTS];
539 HANDLE handles[MAXIMUM_WAIT_OBJECTS];
540 HWND message_hwnds[MAXIMUM_WAIT_OBJECTS];
541 char sigterm[MAXIMUM_WAIT_OBJECTS];
546 typedef Signal_t (*Sighandler_t) (int);
547 #define Sighandler_t Sighandler_t
550 struct interp_intern {
551 char * perlshell_tokens;
552 char ** perlshell_vec;
553 long perlshell_items;
555 child_tab * children;
558 pseudo_child_tab * pseudo_children;
560 void * internal_host;
561 struct thread_intern thr_intern;
565 Sighandler_t sigtable[SIG_SIZE];
568 #define WIN32_POLL_INTERVAL 32768
569 #define PERL_ASYNC_CHECK() if (w32_do_async || PL_sig_pending) win32_async_check(aTHX)
571 #define w32_perlshell_tokens (PL_sys_intern.perlshell_tokens)
572 #define w32_perlshell_vec (PL_sys_intern.perlshell_vec)
573 #define w32_perlshell_items (PL_sys_intern.perlshell_items)
574 #define w32_fdpid (PL_sys_intern.fdpid)
575 #define w32_children (PL_sys_intern.children)
576 #define w32_num_children (w32_children->num)
577 #define w32_child_pids (w32_children->pids)
578 #define w32_child_handles (w32_children->handles)
579 #define w32_pseudo_id (PL_sys_intern.pseudo_id)
580 #define w32_pseudo_children (PL_sys_intern.pseudo_children)
581 #define w32_num_pseudo_children (w32_pseudo_children->num)
582 #define w32_pseudo_child_pids (w32_pseudo_children->pids)
583 #define w32_pseudo_child_handles (w32_pseudo_children->handles)
584 #define w32_pseudo_child_message_hwnds (w32_pseudo_children->message_hwnds)
585 #define w32_pseudo_child_sigterm (w32_pseudo_children->sigterm)
586 #define w32_internal_host (PL_sys_intern.internal_host)
587 #define w32_timerid (PL_sys_intern.timerid)
588 #define w32_message_hwnd (PL_sys_intern.message_hwnd)
589 #define w32_sighandler (PL_sys_intern.sigtable)
590 #define w32_poll_count (PL_sys_intern.poll_count)
591 #define w32_do_async (w32_poll_count++ > WIN32_POLL_INTERVAL)
592 #define w32_strerror_buffer (PL_sys_intern.thr_intern.Wstrerror_buffer)
593 #define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer)
594 #define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer)
595 #define w32_servent (PL_sys_intern.thr_intern.Wservent)
596 #define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype)
597 #define w32_use_showwindow (PL_sys_intern.thr_intern.Wuse_showwindow)
598 #define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow)
601 void win32_wait_for_children(pTHX);
602 # define PERL_WAIT_FOR_CHILDREN win32_wait_for_children(aTHX)
605 /* The following ioinfo struct manipulations had been removed but were
606 * reinstated to fix RT#120091/118059. However, they do not work with
607 * the rewritten CRT in VS2015 so they are removed once again for VS2015
608 * onwards, which will therefore suffer from the reintroduction of the
609 * close socket bug. */
610 #if (!defined(_MSC_VER)) || (defined(_MSC_VER) && _MSC_VER < 1900)
614 /* C doesn't like repeat struct definitions */
615 #if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
619 # define _CRTIMP __declspec(dllimport)
623 /* VS2005 has multiple ioinfo struct definitions through VS2005's release life
624 * VS2008-2012 have been stable but do not assume future VSs will have the
625 * same ioinfo struct, just because past struct stability. If research is done
626 * on the CRTs of future VSs, the version check can be bumped up so the newer
627 * VS uses a fixed ioinfo size. (Actually, only VS2013 (_MSC_VER 1800) hasn't
628 * been looked at; after that we cannot use the ioinfo struct anyway (see the
631 #if ! (_MSC_VER < 1400 || (_MSC_VER >= 1500 && _MSC_VER <= 1700) \
632 || defined(__MINGW32__))
633 /* size of ioinfo struct is determined at runtime */
634 # define WIN32_DYN_IOINFO_SIZE
637 #ifndef WIN32_DYN_IOINFO_SIZE
639 * Control structure for lowio file handles
642 intptr_t osfhnd;/* underlying OS file HANDLE */
643 char osfile; /* attributes of file (e.g., open in text mode?) */
644 char pipech; /* one char buffer for handles opened on pipes */
646 CRITICAL_SECTION lock;
647 /* this struct definition breaks ABI compatibility with
648 * not using, cl.exe's native VS version specitfic CRT. */
649 # if _MSC_VER >= 1400 && _MSC_VER < 1500
650 # error "This ioinfo struct is incomplete for Visual C 2005"
652 /* VS2005 CRT has at least 3 different definitions of this struct based on the
653 * CRT DLL's build number. */
654 # if _MSC_VER >= 1500
655 # ifndef _SAFECRT_IMPL
656 /* Not used in the safecrt downlevel. We do not define them, so we cannot
657 * use them accidentally */
658 char textmode : 7;/* __IOINFO_TM_ANSI or __IOINFO_TM_UTF8 or __IOINFO_TM_UTF16LE */
659 char unicode : 1; /* Was the file opened as unicode? */
660 char pipech2[2]; /* 2 more peak ahead chars for UNICODE mode */
661 __int64 startpos; /* File position that matches buffer start */
662 BOOL utf8translations; /* Buffer contains translations other than CRLF*/
663 char dbcsBuffer; /* Buffer for the lead byte of dbcs when converting from dbcs to unicode */
664 BOOL dbcsBufferUsed; /* Bool for the lead byte buffer is used or not */
669 typedef intptr_t ioinfo;
673 * Array of arrays of control structures for lowio files.
675 EXTERN_C _CRTIMP ioinfo* __pioinfo[];
678 * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
679 * array of ioinfo structs.
684 * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
686 #define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
689 * Access macros for getting at an ioinfo struct and its fields from a
692 #ifdef WIN32_DYN_IOINFO_SIZE
693 # define _pioinfo(i) ((intptr_t *) \
694 (((Size_t)__pioinfo[(i) >> IOINFO_L2E])/* * to head of array ioinfo [] */\
695 /* offset to the head of a particular ioinfo struct */ \
696 + (((i) & (IOINFO_ARRAY_ELTS - 1)) * w32_ioinfo_size)) \
698 /* first slice of ioinfo is always the OS handle */
699 # define _osfhnd(i) (*(_pioinfo(i)))
701 # define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
702 # define _osfhnd(i) (_pioinfo(i)->osfhnd)
705 /* since we are not doing a dup2(), this works fine */
706 #define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
708 #endif /* PERL_CORE */
710 #endif /* !defined(_MSC_VER) || _MSC_VER<1900 */
712 /* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
713 #if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
714 #undef PERLIO_NOT_STDIO
716 #define PERLIO_NOT_STDIO 0
718 #define EXEC_ARGV_CAST(x) ((const char *const *) x)
720 DllExport void *win32_signal_context(void);
721 #define PERL_GET_SIG_CONTEXT win32_signal_context()
723 #define Win_GetModuleHandle GetModuleHandle
724 #define Win_GetProcAddress GetProcAddress
725 #define Win_GetModuleFileName GetModuleFileName
726 #define Win_CreateSemaphore CreateSemaphore
728 #if defined(PERL_CORE) && !defined(O_ACCMODE)
729 # define O_ACCMODE (O_RDWR | O_WRONLY | O_RDONLY)
732 /* ucrt at least seems to allocate a whole bit per type,
733 just mask off one bit from the mask for our symlink
736 #define _S_IFLNK ((unsigned)(_S_IFMT ^ (_S_IFMT & -_S_IFMT)))
738 #define S_ISLNK(mode) (((mode) & _S_IFMT) == _S_IFLNK)
742 The default CRT struct stat uses unsigned short for st_dev and st_ino
743 which obviously isn't enough, so we define our own structure.
748 typedef unsigned __int64 Ino_t;
753 unsigned short st_mode;
764 #endif /* _INC_WIN32_PERL5 */