From d64e1b5b51dc1210ed25530ae2f85eadd3f18f95 Mon Sep 17 00:00:00 2001 From: David Kilroy Date: Mon, 27 Oct 2008 20:55:03 +0000 Subject: [PATCH] Read AP fw ident better from hfwget --- hfwget.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/hfwget.c b/hfwget.c index 9b9f2fc..b00e747 100644 --- a/hfwget.c +++ b/hfwget.c @@ -265,6 +265,7 @@ static const struct { { 22, "Intermediate firmware" }, { 31, "Station firmware" }, { 32, "AP firmware" }, + { 0x14B, "AP firmware" }, /* Driver type */ { 41, "Windows 9x/NT Miniport NDIS 3.1" }, @@ -289,6 +290,7 @@ static const struct { { 81, "WaveLAN/IEEE AP" }, { 83, "WaveLAN/IEEE Ethernet Converter" }, { 87, "USB Boot Loader" }, + { 0xFF, "Unknown" } }; /* Checking endianess at runtime because performance isn't an issue, @@ -710,7 +712,7 @@ static void copy_fw_data(struct fwtable *firmware, printf("Segment: %d File offs: 0x%08x Target mem: 0x%08x " "Length 0x%04x%s\n", i, - (void *)block.w - data, + (void *)(&block.w[i]) - data, firmware->segarray[i].offset, firmware->segarray[i].size, (firmware->segarray[i].size == 0) ? " (ignored)" : ""); @@ -784,13 +786,16 @@ static void print_fw_ident(const struct fwtable *firmware) { size_t i; - if (firmware->ident->code == 0xFD20u) + if ((firmware->ident->code == 0xFD20u) || /* FW_IDENTITY */ + (firmware->ident->code == 0x014Bu)) /* AP_IDENTITY */ { for (i = 0; i < ARRAY_SIZE(compat_table); i++) { if (compat_table[i].id == firmware->ident->comp_id) break; } + if (i == ARRAY_SIZE(compat_table)) + i--; printf("Firmware identity: %s, Variant %d Version %d.%2d\n", compat_table[i].comp_string, @@ -1068,7 +1073,7 @@ static int dump_fw(const char *basename, char hexchar, filename = malloc(strlen(basename) + 12); strcpy(filename, basename); strcat(filename, - (firmware.ident->comp_id == 32) ? "_ap_fw.bin" : "_sta_fw.bin"); + (firmware.ident->comp_id == 31) ? "_sta_fw.bin" : "_ap_fw.bin"); printf("Dumping to %s...\n", filename); if ((output = fopen(filename, "wb")) == NULL) @@ -1115,7 +1120,7 @@ struct fw_layout* detect_fw_layout(const void *data, size_t flen) /* restrict search area */ layout->max_offset = (size_t) (be32_to_host(fw_section->offset) + be32_to_host(fw_section->size)); - layout->mac = mac; + layout->mac = mac; } else if (macho == -1) { @@ -1133,7 +1138,7 @@ struct fw_layout* detect_fw_layout(const void *data, size_t flen) layout->addr_delta = (ptrdiff_t) pe_imagebase(data); layout->max_offset = flen; - layout->mac = mac; + layout->mac = mac; } else if (memcmp(data, "Joy!", 4) == 0) { -- 2.11.4.GIT