📄 diskserialnumber.cpp
字号:
HANDLE hVxDHandle=CreateFile("\\\\.\\IDE21201.VXD",0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0);
if(hVxDHandle!=INVALID_HANDLE_VALUE)
{
//2.Make an output buffer for the VxD
DWORD dwBytesReturned=0;
rt_IdeDInfo info;
pt_IdeDInfo pOutBufVxD=&info;
//WARNING!!!
//HAVE to zero out the buffer space for the IDE information!
//If this is NOT done then garbage could be in the memory
//locations indicating if a disk exists or not.
ZeroMemory(&info,sizeof(info));
//3.Run VxD function
DeviceIoControl(hVxDHandle,1,0,0,pOutBufVxD,sizeof(pt_IdeDInfo),&dwBytesReturned,0);
//4.Unload VxD
CloseHandle(hVxDHandle);
//5.Translate and store data
for(int i=0;i<8;i++)
{
if((pOutBufVxD->DiskExists[i]) && (pOutBufVxD->IDEExists[i/2]))
{
//process the information for this buffer
DWORD dwDiskInfo[10];
for(int j=10;j<20;j++)
dwDiskInfo[j-10]=pOutBufVxD->DisksRawInfo[i*256+j];
ConvertToString(m_szSerials[m_nSerialCount++],dwDiskInfo,10);
}
}
done=TRUE;
}
//reset the thread priority back to normal
SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS);
return done;
}
BOOL CDiskSerialNumber::ReadPhysicalDriveInNTWithAdminRights()
{
BOOL done=FALSE;
for(int i=0;i<16;i++)
{
char driveName[256];
sprintf(driveName,"\\\\.\\PhysicalDrive%d",i);
HANDLE 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;
memset((void*)&VersionParams,0,sizeof(VersionParams));
if(DeviceIoControl(hPhysicalDriveIOCTL,DFP_GET_VERSION,
NULL,0,&VersionParams,sizeof(VersionParams),
&cbBytesReturned,NULL) && VersionParams.bIDEDeviceMap>0)
{
// Now, get the ID sector for all IDE devices in the system.
// If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
// otherwise use the IDE_ATA_IDENTIFY command
BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1];
BYTE bIDCmd=(VersionParams.bIDEDeviceMap>>i&0x10)?IDE_ATAPI_IDENTIFY:IDE_ATA_IDENTIFY;
SENDCMDINPARAMS scip;
memset(&scip,0,sizeof(scip));
memset(IdOutCmd,0,sizeof(IdOutCmd));
scip.cBufferSize=IDENTIFY_BUFFER_SIZE;
scip.irDriveRegs.bFeaturesReg=0;
scip.irDriveRegs.bSectorCountReg=1;
scip.irDriveRegs.bCylLowReg=0;
scip.irDriveRegs.bCylHighReg=0;
scip.irDriveRegs.bDriveHeadReg=0xA0|((i&1)<<4);
scip.irDriveRegs.bCommandReg=bIDCmd;
scip.bDriveNumber=i;
scip.cBufferSize=IDENTIFY_BUFFER_SIZE;
if(DeviceIoControl(hPhysicalDriveIOCTL,DFP_RECEIVE_DRIVE_DATA,
(LPVOID)&scip,sizeof(SENDCMDINPARAMS)-1,
(LPVOID)(PSENDCMDOUTPARAMS)&IdOutCmd,
sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1,
&cbBytesReturned,NULL))
{
//process the information for this buffer
DWORD dwDiskInfo[10];
USHORT *pIdSector=(USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)->bBuffer;
for(int j=10;j<20;j++)
dwDiskInfo[j-10]=pIdSector[j];
ConvertToString(m_szSerials[m_nSerialCount++],dwDiskInfo,10);
done = TRUE;
}
}
CloseHandle(hPhysicalDriveIOCTL);
}
}
return done;
}
BOOL CDiskSerialNumber::ReadIdeDriveAsScsiDriveInNT()
{
int done=FALSE;
for(int i=0;i<16;i++)
{
char driveName[256];
sprintf(driveName,"\\\\.\\Scsi%d:",i);
HANDLE hScsiDriveIOCTL=CreateFile(driveName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,0,NULL);
if(hScsiDriveIOCTL!=INVALID_HANDLE_VALUE)
{
for(int j=0;j<2;j++)
{
char buffer[sizeof(SRB_IO_CONTROL)+SENDIDLENGTH];
SRB_IO_CONTROL *p=(SRB_IO_CONTROL*)buffer;
SENDCMDINPARAMS *pin=(SENDCMDINPARAMS*)(buffer+sizeof(SRB_IO_CONTROL));
DWORD dummy;
memset(buffer,0,sizeof(buffer));
p->HeaderLength=sizeof(SRB_IO_CONTROL);
p->Timeout=10000;
p->Length=SENDIDLENGTH;
p->ControlCode=IOCTL_SCSI_MINIPORT_IDENTIFY;
strncpy((char*)p->Signature,"SCSIDISK",8);
pin->irDriveRegs.bCommandReg=IDE_ATA_IDENTIFY;
pin->bDriveNumber=j;
if(DeviceIoControl(hScsiDriveIOCTL,IOCTL_SCSI_MINIPORT,
buffer,sizeof(SRB_IO_CONTROL)+sizeof(SENDCMDINPARAMS)-1,
buffer,sizeof(SRB_IO_CONTROL)+SENDIDLENGTH,&dummy,NULL))
{
SENDCMDOUTPARAMS *pOut=(SENDCMDOUTPARAMS*)(buffer+sizeof(SRB_IO_CONTROL));
IDSECTOR *pId=(IDSECTOR*)(pOut->bBuffer);
if(pId->sModelNumber[0])
{
//process the information for this buffer
DWORD dwDiskInfo[10];
USHORT *pIdSector=(USHORT*)pId;
for(int k=10;k<20;k++)
dwDiskInfo[k-10]=pIdSector[k];
ConvertToString(m_szSerials[m_nSerialCount++],dwDiskInfo,10);
done=TRUE;
}
}
}
CloseHandle(hScsiDriveIOCTL);
}
}
return done;
}
BOOL CDiskSerialNumber::ReadPhysicalDriveInNTWithZeroRights()
{
BOOL done=FALSE;
for(int i=0;i<16;i++)
{
char driveName[256];
sprintf(driveName,"\\\\.\\PhysicalDrive%d",i);
HANDLE hPhysicalDriveIOCTL=CreateFile(driveName,0,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
OPEN_EXISTING,0,NULL);
if(hPhysicalDriveIOCTL!=INVALID_HANDLE_VALUE)
{
int nCurrentCount=m_nSerialCount;
STORAGE_PROPERTY_QUERY query;
DWORD cbBytesReturned=0;
char buffer[8192];
memset((void *)&query,0,sizeof(query));
query.PropertyId=StorageDeviceProperty;
query.QueryType=PropertyStandardQuery;
memset(buffer,0,sizeof(buffer));
if(DeviceIoControl(hPhysicalDriveIOCTL,IOCTL_STORAGE_QUERY_PROPERTY,
&query,sizeof(query),&buffer,sizeof(buffer),&cbBytesReturned,NULL))
{
STORAGE_DEVICE_DESCRIPTOR *descrip=(STORAGE_DEVICE_DESCRIPTOR*)&buffer;
flipAndCodeBytes(m_szSerials[m_nSerialCount],&buffer[descrip->SerialNumberOffset]);
//serial number must be alphanumeric
if((isalnum(m_szSerials[m_nSerialCount][0])))//? || isalnum(m_szSerials[m_nSerialCount][19])
{
m_nSerialCount++;
done=TRUE;
}
}
if(nCurrentCount==m_nSerialCount)
{
memset(buffer,0,sizeof(buffer));
if(DeviceIoControl(hPhysicalDriveIOCTL,IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER,
NULL,0,&buffer,sizeof(buffer),&cbBytesReturned,NULL))
{
MEDIA_SERIAL_NUMBER_DATA *mediaSerialNumber=(MEDIA_SERIAL_NUMBER_DATA*)&buffer;
fileBlankSpace(m_szSerials[m_nSerialCount],(char*)mediaSerialNumber->SerialNumberData);
//serial number must be alphanumeric
if((isalnum(m_szSerials[m_nSerialCount][0])))//? || isalnum(m_szSerials[m_nSerialCount][19])
{
m_nSerialCount++;
done=TRUE;
}
}
}
CloseHandle (hPhysicalDriveIOCTL);
}
}
return done;
}
void CDiskSerialNumber::flipAndCodeBytes(LPSTR result, LPCSTR str)
{
int num=strlen(str);
int position=0;
for(int i=0;i<num;i+=4)
{
for(int j=1;j>=0;j--)
{
int sum=0;
for(int k=0;k<2;k++)
{
sum*=16;
switch(str[i+j*2+k])
{
case '0': sum += 0; break;
case '1': sum += 1; break;
case '2': sum += 2; break;
case '3': sum += 3; break;
case '4': sum += 4; break;
case '5': sum += 5; break;
case '6': sum += 6; break;
case '7': sum += 7; break;
case '8': sum += 8; break;
case '9': sum += 9; break;
case 'a': sum += 10; break;
case 'b': sum += 11; break;
case 'c': sum += 12; break;
case 'd': sum += 13; break;
case 'e': sum += 14; break;
case 'f': sum += 15; break;
case 'A': sum += 10; break;
case 'B': sum += 11; break;
case 'C': sum += 12; break;
case 'D': sum += 13; break;
case 'E': sum += 14; break;
case 'F': sum += 15; break;
}
}
if(sum>0 && ' '!=(char)sum)
result[position++]=(char)sum;
}
}
result[position]='\0';
}
void CDiskSerialNumber::fileBlankSpace(LPSTR result, LPCSTR str)
{
int num=strlen(str);
int position=0;
for(int i=0;i<num;i+=4)
{
if(' '!=str[i])
result[position++]=str[i];
}
result[position]='\0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -