c++ 코드좀 봐주실분..

복일성   
   조회 6554   추천 0    

#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <string>
#include <time.h>
#include "RealTimeHDDCheck.h"
using std::cout;
using std::endl;
HANDLE OpenDrive(int iPhysicalDriveNumber)
{
 HANDLE hDevice;
 char vcDriveName[30];

 if(iPhysicalDriveNumber ==0)
 {
   return INVALID_HANDLE_VALUE;
 }
 sprintf(vcDriveName,"\\\\.\\PhysicalDrive%d",iPhysicalDriveNumber);

  hDevice = CreateFile(vcDriveName, GENERIC_READ | GENERIC_WRITE, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); 
 return hDevice;
}

BOOL ReadSector(HANDLE hDevice,DWORD dwSectorOffset, BYTE* pbBuffer, int iSectorCount)
{
 DWORD dwLow;
 DWORD dwHigh;
 DWORD dwRet;
 DWORD dwRead;
 DWORD dwErrorCode;

 dwLow = (dwSectorOffset << 9);
 dwHigh = ( dwSectorOffset >> 23 );   
    // File Pointer를 이동한다. 
    dwRet = SetFilePointer( hDevice, dwLow,(long *) &dwHigh, FILE_BEGIN ); 
  if( dwRet == INVALID_SET_FILE_POINTER ) 
    { 
        return FALSE; 
    }   
    // Sector를 읽는다. 
    if( ReadFile( hDevice, pbBuffer, iSectorCount * 512, &dwRead,NULL ) == FALSE ) 
    { 
        dwErrorCode = GetLastError(); 
        return FALSE; 
    }   
    return TRUE;
}  


int main()
{
 unsigned char data[512];
 RealTimeHDDCheck c;
 int start=0;
 int stop=0;
 int bad=0;
 int appstart = clock();
 for(int a =0;a<3118684;a++){
  //c.GetDiskList();
  //cout << "------------------" << a << "번째 루프----------------------------" <<endl;

  //Sleep(5000);
  start = clock();
  ReadSector(OpenDrive(1),a,data,1);
  stop = clock();
  //for(int b=0;b < sizeof(data);b++){
  // printf("%d = %c",data[b],data[b]);
 
  //}
  ZeroMemory(data,512);
  if((float)(stop-start)/1000 > 50){
   bad++;
  }
  cout << "진행시간 :" << (clock()-appstart)/1000 << "sec" << "배드카운터 :" << bad << endl;
  cout << "진행량: " << (float)(a*512)/1024 << "MB"<< "/SECTOR" << a << endl;
  system("cls");
  start=0;
  stop = 0;
 }
 
 return 0;
}

 

요렇게 작성을 해봤는데요

 

1번섹터부터 시작해서 끝에 섹터까지 160기가 하드디스크를 가지고 테스트하는데요..

 

작동은 정상적으로 잘하는데 다른툴하고는 결과가 많이 다르네요

 

현재 512바이트씩 1섹터부터 루프를 돌리면서 받아오는건 잘되는데..

 

다른 프로그램에서는 특정섹터를 못읽어온다고 배드섹터로 처리하는데

 

이프로그램에서는 읽어오나봐요. 이상합니다 헬프미~

짧은글 일수록 신중하게.
냐옹 2011-12
몇번 반복으로 읽어와서 결과를 비교해서 틀리면 배드로 처리해보세요.
또는 헤드나 다른 물리적 결함없이 플레트에 소자만 나간 경우 읽기는 잘 될 수 있습니다.
읽은 내용을 비트 반전 시켜 기록하고 다시 읽어서 대조해보셔야 할 거에요.
볼륨이 사용 중인 경우는 기록하려면 볼륨에 락을 걸어야할거구요.
민정기 2011-12
저 코드로 읽기 테스트 하는걸로 봐서는 반복해도 같은결과가 나올꺼 같구요.
쓰기 테스트도 해야 됩니다.
이동할수 없는 파일이 존재하는 영역에 대한 처리가 어려울겁니다.

가장 알기 쉽게 하는건 하드디스크 구조를 이용해서 검사하는 방법인데
이는 100% 신뢰하는 값을 주지 못하구요.
어렵지만 제일 확실한건 쓰기 테스트 -> 쓴 내용을 읽기 테스트
이건 시간이 많이 걸리지만 확실한 결과를 줄겁니다.

근데 이걸 C++로 과연 짤 수 있을까 하는 의문이 좀 듭니다.


QnA
제목Page 3989/5707
2014-05   5134780   정은준1
2015-12   1669759   백메가
2015-03   6526   헤골
2005-05   6526   김영민
2009-01   6526   차평석
2012-01   6526   이윤주
2015-02   6526   김건우
2008-04   6526   이성봉
2009-12   6526   호랭이담배…
2005-03   6526   진동현
2006-06   6526   윤영배
2013-06   6526   박상범
2012-02   6526   황혼을향해
2016-11   6526   faeqpd
2016-08   6526   AplPEC
2005-02   6526   강인식
2011-08   6527   주원재
2010-03   6527   이치로운
2009-12   6527   이사장
2015-10   6527   푸하히
2012-12   6527   지니보이
2005-05   6527   정영교