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

📄 fls_lib.c

📁 linux下开发的针对所有磁盘的数据恢复的源码
💻 C
字号:
/*** fls** The Sleuth Kit **** Given an image and directory inode, display the file names and ** directories that exist (both active and deleted)**** Brian Carrier [carrier <at> sleuthkit [dot] org]** Copyright (c) 2006-2008 Brian Carrier, Basis Technology.  All Rights reserved** Copyright (c) 2003-2005 Brian Carier.  All rights reserved**** TASK** Copyright (c) 2002 @stake Inc.  All rights reserved**** TCTUTILs** Copyright (c) 2001 Brian Carrier.  All rights reserved****** This software is distributed under the Common Public License 1.0***//** \file fls_lib.c  * Contains the library code associated with the TSK fls tool to list files in a directory. */#include "tsk_fs_i.h"/** \internal * Structure to store data for callbacks.*/typedef struct {    /* Time skew of the system in seconds */    int32_t sec_skew;    /*directory prefix for printing mactime output */    char *macpre;    int flags;} FLS_DATA;/* this is a wrapper type function that takes care of the runtime * flags *  * fs_attr should be set to NULL for all NTFS file systems */static voidprintit(TSK_FS_FILE * fs_file, const char *a_path,    const TSK_FS_ATTR * fs_attr, const FLS_DATA * fls_data){    unsigned int i;    if ((!(fls_data->flags & TSK_FS_FLS_FULL)) && (a_path)) {        uint8_t printed = 0;        // lazy way to find out how many dirs there could be        for (i = 0; a_path[i] != '\0'; i++) {            if ((a_path[i] == '/') && (i != 0)) {                tsk_fprintf(stdout, "+");                printed = 1;            }        }        if (printed)            tsk_fprintf(stdout, " ");    }    if (fls_data->flags & TSK_FS_FLS_MAC) {        if ((fls_data->sec_skew != 0) && (fs_file->meta)) {            fs_file->meta->mtime -= fls_data->sec_skew;            fs_file->meta->atime -= fls_data->sec_skew;            fs_file->meta->ctime -= fls_data->sec_skew;        }        tsk_fs_name_print_mac(stdout, fs_file, a_path, fs_file->fs_info,            fs_attr, fls_data->macpre);        if ((fls_data->sec_skew != 0) && (fs_file->meta)) {            fs_file->meta->mtime += fls_data->sec_skew;            fs_file->meta->atime += fls_data->sec_skew;            fs_file->meta->ctime += fls_data->sec_skew;        }    }    else if (fls_data->flags & TSK_FS_FLS_LONG) {        if ((fls_data->sec_skew != 0) && (fs_file->meta)) {            fs_file->meta->mtime -= fls_data->sec_skew;            fs_file->meta->atime -= fls_data->sec_skew;            fs_file->meta->ctime -= fls_data->sec_skew;        }        tsk_fs_name_print_long(stdout, fs_file, a_path, fs_file->fs_info,            fs_attr, TSK_FS_FLS_FULL & fls_data->flags ? 1 : 0);        if ((fls_data->sec_skew != 0) && (fs_file->meta)) {            fs_file->meta->mtime += fls_data->sec_skew;            fs_file->meta->atime += fls_data->sec_skew;            fs_file->meta->ctime += fls_data->sec_skew;        }    }    else {        tsk_fs_name_print(stdout, fs_file, a_path, fs_file->fs_info,            fs_attr, TSK_FS_FLS_FULL & fls_data->flags ? 1 : 0);        tsk_printf("\n");    }}/*  * call back action function for dent_walk */static TSK_WALK_RET_ENUMprint_dent_act(TSK_FS_FILE * fs_file, const char *a_path, void *ptr){    FLS_DATA *fls_data = (FLS_DATA *) ptr;    /* only print dirs if TSK_FS_FLS_DIR is set and only print everything     ** else if TSK_FS_FLS_FILE is set (or we aren't sure what it is)     */    if (((fls_data->flags & TSK_FS_FLS_DIR) &&            ((fs_file->meta) &&                (fs_file->meta->type == TSK_FS_META_TYPE_DIR)))        || ((fls_data->flags & TSK_FS_FLS_FILE) && (((fs_file->meta)                    && (fs_file->meta->type != TSK_FS_META_TYPE_DIR))                || (!fs_file->meta)))) {        /* Make a special case for NTFS so we can identify all of the         * alternate data streams!         */        if ((TSK_FS_TYPE_ISNTFS(fs_file->fs_info->ftype))            && (fs_file->meta)) {            uint8_t printed = 0;            int i, cnt;            // cycle through the attributes            cnt = tsk_fs_file_attr_getsize(fs_file);            for (i = 0; i < cnt; i++) {                const TSK_FS_ATTR *fs_attr =                    tsk_fs_file_attr_get_idx(fs_file, i);                if (!fs_attr)                    continue;                if (fs_attr->type == TSK_FS_ATTR_TYPE_NTFS_DATA) {                    printed = 1;                    if (fs_file->meta->type == TSK_FS_META_TYPE_DIR) {                        /* we don't want to print the ..:blah stream if                         * the -a flag was not given                         */                        if ((fs_file->name->name[0] == '.')                            && (fs_file->name->name[1])                            && (fs_file->name->name[2] == '\0')                            && ((fls_data->flags & TSK_FS_FLS_DOT) == 0)) {                            continue;                        }                    }                    printit(fs_file, a_path, fs_attr, fls_data);                }                else if (fs_attr->type == TSK_FS_ATTR_TYPE_NTFS_IDXROOT) {                    printed = 1;                    /* If it is . or .. only print it if the flags say so,                     * we continue with other streams though in case the                      * directory has a data stream                      */                    if (!((TSK_FS_ISDOT(fs_file->name->name)) &&                            ((fls_data->flags & TSK_FS_FLS_DOT) == 0)))                        printit(fs_file, a_path, fs_attr, fls_data);                }            }            /* A user reported that an allocated file had the standard             * attributes, but no $Data.  We should print something */            if (printed == 0) {                printit(fs_file, a_path, NULL, fls_data);            }        }        else {            /* skip it if it is . or .. and we don't want them */            if (!((TSK_FS_ISDOT(fs_file->name->name))                    && ((fls_data->flags & TSK_FS_FLS_DOT) == 0)))                printit(fs_file, a_path, NULL, fls_data);        }    }    return TSK_WALK_CONT;}/* Returns 0 on success and 1 on error */uint8_ttsk_fs_fls(TSK_FS_INFO * fs, TSK_FS_FLS_FLAG_ENUM lclflags,    TSK_INUM_T inode, TSK_FS_NAME_FLAG_ENUM flags, TSK_TCHAR * tpre,    int32_t skew){    FLS_DATA data;    data.flags = lclflags;    data.sec_skew = skew;#ifdef TSK_WIN32    {        char *cpre;        size_t clen;        UTF8 *ptr8;        UTF16 *ptr16;        int retval;        if (tpre != NULL) {            clen = TSTRLEN(tpre) * 4;            cpre = (char *) tsk_malloc(clen);            if (cpre == NULL) {                return 1;            }            ptr8 = (UTF8 *) cpre;            ptr16 = (UTF16 *) tpre;            retval =                tsk_UTF16toUTF8(fs->endian,                (const UTF16 **) &ptr16, (UTF16 *)                & ptr16[TSTRLEN(tpre) + 1], &ptr8,                (UTF8 *) ((uintptr_t) ptr8 + clen), TSKlenientConversion);            if (retval != TSKconversionOK) {                tsk_error_reset();                tsk_errno = TSK_ERR_FS_UNICODE;                snprintf(tsk_errstr, TSK_ERRSTR_L,                    "Error converting fls mactime pre-text to UTF-8 %d\n",                    retval);                return 1;            }            data.macpre = cpre;        }        else {            data.macpre = NULL;            cpre = NULL;        }        retval = tsk_fs_dir_walk(fs, inode, flags, print_dent_act, &data);        if (cpre)            free(cpre);        return retval;    }#else    data.macpre = tpre;    return tsk_fs_dir_walk(fs, inode, flags, print_dent_act, &data);#endif}

⌨️ 快捷键说明

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