//读般硬盘序列号函数
char* CGetHDSerial::GetHDSerial()
{
m_buffer[0]='\n';
//得到当前操作系统版本
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OSVersionInfo);
if(OSVersionInfo.dwPlatformld != VER_PLATFORM_WIN32_NT)
{
//Windows 9x/ME下读取硬盘序列号
WORD m_wWin9xl'HDSerial[256];
Win9xReadHDSerial(m_wWin9xHDSerial);
strcpy (m_buffer, WORDToChar(m _wWin9xHDSerial, 10, 19));
}
else
{
//Windows NT/2000/XP下读取硬盘序列弓
DWORD m_wWinNTHDSerial[256];
//判断是否有SCSI硬盘
if (!WinNTReadIDEHDSerial(m_wWinNTHDSerial))
WinNTReadSCSIHDSerial(m_wWinNTHDSerial);
strcpy (m_buffer,DWORDToChar(m_wWinNTHDSerial,10, 19));
}
return m_buffer;
}
//Windows NT/2000/XP下读取IDE硬盘序列号
BOOL CGetHDScriaI::WinNTReadIDEHDSerial(DWORD* buffer)
{
BYTE JdOutCmd [sizeof(SENDCMDOUTPARAMS)+IDFNTIFY_BUFFER_SIZE - 1];
BOOL bFlag = FALSE;
int drive = 0;
Char driveName[256];
HANDLE hPhysicalDrivelOCTL=0;
Sprintf(driveName,"\\\.\\PhysicalDrive%d",drive);
//Windows NT/2000/XP 下创建文件需要管理员权限
hPhysicalDriveIOCTL=CreateFile(driveName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if(hPhysicalDriveIOCTL!=INVALID_HANDLE_VALUE)
{
GETVERSIONOUTPARAMS VersionParams;
DWORD cbBytesReturned=0;
//得到驱动器的I/O控制器版本
memser((void*)&VersionParams,0,sizeof(VersionParams));
if(DeviceIoControl(hPhysicalDriveIOCTL,IOCTL_GET_VERSION,NULL,0,&VersionPaiams,sizeof(VersionParams),sizeof(VersionParams),
&cbBytesReturned,NULL))
{
if(VersionParams.bIDEDeviceMap>0)
{
BYTE bIDCmd=0;//IDE或者ATAPI识别命令
SENDCMDINPARAMS scip;
//如果驱动器是光驱,采用命令IDE_ATAPI_IDENTIFY,command,否则采用命令IDE_ATA_IDENTIFY读取驱动器信息
bIDCmd=(VersionParams.bIDEDeviceMap>>drive&0x10)? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset(&scip,0,sizeof(scip));
memset(IdOutCmd,0,sizeof(IdOutCmd));
//获取驱动器信息
if(WinNTGetIDEHDInfo(hPhysicalDrivelOCTL,&scip,(PSENDCMDOUTPARMS)&IdOutCmd,(BYTE)bIDCmd,(BYTE)drive,&cbBytesReturned))
{
int m=0;
USHORT*pldSector=(USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer;
for(m=0;m<256;m++)
buffer[m]=pIdSector[m];
bFlag=TRUE; //读取硬盘信息成功
}
}
}
CloseHandle(hPhysicalDriyeIOCTL); //关闭句柄
}
Return bFlag;
}
获取硬盘序列号
最新推荐文章于 2019-05-24 13:25:47 发布