new method. by goodwin_c
| 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) |
| 1820 | { |
| 1821 | INT32 adr; |
| 1822 | BOOLEAN found = FALSE; |
| 1823 | UINT32 i, k; |
| 1824 | UINT32 BrdADR = 0, BridgeSize; |
| 1825 | |
| 1826 | if ( ToFind.isEmpty() || ToReplace.isEmpty() ) { |
| 1827 | DBG(" invalid patches!\n"); |
| 1828 | return len; |
| 1829 | } |
| 1830 | |
| 1831 | if (ToFind.size() != ToReplace.size()) { |
| 1832 | DBG(" find/replace different size!\n"); |
| 1833 | return len; |
| 1834 | } |
| 1835 | |
| 1836 | DBG(" pattern %02hhX%02hhX%02hhX%02hhX,", ToFind[0], ToFind[1], ToFind[2], ToFind[3]); |
| 1837 | if ((ToFind.size() + sizeof(EFI_ACPI_DESCRIPTION_HEADER)) > len) { |
| 1838 | DBG(" the patch is too large!\n"); |
| 1839 | return len; |
| 1840 | } |
| 1841 | |
| 1842 | DBG("Start ByBridge Rename Fix\n"); |
| 1843 | for (i=0x20; len >= 10 && i < len - 10; i++) { |
| 1844 | if (CmpDev(dsdt, i, TgtBrgName)) { |
| 1845 | BrdADR = devFind(dsdt, i); |
| 1846 | if (!BrdADR) { |
| 1847 | continue; |
| 1848 | } |
| 1849 | BridgeSize = get_size(dsdt, BrdADR); |
| 1850 | if(!BridgeSize) continue; |
| 1851 | if(BridgeSize <= ToFind.size()) continue; |
| 1852 | |
| 1853 | k = 0; |
| 1854 | found = FALSE; |
| 1855 | while (k <= 100) { |
| 1856 | adr = FindBin(dsdt + BrdADR, BridgeSize, ToFind); |
| 1857 | if (adr < 0) { |
| 1858 | if (found) { |
| 1859 | DBG(" ]\n"); |
| 1860 | } else { |
| 1861 | DBG(" bin not found / already patched!\n"); |
| 1862 | } |
| 1863 | return len; |
| 1864 | } |
| 1865 | |
| 1866 | if (!found) { |
| 1867 | DBG(" patched at: ["); |
| 1868 | } |
| 1869 | |
| 1870 | DBG(" (%X)", adr); |
| 1871 | found = TRUE; |
| 1872 | if ( ToReplace.notEmpty() ) { |
| 1873 | CopyMem(dsdt + BrdADR + adr, ToReplace.data(), ToReplace.size()); |
| 1874 | } |
| 1875 | k++; |
| 1876 | } |