static void change_sector(HWND dialog) { struct sectorview_info *info; imgtoolerr_t err; TCHAR buf[32]; UINT32 new_track, new_head, new_sector; info = get_sectorview_info(dialog); GetWindowText(GetDlgItem(dialog, IDC_TRACKEDIT), buf, sizeof(buf) / sizeof(buf[0])); new_track = (UINT32) _ttoi(buf); GetWindowText(GetDlgItem(dialog, IDC_HEADEDIT), buf, sizeof(buf) / sizeof(buf[0])); new_head = (UINT32) _ttoi(buf); GetWindowText(GetDlgItem(dialog, IDC_SECTOREDIT), buf, sizeof(buf) / sizeof(buf[0])); new_sector = (UINT32) _ttoi(buf); if ((info->track != new_track) || (info->head != new_head) || (info->sector != new_sector)) { err = read_sector_data(dialog, new_track, new_head, new_sector); if (err) set_sector_text(dialog); } }
static INT_PTR CALLBACK win_sectorview_dialog_proc(HWND dialog, UINT message, WPARAM wparam, LPARAM lparam) { imgtoolerr_t err; INT_PTR rc = 0; struct sectorview_info *info; RECT dialog_rect; switch(message) { case WM_INITDIALOG: info = (struct sectorview_info *) lparam; info->font = create_font(); GetWindowRect(dialog, &dialog_rect); info->old_width = dialog_rect.right - dialog_rect.left; info->old_height = dialog_rect.bottom - dialog_rect.top; info->track = ~0; info->head = ~0; info->sector = ~0; SendMessage(GetDlgItem(dialog, IDC_HEXVIEW), WM_SETFONT, (WPARAM) info->font, (LPARAM) TRUE); SetWindowLongPtr(dialog, GWLP_USERDATA, lparam); setup_spin_control(dialog, IDC_TRACKSPIN, IDC_TRACKEDIT); setup_spin_control(dialog, IDC_HEADSPIN, IDC_HEADEDIT); setup_spin_control(dialog, IDC_SECTORSPIN, IDC_SECTOREDIT); err = read_sector_data(dialog, 0, 0, 0); if (err == IMGTOOLERR_SEEKERROR) err = read_sector_data(dialog, 0, 0, 1); if (!err) set_sector_text(dialog); break; case WM_DESTROY: info = get_sectorview_info(dialog); if (info->font) { DeleteObject(info->font); info->font = NULL; } break; case WM_SYSCOMMAND: if (wparam == SC_CLOSE) EndDialog(dialog, 0); break; case WM_COMMAND: switch(HIWORD(wparam)) { case BN_CLICKED: switch(LOWORD(wparam)) { case IDOK: case IDCANCEL: EndDialog(dialog, 0); break; } break; case EN_CHANGE: change_sector(dialog); break; } break; case WM_SIZE: info = get_sectorview_info(dialog); GetWindowRect(dialog, &dialog_rect); size_dialog(dialog, sectorview_anchor, (dialog_rect.right - dialog_rect.left) - info->old_width, (dialog_rect.bottom - dialog_rect.top) - info->old_height); info->old_width = dialog_rect.right - dialog_rect.left; info->old_height = dialog_rect.bottom - dialog_rect.top; break; case WM_MOUSEWHEEL: if (HIWORD(wparam) & 0x8000) SendMessage(GetDlgItem(dialog, IDC_HEXVIEW), WM_VSCROLL, SB_LINEDOWN, 0); else SendMessage(GetDlgItem(dialog, IDC_HEXVIEW), WM_VSCROLL, SB_LINEUP, 0); break; } return rc; }
LIBFUNC int vdf_read_sectors(vdf_drive *drv, sector_t sector, sectcnt_t cnt, void *buffer) { ssize_t want, rem; uint8_t *buff = buffer; if(!drive_is_valid(drv)) { errno = EINVAL; return -1; } if(cnt == 0) return 0; rem = cnt; cnt = 0; if(drv->flags & VDF_MBR) { if(sector == 0) { if(read_sector_mbr(drv, buff) == -1) return -1; if(--rem == 0) return 1; buff += drv->bps; cnt = 1; sector++; } if(sector < drv->mbr_sectors) { want = rem; if((sector + rem) >= drv->mbr_sectors) want = drv->mbr_sectors - sector; memset(buff, 0, drv->bps * want); rem -= want; cnt += want; if(rem == 0) return cnt; sector += want; buff += want * drv->bps; } sector -= drv->mbr_sectors; } if(sector < drv->fat1_start) { want = rem; if((sector + rem) >= drv->fat1_start) want = drv->fat1_start - sector; if(read_sector_boot(drv, sector, want, buff) == -1) return -1; rem -= want; cnt += want; if(rem == 0) return cnt; sector += want; buff += want * drv->bps; } if(sector < drv->fat2_start) { want = rem; if((sector + rem) >= drv->fat2_start) want = drv->fat2_start - sector; #ifdef ENABLE_CLUSTER_LIST if(drv->flags & VDF_CLUSTERLIST) { if(read_sector_fat_clustlist(drv, sector - drv->fat1_start, want, buff) == -1) return -1; } else { if(read_sector_fat(drv, sector - drv->fat1_start, want, buff) == -1) return -1; } #else if(read_sector_fat(drv, sector - drv->fat1_start, want, buff) == -1) return -1; #endif rem -= want; cnt += want; if(rem == 0) return cnt; sector += want; buff += want * drv->bps; } if(sector < (drv->filesys == VDF_FAT32 ? drv->data_start : drv->root_start)) { want = rem; if(drv->filesys == VDF_FAT32) { if((sector + rem) >= drv->data_start) want = drv->data_start - sector; } else { if((sector + rem) >= drv->root_start) want = drv->root_start - sector; } #ifdef ENABLE_CLUSTER_LIST if(drv->flags & VDF_CLUSTERLIST) { if(read_sector_fat_clustlist(drv, sector - drv->fat2_start, want, buff) == -1) return -1; } else { if(read_sector_fat(drv, sector - drv->fat2_start, want, buff) == -1) return -1; } #else if(read_sector_fat(drv, sector - drv->fat2_start, want, buff) == -1) return -1; #endif rem -= want; cnt += want; if(rem == 0) return cnt; sector += want; buff += want * drv->bps; } if((drv->filesys != VDF_FAT32) && (sector < drv->data_start)) { want = rem; if((sector + rem) >= drv->data_start) want = drv->data_start - sector; if(read_sector_dir(drv, sector - drv->root_start, want, buff, drv->root_dir) == -1) return -1; rem -= want; cnt += want; if(rem == 0) return cnt; sector += want; buff += want * drv->bps; } want = rem; if((sector + rem) >= drv->sectors) want = drv->sectors - sector; #ifdef ENABLE_CLUSTER_LIST if(drv->flags & VDF_CLUSTERLIST) { if(read_sector_data_clustlist(drv, sector, want, buff) == -1) return -1; } else { if(read_sector_data(drv, sector, want, buff) == -1) return -1; } #else if(read_sector_data(drv, sector, want, buff) == -1) return -1; #endif cnt += want; return cnt; }