ファイルスラックスから読み書きするフォレンジックツールを構築しています。現時点では、JNI を使用して C 関数read()およびwrite()を呼び出し、バッファを FAT SD カードに書き込みます (EXT4 内部メモリもいいでしょう)。長さを読み取り/書き込みに渡すことができ、EOFを無視できるため、これらを使用します。私はすでに標準書き込みを使用して書き込みを試みてから切り捨てましたこれは、ubuntu 14.04 では動作しますが、Android (API 21) では動作しません。実際のファイル サイズよりも多くのファイルを読み取っても、SD カードのフライ スラックは反映されません。ファイル slack へのアクセスを管理する "bmap" や "slacker.exe" (NTFS 用) などのツールがあります。EOF を無視するか、自分で処理する方法が必要です。既存のファイル システム ドライバーを変更したくありません。提案をいただければ幸いです。
ここにいくつかのサンプルコードがあります (まだ動作しません):
jstring
Java_com_example_hellojni_HelloJni_write(JNIEnv *env, jobject thiz, jstring path)
{
char *cpath = (*env)->GetStringUTFChars(env, path, NULL);
int raw_file_descriptor = open(cpath,O_WRONLY,0);
lseek(raw_file_descriptor,0,SEEK_END);
char block_buffer [4096] = "hidden";
int buffer_length = 6;
int wret = write(raw_file_descriptor,block_buffer,buffer_length); // increases file size and moves EOF - I don't want that
LOGD(" char written: %d", wret);
free(cpath);
return (*env)->NewStringUTF(env, "write ok ");
}
jbyteArray
Java_com_example_hellojni_HelloJni_read2(JNIEnv *env, jobject thiz, jstring path) {
char *cpath = (*env)->GetStringUTFChars(env, path, NULL);
LOGD("open %s with ", cpath);
int raw_file_descriptor = open(cpath,O_RDONLY,0);
char buffer [4096];
int readretval = read(raw_file_descriptor, buffer, 50); // stops at EOF - I want it to continue reading all 50 bytes from the SD-card - This gives me the file content until EOF and then I get some random characters from the uninitialized buffer.
LOGD("read (%d) buffer with length %d: %s", readretval, sizeof(buffer), buffer);
int i; // Debug code
for (i=0; i < 49; ++i) {
LOGD("%c",buffer[i]);
}
close(raw_file_descriptor);
free(cpath);
return NULL;
}