1989年開業 情報工学部門 文部科学省登録番号 第22082号 公益社団法人日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム セクターリード(記憶媒体)

●記憶媒体のセクター番号を指定して1セクター分
 読み込むプログラムです。
●読み込んだ内容を16進数で画面に表示し、
 テキスト形式でファイルに保存します。
●管理者権限で実行する必要があります。
・コマンドラインから起動するとき
   コマンドプロンプトを管理者権限で起動します
・エクスプローラから起動するとき
   実行ファイル名を右クリックし、ポップアップ
   メニューの「管理者として実行」を選択します。
●作成されたテキストファイルはエディタ等で確認
 できます。

 ≫ソースファイルのダウンロード: secrd.c

【問題】
●記憶媒体のファイルシステムを確認してみよう。
●読み込んだ内容をそのまま結果ファイルに保存する
 ようにしてみよう。
 ※バイナリファイルになるので、ファイル名の拡張子
  は ".dat" のように変更しよう
●出力結果にアドレスやキャラクタコードを追加して
 みよう。


/*****************************************/
/*  セクターリード                       */
/*                                       */
/*  コマンド: SECRD ドライブ名 セクター番号       */
/*         ※管理者権限で実行            */
/*  結 果: SECDMP_X_999999999.txtを作成  */
/*****************************************/
#include <windows.h>
#include <stdio.h>

#define SECSIZ 512

void  main( )
/*----------*/
/*  主処理  */
/*----------*/
{
  char vPath[32];   // ボリュームパス
  long secNO=0;     // セクター番号
  HANDLE hVlm;      // ドライブハンドル
  LARGE_INTEGER ofs;// セクター先頭(バイト)
  FILE *fp=NULL;
  char drv,buf[1024];
  char bufT[SECSIZ/16*64];// 文字列バッファ
  char fnam[32],c[256];
  int  ir,i,j,len;

    printf("\n★セクターリード★\n");
    printf("\n※管理者権限で実行\n");

    printf("\nドライブ名 (例 F) : "); fflush(stdout);
    gets(c); drv=c[0];
    sprintf(vPath,"\\\\.\\%c:",drv);                // ボリュームパス

    hVlm=CreateFileA(vPath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
                 NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if ( hVlm==INVALID_HANDLE_VALUE )
      { printf("ドライブ名がちがいます"); goto L9; }

    printf("\nセクター番号: "); fflush(stdout);
    gets(c); secNO=atol(c);

    ofs.QuadPart=secNO*SECSIZ;
    ir=SetFilePointerEx(hVlm,ofs,NULL,FILE_BEGIN);  // シーク
    if ( ir==FALSE )
      { printf("セクター位置にシークできません"); goto L9; }
    ir=ReadFile(hVlm,buf,SECSIZ,NULL,NULL);         // 1セクタ読み取り
    if ( ir==FALSE )
      { printf("セクターを読めません"); goto L9; }

    len=0; bufT[len]='\0';

    for( i=0; i<SECSIZ; i+=16 )
      {
        for( j=0; j<16; j++ )
          {
            sprintf(c,"%02X ",buf[i+j]);            // 文字列に
            strcat(bufT+len,c);
            len+=strlen(c);
          }
        strcat(bufT+len,"\n");
        len++;
      }

    printf("%s",bufT);
    fflush(stdout);

    sprintf(fnam,"SECDMP_%c_%09ld.txt",drv,secNO);  // 保存ファイル名
    printf("\n\n結果をファイル %s に保存しますか?(Y/else): ",fnam); fflush(stdout);
    gets(c);

    if ( c[0]=='Y' || c[0]=='y' )
      {
        fp=fopen(fnam,"w");                         // 結果ファイル開く
        if ( fp==NULL )
          { printf("結果ファイルを作成できません"); goto L9; }

        ir=fwrite(bufT,len,1,fp);                   // 1レコード書く
        if ( ir==FALSE )
          { printf("結果ファイルを作成できません"); goto L9; }

        fclose(fp);                                 // 結果ファイル閉じる
        printf("\n"); fflush(stdout);
      }

    CloseHandle(hVlm);

L9: ;
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: info@saeki-pe.com