#include #include #include #include void __cdecl main(void); void foo (void); void foo1(void); void foo2(void); void foo3(void); void WalkTheStack(void); void TestFindExecutableImage( void ); void __cdecl main(void) { puts("Entering main"); foo(); TestFindExecutableImage(); puts("Ending main"); } void TestFindExecutableImage( void ) { HANDLE Handle; CHAR szCorrectName[MAX_PATH]; CHAR szActualName [MAX_PATH]; CHAR szTestPath[MAX_PATH]; CHAR szDrive[_MAX_DRIVE]; CHAR szDir[_MAX_DIR]; CHAR *FilePart; DWORD ErrorCount = 0; _splitpath(_pgmptr, szDrive, szDir, NULL, NULL); strcpy(szTestPath, szDrive); strcat(szTestPath, szDir); GetFullPathName(_pgmptr, MAX_PATH, szCorrectName, &FilePart); __try { Handle = FindExecutableImage(FilePart, szTestPath, szActualName); } __except (EXCEPTION_EXECUTE_HANDLER) { Handle = NULL; printf("ERROR: FindExecutableImage GPF (test %d)\n", 1); ErrorCount++; } if (Handle == NULL) { printf("ERROR: FindExecutableImage (test %d) failed\n", 1); ErrorCount++; } else { CloseHandle(Handle); if (strcmp(szCorrectName, szActualName)) { printf("ERROR: FindExecutableImage() (test %d) found wrong image.\nExpected: %s\nFound: %s\n", 1, szCorrectName, szActualName); ErrorCount++; } } // Test long paths to ExpandPath() strcat(szTestPath, ";%path%;%path%;%path%;%path%;%path%;%path%;%path%;%path%"); __try { Handle = FindExecutableImage(FilePart, szTestPath, szActualName); } __except (EXCEPTION_EXECUTE_HANDLER) { Handle = NULL; printf("ERROR: FindExecutableImage GPF (test %d)\n", 2); ErrorCount++; } if (Handle == NULL) { printf("ERROR: FindExecutableImage (test %d) failed\n", 2); ErrorCount++; } else { CloseHandle(Handle); if (strcmp(szCorrectName, szActualName)) { printf("ERROR: FindExecutableImage() (test %d) found wrong image.\nExpected: %s\nFound: %s\n", 2, szCorrectName, szActualName); ErrorCount++; } } // Test invalid paths (should return failure) szTestPath[0] = '\0'; __try { Handle = FindExecutableImage(FilePart, szTestPath, szActualName); } __except (EXCEPTION_EXECUTE_HANDLER) { Handle = NULL; printf("ERROR: FindExecutableImage GPF (test %d)\n", 3); ErrorCount++; } if (Handle != NULL) { CloseHandle(Handle); printf("ERROR: FindExecutableImage (test %d) failed - Expected: \nFound: %s\n", 3, szActualName); ErrorCount++; } else { if (strlen(szActualName)) { printf("ERROR: FindExecutableImage() (test %d) failed to clear ImageName on failure\n", 3); ErrorCount++; } } // Test NULL name (should return failure) __try { Handle = FindExecutableImage(NULL, szTestPath, szActualName); } __except (EXCEPTION_EXECUTE_HANDLER) { Handle = NULL; printf("ERROR: FindExecutableImage GPF (test %d)\n", 4); ErrorCount++; } if (Handle != NULL) { CloseHandle(Handle); printf("ERROR: FindExecutableImage (test %d) failed - Expected: \nFound: %s\n", 4, szActualName); ErrorCount++; } else { if (strlen(szActualName)) { printf("ERROR: FindExecutableImage() (test %d) failed to clear ImageName on failure\n", 4); ErrorCount++; } } // Valid name and path, invalid end result. strcpy(szTestPath, szDrive); strcat(szTestPath, szDir); __try { Handle = FindExecutableImage(FilePart, szTestPath, NULL); } __except (EXCEPTION_EXECUTE_HANDLER) { Handle = NULL; printf("ERROR: FindExecutableImage GPF (test %d)\n", 5); ErrorCount++; } if (Handle != NULL) { CloseHandle(Handle); printf("ERROR: FindExecutableImage (test %d) failed - Supposed to fail if filepath is invalid\n", 5); ErrorCount++; } printf("FindExecutableImage - %s\n", ErrorCount ? "Failed" : "Passed"); return; } void foo(void) { puts("Entering foo"); foo1(); puts("Ending foo"); } void foo1(void) { puts("Entering foo1"); foo2(); puts("Ending foo1"); } void foo2(void) { puts("Entering foo2"); foo3(); puts("Ending foo2"); } void foo3(void) { puts("Entering foo3"); WalkTheStack(); puts("Ending foo2"); } void WalkTheStack(){ }