/*****************************************/
/* セクターリード */
/* */
/* コマンド: 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: ;
}
|