VC++获取网卡MAC、硬盘序列号、CPU+ID、BIOS编号

合集下载

C#获取机器的硬件信息CPU序列号主板信息硬盘

C#获取机器的硬件信息CPU序列号主板信息硬盘

C#获取机器的硬件信息CPU序列号主板信息2010在很多情况下,你可能都需要得到微机的硬件信息。

比如:你想给你的软件加锁,不让别人随便访问。

最有效的办法是获取CPU的序列号,然后让你的软件只能运行在有这样的CPU序列号的机器上。

众所周知,CPU序列号是唯一的!因此,这样就可以为你的软件加锁了。

另外一个需要硬盘信息的例子是:硬盘有几个分区,每个分区各有多少剩余空间。

当你正在做一个多媒体应用程序的时候,你可能也需要获得有关声卡、显卡的硬件信息。

本应用程序另一个精彩的应用是:获取有关系统内存的信息,如内存地址,内存设备等等。

首先,你必须知道这个应用程序的功能是使用System.Management这个类得到的。

因此,你需要加上下面的这句话:using System.Management;为了获取硬件信息,你还需要创建一个ManagementObjectSearcher 对象。

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + Key);上面代码的Key是一个将被对应正确的数据填入的值。

例如,获取CPU的信息,就需要把Key值设成Win32_Processor。

所有Key可能的值,列举如下:Win32_1394ControllerWin32_1394ControllerDeviceWin32_AccountWin32_AccountSIDWin32_ACEWin32_ActionCheckWin32_AllocatedResourceWin32_ApplicationCommandLine Win32_ApplicationServiceWin32_AssociatedBatteryWin32_AssociatedProcessorMemory Win32_BaseBoardWin32_BaseServiceWin32_BatteryWin32_BinaryWin32_BindImageActionWin32_BIOSWin32_BootConfigurationWin32_BusWin32_CacheMemoryWin32_CDROMDriveWin32_CheckCheckWin32_CIMLogicalDeviceCIMDataFile Win32_ClassicCOMApplicationClasses Win32_ClassicCOMClassWin32_ClassicCOMClassSettingWin32_ClassicCOMClassSettingsWin32_ClassInfoActionWin32_ClientApplicationSettingWin32_CodecFileWin32_COMApplicationWin32_COMApplicationClassesWin32_COMApplicationSettingsWin32_COMClassWin32_ComClassAutoEmulatorWin32_ComClassEmulatorWin32_CommandLineAccessWin32_ComponentCategoryWin32_ComputerSystemWin32_ComputerSystemProcessorWin32_ComputerSystemProductWin32_COMSettingWin32_ConditionWin32_CreateFolderActionWin32_CurrentProbeWin32_DCOMApplicationWin32_DCOMApplicationAccessAllowedSetting Win32_DCOMApplicationLaunchAllowedSetting Win32_DCOMApplicationSettingWin32_DependentServiceWin32_DesktopWin32_DesktopMonitorWin32_DeviceBusWin32_DeviceMemoryAddressWin32_DeviceSettingsWin32_DirectorySpecificationWin32_DiskDriveWin32_DiskDriveToDiskPartition Win32_DiskPartitionWin32_DisplayConfigurationWin32_DisplayControllerConfiguration Win32_DMAChannelWin32_DriverVXDWin32_DuplicateFileActionWin32_EnvironmentWin32_EnvironmentSpecificationWin32_ExtensionInfoActionWin32_FanWin32_FileSpecificationWin32_FloppyControllerWin32_FloppyDriveWin32_FontInfoActionWin32_GroupWin32_HeatPipeWin32_IDEControllerWin32_IDEControllerDeviceWin32_ImplementedCategoryWin32_InfraredDeviceWin32_IniFileSpec ificationWin32_InstalledSoftwareElementWin32_IRQResourceWin32_KeyboardWin32_LaunchConditionWin32_LoadOrderGroupWin32_LoadOrderGroupServiceDependencies Win32_LoadOrderGroupServiceMembers Win32_LogicalDiskWin32_LogicalDiskRootDirectoryWin32_LogicalDiskToPartitionWin32_LogicalFileAccessWin32_LogicalFileAuditingWin32_LogicalFileGroupWin32_LogicalFileOwnerWin32_LogicalFileSecuritySettingWin32_LogicalMemoryConfiguration Win32_LogicalProgramGroupWin32_LogicalProgramGroupDirectory Win32_LogicalProgramGroupItemWin32_LogicalProgramGroupItemDataFile Win32_LogicalShareAccessWin32_LogicalShareAuditingWin32_LogicalShareSecuritySettingWin32_ManagedSystemElementResource Win32_MemoryArrayWin32_MemoryArrayLocationWin32_MemoryDeviceWin32_MemoryDeviceArrayWin32_MemoryDeviceLocationWin32_MethodParameterClassWin32_MIMEInfoActionWin32_MotherboardDeviceWin32_MoveFileActionWin32_MSIResourceWin32_NetworkAdapterWin32_NetworkAdapterConfiguration Win32_NetworkAdapterSettingWin32_NetworkClientWin32_NetworkConnectionWin32_NetworkLoginProfileWin32_NetworkProtocolWin32_NTEventlogFileWin32_NTLogEventWin32_NTLogEventComputerWin32_NTLogEventLogWin32_NTLogEventUserWin32_ODBCAttributeWin32_ODBCDataSourceAttribute Win32_ODBCDataSourceSpecification Win32_ODBCDriverAttributeWin32_ODBCDriverSoftwareElement Win32_ODBCDriverSpecification Win32_ODBCSourceAttributeWin32_ODBCTranslatorSpecification Win32_OnBoardDeviceWin32_OperatingSystemWin32_OperatingSystemQFEWin32_OSRecoveryConfiguration Win32_PageFileWin32_PageFileElementSettingWin32_PageFileSettingWin32_PageFileUsageWin32_ParallelPortWin32_PatchWin32_PatchFileWin32_PatchPackageWin32_PCMCIAControllerWin32_PerfWin32_PerfRawDataWin32_PerfRawData_ASP_ActiveServerPagesWin32_PerfRawData_ASPNET_114322_ASPNETAppsv114322 Win32_PerfRawData_ASPNET_114322_ASPNETv114322Win32_PerfRawData_ASPNET_ASPNETWin32_PerfRawData_ASPNET_ASPNETApplicationsWin32_PerfRawData_IAS_IASAccountingClientsWin32_PerfRawData_IAS_IASAccountingServerWin32_PerfRawData_IAS_IASAuthenticationClientsWin32_PerfRawData_IAS_IASAuthenticationServerWin32_PerfRawData_InetInfo_InternetInformationServicesGlobal Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator Win32_PerfRawData_MSFTPSVC_FTPServiceWin32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods Win32_PerfRawData_MSSQLSERVER_SQLServerBackupDevice Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager Win32_PerfRawData_MSSQLSERVER_SQLServerBufferPartition Win32_PerfRawData_MSSQLSERVER_SQLServerCacheManager Win32_PerfRawData_MSSQLSERVER_SQLServerDatabasesWin32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatisticsWin32_PerfRawData_MSSQLSERVER_SQLServerLatchesWin32_PerfRawData_MSSQLSERVER_SQLServerLocksWin32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationAgents Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationDist Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationLogreader Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationMerge Win32_PerfRawData_MSSQLSERVER_SQLServerReplicationSnapshot Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatisticsWin32_PerfRawData_MSSQLSERVER_SQLServerUserSettableWin32_PerfRawData_NETFramework_NETCLRExceptionsWin32_PerfRawData_NETFramework_NETCLRInteropWin32_PerfRawData_NETFramework_NETCLRJitWin32_PerfRawData_NETFramework_NETCLRLoadingWin32_PerfRawData_NETFramework_NETCLRLocksAndThreads Win32_PerfRawData_NETFramework_NETCLRMemoryWin32_PerfRawData_NETFramework_NETCLRRemotingWin32_PerfRawData_NETFramework_NETCLRSecurityWin32_PerfRawData_Outlook_OutlookWin32_PerfRawData_PerfDisk_PhysicalDiskWin32_PerfRawData_PerfNet_BrowserWin32_PerfRawData_PerfNet_RedirectorWin32_PerfRawData_PerfNet_ServerWin32_PerfRawData_PerfNet_ServerWorkQueuesWin32_PerfRawData_PerfOS_CacheWin32_PerfRawData_PerfOS_MemoryWin32_PerfRawData_PerfOS_ObjectsWin32_PerfRawData_PerfOS_PagingFileWin32_PerfRawData_PerfOS_ProcessorWin32_PerfRawData_PerfOS_SystemWin32_PerfRawData_PerfProc_FullImage_CostlyWin32_PerfRawData_PerfProc_Image_CostlyWin32_PerfRawData_PerfProc_JobObjectWin32_PerfRawData_PerfProc_JobObjectDetailsWin32_PerfRawData_PerfProc_ProcessWin32_PerfRawData_PerfProc_ProcessAddressSpace_Costly Win32_PerfRawData_PerfProc_ThreadWin32_PerfRawData_PerfProc_ThreadDetails_CostlyWin32_PerfRawData_RemoteAccess_RASPort Win32_PerfRawData_RemoteAccess_RASTotal Win32_PerfRawData_RSVP_ACSPerRSVPService Win32_PerfRawData_Spooler_PrintQueueWin32_PerfRawData_TapiSrv_TelephonyWin32_PerfRawData_Tcpip_ICMPWin32_PerfRawData_Tcpip_IPWin32_PerfRawData_Tcpip_NBTConnectionWin32_PerfRawData_Tcpip_NetworkInterface Win32_PerfRawData_Tcpip_TCPWin32_PerfRawData_Tcpip_UDPWin32_PerfRawData_W3SVC_WebServiceWin32_PhysicalMemoryWin32_PhysicalMemoryArrayWin32_PhysicalMemoryLocationWin32_PNPAllocatedResourceWin32_PnPDeviceWin32_PnPEntityWin32_PointingDeviceWin32_PortableBatteryWin32_PortConnectorWin32_PortResourceWin32_POTSModemWin32_POTSModemToSerialPort Win32_PowerManagementEvent Win32_PrinterWin32_PrinterConfigurationWin32_PrinterControllerWin32_PrinterDriverDllWin32_PrinterSettingWin32_PrinterShareWin32_PrintJobWin32_PrivilegesStatusWin32_ProcessWin32_ProcessorWin32_ProcessStartupWin32_ProductWin32_ProductCheckWin32_ProductSoftwareFeatures Win32_ProgIDSpecification Win32_ProgramGroupWin32_ProgramGroupContents Win32_ProgramGroupOrItem Win32_PropertyWin32_ProtocolBindingWin32_PublishComponentAction Win32_QuickFixEngineering Win32_RefrigerationWin32_RegistryWin32_RegistryActionWin32_RemoveFileActionWin32_RemoveIniActionWin32_ReserveCostWin32_ScheduledJobWin32_SCSIControllerWin32_SCSIControllerDeviceWin32_SecuritySettingWin32_SecuritySettingAccessWin32_SecuritySettingAuditingWin32_SecuritySettingGroupWin32_SecuritySettingOfLogicalFile Win32_SecuritySettingOfLogicalShare Win32_SecuritySettingOfObjectWin32_SecuritySettingOwnerWin32_SelfRegModuleActionWin32_SerialPortWin32_SerialPortConfigurationWin32_SerialPortSettingWin32_ServiceWin32_ServiceControlWin32_ServiceSpecificationWin32_ServiceSpecificationService Win32_SettingCheckWin32_ShareWin32_ShortcutActionWin32_ShortcutFileWin32_ShortcutSAPWin32_SIDWin32_SMBIOSMemoryWin32_SoftwareElementWin32_SoftwareElementActionWin32_SoftwareElementCheckWin32_SoftwareElementConditionWin32_SoftwareElementResourceWin32_SoftwareFeatureWin32_SoftwareFeatureActionWin32_SoftwareFeatureCheckWin32_SoftwareFeatureParentWin32_SoftwareFeatureSoftwareElements Win32_SoundDeviceWin32_StartupCommandWin32_SubDirectoryWin32_SystemBIOSWin32_SystemBootConfigurationWin32_SystemDesktopWin32_SystemDevicesWin32_SystemDriverWin32_SystemDriverPNPEntityWin32_SystemEnclosureWin32_SystemLoadOrderGroupsWin32_SystemLogicalMemoryConfiguration Win32_SystemMemoryResourceWin32_SystemNetworkConnectionsWin32_SystemOperatingSystemWin32_SystemPartitionsWin32_SystemProcessesWin32_SystemProgramGroupsWin32_SystemResourcesWin32_SystemServicesWin32_SystemSettingWin32_SystemSlotWin32_SystemSystemDriverWin32_SystemTimeZoneWin32_SystemUsersWin32_TapeDriveWin32_TemperatureProbeWin32_ThreadWin32_TimeZoneWin32_TrusteeWin32_TypeLibraryActionWin32_UninterruptiblePowerSupply Win32_USBControllerWin32_USBControllerDeviceWin32_UserAccountWin32_UserDesktopWin32_VideoConfigurationWin32_VideoControllerWin32_VideoSettingsWin32_VoltageProbeWin32_WMIElementSettingWin32_WMISetting首先,调用ManagementObjectSearcher实例(在本文中的例子里为searcher )中的Get()方法,该方法将会把返回信息填在这个实例中。

C获取网卡MAC地址

C获取网卡MAC地址

c++获取网卡M‎A C地址第一种方法‎使用Mic‎r osof‎t的Net‎b ios API。

这是一套通‎过Wins‎o ck提供‎底层网络支‎持的命令。

使用Net‎b ios 的‎最大缺点是‎您必须在系‎统中安装了‎N etbi‎o s服务(如果您在w‎i ndow‎s网络中启用了‎文件共享的‎话,这就不是问‎题了)。

除此此外,这种方法又‎快又准确。

Netbi‎o s API只包‎括了一个函‎数,就叫做Ne‎t bios‎。

这个函数使‎用网络控制‎块(netwo‎r k contr‎o l block‎)结构作为参‎数,这个结构告‎诉函数要做‎什么。

结构的定义‎如下:typed‎e f struc‎t _NCB {UCHAR‎ncb_c‎o mman‎d;UCHAR‎ncb_r‎e tcod‎e;UCHAR‎ncb_l‎s n;UCHAR‎ncb_n‎u m;PUCHA‎R ncb_b‎u ffer‎;WORD ncb_l‎e ngth‎;UCHAR‎ncb_c‎a llna‎m e[NCBNA‎M SZ];UCHAR‎ncb_n‎a me[NCBNA‎M SZ];UCHAR‎ncb_r‎t o;UCHAR‎ncb_s‎t o;void (CALLB‎A CK *ncb_p‎o st) (struc‎t _NCB *);UCHAR‎ncb_l‎a na_n‎u m;UCHAR‎ncb_c‎m d_cp‎l t;#ifdef‎_WIN6‎4UCHAR‎ncb_r‎e serv‎e[18];#elseUCHAR‎ncb_r‎e serv‎e[10];#endif‎HANDL‎E ncb_e‎v ent;} NCB, *PNCB;重点在于n‎c b_co‎m mand‎成员。

这个成员告‎诉Netb‎i os该作‎什么。

我们使用三‎个命令来探‎测MAC地‎址。

他们在MS‎D N的定义‎如下:命令描述:NCBEN‎U M Windo‎w s NT/2000: 列举系统中‎网卡的数量‎。

C#读取电脑CPU、主板、硬盘序列号等信息

C#读取电脑CPU、主板、硬盘序列号等信息

C#读取电脑CPU、主板、硬盘序列号等信息ManagementObjectSearcher 解析不到头⽂件,需要⼿动 Add Referance需要添加引⽤:System.Management,然后引⼊命名空间:using System.Management;//获取CPU序列号public string GetCPUSerialNumber(){try{ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Processor");string sCPUSerialNumber = "";foreach (ManagementObject mo in searcher.Get()){sCPUSerialNumber = mo["ProcessorId"].ToString().Trim();break;}return sCPUSerialNumber;}catch{return "";}}//获取主板序列号public string GetBIOSSerialNumber(){try{ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_BIOS");string sBIOSSerialNumber = "";foreach (ManagementObject mo in searcher.Get()){sBIOSSerialNumber = mo.GetPropertyValue("SerialNumber").ToString().Trim();break;}return sBIOSSerialNumber;}catch{return "";}}//获取硬盘序列号public string GetHardDiskSerialNumber(){try{ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");string sHardDiskSerialNumber = "";foreach (ManagementObject mo in searcher.Get()){sHardDiskSerialNumber = mo["SerialNumber"].ToString().Trim();break;}return sHardDiskSerialNumber;}catch{return "";}}//获取⽹卡地址public string GetNetCardMACAddress(){try{ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL) AND (Manufacturer <> 'Microsoft'))"); string NetCardMACAddress = "";foreach (ManagementObject mo in searcher.Get()){NetCardMACAddress = mo["MACAddress"].ToString().Trim();break;}return NetCardMACAddress;}catch{return "";}}// 硬件Win32_Processor, // CPU 处理器Win32_PhysicalMemory, // 物理内存条Win32_Keyboard, // 键盘Win32_PointingDevice, // 点输⼊设备,包括⿏标。

VC之关于软件注册码mac cpuID 硬盘ID

VC之关于软件注册码mac cpuID 硬盘ID

VC之获取计算机网卡mac地址(2009-08-02 21:59:24)转载分类:技术乱弹标签:vc系列杂谈网卡的物理地址即mac地址全球唯一,占用六个字节。

(正规厂家的网卡mac地址全球唯一,盖因有统一的委员会进行分配,一般前3个字节为生产厂商ID,后三个字节为产品子ID.mac地址一般烧写在网卡的prom中,上电后读入网络协议芯片的mac地址寄存器中。

笔者曾开发了一个基于单片机的远程测控系统,采用C8051F120和RTL8019as实现,当然委员会不可能给笔者分配一个mac,哥们便将其定为01-02-03-04-05-06,不想通过sniffer进行调试时发现该mac属于3com公司,一不小心侵了3com的权。

由于mac地址会存在地址寄存器中,这就为某些修改mac的软件提供了可乘之机,当然其修改也是暂时的,这是题外话,暂且不表)。

一般情况下,获取mac地址生成序列号可以保护我们的软件版权,这也是一帆风颇费周章的目的。

获取mac地址,一可以使用NetBIOS函数,二可使用IP助手函数。

一帆风推荐使用后者,因为:Netbios函数得到的MAC经常是不准确的。

它依赖于机器上安装网络协议的顺序。

比如先装IPX协议再装TCP协议,与先装TCP再装IPX所得到的MAC很有可能不一致。

这是因为Netbios函数会得到很多的虚拟MAC地址而不是真正的网卡MAC。

IPCONFIG就是使用IP助手函数来做的。

以下是我的做法请参考:#include "iphlpapi.h"#pragma comment(lib, "iphlpapi.lib ")//----------------------------------------------//功能:获得网卡物理地址//参数:strMac 返回网卡物理地址//返回:TRUE 成功// FALSE 失败//----------------------------------------------BOOL CCApp::GetMacAddress(CString &strMac){PIP_ADAPTER_INFO pAdapterInfo;DWORD AdapterInfoSize;TCHAR szMac[32] = {0};DWORD Err;AdapterInfoSize = 0;Err = GetAdaptersInfo(NULL, &AdapterInfoSize);if((Err != 0) && (Err != ERROR_BUFFER_OVERFLOW)){ TRACE("获得网卡信息失败!");return FALSE;}// 分配网卡信息内存pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize);if(pAdapterInfo == NULL){TRACE("分配网卡信息内存失败");return FALSE;}if(GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize) != 0){TRACE(_T("获得网卡信息失败!\n"));GlobalFree(pAdapterInfo);return FALSE;}strMac.Format(_T("%02X%02X%02X%02X%02X%02X"),pAdapterInfo->Address[0],pAdapterInfo->Address[1],pAdapterInfo->Address[2],pAdapterInfo->Address[3],pAdapterInfo->Address[4],pAdapterInfo->Address[5]);GlobalFree(pAdapterInfo);return TRUE;}应注意以下几点:1。

VC获取IP地址和MAC地址程序

VC获取IP地址和MAC地址程序
#include <winsock2.h> //该头文件定义了Socket编程的功能
#include <stdio.h> //该头文件声明了输入输出流函数
#include <stdlib.h> //该头文件定义了一些通用函数
#include <httpext.h> //该头文件支持HTTP请求
#include <windef.h> //该头文件定义了Windows的所有数据基本型态
#include <Nb30.h> //该头文件声明了netbios的所有的函数
#pragma comment(lib,"ws2_32.lib") //连接ws2_32.lib库.只要程序中用到Winsock API 函数,都要用到 Ws2_32.lib
ncb.ncb_command = NCBASTAT; //对网卡发送NCBSTAT命令,获取网卡信息
ncb.ncb_lana_num = lana_na[0]; //指定网卡号,这里仅仅指定第一块网卡,通常为有线网卡
strcpy((char*)ncb.ncb_callname, "*"); //远程系统名赋值为*
}
}
WSACleanup( ); //卸载Winsock库,并释放所有资源
}
}
//通过WindowsNT/Win2000中内置的NetApi32.DLL的功能来实现的。首先通过发送NCBENUM命令,获取网卡的
ncb.ncb_buffer = (unsigned char *)&Adapter; //指定返回的信息存放的变量
ncb.ncb_length = sizeof(Adapter);

vC++ 获取cpu信息,硬盘ID,网卡MAC地址_内部资料

vC++ 获取cpu信息,硬盘ID,网卡MAC地址_内部资料

目录摘要 (I)获取系统信息程序的开发1.设计目的 (1)2. 设计基本要求 (1)3. 设计内容 (1)4. 设计步骤 (1)5. 程序代码5.1头文件SysinfoView.h (5)5.2头文件Registry.h (6)5.3源文件SysinfoView.cpp (7)5.4源文件MainFrm.cpp (21)5.5源文件Registry.cpp (23)5.6源文件Sysinfo.cpp (26)6.设计成果 (26)总结 (27)参考文献 (28)摘要计算机系统信息包括硬件系统信息和软件系统信息。

硬件系统直接决定了软件系统运行的可行性,同时软件系统又反过来影响着硬件系统的运行。

因此,及时掌握计算机系统信息对于计算机用户来说尤其重要。

本课程设计介绍了如何利用Visual C++这一编程工具进行程序设计来获取计算机的系统信息。

关键词:Visual C++;计算机系统信息;程序设计获取系统信息程序的开发1.设计目的在学习了“VC++程序设计基础”课程的基础上,通过本编程设计练习,旨在加深对相关知识的理解,初步掌握VC++程序设计的基本设计方法,提高程序设计的基本技能及分析、解决编程问题的能力。

2. 设计基本要求计算机系统信息包括硬件系统信息和软件系统信息。

硬件系统直接决定了软件系统运行的可行性,同时软件系统又反过来影响着硬件系统的运行。

因此,及时掌握计算机系统信息对于计算机用户来说尤其重要。

本程序的主要功能如下:1)获取操作系统信息,显示该操作系统的版本号。

2)获取CPU运行速度3)获取内存大小,计算剩余内存大小和百分率4)获取网卡地址和本机机器的IP地址5)操作系统的操作(关闭系统、重启系统、快速重启系统)6)注册表的操作7)程序界面的鼠标拖动操作8)弹出菜单的应用3. 设计内容1)计算机安装操作系统后,操作系统将版本信息存放于注册表的特定位置:HKEY_LOCAL_MACHINE->”Software\\Microsoft\\Windows\\CurrentVersion\\Run\\”.因此只需要进行注册表的访问操作就可以得到相关的操作。

Linux下获取CPUID、硬盘序列号与MAC地址

Linux下获取CPUID、硬盘序列号与MAC地址

Linux下获取CPUID、硬盘序列号与 MAC地址在很多系统软件的开发中,需要使用一些系统的唯一性信息。

所以,得到主机的CPUID、硬盘序列号及网卡的MAC地址,就成个一件很重要的应用。

本人经过一番google即自己的钻研,基本上实现了这几个功能。

需要的准备知识有:1.GCC的嵌入汇编,具体的GCC嵌入汇编知识,请参考相关手册2.ioctl系统调用,具体的调用方法,请查看手册页获取CPUID按照网上提供的说明,CPUID并不是所有的Intel CPU都支持的。

如果支持,汇编调用为: eax置0000_0003,调用cpuid。

以下为实现代码(在我的CPU上,并没有得到):#define cpuid(in,a,b,c,d) asm("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in)); static intgetcpuid (char *id, size_t max){int i;unsigned long li, maxi, maxei, ebx, ecx, edx, unused;cpuid (0, maxi, unused, unused, unused);maxi &= 0xffff;if (maxi < 3){return -1;}cpuid (3, eax, ebx, ecx, edx);snprintf (id, max, "%08lx %08lx %08lx %08lx", eax, ebx, ecx, edx);fprintf (stdout, "get cpu id: %s\n", id);return 0;}获取硬盘序列号这个的实现,采用的是读取/etc/mtab文件,找到/(即根目录)挂载的设备文件,然后打开它,再用系统调用 ioctl来实现的。

计算机编号、硬盘序列号和Mac地址查询方法

计算机编号、硬盘序列号和Mac地址查询方法

计算机编号、硬盘序列号和Mac地址查询⽅法(1)计算机编号:SN也就是Serial Number的缩写,中⽂也就是产品序列号,⽽电脑的后⾯⼀般也有⼀个这样的SN序列号,那么怎么查看电脑的S/N序列号呢?⽅法⼀:将笔记本电脑翻过来,然后在它的后⾯就可以看到⼀个S/N的序列号了⽅法⼆:按下键盘的 win+R 组合快捷键或者是点击桌⾯左下⾓的开始菜单,在打开的页⾯中点击运⾏选项。

然后在打开的运⾏窗⼝的输⼊框中输⼊ cmd 回车。

然后在打开的命令⾏窗⼝中输⼊ wmic/? 回车,这样就可以查看此命令的帮助信息了。

先按下Esc停⽌它,然后输⼊ wmic bios get serialnumber 回车。

回车之后,在弹出的信息中就可以看到 S/N 序列号了。

(2)硬盘序列号:⾸先点击电脑左下⾓“开始”,在搜索中输⼊“cmd”点击打开命令窗⼝;在命令⾏输⼊“diskpart”按回车键启动这个程序;接着输⼊“list disk”按回车键把电脑上的所有磁盘都罗列出来;接着输⼊“select disk 0”按回车键,选好要查看的磁盘后接着输⼊“detail disk”,再按回车键,硬盘的信息将会展现出来;其中磁盘ID就是要查看的硬盘序列号;(3)Mac地址查询:⽅法⼀:打开控制⾯板中的【⽹络和共享中⼼】;右击【本地连接】在弹出菜单中选择【状态】;在弹出的窗⼝中打开【详细信息】按钮;属性窗⼝中的物理地址就是我们的MAC地址了。

⽅法⼆:还可以通过命令的⽅式快速获得mac地址,打开运⾏窗⼝。

输⼊cmd;打开命令窗⼝,输⼊:getmac;回车后,就会显⽰出以下信息,物理地址就是MAC地址了。

[说明]C获取电脑硬件信息(CPUID、主板ID、硬盘ID、BIOS编号)

[说明]C获取电脑硬件信息(CPUID、主板ID、硬盘ID、BIOS编号)

C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)最近学习过程中,想到提取系统硬件信息做一些验证,故而对网上提到的利用.NET System.Management类获取硬件信息做了进一步的学习、验证。

验证是分别在4台电脑,XP SP3系统中进行,特将验证过程记录于此。

说明:电脑1(联想品牌电脑);电脑2(HP品牌电脑);电脑3(联想品牌电脑);电脑4(兼容机);•获取CPU编号:Dim mc As New ManagementClass("Win32_Processor")Dim moc As ManagementObjectCollection = mc.GetInstances()Dim strID As String = NothingFor Each mo As ManagementObject In mocstrID = mo.Properties("ProcessorId").Value.ToString()Exit ForNexttextBox1.Text += "CPU ID:" + strID返回结果:电脑1:CPU ID:BFEBFBFF00000F27电脑2:CPU ID:BFEBFBFF00000F27电脑3:CPU ID:BFEBFBFF00000F29电脑4:CPU ID:BFEBFBFF00000F29•获取主板编号:Dim mc As New ManagementClass("Win32_BaseBoard")Dim moc As ManagementObjectCollection = mc.GetInstances()Dim strID As String = NothingFor Each mo As ManagementObject In mocstrID = mo.Properties("SerialNumber").Value.ToString()Exit ForNexttextBox1.Text += "主板 ID:" + strID返回结果:电脑1:主板 ID:电脑2:主板 ID:CN24401483电脑3:主板 ID:AZF241001101电脑4:主板 ID:•获取硬盘编号:ManagementClass mc = newManagementClass("Win32_PhysicalMedia");//网上有提到,用Win32_DiskDrive,但是用Win32_DiskDrive获得的硬盘信息中并不包含SerialNumber属性。

获取全部硬盘、主板、网卡MAC、CPU硬件序列号程序代码

获取全部硬盘、主板、网卡MAC、CPU硬件序列号程序代码
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
USHORT wDMATiming;
USHORT wBS;
USHORT wNumCurrentCyls;
USHORT wNumCurrentHeads;
USHORT wNumCurrentSectorsPerTrack;
ULONG ulCurrentSectorCapacity;
typedef DWORD (__stdcall *ZWMV )( HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);
typedef DWORD (__stdcall *ZWUMV )( HANDLE,PVOID);
} IDSECTOR, *PIDSECTOR;
typedef struct _DRIVERSTATUS
{
BYTE bDriverError; // Error code from driver, or 0 if no error.
BYTE bIDEStatus; // Contents of IDE Error register.
typedef struct _UNICODE_STRING
{
USHORT Length;//长度
USHORT MaximumLength;//最大长度
PWSTR Buffer;//缓存指针

VC++获取网卡MAC、硬盘序列号、CPU+ID、BIOS编号

VC++获取网卡MAC、硬盘序列号、CPU+ID、BIOS编号

VC++获取网卡MAC、硬盘序列号、CPU ID、BIOS编号以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码UINT uSystemInfoLen = 0; // 在程序执行完毕后,此处存储取得的系统特征码的长度// 网卡MAC 地址,注意: MAC 地址是可以在注册表中修改的{UINT uErrorCode=0;IP_ADAPTER_INFO iai;ULONG uSize = 0;DWORD dwResult = GetAdaptersInfo( &iai, &uSize );if( dwResult == ERROR_BUFFER_OVERFLOW ){IP_ADAPTER_INFO* piai=( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ), 0, uSize );if( piai != NULL ){dwResult = GetAdaptersInfo( piai, &uSize );if( ERROR_SUCCESS == dwResult ){IP_ADAPTER_INFO* piai2 = piai;while(piai2!=NULL &&(uSystemInfoLen+piai2->AddressLength )< 4096U){CopyMemory(szSystemInfo+uSystemInfoLen,piai2->Address, piai2->AddressLength );uSystemInfoLen += piai2->AddressLength;piai2 = piai2->Next;}}else{uErrorCode = 0xF0000000U + dwResult;}VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) );}else{return FALSE;}}else{uErrorCode = 0xE0000000U + dwResult;}if( uErrorCode != 0U ){return FALSE;}}// 硬盘序列号,注意:有的硬盘没有序列号{OSVERSIONINFO ovi = { 0 };ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );GetVersionEx( &ovi );if( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT ){// Only Windows 2000, Windows XP, Windows Server 2003...return FALSE;}else{if( !WinNTHDSerialNumAsPhysicalRead( szSystemInfo, &uSystemInfoLen, 1024 ) ){WinNTHDSerialNumAsScsiRead( szSystemInfo, &uSystemInfoLen, 1024 );}}}// CPU ID{BOOL bException = FALSE;BYTE szCpu[16] = { 0 };UINT uCpuID = 0U;__try{_asm{mov eax, 0cpuidmov dword ptr szCpu[0], ebxmov dword ptr szCpu[4], edxmov dword ptr szCpu[8], ecxmov eax, 1cpuidmov uCpuID, edx}}__except( EXCEPTION_EXECUTE_HANDLER ){bException = TRUE;}if( !bException ){CopyMemory( szSystemInfo + uSystemInfoLen, &uCpuID, sizeof( UINT ) );uSystemInfoLen += sizeof( UINT );uCpuID = strlen( ( char* )szCpu );CopyMemory( szSystemInfo + uSystemInfoLen, szCpu, uCpuID );uSystemInfoLen += uCpuID;}}// BIOS 编号,支持AMI, AW ARD, PHOENIX{SIZE_T ssize;LARGE_INTEGER so;so.LowPart=0x000f0000;so.HighPart=0x00000000;ssize=0xffff;wchar_t strPH[30]=L\\device\\physicalmemory;DWORD ba=0;UNICODE_STRING struniph;struniph.Buffer=strPH;struniph.Length=0x2c;struniph.MaximumLength =0x2e;OBJECT_ATTRIBUTES obj_ar;obj_ar.Attributes =64;obj_ar.Length =24;obj_ar.ObjectName=&struniph;obj_ar.RootDirectory=0;obj_ar.SecurityDescriptor=0;obj_ar.SecurityQualityOfService =0;HMODULE hinstLib = LoadLibrary("ntdll.dll");ZWOS ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");ZWMV ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");ZWUMV ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");//调用函数,对物理内存进行映射HANDLE hSection;if( 0 == ZWopenS(&hSection,4,&obj_ar) &&0 == ZWmapV(( HANDLE )hSection, //打开Section时得到的句柄( HANDLE )0xFFFFFFFF, //将要映射进程的句柄,&ba, //映射的基址0,0xFFFF, //分配的大小&so, //物理内存的地址&ssize, //指向读取内存块大小的指针1, //子进程的可继承性设定0, //分配类型2 //保护类型) )//执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里//映射的基址由ba返回,如果映射不再有用,应该用ZwUnmapViewOfSection断开映射{BYTE* pBiosSerial = ( BYTE* )ba;UINT uBiosSerialLen = FindAwardBios( &pBiosSerial );if( uBiosSerialLen == 0U ){uBiosSerialLen = FindAmiBios( &pBiosSerial );if( uBiosSerialLen == 0U ){uBiosSerialLen = FindPhoenixBios( &pBiosSerial );}}if( uBiosSerialLen != 0U ){CopyMemory( szSystemInfo + uSystemInfoLen, pBiosSerial, uBiosSerialLen );uSystemInfoLen += uBiosSerialLen;}ZWunmapV( ( HANDLE )0xFFFFFFFF, ( void* )ba );}}// 完毕,系统特征码已取得。

C获取电脑硬件信息(CPUID、主板ID、硬盘ID、BIOS编号)

C获取电脑硬件信息(CPUID、主板ID、硬盘ID、BIOS编号)

C#获取电‎脑硬件信息‎(CPU ‎I D、主板‎I D、硬盘‎I D、BI‎O S编号)‎‎最近学‎习过程中,‎想到提取系‎统硬件信息‎做一些验证‎,故而对网‎上提到的利‎用.NET‎Syst‎e m.Ma‎n agem‎e nt类获‎取硬件信息‎做了进一步‎的学习、验‎证。

验证是‎分别在4台‎电脑,XP‎SP3系‎统中进行,‎特将验证过‎程记录于此‎。

‎说明:‎电脑1(联‎想品牌电脑‎);电脑‎2(HP品‎牌电脑);‎电脑3(‎联想品牌电‎脑);电‎脑4(兼容‎机);‎•获取C‎P U编号:‎Dim ‎m c As‎New ‎M anag‎e ment‎C lass‎("Win‎32_Pr‎o cess‎o r")‎D im m‎o c As‎Mana‎g emen‎t Obje‎c tCol‎l ecti‎o n = ‎m c.Ge‎t Inst‎a nces‎()Di‎m str‎I D As‎Stri‎n g = ‎N othi‎n gFo‎r Eac‎h mo ‎A s Ma‎n agem‎e ntOb‎j ect ‎I n mo‎cst‎r ID =‎mo.P‎r oper‎t ies(‎"Proc‎e ssor‎I d").‎V alue‎.ToSt‎r ing(‎)Ex‎i t Fo‎rNex‎ttex‎t Box1‎.Text‎+= "‎C PU I‎D:" +‎strI‎D‎返回‎结果:‎‎电脑1‎:CPU ‎I D:BF‎E BFBF‎F0000‎0F27‎‎电脑‎2:CPU‎ID:B‎F EBFB‎F F000‎00F27‎‎电‎脑3:CP‎U ID:‎B FEBF‎B FF00‎000F2‎9‎‎电脑4:C‎P U ID‎:BFEB‎F BFF0‎0000F‎29‎•获取主板‎编号:D‎i m mc‎As N‎e w Ma‎n agem‎e ntCl‎a ss("‎W in32‎_Base‎B oard‎")Di‎m moc‎As M‎a nage‎m entO‎b ject‎C olle‎c tion‎= mc‎.GetI‎n stan‎c es()‎Dim ‎s trID‎As S‎t ring‎= No‎t hing‎For ‎E ach ‎m o As‎Mana‎g emen‎t Obje‎c t In‎moc‎strI‎D = m‎o.Pro‎p erti‎e s("S‎e rial‎N umbe‎r").V‎a lue.‎T oStr‎i ng()‎Exi‎t For‎Next‎text‎B ox1.‎T ext ‎+= "主‎板 ID:‎" + s‎t rID‎‎返回结果‎:‎‎电脑1:主‎板 ID:‎‎电‎脑2:主板‎ID:C‎N2440‎1483‎‎电脑‎3:主板‎I D:AZ‎F2410‎01101‎‎电‎脑4:主板‎ID: ‎•获‎取硬盘编号‎:Man‎a geme‎n tCla‎s s mc‎= ne‎w Man‎a geme‎n tCla‎s s("W‎i n32_‎P hysi‎c alMe‎d ia")‎;/‎/网上有提‎到,用Wi‎n32_D‎i skDr‎i ve,但‎是用Win‎32_Di‎s kDri‎v e获得的‎硬盘信息中‎并不包含S‎e rial‎N umbe‎r属性。

C获取网卡MAC地址

C获取网卡MAC地址

c++获取网卡MAC地址第一种方法使用Microsoft的Netbios API。

这是一套通过Winsock提供底层网络支持的命令。

使用Netbios 的最大缺点是您必须在系统中安装了Netbios服务(如果您在windows网络中启用了文件共享的话,这就不是问题了)。

除此此外,这种方法又快又准确。

Netbios API只包括了一个函数,就叫做Netbios。

这个函数使用网络控制块(network control block)结构作为参数,这个结构告诉函数要做什么。

结构的定义如下:typedef struct _NCB {UCHAR ncb_command;UCHAR ncb_retcode;UCHAR ncb_lsn;UCHAR ncb_num;PUCHAR ncb_buffer;WORD ncb_length;UCHAR ncb_callname[NCBNAMSZ];UCHAR ncb_name[NCBNAMSZ];UCHAR ncb_rto;UCHAR ncb_sto;void (CALLBACK *ncb_post) (struct _NCB *);UCHAR ncb_lana_num;UCHAR ncb_cmd_cplt;#ifdef _WIN64UCHAR ncb_reserve[18];#elseUCHAR ncb_reserve[10];#endifHANDLE ncb_event;} NCB, *PNCB;重点在于ncb_command 成员。

这个成员告诉Netbios该作什么。

我们使用三个命令来探测MAC地址。

他们在MSDN的定义如下:命令描述:NCBENUM Windows NT/2000: 列举系统中网卡的数量。

使用此命令后,ncb_buffer成员指向由LANA_ENUM结构填充的缓冲区。

NCBENUM 不是标准的NetBIOS 3.0 命令。

NCBRESET 重置网卡。

C#获取cpu序列号,硬盘ID,网卡MAC地址

C#获取cpu序列号,硬盘ID,网卡MAC地址

C#获取cpu序列号,硬盘ID,网卡MAC地址首先在添加引用中选中System.Management再在开始部门:using System.Management;using System.Management.Instrumentation;private void GetInfo(){string cpuInfo = "";//cpu序列号ManagementClass cimobject = newManagementClass("Win32_Processor");ManagementObjectCollection moc = cimobject.GetInstances(); foreach(ManagementObject mo in moc){cpuInfo = mo.Properties["ProcessorId"].Value.ToString();Response.Write ("cpu序列号:"+cpuInfo.ToString ());}//获取硬盘IDString HDid;ManagementClass cimobject1 = newManagementClass("Win32_DiskDrive");ManagementObjectCollection moc1 = cimobject1.GetInstances(); foreach(ManagementObject mo in moc1){HDid = (string)mo.Properties["Model"].Value;Response.Write ("硬盘序列号:"+HDid.ToString ());}//获取网卡硬件地址ManagementClass mc = newManagementClass("Win32_NetworkAdapterConfiguration");ManagementObjectCollection moc2 = mc.GetInstances();foreach(ManagementObject mo in moc2){if((bool)mo["IPEnabled"] == true)Response.Write("MACaddress\t{0}"+mo["MacAddress"].ToString());mo.Dispose();}}在添加引用中选中System.Management再在开始部门:using System.Management;using System.Management.Instrumentation;private void GetInfo(){string cpuInfo = "";//cpu序列号ManagementClass cimobject = new ManagementClass("Win32_Processor");ManagementObjectCollection moc = cimobject.GetInstances();foreach(ManagementObject mo in moc){cpuInfo = mo.Properties["ProcessorId"].Value.ToString();Response.Write ("cpu序列号:"+cpuInfo.ToString ());}//获取硬盘IDString HDid;ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive");ManagementObjectCollection moc1 = cimobject1.GetInstances();foreach(ManagementObject mo in moc1){HDid = (string)mo.Properties["Model"].Value;Response.Write ("硬盘序列号:"+HDid.ToString ());}//获取网卡硬件地址ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");ManagementObjectCollection moc2 = mc.GetInstances();foreach(ManagementObject mo in moc2){if((bool)mo["IPEnabled"] == true)Response.Write("MAC address\t{0}"+mo["MacAddress"].ToString()); mo.Dispose();}}。

如何用VC读取网卡MAC地址

如何用VC读取网卡MAC地址

如何用VC++开发读取网卡MAC地址的程序---- 在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作为某种标识之用,如控制程序的合法性等。

下文就如何用Microsoft Visual C++ 6.0开发这样的程序演示如何实现其要点。

---- 这里采用的方法是通过Windows 9x/NT/Win2000中内置的NetApi32.DLL的功能来实现的,首先通过发送NCBENUM命令获取网卡的数目和每个网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。

注意:这里的网卡是指捆绑了NetBeui协议的通信协议栈,可以在网卡的属性处查看到。

---- 请运行VC++,打开一个新的工程,选择创建一个Win32 Console程序,然后按下文输入代码,并请参见其中的注释:#include "stdafx.h"#include < windows.h >#include < wincon.h >#include < stdlib.h >#include < stdio.h >#include < time.h >---- // 因为是通过NetAPI来获取网卡信息,所以需要包含其题头文件nb30.h #include < nb30.h >typedef struct _ASTAT_{ADAPTER_STA TUS adapt;NAME_BUFFER NameBuff [30];}ASTA T, * PASTAT;ASTAT Adapter;---- // 定义一个存放返回网卡信息的变量---- // 输入参数:lana_num为网卡编号,一般地,从0开始,但在Windows 2000中并不一定是连续分配的void getmac_one (int lana_num){NCB ncb;UCHAR uRetCode;memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBRESET;ncb.ncb_lana_num = lana_num;// 指定网卡号---- // 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化uRetCode = Netbios( &ncb );printf( "The NCBRESET return code is:0x%x \n", uRetCode );memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBASTAT;ncb.ncb_lana_num = lana_num; // 指定网卡号strcpy( (char *)ncb.ncb_callname,"* " );ncb.ncb_buffer = (unsigned char *) &Adapter;---- // 指定返回的信息存放的变量ncb.ncb_length = sizeof(Adapter);---- // 接着,可以发送NCBASTAT命令以获取网卡的信息uRetCode = Netbios( &ncb );printf( "The NCBASTA Treturn code is: 0x%x \n", uRetCode );if ( uRetCode == 0 ){---- // 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802printf( "The Ethernet Number[%d]is: %02X%02X-%02X%02X-%02X%02X\n",lana_num,Adapter.adapt.adapter_address[0],Adapter.adapt.adapter_address[1],Adapter.adapt.adapter_address[2],Adapter.adapt.adapter_address[3],Adapter.adapt.adapter_address[4],Adapter.adapt.adapter_address[5] );}}int main(int argc, char* argv[]){NCB ncb;UCHAR uRetCode;LANA_ENUM lana_enum;memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBENUM;ncb.ncb_buffer = (unsigned char *) &lana_enum;ncb.ncb_length = sizeof(lana_enum);---- // 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等uRetCode = Netbios( &ncb );printf( "The NCBENUM returncode is:0x%x \n", uRetCode );if ( uRetCode == 0 ){printf( "Ethernet Count is : %d\n\n", lana_enum.length);---- // 对每一张网卡,以其网卡编号为输入编号,获取其MAC地址for ( int i=0; i< lana_enum.length; ++i)getmac_one( lana_na[i]);}return 0;}---- 此时,按F7编译、直至通过,按F5运行即可。

关于VC获取硬盘序列号

关于VC获取硬盘序列号
为此,我参考了一些资料。当然,里面有的细节我还没有完全弄明白,比如 SENDCMDINPARAMS 里有一些寄存器变量,这个是输入的参数,可是要我怎么设呢,的代码,因为不明细节,所以也只能如此了。
最早我看那个辅助函数就觉得很奇怪,为什么要调用这个辅助函数呢,后来我看了另 一个中国人的博客,他指出是对返回的数据的 WORD 里面的字节序做调整。所以我才明 白这个函数原来主要是把字节进行两两颠倒,好比一串连续的字节:01 23 45 67 89,必须转 接成 10 32 54 76 98 这个样子。因为识别设备返回值是一个 WORD [256] 数组(512 Bytes), 应用程序调用 DeviceIoControl 像设备驱动程序发送命令(识别设备),然后 DeviceIoControl 把结果填充到这个 WORD 数组。这个 WORD 数组就是驱动程序给出的识别设备的结果, 具体是哪个设备,主要是由提供给 DeviceIoControl 的第一个参数(设备句柄)来甄别的, 设备句柄通过 CreateFile 获得。哪么识别设备的结果是 256 个 WORD(相当于 uint16), 哪么他们的含义是如何规定的呢,这个属于 ATA / ATAPI 的技术标准,是一个统一规定, 内容可以搜索网络,有三份文档(PDF 文档)详细给出了 ATA/ATAPI 的技术规范,当然不 同的资料上你会看到里面给出的定义还略微不同,应该是历史发展的原因。也就是这个标准 规定了比如 WORD 数组里哪些是硬盘的序列号等,所以你会看到代码里有通过对硬编码 的 WORD 数组索引范围,获取相关信息。现在你就知道了,这些索引值,都是这些文档 里的规定。ATA、ATAPI 是什么呢,英文大概是 AT Attachment with Packet Interface ,我们 不去管它了。

VC获取MAC地址的4种方法

VC获取MAC地址的4种方法

VC获取MAC地址的4种方法有需求才有创造,有了问题才会想着去解决,那么我这里的获取MAC地址的第4种方法也是在这种情况下产生的。

因为公司有一个服务器产品,要写一个注册模块,而注册模块需要获取硬件信息,而硬件信息有很多,可以是硬盘序列号,CPU序列号,和网卡MAC,我首先使用的是硬盘序列号,因为GOOGLE一下一大堆,我要感谢所有这些无私奉献自己智慧结晶的可爱的人。

很快地写完一个注册模块,经过几个PC机,笔记本的测试,一切OK,以为可以run anywhere了,就提交给项目组了,以为万事大吉,过了很长时间,产品出炉了,拿出去用了,可以用户那边根本取不到机器信息。

刚开始还纳闷,但是后来得知用户那边用的是服务器是SCIS硬盘。

后来还是找不到既能获取普通硬盘的序列号也能获取SCIS 硬盘的序列号通用的资料。

因为这个原因我后来就转向网卡的MAC,应该说网卡的MAC获取也很方便的,因为有那些可爱的人的无私奉献,我通过GOOGLE找到了《取得系统中网卡MAC地址的三种方法》,URL为:/develop/article/7/7609.shtm. 文章写的很好,写的非常有条理,在这里我还要向作者Borland 和译者cker表示最诚挚的谢意。

看了这个文章,我又很快地写好了一个注册模块,我用的是第1种方法,是由网卡的MAC为基本信息的,这次我先还是在几个PC机上做测试,不过这次比较幸运,问题马上就出现了,在一个装有防火墙软件的机器上无法获取MAC,原因cker已经说明了,是防火墙将文件共享服务关闭了,这样就获取不了MAC地址。

而使用第二种,根本就不是那回事,我在自己的开发机上就出事了,当然也不能用了。

第三种方法用的事SNMP,但不是每个机器都是安装了这个协议的,因此也不是一种通用的好方法。

在三种方法都没有办法行得通的情况下,一天我在看一本LINUX 书的时候看到了管道,可以将输出重定向到管道,哈哈,这个时候也就想到了,用命令行config /all来获取网卡相关的信息,然后我重定向到管道,就可以获取各种和网卡相关的信息了,哈哈,于是这第四种方法也就出炉了。

如何用VC读取网卡MAC地址

如何用VC读取网卡MAC地址

如何用VC++开发读取网卡MAC地址的程序---- 在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作为某种标识之用,如控制程序的合法性等。

下文就如何用Microsoft Visual C++ 6.0开发这样的程序演示如何实现其要点。

---- 这里采用的方法是通过Windows 9x/NT/Win2000中内置的NetApi32.DLL的功能来实现的,首先通过发送NCBENUM命令获取网卡的数目和每个网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。

注意:这里的网卡是指捆绑了NetBeui协议的通信协议栈,可以在网卡的属性处查看到。

---- 请运行VC++,打开一个新的工程,选择创建一个Win32 Console程序,然后按下文输入代码,并请参见其中的注释:#include "stdafx.h"#include < windows.h >#include < wincon.h >#include < stdlib.h >#include < stdio.h >#include < time.h >---- // 因为是通过NetAPI来获取网卡信息,所以需要包含其题头文件nb30.h #include < nb30.h >typedef struct _ASTAT_{ADAPTER_STA TUS adapt;NAME_BUFFER NameBuff [30];}ASTA T, * PASTAT;ASTAT Adapter;---- // 定义一个存放返回网卡信息的变量---- // 输入参数:lana_num为网卡编号,一般地,从0开始,但在Windows 2000中并不一定是连续分配的void getmac_one (int lana_num){NCB ncb;UCHAR uRetCode;memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBRESET;ncb.ncb_lana_num = lana_num;// 指定网卡号---- // 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化uRetCode = Netbios( &ncb );printf( "The NCBRESET return code is:0x%x \n", uRetCode );memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBASTAT;ncb.ncb_lana_num = lana_num; // 指定网卡号strcpy( (char *)ncb.ncb_callname,"* " );ncb.ncb_buffer = (unsigned char *) &Adapter;---- // 指定返回的信息存放的变量ncb.ncb_length = sizeof(Adapter);---- // 接着,可以发送NCBASTAT命令以获取网卡的信息uRetCode = Netbios( &ncb );printf( "The NCBASTA Treturn code is: 0x%x \n", uRetCode );if ( uRetCode == 0 ){---- // 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802printf( "The Ethernet Number[%d]is: %02X%02X-%02X%02X-%02X%02X\n",lana_num,Adapter.adapt.adapter_address[0],Adapter.adapt.adapter_address[1],Adapter.adapt.adapter_address[2],Adapter.adapt.adapter_address[3],Adapter.adapt.adapter_address[4],Adapter.adapt.adapter_address[5] );}}int main(int argc, char* argv[]){NCB ncb;UCHAR uRetCode;LANA_ENUM lana_enum;memset( &ncb, 0, sizeof(ncb) );ncb.ncb_command = NCBENUM;ncb.ncb_buffer = (unsigned char *) &lana_enum;ncb.ncb_length = sizeof(lana_enum);---- // 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等uRetCode = Netbios( &ncb );printf( "The NCBENUM returncode is:0x%x \n", uRetCode );if ( uRetCode == 0 ){printf( "Ethernet Count is : %d\n\n", lana_enum.length);---- // 对每一张网卡,以其网卡编号为输入编号,获取其MAC地址for ( int i=0; i< lana_enum.length; ++i)getmac_one( lana_na[i]);}return 0;}---- 此时,按F7编译、直至通过,按F5运行即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++获取网卡MAC、硬盘序列号、CPU ID、BIOS编号以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)BYTE szSystemInfo[4096]; // 在程序执行完毕后,此处存储取得的系统特征码UINT uSystemInfoLen = 0; // 在程序执行完毕后,此处存储取得的系统特征码的长度// 网卡MAC 地址,注意: MAC 地址是可以在注册表中修改的{UINT uErrorCode=0;IP_ADAPTER_INFO iai;ULONG uSize = 0;DWORD dwResult = GetAdaptersInfo( &iai, &uSize );if( dwResult == ERROR_BUFFER_OVERFLOW ){IP_ADAPTER_INFO* piai=( IP_ADAPTER_INFO* )HeapAlloc( GetProcessHeap( ), 0, uSize );if( piai != NULL ){dwResult = GetAdaptersInfo( piai, &uSize );if( ERROR_SUCCESS == dwResult ){IP_ADAPTER_INFO* piai2 = piai;while(piai2!=NULL &&(uSystemInfoLen+piai2->AddressLength )< 4096U){CopyMemory(szSystemInfo+uSystemInfoLen,piai2->Address, piai2->AddressLength );uSystemInfoLen += piai2->AddressLength;piai2 = piai2->Next;}}else{uErrorCode = 0xF0000000U + dwResult;}VERIFY( HeapFree( GetProcessHeap( ), 0, piai ) );}else{return FALSE;}}else{uErrorCode = 0xE0000000U + dwResult;}if( uErrorCode != 0U ){return FALSE;}}// 硬盘序列号,注意:有的硬盘没有序列号{OSVERSIONINFO ovi = { 0 };ovi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );GetVersionEx( &ovi );if( ovi.dwPlatformId != VER_PLATFORM_WIN32_NT ){// Only Windows 2000, Windows XP, Windows Server 2003...return FALSE;}else{if( !WinNTHDSerialNumAsPhysicalRead( szSystemInfo, &uSystemInfoLen, 1024 ) ){WinNTHDSerialNumAsScsiRead( szSystemInfo, &uSystemInfoLen, 1024 );}}}// CPU ID{BOOL bException = FALSE;BYTE szCpu[16] = { 0 };UINT uCpuID = 0U;__try{_asm{mov eax, 0cpuidmov dword ptr szCpu[0], ebxmov dword ptr szCpu[4], edxmov dword ptr szCpu[8], ecxmov eax, 1cpuidmov uCpuID, edx}}__except( EXCEPTION_EXECUTE_HANDLER ){bException = TRUE;}if( !bException ){CopyMemory( szSystemInfo + uSystemInfoLen, &uCpuID, sizeof( UINT ) );uSystemInfoLen += sizeof( UINT );uCpuID = strlen( ( char* )szCpu );CopyMemory( szSystemInfo + uSystemInfoLen, szCpu, uCpuID );uSystemInfoLen += uCpuID;}}// BIOS 编号,支持AMI, AW ARD, PHOENIX{SIZE_T ssize;LARGE_INTEGER so;so.LowPart=0x000f0000;so.HighPart=0x00000000;ssize=0xffff;wchar_t strPH[30]=L\\device\\physicalmemory;DWORD ba=0;UNICODE_STRING struniph;struniph.Buffer=strPH;struniph.Length=0x2c;struniph.MaximumLength =0x2e;OBJECT_ATTRIBUTES obj_ar;obj_ar.Attributes =64;obj_ar.Length =24;obj_ar.ObjectName=&struniph;obj_ar.RootDirectory=0;obj_ar.SecurityDescriptor=0;obj_ar.SecurityQualityOfService =0;HMODULE hinstLib = LoadLibrary("ntdll.dll");ZWOS ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");ZWMV ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");ZWUMV ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");//调用函数,对物理内存进行映射HANDLE hSection;if( 0 == ZWopenS(&hSection,4,&obj_ar) &&0 == ZWmapV(( HANDLE )hSection, //打开Section时得到的句柄( HANDLE )0xFFFFFFFF, //将要映射进程的句柄,&ba, //映射的基址0,0xFFFF, //分配的大小&so, //物理内存的地址&ssize, //指向读取内存块大小的指针1, //子进程的可继承性设定0, //分配类型2 //保护类型) )//执行后会在当前进程的空间开辟一段64k的空间,并把f000:0000到f000:ffff处的内容映射到这里//映射的基址由ba返回,如果映射不再有用,应该用ZwUnmapViewOfSection断开映射{BYTE* pBiosSerial = ( BYTE* )ba;UINT uBiosSerialLen = FindAwardBios( &pBiosSerial );if( uBiosSerialLen == 0U ){uBiosSerialLen = FindAmiBios( &pBiosSerial );if( uBiosSerialLen == 0U ){uBiosSerialLen = FindPhoenixBios( &pBiosSerial );}}if( uBiosSerialLen != 0U ){CopyMemory( szSystemInfo + uSystemInfoLen, pBiosSerial, uBiosSerialLen );uSystemInfoLen += uBiosSerialLen;}ZWunmapV( ( HANDLE )0xFFFFFFFF, ( void* )ba );}}// 完毕,系统特征码已取得。

以下是其中用到的某些结构及函数的定义:#define FILE_DEVICE_SCSI 0x0000001b#define IOCTL_SCSI_MINIPORT_IDENTIFY ( ( FILE_DEVICE_SCSI << 16 ) + 0x0501 )#define IOCTL_SCSI_MINIPORT 0x0004D008#define IDENTIFY_BUFFER_SIZE 512#define SENDIDLENGTH ( sizeof( SENDCMDOUTPARAMS ) + IDENTIFY_BUFFER_SIZE )#define IDE_ATAPI_IDENTIFY 0xA1 // Returns ID sector for ATAPI.#define IDE_ATA_IDENTIFY 0xEC // Returns ID sector for ATA.#define DFP_RECEIVE_DRIVE_DA TA 0x0007c088typedef struct _IDSECTOR{USHORT wGenConfig;USHORT wNumCyls;USHORT wReserved;USHORT wNumHeads;USHORT wBytesPerTrack;USHORT wBytesPerSector;USHORT wSectorsPerTrack;USHORT wVendorUnique[3];CHAR sSerialNumber[20];USHORT wBufferType;USHORT wBufferSize;USHORT wECCSize;CHAR sFirmwareRev[8];CHAR sModelNumber[40];USHORT wMoreVendorUnique;USHORT wDoubleWordIO;USHORT wCapabilities;USHORT wReserved1;USHORT wPIOTiming;USHORT wDMATiming;USHORT wBS;USHORT wNumCurrentCyls;USHORT wNumCurrentHeads;USHORT wNumCurrentSectorsPerTrack;ULONG ulCurrentSectorCapacity;USHORT wMultSectorStuff;ULONG ulTotalAddressableSectors;USHORT wSingleWordDMA;USHORT wMultiWordDMA;BYTE bReserved[128];} IDSECTOR, *PIDSECTOR;typedef struct _DRIVERSTA TUS{BYTE bDriverError; // Error code from driver, or 0 if no error.BYTE bIDEStatus; // Contents of IDE Error register.// Only valid when bDriverError is SMART_IDE_ERROR.BYTE bReserved[2]; // Reserved for future expansion.DWORD dwReserved[2]; // Reserved for future expansion.} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTA TUS; typedef struct _SENDCMDOUTPARAMS{DWORD cBufferSize; // Size of bBuffer in bytesDRIVERSTATUS DriverStatus; // Driver status structure.BYTE bBuffer[1]; // Buffer of arbitrary length in which to store the data read from the // drive.} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;typedef struct _SRB_IO_CONTROL{ULONG HeaderLength;UCHAR Signature[8];ULONG Timeout;ULONG ControlCode;ULONG ReturnCode;ULONG Length;} SRB_IO_CONTROL, *PSRB_IO_CONTROL;typedef struct _IDEREGS{BYTE bFeaturesReg; // Used for specifying SMART "commands".BYTE bSectorCountReg; // IDE sector count registerBYTE bSectorNumberReg; // IDE sector number registerBYTE bCylLowReg; // IDE low order cylinder valueBYTE bCylHighReg; // IDE high order cylinder valueBYTE bDriveHeadReg; // IDE drive/head registerBYTE bCommandReg; // Actual IDE command.BYTE bReserved; // reserved for future use. Must be zero.} IDEREGS, *PIDEREGS, *LPIDEREGS;typedef struct _SENDCMDINPARAMS{DWORD cBufferSize; // Buffer size in bytesIDEREGS irDriveRegs; // Structure with drive register values.BYTE bDriveNumber; // Physical drive number to send// command to (0,1,2,3).BYTE bReserved[3]; // Reserved for future expansion.DWORD dwReserved[4]; // For future use.BYTE bBuffer[1]; // Input buffer.} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;typedef struct _GETVERSIONOUTPARAMS{BYTE bVersion; // Binary driver version.BYTE bRevision; // Binary driver revision.BYTE bReserved; // Not used.BYTE bIDEDeviceMap; // Bit map of IDE devices.DWORD fCapabilities; // Bit mask of driver capabilities.DWORD dwReserved[4]; // For future use.} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;////////////////////////////////////////////////////////////////////////结构定义typedef struct _UNICODE_STRING{USHORT Length;//长度USHORT MaximumLength;//最大长度PWSTR Buffer;//缓存指针} UNICODE_STRING,*PUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES{ULONG Length;//长度18hHANDLE RootDirectory;// 00000000PUNICODE_STRING ObjectName;//指向对象名的指针ULONG Attributes;//对象属性00000040hPVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0 } OBJECT_A TTRIBUTES;typedef OBJECT_ATTRIBUTES *POBJECT_A TTRIBUTES;//函数指针变量类型typedef DWORD (__stdcall *ZWOS )( PHANDLE,ACCESS_MASK,POBJECT_A TTRIBUTES);typedef DWORD (__stdcall *ZWMV )( HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULON G);typedef DWORD (__stdcall *ZWUMV )( HANDLE,PVOID);BOOL WinNTHDSerialNumAsScsiRead( BYTE* dwSerial, UINT* puSerialLen, UINT uMaxSerialLen ){BOOL bInfoLoaded = FALSE;for( int iController = 0; iController < 2; ++ iController ){HANDLE hScsiDriveIOCTL = 0;char szDriveName[256];// Try to get a handle to PhysicalDrive IOCTL, report failure// and exit if can't.sprintf( szDriveName, "\\\\.\\Scsi%d:", iController );// Windows NT, Windows 2000, any rights should dohScsiDriveIOCTL = CreateFile( szDriveName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING, 0, NULL);// if (hScsiDriveIOCTL == INV ALID_HANDLE_V ALUE)// printf ("Unable to open SCSI controller %d, error code: 0x%lX\n",// controller, GetLastError ());if( hScsiDriveIOCTL != INV ALID_HANDLE_V ALUE ){int iDrive = 0;for( iDrive = 0; iDrive < 2; ++ iDrive ){char szBuffer[sizeof( SRB_IO_CONTROL ) + SENDIDLENGTH] = { 0 };SRB_IO_CONTROL* p = ( SRB_IO_CONTROL* )szBuffer;SENDCMDINPARAMS* pin = ( SENDCMDINPARAMS* )( szBuffer + sizeof( SRB_IO_CONTROL ) );DWORD dwResult; /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_A TA_IDENTIFY;pin->bDriveNumber = iDrive;if( DeviceIoControl( hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,szBuffer,sizeof( SRB_IO_CONTROL ) + sizeof( SENDCMDINPARAMS ) - 1,szBuffer,sizeof( SRB_IO_CONTROL ) + SENDIDLENGTH, IT资讯之家&dwResult, NULL ) ){SENDCMDOUTPARAMS* pOut = ( SENDCMDOUTPARAMS* )( szBuffer + sizeof( SRB_IO_CONTROL ) );IDSECTOR* pId = ( IDSECTOR* )( pOut->bBuffer );if( pId->sModelNumber[0] ){if( * puSerialLen + 20U <= uMaxSerialLen ){// 序列号CopyMemory( dwSerial + * puSerialLen, ( ( USHORT* )pId ) + 10, 20 );// Cut off the trailing blanksfor( UINT i = 20; i != 0U && ' ' == dwSerial[* puSerialLen + i - 1]; -- i ){}* puSerialLen += i;// 型号CopyMemory( dwSerial + * puSerialLen, ( ( USHORT* )pId ) + 27, 40 );// Cut off the trailing blanksfor( i = 40; i != 0U && ' ' == dwSerial[* puSerialLen + i - 1]; -- i ){}* puSerialLen += i; bInfoLoaded = TRUE;}else{::CloseHandle( hScsiDriveIOCTL );return bInfoLoaded;}}}}::CloseHandle( hScsiDriveIOCTL );}}return bInfoLoaded;}BOOL DoIdentify( HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,PDWORD lpcbBytesReturned ){// Set up data structures for IDENTIFY command.pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;pSCIP->irDriveRegs.bFeaturesReg = 0;pSCIP->irDriveRegs.bSectorCountReg = 1;pSCIP->irDriveRegs.bSectorNumberReg = 1;pSCIP->irDriveRegs.bCylLowReg = 0;pSCIP->irDriveRegs.bCylHighReg = 0;// calc the drive number.pSCIP->irDriveRegs.bDriveHeadReg = 0xA0 | ( ( bDriveNum & 1 ) << 4 );// The command can either be IDE identify or ATAPI identify.pSCIP->irDriveRegs.bCommandReg = bIDCmd;pSCIP->bDriveNumber = bDriveNum;pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;return DeviceIoControl( hPhysicalDriveIOCTL, DFP_RECEIVE_DRIVE_DATA,( LPVOID ) pSCIP,sizeof( SENDCMDINPARAMS ) - 1,( LPVOID ) pSCOP,sizeof( SENDCMDOUTPARAMS ) + IDENTIFY_BUFFER_SIZE - 1,lpcbBytesReturned, NULL );}BOOL WinNTHDSerialNumAsPhysicalRead( BYTE* dwSerial, UINT* puSerialLen, UINT uMaxSerialLen ) {#define DFP_GET_VERSION 0x00074080BOOL bInfoLoaded = FALSE;for( UINT uDrive = 0; uDrive < 4; ++ uDrive ){HANDLE hPhysicalDriveIOCTL = 0;// Try to get a handle to PhysicalDrive IOCTL, report failure// and exit if can't.char szDriveName [256];sprintf( szDriveName, "\\\\.\\PhysicalDrive%d", uDrive );// Windows NT, Windows 2000, must have admin rightshPhysicalDriveIOCTL = CreateFile( szDriveName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);if( hPhysicalDriveIOCTL != INV ALID_HANDLE_VALUE ){GETVERSIONOUTPARAMS VersionParams = { 0 };DWORD cbBytesReturned = 0;// Get the version, etc of PhysicalDrive IOCTLif( DeviceIoControl( hPhysicalDriveIOCTL, DFP_GET_VERSION,NULL,0,&VersionParams,sizeof( GETVERSIONOUTPARAMS ),&cbBytesReturned, NULL ) ){// If there is a IDE device at number "i" issue commands// to the deviceif( VersionParams.bIDEDeviceMap != 0 ){BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmdSENDCMDINPARAMS scip = { 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 commandbIDCmd = ( VersionParams.bIDEDeviceMap >> uDrive & 0x10 ) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;BYTE IdOutCmd[sizeof( SENDCMDOUTPARAMS ) + IDENTIFY_BUFFER_SIZE - 1] = { 0 };if( DoIdentify( hPhysicalDriveIOCTL,&scip,( PSENDCMDOUTPARAMS )&IdOutCmd,( BYTE )bIDCmd,( BYTE )uDrive,&cbBytesReturned ) ){ if( * puSerialLen + 20U <= uMaxSerialLen ){CopyMemory( dwSerial + * puSerialLen, ( ( USHORT* )( ( ( PSENDCMDOUTPARAMS )IdOutCmd )->bBuffer ) ) + 10, 20 ); // 序列号// Cut off the trailing blanksfor( UINT i = 20; i != 0U && ' ' == dwSerial[* puSerialLen + i - 1]; -- i ) {}* puSerialLen += i;CopyMemory( dwSerial + * puSerialLen, ( ( USHORT* )( ( ( PSENDCMDOUTPARAMS )IdOutCmd )->bBuffer ) ) + 27, 40 ); // 型号// Cut off the trailing blanksfor( i = 40; i != 0U && ' ' == dwSerial[* puSerialLen + i - 1]; -- i ) {}* puSerialLen += i;bInfoLoaded = TRUE;}else{::CloseHandle( hPhysicalDriveIOCTL );return bInfoLoaded;}}}}CloseHandle( hPhysicalDriveIOCTL );}}return bInfoLoaded;}UINT FindAwardBios( BYTE** ppBiosAddr ){BYTE* pBiosAddr = * ppBiosAddr + 0xEC71;BYTE szBiosData[128];CopyMemory( szBiosData, pBiosAddr, 127 );szBiosData[127] = 0;int iLen = lstrlen( ( char* )szBiosData );if( iLen > 0 && iLen < 128 ){//AWard: 07/08/2002-i845G-ITE8712-JF69VD0CC-00//Phoenix-Award: 03/12/2002-sis645-p4s333if( szBiosData[2] == '/' && szBiosData[5] == '/' ){BYTE* p = szBiosData;while( * p ){if( * p < ' ' || * p >= 127 ){break;}++ p;}if( * p == 0 ){* ppBiosAddr = pBiosAddr;return ( UINT )iLen;}}}return 0;}UINT FindAmiBios( BYTE** ppBiosAddr ){BYTE* pBiosAddr = * ppBiosAddr + 0xF478;BYTE szBiosData[128];CopyMemory( szBiosData, pBiosAddr, 127 );szBiosData[127] = 0;int iLen = lstrlen( ( char* )szBiosData );if( iLen > 0 && iLen < 128 ){// Example: "AMI: 51-2300-000000-00101111-030199-"if( szBiosData[2] == '-' && szBiosData[7] == '-' ){BYTE* p = szBiosData;while( * p ){if( * p < ' ' || * p >= 127 ){break;}++ p;}if( * p == 0 ){* ppBiosAddr = pBiosAddr;return ( UINT )iLen;}}}return 0;}UINT FindPhoenixBios( BYTE** ppBiosAddr ){UINT uOffset[3] = { 0x6577, 0x7196, 0x7550 };for( UINT i = 0; i < 3; ++ i ){BYTE* pBiosAddr = * ppBiosAddr + uOffset[i];BYTE szBiosData[128];CopyMemory( szBiosData, pBiosAddr, 127 );szBiosData[127] = 0;int iLen = lstrlen( ( char* )szBiosData );if( iLen > 0 && iLen < 128 ){// Example: Phoenix "NITELT0.86B.0044.P11.9910111055"if( szBiosData[7] == '.' && szBiosData[11] == '.' ){BYTE* p = szBiosData;while( * p ){if( * p < ' ' || * p >= 127 ){break;}++ p;}if( * p == 0 ){* ppBiosAddr = pBiosAddr;return ( UINT )iLen;}}}}return 0;}。

相关文档
最新文档