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
[56265] IDE HDD 시리얼 특정PC는 null값이 나옵니다.
송득보 [syiware] 1695 읽음    2009-02-25 13:26
또 질문이 있어서 글 올립니다.

IDE HDD의 하드 시리얼을 리턴해주는 함수를 구현했는데요,..

여러 클라이언트 pc중 극소수는 hdd serial이 null값으로 서버에 전달이 됩니다.

아래 소스를 한번 봐주시고 고쳐야 할 사항이나 더 나은 방법이 계시면 알려주세요.

대상기종은 MS-windows xp/vista등등 ms계열입니다.

// IDE 시리얼 알아내기
AnsiString GetIDESerial()
{
    AnsiString _result, ModelNo, DiskSN;
    SENDCMDINPARAMS in;
    uSENDCMDOUTPARAMS out;
    HANDLE h;
    DWORD i;
    BYTE j;

    if ( IsWinNt() )
    {
      PIDSECTOR phdinfo;
      char s[41];

      h=CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ|GENERIC_WRITE,
       FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
      if (!h)
       return "";

      //Identify the IDE drives
      ZeroMemory(&in,sizeof(in));
      ZeroMemory(&out,sizeof(out));
      in.irDriveRegs.bDriveHeadReg=0xa0;

      in.irDriveRegs.bCommandReg=0xec;
      in.bDriveNumber = 0;
      in.irDriveRegs.bSectorCountReg=1;
      in.irDriveRegs.bSectorNumberReg=1;
      in.cBufferSize=512;
      if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0))
      {
       CloseHandle(h);
       return "";
      }
      phdinfo=(PIDSECTOR)out.bBuffer;
      memcpy(s,phdinfo->sModelNumber,40);
      s[40]=0;
      ChangeByteOrder(s,40);
      ModelNo = s;
      memcpy(s,phdinfo->sSerialNumber,20);
      s[20]=0;
      ChangeByteOrder(s,20);
      DiskSN = s;

      _result = ModelNo.Trim() + ":" + DiskSN.Trim();

      CloseHandle(h);

    }
    else
    {
      //We start in 95/98/Me
      h = CreateFile( "\\\\.\\Smartvsd", 0, 0, 0, CREATE_NEW, 0, 0 );
      if ( !h )
      {
        return "";
      }

      //Identify the IDE drives
      PIDSECTOR phdinfo;
      char s[41];

      ZeroMemory(&in,sizeof(in));
      ZeroMemory(&out,sizeof(out));
      in.irDriveRegs.bDriveHeadReg=0xa0;
      in.irDriveRegs.bCommandReg=0xec;
      in.bDriveNumber=0;
      in.irDriveRegs.bSectorCountReg=1;
      in.irDriveRegs.bSectorNumberReg=1;
      in.cBufferSize=512;
      if (!DeviceIoControl(h,DFP_RECEIVE_DRIVE_DATA,&in,sizeof(in),&out,sizeof(out),&i,0))
      {
        CloseHandle(h);
        return "";
      }
      phdinfo=(PIDSECTOR)out.bBuffer;
      memcpy(s,phdinfo->sModelNumber,40);
      s[40]=0;
      ChangeByteOrder(s,40);
      ModelNo = s;
      memcpy(s,phdinfo->sSerialNumber,20);
      s[20]=0;
      ChangeByteOrder(s,20);
      DiskSN = s;
      CloseHandle(h);

      _result = ModelNo.Trim() + ":" + DiskSN.Trim();

      //Close handle before quit
      CloseHandle(h);
    }

    if ( _result.Trim().IsEmpty() )  // 제품번호를 얻지 못하였을때 볼륨 시리얼로 대체
    {
      _result = GetVolSerial();
    }

    return _result;
}

// IDE 시리얼 알아내기 - 관련함수
void ChangeByteOrder(PCHAR szString, USHORT uscStrSize)
{
    USHORT i;
    CHAR temp;

    for (i = 0; i < uscStrSize; i+=2)
    {
      temp = szString[i];
      szString[i] = szString[i+1];
      szString[i+1] = temp;
    }
}

// 하드의 볼륨 시리얼 얻기
AnsiString GetVolSerial()
{
    char DrvRoot[4] = "C:\\";
    DWORD VolSerial;
    GetVolumeInformation(DrvRoot, NULL, 0, &VolSerial, NULL, NULL, NULL, 0);
    return IntToHex((int)VolSerial, 8);
}

+ -

관련 글 리스트
56265 IDE HDD 시리얼 특정PC는 null값이 나옵니다. 송득보 1695 2009/02/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.