Changeset 4015 for trunk/src


Ignore:
Timestamp:
Aug 14, 2000, 9:15:37 PM (25 years ago)
Author:
sandervl
Message:

TLS fix in PE loader

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/winimagepeldr.cpp

    r3993 r4015  
    1 /* $Id: winimagepeldr.cpp,v 1.52 2000-08-11 10:56:19 sandervl Exp $ */
     1/* $Id: winimagepeldr.cpp,v 1.53 2000-08-14 19:15:37 sandervl Exp $ */
    22
    33/*
     
    400400  }
    401401  dprintf((LOG, "*************************PE SECTIONS END **************************" ));
     402
    402403  imageSize += imageVirtBase - oh.ImageBase;
    403404  dprintf((LOG, "Total size of Image %x", imageSize ));
     
    431432  if(loadType == REAL_LOAD)
    432433  {
    433    if(tlsDir != NULL) {
    434     Section *sect = findSection(SECTION_TLS);
    435 
    436         if(sect == NULL) {
    437                 dprintf((LOG, "Couldn't find TLS section!!" ));
    438                 goto failure;
    439         }
     434   if(tlsDir = (IMAGE_TLS_DIRECTORY *)ImageDirectoryOffset(win32file, IMAGE_DIRECTORY_ENTRY_TLS))
     435   {
     436        Section *sect = findSectionByAddr(tlsDir->StartAddressOfRawData);
     437
    440438        dprintf((LOG, "TLS Directory" ));
    441439        dprintf((LOG, "TLS Address of Index     %x", tlsDir->AddressOfIndex ));
     
    443441        dprintf((LOG, "TLS SizeOfZeroFill       %x", tlsDir->SizeOfZeroFill ));
    444442        dprintf((LOG, "TLS Characteristics      %x", tlsDir->Characteristics ));
     443        if(sect == NULL) {
     444                dprintf((LOG, "Couldn't find TLS section!!" ));
     445                goto failure;
     446        }
    445447        setTLSAddress((char *)sect->realvirtaddr);
    446448        setTLSInitSize(tlsDir->EndAddressOfRawData - tlsDir->StartAddressOfRawData);
     
    463465        }
    464466   }
     467
     468#ifdef DEBUG
     469   dprintf((LOG, "Image directories: "));
     470   for (i = 0; i < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; i++)
     471   {
     472        char *pszName;
     473
     474        switch (i)
     475        {
     476                case IMAGE_DIRECTORY_ENTRY_EXPORT:      pszName = "Export Directory (IMAGE_DIRECTORY_ENTRY_EXPORT)"; break;
     477                case IMAGE_DIRECTORY_ENTRY_IMPORT:      pszName = "Import Directory (IMAGE_DIRECTORY_ENTRY_IMPORT)"; break;
     478                case IMAGE_DIRECTORY_ENTRY_RESOURCE:    pszName = "Resource Directory (IMAGE_DIRECTORY_ENTRY_RESOURCE)"; break;
     479                case IMAGE_DIRECTORY_ENTRY_EXCEPTION:   pszName = "Exception Directory (IMAGE_DIRECTORY_ENTRY_EXCEPTION)"; break;
     480                case IMAGE_DIRECTORY_ENTRY_SECURITY:    pszName = "Security Directory (IMAGE_DIRECTORY_ENTRY_SECURITY)"; break;
     481                case IMAGE_DIRECTORY_ENTRY_BASERELOC:   pszName = "Base Relocation Table (IMAGE_DIRECTORY_ENTRY_BASERELOC)"; break;
     482                case IMAGE_DIRECTORY_ENTRY_DEBUG:       pszName = "Debug Directory (IMAGE_DIRECTORY_ENTRY_DEBUG)"; break;
     483                case IMAGE_DIRECTORY_ENTRY_COPYRIGHT:   pszName = "Description String (IMAGE_DIRECTORY_ENTRY_COPYRIGHT)"; break;
     484                case IMAGE_DIRECTORY_ENTRY_GLOBALPTR:   pszName = "Machine Value (MIPS GP) (IMAGE_DIRECTORY_ENTRY_GLOBALPTR)"; break;
     485                case IMAGE_DIRECTORY_ENTRY_TLS:         pszName = "TLS Directory (IMAGE_DIRECTORY_ENTRY_TLS)"; break;
     486                case IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG: pszName = "Load Configuration Directory (IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG)"; break;
     487                case IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT:pszName = "Bound Import Directory in headers (IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT)"; break;
     488                case IMAGE_DIRECTORY_ENTRY_IAT:         pszName = "Import Address Table (IMAGE_DIRECTORY_ENTRY_IAT)"; break;
     489                default:
     490                    pszName = "unknown";
     491        }
     492        dprintf((LOG, "directory %s", pszName));
     493        dprintf((LOG, "          Address    0x%08x", oh.DataDirectory[i].VirtualAddress));
     494        dprintf((LOG, "          Size       0x%08x", oh.DataDirectory[i].Size));
     495   }
     496   dprintf((LOG, "\n\n"));
     497#endif
    465498
    466499   if(realBaseAddress != oh.ImageBase) {
Note: See TracChangeset for help on using the changeset viewer.