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