| Index: base/pe_utils.cc
|
| diff --git a/base/pe_utils.cc b/base/pe_utils.cc
|
| deleted file mode 100644
|
| index ce4ca223fdf19871431a5447b24f4cc780039580..0000000000000000000000000000000000000000
|
| --- a/base/pe_utils.cc
|
| +++ /dev/null
|
| @@ -1,219 +0,0 @@
|
| -// Copyright 2005-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -//
|
| -// Utility functions related to PE files (executables)
|
| -
|
| -#include "omaha/base/pe_utils.h"
|
| -
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/error.h"
|
| -#include "omaha/base/scoped_any.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -namespace {
|
| -
|
| -// Not really necessary as long as running on x86 architecture throughout, but
|
| -// what the hell
|
| -#if defined(BIG_ENDIAN)
|
| -uint32 GetUint32LE(void const * const p) {
|
| - uint8 const * const pu = reinterpret_cast<uint8 const * const>(p);
|
| - uint32 i = pu[0] | pu[1]<<8 | pu[2]<<16 | pu[3]<<24;
|
| - return i;
|
| -}
|
| -
|
| -void PutUint32LE(uint32 i, void * const p) {
|
| - uint8 * const pu = reinterpret_cast<uint8 * const>(p);
|
| - pu[0] = i & 0xff;
|
| - pu[1] = (i >> 8) & 0xff;
|
| - pu[2] = (i >> 16) & 0xff;
|
| - pu[3] = (i >> 24) & 0xff;
|
| -}
|
| -#else // LITTLE_ENDIAN
|
| -inline uint32 GetUint32LE(void const * const p) {
|
| - uint32 const * const pu = reinterpret_cast<uint32 const * const>(p);
|
| - return *pu;
|
| -}
|
| -
|
| -inline void PutUint32LE(uint32 i, void * const p) {
|
| - uint32 * const pu = reinterpret_cast<uint32 * const>(p);
|
| - *pu = i;
|
| -}
|
| -#endif
|
| -
|
| -// Magic PE constants
|
| -const uint32 kPEHeaderOffset = 60;
|
| -const uint32 kPEHeaderChecksumOffset = 88;
|
| -const uint32 kPEHeaderSizeMin = 160;
|
| -const char magic_EXE_header[] = "MZ\0\0";
|
| -const char magic_PE_header[] = "PE\0\0";
|
| -
|
| -} // namespace
|
| -
|
| -HRESULT SetPEChecksum(const TCHAR *filename, uint32 checksum) {
|
| - // Write the checksum field of the Windows NT-specific "optional" header.
|
| - // Use Windows API calls rather than C library calls so that it will be
|
| - // really a small routine when used in the stub executable.
|
| -
|
| - ASSERT(filename, (L""));
|
| -
|
| - scoped_hfile file(::CreateFile(filename,
|
| - GENERIC_READ | GENERIC_WRITE,
|
| - 0,
|
| - NULL,
|
| - OPEN_EXISTING,
|
| - FILE_ATTRIBUTE_NORMAL,
|
| - NULL));
|
| - if (!file)
|
| - return HRESULTFromLastError();
|
| -
|
| - size_t size = ::GetFileSize(get(file), NULL);
|
| - if (size == INVALID_FILE_SIZE)
|
| - return HRESULTFromLastError();
|
| -
|
| - scoped_file_mapping mapping(::CreateFileMapping(get(file),
|
| - NULL,
|
| - PAGE_READWRITE,
|
| - 0,
|
| - 0,
|
| - NULL));
|
| - if (!mapping)
|
| - return HRESULTFromLastError();
|
| -
|
| - scoped_file_view file_data(::MapViewOfFile(get(mapping),
|
| - FILE_MAP_WRITE,
|
| - 0,
|
| - 0,
|
| - size));
|
| - if (!file_data)
|
| - return HRESULTFromLastError();
|
| -
|
| - uint8 * image = reinterpret_cast<uint8 *>(get(file_data));
|
| -
|
| - return SetPEChecksumToBuffer(image, size, checksum);
|
| -}
|
| -
|
| -HRESULT GetPEChecksum(const TCHAR *filename, uint32 * checksum) {
|
| - // Read the checksum field out of the Windows NT-specific "optional" header.
|
| - // Use Windows API calls rather than C library calls so that it will be
|
| - // really a small routine when used in the stub executable.
|
| -
|
| - ASSERT(filename, (L""));
|
| - ASSERT(checksum, (L""));
|
| -
|
| - scoped_hfile file(::CreateFile(filename,
|
| - GENERIC_READ,
|
| - FILE_SHARE_READ,
|
| - NULL,
|
| - OPEN_EXISTING,
|
| - FILE_ATTRIBUTE_READONLY,
|
| - NULL));
|
| - if (!file)
|
| - return HRESULTFromLastError();
|
| -
|
| - size_t size = ::GetFileSize(get(file), NULL);
|
| - if (size == INVALID_FILE_SIZE)
|
| - return HRESULTFromLastError();
|
| -
|
| - scoped_file_mapping mapping(::CreateFileMapping(get(file),
|
| - NULL,
|
| - PAGE_READONLY,
|
| - 0,
|
| - 0,
|
| - NULL));
|
| - if (!mapping)
|
| - return HRESULTFromLastError();
|
| -
|
| - scoped_file_view file_data(::MapViewOfFile(get(mapping),
|
| - FILE_MAP_READ,
|
| - 0,
|
| - 0,
|
| - size));
|
| - if (!file_data)
|
| - return HRESULTFromLastError();
|
| -
|
| - uint8 * image = reinterpret_cast<uint8 *>(get(file_data));
|
| -
|
| - return GetPEChecksumFromBuffer(image, size, checksum);
|
| -}
|
| -
|
| -HRESULT SetPEChecksumToBuffer(uint8 *buffer, size_t size, uint32 checksum) {
|
| - // Sanity checks
|
| - if (size < 64) {
|
| - ASSERT(false, (L"File too short to be valid executable"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - uint32 x = GetUint32LE(magic_EXE_header);
|
| - if (::memcmp(buffer, &x, 2)) {
|
| - ASSERT(false, (L"Missing executable's magic number"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - uint32 peheader = GetUint32LE(buffer + kPEHeaderOffset);
|
| - if (size < peheader + kPEHeaderSizeMin) {
|
| - ASSERT(false, (L"Too small given PE header size"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - x = GetUint32LE(magic_PE_header);
|
| - if (::memcmp(buffer + peheader, &x, 4)) {
|
| - ASSERT(false, (L"Missing PE header magic number"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - // Finally, write the checksum
|
| - PutUint32LE(checksum, &x);
|
| - ::memcpy(buffer + peheader + kPEHeaderChecksumOffset, &x, 4);
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -HRESULT GetPEChecksumFromBuffer(const unsigned char *buffer,
|
| - size_t size,
|
| - uint32 *checksum) {
|
| - // Sanity checks
|
| - if (size < 64) {
|
| - ASSERT(false, (L"File too short to be valid executable"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - uint32 x = GetUint32LE(magic_EXE_header);
|
| - if (::memcmp(buffer, &x, 2)) {
|
| - ASSERT(false, (L"Missing executable's magic number"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - uint32 peheader = GetUint32LE(buffer + kPEHeaderOffset);
|
| - if (size < peheader + kPEHeaderSizeMin) {
|
| - ASSERT(false, (L"Too small given PE header size"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - x = GetUint32LE(magic_PE_header);
|
| - if (::memcmp(buffer + peheader, &x, 4)) {
|
| - ASSERT(false, (L"Missing PE header magic number"));
|
| - return E_FAIL;
|
| - }
|
| -
|
| - // Finally, read the checksum
|
| -
|
| - *checksum = GetUint32LE(buffer + peheader + kPEHeaderChecksumOffset);
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -} // namespace omaha
|
| -
|
|
|