7 #define SE_SHUTDOWN_NAMEA "SeShutdownPrivilege"
9 typedef BOOL (WINAPI *PFNSHGetSpecialFolderPath)(HWND, char*, int, BOOL);
10 typedef HRESULT (WINAPI *PFNSHGetFolderPath)(HWND, int, HANDLE, DWORD, LPTSTR);
11 typedef int (__stdcall *PFNDllRegisterServer)(void);
12 typedef int (__stdcall *PFNDllUnregisterServer)(void);
13 #ifndef CSIDL_FLAG_CREATE
14 # define CSIDL_FLAG_CREATE 0x8000
17 static OSVERSIONINFO g_osver = {0, 0, 0, 0, 0, ""};
19 #define ONE_K_BUFSIZE 1024
24 return (g_osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
30 return (g_osver.dwPlatformId == VER_PLATFORM_WIN32_NT);
33 XS(w32_ExpandEnvironmentStrings)
39 croak("usage: Win32::ExpandEnvironmentStrings($String);\n");
41 ExpandEnvironmentStringsA(SvPV_nolen(ST(0)), (char*)buffer, sizeof(buffer));
42 XSRETURN_PV((char*)buffer);
49 BOOL (__stdcall *pfnOpenThreadToken)(HANDLE hThr, DWORD dwDesiredAccess,
50 BOOL bOpenAsSelf, PHANDLE phTok);
51 BOOL (__stdcall *pfnOpenProcessToken)(HANDLE hProc, DWORD dwDesiredAccess,
53 BOOL (__stdcall *pfnGetTokenInformation)(HANDLE hTok,
54 TOKEN_INFORMATION_CLASS TokenInformationClass,
55 LPVOID lpTokInfo, DWORD dwTokInfoLen,
57 BOOL (__stdcall *pfnAllocateAndInitializeSid)(
58 PSID_IDENTIFIER_AUTHORITY pIdAuth,
59 BYTE nSubAuthCount, DWORD dwSubAuth0,
60 DWORD dwSubAuth1, DWORD dwSubAuth2,
61 DWORD dwSubAuth3, DWORD dwSubAuth4,
62 DWORD dwSubAuth5, DWORD dwSubAuth6,
63 DWORD dwSubAuth7, PSID pSid);
64 BOOL (__stdcall *pfnEqualSid)(PSID pSid1, PSID pSid2);
65 PVOID (__stdcall *pfnFreeSid)(PSID pSid);
68 TOKEN_GROUPS *lpTokInfo;
69 SID_IDENTIFIER_AUTHORITY NtAuth = SECURITY_NT_AUTHORITY;
76 croak("usage: Win32::IsAdminUser()");
78 /* There is no concept of "Administrator" user accounts on Win9x systems,
79 so just return true. */
80 memset(&osver, 0, sizeof(OSVERSIONINFO));
81 osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
83 if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
86 hAdvApi32 = LoadLibrary("advapi32.dll");
88 warn("Cannot load advapi32.dll library");
92 pfnOpenThreadToken = (BOOL (__stdcall *)(HANDLE, DWORD, BOOL, PHANDLE))
93 GetProcAddress(hAdvApi32, "OpenThreadToken");
94 pfnOpenProcessToken = (BOOL (__stdcall *)(HANDLE, DWORD, PHANDLE))
95 GetProcAddress(hAdvApi32, "OpenProcessToken");
96 pfnGetTokenInformation = (BOOL (__stdcall *)(HANDLE,
97 TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD))
98 GetProcAddress(hAdvApi32, "GetTokenInformation");
99 pfnAllocateAndInitializeSid = (BOOL (__stdcall *)(
100 PSID_IDENTIFIER_AUTHORITY, BYTE, DWORD, DWORD, DWORD, DWORD, DWORD,
101 DWORD, DWORD, DWORD, PSID))
102 GetProcAddress(hAdvApi32, "AllocateAndInitializeSid");
103 pfnEqualSid = (BOOL (__stdcall *)(PSID, PSID))
104 GetProcAddress(hAdvApi32, "EqualSid");
105 pfnFreeSid = (PVOID (__stdcall *)(PSID))
106 GetProcAddress(hAdvApi32, "FreeSid");
108 if (!(pfnOpenThreadToken && pfnOpenProcessToken &&
109 pfnGetTokenInformation && pfnAllocateAndInitializeSid &&
110 pfnEqualSid && pfnFreeSid))
112 warn("Cannot load functions from advapi32.dll library");
113 FreeLibrary(hAdvApi32);
117 if (!pfnOpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hTok)) {
118 if (!pfnOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hTok)) {
119 warn("Cannot open thread token or process token");
120 FreeLibrary(hAdvApi32);
125 pfnGetTokenInformation(hTok, TokenGroups, NULL, 0, &dwTokInfoLen);
126 if (!New(1, lpTokInfo, dwTokInfoLen, TOKEN_GROUPS)) {
127 warn("Cannot allocate token information structure");
129 FreeLibrary(hAdvApi32);
133 if (!pfnGetTokenInformation(hTok, TokenGroups, lpTokInfo, dwTokInfoLen,
136 warn("Cannot get token information");
139 FreeLibrary(hAdvApi32);
143 if (!pfnAllocateAndInitializeSid(&NtAuth, 2, SECURITY_BUILTIN_DOMAIN_RID,
144 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSid))
146 warn("Cannot allocate administrators' SID");
149 FreeLibrary(hAdvApi32);
154 for (i = 0; i < lpTokInfo->GroupCount; ++i) {
155 if (pfnEqualSid(lpTokInfo->Groups[i].Sid, pAdminSid)) {
161 pfnFreeSid(pAdminSid);
164 FreeLibrary(hAdvApi32);
167 ST(0) = sv_2mortal(newSViv(iRetVal));
171 XS(w32_LookupAccountName)
182 croak("usage: Win32::LookupAccountName($system, $account, $domain, "
183 "$sid, $sidtype);\n");
185 SIDLen = sizeof(SID);
186 DomLen = sizeof(Domain);
188 bResult = LookupAccountNameA(SvPV_nolen(ST(0)), /* System */
189 SvPV_nolen(ST(1)), /* Account name */
190 &SID, /* SID structure */
191 &SIDLen, /* Size of SID buffer */
192 Domain, /* Domain buffer */
193 &DomLen, /* Domain buffer size */
194 &snu); /* SID name type */
196 sv_setpv(ST(2), Domain);
197 sv_setpvn(ST(3), SID, SIDLen);
198 sv_setiv(ST(4), snu);
205 XS(w32_LookupAccountSID)
210 DWORD AcctLen = sizeof(Account);
212 DWORD DomLen = sizeof(Domain);
217 croak("usage: Win32::LookupAccountSID($system, $sid, $account, $domain, $sidtype);\n");
219 sid = SvPV_nolen(ST(1));
220 if (IsValidSid(sid)) {
221 bResult = LookupAccountSidA(SvPV_nolen(ST(0)), /* System */
222 sid, /* SID structure */
223 Account, /* Account name buffer */
224 &AcctLen, /* name buffer length */
225 Domain, /* Domain buffer */
226 &DomLen, /* Domain buffer length */
227 &snu); /* SID name type */
229 sv_setpv(ST(2), Account);
230 sv_setpv(ST(3), Domain);
231 sv_setiv(ST(4), (IV)snu);
238 XS(w32_InitiateSystemShutdown)
241 HANDLE hToken; /* handle to process token */
242 TOKEN_PRIVILEGES tkp; /* pointer to token structure */
244 char *machineName, *message;
247 croak("usage: Win32::InitiateSystemShutdown($machineName, $message, "
248 "$timeOut, $forceClose, $reboot);\n");
250 machineName = SvPV_nolen(ST(0));
252 if (OpenProcessToken(GetCurrentProcess(),
253 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
256 LookupPrivilegeValueA(machineName,
258 &tkp.Privileges[0].Luid);
260 tkp.PrivilegeCount = 1; /* only setting one */
261 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
263 /* Get shutdown privilege for this process. */
264 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
265 (PTOKEN_PRIVILEGES)NULL, 0);
268 message = SvPV_nolen(ST(1));
269 bRet = InitiateSystemShutdownA(machineName, message,
270 SvIV(ST(2)), SvIV(ST(3)), SvIV(ST(4)));
272 /* Disable shutdown privilege. */
273 tkp.Privileges[0].Attributes = 0;
274 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
275 (PTOKEN_PRIVILEGES)NULL, 0);
280 XS(w32_AbortSystemShutdown)
283 HANDLE hToken; /* handle to process token */
284 TOKEN_PRIVILEGES tkp; /* pointer to token structure */
289 croak("usage: Win32::AbortSystemShutdown($machineName);\n");
291 machineName = SvPV_nolen(ST(0));
293 if (OpenProcessToken(GetCurrentProcess(),
294 TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
297 LookupPrivilegeValueA(machineName,
299 &tkp.Privileges[0].Luid);
301 tkp.PrivilegeCount = 1; /* only setting one */
302 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
304 /* Get shutdown privilege for this process. */
305 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
306 (PTOKEN_PRIVILEGES)NULL, 0);
309 bRet = AbortSystemShutdownA(machineName);
311 /* Disable shutdown privilege. */
312 tkp.Privileges[0].Attributes = 0;
313 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
314 (PTOKEN_PRIVILEGES)NULL, 0);
324 char *title = "Perl";
325 DWORD flags = MB_ICONEXCLAMATION;
328 if (items < 1 || items > 3)
329 croak("usage: Win32::MsgBox($message [, $flags [, $title]]);\n");
331 msg = SvPV_nolen(ST(0));
335 title = SvPV_nolen(ST(2));
337 result = MessageBoxA(GetActiveWindow(), msg, title, flags);
347 croak("usage: Win32::LoadLibrary($libname)\n");
348 hHandle = LoadLibraryA(SvPV_nolen(ST(0)));
349 XSRETURN_IV((long)hHandle);
357 croak("usage: Win32::FreeLibrary($handle)\n");
358 if (FreeLibrary(INT2PTR(HINSTANCE, SvIV(ST(0))))) {
364 XS(w32_GetProcAddress)
369 croak("usage: Win32::GetProcAddress($hinstance, $procname)\n");
370 XSRETURN_IV(PTR2IV(GetProcAddress(INT2PTR(HINSTANCE, SvIV(ST(0))), SvPV_nolen(ST(1)))));
373 XS(w32_RegisterServer)
380 croak("usage: Win32::RegisterServer($libname)\n");
382 hnd = LoadLibraryA(SvPV_nolen(ST(0)));
384 PFNDllRegisterServer func;
385 func = (PFNDllRegisterServer)GetProcAddress(hnd, "DllRegisterServer");
386 if (func && func() == 0)
390 ST(0) = boolSV(result);
394 XS(w32_UnregisterServer)
401 croak("usage: Win32::UnregisterServer($libname)\n");
403 hnd = LoadLibraryA(SvPV_nolen(ST(0)));
405 PFNDllUnregisterServer func;
406 func = (PFNDllUnregisterServer)GetProcAddress(hnd, "DllUnregisterServer");
407 if (func && func() == 0)
411 ST(0) = boolSV(result);
415 /* XXX rather bogus */
419 XSRETURN_PV(getenv("PROCESSOR_ARCHITECTURE"));
427 Zero(&sysinfo,1,SYSTEM_INFO);
428 GetSystemInfo(&sysinfo);
429 /* XXX docs say dwProcessorType is deprecated on NT */
430 XSRETURN_IV(sysinfo.dwProcessorType);
437 char szGUID[50] = {'\0'};
438 HRESULT hr = CoCreateGuid(&guid);
441 LPOLESTR pStr = NULL;
442 if (SUCCEEDED(StringFromCLSID(&guid, &pStr))) {
443 WideCharToMultiByte(CP_ACP, 0, pStr, wcslen(pStr), szGUID,
444 sizeof(szGUID), NULL, NULL);
452 XS(w32_GetFolderPath)
455 char path[MAX_PATH+1];
460 if (items != 1 && items != 2)
461 croak("usage: Win32::GetFolderPath($csidl [, $create])\n");
463 folder = SvIV(ST(0));
465 create = SvTRUE(ST(1)) ? CSIDL_FLAG_CREATE : 0;
467 module = LoadLibrary("shfolder.dll");
469 PFNSHGetFolderPath pfn;
470 pfn = (PFNSHGetFolderPath)GetProcAddress(module, "SHGetFolderPathA");
471 if (pfn && SUCCEEDED(pfn(NULL, folder|create, NULL, 0, path))) {
478 module = LoadLibrary("shell32.dll");
480 PFNSHGetSpecialFolderPath pfn;
481 pfn = (PFNSHGetSpecialFolderPath)
482 GetProcAddress(module, "SHGetSpecialFolderPathA");
483 if (pfn && pfn(NULL, path, folder, !!create)) {
492 XS(w32_GetFileVersion)
501 croak("usage: Win32::GetFileVersion($filename)\n");
503 filename = SvPV_nolen(ST(0));
504 size = GetFileVersionInfoSize(filename, &handle);
508 New(0, data, size, char);
512 if (GetFileVersionInfo(filename, handle, size, data)) {
513 VS_FIXEDFILEINFO *info;
515 if (VerQueryValue(data, "\\", (void**)&info, &len)) {
516 int dwValueMS1 = (info->dwFileVersionMS>>16);
517 int dwValueMS2 = (info->dwFileVersionMS&0xffff);
518 int dwValueLS1 = (info->dwFileVersionLS>>16);
519 int dwValueLS2 = (info->dwFileVersionLS&0xffff);
521 if (GIMME_V == G_ARRAY) {
523 XST_mIV(0, dwValueMS1);
524 XST_mIV(1, dwValueMS2);
525 XST_mIV(2, dwValueLS1);
526 XST_mIV(3, dwValueLS2);
531 sprintf(version, "%d.%d.%d.%d", dwValueMS1, dwValueMS2, dwValueLS1, dwValueLS2);
548 XS(w32_SetChildShowWindow)
551 BOOL use_showwindow = w32_use_showwindow;
552 /* use "unsigned short" because Perl has redefined "WORD" */
553 unsigned short showwindow = w32_showwindow;
556 Perl_croak(aTHX_ "usage: Win32::SetChildShowWindow($showwindow)");
558 if (items == 0 || !SvOK(ST(0)))
559 w32_use_showwindow = FALSE;
561 w32_use_showwindow = TRUE;
562 w32_showwindow = (unsigned short)SvIV(ST(0));
567 ST(0) = sv_2mortal(newSViv(showwindow));
569 ST(0) = &PL_sv_undef;
577 /* Make the host for current directory */
578 char* ptr = PerlEnv_get_childdir();
581 * then it worked, set PV valid,
582 * else return 'undef'
585 SV *sv = sv_newmortal();
587 PerlEnv_free_childdir(ptr);
589 #ifndef INCOMPLETE_TAINTS
606 Perl_croak(aTHX_ "usage: Win32::SetCurrentDirectory($cwd)");
607 if (!PerlDir_chdir(SvPV_nolen(ST(0))))
614 XS(w32_GetNextAvailDrive)
618 char root[] = "_:\\";
623 if (GetDriveType(root) == 1) {
636 XSRETURN_IV(GetLastError());
644 Perl_croak(aTHX_ "usage: Win32::SetLastError($error)");
645 SetLastError(SvIV(ST(0)));
653 char *name = w32_getlogin_buffer;
654 DWORD size = sizeof(w32_getlogin_buffer);
656 if (GetUserName(name,&size)) {
657 /* size includes NULL */
658 ST(0) = sv_2mortal(newSVpvn(name,size-1));
668 char name[MAX_COMPUTERNAME_LENGTH+1];
669 DWORD size = sizeof(name);
671 if (GetComputerName(name,&size)) {
672 /* size does NOT include NULL :-( */
673 ST(0) = sv_2mortal(newSVpvn(name,size));
684 HINSTANCE hNetApi32 = LoadLibrary("netapi32.dll");
685 DWORD (__stdcall *pfnNetApiBufferFree)(LPVOID Buffer);
686 DWORD (__stdcall *pfnNetWkstaGetInfo)(LPWSTR servername, DWORD level,
690 pfnNetApiBufferFree = (DWORD (__stdcall *)(void *))
691 GetProcAddress(hNetApi32, "NetApiBufferFree");
692 pfnNetWkstaGetInfo = (DWORD (__stdcall *)(LPWSTR, DWORD, void *))
693 GetProcAddress(hNetApi32, "NetWkstaGetInfo");
696 if (hNetApi32 && pfnNetWkstaGetInfo && pfnNetApiBufferFree) {
697 /* this way is more reliable, in case user has a local account. */
699 DWORD dnamelen = sizeof(dname);
701 DWORD wki100_platform_id;
702 LPWSTR wki100_computername;
703 LPWSTR wki100_langroup;
704 DWORD wki100_ver_major;
705 DWORD wki100_ver_minor;
707 /* NERR_Success *is* 0*/
708 if (0 == pfnNetWkstaGetInfo(NULL, 100, &pwi)) {
709 if (pwi->wki100_langroup && *(pwi->wki100_langroup)) {
710 WideCharToMultiByte(CP_ACP, 0, pwi->wki100_langroup,
711 -1, (LPSTR)dname, dnamelen, NULL, NULL);
714 WideCharToMultiByte(CP_ACP, 0, pwi->wki100_computername,
715 -1, (LPSTR)dname, dnamelen, NULL, NULL);
717 pfnNetApiBufferFree(pwi);
718 FreeLibrary(hNetApi32);
721 FreeLibrary(hNetApi32);
724 /* Win95 doesn't have NetWksta*(), so do it the old way */
726 DWORD size = sizeof(name);
728 FreeLibrary(hNetApi32);
729 if (GetUserName(name,&size)) {
730 char sid[ONE_K_BUFSIZE];
731 DWORD sidlen = sizeof(sid);
733 DWORD dnamelen = sizeof(dname);
735 if (LookupAccountName(NULL, name, (PSID)&sid, &sidlen,
736 dname, &dnamelen, &snu)) {
737 XSRETURN_PV(dname); /* all that for this */
749 DWORD flags, filecomplen;
750 if (GetVolumeInformation(NULL, NULL, 0, NULL, &filecomplen,
751 &flags, fsname, sizeof(fsname))) {
752 if (GIMME_V == G_ARRAY) {
753 XPUSHs(sv_2mortal(newSVpvn(fsname,strlen(fsname))));
754 XPUSHs(sv_2mortal(newSViv(flags)));
755 XPUSHs(sv_2mortal(newSViv(filecomplen)));
769 /* Use explicit struct definition because wSuiteMask and
770 * wProductType are not defined in the VC++ 6.0 headers.
771 * WORD type has been replaced by unsigned short because
772 * WORD is already used by Perl itself.
775 DWORD dwOSVersionInfoSize;
776 DWORD dwMajorVersion;
777 DWORD dwMinorVersion;
780 CHAR szCSDVersion[128];
781 unsigned short wServicePackMajor;
782 unsigned short wServicePackMinor;
783 unsigned short wSuiteMask;
789 osver.dwOSVersionInfoSize = sizeof(osver);
790 if (!GetVersionExA((OSVERSIONINFOA*)&osver)) {
792 osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
793 if (!GetVersionExA((OSVERSIONINFOA*)&osver)) {
797 if (GIMME_V == G_SCALAR) {
798 XSRETURN_IV(osver.dwPlatformId);
800 XPUSHs(newSVpvn(osver.szCSDVersion, strlen(osver.szCSDVersion)));
802 XPUSHs(newSViv(osver.dwMajorVersion));
803 XPUSHs(newSViv(osver.dwMinorVersion));
804 XPUSHs(newSViv(osver.dwBuildNumber));
805 XPUSHs(newSViv(osver.dwPlatformId));
807 XPUSHs(newSViv(osver.wServicePackMajor));
808 XPUSHs(newSViv(osver.wServicePackMinor));
809 XPUSHs(newSViv(osver.wSuiteMask));
810 XPUSHs(newSViv(osver.wProductType));
820 XSRETURN_IV(IsWinNT());
828 XSRETURN_IV(IsWin95());
832 XS(w32_FormatMessage)
836 char msgbuf[ONE_K_BUFSIZE];
839 Perl_croak(aTHX_ "usage: Win32::FormatMessage($errno)");
841 if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
842 &source, SvIV(ST(0)), 0,
843 msgbuf, sizeof(msgbuf)-1, NULL))
858 PROCESS_INFORMATION stProcInfo;
859 STARTUPINFO stStartInfo;
860 BOOL bSuccess = FALSE;
863 Perl_croak(aTHX_ "usage: Win32::Spawn($cmdName, $args, $PID)");
865 cmd = SvPV_nolen(ST(0));
866 args = SvPV_nolen(ST(1));
868 env = PerlEnv_get_childenv();
869 dir = PerlEnv_get_childdir();
871 memset(&stStartInfo, 0, sizeof(stStartInfo)); /* Clear the block */
872 stStartInfo.cb = sizeof(stStartInfo); /* Set the structure size */
873 stStartInfo.dwFlags = STARTF_USESHOWWINDOW; /* Enable wShowWindow control */
874 stStartInfo.wShowWindow = SW_SHOWMINNOACTIVE; /* Start min (normal) */
877 cmd, /* Image path */
878 args, /* Arguments for command line */
879 NULL, /* Default process security */
880 NULL, /* Default thread security */
881 FALSE, /* Must be TRUE to use std handles */
882 NORMAL_PRIORITY_CLASS, /* No special scheduling */
883 env, /* Inherit our environment block */
884 dir, /* Inherit our currrent directory */
885 &stStartInfo, /* -> Startup info */
886 &stProcInfo)) /* <- Process info (if OK) */
888 int pid = (int)stProcInfo.dwProcessId;
889 if (IsWin95() && pid < 0)
891 sv_setiv(ST(2), pid);
892 CloseHandle(stProcInfo.hThread);/* library source code does this. */
895 PerlEnv_free_childenv(env);
896 PerlEnv_free_childdir(dir);
897 XSRETURN_IV(bSuccess);
904 DWORD msec = GetTickCount();
912 XS(w32_GetShortPathName)
919 Perl_croak(aTHX_ "usage: Win32::GetShortPathName($longPathName)");
921 shortpath = sv_mortalcopy(ST(0));
922 SvUPGRADE(shortpath, SVt_PV);
923 if (!SvPVX(shortpath) || !SvLEN(shortpath))
926 /* src == target is allowed */
928 len = GetShortPathName(SvPVX(shortpath),
931 } while (len >= SvLEN(shortpath) && sv_grow(shortpath,len+1));
933 SvCUR_set(shortpath,len);
934 *SvEND(shortpath) = '\0';
942 XS(w32_GetFullPathName)
953 Perl_croak(aTHX_ "usage: Win32::GetFullPathName($filename)");
956 filename_p = SvPV(filename, filename_len);
957 fullpath = sv_2mortal(newSVpvn(filename_p, filename_len));
958 if (!SvPVX(fullpath) || !SvLEN(fullpath))
962 len = GetFullPathName(SvPVX(filename),
966 } while (len >= SvLEN(fullpath) && sv_grow(fullpath,len+1));
968 if (GIMME_V == G_ARRAY) {
972 len = filepart - SvPVX(fullpath);
979 SvCUR_set(fullpath,len);
980 *SvEND(fullpath) = '\0';
988 XS(w32_GetLongPathName)
992 char tmpbuf[MAX_PATH+1];
997 Perl_croak(aTHX_ "usage: Win32::GetLongPathName($pathname)");
1000 pathstr = SvPV(path,len);
1001 strcpy(tmpbuf, pathstr);
1002 pathstr = win32_longpath(tmpbuf);
1004 ST(0) = sv_2mortal(newSVpvn(pathstr, strlen(pathstr)));
1015 Perl_croak(aTHX_ "usage: Win32::Sleep($milliseconds)");
1025 char szSourceFile[MAX_PATH+1];
1028 Perl_croak(aTHX_ "usage: Win32::CopyFile($from, $to, $overwrite)");
1029 strcpy(szSourceFile, PerlDir_mapA(SvPV_nolen(ST(0))));
1030 bResult = CopyFileA(szSourceFile, PerlDir_mapA(SvPV_nolen(ST(1))), !SvTRUE(ST(2)));
1039 char *file = __FILE__;
1041 if (g_osver.dwOSVersionInfoSize == 0) {
1042 g_osver.dwOSVersionInfoSize = sizeof(g_osver);
1043 GetVersionEx(&g_osver);
1046 newXS("Win32::LookupAccountName", w32_LookupAccountName, file);
1047 newXS("Win32::LookupAccountSID", w32_LookupAccountSID, file);
1048 newXS("Win32::InitiateSystemShutdown", w32_InitiateSystemShutdown, file);
1049 newXS("Win32::AbortSystemShutdown", w32_AbortSystemShutdown, file);
1050 newXS("Win32::ExpandEnvironmentStrings", w32_ExpandEnvironmentStrings, file);
1051 newXS("Win32::MsgBox", w32_MsgBox, file);
1052 newXS("Win32::LoadLibrary", w32_LoadLibrary, file);
1053 newXS("Win32::FreeLibrary", w32_FreeLibrary, file);
1054 newXS("Win32::GetProcAddress", w32_GetProcAddress, file);
1055 newXS("Win32::RegisterServer", w32_RegisterServer, file);
1056 newXS("Win32::UnregisterServer", w32_UnregisterServer, file);
1057 newXS("Win32::GetArchName", w32_GetArchName, file);
1058 newXS("Win32::GetChipName", w32_GetChipName, file);
1059 newXS("Win32::GuidGen", w32_GuidGen, file);
1060 newXS("Win32::GetFolderPath", w32_GetFolderPath, file);
1061 newXS("Win32::IsAdminUser", w32_IsAdminUser, file);
1062 newXS("Win32::GetFileVersion", w32_GetFileVersion, file);
1064 newXS("Win32::GetCwd", w32_GetCwd, file);
1065 newXS("Win32::SetCwd", w32_SetCwd, file);
1066 newXS("Win32::GetNextAvailDrive", w32_GetNextAvailDrive, file);
1067 newXS("Win32::GetLastError", w32_GetLastError, file);
1068 newXS("Win32::SetLastError", w32_SetLastError, file);
1069 newXS("Win32::LoginName", w32_LoginName, file);
1070 newXS("Win32::NodeName", w32_NodeName, file);
1071 newXS("Win32::DomainName", w32_DomainName, file);
1072 newXS("Win32::FsType", w32_FsType, file);
1073 newXS("Win32::GetOSVersion", w32_GetOSVersion, file);
1074 newXS("Win32::IsWinNT", w32_IsWinNT, file);
1075 newXS("Win32::IsWin95", w32_IsWin95, file);
1076 newXS("Win32::FormatMessage", w32_FormatMessage, file);
1077 newXS("Win32::Spawn", w32_Spawn, file);
1078 newXS("Win32::GetTickCount", w32_GetTickCount, file);
1079 newXS("Win32::GetShortPathName", w32_GetShortPathName, file);
1080 newXS("Win32::GetFullPathName", w32_GetFullPathName, file);
1081 newXS("Win32::GetLongPathName", w32_GetLongPathName, file);
1082 newXS("Win32::CopyFile", w32_CopyFile, file);
1083 newXS("Win32::Sleep", w32_Sleep, file);
1084 newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file);