53public class SleuthkitJNI {
55 private static final Logger logger = Logger.getLogger(SleuthkitJNI.class.getName());
63 private static final ReadWriteLock tskLock =
new ReentrantReadWriteLock();
76 private SleuthkitJNI() {
82 private static class CaseHandles {
87 private final Map<String, Long> imageHandleCache =
new HashMap<>();
93 private final Map<Long, Map<Long, Long>> fsHandleCache =
new HashMap<>();
99 private final Set<Long> fileHandleCache =
new HashSet<>();
101 private final Map<Long, List<Long>> fileSystemToFileHandles =
new HashMap<>();
103 private final Map<Long, Map<Long, Long>> poolHandleCache =
new HashMap<>();
106 private final List<Long> poolImgCache =
new ArrayList<>();
115 private final List<Long> poolFsList =
new ArrayList<>();
117 private CaseHandles() {
128 private static class HandleCache {
133 private static final Object cacheLock =
new Object();
135 private static final Map<String, CaseHandles> caseHandlesCache =
new HashMap<>();
137 private static final String INVALID_FILE_HANDLE =
"Invalid file handle.";
148 private static final List<Long> poolFileHandles =
new ArrayList<>();
155 private static void createCaseHandleCache(String caseIdentifier) {
156 caseHandlesCache.put(caseIdentifier,
new CaseHandles());
168 synchronized (cacheLock) {
169 if (caseHandlesCache.keySet().size() > 1) {
170 throw new TskCoreException(
"Can not get default case identifier with multiple open cases");
171 }
else if (caseHandlesCache.keySet().isEmpty()) {
172 throw new TskCoreException(
"Can not get default case identifier with no open case");
175 return (caseHandlesCache.keySet().iterator().next());
188 private static CaseHandles getCaseHandles(String caseIdentifier)
throws TskCoreException {
189 synchronized (cacheLock) {
190 if (caseHandlesCache.containsKey(caseIdentifier)) {
191 return caseHandlesCache.get(caseIdentifier);
194 throw new TskCoreException(
"No entry for case " + caseIdentifier +
" in cache. Case may have been closed");
203 private static void removeCaseHandlesCache(String caseIdentifier) {
204 synchronized (cacheLock) {
205 if (caseHandlesCache.containsKey(caseIdentifier)) {
206 caseHandlesCache.get(caseIdentifier).fsHandleCache.clear();
207 caseHandlesCache.get(caseIdentifier).imageHandleCache.clear();
208 caseHandlesCache.get(caseIdentifier).fileHandleCache.clear();
209 caseHandlesCache.get(caseIdentifier).fileSystemToFileHandles.clear();
210 caseHandlesCache.get(caseIdentifier).poolHandleCache.clear();
211 caseHandlesCache.remove(caseIdentifier);
223 private static boolean isImageInAnyCache(
long imgHandle) {
224 synchronized (cacheLock) {
225 for (String caseIdentifier:caseHandlesCache.keySet()) {
226 if (caseHandlesCache.get(caseIdentifier).fsHandleCache.keySet().contains(imgHandle)) {
241 private static void addFileHandle(String caseIdentifier,
long fileHandle,
long fsHandle) {
243 synchronized (cacheLock) {
245 getCaseHandles(caseIdentifier).fileHandleCache.add(fileHandle);
248 if (getCaseHandles(caseIdentifier).fileSystemToFileHandles.containsKey(fsHandle)) {
249 getCaseHandles(caseIdentifier).fileSystemToFileHandles.get(fsHandle).add(fileHandle);
251 getCaseHandles(caseIdentifier).fileSystemToFileHandles.put(fsHandle,
new ArrayList<>(Arrays.asList(fileHandle)));
255 logger.log(Level.WARNING,
"Error caching file handle for case {0}", caseIdentifier);
265 private static void removeFileHandle(
long fileHandle,
SleuthkitCase skCase) {
266 synchronized (cacheLock) {
268 if (skCase !=
null) {
270 getCaseHandles(skCase.getCaseHandleIdentifier()).fileHandleCache.remove(fileHandle);
276 for (String caseIdentifier:caseHandlesCache.keySet()) {
277 if (caseHandlesCache.get(caseIdentifier).fileHandleCache.contains(fileHandle)) {
278 caseHandlesCache.get(caseIdentifier).fileHandleCache.remove(fileHandle);
293 private static boolean isValidFileHandle(
long fileHandle) {
294 synchronized (cacheLock) {
295 for (String caseIdentifier:caseHandlesCache.keySet()) {
296 if (caseHandlesCache.get(caseIdentifier).fileHandleCache.contains(fileHandle)) {
304 private static void closeHandlesAndClearCache(String caseIdentifier)
throws TskCoreException {
305 synchronized (cacheLock) {
309 for (Map<Long, Long> imageToFsMap : getCaseHandles(caseIdentifier).fsHandleCache.values()) {
310 for (Long fsHandle : imageToFsMap.values()) {
312 if (getCaseHandles(caseIdentifier).fileSystemToFileHandles.containsKey(fsHandle)) {
313 for (Long fileHandle : getCaseHandles(caseIdentifier).fileSystemToFileHandles.get(fsHandle)) {
315 if (poolFileHandles.contains(fileHandle)) {
316 poolFileHandles.remove(fileHandle);
322 closeFsNat(fsHandle);
329 getCaseHandles(caseIdentifier).poolFsList.clear();
334 for (Long imgHandle : getCaseHandles(caseIdentifier).poolHandleCache.keySet()) {
335 for (Long poolHandle : getCaseHandles(caseIdentifier).poolHandleCache.get(imgHandle).values()) {
336 closePoolNat(poolHandle);
343 for (Long imageHandle : getCaseHandles(caseIdentifier).poolImgCache) {
344 closeImgNat(imageHandle);
350 for (Long imageHandle : getCaseHandles(caseIdentifier).imageHandleCache.values()) {
351 closeImgNat(imageHandle);
354 removeCaseHandlesCache(caseIdentifier);
364 public static class CaseDbHandle {
369 private final String caseDbIdentifier;
377 private CaseDbHandle(String databaseName) {
378 this.caseDbIdentifier =
"SingleUser:" + databaseName;
379 HandleCache.createCaseHandleCache(caseDbIdentifier);
390 this.caseDbIdentifier =
"MultiUser:" + info.
getHost() +
":" + databaseName;
391 HandleCache.createCaseHandleCache(caseDbIdentifier);
399 String getCaseDbIdentifier() {
400 return caseDbIdentifier;
410 tskLock.writeLock().lock();
412 HandleCache.closeHandlesAndClearCache(caseDbIdentifier);
415 tskLock.writeLock().unlock();
442 if (imageFilePaths.size() > 0) {
443 String path = imageFilePaths.get(0);
444 hostName = (
new java.io.File(path)).getName() +
" Host";
446 hostName =
"Image_" + deviceObjId +
" Host";
451 long tskAutoDbPointer = initializeAddImgPasswordNat(dbHelper, timezoneLongToShort(timeZone),
false,
false,
false, password);
452 runOpenAndAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(
new String[0]), imageFilePaths.size(), timeZone);
453 long id = finishAddImgNat(tskAutoDbPointer);
455 skCase.addDataSourceToHasChildrenMap();
480 AddImageProcess initAddImageProcess(String timeZone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String imageCopyPath, String password,
SleuthkitCase skCase) {
481 return new AddImageProcess(timeZone, addUnallocSpace, skipFatFsOrphans, imageCopyPath, password, skCase);
488 public class AddImageProcess {
490 private final String timeZone;
491 private final boolean addUnallocSpace;
492 private final boolean skipFatFsOrphans;
493 private final String imageWriterPath;
494 private volatile long tskAutoDbPointer;
495 private long imageId = 0;
496 private boolean isCanceled;
498 private TskCaseDbBridge dbHelper;
499 private final String password;
516 private AddImageProcess(String timeZone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String imageWriterPath, String password,
SleuthkitCase skCase) {
517 this.timeZone = timeZone;
518 this.addUnallocSpace = addUnallocSpace;
519 this.skipFatFsOrphans = skipFatFsOrphans;
520 this.imageWriterPath = imageWriterPath;
521 tskAutoDbPointer = 0;
522 this.isCanceled =
false;
523 this.skCase = skCase;
524 this.password = password;
566 public void run(String deviceId,
Image image,
int sectorSize,
569 dbHelper =
new TskCaseDbBridge(skCase, addDataSourceCallbacks, image.getHost());
572 long imageHandle = 0;
573 synchronized (
this) {
574 if (0 != tskAutoDbPointer) {
578 imageHandle = image.getImageHandle();
579 tskAutoDbPointer = initAddImgNatPassword(dbHelper, timezoneLongToShort(timeZone), addUnallocSpace, skipFatFsOrphans, password);
581 if (0 == tskAutoDbPointer) {
582 throw new TskCoreException(
"initAddImgNat returned a NULL TskAutoDb pointer");
585 if (imageHandle != 0) {
586 runAddImgNat(tskAutoDbPointer, deviceId, imageHandle, image.getId(), timeZone, imageWriterPath);
589 finishAddImageProcess();
590 releaseTSKReadLock();
607 if (tskAutoDbPointer != 0) {
608 stopAddImgNat(tskAutoDbPointer);
611 releaseTSKReadLock();
626 if (tskAutoDbPointer == 0) {
632 if (! this.isCanceled && dbHelper !=
null) {
637 imageId = finishAddImgNat(tskAutoDbPointer);
638 tskAutoDbPointer = 0;
640 skCase.addDataSourceToHasChildrenMap();
679 return tskAutoDbPointer == 0 ?
"" : getCurDirNat(tskAutoDbPointer);
699 run(
null, imageFilePaths, 0);
718 run(deviceId, imageFilePaths, 0);
736 return new CaseDbHandle(path);
751 static CaseDbHandle newCaseDb(String databaseName, CaseDbConnectionInfo info)
throws TskCoreException {
752 return new CaseDbHandle(databaseName, info);
766 static CaseDbHandle openCaseDb(String path)
throws TskCoreException {
767 return new CaseDbHandle(path);
782 static CaseDbHandle openCaseDb(String databaseName, CaseDbConnectionInfo info)
throws TskCoreException {
783 return new CaseDbHandle(databaseName, info);
792 return getVersionNat();
801 startVerboseLoggingNat(logPath);
816 if (skCase ==
null) {
819 return openImage(imageFiles, 0,
true, skCase.getCaseHandleIdentifier());
836 if (skCase ==
null) {
839 return openImage(imageFiles, sSize,
true, skCase.getCaseHandleIdentifier());
859 private static long openImage(String[] imageFiles,
int sSize,
boolean useCache, String caseIdentifer)
throws TskCoreException {
864 StringBuilder keyBuilder =
new StringBuilder();
865 for (
int i = 0; i < imageFiles.length; ++i) {
866 keyBuilder.append(imageFiles[i]);
868 final String imageKey = keyBuilder.toString();
870 synchronized (HandleCache.cacheLock) {
871 String nonNullCaseIdentifer = caseIdentifer;
872 if (nonNullCaseIdentifer ==
null) {
873 nonNullCaseIdentifer = HandleCache.getDefaultCaseIdentifier();
881 if (!useCache && HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.containsKey(imageKey)) {
882 long tempImageHandle = HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.get(imageKey);
886 String newPath =
"Image_" + UUID.randomUUID().toString();
887 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.put(newPath, tempImageHandle);
888 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.remove(imageKey);
891 if (useCache && HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.containsKey(imageKey))
893 imageHandle = HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.get(imageKey);
896 imageHandle = openImgNat(imageFiles, imageFiles.length, sSize);
897 HandleCache.getCaseHandles(nonNullCaseIdentifer).fsHandleCache.put(imageHandle,
new HashMap<>());
898 HandleCache.getCaseHandles(nonNullCaseIdentifer).imageHandleCache.put(imageKey, imageHandle);
903 releaseTSKReadLock();
920 private static void cacheImageHandle(SleuthkitCase skCase, List<String> imagePaths,
long imageHandle)
throws TskCoreException {
923 StringBuilder keyBuilder =
new StringBuilder();
924 for (
int i = 0; i < imagePaths.size(); ++i) {
925 keyBuilder.append(imagePaths.get(i));
927 final String imageKey = keyBuilder.toString();
930 String caseIdentifier = skCase.getCaseHandleIdentifier();
932 synchronized (HandleCache.cacheLock) {
933 HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.put(imageHandle,
new HashMap<>());
934 HandleCache.getCaseHandles(caseIdentifier).imageHandleCache.put(imageKey, imageHandle);
955 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId)
throws TskCoreException {
957 return addImageToDatabase(skCase, imagePaths, sectorSize, timeZone, md5fromSettings, sha1fromSettings, sha256fromSettings, deviceId,
null);
978 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId,
Host host)
throws TskCoreException {
980 return addImageToDatabase(skCase, imagePaths, sectorSize, timeZone, md5fromSettings, sha1fromSettings, sha256fromSettings, deviceId,
null, host);
1003 String timeZone, String md5fromSettings, String sha1fromSettings, String sha256fromSettings, String deviceId, String password,
Host host)
throws TskCoreException {
1006 long imageHandle = openImgNat(imagePaths, 1, sectorSize);
1009 List<String> computedPaths = Arrays.asList(getPathsForImageNat(imageHandle));
1010 long size = getSizeForImageNat(imageHandle);
1011 long type = getTypeForImageNat(imageHandle);
1012 long computedSectorSize = getSectorSizeForImageNat(imageHandle);
1013 String md5 = md5fromSettings;
1014 if (StringUtils.isEmpty(md5)) {
1015 md5 = getMD5HashForImageNat(imageHandle);
1017 String sha1 = sha1fromSettings;
1018 if (StringUtils.isEmpty(sha1)) {
1019 sha1 = getSha1HashForImageNat(imageHandle);
1023 String sha256 = sha256fromSettings;
1024 if (sha256 ==
null) {
1027 String collectionDetails = getCollectionDetailsForImageNat(imageHandle);
1033 size,
null, computedPaths,
1034 timeZone, md5, sha1, sha256,
1035 deviceId, host, password, transaction);
1036 if (!StringUtils.isEmpty(collectionDetails)) {
1037 skCase.setAcquisitionDetails(img, collectionDetails);
1041 img.setImageHandle(imageHandle);
1042 cacheImageHandle(skCase, computedPaths, imageHandle);
1067 if(! imgHandleIsValid(imgHandle)) {
1070 return openVsNat(imgHandle, vsOffset);
1072 releaseTSKReadLock();
1092 return openVolNat(vsHandle, volId);
1094 releaseTSKReadLock();
1112 if(! imgHandleIsValid(imgHandle)) {
1116 synchronized (HandleCache.cacheLock) {
1117 String caseIdentifier;
1118 if (skCase ==
null) {
1119 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1121 caseIdentifier = skCase.getCaseHandleIdentifier();
1125 if (! HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.containsKey(imgHandle)) {
1126 HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.put(imgHandle,
new HashMap<>());
1130 Map<Long, Long> poolCacheForImage = HandleCache.getCaseHandles(caseIdentifier).poolHandleCache.get(imgHandle);
1132 if (poolCacheForImage.containsKey(offset)) {
1133 return poolCacheForImage.get(offset);
1136 long poolHandle = openPoolNat(imgHandle, offset);
1137 poolCacheForImage.put(offset, poolHandle);
1142 releaseTSKReadLock();
1160 return openFs(imgHandle, fsOffset,
"", skCase);
1181 synchronized (HandleCache.cacheLock) {
1182 String caseIdentifier;
1183 if (skCase ==
null) {
1184 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1186 caseIdentifier = skCase.getCaseHandleIdentifier();
1188 final Map<Long, Long> imgOffSetToFsHandle = HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.get(imgHandle);
1189 if (imgOffSetToFsHandle ==
null) {
1190 throw new TskCoreException(
"Missing image offset to file system handle cache for image handle " + imgHandle);
1192 if (imgOffSetToFsHandle.containsKey(fsOffset)) {
1194 fsHandle = imgOffSetToFsHandle.get(fsOffset);
1196 fsHandle = openFsDecryptNat(imgHandle, fsOffset, password);
1198 imgOffSetToFsHandle.put(fsOffset, fsHandle);
1203 releaseTSKReadLock();
1232 synchronized (HandleCache.cacheLock) {
1233 String caseIdentifier;
1234 if (skCase ==
null) {
1235 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1237 caseIdentifier = skCase.getCaseHandleIdentifier();
1239 final Map<Long, Long> imgOffSetToFsHandle = HandleCache.getCaseHandles(caseIdentifier).fsHandleCache.get(imgHandle);
1240 if (imgOffSetToFsHandle ==
null) {
1241 throw new TskCoreException(
"Missing image offset to file system handle cache for image handle " + imgHandle);
1244 if (imgOffSetToFsHandle.containsKey(poolBlock)) {
1246 fsHandle = imgOffSetToFsHandle.get(poolBlock);
1248 long poolImgHandle = getImgInfoForPoolNat(poolHandle, poolBlock);
1249 HandleCache.getCaseHandles(caseIdentifier).poolImgCache.add(poolImgHandle);
1250 fsHandle = openFsNat(poolImgHandle, fsOffset);
1252 imgOffSetToFsHandle.put(poolBlock, fsHandle);
1253 HandleCache.getCaseHandles(caseIdentifier).poolFsList.add(fsHandle);
1258 releaseTSKWriteLock();
1288 boolean withinPool =
false;
1289 synchronized (HandleCache.cacheLock) {
1290 String caseIdentifier;
1291 if (skCase ==
null) {
1292 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1294 caseIdentifier = skCase.getCaseHandleIdentifier();
1296 if (HandleCache.getCaseHandles(caseIdentifier).poolFsList.contains(fsHandle)) {
1312 long fileHandle = openFileNat(fsHandle, fileId, attrType.getValue(), convertSignedToUnsigned(attrId));
1313 synchronized (HandleCache.cacheLock) {
1314 String caseIdentifier;
1315 if (skCase ==
null) {
1316 caseIdentifier = HandleCache.getDefaultCaseIdentifier();
1318 caseIdentifier = skCase.getCaseHandleIdentifier();
1320 HandleCache.addFileHandle(caseIdentifier, fileHandle, fsHandle);
1325 HandleCache.poolFileHandles.add(fileHandle);
1331 releaseTSKWriteLock();
1333 releaseTSKReadLock();
1345 private static int convertSignedToUnsigned(
int val) {
1350 return val & 0xffff;
1358 private static boolean imgHandleIsValid(
long imgHandle) {
1359 synchronized(HandleCache.cacheLock) {
1360 return HandleCache.isImageInAnyCache(imgHandle);
1382 if(! imgHandleIsValid(imgHandle)) {
1386 return readImgNat(imgHandle, readBuffer, offset, len);
1388 releaseTSKReadLock();
1409 return readVsNat(vsHandle, readBuffer, offset, len);
1411 releaseTSKReadLock();
1427 static int readPool(
long poolHandle,
byte[] readBuffer,
long offset,
long len)
throws TskCoreException {
1430 return readPoolNat(poolHandle, readBuffer, offset, len);
1432 releaseTSKReadLock();
1454 return readVolNat(volHandle, readBuffer, offset, len);
1456 releaseTSKReadLock();
1478 return readFsNat(fsHandle, readBuffer, offset, len);
1480 releaseTSKReadLock();
1492 private final int val;
1518 boolean withinPool =
false;
1519 synchronized (HandleCache.cacheLock) {
1520 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1536 if (!HandleCache.isValidFileHandle(fileHandle)) {
1543 releaseTSKWriteLock();
1545 releaseTSKReadLock();
1567 if (!HandleCache.isValidFileHandle(fileHandle)) {
1573 releaseTSKReadLock();
1590 if (!HandleCache.isValidFileHandle(fileHandle)) {
1595 java.io.File tmp = java.io.File.createTempFile(
"tsk",
".txt");
1597 saveFileMetaDataTextNat(fileHandle, tmp.getAbsolutePath());
1599 FileReader fr =
new FileReader(tmp.getAbsolutePath());
1600 BufferedReader textReader =
new BufferedReader(fr);
1602 List<String> lines =
new ArrayList<String>();
1604 String line = textReader.readLine();
1614 }
catch (IOException ex) {
1615 throw new TskCoreException(
"Error reading istat output: " + ex.getLocalizedMessage());
1618 releaseTSKReadLock();
1638 boolean withinPool =
false;
1639 synchronized (HandleCache.cacheLock) {
1640 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1656 synchronized (HandleCache.cacheLock) {
1657 if (!HandleCache.isValidFileHandle(fileHandle)) {
1661 closeFileNat(fileHandle);
1662 HandleCache.removeFileHandle(fileHandle, skCase);
1663 if (HandleCache.poolFileHandles.contains(fileHandle)) {
1664 HandleCache.poolFileHandles.remove(fileHandle);
1669 releaseTSKWriteLock();
1671 releaseTSKReadLock();
1684 hashDbCreateIndexNat(dbHandle);
1697 return hashDbIndexExistsNat(dbHandle);
1711 return hashDbIsReindexableNat(dbHandle);
1724 return hashDbPathNat(dbHandle);
1737 return hashDbIndexPathNat(dbHandle);
1747 return hashDbOpenNat(path);
1760 return hashDbNewNat(path);
1783 hashDbClose(dbHandle);
1796 return hashDbGetDisplayName(dbHandle);
1810 return hashDbLookup(hash, dbHandle);
1825 return hashDbLookupVerbose(hash, dbHandle);
1841 hashDbAddEntryNat(filename, md5, sha1, sha256, comment, dbHandle);
1845 hashDbBeginTransactionNat(dbHandle);
1848 hashDbAddEntryNat(entry.getFileName(), entry.getMd5Hash(), entry.getSha1Hash(), entry.getSha256Hash(), entry.getComment(), dbHandle);
1850 hashDbCommitTransactionNat(dbHandle);
1853 hashDbRollbackTransactionNat(dbHandle);
1863 return hashDbIsUpdateableNat(dbHandle);
1867 return hashDbIsIdxOnlyNat(dbHandle);
1879 private static String timezoneLongToShort(String timezoneLongForm) {
1880 if (timezoneLongForm ==
null || timezoneLongForm.isEmpty()) {
1884 String timezoneShortForm;
1885 TimeZone zone = TimeZone.getTimeZone(timezoneLongForm);
1886 int offset = zone.getRawOffset() / 1000;
1887 int hour = offset / 3600;
1888 int min = (offset % 3600) / 60;
1889 DateFormat dfm =
new SimpleDateFormat(
"z");
1890 dfm.setTimeZone(zone);
1891 boolean hasDaylight = zone.useDaylightTime();
1892 String first = dfm.format(
new GregorianCalendar(2010, 1, 1).getTime()).substring(0, 3);
1893 String second = dfm.format(
new GregorianCalendar(2011, 6, 6).getTime()).substring(0, 3);
1894 int mid = hour * -1;
1895 timezoneShortForm = first + Integer.toString(mid);
1897 timezoneShortForm = timezoneShortForm +
":" + (min < 10 ?
"0" :
"") + Integer.toString(min);
1900 timezoneShortForm += second;
1902 return timezoneShortForm;
1918 if(! imgHandleIsValid(imgHandle)) {
1921 return finishImageWriterNat(imgHandle);
1923 releaseTSKReadLock();
1937 if (imgHandleIsValid(imgHandle)) {
1938 return getFinishImageProgressNat(imgHandle);
1943 releaseTSKReadLock();
1955 if (imgHandleIsValid(imgHandle)) {
1956 cancelFinishImageNat(imgHandle);
1959 releaseTSKReadLock();
1975 return findDeviceSizeNat(devPath);
1981 return isImageSupportedStringNat(imagePath,
"").isBlank();
1987 public static class TestOpenImageResult {
1988 boolean testSuccess;
1991 TestOpenImageResult(
boolean testSuccess, String message) {
1992 this.testSuccess = testSuccess;
1993 this.message = message;
2017 String resultStr = isImageSupportedStringNat(imagePath, password);
2018 if (resultStr.isBlank()) {
2037 static long getSleuthkitVersion() {
2038 return getSleuthkitVersionNat();
2045 private static void getTSKReadLock() {
2046 tskLock.readLock().lock();
2052 private static void releaseTSKReadLock() {
2053 tskLock.readLock().unlock();
2063 private static void getTSKWriteLock() {
2064 tskLock.writeLock().lock();
2070 private static void releaseTSKWriteLock() {
2071 tskLock.writeLock().unlock();
2121 return openImage(imageFiles, 0,
true,
null);
2139 return openImage(imageFiles, sSize,
true,
null);
2158 return openFs(imgHandle, fsOffset,
null);
2177 return openFile(fsHandle, fileId, attrType, attrId,
null);
2181 private static native String getVersionNat();
2183 private static native
void startVerboseLoggingNat(String logPath);
2185 private static native
int hashDbOpenNat(String hashDbPath)
throws TskCoreException;
2187 private static native
int hashDbNewNat(String hashDbPath)
throws TskCoreException;
2189 private static native
int hashDbBeginTransactionNat(
int dbHandle)
throws TskCoreException;
2191 private static native
int hashDbCommitTransactionNat(
int dbHandle)
throws TskCoreException;
2193 private static native
int hashDbRollbackTransactionNat(
int dbHandle)
throws TskCoreException;
2195 private static native
int hashDbAddEntryNat(String filename, String hashMd5, String hashSha1, String hashSha256, String comment,
int dbHandle)
throws TskCoreException;
2197 private static native
boolean hashDbIsUpdateableNat(
int dbHandle);
2199 private static native
boolean hashDbIsReindexableNat(
int dbHandle);
2201 private static native String hashDbPathNat(
int dbHandle);
2203 private static native String hashDbIndexPathNat(
int dbHandle);
2205 private static native String hashDbGetDisplayName(
int dbHandle)
throws TskCoreException;
2209 private static native
void hashDbClose(
int dbHandle) throws
TskCoreException;
2211 private static native
void hashDbCreateIndexNat(
int dbHandle) throws
TskCoreException;
2213 private static native
boolean hashDbIndexExistsNat(
int dbHandle) throws
TskCoreException;
2215 private static native
boolean hashDbIsIdxOnlyNat(
int dbHandle) throws
TskCoreException;
2217 private static native
boolean hashDbLookup(String hash,
int dbHandle) throws
TskCoreException;
2221 private static native
long initAddImgNat(TskCaseDbBridge dbHelperObj, String timezone,
boolean addUnallocSpace,
boolean skipFatFsOrphans) throws
TskCoreException;
2223 private static native
long initAddImgNatPassword(TskCaseDbBridge dbHelperObj, String timezone,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String password) throws
TskCoreException;
2225 private static native
long initializeAddImgNat(TskCaseDbBridge dbHelperObj, String timezone,
boolean addFileSystems,
boolean addUnallocSpace,
boolean skipFatFsOrphans) throws
TskCoreException;
2227 private static native
long initializeAddImgPasswordNat(TskCaseDbBridge dbHelperObj, String timezone,
boolean addFileSystems,
boolean addUnallocSpace,
boolean skipFatFsOrphans, String password) throws
TskCoreException;
2229 private static native
void runOpenAndAddImgNat(
long process, String deviceId, String[] imgPath,
int splits, String timezone) throws
TskCoreException,
TskDataException;
2231 private static native
void runAddImgNat(
long process, String deviceId,
long a_img_info,
long image_id, String timeZone, String imageWriterPath) throws
TskCoreException,
TskDataException;
2233 private static native
void stopAddImgNat(
long process) throws
TskCoreException;
2235 private static native
long finishAddImgNat(
long process) throws
TskCoreException;
2237 private static native
long openImgNat(String[] imgPath,
int splits,
int sSize) throws
TskCoreException;
2239 private static native
long openVsNat(
long imgHandle,
long vsOffset) throws
TskCoreException;
2241 private static native
long openVolNat(
long vsHandle,
long volId) throws
TskCoreException;
2243 private static native
long openPoolNat(
long imgHandle,
long offset) throws
TskCoreException;
2245 private static native
long getImgInfoForPoolNat(
long poolHandle,
long poolOffset) throws
TskCoreException;
2247 private static native
long openFsNat(
long imgHandle,
long fsId) throws
TskCoreException;
2249 private static native
long openFsDecryptNat(
long imgHandle,
long fsId, String password) throws
TskCoreException;
2251 private static native
long openFileNat(
long fsHandle,
long fileId,
int attrType,
int attrId) throws
TskCoreException;
2253 private static native
int readImgNat(
long imgHandle,
byte[] readBuffer,
long offset,
long len) throws
TskCoreException;
2255 private static native
int readVsNat(
long vsHandle,
byte[] readBuffer,
long offset,
long len) throws
TskCoreException;
2257 private static native
int readPoolNat(
long poolHandle,
byte[] readBuffer,
long offset,
long len) throws
TskCoreException;
2259 private static native
int readVolNat(
long volHandle,
byte[] readBuffer,
long offset,
long len) throws
TskCoreException;
2261 private static native
int readFsNat(
long fsHandle,
byte[] readBuffer,
long offset,
long len) throws
TskCoreException;
2263 private static native
int readFileNat(
long fileHandle,
byte[] readBuffer,
long offset,
int offset_type,
long len) throws
TskCoreException;
2265 private static native
int saveFileMetaDataTextNat(
long fileHandle, String fileName) throws
TskCoreException;
2267 private static native String[] getPathsForImageNat(
long imgHandle);
2269 private static native
long getSizeForImageNat(
long imgHandle);
2271 private static native
long getTypeForImageNat(
long imgHandle);
2273 private static native
long getSectorSizeForImageNat(
long imgHandle);
2275 private static native String getMD5HashForImageNat(
long imgHandle);
2277 private static native String getSha1HashForImageNat(
long imgHandle);
2279 private static native String getCollectionDetailsForImageNat(
long imgHandle);
2281 private static native
void closeImgNat(
long imgHandle);
2283 private static native
void closePoolNat(
long poolHandle);
2285 private static native
void closeVsNat(
long vsHandle);
2287 private static native
void closeFsNat(
long fsHandle);
2289 private static native
void closeFileNat(
long fileHandle);
2291 private static native
long findDeviceSizeNat(String devicePath) throws
TskCoreException;
2293 private static native String getCurDirNat(
long process);
2295 private static native String isImageSupportedStringNat(String imagePath, String password);
2297 private static native
long getSleuthkitVersionNat();
2299 private static native
int finishImageWriterNat(
long a_img_info);
2301 private static native
int getFinishImageProgressNat(
long a_img_info);
2303 private static native
void cancelFinishImageNat(
long a_img_info);