19 package org.sleuthkit.datamodel;
21 import java.io.BufferedReader;
22 import java.io.FileReader;
23 import java.io.IOException;
24 import java.text.DateFormat;
25 import java.text.SimpleDateFormat;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.GregorianCalendar;
29 import java.util.HashMap;
30 import java.util.HashSet;
31 import java.util.List;
34 import java.util.TimeZone;
35 import java.util.UUID;
36 import java.util.concurrent.locks.ReadWriteLock;
37 import java.util.concurrent.locks.ReentrantReadWriteLock;
38 import org.apache.commons.lang3.StringUtils;
58 private static final ReadWriteLock tskLock =
new ReentrantReadWriteLock();
77 private static class CaseHandles {
82 private final Map<String, Long> imageHandleCache =
new HashMap<>();
88 private final Map<Long, Map<Long, Long>> fsHandleCache =
new HashMap<>();
94 private final Set<Long> fileHandleCache =
new HashSet<>();
96 private final Map<Long, List<Long>> fileSystemToFileHandles =
new HashMap<>();
98 private final Map<Long, Map<Long, Long>> poolHandleCache =
new HashMap<>();
101 private final List<Long> poolImgCache =
new ArrayList<>();
110 private final List<Long> poolFsList =
new ArrayList<>();
112 private CaseHandles() {
123 private static class HandleCache {
128 private static final Object cacheLock =
new Object();
130 private static final Map<String, CaseHandles> caseHandlesCache =
new HashMap<>();
132 private static final String INVALID_FILE_HANDLE =
"Invalid file handle.";
143 private static final List<Long> poolFileHandles =
new ArrayList<>();
150 private static void createCaseHandleCache(String caseIdentifier) {
151 caseHandlesCache.put(caseIdentifier,
new CaseHandles());
163 synchronized (cacheLock) {
164 if (caseHandlesCache.keySet().size() > 1) {
165 throw new TskCoreException(
"Can not get default case identifier with multiple open cases");
166 }
else if (caseHandlesCache.keySet().isEmpty()) {
167 throw new TskCoreException(
"Can not get default case identifier with no open case");
170 return (caseHandlesCache.keySet().iterator().next());
181 private static CaseHandles getCaseHandles(String caseIdentifier) {
182 synchronized (cacheLock) {
183 return caseHandlesCache.get(caseIdentifier);
192 private static void removeCaseHandlesCache(String caseIdentifier) {
193 synchronized (cacheLock) {
194 if (caseHandlesCache.containsKey(caseIdentifier)) {
195 caseHandlesCache.get(caseIdentifier).fsHandleCache.clear();
196 caseHandlesCache.get(caseIdentifier).imageHandleCache.clear();
197 caseHandlesCache.get(caseIdentifier).fileHandleCache.clear();
198 caseHandlesCache.get(caseIdentifier).fileSystemToFileHandles.clear();
199 caseHandlesCache.get(caseIdentifier).poolHandleCache.clear();
200 caseHandlesCache.remove(caseIdentifier);
212 private static boolean isImageInAnyCache(
long imgHandle) {
213 synchronized (cacheLock) {
214 for (String caseIdentifier:caseHandlesCache.keySet()) {
215 if (caseHandlesCache.get(caseIdentifier).fsHandleCache.keySet().contains(imgHandle)) {
230 private static void addFileHandle(String caseIdentifier,
long fileHandle,
long fsHandle) {
231 synchronized (cacheLock) {
233 getCaseHandles(caseIdentifier).fileHandleCache.add(fileHandle);
236 if (getCaseHandles(caseIdentifier).fileSystemToFileHandles.containsKey(fsHandle)) {
237 getCaseHandles(caseIdentifier).fileSystemToFileHandles.get(fsHandle).add(fileHandle);
239 getCaseHandles(caseIdentifier).fileSystemToFileHandles.put(fsHandle,
new ArrayList<Long>(Arrays.asList(fileHandle)));
250 private static void removeFileHandle(
long fileHandle,
SleuthkitCase skCase) {
251 synchronized (cacheLock) {
253 if (skCase != null) {
255 getCaseHandles(skCase.getUniqueCaseIdentifier()).fileHandleCache.remove(fileHandle);
262 for (String caseIdentifier:caseHandlesCache.keySet()) {
263 if (caseHandlesCache.get(caseIdentifier).fileHandleCache.contains(fileHandle)) {
264 caseHandlesCache.get(caseIdentifier).fileHandleCache.remove(fileHandle);
279 private static boolean isValidFileHandle(
long fileHandle) {
280 synchronized (cacheLock) {
281 for (String caseIdentifier:caseHandlesCache.keySet()) {
282 if (caseHandlesCache.get(caseIdentifier).fileHandleCache.contains(fileHandle)) {
290 private static void closeHandlesAndClearCache(String caseIdentifier)
throws TskCoreException {
291 synchronized (cacheLock) {
295 for (Map<Long, Long> imageToFsMap : getCaseHandles(caseIdentifier).fsHandleCache.values()) {
296 for (Long fsHandle : imageToFsMap.values()) {
298 if (getCaseHandles(caseIdentifier).fileSystemToFileHandles.containsKey(fsHandle)) {
299 for (Long fileHandle : getCaseHandles(caseIdentifier).fileSystemToFileHandles.get(fsHandle)) {
301 if (poolFileHandles.contains(fileHandle)) {
302 poolFileHandles.remove(fileHandle);
308 closeFsNat(fsHandle);
315 getCaseHandles(caseIdentifier).poolFsList.clear();
320 for (Long imgHandle : getCaseHandles(caseIdentifier).poolHandleCache.keySet()) {
321 for (Long poolHandle : getCaseHandles(caseIdentifier).poolHandleCache.get(imgHandle).values()) {
322 closePoolNat(poolHandle);
329 for (Long imageHandle : getCaseHandles(caseIdentifier).poolImgCache) {
330 closeImgNat(imageHandle);
336 for (Long imageHandle : getCaseHandles(caseIdentifier).imageHandleCache.values()) {
337 closeImgNat(imageHandle);
340 removeCaseHandlesCache(caseIdentifier);
355 private final String caseDbIdentifier;
364 this.caseDbIdentifier =
"SingleUser:" + databaseName;
365 HandleCache.createCaseHandleCache(caseDbIdentifier);
376 this.caseDbIdentifier =
"MultiUser:" + info.
getHost() +
":" + databaseName;
377 HandleCache.createCaseHandleCache(caseDbIdentifier);
385 String getCaseDbIdentifier() {
386 return caseDbIdentifier;
396 tskLock.writeLock().lock();
398 HandleCache.closeHandlesAndClearCache(caseDbIdentifier);
401 tskLock.writeLock().unlock();
431 long tskAutoDbPointer = initializeAddImgNat(dbHelper, timezoneLongToShort(timeZone),
false,
false,
false);
432 runOpenAndAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(
new String[0]), imageFilePaths.size(), timeZone);
433 long id = finishAddImgNat(tskAutoDbPointer);
435 skCase.addDataSourceToHasChildrenMap();
458 AddImageProcess initAddImageProcess(String timeZone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String imageCopyPath,
SleuthkitCase skCase) {
459 return new AddImageProcess(timeZone, addUnallocSpace, skipFatFsOrphans, imageCopyPath, skCase);
468 private final String timeZone;
469 private final boolean addUnallocSpace;
470 private final boolean skipFatFsOrphans;
471 private final String imageWriterPath;
472 private volatile long tskAutoDbPointer;
473 private long imageId = 0;
474 private boolean isCanceled;
476 private JniDbHelper dbHelper;
491 private AddImageProcess(String timeZone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String imageWriterPath,
SleuthkitCase skCase) {
492 this.timeZone = timeZone;
493 this.addUnallocSpace = addUnallocSpace;
494 this.skipFatFsOrphans = skipFatFsOrphans;
495 this.imageWriterPath = imageWriterPath;
496 tskAutoDbPointer = 0;
497 this.isCanceled =
false;
498 this.skCase = skCase;
540 public void run(String deviceId,
Image image,
int sectorSize,
542 dbHelper =
new JniDbHelper(skCase, addDataSourceCallbacks);
545 long imageHandle = 0;
546 synchronized (
this) {
547 if (0 != tskAutoDbPointer) {
548 throw new TskCoreException(
"Add image process already started");
551 imageHandle = image.getImageHandle();
552 tskAutoDbPointer = initAddImgNat(dbHelper, timezoneLongToShort(timeZone), addUnallocSpace, skipFatFsOrphans);
554 if (0 == tskAutoDbPointer) {
555 throw new TskCoreException(
"initAddImgNat returned a NULL TskAutoDb pointer");
558 if (imageHandle != 0) {
559 runAddImgNat(tskAutoDbPointer, deviceId, imageHandle, image.getId(), timeZone, imageWriterPath);
562 finishAddImageProcess();
563 releaseTSKReadLock();
576 public synchronized void stop() throws TskCoreException {
580 if (tskAutoDbPointer != 0) {
581 stopAddImgNat(tskAutoDbPointer);
584 releaseTSKReadLock();
598 private synchronized void finishAddImageProcess() throws TskCoreException {
599 if (tskAutoDbPointer == 0) {
605 if (! this.isCanceled && dbHelper != null) {
610 imageId = finishAddImgNat(tskAutoDbPointer);
611 tskAutoDbPointer = 0;
613 skCase.addDataSourceToHasChildrenMap();
625 public synchronized void revert() throws TskCoreException {
641 public synchronized long commit() throws TskCoreException {
652 return tskAutoDbPointer == 0 ?
"" : getCurDirNat(tskAutoDbPointer);
672 run(null, imageFilePaths, 0);
691 run(deviceId, imageFilePaths, 0);
708 static CaseDbHandle newCaseDb(String path)
throws TskCoreException {
709 return new CaseDbHandle(path);
724 static CaseDbHandle newCaseDb(String databaseName, CaseDbConnectionInfo info)
throws TskCoreException {
725 return new CaseDbHandle(databaseName, info);
739 static CaseDbHandle openCaseDb(String path)
throws TskCoreException {
740 return new CaseDbHandle(path);
755 static CaseDbHandle openCaseDb(String databaseName, CaseDbConnectionInfo info)
throws TskCoreException {
756 return new CaseDbHandle(databaseName, info);
765 return getVersionNat();
774 startVerboseLoggingNat(logPath);
789 if (skCase == null) {
790 throw new TskCoreException(
"SleuthkitCase can not be null");
792 return openImage(imageFiles, 0,
true, skCase.getUniqueCaseIdentifier());
809 if (skCase == null) {
810 throw new TskCoreException(
"SleuthkitCase can not be null");
812 return openImage(imageFiles, sSize,
true, skCase.getUniqueCaseIdentifier());
832 private static long openImage(String[] imageFiles,
int sSize,
boolean useCache, String caseIdentifer)
throws TskCoreException {
837 StringBuilder keyBuilder =
new StringBuilder();
838 for (
int i = 0; i < imageFiles.length; ++i) {
839 keyBuilder.append(imageFiles[i]);
841 final String imageKey = keyBuilder.toString();
843 synchronized (HandleCache.cacheLock) {
844 String nonNullCaseIdentifer = caseIdentifer;
845 if (nonNullCaseIdentifer == null) {
846 nonNullCaseIdentifer = HandleCache.getDefaultCaseIdentifier();
854 if (!useCache && HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.containsKey(imageKey)) {
855 long tempImageHandle = HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.get(imageKey);
859 String newPath =
"Image_" + UUID.randomUUID().toString();
860 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.put(newPath, tempImageHandle);
861 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.remove(imageKey);
864 if (useCache && HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.containsKey(imageKey))
866 imageHandle = HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.get(imageKey);
869 imageHandle = openImgNat(imageFiles, imageFiles.length, sSize);
870 HandleCache.getCaseHandles(nonNullCaseIdentifer).fsHandleCache.put(imageHandle,
new HashMap<>());
871 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.put(imageKey, imageHandle);
876 releaseTSKReadLock();
891 private static void cacheImageHandle(SleuthkitCase skCase, List<String> imagePaths,
long imageHandle) {
894 StringBuilder keyBuilder =
new StringBuilder();
895 for (
int i = 0; i < imagePaths.size(); ++i) {
896 keyBuilder.append(imagePaths.get(i));
898 final String imageKey = keyBuilder.toString();
902 String caseIdentifier = skCase.getUniqueCaseIdentifier();
904 synchronized (HandleCache.cacheLock) {
905 HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.put(imageHandle,
new HashMap<>());
906 HandleCache.getCaseHandles(caseIdentifier).imageHandleCache.put(imageKey, imageHandle);
908 }
catch (TskCoreException ex) {
930 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId)
throws TskCoreException {
933 long imageHandle = openImgNat(imagePaths, 1, sectorSize);
936 List<String> computedPaths = Arrays.asList(getPathsForImageNat(imageHandle));
937 long size = getSizeForImageNat(imageHandle);
938 long type = getTypeForImageNat(imageHandle);
939 long computedSectorSize = getSectorSizeForImageNat(imageHandle);
940 String md5 = md5fromSettings;
941 if (StringUtils.isEmpty(md5)) {
942 md5 = getMD5HashForImageNat(imageHandle);
944 String sha1 = sha1fromSettings;
945 if (StringUtils.isEmpty(sha1)) {
946 sha1 = getSha1HashForImageNat(imageHandle);
950 String sha256 = sha256fromSettings;
951 if (sha256 == null) {
954 String collectionDetails = getCollectionDetailsForImageNat(imageHandle);
960 size, null, computedPaths,
961 timeZone, md5, sha1, sha256,
962 deviceId, transaction);
963 if (!StringUtils.isEmpty(collectionDetails)) {
968 img.setImageHandle(imageHandle);
969 cacheImageHandle(skCase, computedPaths, imageHandle);
971 }
catch (TskCoreException ex) {
991 public static long openVs(
long imgHandle,
long vsOffset)
throws TskCoreException {
994 if(! imgHandleIsValid(imgHandle)) {
995 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
997 return openVsNat(imgHandle, vsOffset);
999 releaseTSKReadLock();
1015 public static long openVsPart(
long vsHandle,
long volId)
throws TskCoreException {
1019 return openVolNat(vsHandle, volId);
1021 releaseTSKReadLock();
1036 static long openPool(
long imgHandle,
long offset,
SleuthkitCase skCase)
throws TskCoreException {
1039 if(! imgHandleIsValid(imgHandle)) {
1040 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1043 synchronized (HandleCache.cacheLock) {
1044 String caseIdentifier;
1045 if (skCase == null) {
1046 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1048 caseIdentifier = skCase.getUniqueCaseIdentifier();
1052 if (! HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.containsKey(imgHandle)) {
1053 HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.put(imgHandle,
new HashMap<>());
1057 Map<Long, Long> poolCacheForImage = HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.get(imgHandle);
1059 if (poolCacheForImage.containsKey(offset)) {
1060 return poolCacheForImage.get(offset);
1063 long poolHandle = openPoolNat(imgHandle, offset);
1064 poolCacheForImage.put(offset, poolHandle);
1069 releaseTSKReadLock();
1090 synchronized (HandleCache.cacheLock) {
1091 String caseIdentifier;
1092 if (skCase == null) {
1093 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1095 caseIdentifier = skCase.getUniqueCaseIdentifier();
1097 final Map<Long, Long> imgOffSetToFsHandle = HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.get(imgHandle);
1098 if (imgOffSetToFsHandle == null) {
1099 throw new TskCoreException(
"Missing image offset to file system handle cache for image handle " + imgHandle);
1101 if (imgOffSetToFsHandle.containsKey(fsOffset)) {
1103 fsHandle = imgOffSetToFsHandle.get(fsOffset);
1105 fsHandle = openFsNat(imgHandle, fsOffset);
1107 imgOffSetToFsHandle.put(fsOffset, fsHandle);
1112 releaseTSKReadLock();
1132 static long openFsPool(
long imgHandle,
long fsOffset,
long poolHandle,
long poolBlock,
SleuthkitCase skCase)
throws TskCoreException {
1141 synchronized (HandleCache.cacheLock) {
1142 String caseIdentifier;
1143 if (skCase == null) {
1144 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1146 caseIdentifier = skCase.getUniqueCaseIdentifier();
1148 final Map<Long, Long> imgOffSetToFsHandle = HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.get(imgHandle);
1149 if (imgOffSetToFsHandle == null) {
1150 throw new TskCoreException(
"Missing image offset to file system handle cache for image handle " + imgHandle);
1153 if (imgOffSetToFsHandle.containsKey(poolBlock)) {
1155 fsHandle = imgOffSetToFsHandle.get(poolBlock);
1157 long poolImgHandle = getImgInfoForPoolNat(poolHandle, poolBlock);
1158 HandleCache.getCaseHandles(caseIdentifier).poolImgCache.add(poolImgHandle);
1159 fsHandle = openFsNat(poolImgHandle, fsOffset);
1161 imgOffSetToFsHandle.put(poolBlock, fsHandle);
1162 HandleCache.getCaseHandles(caseIdentifier).poolFsList.add(fsHandle);
1167 releaseTSKWriteLock();
1197 boolean withinPool =
false;
1198 synchronized (HandleCache.cacheLock) {
1199 String caseIdentifier;
1200 if (skCase == null) {
1201 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1203 caseIdentifier = skCase.getUniqueCaseIdentifier();
1205 if (HandleCache.getCaseHandles(caseIdentifier).poolFsList.contains(fsHandle)) {
1221 long fileHandle = openFileNat(fsHandle, fileId, attrType.getValue(), convertSignedToUnsigned(attrId));
1222 synchronized (HandleCache.cacheLock) {
1223 String caseIdentifier;
1224 if (skCase == null) {
1225 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1227 caseIdentifier = skCase.getUniqueCaseIdentifier();
1229 HandleCache.addFileHandle(caseIdentifier, fileHandle, fsHandle);
1234 HandleCache.poolFileHandles.add(fileHandle);
1240 releaseTSKWriteLock();
1242 releaseTSKReadLock();
1254 private static int convertSignedToUnsigned(
int val) {
1259 return val & 0xffff;
1267 private static boolean imgHandleIsValid(
long imgHandle) {
1268 synchronized(HandleCache.cacheLock) {
1269 return HandleCache.isImageInAnyCache(imgHandle);
1288 public static int readImg(
long imgHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1291 if(! imgHandleIsValid(imgHandle)) {
1292 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1295 return readImgNat(imgHandle, readBuffer, offset, len);
1297 releaseTSKReadLock();
1315 public static int readVs(
long vsHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1318 return readVsNat(vsHandle, readBuffer, offset, len);
1320 releaseTSKReadLock();
1336 static int readPool(
long poolHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1339 return readPoolNat(poolHandle, readBuffer, offset, len);
1341 releaseTSKReadLock();
1359 public static int readVsPart(
long volHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1363 return readVolNat(volHandle, readBuffer, offset, len);
1365 releaseTSKReadLock();
1383 public static int readFs(
long fsHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1387 return readFsNat(fsHandle, readBuffer, offset, len);
1389 releaseTSKReadLock();
1397 private enum TSK_FS_FILE_READ_OFFSET_TYPE_ENUM {
1401 private final int val;
1403 TSK_FS_FILE_READ_OFFSET_TYPE_ENUM(
int val) {
1426 public static int readFile(
long fileHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1427 boolean withinPool =
false;
1428 synchronized (HandleCache.cacheLock) {
1429 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1445 if (!HandleCache.isValidFileHandle(fileHandle)) {
1446 throw new TskCoreException(HandleCache.INVALID_FILE_HANDLE);
1449 return readFileNat(fileHandle, readBuffer, offset, TSK_FS_FILE_READ_OFFSET_TYPE_ENUM.START_OF_FILE.getValue(), len);
1452 releaseTSKWriteLock();
1454 releaseTSKReadLock();
1473 public static int readFileSlack(
long fileHandle, byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1476 if (!HandleCache.isValidFileHandle(fileHandle)) {
1477 throw new TskCoreException(HandleCache.INVALID_FILE_HANDLE);
1480 return readFileNat(fileHandle, readBuffer, offset, TSK_FS_FILE_READ_OFFSET_TYPE_ENUM.START_OF_SLACK.getValue(), len);
1482 releaseTSKReadLock();
1499 if (!HandleCache.isValidFileHandle(fileHandle)) {
1500 throw new TskCoreException(HandleCache.INVALID_FILE_HANDLE);
1504 java.io.File tmp = java.io.File.createTempFile(
"tsk",
".txt");
1506 saveFileMetaDataTextNat(fileHandle, tmp.getAbsolutePath());
1508 FileReader fr =
new FileReader(tmp.getAbsolutePath());
1509 BufferedReader textReader =
new BufferedReader(fr);
1511 List<String> lines =
new ArrayList<String>();
1513 String line = textReader.readLine();
1523 }
catch (IOException ex) {
1524 throw new TskCoreException(
"Error reading istat output: " + ex.getLocalizedMessage());
1527 releaseTSKReadLock();
1547 boolean withinPool =
false;
1548 synchronized (HandleCache.cacheLock) {
1549 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1565 synchronized (HandleCache.cacheLock) {
1566 if (!HandleCache.isValidFileHandle(fileHandle)) {
1570 closeFileNat(fileHandle);
1571 HandleCache.removeFileHandle(fileHandle, skCase);
1572 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1573 HandleCache.poolFileHandles.remove(fileHandle);
1578 releaseTSKWriteLock();
1580 releaseTSKReadLock();
1593 hashDbCreateIndexNat(dbHandle);
1606 return hashDbIndexExistsNat(dbHandle);
1620 return hashDbIsReindexableNat(dbHandle);
1633 return hashDbPathNat(dbHandle);
1646 return hashDbIndexPathNat(dbHandle);
1656 return hashDbOpenNat(path);
1669 return hashDbNewNat(path);
1692 hashDbClose(dbHandle);
1705 return hashDbGetDisplayName(dbHandle);
1719 return hashDbLookup(hash, dbHandle);
1734 return hashDbLookupVerbose(hash, dbHandle);
1749 public static void addToHashDatabase(String filename, String md5, String sha1, String sha256, String comment,
int dbHandle)
throws TskCoreException {
1750 hashDbAddEntryNat(filename, md5, sha1, sha256, comment, dbHandle);
1753 public static void addToHashDatabase(List<HashEntry> hashes,
int dbHandle)
throws TskCoreException {
1754 hashDbBeginTransactionNat(dbHandle);
1757 hashDbAddEntryNat(entry.getFileName(), entry.getMd5Hash(), entry.getSha1Hash(), entry.getSha256Hash(), entry.getComment(), dbHandle);
1759 hashDbCommitTransactionNat(dbHandle);
1760 }
catch (TskCoreException ex) {
1762 hashDbRollbackTransactionNat(dbHandle);
1763 }
catch (TskCoreException ex2) {
1772 return hashDbIsUpdateableNat(dbHandle);
1776 return hashDbIsIdxOnlyNat(dbHandle);
1788 private static String timezoneLongToShort(String timezoneLongForm) {
1789 if (timezoneLongForm == null || timezoneLongForm.isEmpty()) {
1793 String timezoneShortForm;
1794 TimeZone zone = TimeZone.getTimeZone(timezoneLongForm);
1795 int offset = zone.getRawOffset() / 1000;
1796 int hour = offset / 3600;
1797 int min = (offset % 3600) / 60;
1798 DateFormat dfm =
new SimpleDateFormat(
"z");
1799 dfm.setTimeZone(zone);
1800 boolean hasDaylight = zone.useDaylightTime();
1801 String first = dfm.format(
new GregorianCalendar(2010, 1, 1).getTime()).substring(0, 3);
1802 String second = dfm.format(
new GregorianCalendar(2011, 6, 6).getTime()).substring(0, 3);
1803 int mid = hour * -1;
1804 timezoneShortForm = first + Integer.toString(mid);
1806 timezoneShortForm = timezoneShortForm +
":" + (min < 10 ?
"0" :
"") + Integer.toString(min);
1809 timezoneShortForm += second;
1811 return timezoneShortForm;
1827 if(! imgHandleIsValid(imgHandle)) {
1828 throw new TskCoreException(
"Image handle " + imgHandle +
" is closed");
1830 return finishImageWriterNat(imgHandle);
1832 releaseTSKReadLock();
1846 if (imgHandleIsValid(imgHandle)) {
1847 return getFinishImageProgressNat(imgHandle);
1852 releaseTSKReadLock();
1864 if (imgHandleIsValid(imgHandle)) {
1865 cancelFinishImageNat(imgHandle);
1868 releaseTSKReadLock();
1884 return findDeviceSizeNat(devPath);
1888 return isImageSupportedNat(imagePath);
1904 static long getSleuthkitVersion() {
1905 return getSleuthkitVersionNat();
1912 private static void getTSKReadLock() {
1913 tskLock.readLock().lock();
1919 private static void releaseTSKReadLock() {
1920 tskLock.readLock().unlock();
1930 private static void getTSKWriteLock() {
1931 tskLock.writeLock().lock();
1937 private static void releaseTSKWriteLock() {
1938 tskLock.writeLock().unlock();
1986 public static long openImage(String[] imageFiles)
throws TskCoreException {
1988 return openImage(imageFiles, 0,
true, null);
2005 public static long openImage(String[] imageFiles,
int sSize)
throws TskCoreException {
2006 return openImage(imageFiles, sSize,
true, null);
2024 public static long openFs(
long imgHandle,
long fsOffset)
throws TskCoreException {
2025 return openFs(imgHandle, fsOffset, null);
2044 return openFile(fsHandle, fileId, attrType, attrId, null);
2048 private static native String getVersionNat();
2050 private static native
void startVerboseLoggingNat(String logPath);
2052 private static native
int hashDbOpenNat(String hashDbPath)
throws TskCoreException;
2054 private static native
int hashDbNewNat(String hashDbPath)
throws TskCoreException;
2056 private static native
int hashDbBeginTransactionNat(
int dbHandle)
throws TskCoreException;
2058 private static native
int hashDbCommitTransactionNat(
int dbHandle)
throws TskCoreException;
2060 private static native
int hashDbRollbackTransactionNat(
int dbHandle)
throws TskCoreException;
2062 private static native
int hashDbAddEntryNat(String filename, String hashMd5, String hashSha1, String hashSha256, String comment,
int dbHandle)
throws TskCoreException;
2064 private static native
boolean hashDbIsUpdateableNat(
int dbHandle);
2066 private static native
boolean hashDbIsReindexableNat(
int dbHandle);
2068 private static native String hashDbPathNat(
int dbHandle);
2070 private static native String hashDbIndexPathNat(
int dbHandle);
2072 private static native String hashDbGetDisplayName(
int dbHandle)
throws TskCoreException;
2074 private static native
void hashDbCloseAll() throws TskCoreException;
2076 private static native
void hashDbClose(
int dbHandle) throws TskCoreException;
2078 private static native
void hashDbCreateIndexNat(
int dbHandle) throws TskCoreException;
2080 private static native
boolean hashDbIndexExistsNat(
int dbHandle) throws TskCoreException;
2082 private static native
boolean hashDbIsIdxOnlyNat(
int dbHandle) throws TskCoreException;
2084 private static native
boolean hashDbLookup(String hash,
int dbHandle) throws TskCoreException;
2086 private static native
HashHitInfo hashDbLookupVerbose(String hash,
int dbHandle) throws TskCoreException;
2088 private static native
long initAddImgNat(JniDbHelper dbHelperObj, String timezone,
boolean addUnallocSpace,
boolean skipFatFsOrphans) throws TskCoreException;
2090 private static native
long initializeAddImgNat(JniDbHelper dbHelperObj, String timezone,
boolean addFileSystems,
boolean addUnallocSpace,
boolean skipFatFsOrphans) throws TskCoreException;
2092 private static native
void runOpenAndAddImgNat(
long process, String deviceId, String[] imgPath,
int splits, String timezone) throws TskCoreException,
TskDataException;
2094 private static native
void runAddImgNat(
long process, String deviceId,
long a_img_info,
long image_id, String timeZone, String imageWriterPath) throws TskCoreException, TskDataException;
2096 private static native
void stopAddImgNat(
long process) throws TskCoreException;
2098 private static native
long finishAddImgNat(
long process) throws TskCoreException;
2100 private static native
long openImgNat(String[] imgPath,
int splits,
int sSize) throws TskCoreException;
2102 private static native
long openVsNat(
long imgHandle,
long vsOffset) throws TskCoreException;
2104 private static native
long openVolNat(
long vsHandle,
long volId) throws TskCoreException;
2106 private static native
long openPoolNat(
long imgHandle,
long offset) throws TskCoreException;
2108 private static native
long getImgInfoForPoolNat(
long poolHandle,
long poolOffset) throws TskCoreException;
2110 private static native
long openFsNat(
long imgHandle,
long fsId) throws TskCoreException;
2112 private static native
long openFileNat(
long fsHandle,
long fileId,
int attrType,
int attrId) throws TskCoreException;
2114 private static native
int readImgNat(
long imgHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2116 private static native
int readVsNat(
long vsHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2118 private static native
int readPoolNat(
long poolHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2120 private static native
int readVolNat(
long volHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2122 private static native
int readFsNat(
long fsHandle, byte[] readBuffer,
long offset,
long len) throws TskCoreException;
2124 private static native
int readFileNat(
long fileHandle, byte[] readBuffer,
long offset,
int offset_type,
long len) throws TskCoreException;
2126 private static native
int saveFileMetaDataTextNat(
long fileHandle, String fileName) throws TskCoreException;
2128 private static native String[] getPathsForImageNat(
long imgHandle);
2130 private static native
long getSizeForImageNat(
long imgHandle);
2132 private static native
long getTypeForImageNat(
long imgHandle);
2134 private static native
long getSectorSizeForImageNat(
long imgHandle);
2136 private static native String getMD5HashForImageNat(
long imgHandle);
2138 private static native String getSha1HashForImageNat(
long imgHandle);
2140 private static native String getCollectionDetailsForImageNat(
long imgHandle);
2142 private static native
void closeImgNat(
long imgHandle);
2144 private static native
void closePoolNat(
long poolHandle);
2146 private static native
void closeVsNat(
long vsHandle);
2148 private static native
void closeFsNat(
long fsHandle);
2150 private static native
void closeFileNat(
long fileHandle);
2152 private static native
long findDeviceSizeNat(String devicePath) throws TskCoreException;
2154 private static native String getCurDirNat(
long process);
2156 private static native
boolean isImageSupportedNat(String imagePath);
2158 private static native
long getSleuthkitVersionNat();
2160 private static native
int finishImageWriterNat(
long a_img_info);
2162 private static native
int getFinishImageProgressNat(
long a_img_info);
2164 private static native
void cancelFinishImageNat(
long a_img_info);
static int readImg(long imgHandle, byte[] readBuffer, long offset, long len)
static String getHashDatabaseIndexPath(int dbHandle)
static int readVs(long vsHandle, byte[] readBuffer, long offset, long len)
static void createLookupIndexForHashDatabase(int dbHandle)
void run(String deviceId, Image image, int sectorSize, AddDataSourceCallbacks addDataSourceCallbacks)
static void addToHashDatabase(String filename, String md5, String sha1, String sha256, String comment, int dbHandle)
static long openFile(long fsHandle, long fileId, TSK_FS_ATTR_TYPE_ENUM attrType, int attrId, SleuthkitCase skCase)
static int createHashDatabase(String path)
static void closeFs(long fsHandle)
static void cancelFinishImage(long imgHandle)
static long openFile(long fsHandle, long fileId, TSK_FS_ATTR_TYPE_ENUM attrType, int attrId)
void run(String deviceId, String[] imageFilePaths)
static int readFile(long fileHandle, byte[] readBuffer, long offset, long len)
static int finishImageWriter(long imgHandle)
void setAcquisitionDetails(String details)
static HashHitInfo lookupInHashDatabaseVerbose(String hash, int dbHandle)
static long openVs(long imgHandle, long vsOffset)
synchronized long commit()
static long openImage(String[] imageFiles, SleuthkitCase skCase)
static boolean hashDatabaseIsIndexOnly(int dbHandle)
synchronized void revert()
static boolean isImageSupported(String imagePath)
static int readVsPart(long volHandle, byte[] readBuffer, long offset, long len)
static boolean loadSleuthkitJNI()
static void closeFile(long fileHandle, SleuthkitCase skCase)
static long openImage(String[] imageFiles, int sSize)
static void closeVs(long vsHandle)
static long openImage(String[] imageFiles)
static long openFs(long imgHandle, long fsOffset, SleuthkitCase skCase)
static long openImage(String[] imageFiles, int sSize, SleuthkitCase skCase)
void run(String deviceId, String[] imageFilePaths, int sectorSize)
static long findDeviceSize(String devPath)
static String getHashDatabaseDisplayName(int dbHandle)
static List< String > getFileMetaDataText(long fileHandle)
static void closeImg(long imgHandle)
static long openFs(long imgHandle, long fsOffset)
void run(String[] imageFilePaths)
synchronized String currentDirectory()
static int getFinishImageProgress(long imgHandle)
static int openHashDatabase(String path)
static void closeFile(long fileHandle)
static boolean lookupInHashDatabase(String hash, int dbHandle)
static TSK_IMG_TYPE_ENUM valueOf(long imgType)
static boolean hashDatabaseHasLookupIndex(int dbHandle)
static Image addImageToDatabase(SleuthkitCase skCase, String[] imagePaths, int sectorSize, String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId)
static long openVsPart(long vsHandle, long volId)
static int readFileSlack(long fileHandle, byte[] readBuffer, long offset, long len)
static boolean isUpdateableHashDatabase(int dbHandle)
static void addToHashDatabase(List< HashEntry > hashes, int dbHandle)
static void closeAllHashDatabases()
static boolean hashDatabaseCanBeReindexed(int dbHandle)
static String getVersion()
static void startVerboseLogging(String logPath)
static int readFs(long fsHandle, byte[] readBuffer, long offset, long len)
static String getHashDatabasePath(int dbHandle)
static void closeHashDatabase(int dbHandle)