VirtualBox

Changeset 70802 in vbox for trunk/src/bldprogs


Ignore:
Timestamp:
Jan 30, 2018 4:53:42 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120589
Message:

Makefiles/GAs/Win: Made the WDDM related DLLs Windows Vista+ and the other 3D DLLs W2K+. bugref:9107

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bldprogs/VBoxPeSetVersion.cpp

    r70403 r70802  
    7474    /*
    7575     * Locate and read the PE header.
     76     *
     77     * Note! We'll be reading the 64-bit size even for 32-bit since the difference
     78     *       is 16 bytes, which is less than a section header, so it won't be a problem.
    7679     */
    7780    unsigned long offNtHdrs;
     
    8790    if (fseek(pFile, offNtHdrs, SEEK_SET) != 0)
    8891        return Error("Failed to seek to PE header at %#lx: %s", offNtHdrs, strerror(errno));
    89     IMAGE_NT_HEADERS32 NtHdrs;
     92    union
     93    {
     94        IMAGE_NT_HEADERS32 x32;
     95        IMAGE_NT_HEADERS64 x64;
     96    }   NtHdrs,
     97        NtHdrsNew;
    9098    if (fread(&NtHdrs, sizeof(NtHdrs), 1, pFile) != 1)
    9199        return Error("Failed to read PE header at %#lx: %s", offNtHdrs, strerror(errno));
     
    94102     * Validate it a little bit.
    95103     */
    96     if (NtHdrs.Signature != IMAGE_NT_SIGNATURE)
    97         return Error("Invalid PE signature: %#x", NtHdrs.Signature);
    98     if (NtHdrs.FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
    99         return Error("Not I386 machine: %#x", NtHdrs.FileHeader.Machine);
    100     if (NtHdrs.FileHeader.SizeOfOptionalHeader != sizeof(NtHdrs.OptionalHeader))
    101         return Error("Invalid optional header size: %#x", NtHdrs.FileHeader.SizeOfOptionalHeader);
    102     if (NtHdrs.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
    103         return Error("Invalid optional header magic: %#x", NtHdrs.OptionalHeader.Magic);
     104    if (NtHdrs.x32.Signature != IMAGE_NT_SIGNATURE)
     105        return Error("Invalid PE signature: %#x", NtHdrs.x32.Signature);
     106    uint32_t cbNewHdrs;
     107    if (NtHdrs.x32.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64)
     108    {
     109        if (NtHdrs.x64.FileHeader.SizeOfOptionalHeader != sizeof(NtHdrs.x64.OptionalHeader))
     110            return Error("Invalid optional header size: %#x", NtHdrs.x64.FileHeader.SizeOfOptionalHeader);
     111        if (NtHdrs.x64.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC)
     112            return Error("Invalid optional header magic: %#x", NtHdrs.x64.OptionalHeader.Magic);
     113        if (!uNtVersion)
     114            uNtVersion = MK_VER(5, 2);
     115        else if (uNtVersion < MK_VER(5, 2))
     116            return Error("Selected version is too old for AMD64: %u.%u", uNtVersion >> 8, uNtVersion & 0xff);
     117        cbNewHdrs = sizeof(NtHdrsNew.x64);
     118    }
     119    else if (NtHdrs.x32.FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
     120        return Error("Not I386 or AMD64 machine: %#x", NtHdrs.x32.FileHeader.Machine);
     121    else
     122    {
     123        if (NtHdrs.x32.FileHeader.SizeOfOptionalHeader != sizeof(NtHdrs.x32.OptionalHeader))
     124            return Error("Invalid optional header size: %#x", NtHdrs.x32.FileHeader.SizeOfOptionalHeader);
     125        if (NtHdrs.x32.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
     126            return Error("Invalid optional header magic: %#x", NtHdrs.x32.OptionalHeader.Magic);
     127        if (!uNtVersion)
     128            uNtVersion = MK_VER(3, 10);
     129        cbNewHdrs = sizeof(NtHdrsNew.x32);
     130    }
    104131
    105132    /*
    106133     * Do the header modifications.
    107134     */
    108     IMAGE_NT_HEADERS32 NtHdrsNew = NtHdrs;
    109     NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion = uNtVersion >> 8;
    110     NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion = uNtVersion & 0xff;
    111     NtHdrsNew.OptionalHeader.MajorSubsystemVersion       = uNtVersion >> 8;
    112     NtHdrsNew.OptionalHeader.MinorSubsystemVersion       = uNtVersion & 0xff;
     135    memcpy(&NtHdrsNew, &NtHdrs, sizeof(NtHdrsNew));
     136    NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion = uNtVersion >> 8;
     137    NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion = uNtVersion & 0xff;
     138    NtHdrsNew.x32.OptionalHeader.MajorSubsystemVersion       = uNtVersion >> 8;
     139    NtHdrsNew.x32.OptionalHeader.MinorSubsystemVersion       = uNtVersion & 0xff;
     140    AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MajorOperatingSystemVersion,  IMAGE_NT_HEADERS64, OptionalHeader.MajorOperatingSystemVersion);
     141    AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorOperatingSystemVersion,  IMAGE_NT_HEADERS64, OptionalHeader.MinorOperatingSystemVersion);
     142    AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MajorSubsystemVersion,        IMAGE_NT_HEADERS64, OptionalHeader.MajorSubsystemVersion);
     143    AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorSubsystemVersion,        IMAGE_NT_HEADERS64, OptionalHeader.MinorSubsystemVersion);
    113144
    114145    if (uNtVersion <= MK_VER(3, 50))
    115146    {
    116         NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion = 1;
    117         NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion = 0;
     147        NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion = 1;
     148        NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion = 0;
     149        AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MajorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MajorOperatingSystemVersion);
     150        AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MinorOperatingSystemVersion);
    118151    }
    119152
     
    121154    {
    122155        /** @todo calc checksum. */
    123         NtHdrsNew.OptionalHeader.CheckSum = 0;
    124 
    125         if (   NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion != NtHdrs.OptionalHeader.MajorOperatingSystemVersion
    126             || NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion != NtHdrs.OptionalHeader.MinorOperatingSystemVersion)
     156        NtHdrsNew.x32.OptionalHeader.CheckSum = 0;
     157        AssertCompileMembersAtSameOffset(IMAGE_NT_HEADERS32, OptionalHeader.MinorOperatingSystemVersion, IMAGE_NT_HEADERS64, OptionalHeader.MinorOperatingSystemVersion);
     158
     159        if (   NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion != NtHdrs.x32.OptionalHeader.MajorOperatingSystemVersion
     160            || NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion != NtHdrs.x32.OptionalHeader.MinorOperatingSystemVersion)
    127161            Info(1,"OperatingSystemVersion %u.%u -> %u.%u",
    128                  NtHdrs.OptionalHeader.MajorOperatingSystemVersion, NtHdrs.OptionalHeader.MinorOperatingSystemVersion,
    129                  NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion, NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion);
    130         if (   NtHdrsNew.OptionalHeader.MajorSubsystemVersion != NtHdrs.OptionalHeader.MajorSubsystemVersion
    131             || NtHdrsNew.OptionalHeader.MinorSubsystemVersion != NtHdrs.OptionalHeader.MinorSubsystemVersion)
     162                 NtHdrs.x32.OptionalHeader.MajorOperatingSystemVersion, NtHdrs.x32.OptionalHeader.MinorOperatingSystemVersion,
     163                 NtHdrsNew.x32.OptionalHeader.MajorOperatingSystemVersion, NtHdrsNew.x32.OptionalHeader.MinorOperatingSystemVersion);
     164        if (   NtHdrsNew.x32.OptionalHeader.MajorSubsystemVersion != NtHdrs.x32.OptionalHeader.MajorSubsystemVersion
     165            || NtHdrsNew.x32.OptionalHeader.MinorSubsystemVersion != NtHdrs.x32.OptionalHeader.MinorSubsystemVersion)
    132166            Info(1,"SubsystemVersion %u.%u -> %u.%u",
    133                  NtHdrs.OptionalHeader.MajorSubsystemVersion, NtHdrs.OptionalHeader.MinorSubsystemVersion,
    134                  NtHdrsNew.OptionalHeader.MajorSubsystemVersion, NtHdrsNew.OptionalHeader.MinorSubsystemVersion);
     167                 NtHdrs.x32.OptionalHeader.MajorSubsystemVersion, NtHdrs.x32.OptionalHeader.MinorSubsystemVersion,
     168                 NtHdrsNew.x32.OptionalHeader.MajorSubsystemVersion, NtHdrsNew.x32.OptionalHeader.MinorSubsystemVersion);
    135169
    136170        if (fseek(pFile, offNtHdrs, SEEK_SET) != 0)
    137171            return Error("Failed to seek to PE header at %#lx: %s", offNtHdrs, strerror(errno));
    138         if (fwrite(&NtHdrsNew, sizeof(NtHdrsNew), 1, pFile) != 1)
     172        if (fwrite(&NtHdrsNew, cbNewHdrs, 1, pFile) != 1)
    139173            return Error("Failed to write PE header at %#lx: %s", offNtHdrs, strerror(errno));
    140174    }
     
    148182     */
    149183    if (   uNtVersion <= MK_VER(3, 10)
    150         && NtHdrsNew.FileHeader.NumberOfSections > 0)
    151     {
    152         uint32_t              cbShdrs = sizeof(IMAGE_SECTION_HEADER) * NtHdrsNew.FileHeader.NumberOfSections;
     184        && NtHdrsNew.x32.FileHeader.NumberOfSections > 0)
     185    {
     186        uint32_t              cbShdrs = sizeof(IMAGE_SECTION_HEADER) * NtHdrsNew.x32.FileHeader.NumberOfSections;
    153187        PIMAGE_SECTION_HEADER paShdrs = (PIMAGE_SECTION_HEADER)calloc(1, cbShdrs);
    154188        if (!paShdrs)
     
    158192        unsigned long offShdrs = offNtHdrs
    159193                               + RT_UOFFSETOF(IMAGE_NT_HEADERS32,
    160                                               OptionalHeader.DataDirectory[NtHdrsNew.OptionalHeader.NumberOfRvaAndSizes]);
     194                                              OptionalHeader.DataDirectory[NtHdrsNew.x32.OptionalHeader.NumberOfRvaAndSizes]);
    161195        if (fseek(pFile, offShdrs, SEEK_SET) != 0)
    162196            return Error("Failed to seek to section headers at %#lx: %s", offShdrs, strerror(errno));
     
    165199
    166200        bool     fFoundBss = false;
    167         uint32_t uRvaEnd   = NtHdrsNew.OptionalHeader.SizeOfImage;
    168         uint32_t uRvaIat   = NtHdrsNew.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size > 0
    169                            ? NtHdrsNew.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress : UINT32_MAX;
    170         uint32_t i         = NtHdrsNew.FileHeader.NumberOfSections;
     201        uint32_t uRvaEnd   = NtHdrsNew.x32.OptionalHeader.SizeOfImage;
     202        uint32_t uRvaIat   = NtHdrsNew.x32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size > 0
     203                           ? NtHdrsNew.x32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress : UINT32_MAX;
     204        uint32_t i         = NtHdrsNew.x32.FileHeader.NumberOfSections;
    171205        while (i-- > 0)
    172206            if (!(paShdrs[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD))
     
    240274     * This stucks
    241275     */
    242     unsigned    uNtVersion     = MK_VER(3,10);
     276    unsigned    uNtVersion     = 0;
    243277    const char *pszFilename    = NULL;
    244278    bool        fAcceptOptions = true;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette