| 1021 | } |
| 1022 | |
| 1023 | BOOL CImage::Read(HANDLE hFile) |
| 1024 | { |
| 1025 | DWORD n; |
| 1026 | PBYTE pbData = NULL; |
| 1027 | DWORD cbData = 0; |
| 1028 | |
| 1029 | if (hFile == INVALID_HANDLE_VALUE) { |
| 1030 | SetLastError(ERROR_INVALID_HANDLE); |
| 1031 | return FALSE; |
| 1032 | } |
| 1033 | |
| 1034 | ///////////////////////////////////////////////////////// Create mapping. |
| 1035 | // |
| 1036 | m_nFileSize = GetFileSize(hFile, NULL); |
| 1037 | if (m_nFileSize == (DWORD)-1) { |
| 1038 | return FALSE; |
| 1039 | } |
| 1040 | |
| 1041 | m_hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL); |
| 1042 | if (m_hMap == NULL) { |
| 1043 | return FALSE; |
| 1044 | } |
| 1045 | |
| 1046 | m_pMap = (PBYTE)MapViewOfFileEx(m_hMap, FILE_MAP_READ, 0, 0, 0, NULL); |
| 1047 | if (m_pMap == NULL) { |
| 1048 | return FALSE; |
| 1049 | } |
| 1050 | |
| 1051 | ////////////////////////////////////////////////////// Process DOS Header. |
| 1052 | // |
| 1053 | PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)m_pMap; |
| 1054 | if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { |
| 1055 | SetLastError(ERROR_BAD_EXE_FORMAT); |
| 1056 | return FALSE; |
| 1057 | } |
| 1058 | m_nPeOffset = pDosHeader->e_lfanew; |
| 1059 | m_nPrePE = 0; |
| 1060 | m_cbPrePE = QuadAlign(pDosHeader->e_lfanew); |
| 1061 | |
| 1062 | if (m_nPeOffset > m_nFileSize || |
| 1063 | m_nPeOffset + sizeof(m_NtHeader) > m_nFileSize) { |
| 1064 | |
| 1065 | SetLastError(ERROR_BAD_EXE_FORMAT); |
| 1066 | return FALSE; |
| 1067 | } |
| 1068 | |
| 1069 | CopyMemory(&m_DosHeader, m_pMap + m_nPrePE, sizeof(m_DosHeader)); |
| 1070 | |
| 1071 | /////////////////////////////////////////////////////// Process PE Header. |
| 1072 | // |
| 1073 | CopyMemory(&m_NtHeader, m_pMap + m_nPeOffset, sizeof(m_NtHeader)); |
| 1074 | if (m_NtHeader.Signature != IMAGE_NT_SIGNATURE) { |
| 1075 | SetLastError(ERROR_INVALID_EXE_SIGNATURE); |
| 1076 | return FALSE; |
| 1077 | } |
| 1078 | if (m_NtHeader.FileHeader.SizeOfOptionalHeader == 0) { |
| 1079 | SetLastError(ERROR_EXE_MARKED_INVALID); |
| 1080 | return FALSE; |
no test coverage detected