1850e2753Smillert /* Win32CORE.c
2850e2753Smillert *
3850e2753Smillert * Copyright (C) 2007 by Larry Wall and others
4850e2753Smillert *
5850e2753Smillert * You may distribute under the terms of either the GNU General Public
6850e2753Smillert * License or the Artistic License, as specified in the README file.
7850e2753Smillert *
8850e2753Smillert */
9850e2753Smillert
10850e2753Smillert #define WIN32_LEAN_AND_MEAN
11850e2753Smillert #include <windows.h>
12850e2753Smillert
1343003dfeSmillert #if defined(__CYGWIN__) && !defined(USEIMPORTLIB)
1443003dfeSmillert #undef WIN32
1543003dfeSmillert #endif
1691f110e0Safresh1 #define PERL_NO_GET_CONTEXT
17850e2753Smillert #include "EXTERN.h"
1843003dfeSmillert #if defined(__CYGWIN__) && !defined(USEIMPORTLIB)
1943003dfeSmillert #define EXTCONST extern const
2043003dfeSmillert #endif
21850e2753Smillert #include "perl.h"
22850e2753Smillert #include "XSUB.h"
23850e2753Smillert
2491f110e0Safresh1
XS(w32_CORE_all)2591f110e0Safresh1 XS(w32_CORE_all){
266fb12b70Safresh1 /* I'd use dSAVE_ERRNO() here, but it doesn't save the Win32 error code
276fb12b70Safresh1 * under cygwin, if that changes this code should change to use that.
286fb12b70Safresh1 */
296fb12b70Safresh1 int saved_errno = errno;
30850e2753Smillert DWORD err = GetLastError();
3191f110e0Safresh1 /* capture the XSANY value before Perl_load_module, the CV's any member will
3291f110e0Safresh1 * be overwritten by Perl_load_module and subsequent newXSes or pure perl
3391f110e0Safresh1 * subs
3491f110e0Safresh1 */
3591f110e0Safresh1 const char *function = (const char *) XSANY.any_ptr;
36b8851fccSafresh1 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT, newSVpvs("Win32"), newSVnv(0.27));
37850e2753Smillert SetLastError(err);
386fb12b70Safresh1 errno = saved_errno;
396fb12b70Safresh1 /* mark and SP from caller are passed through unchanged */
40850e2753Smillert call_pv(function, GIMME_V);
41850e2753Smillert }
42850e2753Smillert
43*b46d8ef2Safresh1 #ifdef __cplusplus
44*b46d8ef2Safresh1 extern "C"
45*b46d8ef2Safresh1 #endif
XS_EXTERNAL(boot_Win32CORE)46898184e3Ssthen XS_EXTERNAL(boot_Win32CORE)
47850e2753Smillert {
48850e2753Smillert /* This function only exists because writemain.SH, lib/ExtUtils/Embed.pm
49850e2753Smillert * and win32/buildext.pl will all generate references to it. The function
50850e2753Smillert * should never be called though, as Win32CORE.pm doesn't use DynaLoader.
51850e2753Smillert */
52b8851fccSafresh1 PERL_UNUSED_ARG(cv);
53850e2753Smillert }
54b8851fccSafresh1
55b8851fccSafresh1 EXTERN_C
566fb12b70Safresh1 #if !defined(__CYGWIN__) || defined(USEIMPORTLIB)
57850e2753Smillert __declspec(dllexport)
58850e2753Smillert #endif
59850e2753Smillert void
init_Win32CORE(pTHX)60850e2753Smillert init_Win32CORE(pTHX)
61850e2753Smillert {
62850e2753Smillert /* This function is called from init_os_extras(). The Perl interpreter
63850e2753Smillert * is not yet fully initialized, so don't do anything fancy in here.
64850e2753Smillert */
65850e2753Smillert
6691f110e0Safresh1 static const struct {
6791f110e0Safresh1 char Win32__GetCwd [sizeof("Win32::GetCwd")];
6891f110e0Safresh1 char Win32__SetCwd [sizeof("Win32::SetCwd")];
6991f110e0Safresh1 char Win32__GetNextAvailDrive [sizeof("Win32::GetNextAvailDrive")];
7091f110e0Safresh1 char Win32__GetLastError [sizeof("Win32::GetLastError")];
7191f110e0Safresh1 char Win32__SetLastError [sizeof("Win32::SetLastError")];
7291f110e0Safresh1 char Win32__LoginName [sizeof("Win32::LoginName")];
7391f110e0Safresh1 char Win32__NodeName [sizeof("Win32::NodeName")];
7491f110e0Safresh1 char Win32__DomainName [sizeof("Win32::DomainName")];
7591f110e0Safresh1 char Win32__FsType [sizeof("Win32::FsType")];
7691f110e0Safresh1 char Win32__GetOSVersion [sizeof("Win32::GetOSVersion")];
7791f110e0Safresh1 char Win32__IsWinNT [sizeof("Win32::IsWinNT")];
7891f110e0Safresh1 char Win32__IsWin95 [sizeof("Win32::IsWin95")];
7991f110e0Safresh1 char Win32__FormatMessage [sizeof("Win32::FormatMessage")];
8091f110e0Safresh1 char Win32__Spawn [sizeof("Win32::Spawn")];
8191f110e0Safresh1 char Win32__GetTickCount [sizeof("Win32::GetTickCount")];
8291f110e0Safresh1 char Win32__GetShortPathName [sizeof("Win32::GetShortPathName")];
8391f110e0Safresh1 char Win32__GetFullPathName [sizeof("Win32::GetFullPathName")];
8491f110e0Safresh1 char Win32__GetLongPathName [sizeof("Win32::GetLongPathName")];
8591f110e0Safresh1 char Win32__CopyFile [sizeof("Win32::CopyFile")];
8691f110e0Safresh1 char Win32__Sleep [sizeof("Win32::Sleep")];
8791f110e0Safresh1 } fnname_table = {
8891f110e0Safresh1 "Win32::GetCwd",
8991f110e0Safresh1 "Win32::SetCwd",
9091f110e0Safresh1 "Win32::GetNextAvailDrive",
9191f110e0Safresh1 "Win32::GetLastError",
9291f110e0Safresh1 "Win32::SetLastError",
9391f110e0Safresh1 "Win32::LoginName",
9491f110e0Safresh1 "Win32::NodeName",
9591f110e0Safresh1 "Win32::DomainName",
9691f110e0Safresh1 "Win32::FsType",
9791f110e0Safresh1 "Win32::GetOSVersion",
9891f110e0Safresh1 "Win32::IsWinNT",
9991f110e0Safresh1 "Win32::IsWin95",
10091f110e0Safresh1 "Win32::FormatMessage",
10191f110e0Safresh1 "Win32::Spawn",
10291f110e0Safresh1 "Win32::GetTickCount",
10391f110e0Safresh1 "Win32::GetShortPathName",
10491f110e0Safresh1 "Win32::GetFullPathName",
10591f110e0Safresh1 "Win32::GetLongPathName",
10691f110e0Safresh1 "Win32::CopyFile",
10791f110e0Safresh1 "Win32::Sleep"
10891f110e0Safresh1 };
109850e2753Smillert
11091f110e0Safresh1 static const unsigned char fnname_lens [] = {
11191f110e0Safresh1 sizeof("Win32::GetCwd"),
11291f110e0Safresh1 sizeof("Win32::SetCwd"),
11391f110e0Safresh1 sizeof("Win32::GetNextAvailDrive"),
11491f110e0Safresh1 sizeof("Win32::GetLastError"),
11591f110e0Safresh1 sizeof("Win32::SetLastError"),
11691f110e0Safresh1 sizeof("Win32::LoginName"),
11791f110e0Safresh1 sizeof("Win32::NodeName"),
11891f110e0Safresh1 sizeof("Win32::DomainName"),
11991f110e0Safresh1 sizeof("Win32::FsType"),
12091f110e0Safresh1 sizeof("Win32::GetOSVersion"),
12191f110e0Safresh1 sizeof("Win32::IsWinNT"),
12291f110e0Safresh1 sizeof("Win32::IsWin95"),
12391f110e0Safresh1 sizeof("Win32::FormatMessage"),
12491f110e0Safresh1 sizeof("Win32::Spawn"),
12591f110e0Safresh1 sizeof("Win32::GetTickCount"),
12691f110e0Safresh1 sizeof("Win32::GetShortPathName"),
12791f110e0Safresh1 sizeof("Win32::GetFullPathName"),
12891f110e0Safresh1 sizeof("Win32::GetLongPathName"),
12991f110e0Safresh1 sizeof("Win32::CopyFile"),
13091f110e0Safresh1 sizeof("Win32::Sleep")
13191f110e0Safresh1 };
13291f110e0Safresh1 const unsigned char * len = (const unsigned char *)&fnname_lens;
13391f110e0Safresh1 const char * function = (char *)&fnname_table;
13491f110e0Safresh1 while (function < (char *)&fnname_table + sizeof(fnname_table)) {
13591f110e0Safresh1 const char * const file = __FILE__;
13691f110e0Safresh1 CV * const cv = newXS(function, w32_CORE_all, file);
13791f110e0Safresh1 XSANY.any_ptr = (void *)function;
13891f110e0Safresh1 function += *len++;
13991f110e0Safresh1 }
14091f110e0Safresh1
14191f110e0Safresh1
14291f110e0Safresh1 /* Don't forward Win32::SetChildShowWindow(). It accesses the internal variable
14391f110e0Safresh1 * w32_showwindow in thread_intern and is therefore not implemented in Win32.xs.
14491f110e0Safresh1 */
145850e2753Smillert /* newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file); */
146850e2753Smillert }
147