|
또 질문이 있어서 글 올립니다.
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);
}
|