1 /* 2 * PROJECT: ReactOS API tests 3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+) 4 * PURPOSE: Tests for wscript.exe 5 * COPYRIGHT: Whindmar Saksit (whindsaks@proton.me) 6 */ 7 8 #include <apitest.h> 9 #include <windows.h> 10 #include <shlwapi.h> 11 #include <stdio.h> 12 13 #define MYGUID "{898AC78E-BFC7-41FF-937D-EDD01E666707}" 14 15 static DWORD getregdw(HKEY hKey, LPCSTR sub, LPCSTR name, DWORD *out, DWORD defval) 16 { 17 LRESULT e; 18 DWORD size = sizeof(*out); 19 *out = 0; 20 e = SHGetValueA(hKey, sub, name, NULL, out, &size); 21 if (e) 22 *out = defval; 23 return e; 24 } 25 26 static BOOL makestringfile(LPWSTR path, SIZE_T cchpath, LPCSTR ext, LPCSTR string, const BYTE *map) 27 { 28 UINT cch = GetTempPathW(cchpath, path); 29 UINT16 i = 0; 30 if (!cch || cch > cchpath) 31 return FALSE; 32 while (++i) 33 { 34 HANDLE hFile; 35 if (_snwprintf(path + cch, cchpath - cch, L"~%u.%hs", i, ext ? ext : "tmp") >= cchpath - cch) 36 return FALSE; 37 hFile = CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, 0, NULL); 38 if (hFile != INVALID_HANDLE_VALUE) 39 { 40 BOOL succ = TRUE; 41 for (; *string && succ; ++string) 42 { 43 BYTE ch = *string; 44 DWORD j; 45 for (j = 0; map && map[j + 0]; j += 2) 46 { 47 if (ch == map[j + 0]) 48 ch = map[j + 1]; 49 } 50 succ = WriteFile(hFile, &ch, 1, &j, NULL); 51 } 52 CloseHandle(hFile); 53 return succ; 54 } 55 } 56 return FALSE; 57 } 58 59 static DWORD runscriptfile(LPCWSTR path, LPCWSTR engine) 60 { 61 STARTUPINFOW si; 62 PROCESS_INFORMATION pi; 63 LPCWSTR exe = engine ? engine : L"wscript.exe"; 64 WCHAR cmd[MAX_PATH * 2]; 65 66 if (_snwprintf(cmd, _countof(cmd), L"\"%s\" //nologo \"%s\"", exe, path) >= _countof(cmd)) 67 return ERROR_BUFFER_OVERFLOW; 68 ZeroMemory(&si, sizeof(si)); 69 si.cb = sizeof(si); 70 if (CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 71 { 72 DWORD code = ERROR_INTERNAL_ERROR; 73 WaitForSingleObject(pi.hProcess, INFINITE); 74 GetExitCodeProcess(pi.hProcess, &code); 75 CloseHandle(pi.hProcess); 76 CloseHandle(pi.hThread); 77 return code; 78 } 79 return GetLastError(); 80 } 81 82 static DWORD runscript(LPCSTR ext, LPCSTR script, const BYTE *map) 83 { 84 DWORD code; 85 WCHAR file[MAX_PATH]; 86 if (!makestringfile(file, _countof(file), ext, script, map)) 87 { 88 skip("Unable to create script\n"); 89 return ERROR_FILE_NOT_FOUND; 90 } 91 code = runscriptfile(file, NULL); 92 DeleteFileW(file); 93 return code; 94 } 95 96 static void test_defaultscriptisjs(void) 97 { 98 LPCSTR script = "" 99 "<job>" 100 "<script>" /* No language attribute should default to Javascript */ 101 "var x = 42;" 102 "WScript.Quit(x);" 103 "</script>" 104 "</job>"; 105 106 ok(runscript("wsf", script, NULL) == 42, "Script failed\n"); 107 } 108 109 static void test_simplevb(void) 110 { 111 LPCSTR script = "" 112 "<job>" 113 "<script language=\"VBScript\">" 114 "Dim x\n" 115 "x = 42\n" 116 "WScript.Quit x\n" 117 "</script>" 118 "</job>"; 119 120 ok(runscript("wsf", script, NULL) == 42, "Script failed\n"); 121 } 122 123 static void test_defpackagejob(void) 124 { 125 LPCSTR script = "" 126 "<package>" 127 "<job id=\"PickMePlease\">" 128 "<script language=\"VBScript\">" 129 "WScript.Quit 42" 130 "</script>" 131 "</job>" 132 "<job id=\"DontExecuteMe\">" 133 "<script language=\"VBScript\">" 134 "WScript.Quit 33" 135 "</script>" 136 "</job>" 137 "</package>"; 138 139 ok(runscript("wsf", script, NULL) == 42, "Script failed\n"); 140 } 141 142 static void test_objecttag(void) 143 { 144 DWORD dw; 145 static const BYTE map[] = { '#', '\"', '$', '\\', 0, 0 }; 146 LPCSTR script = "" 147 "<job>" 148 "<object id=#ws1# clsid=#{72C24DD5-D70A-438B-8A42-98424B88AFB8}# />" 149 "<script language=#JScript#>" 150 "var dontcare = ws1.ExpandEnvironmentStrings(#SystemRoot#);" 151 "var p = #HKCU/Software/" MYGUID "#.replace(/$//g,'$$');" 152 "ws2.RegWrite(p, 42, #REG_DWORD#);" 153 "</script>" 154 "<object id=#ws2# progid=#WScript.Shell# />" /* Placing the object tag after the script just for fun */ 155 "</job>"; 156 157 ok(runscript("wsf", script, map) == 0, "Script failed\n"); 158 159 getregdw(HKEY_CURRENT_USER, "Software", MYGUID, &dw, 0); 160 ok(dw == 42, "Value does not match\n"); 161 SHDeleteValueA(HKEY_CURRENT_USER, "Software", MYGUID); 162 } 163 164 START_TEST(wsf) 165 { 166 test_defaultscriptisjs(); 167 test_simplevb(); 168 test_defpackagejob(); 169 test_objecttag(); 170 } 171