| 3147 | //CHAR8 data3ATH[] = {0x6B, 0x10, 0x00, 0x00}; |
| 3148 | |
| 3149 | UINT32 FIXAirport (UINT8 *dsdt, UINT32 len) |
| 3150 | { |
| 3151 | UINT32 i, k; |
| 3152 | UINT32 ArptADR = 0, BridgeSize, Size, BrdADR = 0; |
| 3153 | UINT32 PCIADR, PCISIZE = 0; |
| 3154 | INT32 sizeoffset; |
| 3155 | AML_CHUNK *met, *met2; |
| 3156 | AML_CHUNK* brd; |
| 3157 | AML_CHUNK* root; |
| 3158 | AML_CHUNK* pack; |
| 3159 | AML_CHUNK* dev; |
| 3160 | CHAR8 *network; |
| 3161 | UINT32 FakeID = 0; |
| 3162 | UINT32 FakeVen = 0; |
| 3163 | CHAR8 NameCard[32]; |
| 3164 | |
| 3165 | if (!ArptADR1) return len; // no device - no patch |
| 3166 | if ( gSettings.AirportBridgeDeviceName.notEmpty() && gSettings.AirportBridgeDeviceName.length() != 4 ) { |
| 3167 | MsgLog("AirportBridgeDeviceName must be 4 char long : ignored"); |
| 3168 | gSettings.AirportBridgeDeviceName.setEmpty(); |
| 3169 | } |
| 3170 | |
| 3171 | if (gSettings.FakeWIFI) { |
| 3172 | FakeID = gSettings.FakeWIFI >> 16; |
| 3173 | FakeVen = gSettings.FakeWIFI & 0xFFFF; |
| 3174 | snprintf(NameCard, 32, "pci%x,%x", FakeVen, FakeID); |
| 3175 | } |
| 3176 | |
| 3177 | PCIADR = GetPciDevice(dsdt, len); |
| 3178 | if (PCIADR) { |
| 3179 | PCISIZE = get_size(dsdt, PCIADR); |
| 3180 | } |
| 3181 | if (!PCISIZE) return len; //what is the bad DSDT ?! |
| 3182 | |
| 3183 | DBG("Start Airport Fix\n"); |
| 3184 | ArptName = FALSE; |
| 3185 | for (i=0x20; len >= 10 && i < len - 10; i++) { |
| 3186 | // AirPort Address |
| 3187 | if ( CmpAdr(dsdt, i, ArptADR1) || (gSettings.AirportBridgeDeviceName.notEmpty() && CmpDev(dsdt, i, gSettings.AirportBridgeDeviceName)) ) { |
| 3188 | BrdADR = devFind(dsdt, i); |
| 3189 | if (!BrdADR) { |
| 3190 | continue; |
| 3191 | } |
| 3192 | BridgeSize = get_size(dsdt, BrdADR); |
| 3193 | if(!BridgeSize) continue; |
| 3194 | if (ArptADR2 != 0xFFFE){ |
| 3195 | for (k = BrdADR + 9; k < BrdADR + BridgeSize; k++) { |
| 3196 | if (CmpAdr(dsdt, k, ArptADR2)) { |
| 3197 | ArptADR = devFind(dsdt, k); |
| 3198 | if (!ArptADR) { |
| 3199 | continue; |
| 3200 | } |
| 3201 | device_name[9] = (__typeof_am__(device_name[9]))AllocateZeroPool(5); |
| 3202 | CopyMem(device_name[9], dsdt+k, 4); |
| 3203 | DBG("found Airport device [%08X:%X] at %X And Name is %s\n", |
| 3204 | ArptADR1, ArptADR2, ArptADR, device_name[9]); |
| 3205 | // ReplaceName(dsdt + BrdADR, BridgeSize, device_name[9], "ARPT"); //sometimes dangeous |
| 3206 | ArptName = TRUE; |
no test coverage detected