⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sun.c

📁 linux下开发的针对所有磁盘的数据恢复的源码
💻 C
字号:
/* * The Sleuth Kit * * Brian Carrier [carrier <at> sleuthkit [dot] org] * Copyright (c) 2006-2008 Brian Carrier, Basis Technology.  All rights reserved * Copyright (c) 2003-2005 Brian Carrier.  All rights reserved * * SUN - Sun VTOC code * * This software is distributed under the Common Public License 1.0 *//** \file sun.c * Contains the internal SUN VTOC volume system processing code. */#include "tsk_vs_i.h"#include "tsk_sun.h"/* * Return a buffer with a description of the partition type */static char *sun_get_desc(uint16_t fstype){    char *str = tsk_malloc(64);    if (str == NULL)        return "";    switch (fstype) {    case 0:        strncpy(str, "Unassigned (0x00)", 64);        break;    case 1:        strncpy(str, "boot (0x01)", 64);        break;    case 2:        strncpy(str, "/ (0x02)", 64);        break;    case 3:        strncpy(str, "swap (0x03)", 64);        break;    case 4:        strncpy(str, "/usr/ (0x04)", 64);        break;    case 5:        strncpy(str, "backup (0x05)", 64);        break;    case 6:        strncpy(str, "stand (0x06)", 64);        break;    case 7:        strncpy(str, "/var/ (0x07)", 64);        break;    case 8:        strncpy(str, "/home/ (0x08)", 64);        break;    case 9:        strncpy(str, "alt sector (0x09)", 64);        break;    case 10:        strncpy(str, "cachefs (0x0A)", 64);        break;    default:        snprintf(str, 64, "Unknown Type (0x%.4x)", fstype);        break;    }    return str;}/*  * Load an Intel disk label, this is called by sun_load_table  */static uint8_tsun_load_table_i386(TSK_VS_INFO * vs, sun_dlabel_i386 * dlabel_x86){    uint32_t idx = 0;    TSK_DADDR_T max_addr = (vs->img_info->size - vs->offset) / vs->block_size;  // max sector    if (tsk_verbose)        tsk_fprintf(stderr, "load_table_i386: Number of partitions: %d\n",            tsk_getu16(vs->endian, dlabel_x86->num_parts));    /* Cycle through the partitions, there are either 8 or 16 */    for (idx = 0; idx < tsk_getu16(vs->endian, dlabel_x86->num_parts);        idx++) {        TSK_VS_PART_FLAG_ENUM ptype = TSK_VS_PART_FLAG_ALLOC;        if (tsk_verbose)            tsk_fprintf(stderr,                "load_table_i386: %" PRIu32                "  Starting Sector: %" PRIu32 "  Size: %" PRIu32                "  Type: %" PRIu16 "\n", idx, tsk_getu32(vs->endian,                    dlabel_x86->part[idx].start_sec),                tsk_getu32(vs->endian, dlabel_x86->part[idx].size_sec),                tsk_getu16(vs->endian, dlabel_x86->part[idx].type));        if (tsk_getu32(vs->endian, dlabel_x86->part[idx].size_sec) == 0)            continue;        if (tsk_getu32(vs->endian,                dlabel_x86->part[idx].start_sec) > max_addr) {            tsk_error_reset();            tsk_errno = TSK_ERR_VS_BLK_NUM;            snprintf(tsk_errstr, TSK_ERRSTR_L,                "sun_load_i386: Starting sector too large for image");            return 1;        }        // set the entry that covers the entire disk image as DESC        if ((tsk_getu16(vs->endian, dlabel_x86->part[idx].type) == 5)            && (tsk_getu32(vs->endian,                    dlabel_x86->part[idx].start_sec) == 0))            ptype = TSK_VS_PART_FLAG_META;        /* Add the partition to the internal sorted list */        if (NULL == tsk_vs_part_add(vs,                (TSK_DADDR_T) tsk_getu32(vs->endian,                    dlabel_x86->part[idx].start_sec),                (TSK_DADDR_T) tsk_getu32(vs->endian,                    dlabel_x86->part[idx].size_sec), ptype,                sun_get_desc(tsk_getu16(vs->endian,                        dlabel_x86->part[idx].type)), -1, idx)) {            return 1;        }    }    return 0;}/* load a sparc disk label, this is called from the general * sun_load_table */static uint8_tsun_load_table_sparc(TSK_VS_INFO * vs, sun_dlabel_sparc * dlabel_sp){    uint32_t idx = 0;    uint32_t cyl_conv;    TSK_DADDR_T max_addr = (vs->img_info->size - vs->offset) / vs->block_size;  // max sector    /* The value to convert cylinders to sectors */    cyl_conv = tsk_getu16(vs->endian, dlabel_sp->sec_per_tr) *        tsk_getu16(vs->endian, dlabel_sp->num_head);    if (tsk_verbose)        tsk_fprintf(stderr, "load_table_sparc: Number of partitions: %d\n",            tsk_getu16(vs->endian, dlabel_sp->num_parts));    /* Cycle through the partitions, there are either 8 or 16 */    for (idx = 0; idx < tsk_getu16(vs->endian, dlabel_sp->num_parts);        idx++) {        TSK_VS_PART_FLAG_ENUM ptype = TSK_VS_PART_FLAG_ALLOC;        uint32_t part_start = cyl_conv * tsk_getu32(vs->endian,            dlabel_sp->part_layout[idx].start_cyl);        uint32_t part_size = tsk_getu32(vs->endian,            dlabel_sp->part_layout[idx].size_blk);        if (tsk_verbose)            tsk_fprintf(stderr,                "load_table_sparc: %" PRIu32                "  Starting Sector: %" PRIu32 "  Size: %" PRIu32                "  Type: %" PRIu16 "\n", idx, part_start, part_size,                tsk_getu16(vs->endian, dlabel_sp->part_meta[idx].type));        if (part_size == 0)            continue;        if (part_start > max_addr) {            tsk_error_reset();            tsk_errno = TSK_ERR_VS_BLK_NUM;            snprintf(tsk_errstr, TSK_ERRSTR_L,                "sun_load_sparc: Starting sector too large for image");            return 1;        }        // set the entry that covers the entire disk image as DESC        if ((tsk_getu16(vs->endian, dlabel_sp->part_meta[idx].type) == 5)            && (part_start == 0))            ptype = TSK_VS_PART_FLAG_META;        /* Add the partition to the internal sorted list */        if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) part_start,                (TSK_DADDR_T) part_size, ptype,                sun_get_desc(tsk_getu16(vs->endian,                        dlabel_sp->part_meta[idx].type)), -1, idx))            return 1;    }    return 0;}/*  * Process the partition table at the sector address  * * This method just finds out if it is sparc or Intel and then * calls the appropriate method * * Return 0 on success and 1 on error */static uint8_tsun_load_table(TSK_VS_INFO * vs){/* this will need to change if any of the disk label structures change */#define LABEL_BUF_SIZE	512    sun_dlabel_sparc *dlabel_sp;    sun_dlabel_i386 *dlabel_x86;    char buf[LABEL_BUF_SIZE];    ssize_t cnt;    TSK_DADDR_T taddr =        vs->offset / vs->block_size + SUN_SPARC_PART_SOFFSET;    /* Sanity check in case label sizes change */    if ((sizeof(*dlabel_sp) > LABEL_BUF_SIZE) ||        (sizeof(*dlabel_x86) > LABEL_BUF_SIZE)) {        tsk_error_reset();        tsk_errno = TSK_ERR_VS_BUF;        snprintf(tsk_errstr, TSK_ERRSTR_L,            "sun_load_table: Buffer smaller than label sizes");        return 1;    }    if (tsk_verbose)        tsk_fprintf(stderr,            "sun_load_table: Trying sector: %" PRIuDADDR "\n", taddr);    /* Try the given offset */    cnt = tsk_vs_read_block        (vs, SUN_SPARC_PART_SOFFSET, (char *) &buf, LABEL_BUF_SIZE);    /* If -1 is returned, tsk_errno is already set */    if (cnt != LABEL_BUF_SIZE) {        if (cnt >= 0) {            tsk_error_reset();            tsk_errno = TSK_ERR_VS_READ;        }        snprintf(tsk_errstr2, TSK_ERRSTR_L,            "SUN Disk Label in Sector: %" PRIuDADDR, taddr);        return 1;    }    /* Check the magic value      * Both intel and sparc have the magic value in the same location     *     * We try both in case someone specifies the exact location of the     * intel disk label.     * */    dlabel_sp = (sun_dlabel_sparc *) buf;    dlabel_x86 = (sun_dlabel_i386 *) buf;    if (tsk_vs_guessu16(vs, dlabel_sp->magic, SUN_MAGIC) == 0) {        if (tsk_getu32(vs->endian, dlabel_sp->sanity) == SUN_SANITY) {            return sun_load_table_sparc(vs, dlabel_sp);        }        else if (tsk_getu32(vs->endian, dlabel_x86->sanity) == SUN_SANITY) {            return sun_load_table_i386(vs, dlabel_x86);        }    }    /* Now try the next sector, which is where the intel      * could be stored */    taddr = vs->offset / vs->block_size / SUN_I386_PART_SOFFSET;    if (tsk_verbose)        tsk_fprintf(stderr,            "sun_load_table: Trying sector: %" PRIuDADDR "\n", taddr + 1);    cnt = tsk_vs_read_block        (vs, SUN_I386_PART_SOFFSET, (char *) &buf, LABEL_BUF_SIZE);    if (cnt != LABEL_BUF_SIZE) {        if (cnt >= 0) {            tsk_error_reset();            tsk_errno = TSK_ERR_VS_READ;        }        snprintf(tsk_errstr2, TSK_ERRSTR_L,            "SUN (Intel) Disk Label in Sector: %" PRIuDADDR, taddr);        return 1;    }    dlabel_x86 = (sun_dlabel_i386 *) buf;    if (tsk_vs_guessu16(vs, dlabel_x86->magic, SUN_MAGIC)) {        tsk_error_reset();        tsk_errno = TSK_ERR_VS_MAGIC;        snprintf(tsk_errstr, TSK_ERRSTR_L,            "SUN (intel) partition table (Sector: %"            PRIuDADDR ") %x", taddr, tsk_getu16(vs->endian,                dlabel_sp->magic));        return 1;    }    if (tsk_getu32(vs->endian, dlabel_x86->sanity) != SUN_SANITY) {        tsk_error_reset();        tsk_errno = TSK_ERR_VS_MAGIC;        snprintf(tsk_errstr, TSK_ERRSTR_L,            "SUN (intel) sanity value (Sector: %" PRIuDADDR            ") %x", taddr, tsk_getu16(vs->endian, dlabel_sp->magic));        return 1;    }    return sun_load_table_i386(vs, dlabel_x86);}static voidsun_close(TSK_VS_INFO * vs){    tsk_vs_part_free(vs);    free(vs);}TSK_VS_INFO *tsk_vs_sun_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset){    TSK_VS_INFO *vs;    // clean up any errors that are lying around    tsk_error_reset();    vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs));    if (vs == NULL)        return NULL;    vs->img_info = img_info;    vs->vstype = TSK_VS_TYPE_SUN;    vs->offset = offset;    /* inititialize settings */    vs->part_list = NULL;    vs->part_count = 0;    vs->endian = 0;    vs->block_size = 512;    /* Assign functions */    vs->close = sun_close;    /* Load the partitions into the sorted list */    if (sun_load_table(vs)) {        sun_close(vs);        return NULL;    }    /* fill in the sorted list with the 'unknown' values */    if (tsk_vs_part_unused(vs)) {        sun_close(vs);        return NULL;    }    return vs;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -