| 1596 | } |
| 1597 | |
| 1598 | BOOL CImage::Write(HANDLE hFile) |
| 1599 | { |
| 1600 | DWORD cbDone; |
| 1601 | |
| 1602 | if (hFile == INVALID_HANDLE_VALUE) { |
| 1603 | SetLastError(ERROR_INVALID_HANDLE); |
| 1604 | return FALSE; |
| 1605 | } |
| 1606 | |
| 1607 | m_nNextFileAddr = 0; |
| 1608 | m_nNextVirtAddr = 0; |
| 1609 | |
| 1610 | DWORD nTables = 0; |
| 1611 | DWORD nThunks = 0; |
| 1612 | DWORD nChars = 0; |
| 1613 | BOOL fNeedDetourSection = CheckImportsNeeded(&nTables, &nThunks, &nChars); |
| 1614 | |
| 1615 | //////////////////////////////////////////////////////////// Copy Headers. |
| 1616 | // |
| 1617 | if (SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == ~0u) { |
| 1618 | return FALSE; |
| 1619 | } |
| 1620 | if (!CopyFileData(hFile, 0, m_NtHeader.OptionalHeader.SizeOfHeaders)) { |
| 1621 | return FALSE; |
| 1622 | } |
| 1623 | |
| 1624 | if (fNeedDetourSection || !m_pImageData->IsEmpty()) { |
| 1625 | // Replace the file's DOS header with our own. |
| 1626 | m_nPeOffset = sizeof(m_DosHeader) + sizeof(s_rbDosCode); |
| 1627 | m_nSectionsOffset = m_nPeOffset |
| 1628 | + sizeof(m_NtHeader.Signature) |
| 1629 | + sizeof(m_NtHeader.FileHeader) |
| 1630 | + m_NtHeader.FileHeader.SizeOfOptionalHeader; |
| 1631 | m_DosHeader.e_lfanew = m_nPeOffset; |
| 1632 | |
| 1633 | if (SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == ~0u) { |
| 1634 | return FALSE; |
| 1635 | } |
| 1636 | if (!WriteFile(hFile, &m_DosHeader, sizeof(m_DosHeader), &cbDone)) { |
| 1637 | return FALSE; |
| 1638 | } |
| 1639 | if (!WriteFile(hFile, &s_rbDosCode, sizeof(s_rbDosCode), &cbDone)) { |
| 1640 | return FALSE; |
| 1641 | } |
| 1642 | } |
| 1643 | else { |
| 1644 | // Restore the file's original DOS header. |
| 1645 | if (m_nPrePE != 0) { |
| 1646 | m_nPeOffset = m_cbPrePE; |
| 1647 | m_nSectionsOffset = m_nPeOffset |
| 1648 | + sizeof(m_NtHeader.Signature) |
| 1649 | + sizeof(m_NtHeader.FileHeader) |
| 1650 | + m_NtHeader.FileHeader.SizeOfOptionalHeader; |
| 1651 | m_DosHeader.e_lfanew = m_nPeOffset; |
| 1652 | |
| 1653 | |
| 1654 | if (SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == ~0u) { |
| 1655 | return FALSE; |
no test coverage detected