| 1768 | } |
| 1769 | |
| 1770 | UINT32 FixAny (UINT8* dsdt, UINT32 len, const XBuffer<UINT8> ToFind, const XBuffer<UINT8> ToReplace) |
| 1771 | { |
| 1772 | size_t sizeoffset; |
| 1773 | INT32 adr; |
| 1774 | UINT32 i; |
| 1775 | BOOLEAN found = FALSE; |
| 1776 | if ( ToFind.isEmpty() || ToReplace.isEmpty() ) { |
| 1777 | DBG(" invalid patches!\n"); |
| 1778 | return len; |
| 1779 | } |
| 1780 | MsgLog(" pattern %02hhX%02hhX%02hhX%02hhX,", ToFind[0], ToFind[1], ToFind[2], ToFind[3]); |
| 1781 | if ((ToFind.size() + sizeof(EFI_ACPI_DESCRIPTION_HEADER)) > len) { |
| 1782 | MsgLog(" the patch is too large!\n"); |
| 1783 | return len; |
| 1784 | } |
| 1785 | sizeoffset = ToReplace.size() - ToFind.size(); |
| 1786 | if ( sizeoffset > MAX_INT32 ) { |
| 1787 | DBG(" invalid patches (sizeoffset > MAX_INT32)!\n"); |
| 1788 | return len; |
| 1789 | } |
| 1790 | for (i = 20; i < len; ) { |
| 1791 | adr = FindBin(dsdt + i, len - i, ToFind); |
| 1792 | if (adr < 0) { |
| 1793 | if (found) { |
| 1794 | MsgLog(" ]\n"); |
| 1795 | } else { |
| 1796 | MsgLog(" bin not found / already patched!\n"); |
| 1797 | } |
| 1798 | return len; |
| 1799 | } |
| 1800 | |
| 1801 | if (!found) { |
| 1802 | MsgLog(" patched at: ["); |
| 1803 | MsgLog(" (%X)", adr); //print once because whole duration is 26 seconds!!! |
| 1804 | } |
| 1805 | |
| 1806 | // MsgLog(" (%X)", adr); |
| 1807 | found = TRUE; |
| 1808 | len = move_data(adr + i, dsdt, len, (INT32)sizeoffset); // safe cast, sizeoffset > MAX_INT32 |
| 1809 | CopyMem(dsdt + adr + i, ToReplace.data(), ToReplace.size()); |
| 1810 | len = CorrectOuterMethod(dsdt, len, adr + i - 2, (INT32)sizeoffset); // safe cast, sizeoffset > MAX_INT32 |
| 1811 | len = CorrectOuters(dsdt, len, adr + i - 3, (INT32)sizeoffset); // safe cast, sizeoffset > MAX_INT32 |
| 1812 | i += adr + ToReplace.size(); |
| 1813 | } |
| 1814 | MsgLog(" ]\n"); //should not be here |
| 1815 | return len; |
| 1816 | } |
| 1817 | |
| 1818 | //new method. by goodwin_c |
| 1819 | UINT32 FixRenameByBridge2 (UINT8* dsdt, UINT32 len, const XBuffer<UINT8>& TgtBrgName, const XBuffer<UINT8>& ToFind, const XBuffer<UINT8>& ToReplace) |
no test coverage detected