49 #define STR_BUFFER 256
50 #define MAX_TIME_DATE 128
53 #define MAX_REGISTRY_KEY_SIZE 256
55 #define MSG_TIMEOUT 5000
56 #if (WINVER >= 0x0500)
57 #define MSG_TIMEOUT_OPTS (SMTO_ABORTIFHUNG|SMTO_NORMAL|SMTO_NOTIMEOUTIFNOTHUNG)
59 #define MSG_TIMEOUT_OPTS (SMTO_ABORTIFHUNG|SMTO_NORMAL)
80 for (; length--; location++)
82 *location = toupper(*location);
90 #define INVALID_ROUTINE 40
91 #define VALID_ROUTINE 0
111 #define CHECKARG(argexpctl, argexpcth) \
112 if ((argc < argexpctl) || (argc > argexpcth)) return HandleArgError(retstr, (argc > argexpcth))
116 #define RETC(retcode) { \
117 retstr->strlength = 1;\
118 if (retcode) retstr->strptr[0] = '1'; else retstr->strptr[0] = '0'; \
119 retstr->strptr[1] = '\0'; \
124 retstr->strlength = 1;\
125 retstr->strptr[0] = '1'; \
126 retstr->strptr[1] = '\0'; \
131 #define RETVAL(retvalue) { \
132 itoa(retvalue, retstr->strptr, 10); \
133 retstr->strlength = strlen(retstr->strptr);\
138 #define RET_HANDLE(retvalue) { \
139 pointer2string(retstr, retvalue); \
149 #define GET_HKEY(argum, ghk) { \
151 if (strstr(argum,"MACHINE")) ghk = HKEY_LOCAL_MACHINE; else \
152 if (strstr(argum,"CLASSES")) ghk = HKEY_CLASSES_ROOT; else \
153 if (strstr(argum,"CURRENT_USER")) ghk = HKEY_CURRENT_USER; else \
154 if (strstr(argum,"USERS")) ghk = HKEY_USERS; else \
155 if (strstr(argum,"PERFORMANCE")) ghk = HKEY_PERFORMANCE_DATA; else \
156 if (strstr(argum,"CURRENT_CONFIG")) ghk = HKEY_CURRENT_CONFIG; else \
157 if (strstr(argum,"DYN_DATA")) ghk = HKEY_DYN_DATA; else \
158 string2pointer(argum, (void **)&ghk); \
162 #define GET_HANDLE(argum, ghk) string2pointer(argum, (void **)&(ghk))
165 #define SET_VARIABLE(varname, data, retc) {\
166 shvb.shvnext = NULL; \
167 shvb.shvname.strptr = varname; \
168 shvb.shvname.strlength = strlen(varname); \
169 shvb.shvnamelen = shvb.shvname.strlength; \
170 shvb.shvvalue.strptr = data; \
171 shvb.shvvalue.strlength = strlen(data); \
172 shvb.shvvaluelen = strlen(data); \
173 shvb.shvcode = RXSHV_SYSET; \
175 if (RexxVariablePool(&shvb) == RXSHV_BADN) RETC(retc); \
179 #define GET_TYPE_INDEX(type, index) \
183 case EVENTLOG_ERROR_TYPE: \
186 case EVENTLOG_WARNING_TYPE: \
189 case EVENTLOG_INFORMATION_TYPE: \
192 case EVENTLOG_SUCCESS: \
195 case EVENTLOG_AUDIT_SUCCESS: \
198 case EVENTLOG_AUDIT_FAILURE: \
208 return ((value[0] ==
'0') && (toupper(value[1]) ==
'X'));
228 if ( strlen(
string) == 0 )
236 return (
string[1] ==
'x' ?
237 sscanf(
string,
"0x%p", pointer) == 1 : sscanf(
string,
"0X%p", pointer) == 1);
240 return sscanf(
string,
"%p", pointer) == 1;
246 if ( pointer == NULL )
254 sprintf(result->
strptr,
"0x%p", pointer);
266 if (
version_info.dwPlatformId == VER_PLATFORM_WIN32_NT)
return TRUE;
295 if ( pointer == NULL )
297 sprintf(result,
"0");
301 sprintf(result,
"0x%p", pointer);
320 return c->String(buf);
342 if ( hkParent == NULL )
348 hkParent = c->ObjectToStringValue(rxHK);
351 else if ( !
isHex(hkParent) )
353 if ( StrStrI(hkParent,
"MACHINE") ) hk = HKEY_LOCAL_MACHINE;
354 else if ( StrStrI(hkParent,
"CLASSES") ) hk = HKEY_CLASSES_ROOT;
355 else if ( StrStrI(hkParent,
"CURRENT_USER") ) hk = HKEY_CURRENT_USER;
356 else if ( StrStrI(hkParent,
"USERS") ) hk = HKEY_USERS;
357 else if ( StrStrI(hkParent,
"PERFORMANCE") ) hk = HKEY_PERFORMANCE_DATA;
358 else if ( StrStrI(hkParent,
"CURRENT_CONFIG") ) hk = HKEY_CURRENT_CONFIG;
359 else if ( StrStrI(hkParent,
"DYN_DATA") ) hk = HKEY_DYN_DATA;
372 context->SetObjectVariable(
"CURRENT_KEY",
pointer2string(context, HKEY_LOCAL_MACHINE));
378 return context->GetObjectVariable(
"CURRENT_KEY");
383 context->SetObjectVariable(
"CURRENT_KEY", regKeyHandle);
389 return HKEY_LOCAL_MACHINE;
394 return HKEY_CURRENT_USER;
404 return HKEY_CLASSES_ROOT;
409 return HKEY_PERFORMANCE_DATA;
414 return HKEY_CURRENT_CONFIG;
440 if ( strcmp(context->GetMessageName(),
"DELETEKEY") == 0 )
442 return RegDeleteKey(hk, subKeyName);
446 return SHDeleteKey(hk, subKeyName);
483 dwAccess = KEY_ALL_ACCESS;
487 if (StrStrI(access,
"WRITE")) dwAccess |= KEY_WRITE;
488 if (StrStrI(access,
"READ")) dwAccess |= KEY_READ;
489 if (StrStrI(access,
"QUERY")) dwAccess |= KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS;
490 if (StrStrI(access,
"INQUIRE")) dwAccess |= KEY_QUERY_VALUE;
491 if (StrStrI(access,
"ENUMERATE")) dwAccess |= KEY_ENUMERATE_SUB_KEYS;
492 if (StrStrI(access,
"SET")) dwAccess |= KEY_SET_VALUE;
493 if (StrStrI(access,
"DELETE")) dwAccess |= KEY_SET_VALUE;
494 if (StrStrI(access,
"CREATE")) dwAccess |= KEY_CREATE_SUB_KEY;
495 if (StrStrI(access,
"NOTIFY")) dwAccess |= KEY_NOTIFY;
496 if (StrStrI(access,
"EXECUTE")) dwAccess |= KEY_EXECUTE;
497 if (StrStrI(access,
"LINK")) dwAccess |= KEY_CREATE_LINK;
501 HKEY hkResult = NULL;
503 if ( RegOpenKeyEx(hk, subKeyName, 0, dwAccess, &hkResult ) == ERROR_SUCCESS)
506 c->SetObjectVariable(
"CURRENT_KEY", result);
517 if ( strcmp(argv[0].strptr,
"CREATE") == 0 )
522 if (RegCreateKey(hk, argv[2].strptr, &hkResult ) == ERROR_SUCCESS)
531 else if ( strcmp(argv[0].strptr,
"CLOSE") == 0 )
534 if (RegCloseKey(hk) == ERROR_SUCCESS)
543 else if ( strcmp(argv[0].strptr,
"QUERY") == 0 )
546 DWORD retcode, cbClass, cSubKeys, cbMaxSubKeyLen,
547 cbMaxClassLen, cValues, cbMaxValueNameLen, cbMaxValueLen, cbSecurityDescriptor;
548 FILETIME ftLastWriteTime;
555 if ((retcode=RegQueryInfoKey(hk,
565 &cbSecurityDescriptor,
569 if (FileTimeToSystemTime(&ftLastWriteTime, &stTime))
572 sprintf(retstr->
strptr,
"%s, %ld, %ld, %04d/%02d/%02d, %02d:%02d:%02d",
573 Class, cSubKeys, cValues, stTime.wYear, stTime.wMonth, stTime.wDay,
574 stTime.wHour, stTime.wMinute, stTime.wSecond);
578 sprintf(retstr->
strptr,
"%s, %ld, %ld",Class, cSubKeys, cValues);
589 else if ( strcmp(argv[0].strptr,
"LIST") == 0 )
591 DWORD retcode, ndx=0;
599 retcode = RegEnumKey(hk,
603 if (retcode == ERROR_SUCCESS)
605 strcpy(sname, argv[2].strptr);
607 if (sname[argv[2].strlength - 1] !=
'.')
611 sprintf(sname + strlen(sname),
"%d", ndx);
614 else if (retcode != ERROR_NO_MORE_ITEMS)
618 }
while (retcode == ERROR_SUCCESS);
621 else if ( strcmp(argv[0].strptr,
"FLUSH") == 0 )
625 if (RegFlushKey(hk) == ERROR_SUCCESS)
648 if ( strcmp(argv[0].strptr,
"SET") == 0 )
657 if (!strcmp(argv[4].strptr,
"EXPAND")) valType = REG_EXPAND_SZ;
659 if (!strcmp(argv[4].strptr,
"MULTI")) valType = REG_MULTI_SZ;
661 if (!strcmp(argv[4].strptr,
"NUMBER")) valType = REG_DWORD;
663 if (!strcmp(argv[4].strptr,
"BINARY")) valType = REG_BINARY;
665 if (!strcmp(argv[4].strptr,
"LINK")) valType = REG_LINK;
667 if (!strcmp(argv[4].strptr,
"RESOURCELIST")) valType = REG_RESOURCE_LIST;
669 if (!strcmp(argv[4].strptr,
"RESOURCEDESC")) valType = REG_FULL_RESOURCE_DESCRIPTOR;
671 if (!strcmp(argv[4].strptr,
"RESOURCEREQS")) valType = REG_RESOURCE_REQUIREMENTS_LIST;
673 if (!strcmp(argv[4].strptr,
"BIGENDIAN")) valType = REG_DWORD_BIG_ENDIAN;
675 if (!strcmp(argv[4].strptr,
"NONE")) valType = REG_NONE;
679 if ((valType == REG_DWORD) || (valType == REG_DWORD_BIG_ENDIAN))
681 dwNumber = atoi(argv[3].strptr);
683 if (valType == REG_DWORD_BIG_ENDIAN)
688 data = (
const BYTE *) &dwNumber;
689 dataLen =
sizeof(dwNumber);
693 data = (
const BYTE *) argv[3].strptr;
699 case REG_RESOURCE_LIST:
700 case REG_FULL_RESOURCE_DESCRIPTOR:
701 case REG_RESOURCE_REQUIREMENTS_LIST:
702 dataLen = (DWORD)argv[3].strlength;
708 dataLen = (DWORD)argv[3].strlength+1;
713 if (RegSetValueEx(hk, argv[2].strptr, 0, valType, data, dataLen) == ERROR_SUCCESS)
723 else if ( strcmp(argv[0].strptr,
"QUERY") == 0 )
725 DWORD valType, cbData;
726 char * valData, *vType;
728 cbData =
sizeof(valData);
732 if (RegQueryValueEx(hk,
737 &cbData) == ERROR_SUCCESS)
739 valData = (
char *)GlobalAlloc(GPTR, cbData);
746 if (RegQueryValueEx(hk,
751 &cbData) == ERROR_SUCCESS)
755 if ( cbData +
sizeof(
"RESOURCEDESC, ") >
STR_BUFFER )
758 if ( retstr->
strptr == NULL )
768 sprintf(retstr->
strptr,
"%s, ",vType);
769 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
773 sprintf(retstr->
strptr,
"%s, %ld",vType, *(DWORD *)valData);
777 sprintf(retstr->
strptr,
"%s, ",vType);
778 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
782 sprintf(retstr->
strptr,
"%s, ",vType);
783 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
787 sprintf(retstr->
strptr,
"%s, %s",vType, valData);
791 sprintf(retstr->
strptr,
"%s, %s",vType, valData);
793 case REG_RESOURCE_LIST:
794 vType =
"RESOURCELIST";
795 sprintf(retstr->
strptr,
"%s, ",vType);
796 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
798 case REG_FULL_RESOURCE_DESCRIPTOR:
799 vType =
"RESOURCEDESC";
800 sprintf(retstr->
strptr,
"%s, ",vType);
801 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
803 case REG_RESOURCE_REQUIREMENTS_LIST:
804 vType =
"RESOURCEREQS";
805 sprintf(retstr->
strptr,
"%s, ",vType);
806 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
810 sprintf(retstr->
strptr,
"%s, ",vType);
811 memcpy(&retstr->
strptr[strlen(retstr->
strptr)], valData, cbData);
813 case REG_DWORD_BIG_ENDIAN:
817 dwNumber = * (DWORD *)valData;
819 sprintf(retstr->
strptr,
"%s, %ld",vType, dwNumber);
825 sprintf(retstr->
strptr,
"%s,",vType);
827 if ((valType == REG_MULTI_SZ) ||
828 (valType == REG_BINARY) ||
829 (valType == REG_RESOURCE_LIST) ||
830 (valType == REG_FULL_RESOURCE_DESCRIPTOR) ||
831 (valType == REG_RESOURCE_REQUIREMENTS_LIST) ||
832 (valType == REG_NONE))
834 retstr->
strlength = strlen(vType) + 2 + cbData;
853 else if ( strcmp(argv[0].strptr,
"LIST") == 0 )
855 DWORD retcode, ndx=0, valType, cbValue, cbData, initData = 1024;
856 char * valData, *
pTail, Name[256];
861 valData = (
char *)GlobalAlloc(GPTR, initData);
870 strcpy(sname, argv[2].strptr);
881 cbValue =
sizeof(Name);
882 retcode = RegEnumValue(hk,
891 if ((retcode == ERROR_MORE_DATA) && (cbData > initData))
895 valData = (
char *)GlobalAlloc(GPTR, cbData);
898 cbValue =
sizeof(Name);
899 retcode = RegEnumValue(hk,
909 if (retcode == ERROR_SUCCESS)
911 sprintf(
pTail,
"%d.Name", ndx);
914 sprintf(
pTail,
"%d.Type", ndx);
935 case REG_RESOURCE_LIST:
938 case REG_FULL_RESOURCE_DESCRIPTOR:
941 case REG_RESOURCE_REQUIREMENTS_LIST:
947 case REG_DWORD_BIG_ENDIAN:
954 sprintf(
pTail,
"%d.Data", ndx);
955 if ((valType == REG_MULTI_SZ) ||
956 (valType == REG_BINARY) ||
957 (valType == REG_LINK) ||
958 (valType == REG_RESOURCE_LIST) ||
959 (valType == REG_FULL_RESOURCE_DESCRIPTOR) ||
960 (valType == REG_RESOURCE_REQUIREMENTS_LIST) ||
961 (valType == REG_NONE))
965 shvb.
shvname.strlength = strlen(sname);
978 else if ((valType == REG_EXPAND_SZ) || (valType == REG_SZ))
982 else if ((valType == REG_DWORD) || (valType == REG_DWORD_BIG_ENDIAN))
987 dwNumber = *(DWORD *) valData;
988 if (valType == REG_DWORD_BIG_ENDIAN)
992 ltoa(dwNumber, tmp, 10);
1000 else if (retcode != ERROR_NO_MORE_ITEMS)
1002 GlobalFree(valData);
1005 }
while (retcode == ERROR_SUCCESS);
1006 GlobalFree(valData);
1009 else if ( strcmp(argv[0].strptr,
"DELETE") == 0 )
1013 if ((rc = RegDeleteValue(hk, argv[2].strptr)) == ERROR_SUCCESS)
1034 TOKEN_PRIVILEGES tkp;
1038 if ( strcmp(argv[0].strptr,
"CONNECT") == 0 )
1043 if (RegConnectRegistry(argv[2].strptr, hk, &hkResult ) == ERROR_SUCCESS)
1052 else if ( strcmp(argv[0].strptr,
"SAVE") == 0 )
1056 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
1061 LookupPrivilegeValue(NULL, SE_BACKUP_NAME,&tkp.Privileges[0].Luid);
1063 tkp.PrivilegeCount = 1;
1064 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1068 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
1069 (PTOKEN_PRIVILEGES) NULL, 0);
1071 if ((rc = GetLastError()) != ERROR_SUCCESS)
1077 if ((retc = RegSaveKey(hk, argv[2].strptr, NULL)) == ERROR_SUCCESS)
1086 else if ( strcmp(argv[0].strptr,
"LOAD") == 0 || strcmp(argv[0].strptr,
"RESTORE") == 0 ||
1087 strcmp(argv[0].strptr,
"REPLACE") == 0 || strcmp(argv[0].strptr,
"UNLOAD") == 0 )
1091 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
1096 LookupPrivilegeValue(NULL, SE_RESTORE_NAME,&tkp.Privileges[0].Luid);
1098 tkp.PrivilegeCount = 1;
1099 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
1103 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
1105 if ((rc = GetLastError()) != ERROR_SUCCESS)
1110 if ( strcmp(argv[0].strptr,
"UNLOAD") == 0 )
1113 if ((retc = RegUnLoadKey(hk, argv[2].strptr)) == ERROR_SUCCESS)
1122 else if ( strcmp(argv[0].strptr,
"LOAD") == 0 )
1125 if ((retc = RegLoadKey(hk, argv[2].strptr, argv[3].strptr)) == ERROR_SUCCESS)
1134 else if ( strcmp(argv[0].strptr,
"RESTORE") == 0 )
1139 if (!strcmp(argv[3].strptr,
"VOLATILE")) vola = REG_WHOLE_HIVE_VOLATILE;
1142 if ((retc = RegRestoreKey(hk, argv[2].strptr, vola)) == ERROR_SUCCESS)
1151 else if ( strcmp(argv[0].strptr,
"REPLACE") == 0 )
1155 if (!strcmp(argv[2].strptr,
"%NULL%"))
1164 if ((retc = RegReplaceKey(hk, p, argv[3].strptr, argv[4].strptr)) == ERROR_SUCCESS)
1197 DWORD dwDDEInst = 0;
1206 ui = DdeInitialize(&dwDDEInst,
1208 CBF_FAIL_ALLSVRXACTIONS,
1211 if (ui != DMLERR_NO_ERROR)
return FALSE;
1215 hszProgman = DdeCreateStringHandle(dwDDEInst,
1219 hConv = DdeConnect(dwDDEInst,
1225 DdeFreeStringHandle(dwDDEInst, hszProgman);
1227 if (!hConv)
return FALSE;
1230 hExecData = DdeCreateDataHandle(dwDDEInst,
1239 exRes = DdeClientTransaction((LPBYTE)hExecData,
1249 DdeDisconnect(hConv);
1250 DdeUninitialize(dwDDEInst);
1261 if (lpszPath && lstrlen(lpszPath))
1264 "[CreateGroup(%s,%s)]",
1271 "[CreateGroup(%s)]",
1282 if (lpszGroup && lstrlen(lpszGroup))
1285 "[DeleteGroup(%s)]",
1296 if (lpszGroup && lstrlen(lpszGroup))
1299 "[ShowGroup(%s,%u)]",
1309 const char *lpszCaption,
1310 const char *lpszIconPath,
1312 const char *lpszDir,
1314 const char *lpszHotKey,
1315 const char *lpszModifier,
1321 if (bLast) Pos = -1;
else Pos = 0;
1323 if (lpszIconPath && lstrlen(lpszIconPath))
1326 "[AddItem(%s,%s,%s,%u,%d,%d,%s,%d,%d)]",
1333 MAKEWORD( atoi(lpszHotKey), atoi(lpszModifier)),
1339 "[AddItem(%s,%s,"","",%d,%d,%s,%d,%d)]",
1344 MAKEWORD( atoi(lpszHotKey), atoi(lpszModifier)),
1356 if (lpszItem && lstrlen(lpszItem))
1372 "[ExitProgman(%u)]",
1373 bSaveGroups ? 1 : 0);
1395 #define IDS_REGISTRY_KEY_CURRENT_SHELLFOLDER "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
1396 #define IDS_CURRENT_DESKTOP "Desktop"
1406 szDesktopDir[0] =
'\0';
1408 if ( (rc = RegOpenKeyEx(HKEY_CURRENT_USER,
1412 &hKey)) == ERROR_SUCCESS )
1414 if ( (rc = RegQueryValueEx(hKey,
1419 lpcbData)) == ERROR_SUCCESS )
1421 RegCloseKey ( hKey ) ;
1424 RegCloseKey ( hKey ) ;
1447 #define IDS_REGISTRY_KEY_ALL_NT_SHELLFOLDER "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
1448 #define IDS_ALL_NT_DESKTOP "Common Desktop"
1450 #define IDS_REGISTRY_KEY_ALL_9x_SHELLFOLDER ".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
1451 #define IDS_ALL_9x_DESKTOP "Desktop"
1461 LPTSTR lpValueName ;
1463 szDesktopDir[0] =
'\0';
1468 rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
1477 rc = RegOpenKeyEx(HKEY_USERS,
1484 if ( rc == ERROR_SUCCESS )
1486 if ( (rc = RegQueryValueEx(hKey,
1491 lpcbData)) == ERROR_SUCCESS )
1493 RegCloseKey ( hKey ) ;
1496 RegCloseKey ( hKey ) ;
1535 const char *lpszProgram,
1536 const char *lpszIcon,
1538 const char *lpszWorkDir,
1539 const char *lpszLocation,
1540 const char *lpszArguments,
1543 const char *lpszRun )
1548 int iRun = SW_NORMAL;
1553 hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl);
1555 if (SUCCEEDED(hres))
1560 psl->SetPath(lpszProgram );
1563 psl->SetIconLocation(lpszIcon, iIconIndex);
1566 psl->SetArguments(lpszArguments );
1575 psl->SetHotkey(MAKEWORD( iScKey, iScModifier) );
1578 psl->SetWorkingDirectory(lpszWorkDir );
1581 if ( !stricmp(lpszRun,
"MAXIMIZED") )
1583 iRun = SW_SHOWMAXIMIZED;
1585 else if ( !stricmp(lpszRun,
"MINIMIZED") )
1587 iRun = SW_SHOWMINNOACTIVE;
1590 psl->SetShowCmd(iRun );
1594 hres = psl->QueryInterface(IID_IPersistFile, (
void **)&ppf);
1596 if (SUCCEEDED(hres))
1598 WCHAR wsz[MAX_PATH];
1599 CHAR szShortCutName[MAX_PATH];
1600 CHAR szDesktopDir[MAX_PATH];
1601 DWORD dwSize = MAX_PATH;
1604 if (strlen(lpszLocation)>5)
1608 if (!stricmp(lpszLocation,
"PERSONAL"))
1620 sprintf( szShortCutName,
"%s\\%s.lnk", szDesktopDir, lpszName);
1625 sprintf( szShortCutName,
"%s.lnk", lpszName);
1633 MultiByteToWideChar(CP_ACP, 0, szShortCutName, -1, wsz, MAX_PATH);
1636 hres = ppf->Save(wsz, TRUE);
1637 if (!SUCCEEDED(hres))
1684 CHAR szDesktopDir[MAX_PATH];
1685 CHAR szShortCutName[MAX_PATH];
1686 DWORD dwSize = MAX_PATH;
1690 if (!stricmp(lpszLocation,
"PERSONAL"))
1700 sprintf( szShortCutName,
"%s\\%s.lnk", szDesktopDir, lpszName);
1702 if (!DeleteFile(szShortCutName))
1704 return GetLastError();
1716 if (strcmp( argv[0].strptr,
"ADDGROUP") == 0 )
1720 else if ( strcmp(argv[0].strptr,
"DELGROUP") == 0 )
1724 else if ( strcmp(argv[0].strptr,
"SHOWGROUP") == 0 )
1727 if ( strcmp(argv[2].strptr,
"MAX") == 0 )
1731 else if ( strcmp(argv[2].strptr,
"MIN") == 0 )
1742 else if ( strcmp(argv[0].strptr,
"ADDITEM") == 0 )
1747 RETC(!
AddPMItem(argv[1].strptr, argv[2].strptr, argv[3].strptr, (WORD)atoi(argv[4].strptr), argv[5].strptr,\
1748 (BOOL)atoi(argv[6].strptr), argv[7].strptr, argv[8].strptr, (BOOL)atoi(argv[9].strptr)));
1752 RETC(!
AddPMItem(argv[1].strptr, argv[2].strptr, argv[3].strptr, (WORD)atoi(argv[4].strptr), argv[5].strptr,\
1753 (BOOL)atoi(argv[6].strptr),
"",
"", 0));
1757 else if ( strcmp(argv[0].strptr,
"DELITEM") == 0 )
1761 else if (strcmp(argv[0].strptr,
"LEAVE") == 0 )
1763 if ( strcmp(argv[1].strptr,
"SAVE") == 0 )
1772 else if ( strcmp(argv[0].strptr,
"ADDDESKTOPICON") == 0 )
1775 argv[5].strptr, argv[6].strptr, argv[7].strptr, atoi(argv[8].strptr),
1776 atoi(argv[9].strptr), argv[10].strptr ));
1778 else if ( strcmp(argv[0].strptr,
"DELDESKTOPICON") == 0 )
1797 #define WSEL_DEFAULT_EVENTS_ARRAY_SIZE 512
1798 #define WSEL_DEFAULT_SOURCE "Application"
1799 #define HANDLE_ATTRIBUTE "CURRENTHANDLE"
1800 #define RECORDS_ATTRIBUTE "EVENTS"
1801 #define INITCODE_ATTRIBUTE "INITCODE"
1802 #define MIN_READ_BUFFER_ATTRIBUTE "MINIMUMREADBUFFER"
1803 #define MIN_READ_MIN_ATTRIBUTE "MINIMUMREADMIN"
1804 #define MIN_READ_MAX_ATTRIBUTE "MINIMUMREADMAX"
1807 #define MAX_RECORD_SIZE 256 * 1024
1810 #define MAX_READ_KB_COUNT 256
1811 #define MAX_READ_BUFFER MAX_READ_KB_COUNT * 1024
1812 #define MIN_READ_KB_COUNT 16
1813 #define MIN_READ_BUFFER MIN_READ_KB_COUNT * 1024
1815 #define BAD_RECORD_ARRAY_MSG "The events attribute has been altered so it is no longer an array object"
1816 #define BAD_RECORD_START_MSG "Requested start exceeds number of records"
1817 #define TOO_SMALLBUFFER_MSG "An event log record is too large (%u) for the read buffer (%u.)"
1818 #define START_RECORD_OUT_OF_RANGE_MSG "The start record (%u) is out of range; (%u - %u)"
1819 #define END_RECORD_OUT_OF_RANGE_MSG "start and count produce an end record (%u) out of range; (%u - %u)"
1840 char eventLogKey[] =
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\";
1843 DWORD valueType = REG_EXPAND_SZ;
1850 fileBuffer[0] =
'\0';
1853 pKey = (
char *)LocalAlloc(LPTR, strlen(eventLogKey) + strlen(logName) + 1 + strlen(source) + 1);
1854 sprintf(pKey,
"%s%s\\%s", eventLogKey, logName, source);
1856 if ( RegOpenKeyEx(HKEY_LOCAL_MACHINE, pKey, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS )
1859 if ( RegQueryValueEx(hKey, pValueName, NULL, &valueType, NULL, &dataSize) == ERROR_SUCCESS )
1863 valueData = (
char *)LocalAlloc(LPTR, dataSize);
1865 if ( RegQueryValueEx(hKey, pValueName, NULL, &valueType, (LPBYTE)valueData, &dataSize) == ERROR_SUCCESS )
1869 ExpandEnvironmentStrings(valueData, fileBuffer, MAX_PATH);
1871 LocalFree(valueData);
1897 char *pBuffer = NULL;
1902 if ( *files !=
'\0' )
1904 DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ARGUMENT_ARRAY;
1905 DWORD langID = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
1907 pBuffer = (
char *)LocalAlloc(LPTR, strlen(files) + 1);
1908 if ( pBuffer != NULL )
1910 strcpy(pBuffer, files);
1913 while ( pTemp != NULL && count == 0 )
1915 pNext = strchr(pTemp,
';');
1916 if ( pNext != NULL )
1922 h = LoadLibrary(pTemp);
1925 count = FormatMessage(flags, h, msgID, langID, (LPTSTR)lpMsgBuf, 0, ppInserts);
1946 char *pchString = NULL;
1949 HINSTANCE hInstance = NULL;
1950 LPVOID lpMsgBuf = NULL;
1951 char *pSubstitutions[100];
1952 char chMessageFile[MAX_PATH];
1956 memset(pSubstitutions, 0,
sizeof(pSubstitutions));
1959 pchString = (
char*)pEvLogRecord + pEvLogRecord->StringOffset;
1968 for (
int i = 0; i < pEvLogRecord->NumStrings; i++ )
1975 if ( (pchPercent = strstr(pchString,
"%%")) )
1980 (
char *)pEvLogRecord +
sizeof(EVENTLOGRECORD), chMessageFile);
1982 DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS;
1983 DWORD langID = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
1984 int id = atoi(pchPercent + 2);
1988 if ( (hInstance = LoadLibrary(chMessageFile)) != NULL )
1990 if ( FormatMessage(flags, hInstance,
id, langID, (LPTSTR)&pSubstitutions[i], 0, 0) == 0 )
1994 pSubstitutions[i] = (
char *)LocalAlloc(LPTR, 1);
1996 FreeLibrary(hInstance);
2003 pSubstitutions[i] = (
char *)LocalAlloc(LPTR, 1);
2007 iStringLen += (int)strlen(pSubstitutions[i]) + 1;
2013 iStringLen += (int)strlen(pchString) + 1;
2014 pSubstitutions[i] = (
char *)LocalAlloc(LMEM_FIXED, strlen(pchString) + 1);
2015 strcpy(pSubstitutions[i], pchString);
2018 pchString += strlen(pchString) + 1;
2023 (
char *)pEvLogRecord +
sizeof(EVENTLOGRECORD), chMessageFile);
2031 *ppMessage = (
char *)LocalAlloc(LPTR, strlen((
char*)lpMsgBuf) + 1);
2032 strcpy(*ppMessage, (
const char *)lpMsgBuf);
2036 LocalFree(lpMsgBuf);
2042 if ( pEvLogRecord->NumStrings )
2044 *ppMessage = (
char *)LocalAlloc(LPTR, iStringLen + 1);
2046 for (
int i = 0; i < pEvLogRecord->NumStrings; i++ )
2048 strcat(*ppMessage, pSubstitutions[i]);
2049 strcat(*ppMessage,
" ");
2056 *ppMessage = (
char *)LocalAlloc(LPTR, 1);
2061 for (
int i = 0; i < pEvLogRecord->NumStrings; i++ )
2063 LocalFree(pSubstitutions[i]);
2081 char *pUserID = NULL;
2083 char defUserID[] =
"N/A";
2086 SID_NAME_USE strDummy;
2087 char *pDomain = NULL;
2088 DWORD sizeDomain = 0;
2090 if ( pEvLogRecord->UserSidLength == 0 )
2093 pUserID = (
char *)LocalAlloc(LPTR, strlen(defUserID) + 1);
2094 strcpy(pUserID, defUserID);
2099 psid = (SID *)((
char*)pEvLogRecord + pEvLogRecord->UserSidOffset);
2102 LookupAccountSid(NULL, psid, pUserID, &sizeID, pDomain, &sizeDomain, &strDummy);
2104 pUserID = (
char *)LocalAlloc(LPTR, std::max(sizeID, (DWORD)strlen(defUserID) + 1));
2105 pDomain = (
char *)LocalAlloc(LPTR, sizeDomain);
2107 if ( LookupAccountSid(NULL, psid, pUserID, &sizeID, pDomain, &sizeDomain, &strDummy) == 0 )
2110 strcpy(pUserID, defUserID);
2142 if ( pEvLogRecord->DataLength != 0 )
2144 *ppBinData = (
char *)LocalAlloc(LPTR, (pEvLogRecord->DataLength + 1) * 2);
2147 pRecData = (
char*)pEvLogRecord + pEvLogRecord->DataOffset;
2149 for ( DWORD i = 0; i < pEvLogRecord->DataLength; i++ )
2151 _snprintf(pTemp,
sizeof(pTemp),
"%02x", *pRecData);
2152 memcpy(p, pTemp, 2);
2159 *ppBinData = (
char *)LocalAlloc(LPTR, 1);
2162 return (pEvLogRecord->DataLength * 2);
2178 c->ArrayOfFour(c->String(
"positional"), c->WholeNumberToObject(pos), c->String(list), actual));
2234 if ( ! c->ObjectToUnsignedInt32(ptr, &val) )
2259 if ( context->IsArray(ptr) )
2272 context->SendMessage0(records,
"EMPTY");
2312 bool didOpen =
false;
2317 if ( hEventLog == NULL )
2319 if ( server != NULL && strlen(server) == 0 )
2323 if ( source == NULL || strlen(source) == 0 )
2328 hEventLog = OpenEventLog(server, source);
2329 if ( hEventLog == NULL )
2331 *pRC = GetLastError();
2339 *pHandle = hEventLog;
2356 if ( hEventLog != NULL )
2358 rc = (CloseEventLog(hEventLog) == 0) ? GetLastError() : 0;
2390 bool didOpen =
getOpenEventLog(context, server, source, &hEventLog, &number);
2392 if ( hEventLog == NULL )
2401 success = GetNumberOfEventLogRecords(hEventLog, &count);
2404 retNum = -(
int32_t)GetLastError();
2415 success = GetOldestEventLogRecord(hEventLog, &oldest);
2418 retNum = -(
int32_t)GetLastError();
2422 switch ( numberType )
2433 retNum = oldest + count - 1;
2445 CloseEventLog(hEventLog);
2478 *flags = EVENTLOG_FORWARDS_READ;
2481 if ( stricmp(
"FORWARDS", direction) == 0 )
2485 else if ( stricmp(
"BACKWARDS", direction) == 0 )
2487 *flags = EVENTLOG_BACKWARDS_READ;
2509 *flags |= EVENTLOG_SEEK_READ;
2513 *flags |= EVENTLOG_SEQUENTIAL_READ;
2517 if ( GetNumberOfEventLogRecords(hLog, &totalRecords) == 0 )
2519 *rc = GetLastError();
2526 if ( *flags & EVENTLOG_SEEK_READ )
2529 if ( GetOldestEventLogRecord(hLog, &oldestRecord) == 0 )
2531 *rc = GetLastError();
2535 DWORD youngestRecord = oldestRecord + totalRecords - 1;
2538 if ( youngestRecord < start || start < oldestRecord )
2543 context->NewStringFromAsciiz(tmp));
2548 if ( *flags & EVENTLOG_FORWARDS_READ )
2550 endRecord = start + *count - 1;
2554 endRecord = start - *count + 1;
2557 if ( youngestRecord < endRecord || endRecord < oldestRecord )
2562 context->NewStringFromAsciiz(tmp));
2570 *count = totalRecords;
2577 return (
type == EVENTLOG_SUCCESS ||
2578 type == EVENTLOG_AUDIT_FAILURE ||
2579 type == EVENTLOG_AUDIT_SUCCESS ||
2580 type == EVENTLOG_ERROR_TYPE ||
2581 type == EVENTLOG_INFORMATION_TYPE ||
2582 type == EVENTLOG_WARNING_TYPE);
2629 if ( server != NULL && strlen(server) == 0 )
2633 if ( source == NULL || strlen(source) == 0 )
2638 HANDLE hEventLog = OpenEventLog(server, source);
2639 if ( hEventLog == NULL )
2641 return GetLastError();
2723 BOOL isFull = FALSE;
2730 EVENTLOG_FULL_INFORMATION efi;
2732 if ( GetEventLogInformation(hLog, EVENTLOG_FULL_INFO, (
void *)&efi,
sizeof(efi), &needed) != 0 )
2734 isFull = efi.dwFull ? TRUE : FALSE;
2740 CloseEventLog(hLog);
2773 OPTIONAL_CSTRING, backupFile)
2778 bool didOpen =
getOpenEventLog(context, server, source, &hEventLog, &rc);
2780 if ( hEventLog == NULL )
2785 if ( backupFile != NULL && strlen(backupFile) == 0 )
2795 char *pDupeName = NULL;
2796 if ( backupFile != NULL )
2798 pDupeName = (
char *)LocalAlloc(LPTR, MAX_PATH);
2804 strcpy(pDupeName, backupFile);
2805 PathAddExtension(pDupeName,
".evt");
2808 if ( ClearEventLog(hEventLog, pDupeName) == 0 )
2810 rc = GetLastError();
2814 LocalFree(pDupeName);
2818 CloseEventLog(hEventLog);
2850 OPTIONAL_uint16_t, t, OPTIONAL_uint16_t, category, OPTIONAL_uint32_t,
id,
2851 OPTIONAL_RexxStringObject, rawData,
ARGLIST, args)
2858 WORD countStrings = 0;
2859 const char **strings = NULL;
2863 if ( server != NULL && strlen(server) == 0 )
2867 if ( source == NULL || strlen(source) == 0 )
2879 dataSize = (DWORD)context->StringLength(rawData);
2880 data = malloc(dataSize);
2883 memcpy(data, (
void *)context->StringData(rawData), dataSize);
2891 size_t argc = context->ArraySize(args);
2894 strings = (
const char **)malloc((argc - 6) *
sizeof(
const char **));
2895 if ( strings != NULL )
2897 const char **p = strings;
2898 for (
size_t i = 7; i <= argc; i++, countStrings++)
2907 *p++ = context->ObjectToStringValue(obj);
2913 HANDLE hSource = RegisterEventSource(server, source);
2914 if ( hSource != NULL )
2916 if ( ReportEvent(hSource,
type, category,
id, NULL, countStrings, dataSize, strings, data) == 0 )
2918 rc = GetLastError();
2921 DeregisterEventSource(hSource);
2925 rc = GetLastError();
2932 if ( strings != NULL )
2953 context->RaiseException(
2955 context->ArrayOfFive(context->String(
"positional"),
2956 context->Int32ToObject(1),
2959 context->Int32ToObject(countKB)));
3011 OPTIONAL_CSTRING, source, OPTIONAL_uint32_t, start, OPTIONAL_uint32_t, count)
3025 if ( source == NULL )
3035 CloseEventLog(hLog);
3041 char evType[6][12]={
"Error",
"Warning",
"Information",
"Success",
"Failure",
"Unknown"};
3044 PEVENTLOGRECORD pEvLogRecord;
3045 PVOID pBuffer = NULL;
3046 DWORD bufferPos = 0;
3049 char * pchEventSource = NULL;
3050 char * pchComputerName = NULL;
3051 char * pchMessage = NULL;
3052 char * pBinaryData = NULL;
3055 struct tm * DateTime;
3056 char * pchStrBuf = NULL;
3057 char * pchUser = NULL;
3058 DWORD countRecords = 0;
3064 DWORD bufSize = count * 1024;
3067 bufSize = bufSize < minSize ? minSize : bufSize;
3069 pBuffer = LocalAlloc(LPTR, bufSize);
3070 if ( pBuffer == NULL )
3083 BOOL success = TRUE;
3087 while ( (countRecords < count) && (success = ReadEventLog(hLog, flags, start, pBuffer, bufSize, &bytesRead, &needed)) )
3089 pEvLogRecord = (PEVENTLOGRECORD)pBuffer;
3092 while ( (bufferPos < bytesRead) && (countRecords < count) )
3094 if (flags & EVENTLOG_FORWARDS_READ)
3096 start = pEvLogRecord->RecordNumber + 1;
3100 start = pEvLogRecord->RecordNumber - 1;
3118 DateTime = localtime((
const time_t *)&pEvLogRecord->TimeWritten);
3120 DateTime = _localtime32((
const __time32_t *)&pEvLogRecord->TimeWritten);
3126 pchEventSource = (
char*)pEvLogRecord +
sizeof(EVENTLOGRECORD);
3127 pchComputerName = pchEventSource + strlen(pchEventSource)+1;
3139 size_t len = strlen(evType[evTypeIndex]) + 1 +
3142 strlen(pchEventSource) + 3 +
3144 strlen(pchUser) + 1 +
3145 strlen(pchComputerName) + 1 +
3146 strlen(pchMessage) + 3 +
3149 pchStrBuf = (
char *)LocalAlloc(LPTR, len);
3156 "%s %s %s '%s' %u %s %s '%s' '",
3157 evType[evTypeIndex],
3161 LOWORD(pEvLogRecord->EventID),
3168 len = strlen(pchStrBuf);
3169 memcpy((pchStrBuf + len), pBinaryData, cch);
3172 *(pchStrBuf + len++) =
'\'';
3173 *(pchStrBuf + len) =
'\0';
3175 LocalFree(pchMessage);
3177 LocalFree(pBinaryData);
3182 context->ArrayPut(rxRecords, context->NewString(pchStrBuf, len), countRecords);
3184 LocalFree(pchStrBuf);
3187 bufferPos += pEvLogRecord->Length;
3188 pEvLogRecord = (PEVENTLOGRECORD)(((
char*)pEvLogRecord) + pEvLogRecord->Length);
3190 memset(pBuffer, 0, bufSize);
3195 rc = GetLastError();
3197 if ( rc == ERROR_INSUFFICIENT_BUFFER )
3205 else if ( rc == ERROR_HANDLE_EOF )
3217 CloseEventLog(hLog);
3237 const char key[] =
"SYSTEM\\CurrentControlSet\\Services\\EventLog\\";
3240 if ( ! context->IsOfType(obj,
"ARRAY") )
3246 context->SendMessage0(logNames,
"EMPTY");
3251 rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_ENUMERATE_SUB_KEYS, &hKey);
3252 if ( rc == ERROR_SUCCESS )
3258 while ( (rc = RegEnumKeyEx(hKey, index, name, &cName, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS )
3260 context->ArrayAppendString(logNames, name, strlen(name));
3265 if ( rc == ERROR_NO_MORE_ITEMS )
3273 context->SendMessage0(logNames,
"EMPTY");
3324 if (!strcmp(argv[0].strptr,
"DESK"))
3328 else if (!strcmp(argv[0].strptr,
"FIND"))
3331 hW = FindWindow(NULL, argv[1].strptr);
3334 else if (!strcmp(argv[0].strptr,
"FINDCHILD"))
3339 hW = FindWindowEx(thW, NULL, NULL, argv[2].strptr);
3342 else if (!strcmp(argv[0].strptr,
"SETFG"))
3345 hW = GetForegroundWindow();
3350 SetForegroundWindow(thW);
3354 else if (!strcmp(argv[0].strptr,
"GETFG"))
3358 else if (!strcmp(argv[0].strptr,
"TITLE"))
3366 RETC(!SetWindowText(hW, argv[2].strptr));
3392 tmp_ptr = (
char *)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, retstr->
strlength + 1);
3397 retstr->
strptr = tmp_ptr;
3400 lResult = SendMessageTimeout(hW, WM_GETTEXT, retstr->
strlength + 1, (LPARAM)retstr->
strptr,
3429 curSel = (int) dwResult;
3431 if (curSel != LB_ERR)
3449 tmp_ptr = (
char *)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, retstr->
strlength + 1);
3454 retstr->
strptr = tmp_ptr;
3477 RETC(!SetConsoleTitle(argv[2].strptr))
3486 else if (!strcmp(argv[0].strptr,
"CLASS"))
3496 else if (!strcmp(argv[0].strptr,
"SHOW"))
3503 if (!strcmp(argv[2].strptr,
"HIDE")) sw = SW_HIDE;
3505 if (!strcmp(argv[2].strptr,
"MAX")) sw = SW_SHOWMAXIMIZED;
3507 if (!strcmp(argv[2].strptr,
"MIN")) sw = SW_MINIMIZE;
3509 if (!strcmp(argv[2].strptr,
"RESTORE")) sw = SW_RESTORE;
3511 RETC(ShowWindow(hW, sw))
3514 else if (!strcmp(argv[0].strptr,
"HNDL"))
3522 if (!strcmp(argv[2].strptr,
"NEXT")) gw = GW_HWNDNEXT;
3523 else if (!strcmp(argv[2].strptr,
"PREV")) gw = GW_HWNDPREV;
3524 else if (!strcmp(argv[2].strptr,
"FIRSTCHILD")) gw = GW_CHILD;
3525 else if (!strcmp(argv[2].strptr,
"FIRST")) gw = GW_HWNDFIRST;
3526 else if (!strcmp(argv[2].strptr,
"LAST")) gw = GW_HWNDLAST;
3527 else if (!strcmp(argv[2].strptr,
"OWNER")) gw = GW_OWNER;
3536 else if (!strcmp(argv[0].strptr,
"ID"))
3543 else if (!strcmp(argv[0].strptr,
"ATPOS"))
3547 pt.x = atol(argv[1].strptr);
3548 pt.y = atol(argv[2].strptr);
3560 RET_HANDLE(ChildWindowFromPointEx(hW, pt, CWP_ALL));
3567 else if (!strcmp(argv[0].strptr,
"RECT"))
3573 if (hW && GetWindowRect(hW, &r))
3575 sprintf(retstr->
strptr,
"%d,%d,%d,%d",r.left, r.top, r.right, r.bottom);
3580 else if (!strcmp(argv[0].strptr,
"GETSTATE"))
3587 retstr->
strptr[0] =
'\0';
3588 if (!IsWindow(hW)) strcpy(retstr->
strptr,
"Illegal Handle");
3591 if (IsWindowEnabled(hW)) strcat(retstr->
strptr,
"Enabled ");
3592 else strcat(retstr->
strptr,
"Disabled ");
3593 if (IsWindowVisible(hW)) strcat(retstr->
strptr,
"Visible ");
3594 else strcat(retstr->
strptr,
"Invisible ");
3595 if (IsZoomed(hW)) strcat(retstr->
strptr,
"Zoomed ");
3596 else if (IsIconic(hW)) strcat(retstr->
strptr,
"Minimized ");
3597 if (GetForegroundWindow() == hW) strcat(retstr->
strptr,
"Foreground ");
3603 else if (!strcmp(argv[0].strptr,
"GETSTYLE"))
3611 wi.cbSize =
sizeof(WINDOWINFO);
3612 if ( GetWindowInfo(hW, &wi) )
3626 else if (!strcmp(argv[0].strptr,
"ENABLE"))
3632 RETC(EnableWindow(hW, atoi(argv[2].strptr)));
3635 else if (!strcmp(argv[0].strptr,
"MOVE"))
3642 if (!GetWindowRect(hW, &r))
3646 RETC(!MoveWindow(hW, atol(argv[2].strptr), atol(argv[3].strptr), r.right - r.left, r.bottom-r.top, TRUE))
3649 else if (!strcmp(argv[0].strptr,
"SIZE"))
3656 if (!GetWindowRect(hW, &r))
3660 RETC(!SetWindowPos(hW, NULL, r.left, r.top, atol(argv[2].strptr), atol(argv[3].strptr), SWP_NOMOVE | SWP_NOZORDER))
3674 if ( strcmp(argv[0].strptr,
"KEY") == 0 )
3683 k = (WPARAM)atoi(argv[2].strptr);
3686 l = strtol(argv[4].strptr,
'\0',16);
3707 if (argv[3].strptr[0] ==
'D')
3709 HwndFgWin = GetForegroundWindow();
3710 if ( hW == HwndFgWin)
3714 keybd_event((BYTE)k,0,KEYEVENTF_EXTENDEDKEY,0);
3718 keybd_event((BYTE)k,0,0,0);
3722 retstr->
strptr[1] =
'\0';
3726 itoa(PostMessage(hW,WM_KEYDOWN, k,l), retstr->
strptr, 10);
3729 else if (argv[3].strptr[0] ==
'U')
3731 HwndFgWin = GetForegroundWindow();
3732 if ( hW == HwndFgWin )
3736 keybd_event((BYTE)k,0,KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY,0);
3740 keybd_event((BYTE)k,0,KEYEVENTF_KEYUP,0);
3744 retstr->
strptr[1] =
'\0';
3748 itoa(PostMessage(hW,WM_KEYUP, k, l | 0xC0000000), retstr->
strptr, 10);
3750 retstr->
strptr[1] =
'\0';
3757 itoa(PostMessage(hW,WM_SYSKEYDOWN, k,l), retstr->
strptr, 10);
3758 itoa(PostMessage(hW,WM_SYSKEYUP, k,l), retstr->
strptr, 10);
3762 itoa(SendNotifyMessage(hW,WM_CHAR, k,l), retstr->
strptr, 10);
3768 else if ( strcmp(argv[0].strptr,
"MSG") == 0 )
3784 if ( argc > 5 && argv[5].strptr[0] ==
'E' )
3786 lp = (LPARAM)
"Environment";
3788 if ( SendNotifyMessage(hW, msg, wp, lp) )
3797 else if ( strcmp(argv[0].strptr,
"TO") == 0 )
3816 if ( argc > 6 && argv[6].strptr[0] ==
'E' )
3818 lp = (LPARAM)
"Environment";
3821 lResult = SendMessageTimeout(hW, msg, wp, lp,
MSG_TIMEOUT_OPTS, timeOut, &dwResult);
3827 DWORD err = GetLastError();
3839 else if ( strcmp(argv[0].strptr,
"MAP") == 0 )
3842 RETVAL(MapVirtualKey((UINT)atoi(argv[1].strptr), 2));
3854 if (!strcmp(argv[0].strptr,
"GET"))
3862 else if (!strcmp(argv[0].strptr,
"SYS"))
3870 else if (!strcmp(argv[0].strptr,
"SUB"))
3876 RET_HANDLE(GetSubMenu(hMenu, atoi(argv[2].strptr)));
3878 else if (!strcmp(argv[0].strptr,
"ID"))
3884 RETVAL(GetMenuItemID(hMenu, atoi(argv[2].strptr)));
3886 else if (!strcmp(argv[0].strptr,
"CNT"))
3892 RETVAL(GetMenuItemCount(hMenu));
3894 else if (!strcmp(argv[0].strptr,
"TEXT"))
3905 if (argv[3].strptr[0] ==
'C')
3907 flag = MF_BYCOMMAND;
3911 flag = MF_BYPOSITION;
3914 retstr->
strlength = GetMenuString(hM, atol(argv[2].strptr), retstr->
strptr, 255, flag);
3917 else if (!strcmp(argv[0].strptr,
"STATE"))
3932 UINT pos = atoi(argv[3].strptr);
3934 flags = GetMenuState(hMenu, pos, MF_BYPOSITION);
3936 if ( flags == 0xffffffff )
3942 if ( argv[2].strptr[0] ==
'M' )
3944 RETVAL((flags & MF_POPUP) ? 1 : 0);
3946 else if ( argv[2].strptr[0] ==
'C' )
3948 RETVAL((flags & MF_CHECKED) ? 1 : 0);
3952 RETVAL(((flags & MF_POPUP) == 0 && (flags & MF_SEPARATOR) != 0) ? 1 : 0);
3967 if (!strcmp(argv[0].strptr,
"COPY"))
3973 hmem = (
char *)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, argv[1].strlength + 1);
3974 membase = (
char *) GlobalLock(hmem);
3978 memcpy(membase, argv[1].strptr, argv[1].strlength + 1);
3979 if (OpenClipboard(NULL) && EmptyClipboard())
3981 ret = SetClipboardData(CF_TEXT, hmem) != NULL;
3983 GlobalUnlock(membase);
3988 else if (!strcmp(argv[0].strptr,
"PASTE"))
3992 if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL))
3994 hmem = GetClipboardData(CF_TEXT);
3995 membase = (
char *) GlobalLock(hmem);
3998 size_t s = GlobalSize(hmem);
4001 retstr->
strptr = (
char *)GlobalAlloc(GMEM_FIXED, s);
4002 if (retstr->
strptr == NULL)
4008 s = strlen(membase);
4009 memcpy(retstr->
strptr, membase, s+1);
4011 GlobalUnlock(membase);
4023 else if (!strcmp(argv[0].strptr,
"EMPTY"))
4025 if (IsClipboardFormatAvailable(CF_TEXT))
4028 if (!OpenClipboard(NULL))
4032 ret = !EmptyClipboard();
4038 else if (!strcmp(argv[0].strptr,
"AVAIL"))
4040 RETC(IsClipboardFormatAvailable(CF_TEXT))
4057 for (i = 0; i < iSize; i++)
4059 bTemp[i] = pbInt[iSize - i - 1];
4062 memcpy(pbInt, bTemp, iSize);
4101 REXX_METHOD(getPerformance_Data, getPerformance_Data),
4102 REXX_METHOD(getCurrent_Config, getCurrent_Config),
4103 REXX_METHOD(WSRegistry_delete, WSRegistry_delete),
4108 REXX_METHOD(WSEventLog_uninit, WSEventLog_uninit),
4112 REXX_METHOD(WSEventLog_readRecords, WSEventLog_readRecords),
4113 REXX_METHOD(WSEventLog_minimumReadSet, WSEventLog_minimumReadSet),
4114 REXX_METHOD(WSEventLog_minimumReadGet, WSEventLog_minimumReadGet),
4115 REXX_METHOD(WSEventLog_getNumber, WSEventLog_getNumber),
4116 REXX_METHOD(WSEventLog_getFirst, WSEventLog_getFirst),
4117 REXX_METHOD(WSEventLog_getLast, WSEventLog_getLast),
4118 REXX_METHOD(WSEventLog_isFull, WSEventLog_isFull),
4119 REXX_METHOD(WSEventLog_getLogNames, WSEventLog_getLogNames),
RexxReturnCode RexxEntry RexxVariablePool(PSHVBLOCK pshvblock)
#define argumentExists(i)
#define REXX_INTERPRETER_4_0_0
#define REXX_METHOD(n, e)
#define REXX_CLASSIC_ROUTINE(n, e)
#define argumentOmitted(i)
#define REXX_LAST_ROUTINE()
#define REXX_LAST_METHOD()
#define STANDARD_PACKAGE_HEADER
#define Rexx_Error_Incorrect_method_noclass
#define Rexx_Error_Incorrect_method_noarg
#define Rexx_Error_Invalid_argument_range
#define Rexx_Error_Execution_user_defined
#define Rexx_Error_Incorrect_method_list
#define Rexx_Error_System_service_user_defined
#define Rexx_Error_Incorrect_method_user_defined
struct _RexxStringObject * RexxStringObject
struct _RexxArrayObject * RexxArrayObject
struct _RexxObjectPtr * RexxObjectPtr
void *REXXENTRY RexxAllocateMemory(size_t)
struct _RexxPointerObject * RexxPointerObject
#define MIN_READ_KB_COUNT
void systemServiceException(RexxMethodContext *context, char *msg)
HKEY getParentKeyHandle(RexxMethodContext *c, CSTRING hkParent)
#define END_RECORD_OUT_OF_RANGE_MSG
#define WSEL_DEFAULT_EVENTS_ARRAY_SIZE
LONG HandleArgError(PRXSTRING r, BOOL ToMuch)
bool checkReadRecordsArgs(RexxMethodContext *context, HANDLE hLog, CSTRING direction, uint32_t start, uint32_t *count, DWORD *flags, DWORD *rc)
RexxMethod3(RexxObjectPtr, WSRegistry_open, OPTIONAL_CSTRING, hkParent, OPTIONAL_CSTRING, subKeyName, OPTIONAL_CSTRING, access)
#define IDS_ALL_9x_DESKTOP
bool getOpenEventLog(RexxMethodContext *context, const char *server, const char *source, HANDLE *pHandle, DWORD *pRC)
RexxMethod4(int, WSEventLog_test, RexxStringObject, data, OPTIONAL_CSTRING, server, OPTIONAL_CSTRING, source, ARGLIST, args)
#define SET_VARIABLE(varname, data, retc)
size_t RexxEntry InstWinSysFuncs(const char *funcname, size_t argc, CONSTRXSTRING *argv, const char *qname, RXSTRING *retstr)
#define BAD_RECORD_ARRAY_MSG
#define IDS_ALL_NT_DESKTOP
#define START_RECORD_OUT_OF_RANGE_MSG
BOOL AddPMItem(const char *lpszCmdLine, const char *lpszCaption, const char *lpszIconPath, WORD wIconIndex, const char *lpszDir, BOOL bLast, const char *lpszHotKey, const char *lpszModifier, BOOL bMin)
BOOL findAndFormatDescription(char *files, DWORD msgID, char **ppInserts, LPVOID *lpMsgBuf)
size_t RexxEntry WSRegistryFile(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
void lookupMessageFile(char *pValueName, char *logName, char *source, char *fileBuffer)
#define IDS_REGISTRY_KEY_CURRENT_SHELLFOLDER
void setCurrentHandle(RexxMethodContext *context, HANDLE h)
RexxMethod7(uint32_t, WSEventLog_write, OPTIONAL_CSTRING, server, OPTIONAL_CSTRING, source, OPTIONAL_uint16_t, t, OPTIONAL_uint16_t, category, OPTIONAL_uint32_t, id, OPTIONAL_RexxStringObject, rawData, ARGLIST, args)
#define GET_HANDLE(argum, ghk)
RexxMethod0(RexxObjectPtr, WSRegistry_init)
#define GET_HKEY(argum, ghk)
RexxArrayObject getRecordArray(RexxMethodContext *context)
size_t RexxEntry WSProgManager(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
#define INITCODE_ATTRIBUTE
OOREXX_GET_PACKAGE(rxwinsys)
BOOL AddPMGroup(const char *lpszGroup, const char *lpszPath)
size_t RexxEntry WSCtrlSend(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
size_t RexxEntry WSRegistryKey(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
BOOL LeavePM(BOOL bSaveGroups)
void pointer2string(PRXSTRING result, void *pointer)
char * getEventUserName(PEVENTLOGRECORD pEvLogRecord)
#define MAX_REGISTRY_KEY_SIZE
#define MAX_READ_KB_COUNT
DWORD getMinimumReadBufferSize(RexxMethodContext *c)
size_t RexxEntry WSCtrlMenu(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
RexxMethod5(uint32_t, WSEventLog_readRecords, OPTIONAL_CSTRING, direction, OPTIONAL_CSTRING, server, OPTIONAL_CSTRING, source, OPTIONAL_uint32_t, start, OPTIONAL_uint32_t, count)
bool isGoodEventType(uint16_t type)
#define RET_HANDLE(retvalue)
size_t RexxEntry WSRegistryValue(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
RexxPackageEntry rxwinsys_package_entry
size_t getEventBinaryData(PEVENTLOGRECORD pEvLogRecord, char **ppBinData)
#define TOO_SMALLBUFFER_MSG
HDDEDATA CALLBACK DDECallback(UINT wType, UINT wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hDDEData, DWORD dwData1, DWORD dwData2)
BOOL GetAllUserDesktopLocation(LPBYTE szDesktopDir, LPDWORD lpcbData)
bool isHex(CSTRING value)
BOOL DeletePMItem(const char *lpszItem)
BOOL AddPMDesktopIcon(const char *lpszName, const char *lpszProgram, const char *lpszIcon, int iIconIndex, const char *lpszWorkDir, const char *lpszLocation, const char *lpszArguments, int iScKey, int iScModifier, const char *lpszRun)
INT DelPMDesktopIcon(const char *lpszName, const char *lpszLocation)
BOOL ShowPMGroup(const char *lpszGroup, WORD wCmd)
RexxMethod1(RexxObjectPtr, setCurrent_Key, RexxStringObject, regKeyHandle)
RexxMethod2(uint32_t, WSRegistry_delete, OPTIONAL_CSTRING, hkParent, CSTRING, subKeyName)
size_t dwordPtrToRexx(DWORD_PTR val, PRXSTRING r)
#define CHECKARG(argexpctl, argexpcth)
int32_t getEventLogNumber(RexxMethodContext *context, LogNumberOp numberType, CSTRING server, CSTRING source)
unsigned int wrongClassException(RexxMethodContext *c, int pos, const char *n)
void getEventDescription(PEVENTLOGRECORD pEvLogRecord, const char *pchSource, char **ppMessage)
#define IDS_REGISTRY_KEY_ALL_9x_SHELLFOLDER
size_t RexxEntry WSClipboard(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
void outOfMemoryException(RexxMethodContext *c)
#define MIN_READ_MAX_ATTRIBUTE
void wrongArgValueException(RexxMethodContext *c, int pos, const char *list, RexxObjectPtr actual)
BOOL DeletePMGroup(const char *lpszGroup)
HANDLE getCurrentHandle(RexxMethodContext *context)
#define WSEL_DEFAULT_SOURCE
BOOL GetCurrentUserDesktopLocation(LPBYTE szDesktopDir, LPDWORD lpcbData)
size_t RexxEntry WSCtrlWindow(const char *funcname, size_t argc, CONSTRXSTRING argv[], const char *qname, PRXSTRING retstr)
#define IDS_REGISTRY_KEY_ALL_NT_SHELLFOLDER
DWORD closeEventLog(RexxMethodContext *context)
#define RECORDS_ATTRIBUTE
#define MIN_READ_MIN_ATTRIBUTE
#define IDS_CURRENT_DESKTOP
BOOL string2pointer(const char *string, void **pointer)
#define GET_TYPE_INDEX(type, index)
VOID Little2BigEndian(BYTE *pbInt, INT iSize)
RexxRoutineEntry rxwinsys_functions[]
void memupper(char *location, size_t length)
#define MIN_READ_BUFFER_ATTRIBUTE
BOOL ProgmanCmd(LPSTR lpszCmd)
RexxMethodEntry rxwinsys_methods[]
CONSTANT_RXSTRING shvname
struct _SHVBLOCK * shvnext
static OSVERSIONINFO version_info