デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4375  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

C/C#でやってみたから今度はJavaで。

まず、読みだして1セクタ分の読み出しデータを表示するプログラムを作成。

SectorRead.java


public class SectorRead {
    static {
        System.loadLibrary("SectorRead");
    }

    public native int     OpenDrive(int driveNumber);
    public native byte[] ReadSector(int handle, int sector, int count);
    public native void     CloseDrive(int handle);

    public static void main(String[] args) {
        SectorRead sr = new SectorRead();
        int h = sr.OpenDrive(0);
        byte[] data = sr.ReadSector(h, 0, 1);

        for(int i = 0; i < 512; i++) {
            System.out.format("%02x ", data[i]);
            if(i % 16 == 15) {
                System.out.print("\n");
            }
        }

        sr.CloseDrive(h);
    }

}


 

上記Javaのソースコードを

javah -jni SectorRead.java

として下記SectorRead.hを作成する。

SectorRead.h


/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class SectorRead */

#ifndef _Included_SectorRead
#define _Included_SectorRead
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     SectorRead
* Method:    OpenDrive
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_SectorRead_OpenDrive
  (JNIEnv *, jobject, jint);

/*
* Class:     SectorRead
* Method:    ReadSector
* Signature: (III)[B
*/
JNIEXPORT jbyteArray JNICALL Java_SectorRead_ReadSector
  (JNIEnv *, jobject, jint, jint, jint);

/*
* Class:     SectorRead
* Method:    CloseDrive
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_SectorRead_CloseDrive
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif


上記ヘッダを基に実装作成。

SectorRead.cpp


#include
#include
#include
#include
#include "SectorRead.h"

/*
* Class:     SectorRead
* Method:    OpenDrive
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_SectorRead_OpenDrive(JNIEnv * env, jobject obj, jint drive_number)
{
    std::strstream strs;
    strs << "\\\\.\\PHYSICALDRIVE" << drive_number << std::ends;

    HANDLE h = CreateFile(strs.str(),
                          GENERIC_READ,
                          FILE_SHARE_READ | FILE_SHARE_WRITE,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL);

    return reinterpret_cast<jint>(h);
}

/*
* Class:     SectorRead
* Method:    ReadSector
* Signature: (II)[B
*/
JNIEXPORT jbyteArray JNICALL Java_SectorRead_ReadSector(
    JNIEnv * env,
    jobject obj,
    jint handle,
    jint sector,
    jint count)
{
    DWORD        size = count * 0x200;
    jbyteArray    buff = env->NewByteArray(size);
    jbyte*        buff_ptr = env->GetByteArrayElements(buff, NULL);
    if(!buff_ptr) {
        return NULL;
    }
    HANDLE hFile = reinterpret_cast<HANDLE>(handle);
    DWORD  read_size = 0;
    ReadFile(hFile, buff_ptr, size, &read_size, NULL);

    env->ReleaseByteArrayElements(buff, buff_ptr, 0);

    return buff;
}

/*
* Class:     SectorRead
* Method:    CloseDrive
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_SectorRead_CloseDrive(JNIEnv * env, jobject obj, jint handle)
{
    CloseHandle(reinterpret_cast<HANDLE>(handle));
}


このソースを下記のようにコンパイルしDLL作成。

cl /LD /EHsc /I"c:\Program Files\Java\jdk1.5.0_16\include" /I"c:\Program Files\Java\jdk1.5.0_16\include\win32" SectorRead.cpp

※インクルードパスは環境に応じて設定

下記のようにして実行

java SectorRead

実行結果


33 c0 8e d0 bc 00 7c 8e c0 8e d8 be 00 7c bf 00
06 b9 00 02 fc f3 a4 50 68 1c 06 cb fb b9 04 00
bd be 07 80 7e 00 00 7c 0b 0f 85 10 01 83 c5 10
e2 f1 cd 18 88 56 00 55 c6 46 11 05 c6 46 10 00
b4 41 bb aa 55 cd 13 5d 72 0f 81 fb 55 aa 75 09
f7 c1 01 00 74 03 fe 46 10 66 60 80 7e 10 00 74
26 66 68 00 00 00 00 66 ff 76 08 68 00 00 68 00
7c 68 01 00 68 10 00 b4 42 8a 56 00 8b f4 cd 13
9f 83 c4 10 9e eb 14 b8 01 02 bb 00 7c 8a 56 00
8a 76 01 8a 4e 02 8a 6e 03 cd 13 66 61 73 1e fe
4e 11 0f 85 0c 00 80 7e 00 80 0f 84 8a 00 b2 80
eb 82 55 32 e4 8a 56 00 cd 13 5d eb 9c 81 3e fe
7d 55 aa 75 6e ff 76 00 e8 8a 00 0f 85 15 00 b0
d1 e6 64 e8 7f 00 b0 df e6 60 e8 78 00 b0 ff e6
64 e8 71 00 b8 00 bb cd 1a 66 23 c0 75 3b 66 81
fb 54 43 50 41 75 32 81 f9 02 01 72 2c 66 68 07
bb 00 00 66 68 00 02 00 00 66 68 08 00 00 00 66
53 66 53 66 55 66 68 00 00 00 00 66 68 00 7c 00
00 66 61 68 00 00 07 cd 1a 5a 32 f6 ea 00 7c 00
00 cd 18 a0 b7 07 eb 08 a0 b6 07 eb 03 a0 b5 07
32 e4 05 00 07 8b f0 ac 3c 00 74 fc bb 07 00 b4
0e cd 10 eb f2 2b c9 e4 64 eb 00 24 02 e0 f8 24
02 c3 49 6e 76 61 6c 69 64 20 70 61 72 74 69 74
69 6f 6e 20 74 61 62 6c 65 00 45 72 72 6f 72 20
6c 6f 61 64 69 6e 67 20 6f 70 65 72 61 74 69 6e
67 20 73 79 73 74 65 6d 00 4d 69 73 73 69 6e 67
20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65
6d 00 00 00 00 62 7a 99 87 65 74 ff 00 00 80 20
21 00 07 fe ff ff 00 08 00 00 00 d8 42 25 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

使い道ねぇ~

投稿日時 : 2008年8月12日 22:25

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント: