获取硬盘序列号.docx

上传人:b****2 文档编号:23003223 上传时间:2023-04-30 格式:DOCX 页数:33 大小:96.35KB
下载 相关 举报
获取硬盘序列号.docx_第1页
第1页 / 共33页
获取硬盘序列号.docx_第2页
第2页 / 共33页
获取硬盘序列号.docx_第3页
第3页 / 共33页
获取硬盘序列号.docx_第4页
第4页 / 共33页
获取硬盘序列号.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

获取硬盘序列号.docx

《获取硬盘序列号.docx》由会员分享,可在线阅读,更多相关《获取硬盘序列号.docx(33页珍藏版)》请在冰豆网上搜索。

获取硬盘序列号.docx

获取硬盘序列号

取网卡MAC、硬盘序列号、CPUID、BIOS编号  

2011-03-1010:

48:

58|  分类:

古老的程序片段|  标签:

|字号大中小 订阅

   本文中所有原理及思想均取自网络,有修改。

其中获取硬盘序列号、获取CPU编号、获取BIOS编号的原始代码的著作权归各自作者所有。

  以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPUID、BIOS编号)

   BYTEszSystemInfo[4096];//在程序执行完毕后,此处存储取得的系统特征码

   UINTuSystemInfoLen=0;//在程序执行完毕后,此处存储取得的系统特征码的长度

   //网卡MAC地址,注意:

MAC地址是可以在注册表中修改的

   {

       UINTuErrorCode=0;

       IP_ADAPTER_INFOiai;

       ULONGuSize=0;

       DWORDdwResult=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

           {

               returnFALSE;

           }

       }

       else

       {

           uErrorCode=0xE0000000U+dwResult;

       }

       if(uErrorCode!

=0U)

       {

           returnFALSE;

       }

   }

   //硬盘序列号,注意:

有的硬盘没有序列号

   {

       OSVERSIONINFOovi={0};

       ovi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);

       GetVersionEx(&ovi);

       

       if(ovi.dwPlatformId!

=VER_PLATFORM_WIN32_NT)

       {

           //OnlyWindows2000,WindowsXP,WindowsServer2003...

           returnFALSE;

       }

       else

       {

           if(!

WinNTHDSerialNumAsPhysicalRead(szSystemInfo,&uSystemInfoLen,1024))

           {

               WinNTHDSerialNumAsScsiRead(szSystemInfo,&uSystemInfoLen,1024);

           }

       }

   }

   //CPUID

   {

       BOOLbException=FALSE;

       BYTEszCpu[16] ={0};

       UINTuCpuID    =0U;

       __try

       {

           _asm

           {

               moveax,0

               cpuid

               movdwordptrszCpu[0],ebx

               movdwordptrszCpu[4],edx

               movdwordptrszCpu[8],ecx

               moveax,1

               cpuid

               movuCpuID,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,AWARD,PHOENIX

   {

       SIZE_Tssize;

       LARGE_INTEGERso;

       so.LowPart=0x000f0000;

       so.HighPart=0x00000000;

       ssize=0xffff;

       wchar_tstrPH[30]=L\\device\\physicalmemory; 

       DWORDba=0;

       UNICODE_STRINGstruniph;

       struniph.Buffer=strPH;

       struniph.Length=0x2c;

       struniph.MaximumLength=0x2e; 

       OBJECT_ATTRIBUTESobj_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; 

       HMODULEhinstLib=LoadLibrary("ntdll.dll");

       ZWOSZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");

       ZWMVZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");

       ZWUMVZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection"); 

        

       //调用函数,对物理内存进行映射

       HANDLEhSection;

       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;

           UINTuBiosSerialLen=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_MINIPORT0x0004D008 // seeNTDDSCSI.Hfordefinition

#define IDENTIFY_BUFFER_SIZE 512

#define SENDIDLENGTH (sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE)

#define IDE_ATAPI_IDENTIFY 0xA1 // ReturnsIDsectorforATAPI.

#define IDE_ATA_IDENTIFY   0xEC // ReturnsIDsectorforATA.

#define DFP_RECEIVE_DRIVE_DATA  0x0007c088

typedefstruct_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;

typedefstruct_DRIVERSTATUS

{

   BYTE bDriverError; // Errorcodefromdriver,or0ifnoerror.

   BYTE bIDEStatus;   // ContentsofIDEErrorregister.

   // OnlyvalidwhenbDriverErrorisSMART_IDE_ERROR.

   BYTE bReserved[2]; // Reservedforfutureexpansion.

   DWORD dwReserved[2]; // Reservedforfutureexpansion.

}DRIVERSTATUS,*PDRIVERSTATUS,*LPDRIVERSTATUS;

typedefstruct_SENDCMDOUTPARAMS

{

   DWORD        cBufferSize;  // SizeofbBufferinbytes

   DRIVERSTATUS DriverStatus; // Driverstatusstructure.

   BYTE         bBuffer[1];   // Bufferofarbitrarylengthinwhichtostorethedatareadfromthe                                                      //drive.

}SENDCMDOUTPARAMS,*PSENDCMDOUTPARAMS,*LPSENDCMDOUTPARAMS;

typedefstruct_SRB_IO_CONTROL

{

   ULONGHeaderLength;

   UCHARSignature[8];

   ULONGTimeout;

   ULONGControlCode;

   ULONGReturnCode;

   ULONGLength;

}SRB_IO_CONTROL,*PSRB_IO_CONTROL;

typedefstruct_IDEREGS

{

   BYTEbFeaturesReg;      //UsedforspecifyingSMART"commands".

   BYTEbSectorCountReg;   //IDEsectorcountregister

   BYTEbSectorNumberReg;  //IDEsectornumberregister

   BYTEbCylLowReg;        //IDElowordercylindervalue

   BYTEbCylHighReg;       //IDEhighordercylindervalue

   BYTEbDriveHeadReg;     //IDEdrive/headregister

   BYTEbCommandReg;       //ActualIDEcommand.

   BYTEbReserved;         //reservedforfutureuse. Mustbezero.

}IDEREGS,*PIDEREGS,*LPIDEREGS;

typedefstruct_SENDCMDINPARAMS

{

   DWORD    cBufferSize;  // Buffersizeinbytes

   IDEREGS  irDriveRegs;  // Structurewithdriveregistervalues.

   BYTEbDriveNumber;      // Physicaldrivenumbertosend

   // commandto(0,1,2,3).

   BYTEbReserved[3];      // Reservedforfutureexpansion.

   DWORD    dwReserved[4];// Forfutureuse.

   BYTE     bBuffer[1];   // Inputbuffer.

}SENDCMDINPARAMS,*PSENDCMDINPARAMS,*LPSENDCMDINPARAMS;

typedefstruct_GETVERSIONOUTPARAMS

{

   BYTEbVersion;     //Binarydriverversion.

   BYTEbRevision;    //Binarydriverrevision.

   BYTEbReserved;    //Notused.

   BYTEbIDEDeviceMap;//BitmapofIDEdevices.

   DWORDfCapabilities;//Bitmaskofdrivercapabilities.

   DWORDdwReserved[4];//Forfutureuse.

}GETVERSIONOUTPARAMS,*PGETVERSIONOUTPARAMS,*LPGETVERSIONOUTPARAMS;

//////////////////////////////////////////////////////////////////////

//结构定义

typedefstruct_UNICODE_STRING

{

   USHORT Length;//长度

   USHORT MaximumLength;//最大长度

   PWSTR Buffer;//缓存指针

}UNICODE_STRING,*PUNICODE_STRING;

typedefstruct_OBJECT_ATTRIBUTES

{

   ULONGLength;//长度18h

   HANDLERootDirectory;// 00000000

   PUNICODE_STRINGObjectName;//指向对象名的指针

   ULONGAttributes;//对

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1