- Timestamp:
- Apr 15, 2000, 12:56:11 AM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/peldr/pe.cpp
r3374 r3376 1 /* $Id: pe.cpp,v 1.1 5 2000-04-13 18:54:41 sandervl Exp $ */1 /* $Id: pe.cpp,v 1.16 2000-04-14 22:56:11 sandervl Exp $ */ 2 2 3 3 /* … … 38 38 char szInteralErrorMsg[]= "Internal Error"; 39 39 char szNoKernel32Msg[] = "Can't load/find kernel32.dll (rc=%d)"; 40 char szDosInfoBlocks[] = "DosInfoBlocks failed!"; 40 41 41 42 char fullpath[CCHMAXPATH]; … … 62 63 63 64 //should be the same as in ..\kernel32\winexepeldr.h 64 typedef BOOL (* WIN32API WIN32CTOR)(char *, ULONG);65 typedef BOOL (* WIN32API WIN32CTOR)(char *, char *, ULONG); 65 66 66 67 WIN32CTOR CreateWin32Exe = 0; … … 77 78 HMQ hmq = 0; /* Message queue handle */ 78 79 char exeName[CCHMAXPATH]; 80 char fullpath[CCHMAXPATH]; 79 81 APIRET rc; 80 82 HMODULE hmodPMWin = 0, hmodKernel32 = 0; 83 PTIB ptib; 84 PPIB ppib; 85 char *cmdline, *win32cmdline; 81 86 82 87 if(argc >= 2) { 83 strcpy(exeName, argv[1]); 84 strupr(exeName); 88 if(DosGetInfoBlocks(&ptib, &ppib) == 0) { 89 cmdline = ppib->pib_pchcmd; 90 cmdline += strlen(cmdline)+1; //skip pe.exe 91 while(*cmdline == ' ') cmdline++; //skip leading space 92 if(*cmdline == '"') cmdline++; 93 win32cmdline = cmdline; 94 95 strncpy(exeName, cmdline, sizeof(exeName)-1); 96 exeName[sizeof(exeName)-1] = 0; 97 strupr(exeName); 98 cmdline = strstr(exeName, ".EXE"); 99 if(cmdline) { 100 cmdline[4] = 0; 101 win32cmdline += ((ULONG)cmdline - (ULONG)exeName) + 4; 102 } 103 else { 104 cmdline = exeName; 105 while(*cmdline && *cmdline != ' ') cmdline++; //skip exe name 106 *cmdline = 0; 107 win32cmdline += ((ULONG)cmdline - (ULONG)exeName); 108 if(strstr(exeName, ".") == NULL) { 109 strcat(exeName, ".EXE"); 110 } 111 } 112 while(*win32cmdline == ' ') win32cmdline++; //skip spaces 113 114 cmdline = exeName + strlen(exeName) - 1; 115 while(*cmdline == ' ') cmdline--; 116 cmdline[1] = 0; 117 if(DosQueryPathInfo(exeName, FIL_QUERYFULLNAME, (PVOID)fullpath, sizeof(fullpath)) == 0) { 118 strcpy(exeName, fullpath); 119 } 120 } 121 else {//should never happen! 122 DebugInt3(); 123 rc = DosLoadModule(exeName, sizeof(exeName), "PMWIN.DLL", &hmodPMWin); 124 rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32MESSAGEBOX, NULL, (PFN *)&MyWinMessageBox); 125 MyWinMessageBox(HWND_DESKTOP, NULL, szDosInfoBlocks, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE); 126 goto fail; 127 } 85 128 AllocateExeMem(exeName); 86 129 } … … 109 152 goto fail; 110 153 } 111 rc = DosQueryProcAddr(hmodKernel32, 0, "_CreateWin32PeLdrExe@8", (PFN *)&CreateWin32Exe); 112 113 strcpy(exeName, argv[1]); 114 strupr(exeName); 115 if(CreateWin32Exe(exeName, reservedMemory) == FALSE) { 154 rc = DosQueryProcAddr(hmodKernel32, 0, "_CreateWin32PeLdrExe@12", (PFN *)&CreateWin32Exe); 155 156 if(CreateWin32Exe(exeName, win32cmdline, reservedMemory) == FALSE) { 116 157 goto fail; 117 158 } … … 154 195 155 196 strcpy(szFileName, filename); 156 tmp = szFileName; 157 while(*tmp != ' ' && *tmp != 0) 158 tmp++; 159 *tmp = 0; 160 161 if(!strchr(szFileName, '.')) { 162 strcat(szFileName,".EXE"); 163 } 197 164 198 rc = DosOpen(szFileName, &dllfile, &action, 0, FILE_READONLY, OPEN_ACTION_OPEN_IF_EXISTS|OPEN_ACTION_FAIL_IF_NEW, OPEN_SHARE_DENYNONE|OPEN_ACCESS_READONLY, NULL); 165 199 if(rc != 0) {
Note:
See TracChangeset
for help on using the changeset viewer.