| 641 | } |
| 642 | |
| 643 | BITMAPFILEHEADER* LoadImageEx(LPCWSTR asImgPath, BY_HANDLE_FILE_INFORMATION& inf) |
| 644 | { |
| 645 | BITMAPFILEHEADER* pBkImgData = nullptr; |
| 646 | HANDLE hFile = CreateFile(asImgPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, nullptr); |
| 647 | |
| 648 | if (hFile != INVALID_HANDLE_VALUE) |
| 649 | { |
| 650 | BOOL lbIsBmpFile = FALSE, lbFileIsValid = FALSE; |
| 651 | |
| 652 | if (GetFileInformationByHandle(hFile, &inf) && inf.nFileSizeHigh == 0 |
| 653 | && inf.nFileSizeLow >= (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO))) //-V119 |
| 654 | { |
| 655 | lbFileIsValid = TRUE; |
| 656 | |
| 657 | BYTE bm[2]; |
| 658 | DWORD nRead; |
| 659 | if (ReadFile(hFile, bm, sizeof(bm), &nRead, nullptr) && nRead == 2 && (bm[0] == 'B' && bm[1] == 'M')) |
| 660 | { |
| 661 | lbIsBmpFile = TRUE; |
| 662 | |
| 663 | pBkImgData = (BITMAPFILEHEADER*)malloc(inf.nFileSizeLow); |
| 664 | if (!pBkImgData) |
| 665 | { |
| 666 | _ASSERTE(pBkImgData!=nullptr); |
| 667 | CloseHandle(hFile); |
| 668 | return nullptr; |
| 669 | } |
| 670 | BYTE *pBuf = (BYTE*)pBkImgData; |
| 671 | memmove(pBkImgData, bm, sizeof(bm)); |
| 672 | |
| 673 | if (pBkImgData && ReadFile(hFile, pBuf+sizeof(bm), inf.nFileSizeLow-sizeof(bm), &inf.nFileSizeLow, nullptr)) |
| 674 | { |
| 675 | inf.nFileSizeLow += sizeof(bm); // BM |
| 676 | |
| 677 | if (pBuf[0] == 'B' && pBuf[1] == 'M' && *(uint32_t*)(pBuf + 0x0A) >= 0x36 && *(uint32_t*)(pBuf + 0x0A) <= 0x436 && *(uint32_t*)(pBuf + 0x0E) == 0x28 && !pBuf[0x1D] && !*(uint32_t*)(pBuf + 0x1E)) |
| 678 | { |
| 679 | // OK |
| 680 | } |
| 681 | else |
| 682 | { |
| 683 | free(pBkImgData); |
| 684 | pBkImgData = nullptr; |
| 685 | } |
| 686 | } |
| 687 | } |
| 688 | } |
| 689 | CloseHandle(hFile); |
| 690 | |
| 691 | if (!pBkImgData && lbFileIsValid && !lbIsBmpFile) |
| 692 | { |
| 693 | // Если это не BMP - попытаться через GDI+ |
| 694 | pBkImgData = LoadImageGdip(asImgPath); |
| 695 | } |
| 696 | } |
| 697 | |
| 698 | return pBkImgData; |
| 699 | } |
| 700 |
no test coverage detected