⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskserialnumber.cpp

📁 取计算机硬件信息的算法、包括CPU、BIOS、HARDID、MAC
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -