C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[39718] [질문]SMART enable operation 과 SMART return status의 사용법을 밑에 소스롤 보고... 부탁드립니다
공윤경 [csstra] 946 읽음    2005-03-31 19:28
BOOL TFrmMain::DoIdentify(HANDLE DiskDevice, BYTE DriveNum,PDWORD BytesReturned)
{
  BOOL Result = FALSE;

  // Speicherplatz fur Befehle und Daten anfordern
  unsigned int InDataSize  =   0, ISize = sizeof(SENDCMDINPARAMS)  + InDataSize;
  unsigned int OutDataSize = 512, OSize = sizeof(SENDCMDOUTPARAMS) + OutDataSize;

  // VirtualAlloc sorgt dafur, dass der Geratetreiber den Speicher ansprechen kann
  SENDCMDINPARAMS  *IP = (SENDCMDINPARAMS  *)VirtualAlloc(NULL, ISize, MEM_COMMIT, PAGE_READWRITE);
  SENDCMDOUTPARAMS *OP = (SENDCMDOUTPARAMS *)VirtualAlloc(NULL, OSize, MEM_COMMIT, PAGE_READWRITE);
  if (IP && OP)
  {
      memset(IP, 0, ISize);


//이부분이 의미하는 바가 무언가요?

      //Set up data structures for IDENTIFY command.
      IP->irDriveRegs.bSectorCountReg  = 1;
      IP->irDriveRegs.bSectorNumberReg = 1;

      IP->irDriveRegs.bFeaturesReg     = 0;
      IP->irDriveRegs.bCylLowReg       = 0;
      IP->irDriveRegs.bCylHighReg      = 0;

      //Compute the drive number;
      IP->irDriveRegs.bDriveHeadReg    = 0xA0 | ((DriveNum & 1) << 4);


      //The Command can either be IDE identify or ATAPI identify.
      IP->irDriveRegs.bCommandReg      = 0xEC;
      IP->bDriveNumber                 = 0;
      IP->cBufferSize                  = OutDataSize;


      memset(OP, 0, OSize);
      OP->cBufferSize = OSize;
      if (DeviceIoControl(DiskDevice,
                        SMART_RCV_DRIVE_DATA,
                        (LPVOID)IP,
                        sizeof(SENDCMDINPARAMS)-1,
                        (LPVOID)OP,
                        sizeof(SENDCMDOUTPARAMS)+512-1,
                        BytesReturned, NULL))
        {
          Result = TRUE;
          char ModelStr   [40 + 1];
          char FirmwareStr[ 8 + 1];
          char SerialStr  [20 + 1];

          GetIdentifyStr(ModelStr,   ((PWORD)OP->bBuffer) + 27, 20);
          GetIdentifyStr(FirmwareStr, ((PWORD)OP->bBuffer) + 23, 4);
          GetIdentifyStr(SerialStr,  ((PWORD)OP->bBuffer) + 10, 10);

//          LogMsg(AnsiString().sprintf("ASDFASDF: %s",OP->DriverStatus);
          LogMsg(AnsiString().sprintf("Model:       %s\n", ModelStr));
          LogMsg(AnsiString().sprintf("Firmware:     %s\n", FirmwareStr));
          LogMsg(AnsiString().sprintf("Serial nummer: %s\n", SerialStr));
        }
       else
       {
//            LogMsg(AnsiString().sprintf("GetLastError %u, BytesReturned: %u,\nDriverStatus %u, IDE Status: %u\n", GetLastError(), BytesReturned, OP->DriverStatus.bDriverError, OP->DriverStatus.bIDEStatus));
       }
    }

  if (IP) VirtualFree(IP, 0, MEM_RELEASE);
  if (OP) VirtualFree(OP, 0, MEM_RELEASE);

  return Result;
}

+ -

관련 글 리스트
39718 [질문]SMART enable operation 과 SMART return status의 사용법을 밑에 소스롤 보고... 부탁드립니다 공윤경 946 2005/03/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.