diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp index 3b24fb03fc20d2caf3f032d2a4eaebe103b2e398..9d37865f844519e1047820fe210ba17cd8cce8d7 100755 --- a/tsk/auto/auto_db.cpp +++ b/tsk/auto/auto_db.cpp @@ -340,6 +340,10 @@ TskAutoDb::addUnallocatedPoolBlocksToDb(const TSK_POOL_INFO * pool_info, int64_t return TSK_FILTER_CONT; } + // Create the volume + int64_t unallocVolObjId; + m_db->addUnallocatedPoolVolume(pool_info->num_vols, poolObjId, unallocVolObjId); + TSK_FS_ATTR_RUN * unalloc_runs = tsk_pool_unallocated_runs(pool_info); TSK_FS_ATTR_RUN * current_run = unalloc_runs; vector<TSK_DB_FILE_LAYOUT_RANGE> ranges; @@ -349,7 +353,7 @@ TskAutoDb::addUnallocatedPoolBlocksToDb(const TSK_POOL_INFO * pool_info, int64_t ranges.push_back(tempRange); int64_t fileObjId = 0; - if (m_db->addUnallocBlockFile(poolObjId, NULL, current_run->len * pool_info->block_size, ranges, fileObjId, m_curImgId)) { + if (m_db->addUnallocBlockFile(unallocVolObjId, NULL, current_run->len * pool_info->block_size, ranges, fileObjId, m_curImgId)) { registerError(); tsk_fs_attr_run_free(unalloc_runs); return TSK_FILTER_STOP; diff --git a/tsk/auto/db_postgresql.cpp b/tsk/auto/db_postgresql.cpp index 486c6f9c492aa2e53830a3054cfea6aeadb2cf54..e9fc5dee9e3c86d2d66c617374efb7d9f0ddb99e 100755 --- a/tsk/auto/db_postgresql.cpp +++ b/tsk/auto/db_postgresql.cpp @@ -1083,6 +1083,37 @@ TskDbPostgreSQL::addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, return TSK_OK; } +/** +* Adds a fake volume that will hold the unallocated blocks for the pool. +* @returns 1 on error, 0 on success +*/ +int +TskDbPostgreSQL::addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId) +{ + + char stmt[1024]; + + if (addObject(TSK_DB_OBJECT_TYPE_VOL, parObjId, objId)) + return 1; + + char *desc = "Unallocated Blocks"; + char *desc_sql = PQescapeLiteral(conn, desc, strlen(desc)); + + snprintf(stmt, 1024, + "INSERT INTO tsk_vs_parts (obj_id, addr, start, length, descr, flags)" + "VALUES (%lld, %" PRIuPNUM ",%" PRIuDADDR ",%" PRIuDADDR ",%s,%d)", + objId, vol_index, 0, 0, + desc_sql, 0); + + if (attempt_exec(stmt, "Error adding data to tsk_vs_parts table: %s\n")) { + PQfreemem(desc_sql); + return TSK_ERR; + } + + PQfreemem(desc_sql); + return TSK_OK; +} + /** * @returns 1 on error, 0 on success diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp index 72c79655d09d8fbecb3f134edaf2f465428a4f96..99bfdeae4114fbe82be98159732311b5ea5e6891 100644 --- a/tsk/auto/db_sqlite.cpp +++ b/tsk/auto/db_sqlite.cpp @@ -795,13 +795,31 @@ TskDbSqlite::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, } /** -* Adds the sector addresses of the pool volumes into the db. - -* @param pool_vol The pool volume to save to the DB -* @param parObjId The ID of the parent of the pool volume (should be a volume system) -* @param objId Will be set to the object ID of the new volume +* Adds a fake volume that will hold the unallocated blocks for the pool. * @returns 1 on error, 0 on success */ +int +TskDbSqlite::addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId) +{ + char* zSQL; + int ret; + + if (addObject(TSK_DB_OBJECT_TYPE_VOL, parObjId, objId)) + return 1; + + char* desc = "Unallocated Blocks"; + zSQL = sqlite3_mprintf( + "INSERT INTO tsk_vs_parts (obj_id, addr, start, length, desc, flags)" + "VALUES (%lld, %" PRIuPNUM ",%" PRIuDADDR ",%" PRIuDADDR ",'%q',%d)", + objId, vol_index, 0, 0, + desc, 0); + + ret = attempt_exec(zSQL, + "Error adding data to tsk_vs_parts table: %s\n"); + sqlite3_free(zSQL); + return ret; +} + int TskDbSqlite::addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, int64_t parObjId, int64_t& objId) diff --git a/tsk/auto/tsk_db.h b/tsk/auto/tsk_db.h index 770aa9e4800c25977c7a4c13c1d66caf679ab029..d23fa6225c494a9de6023742bfbf66f13bce9627 100755 --- a/tsk/auto/tsk_db.h +++ b/tsk/auto/tsk_db.h @@ -183,6 +183,7 @@ class TskDb { virtual int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId) = 0; virtual int addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, int64_t parObjId, int64_t& objId) = 0; + virtual int addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId) = 0; virtual int addFsInfo(const TSK_FS_INFO * fs_info, int64_t parObjId, int64_t & objId) = 0; virtual int addFsFile(TSK_FS_FILE * fs_file, const TSK_FS_ATTR * fs_attr, const char *path, const unsigned char *const md5, diff --git a/tsk/auto/tsk_db_postgresql.h b/tsk/auto/tsk_db_postgresql.h index fcc3c620def43d1e62b6fbb38ea4444dee879d6f..54ed115642cf032852c86f30552929e075db42bf 100755 --- a/tsk/auto/tsk_db_postgresql.h +++ b/tsk/auto/tsk_db_postgresql.h @@ -61,6 +61,7 @@ class TskDbPostgreSQL : public TskDb { int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId); int addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, int64_t parObjId, int64_t& objId); + int addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId); int addFsFile(TSK_FS_FILE * fs_file, const TSK_FS_ATTR * fs_attr, const char *path, const unsigned char *const md5, const TSK_DB_FILES_KNOWN_ENUM known, int64_t fsObjId, diff --git a/tsk/auto/tsk_db_sqlite.h b/tsk/auto/tsk_db_sqlite.h index f0aec6536e16e6acae434ce709c9d4d57159b631..933ef6c74bcb7edbb805ff8baf84952531f67693 100755 --- a/tsk/auto/tsk_db_sqlite.h +++ b/tsk/auto/tsk_db_sqlite.h @@ -53,6 +53,7 @@ class TskDbSqlite : public TskDb { int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId); int addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, int64_t parObjId, int64_t& objId); + int addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId); int addVolumeInfo(const TSK_VS_PART_INFO * vs_part, int64_t parObjId, int64_t & objId); int addFsInfo(const TSK_FS_INFO * fs_info, int64_t parObjId,