From b3cfdf43ead01fdebd48c87e09b9e987fa4233f7 Mon Sep 17 00:00:00 2001 From: apriestman <apriestman@basistech.com> Date: Fri, 28 Feb 2020 13:41:28 -0500 Subject: [PATCH] More work on addFile --- bindings/java/jni/auto_db_java.cpp | 178 ++++++++++++------ bindings/java/jni/auto_db_java.h | 3 + .../org/sleuthkit/datamodel/JniDbHelper.java | 41 ++-- .../sleuthkit/datamodel/SleuthkitCase.java | 74 ++++---- 4 files changed, 197 insertions(+), 99 deletions(-) diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index 17dc7bce7..ceb691705 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -120,6 +120,13 @@ TskAutoDbJava::initializeJni(JNIEnv * jniEnv, jobject jobj) { return TSK_ERR; } + m_addFileMethodID = m_jniEnv->GetMethodID(m_callbackClass, "addFile", "(JJJIIILjava/lang/String;JJIIIIJJJJJIIILjava/lang/String;Ljava/lang/String;)J"); + if (m_addFileMethodID == NULL) { + printf("#### Error loading m_addFileMethodID\n"); + fflush(stdout); + return TSK_ERR; + } + printf("\n#### Yay found method IDs!\n"); fflush(stdout); return TSK_OK; @@ -168,7 +175,7 @@ TskAutoDbJava::addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const st jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addImageMethodID, type, ssize, tzj, size, md5j, sha1j, sha256j, devIdj, collj); objId = (int64_t)objIdj; - printf("New image object ID: %lld\n", objId); + printf("#### New image object ID: %lld\n", objId); fflush(stdout); if (objId < 0) { @@ -217,7 +224,7 @@ TskAutoDbJava::addVsInfo(const TSK_VS_INFO* vs_info, int64_t parObjId, int64_t& jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeSystemMethodID, parObjId, vs_info->vstype, vs_info->offset, (uint64_t)vs_info->block_size); objId = (int64_t)objIdj; - printf("New volume system object ID: %lld\n", objId); + printf("#### New volume system object ID: %lld\n", objId); fflush(stdout); if (objId < 0) { @@ -327,6 +334,8 @@ TskAutoDbJava::addFsInfo(const TSK_FS_INFO* fs_info, int64_t parObjId, fs_info->block_count, fs_info->root_inum, fs_info->first_inum, fs_info->last_inum); objId = (int64_t)objIdj; + printf("#### New file system object ID: %lld\n", objId); + fflush(stdout); if (objId < 0) { return TSK_ERR; @@ -394,6 +403,58 @@ void extractExtension(char *name, char *extension) { } } +/** +* Store info about a directory in a complex map structure as a cache for the +* files who are a child of this directory and want to know its object id. +* +* @param fsObjId fs id of this directory +* @param fs_file File for the directory to store +* @param path Full path (parent and this file) of the directory +* @param objId object id of the directory +*/ +void TskAutoDbJava::storeObjId(const int64_t& fsObjId, const TSK_FS_FILE* fs_file, const char* path, const int64_t& objId) +{ + // skip the . and .. entries + if ((fs_file->name) && (fs_file->name->name) && (TSK_FS_ISDOT(fs_file->name->name))) + { + return; + } + + uint32_t seq; + uint32_t path_hash = hash((const unsigned char *)path); + + /* NTFS uses sequence, otherwise we hash the path. We do this to map to the + * correct parent folder if there are two from the root dir that eventually point to + * the same folder (one deleted and one allocated) or two hard links. */ + if (TSK_FS_TYPE_ISNTFS(fs_file->fs_info->ftype)) + { + /* Use the sequence stored in meta (which could be one larger than the name value + * if the directory is deleted. We do this because the par_seq gets added to the + * name structure when it is added to the directory based on teh value stored in + * meta. */ + seq = fs_file->meta->seq; + } + else + { + seq = path_hash; + } + + map<TSK_INUM_T, map<uint32_t, map<uint32_t, int64_t> > >& fsMap = m_parentDirIdCache[fsObjId]; + if (fsMap.count(fs_file->name->meta_addr) == 0) + { + fsMap[fs_file->name->meta_addr][seq][path_hash] = objId; + } + else + { + map<uint32_t, map<uint32_t, int64_t> >& fileMap = fsMap[fs_file->name->meta_addr]; + if (fileMap.count(seq) == 0) + { + fileMap[seq][path_hash] = objId; + } + } +} + + /** * Add file data to the file table * @param md5 binary value of MD5 (i.e. 16 bytes) or NULL @@ -491,29 +552,40 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, strncpy(escaped_path, "/", path_len); strncat(escaped_path, path, path_len - strlen(escaped_path)); - char* md5TextPtr = NULL; - char md5Text[48]; - - // if md5 hashes are being used - if (md5 != NULL) - { - // copy the hash as hexidecimal into the buffer - for (int i = 0; i < 16; i++) - { - sprintf(&(md5Text[i * 2]), "%x%x", (md5[i] >> 4) & 0xf, - md5[i] & 0xf); - } - md5TextPtr = md5Text; + printf("#### Finally adding file\n"); + fflush(stdout); + if (m_addFileMethodID == NULL) { + printf("#### Yikes m_addFileMethodID is null...\n"); + return TSK_ERR; } + jstring namej = m_jniEnv->NewStringUTF(name); // TODO free? + jstring pathj = m_jniEnv->NewStringUTF(escaped_path); // TODO free? + jstring extj = m_jniEnv->NewStringUTF(extension); // TODO free? + - if (addObject(TSK_DB_OBJECT_TYPE_FILE, parObjId, objId)) - { - free(name); - free(escaped_path); - return 1; + // "INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, + // type, attr_type, attr_id, name, + // meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, + // size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension) " + jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addFileMethodID, + parObjId, fsObjId, + dataSourceObjId, + TSK_DB_FILES_TYPE_FS, + type, idx, namej, + fs_file->name->meta_addr, (uint64_t)fs_file->name->meta_seq, + fs_file->name->type, meta_type, fs_file->name->flags, meta_flags, + size, + (unsigned long long)crtime, (unsigned long long)ctime, (unsigned long long) atime, (unsigned long long) mtime, + meta_mode, gid, uid, // md5TextPtr, known, + pathj, extj); + objId = (int64_t)objIdj; + + if (objId < 0) { + return TSK_ERR; } + /* zSQL = sqlite3_mprintf( "INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension) " "VALUES (" @@ -527,25 +599,21 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, "%llu,%llu,%llu,%llu," "%d,%d,%d,%Q,%d," "'%q','%q')", - fsObjId, objId, - dataSourceObjId, - TSK_DB_FILES_TYPE_FS, - type, idx, name, - fs_file->name->meta_addr, fs_file->name->meta_seq, - fs_file->name->type, meta_type, fs_file->name->flags, meta_flags, - size, + fsObjId, objId, // done + dataSourceObjId, // done + TSK_DB_FILES_TYPE_FS, // dont' need type + type, idx, name, // attrType, attrId, name done + fs_file->name->meta_addr, fs_file->name->meta_seq, // done + fs_file->name->type, meta_type, fs_file->name->flags, meta_flags, // used meta_flags + size, // done (unsigned long long)crtime, (unsigned long long)ctime, (unsigned long long) atime, (unsigned long long) mtime, meta_mode, gid, uid, md5TextPtr, known, escaped_path, extension); + */ - if (attempt_exec(zSQL, "TskDbSqlite::addFile: Error adding data to tsk_files table: %s\n")) { - free(name); - free(escaped_path); - sqlite3_free(zSQL); - return 1; - } - if (!TSK_FS_ISDOT(name)) +/* +if (!TSK_FS_ISDOT(name)) { std::string full_description = std::string(escaped_path).append(name); @@ -565,7 +633,7 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, sqlite3_free(zSQL); return 1; }; - } + }*/ //if dir, update parent id cache (do this before objId may be changed creating the slack file) if (TSK_FS_IS_DIR_META(meta_type)) @@ -574,6 +642,7 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, storeObjId(fsObjId, fs_file, fullPath.c_str(), objId); } + /* // Add entry for the slack space. // Current conditions for creating a slack file: // - File name is not empty, "." or ".." @@ -631,7 +700,7 @@ TskAutoDbJava::addFile(TSK_FS_FILE* fs_file, } } - sqlite3_free(zSQL); + sqlite3_free(zSQL);*/ free(name); free(escaped_path); @@ -680,7 +749,8 @@ TskAutoDbJava::addUnallocFsBlockFilesParent(const int64_t fsObjId, int64_t& objI * for full paths. * From: http://www.cse.yorku.ca/~oz/hash.html */ -uint32_t hash(const unsigned char* str) +uint32_t +TskAutoDbJava::hash(const unsigned char* str) { uint32_t hash = 5381; int c; @@ -829,9 +899,9 @@ TskAutoDbJava::findParObjId(const TSK_FS_FILE* fs_file, const char* parentPath, } // TODO TODO DATABASE CALL - printf("#### SKIPPING PAR OBJ ID DATABASE LOOKUP \n"); + printf("#### SKIPPING PAR OBJ ID DATABASE LOOKUP TODO \n"); fflush(stdout); - int64_t parObjId = -1; + int64_t parObjId = 2; return parObjId; } @@ -979,7 +1049,7 @@ TskAutoDbJava::addImageDetails(const char* deviceId) } else { devId = ""; } - if (TSK_ERR == addImageInfo(m_img_info->itype, m_img_info->sector_size, + if (TSK_OK != addImageInfo(m_img_info->itype, m_img_info->sector_size, m_curImgId, m_curImgTZone, m_img_info->size, md5, sha1, "", devId, collectionDetails)) { registerError(); return 1; @@ -1023,7 +1093,7 @@ TskAutoDbJava::addImageDetails(const char* deviceId) for (int i = 0; i < m_img_info->num_img; i++) { const char *img_ptr = img_ptrs[i]; - if (-1 == addImageName(m_curImgId, img_ptr, i)) { + if (TSK_OK != addImageName(m_curImgId, img_ptr, i)) { registerError(); return 1; } @@ -1044,7 +1114,7 @@ TskAutoDbJava::addImageDetails(const char* deviceId) TSK_FILTER_ENUM TskAutoDbJava::filterVs(const TSK_VS_INFO * vs_info) { m_vsFound = true; - if (-1 == addVsInfo(vs_info, m_curImgId, m_curVsId)) { + if (TSK_OK != addVsInfo(vs_info, m_curImgId, m_curVsId)) { registerError(); return TSK_FILTER_STOP; } @@ -1059,14 +1129,14 @@ TskAutoDbJava::filterPool(const TSK_POOL_INFO * pool_info) if (m_volFound && m_vsFound) { // there's a volume system and volume - if (-1 == addPoolInfoAndVS(pool_info, m_curVolId, m_curPoolVs)) { + if (TSK_OK != addPoolInfoAndVS(pool_info, m_curVolId, m_curPoolVs)) { registerError(); return TSK_FILTER_STOP; } } else { // pool doesn't live in a volume, use image as parent - if (-1 == addPoolInfoAndVS(pool_info, m_curImgId, m_curPoolVs)) { + if (TSK_OK != addPoolInfoAndVS(pool_info, m_curImgId, m_curPoolVs)) { registerError(); return TSK_FILTER_STOP; } @@ -1081,7 +1151,7 @@ TSK_FILTER_ENUM TskAutoDbJava::filterPoolVol(const TSK_POOL_VOLUME_INFO * pool_vol) { - if (-1 == addPoolVolumeInfo(pool_vol, m_curPoolVs, m_curPoolVol)) { + if (TSK_OK != addPoolVolumeInfo(pool_vol, m_curPoolVs, m_curPoolVol)) { registerError(); return TSK_FILTER_STOP; } @@ -1096,7 +1166,7 @@ TskAutoDbJava::filterVol(const TSK_VS_PART_INFO * vs_part) m_foundStructure = true; m_poolFound = false; - if (-1 == addVolumeInfo(vs_part, m_curVsId, m_curVolId)) { + if (TSK_OK != addVolumeInfo(vs_part, m_curVsId, m_curVolId)) { registerError(); return TSK_FILTER_STOP; } @@ -1113,21 +1183,21 @@ TskAutoDbJava::filterFs(TSK_FS_INFO * fs_info) if (m_poolFound) { // there's a pool - if (-1 != addFsInfo(fs_info, m_curPoolVol, m_curFsId)) { + if (TSK_OK != addFsInfo(fs_info, m_curPoolVol, m_curFsId)) { registerError(); return TSK_FILTER_STOP; } } else if (m_volFound && m_vsFound) { // there's a volume system and volume - if (-1 != addFsInfo(fs_info, m_curVolId, m_curFsId)) { + if (TSK_OK != addFsInfo(fs_info, m_curVolId, m_curFsId)) { registerError(); return TSK_FILTER_STOP; } } else { // file system doesn't live in a volume, use image as parent - if (-1 != addFsInfo(fs_info, m_curImgId, m_curFsId)) { + if (TSK_OK != addFsInfo(fs_info, m_curImgId, m_curFsId)) { registerError(); return TSK_FILTER_STOP; } @@ -1156,11 +1226,6 @@ TskAutoDbJava::filterFs(TSK_FS_INFO * fs_info) setFileFilterFlags(filterFlags); - - printf("Returning TSK_FILTER_STOP from the fs method\n"); // TODO TODO - fflush(stdout); - return TSK_FILTER_STOP; - return TSK_FILTER_CONT; } @@ -1172,6 +1237,8 @@ TSK_RETVAL_ENUM TskAutoDbJava::insertFileData(TSK_FS_FILE * fs_file, const TSK_FS_ATTR * fs_attr, const char *path) { + printf("### insertFileData\n"); + fflush(stdout); if (-1 == addFsFile(fs_file, fs_attr, path, NULL, TSK_DB_FILES_KNOWN_UNKNOWN, m_curFsId, m_curFileId, m_curImgId)) { @@ -1373,7 +1440,8 @@ TskAutoDbJava::setTz(string tzone) TSK_RETVAL_ENUM TskAutoDbJava::processFile(TSK_FS_FILE * fs_file, const char *path) { - + printf("#### processFile\n"); + fflush(stdout); // Check if the process has been canceled if (m_stopped) { if (tsk_verbose) diff --git a/bindings/java/jni/auto_db_java.h b/bindings/java/jni/auto_db_java.h index 375090c15..1837c987b 100644 --- a/bindings/java/jni/auto_db_java.h +++ b/bindings/java/jni/auto_db_java.h @@ -147,6 +147,8 @@ class TskAutoDbJava :public TskAuto { map<int64_t, map<TSK_INUM_T, map<uint32_t, map<uint32_t, int64_t> > > > m_parentDirIdCache; //maps a file system ID to a map, which maps a directory file system meta address to a map, which maps a sequence ID to a map, which maps a hash of a path to its object ID in the database int64_t findParObjId(const TSK_FS_FILE* fs_file, const char* parentPath, const int64_t& fsObjId); bool getParentPathAndName(const char *path, const char **ret_parent_path, const char **ret_name); + void storeObjId(const int64_t& fsObjId, const TSK_FS_FILE* fs_file, const char* path, const int64_t& objId); + uint32_t hash(const unsigned char* str); // JNI data JNIEnv * m_jniEnv; @@ -158,6 +160,7 @@ class TskAutoDbJava :public TskAuto { jmethodID m_addVolumeMethodID = NULL; jmethodID m_addPoolMethodID = NULL; jmethodID m_addFileSystemMethodID = NULL; + jmethodID m_addFileMethodID = NULL; // prevent copying until we add proper logic to handle it diff --git a/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java b/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java index 2fcc98580..2e413c2bc 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java +++ b/bindings/java/src/org/sleuthkit/datamodel/JniDbHelper.java @@ -114,20 +114,37 @@ long addFileSystem(long parentObjId, long imgOffset, int fsType, long blockSize, } } - long addFile(long parentObjId, long dataSourceObjId, long fsObjId, - String fileName, - long metaAddr, int metaSeq, - int attrType, int attrId, - int dirFlag, short metaFlags, long size, - long ctime, long crtime, long atime, long mtime, boolean isFile, String parentPath) { + // fs_obj_id, obj_id, data_source_obj_id, type, + // attr_type, attr_id, + // name, + // meta_addr, meta_seq, + // dir_type, + // meta_type, dir_flags, meta_flags, + // size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension)" + long addFile(long parentObjId, + long fsObjId, long dataSourceObjId, + int fsType, // TSK_DB_FILES_TYPE_FS, + int attrType, int attrId, String name, + long metaAddr, long metaSeq, + int dirType, int metaType, int dirFlags, int metaFlags, + long size, + long crtime, long ctime, long atime, long mtime, + int meta_mode, int gid, int uid, /// md5TextPtr, known, + String escaped_path, String extension + + ) { try { - return caseDb.addFileSystemFileJNI(parentObjId, dataSourceObjId, fsObjId, - fileName, + return caseDb.addFileSystemFileJNI(parentObjId, + fsObjId, dataSourceObjId, + fsType, // TSK_DB_FILES_TYPE_FS, + attrType, attrId, name, metaAddr, metaSeq, - TskData.TSK_FS_ATTR_TYPE_ENUM.valueOf(attrType), attrId, - TskData.TSK_FS_NAME_FLAG_ENUM.valueOf(dirFlag), metaFlags, size, - ctime, crtime, atime, mtime, - isFile, parentPath, trans); + dirType, metaType, dirFlags, metaFlags, + size, + crtime, ctime, atime, mtime, + meta_mode, gid, uid, /// md5TextPtr, known, + "", TskData.FileKnown.UNKNOWN, + escaped_path, extension, trans); } catch (TskCoreException ex) { ex.printStackTrace(); return -1; diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java index ac0cc4a2d..16df7aac0 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java @@ -11043,13 +11043,17 @@ void addImageNameJNI(long objId, String name, long sequence, } } - long addFileSystemFileJNI(long parentId, long dataSourceObjId, long fsObjId, - String fileName, - long metaAddr, int metaSeq, - TSK_FS_ATTR_TYPE_ENUM attrType, int attrId, - TSK_FS_NAME_FLAG_ENUM dirFlag, short metaFlags, long size, - long ctime, long crtime, long atime, long mtime, - boolean isFile, String parentPath, CaseDbTransaction transaction) throws TskCoreException { + long addFileSystemFileJNI(long parentObjId, + long fsObjId, long dataSourceObjId, + int fsType, // TSK_DB_FILES_TYPE_FS, + int attrType, int attrId, String name, + long metaAddr, long metaSeq, + int dirType, int metaType, int dirFlags, int metaFlags, + long size, + long crtime, long ctime, long atime, long mtime, + int meta_mode, int gid, int uid, + String md5, TskData.FileKnown known, + String escaped_path, String extension, CaseDbTransaction transaction) throws TskCoreException { Statement queryStatement = null; try { @@ -11058,34 +11062,38 @@ long addFileSystemFileJNI(long parentId, long dataSourceObjId, long fsObjId, // Insert a row for the local/logical file into the tsk_objects table. // INSERT INTO tsk_objects (par_obj_id, type) VALUES (?, ?) - long objectId = addObject(parentId, TskData.ObjectType.ABSTRACTFILE.getObjectType(), connection); + long objectId = addObject(parentObjId, TskData.ObjectType.ABSTRACTFILE.getObjectType(), connection); - PreparedStatement statement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_FILE_SYSTEM_FILE); + // INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, + // dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, + // mode, gid, uid, md5, known, parent_path, extension + PreparedStatement statement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_FILE_SYSTEM_FILE_All_FIELDS); statement.clearParameters(); - statement.setLong(1, objectId); // obj_is - statement.setLong(2, fsObjId); // fs_obj_id + statement.setLong(1, fsObjId); // fs_obj_id + statement.setLong(2, objectId); // obj_id statement.setLong(3, dataSourceObjId); // data_source_obj_id - statement.setShort(4, (short) attrType.getValue()); // attr_type - statement.setInt(5, attrId); // attr_id - statement.setString(6, fileName); // name - statement.setLong(7, metaAddr); // meta_addr - statement.setInt(8, metaSeq); // meta_addr - statement.setShort(9, TskData.TSK_DB_FILES_TYPE_ENUM.FS.getFileType()); //type - statement.setShort(10, (short) 1); // has_path - TSK_FS_NAME_TYPE_ENUM dirType = isFile ? TSK_FS_NAME_TYPE_ENUM.REG : TSK_FS_NAME_TYPE_ENUM.DIR; - statement.setShort(11, dirType.getValue()); // dir_type - TSK_FS_META_TYPE_ENUM metaType = isFile ? TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG : TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR; - statement.setShort(12, metaType.getValue()); // meta_type - statement.setShort(13, dirFlag.getValue()); // dir_flags - statement.setShort(14, metaFlags); // meta_flags - statement.setLong(15, size < 0 ? 0 : size); - statement.setLong(16, ctime); - statement.setLong(17, crtime); - statement.setLong(18, atime); - statement.setLong(19, mtime); - statement.setString(20, parentPath); - final String extension = extractExtension(fileName); - statement.setString(21, extension); + statement.setShort(4, TskData.TSK_DB_FILES_TYPE_ENUM.FS.getFileType()); // type + statement.setShort(5, (short) attrType); // attr_type + statement.setInt(6, attrId); // attr_id + statement.setString(7, name); // name + statement.setLong(8, metaAddr); // meta_addr + statement.setInt(9, (int)metaSeq); // meta_seq + statement.setShort(10, (short)dirType); // dir_type + statement.setShort(11, (short)metaType); // meta_type + statement.setShort(12, (short)dirFlags); // dir_flags + statement.setShort(13, (short)metaFlags); // meta_flags + statement.setLong(14, size < 0 ? 0 : size); // size + statement.setLong(15, ctime); // ctime + statement.setLong(16, crtime); // crtime + statement.setLong(17, atime); // atime + statement.setLong(18, mtime); // mtime + statement.setInt(19, meta_mode); // mode + statement.setInt(20, gid); // gid + statement.setInt(21, uid); // uid + statement.setString(22, md5); // md5 + statement.setInt(23, known.getFileKnownValue());// known + statement.setString(24, escaped_path); // parent_path + statement.setString(25, extension); // extension connection.executeUpdate(statement); return objectId; @@ -11191,6 +11199,8 @@ private enum PREPARED_STATEMENT { + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"), //NON-NLS INSERT_FILE_SYSTEM_FILE("INSERT INTO tsk_files(obj_id, fs_obj_id, data_source_obj_id, attr_type, attr_id, name, meta_addr, meta_seq, type, has_path, dir_type, meta_type, dir_flags, meta_flags, size, ctime, crtime, atime, mtime, parent_path, extension)" + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"), // NON-NLS + INSERT_FILE_SYSTEM_FILE_All_FIELDS("INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension)" + + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"), // NON-NLS UPDATE_DERIVED_FILE("UPDATE tsk_files SET type = ?, dir_type = ?, meta_type = ?, dir_flags = ?, meta_flags = ?, size= ?, ctime= ?, crtime= ?, atime= ?, mtime= ?, mime_type = ? " + "WHERE obj_id = ?"), //NON-NLS INSERT_LAYOUT_FILE("INSERT INTO tsk_file_layout (obj_id, byte_start, byte_len, sequence) " //NON-NLS -- GitLab