Changeset 9537 for trunk/src/kernel32/winimagepeldr.cpp
- Timestamp:
- Dec 20, 2002, 12:39:43 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/winimagepeldr.cpp
r8918 r9537 1 /* $Id: winimagepeldr.cpp,v 1.10 1 2002-07-26 10:46:56sandervl Exp $ */1 /* $Id: winimagepeldr.cpp,v 1.102 2002-12-20 11:39:42 sandervl Exp $ */ 2 2 3 3 /* … … 66 66 //#endif 67 67 68 char szErrorTitle[] = "Odin"; 69 char szMemErrorMsg[] = "Memory allocation failure"; 70 char szFileErrorMsg[] = "File IO error"; 71 char szPEErrorMsg[] = "Not a valid win32 exe. (perhaps 16 bits windows)"; 72 char szCPUErrorMsg[] = "Executable doesn't run on x86 machines"; 73 char szExeErrorMsg[] = "File isn't an executable"; 74 char szInteralErrorMsg[]= "Internal Error"; 75 char szErrorModule[128] = ""; 68 char szErrorModule[260] = ""; 76 69 77 70 #ifdef DEBUG … … 175 168 //****************************************************************************** 176 169 //****************************************************************************** 177 BOOLWin32PeLdrImage::init(ULONG reservedMem, ULONG ulPEOffset)170 DWORD Win32PeLdrImage::init(ULONG reservedMem, ULONG ulPEOffset) 178 171 { 179 172 LPVOID win32file = NULL; … … 186 179 IMAGE_DOS_HEADER doshdr; 187 180 ULONG signature; 181 DWORD lasterror = LDRERROR_INTERNAL; 188 182 189 183 //offset in executable image where real PE file starts (default 0) … … 199 193 if(ulPEOffset) { 200 194 if(OSLibDosSetFilePtr(hFile, ulPEOffset, OSLIB_SETPTR_FILE_BEGIN) == -1) { 195 lasterror = LDRERROR_INVALID_MODULE; 201 196 goto failure; 202 197 } … … 206 201 strcpy(szErrorModule, OSLibStripPath(szFileName)); 207 202 if(hFile == NULL) { 203 lasterror = LDRERROR_INTERNAL; 208 204 goto failure; 209 205 } 210 206 //read dos header 211 207 if(DosRead(hFile, (LPVOID)&doshdr, sizeof(doshdr), &ulRead)) { 208 lasterror = LDRERROR_INVALID_MODULE; 212 209 goto failure; 213 210 } 214 211 if(OSLibDosSetFilePtr(hFile, ulPEOffset+doshdr.e_lfanew, OSLIB_SETPTR_FILE_BEGIN) == -1) { 212 lasterror = LDRERROR_INVALID_MODULE; 215 213 goto failure; 216 214 } 217 215 //read signature dword 218 216 if(DosRead(hFile, (LPVOID)&signature, sizeof(signature), &ulRead)) { 217 lasterror = LDRERROR_INVALID_MODULE; 219 218 goto failure; 220 219 } 221 220 //read pe header 222 221 if(DosRead(hFile, (LPVOID)&fh, sizeof(fh), &ulRead)) { 222 lasterror = LDRERROR_INVALID_MODULE; 223 223 goto failure; 224 224 } 225 225 //read optional header 226 226 if(DosRead(hFile, (LPVOID)&oh, sizeof(oh), &ulRead)) { 227 lasterror = LDRERROR_INVALID_MODULE; 227 228 goto failure; 228 229 } 229 230 if(doshdr.e_magic != IMAGE_DOS_SIGNATURE || signature != IMAGE_NT_SIGNATURE) { 230 231 dprintf((LOG, "Not a valid PE file (probably a 16 bits windows exe/dll)!")); 231 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szPEErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);232 lasterror = LDRERROR_INVALID_MODULE; 232 233 goto failure; 233 234 } … … 241 242 if(allocSections(reservedMem) == FALSE) { 242 243 dprintf((LOG, "Failed to allocate image memory for %s at %x, rc %d", szFileName, oh.ImageBase, errorState));; 244 lasterror = LDRERROR_MEMORY; 243 245 goto failure; 244 246 } … … 246 248 memmap = new Win32MemMap(this, realBaseAddress, imageSize); 247 249 if(memmap == NULL || !memmap->Init()) { 250 lasterror = LDRERROR_MEMORY; 248 251 goto failure; 249 252 } … … 256 259 if(!(fh.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)) {//not valid 257 260 dprintf((LOG, "Not a valid PE file!")); 258 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szPEErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);261 lasterror = LDRERROR_INVALID_MODULE; 259 262 goto failure; 260 263 } 261 264 if(fh.Machine != IMAGE_FILE_MACHINE_I386) { 262 265 dprintf((LOG, "Doesn't run on x86 processors!")); 263 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szCPUErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);266 lasterror = LDRERROR_INVALID_CPU; 264 267 goto failure; 265 268 } … … 267 270 if(fh.Characteristics & IMAGE_FILE_SYSTEM) { 268 271 dprintf((LOG, "Can't convert system files")); 269 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szExeErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);272 lasterror = LDRERROR_FILE_SYSTEM; 270 273 goto failure; 271 274 } … … 303 306 if(section == NULL) { 304 307 DebugInt3(); 308 lasterror = LDRERROR_MEMORY; 305 309 goto failure; 306 310 } … … 423 427 } 424 428 dprintf((LOG, "Unknown section" )); 429 lasterror = LDRERROR_INVALID_SECTION; 425 430 goto failure; 426 431 } … … 455 460 if(setMemFlags() == FALSE) { 456 461 dprintf((LOG, "Failed to set memory protection" )); 457 goto failure;462 lasterror = LDRERROR_MEMORY; 458 463 } 459 464 … … 486 491 if(sect == NULL) { 487 492 dprintf((LOG, "Couldn't find TLS section!!" )); 493 lasterror = LDRERROR_INVALID_HEADER; 488 494 goto failure; 489 495 } … … 502 508 if(sect == NULL) { 503 509 dprintf((LOG, "Couldn't find TLS AddressOfIndex section!!" )); 510 lasterror = LDRERROR_INVALID_HEADER; 504 511 goto failure; 505 512 } … … 524 531 if(sect == NULL) { 525 532 dprintf((LOG, "Couldn't find TLS AddressOfCallBacks section!!" )); 533 lasterror = LDRERROR_INVALID_HEADER; 526 534 goto failure; 527 535 } … … 547 555 if(sect == NULL) { 548 556 dprintf((LOG, "Couldn't find TLS callback section!!" )); 557 lasterror = LDRERROR_INVALID_HEADER; 549 558 goto failure; 550 559 } … … 609 618 if(processExports((char *)win32file) == FALSE) { 610 619 dprintf((LOG, "Failed to process exported apis" )); 620 lasterror = LDRERROR_EXPORTS; 611 621 goto failure; 612 622 } … … 649 659 if(processImports((char *)win32file) == FALSE) { 650 660 dprintf((LOG, "Failed to process imports!" )); 661 lasterror = LDRERROR_IMPORTS; 651 662 goto failure; 652 663 } 653 664 } 654 return (TRUE);665 return LDRERROR_SUCCESS; 655 666 656 667 failure: … … 664 675 } 665 676 errorState = ERROR_INTERNAL; 666 return FALSE;677 return lasterror; 667 678 } 668 679 //****************************************************************************** … … 1606 1617 if(pedll == NULL) { 1607 1618 dprintf((LOG, "pedll: Error allocating memory" )); 1608 WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szMemErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);1609 1619 errorState = ERROR_INTERNAL; 1610 1620 return NULL; … … 1613 1623 dprintf((LOG, "********************** Loading Module *********************" )); 1614 1624 dprintf((LOG, "**********************************************************************" )); 1615 if(pedll->init(0) == FALSE) {1625 if(pedll->init(0) != LDRERROR_SUCCESS) { 1616 1626 dprintf((LOG, "Internal WinDll error ", pedll->getError() )); 1617 1627 delete pedll; … … 2069 2079 do { 2070 2080 r = WinMessageBox(HWND_DESKTOP, NULLHANDLE, message, 2071 "Internal OdinError", 0, MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION | MB_MOVEABLE);2081 "Internal Error", 0, MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION | MB_MOVEABLE); 2072 2082 } 2073 2083 while(r == MBID_RETRY); //giggle
Note:
See TracChangeset
for help on using the changeset viewer.