char rBuf[208 * 512] = {0}; static int dev_reset(void) { char *dev_file = "(hd0,2,a)+2048"; grub_file_t file; grub_disk_t disk; grub_disk_addr_t part_start = 0; grub_disk_addr_t bt_sector = 0; unsigned bt_offset = 0; unsigned bt_length = 0; auto void NESTED_FUNC_ATTR read_hook (grub_disk_addr_t sector, unsigned offset, unsigned length); void NESTED_FUNC_ATTR read_hook (grub_disk_addr_t sector, unsigned offset, unsigned length) { if( bt_sector == 0 ) { bt_sector = sector; bt_offset = offset; bt_length = length; grub_printf("bt_sector = %llu\nbt_offset = %u\nbt_length = %u\n", bt_sector, bt_offset, bt_length); } else { grub_dprintf("bsd", "%s:%s:%d Still more...!\n", __FILE__, __FUNCTION__, __LINE__); } } file = grub_file_open(dev_file); if( !file ) { grub_printf("Error: Unable to open '%s' .\n", dev_file); return grub_errno; } if( ! file->device->disk ) { grub_printf("disk device required!\n"); return grub_errno; } file->read_hook = read_hook; grub_file_read(file, rBuf, sizeof(rBuf)); file->read_hook = 0; disk = file->device->disk; grub_printf("File size: %llu\ntotal_sectors = %llu", file->size, disk->total_sectors); if( disk->partition ) part_start = grub_partition_get_start(disk->partition); else part_start = 0; grub_printf("%s[%d]: %llu\n", __FUNCTION__, __LINE__, part_start); if( bt_sector > part_start ) { part_start = bt_sector - part_start; } grub_printf("%s[%d]: %llu\n", __FUNCTION__, __LINE__, part_start); { int i=0; do { grub_printf("%x ",rBuf[i++]); } while(i<512); } grub_memset(nvbuf, 0, SECTOR_SIZE); if(grub_disk_write(disk, part_start, 0, SECTOR_SIZE, nvbuf) ) { grub_printf("%s %s:%d Disk write error!\n", __FILE__, __FUNCTION__, __LINE__); grub_printf("disk = %x\n part_start = %llu\n", (unsigned int)disk, part_start); } else grub_dprintf("bsd", "Device reset done!"); grub_file_close(file); return grub_errno; }