184 lines
4.5 KiB
C
184 lines
4.5 KiB
C
#include <windows.h>
|
|
#include <imagehlp.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
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: <nothing>\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: <nothing>\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(){
|
|
|
|
}
|