diff --git a/libmap/Makefile b/libmap/Makefile index e9e48ea..ffd78f2 100644 --- a/libmap/Makefile +++ b/libmap/Makefile @@ -31,7 +31,7 @@ SOURCES = map_bootblock_get_type.c map_bootblock_is_valid.c \ map_set_partition_name.c map_set_partition_type.c map_set_startup.c \ map_write.c map_block0_write.c map_read_sector.c map_checksum.c \ map_write_sector.c map_get_blocksize.c map_init.c map_read_driver.c \ - map_write_driver.c + map_write_driver.c map_update_checksum.c HEADERS = libmap.h diff --git a/libmap/libmap.h b/libmap/libmap.h index c62bb02..25f401d 100644 --- a/libmap/libmap.h +++ b/libmap/libmap.h @@ -188,4 +188,5 @@ extern unsigned short map_checksum(unsigned char *addr, unsigned int length); extern unsigned short map_checksum_ATA(unsigned char *addr, unsigned int length); extern char *map_read_driver(map_t *map, int driver_number); extern int map_write_driver(map_t *map, int driver_number, char *driver); +extern int map_update_checksum(map_t *map, int driver_number); #endif diff --git a/libmap/map_update_checksum.c b/libmap/map_update_checksum.c new file mode 100644 index 0000000..87e44e7 --- /dev/null +++ b/libmap/map_update_checksum.c @@ -0,0 +1,36 @@ +#include + +#include "libmap.h" + +int map_update_checksum(map_t *map, int driver_number) +{ + char *driver; + int blocksize; + int block; + int part; + int length, checksum; + int ret; + + driver = map_read_driver(map, driver_number); + if (driver == NULL) + return -1; + + blocksize = map_get_blocksize(map); + block = read_long((u_int32_t*)&map->drivers.DrvInfo[driver_number].Block); + + part = map_seek_driver_partition(map, block * blocksize / 512); + + map_read(map, part); + + length = read_long((u_int32_t*)&map->partition.BootSize); + checksum = map_checksum((unsigned char*)driver, length); + write_long((u_int32_t*)&map->partition.BootCksum, checksum); + + free(driver); + + ret = map_write(map, part); + if (ret != part) + return -1; + + return 0; +}