//+---------------------------------------------------------------------------- // // Scheduling Agent Unit Test // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: st.cxx // // Contents: sage API compatability test harness // // History: 26-Jun-96 EricB created // //----------------------------------------------------------------------------- #include #include #include "..\..\inc\sage.hxx" // flags #define ST_DETECT 0x1 #define ST_ENABLE 0x2 #define ST_TERMINATE 0x4 #define ST_ADDTASK 0x8 #define ST_GETTASK 0x10 #define ST_REMOVETASK 0x20 // prototypes void Usage(int ExitCode); BOOL AddTask(HWND); BOOL GetTask(HWND, int); BOOL RemoveTask(HWND, int); BOOL SetSageInputs (int *IOnum, TaskInfo *pti); BOOL GetSageInputs (int IOnum, TaskInfo *pti); // // Function pointers. // typedef int (*PFCNVOID)(VOID); typedef int (*PFCNINT)(int); //+---------------------------------------------------------------------------- // // Function: main // // Synopsis: entry point // //----------------------------------------------------------------------------- int _cdecl main(int argc, char ** argv) { if (argc < 2 || argc > 3) { Usage(EXIT_SUCCESS); } DWORD dwTest = 0; int iParam = 0; char szMsg[80] = "\n** Sage API test"; LPSTR pszCmdLine = GetCommandLineA(); // skip the program name CHAR * pszToken = strpbrk(pszCmdLine, TEXT(" \t")); // delimit the first token pszToken = strtok(pszToken, TEXT(" \t")); // parse command line do { switch (*pszToken) { case TEXT('/'): case TEXT('-'): pszToken++; switch(*pszToken) { case TEXT('d'): case TEXT('D'): dwTest = ST_DETECT; strcat(szMsg, "; System_Agent_Detect"); break; case TEXT('e'): case TEXT('E'): dwTest = ST_ENABLE; pszToken++; TCHAR * ptszFunction; ptszFunction = strtok(NULL, TEXT(" \t")); if (ptszFunction == NULL || *ptszFunction == TEXT('/') || *ptszFunction == TEXT('-')) { Usage(EXIT_FAILURE); } iParam = (WORD)strtol(ptszFunction, NULL, 10); sprintf(szMsg + strlen(szMsg), "; System_Agent_Enable(%i)", iParam); break; case TEXT('t'): case TEXT('T'): dwTest = ST_TERMINATE; strcat(szMsg, "; System_Agent_Terminate"); break; case TEXT('a'): case TEXT('A'): dwTest = ST_ADDTASK; strcat(szMsg, "; AddTask"); break; case TEXT('g'): case TEXT('G'): dwTest = ST_GETTASK; pszToken++; ptszFunction = strtok(NULL, TEXT(" \t")); if (ptszFunction == NULL || *ptszFunction == TEXT('/') || *ptszFunction == TEXT('-')) { Usage(EXIT_FAILURE); } iParam = (WORD)strtol(ptszFunction, NULL, 10); sprintf(szMsg + strlen(szMsg), "; GetTask(%i)", iParam); break; case TEXT('r'): case TEXT('R'): dwTest = ST_REMOVETASK; pszToken++; ptszFunction = strtok(NULL, TEXT(" \t")); if (ptszFunction == NULL || *ptszFunction == TEXT('/') || *ptszFunction == TEXT('-')) { Usage(EXIT_FAILURE); } iParam = (WORD)strtol(ptszFunction, NULL, 10); sprintf(szMsg + strlen(szMsg), "; RemoveTask(%i)", iParam); break; case TEXT('h'): case TEXT('H'): case TEXT('?'): Usage(EXIT_SUCCESS); default: Usage(EXIT_FAILURE); } break; default: // not a switch character (/ or -) Usage(EXIT_FAILURE); } pszToken = strtok(NULL, TEXT(" \t")); } while (pszToken); strcat(szMsg, "\n\n"); printf(szMsg); HWND hAgent = NULL; HINSTANCE hSageLib = NULL; if (dwTest == ST_DETECT || dwTest == ST_ENABLE || dwTest == ST_TERMINATE) { hSageLib = LoadLibrary("SAGE.DLL"); if (hSageLib == NULL) { printf("Load of sage.dll failed with error %d\n", GetLastError()); goto Err; } } else { hAgent = FindWindow ("SAGEWINDOWCLASS", "SYSTEM AGENT COM WINDOW"); if (hAgent == NULL) { printf("16 bit API test: Scheduling Agent not running!\n"); goto Err; } } int iRet; PFCNVOID pfnDetect, pfnTerminate; PFCNINT pfnEnable; switch (dwTest) { case ST_DETECT: pfnDetect = (PFCNVOID)GetProcAddress(hSageLib, "System_Agent_Detect"); if (pfnDetect == NULL) { printf("GetProcAddress failed with error %d\n", GetLastError()); goto Err; } iRet = pfnDetect(); printf("System_Agent_Detect returned %d\n", iRet); break; case ST_ENABLE: pfnEnable = (PFCNINT)GetProcAddress(hSageLib, "System_Agent_Enable"); if (pfnEnable == NULL) { printf("GetProcAddress failed with error %d\n", GetLastError()); goto Err; } iRet = pfnEnable(iParam); printf("System_Agent_Enable returned %d\n", iRet); break; case ST_TERMINATE: pfnTerminate = (PFCNVOID)GetProcAddress(hSageLib, "System_Agent_Terminate"); if (pfnTerminate == NULL) { printf("GetProcAddress failed with error %d\n", GetLastError()); goto Err; } iRet = pfnTerminate(); printf("System_Agent_Terminate returned %d\n", iRet); break; case ST_ADDTASK: if (!AddTask(hAgent)) { goto Err; } break; case ST_GETTASK: if (!GetTask(hAgent, iParam)) { goto Err; } break; case ST_REMOVETASK: if (!RemoveTask(hAgent, iParam)) { goto Err; } break; default: Usage(EXIT_FAILURE); } printf("\n** Test successfully completed! **\n"); return(EXIT_SUCCESS); Err: printf("\n** Test failed.\n"); return(EXIT_FAILURE); } char *pszREGIOpath = "Software\\Microsoft\\Plus!\\System Agent"; char *pszREGIOkey = "IOKey%lu"; #define cbRESOURCE 256 #define nKeySageMAX 100 // Don't try over 100 keys #define SAGE_ADDTASK (WM_USER + 9) #define SAGE_REMOVETASK (WM_USER + 10) #define SAGE_GETTASK (WM_USER + 11) //+---------------------------------------------------------------------------- // // Function: AddTask // //----------------------------------------------------------------------------- BOOL AddTask(HWND hAgent) { TaskInfo ti = {0}; ti.StructureSize = sizeof(TaskInfo); ti.BeginTime.wYear = (WORD)-1; ti.BeginTime.wMonth = (WORD)-1; ti.BeginTime.wDay = (WORD)-1; ti.BeginTime.wDayOfWeek = (WORD)-1; ti.BeginTime.wDay = (WORD)-1; ti.BeginTime.wHour = 12; ti.BeginTime.wMinute = 10; ti.EndTime.wYear = (WORD)-1; ti.EndTime.wMonth = (WORD)-1; ti.EndTime.wDay = (WORD)-1; ti.EndTime.wDayOfWeek = (WORD)-1; ti.EndTime.wDay = (WORD)-1; ti.EndTime.wHour = 13; ti.EndTime.wMinute = 50; ti.Time_Granularity = 900; // seconds = 15 minutes. ti.StopAfterTime = 600; // seconds = 10 minutes. lstrcpy(ti.CommandLine, "sol"); lstrcpy(ti.Comment, "this is a test of the 16 bit Sage support."); GetStartupInfo(&ti.StartupInfo); ti.StartupInfo.cb = sizeof(STARTUPINFO); ti.CreatorId = (unsigned long)GetCurrentProcess(); int IOnum; if (!SetSageInputs(&IOnum, &ti)) return FALSE; LRESULT lRet = SendMessage(hAgent, SAGE_ADDTASK, (WPARAM)IOnum, (LPARAM)ti.CreatorId); SetSageInputs(&IOnum, NULL); // Delete the regkey if (lRet > 0) { printf("AddTask added a task with Task_Identifier of %u.\n", lRet); } else { printf("AddTask failed to add a task.\n"); return FALSE; } return TRUE; } //+---------------------------------------------------------------------------- // // Function: GetTask // //----------------------------------------------------------------------------- BOOL GetTask(HWND hAgent, int iTask) { char szValue[cbRESOURCE]; int IOnum; HKEY hk; DWORD dwType; if (RegCreateKey(HKEY_LOCAL_MACHINE, pszREGIOpath, &hk) != ERROR_SUCCESS) return FALSE; for (IOnum = 0; IOnum < nKeySageMAX; IOnum++) { wsprintf(szValue, pszREGIOkey, (unsigned long)IOnum); if (RegQueryValueEx(hk, szValue, NULL, &dwType, NULL, NULL) != ERROR_SUCCESS) { break; } } RegCloseKey(hk); LRESULT lRet = SendMessage(hAgent, SAGE_GETTASK, (WPARAM)IOnum, (LPARAM)iTask); TaskInfo ti; if (lRet > 0) { printf("GetTask returned a task with Task_Identifier of %u.\n", lRet); } else { printf("GetTask failed to return a task.\n"); return FALSE; } if (!GetSageInputs(IOnum, &ti)) { printf("Unable to read the task from the registry!\n"); return FALSE; } printf("The task data has been left in the registry at:\n" "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Plus!\\System Agent: " "IOKey%lu\n", (unsigned long)IOnum); return TRUE; } //+---------------------------------------------------------------------------- // // Function: RemoveTask // //----------------------------------------------------------------------------- BOOL RemoveTask(HWND hAgent, int iTask) { LRESULT lRet = SendMessage(hAgent, SAGE_REMOVETASK, 0, (LPARAM)iTask); if (lRet > 0) { printf("RemoveTask deleted a task with Task_Identifier of %u.\n", iTask); } else { printf("RemoveTask failed to delete a task.\n"); return FALSE; } return TRUE; } /*** SetSageInputs - Create or remove a regkey for IPC with SAGE * * If called with a non-NULL {TaskInfo*}, this function will create a new * registry value for IPC with SAGE, returning in {*IOnum} an index to that * new registry value. * * If called with a NULL {TaskInfo*}, this function will remove the registry * key indicated by {*IOnum}. * * In both cases, TRUE is returned upon success. * */ BOOL SetSageInputs(int *IOnum, TaskInfo *pti) { HKEY hk; DWORD cb; DWORD dwType; char value[cbRESOURCE]; DWORD rc; BOOL fDone = FALSE; if (RegCreateKey(HKEY_LOCAL_MACHINE, pszREGIOpath, &hk) != ERROR_SUCCESS) return FALSE; if (pti == NULL) // Delete the previously-used key? { wsprintf(value, pszREGIOkey, (unsigned long)(*IOnum)); RegDeleteValue(hk, value); } else // Or create a new key? { for (*IOnum = 0; (*IOnum) < nKeySageMAX; (*IOnum)++) { wsprintf(value, pszREGIOkey, (unsigned long)(*IOnum)); rc = RegQueryValueEx(hk, value, NULL, &dwType, NULL, NULL); if (rc != ERROR_SUCCESS) break; } if ((*IOnum) >= nKeySageMAX) // Never found a spot for a free key? { RegCloseKey (hk); return FALSE; } cb = sizeof(*pti); rc = RegSetValueEx(hk, value, NULL, REG_BINARY, (const BYTE *)pti, cb); if (rc != ERROR_SUCCESS) // If we couldn't write to the registry { // then something bad is happening. RegDeleteKey(hk, value); RegCloseKey(hk); return FALSE; } RegCloseKey (hk); } return TRUE; } BOOL GetSageInputs(int IOnum, TaskInfo *pti) { char value[cbRESOURCE]; HKEY hk; DWORD cb; DWORD dwType; LONG rc; if (RegOpenKey(HKEY_LOCAL_MACHINE, pszREGIOpath, &hk) != ERROR_SUCCESS) return FALSE; wsprintf(value, pszREGIOkey, (unsigned long)IOnum); cb = sizeof(*pti); rc = RegQueryValueEx(hk, value, NULL, &dwType, (LPBYTE)pti, &cb); return (rc == ERROR_SUCCESS) ? TRUE : FALSE; } //+---------------------------------------------------------------------------- // // Function: Usage // //----------------------------------------------------------------------------- void Usage(int ExitCode) { printf("\nST: sage API compatibility test harness\n\n"); if (ExitCode == EXIT_FAILURE) { printf("ERROR: incorrect command line!\n\n"); } printf("Usage: st [/d] | [/e <#>] | [/t] | [/a] | [/g <#>] | [/r <#>]\n"); printf(" /d - System_Agent_Detect\n"); printf(" returns the Scheduling Agent version if running\n"); printf(" /e - System_Agent_Enable\n"); printf(" # can be one of 1, 2, or 3. If # is 3, then returns 0, 1 or 2\n"); printf(" /t - System_Agent_Terminate\n"); printf(" cause the service to exit.\n"); printf(" /a - AddTask\n"); printf(" uses the 16 bit method to add a pre-canned task.\n"); printf(" /g - GetTask\n"); printf(" uses the 16 bit method to get task #.\n"); printf(" /r - RemoveTask\n"); printf(" uses the 16 bit method to remove task #.\n"); exit(ExitCode); }