You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by TO...@aol.com on 1999/01/25 23:36:59 UTC
WIN32 CGI - USC CODE - 3 OF 4
WIN32 PROBLEM: EXECUTABLE AND CGI 'SCRIPT' HANDLING LOGIC
RELATES TO: Some currently open Apache WIN32 CGI PR REPORTS
A good example of a possible BETTER way to look at/for
WIN32 executables 'on-the-fly'...
More detailed ( and flexible ) than current Apache code.
Comes from:
Expect 5 for Tcl 8.0 and Tk 8.0 project at
USC ( Berkman!... Berkmeister!... Berk-o-rama!... the Berk. )
http://bmrc.berkely.edu/ftp/pub/winnt/tcltk/expect/expect-patch-snap13tosnap14
Reachable via any search engine using keyword IMAGE_DOS_HEADER.
Excerpt from source file: diff -u expect-5.21/CHANGES.NT
-static DWORD
-ExpApplicationType(originalName, fullPath)
- const TCHAR *originalName; /* Name of the application to find. */
- TCHAR fullPath[MAX_PATH]; /* Filled with complete path to
- * application. */
-{
- DWORD applType;
- int i;
- HANDLE hFile;
- PTCHAR ext;
- TCHAR buf[2];
- DWORD read;
- IMAGE_DOS_HEADER header;
- static TCHAR extensions[][5] = {TEXT(""), TEXT(".com"), TEXT(".exe"),
- TEXT(".bat"), TEXT(".cmd")};
-
- /* Look for the program as an external program. First try the name
- * as it is, then try adding .com, .exe, and .bat, in that order, to
- * the name, looking for an executable.
- *
- * Using the raw SearchPath() procedure doesn't do quite what is
- * necessary. If the name of the executable already contains a '.'
- * character, it will not try appending the specified extension when
- * searching (in other words, SearchPath will not find the program
- * "a.b.exe" if the arguments specified "a.b" and ".exe").
- * So, first look for the file as it is named. Then manually append
- * the extensions, looking for a match.
- */
-
- applType = EXP_APPL_NONE;
- for (i = 0; i < (int) (sizeof(extensions) / sizeof(extensions[0])); i++)
{
- lstrcpyn(fullPath, originalName, MAX_PATH - 5);
- lstrcat(fullPath, extensions[i]);
-
- {
- DWORD x;
- WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), fullPath,
- lstrlen(fullPath), &x, NULL);
- WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), TEXT("\n"), 1, &x,NULL);
- }
- if (SearchPath(NULL, fullPath, NULL, MAX_PATH, fullPath, NULL) == 0) {
- continue;
- }
-
- /*
- * Ignore matches on directories or data files, return if identified
- * a known type.
- */
-
- if (GetFileAttributes(fullPath) & FILE_ATTRIBUTE_DIRECTORY) {
- continue;
- }
-
- ext = lstrrchr(fullPath, '.');
- if ((ext != NULL) && (lstrcmpi(ext, TEXT(".bat")) == 0)) {
- applType = EXP_APPL_DOS;
- break;
- }
-
- hFile = CreateFile(fullPath, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- if (hFile == INVALID_HANDLE_VALUE) {
- continue;
- }
-
- header.e_magic = 0;
- ReadFile(hFile, (void *) &header, sizeof(header), &read, NULL);
- if (header.e_magic != IMAGE_DOS_SIGNATURE) {
- /*
- * Doesn't have the magic number for relocatable executables. If
- * filename ends with .com, assume it's a DOS application anyhow.
- * Note that we didn't make this assumption at first, because some
- * supposed .com files are really 32-bit executables with all the
- * magic numbers and everything.
- */
-
- CloseHandle(hFile);
- if ((ext != NULL) && (lstrcmpi(ext, TEXT(".com")) == 0)) {
- applType = EXP_APPL_DOS;
- break;
- }
- continue;
- }
- if (header.e_lfarlc != sizeof(header)) {
- /*
- * All Windows 3.X and Win32 and some DOS programs have this value
- * set here. If it doesn't, assume that since it already had the
- * other magic number it was a DOS application.
- */
-
- CloseHandle(hFile);
- applType = EXP_APPL_DOS;
- break;
- }
-
- /*
- * The DWORD at header.e_lfanew points to yet another magic number.
- */
-
- buf[0] = '\0';
- SetFilePointer(hFile, header.e_lfanew, NULL, FILE_BEGIN);
- ReadFile(hFile, (void *) buf, 2, &read, NULL);
- CloseHandle(hFile);
-
- if ((buf[0] == 'L') && (buf[1] == 'E')) {
- applType = EXP_APPL_DOS;
- } else if ((buf[0] == 'N') && (buf[1] == 'E')) {
- applType = EXP_APPL_WIN3X;
- } else if ((buf[0] == 'P') && (buf[1] == 'E')) {
- applType = EXP_APPL_WIN32;
- } else {
- continue;
- }
- break;
- }
-
- if (applType == EXP_APPL_NONE) {
- return EXP_APPL_NONE;
- }
-
- if ((applType == EXP_APPL_DOS) || (applType == EXP_APPL_WIN3X)) {
- /*
- * Replace long path name of executable with short path name for
- * 16-bit applications. Otherwise the application may not be able
- * to correctly parse its own command line to separate off the
- * application name from the arguments.
- */
-
- GetShortPathName(fullPath, fullPath, MAX_PATH);
- }
- return applType;
-}
-#endif /* XXX */
-