CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

获取机器的硬盘号,或者网卡号?

楼主hhzqf1980(hh)2006-03-02 10:41:20 在 Delphi / VCL组件开发及应用 提问

获取机器的硬盘号,或者网卡号?  
  适用  
  操作系统:98   2000,NT,2003等  
  谁有程序啊 问题点数:20、回复次数:2Top

1 楼liangqingzhi(老之)回复于 2006-03-02 11:48:17 得分 10

硬盘序列号源码  
  http://www.delphifans.com/SoftView/SoftView_1408.htmlTop

2 楼Earthnut(*)回复于 2006-03-02 14:21:05 得分 10

转贴:  
   
  function   GetHdID   :   String;  
  //获取Ide硬盘序列号  
  type  
      TSrbIoControl   =   packed   record  
          HeaderLength   :   ULONG;  
          Signature   :   Array[0..7]   of   Char;  
          Timeout   :   ULONG;  
          ControlCode   :   ULONG;  
          ReturnCode   :   ULONG;  
          Length   :   ULONG;  
      end;  
      SRB_IO_CONTROL   =   TSrbIoControl;  
      PSrbIoControl   =   ^TSrbIoControl;  
      TIDERegs   =   packed   record  
          bFeaturesReg   :   Byte;           //   Used   for   specifying   SMART   "commands".  
          bSectorCountReg   :   Byte;     //   IDE   sector   count   register  
          bSectorNumberReg   :   Byte;   //   IDE   sector   number   register  
          bCylLowReg   :   Byte;               //   IDE   low   order   cylinder   value  
          bCylHighReg   :   Byte;             //   IDE   high   order   cylinder   value  
          bDriveHeadReg   :   Byte;         //   IDE   drive/head   register  
          bCommandReg   :   Byte;             //   Actual   IDE   command.  
          bReserved   :   Byte;                 //   reserved.   Must   be   zero.  
      end;  
      IDEREGS   =   TIDERegs;  
      PIDERegs   =   ^TIDERegs;  
      TSendCmdInParams   =   packed   record  
          cBufferSize   :   DWORD;  
          irDriveRegs   :   TIDERegs;  
          bDriveNumber   :   Byte;  
          bReserved   :   Array[0..2]   of   Byte;  
          dwReserved   :   Array[0..3]   of   DWORD;  
          bBuffer   :   Array[0..0]   of   Byte;  
      end;  
      SENDCMDINPARAMS   =   TSendCmdInParams;  
      PSendCmdInParams   =   ^TSendCmdInParams;  
      TIdSector   =   packed   record  
          wGenConfig   :   Word;  
          wNumCyls   :   Word;  
          wReserved   :   Word;  
          wNumHeads   :   Word;  
          wBytesPerTrack   :   Word;  
          wBytesPerSector   :   Word;  
          wSectorsPerTrack   :   Word;  
          wVendorUnique   :   Array[0..2]   of   Word;  
          sSerialNumber   :   Array[0..19]   of   Char;    
          wBufferType   :   Word;  
          wBufferSize   :   Word;    
          wECCSize   :   Word;    
          sFirmwareRev   :   Array[0..7]   of   Char;  
          sModelNumber   :   Array[0..39]   of   Char;    
          wMoreVendorUnique   :   Word;    
          wDoubleWordIO   :   Word;    
          wCapabilities   :   Word;  
          wReserved1   :   Word;  
          wPIOTiming   :   Word;    
          wDMATiming   :   Word;    
          wBS   :   Word;    
          wNumCurrentCyls   :   Word;  
          wNumCurrentHeads   :   Word;  
          wNumCurrentSectorsPerTrack   :   Word;  
          ulCurrentSectorCapacity   :   ULONG;  
          wMultSectorStuff   :   Word;  
          ulTotalAddressableSectors   :   ULONG;  
          wSingleWordDMA   :   Word;  
          wMultiWordDMA   :   Word;  
          bReserved   :   Array[0..127]   of   Byte;  
      end;  
      PIdSector   =   ^TIdSector;  
  const  
      IDE_ID_FUNCTION   =   $EC;  
      IDENTIFY_BUFFER_SIZE   =   512;  
      DFP_RECEIVE_DRIVE_DATA   =   $0007c088;  
      IOCTL_SCSI_MINIPORT   =   $0004d008;  
      IOCTL_SCSI_MINIPORT_IDENTIFY   =   $001b0501;  
      DataSize   =   sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;  
      BufferSize   =   SizeOf(SRB_IO_CONTROL)+DataSize;  
      W9xBufferSize   =   IDENTIFY_BUFFER_SIZE+16;  
  var    
      hDevice   :   THandle;  
      cbBytesReturned   :   DWORD;  
      pInData   :   PSendCmdInParams;  
      pOutData   :   Pointer;   //   PSendCmdOutParams  
      Buffer   :   Array[0..BufferSize-1]   of   Byte;  
      srbControl   :   TSrbIoControl   absolute   Buffer;  
   
  procedure   ChangeByteOrder(   var   Data;   Size   :   Integer   );    
  var  
      ptr   :   PChar;  
      i   :   Integer;  
      c   :   Char;  
  begin  
      ptr   :=   @Data;  
      for   i   :=   0   to   (Size   shr   1)-1   do  
      begin  
          c   :=   ptr^;  
          ptr^   :=   (ptr+1)^;  
          (ptr+1)^   :=   c;  
          Inc(ptr,2);  
      end;  
  end;    
   
  begin    
      Result   :=   '';  
      FillChar(Buffer,BufferSize,#0);  
      if   Win32Platform=VER_PLATFORM_WIN32_NT   then  
      begin   //   Windows   NT,   Windows   2000  
          //   Get   SCSI   port   handle  
          hDevice   :=   CreateFile(   '\\.\Scsi0:',  
          GENERIC_READ   or   GENERIC_WRITE,  
          FILE_SHARE_READ   or   FILE_SHARE_WRITE,  
          nil,   OPEN_EXISTING,   0,   0   );  
          if   hDevice=INVALID_HANDLE_VALUE   then   Exit;  
          try  
              srbControl.HeaderLength   :=   SizeOf(SRB_IO_CONTROL);  
              System.Move('SCSIDISK',srbControl.Signature,8);  
              srbControl.Timeout   :=   2;  
              srbControl.Length   :=   DataSize;  
              srbControl.ControlCode   :=   IOCTL_SCSI_MINIPORT_IDENTIFY;  
              pInData   :=   PSendCmdInParams(PChar(@Buffer)  
              +SizeOf(SRB_IO_CONTROL));  
              pOutData   :=   pInData;  
              with   pInData^   do  
              begin  
                  cBufferSize   :=   IDENTIFY_BUFFER_SIZE;  
                  bDriveNumber   :=   0;  
                  with   irDriveRegs   do  
                  begin  
                      bFeaturesReg   :=   0;  
                      bSectorCountReg   :=   1;  
                      bSectorNumberReg   :=   1;  
                      bCylLowReg   :=   0;  
                      bCylHighReg   :=   0;  
                      bDriveHeadReg   :=   $A0;  
                      bCommandReg   :=   IDE_ID_FUNCTION;  
                  end;  
              end;  
              if   not   DeviceIoControl(   hDevice,   IOCTL_SCSI_MINIPORT,  
              @Buffer,   BufferSize,   @Buffer,   BufferSize,  
              cbBytesReturned,   nil   )   then   Exit;  
          finally  
              CloseHandle(hDevice);  
          end;  
      end   else  
      begin   //   Windows   95   OSR2,   Windows   98  
          hDevice   :=   CreateFile(   '\\.\SMARTVSD',   0,   0,   nil,  
          CREATE_NEW,   0,   0   );  
          if   hDevice=INVALID_HANDLE_VALUE   then   Exit;  
          try  
              pInData   :=   PSendCmdInParams(@Buffer);  
              pOutData   :=   @pInData^.bBuffer;  
              with   pInData^   do  
              begin  
                  cBufferSize   :=   IDENTIFY_BUFFER_SIZE;  
                  bDriveNumber   :=   0;  
                  with   irDriveRegs   do  
                  begin  
                      bFeaturesReg   :=   0;  
                      bSectorCountReg   :=   1;  
                      bSectorNumberReg   :=   1;  
                      bCylLowReg   :=   0;  
                      bCylHighReg   :=   0;  
                      bDriveHeadReg   :=   $A0;  
                      bCommandReg   :=   IDE_ID_FUNCTION;  
                  end;  
              end;  
              if   not   DeviceIoControl(   hDevice,   DFP_RECEIVE_DRIVE_DATA,  
              pInData,   SizeOf(TSendCmdInParams)-1,   pOutData,  
              W9xBufferSize,   cbBytesReturned,   nil   )   then   Exit;  
          finally  
              CloseHandle(hDevice);  
          end;  
      end;  
      with   PIdSector(PChar(pOutData)+16)^   do  
      begin  
          ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));  
          SetString(Result,sSerialNumber,SizeOf(sSerialNumber));  
      end;  
  end;  
   
  end.    
   
   
   
   
   
  Top

相关问题

  • 用API函数如何获得机器CPU,硬盘,网卡序列号!!!
  • 怎么样用js代码获取访问者机器的网卡mac地址?
  • 蛙蛙推荐:用脚本获取网卡MAC,CPUID,硬盘序列号
  • 在win98/me/98se/2000/server2000/server2003请问怎样获取机器的硬盘出厂序列号?谢谢.
  • 求获取机器CPU和硬盘序列号的完整程序
  • 请问,可以通过何种方式获取局域网内非同网段机器的网卡MAC地址?
  • 对于双网卡机器???
  • 获取硬盘号
  • 获取硬盘ID
  • NetBios获取网卡MAC

关键词

  • win32
  • 硬盘
  • 获取
  • tideregs
  • tsrbiocontrol
  • ulong
  • register
  • byte

得分解答快速导航

  • 帖主:hhzqf1980
  • liangqingzhi
  • Earthnut

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo