当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: editor控件中,如何能在鼠标点击后知道点击在哪一行? ......
    摘要: 有熟悉行情的高手 或者 请过来人谈谈你们的感受。 说得有参考价值的都有分 ......


读硬盘序列号疑问

buffer:array[0..255]of   char;  
  a,b:dword;  
  serialNum:pdword;  
  begin  
  GetVolumeInformation(c:\,   Buffer,   SizeOf(Buffer),   SerialNum,   a,   b,   nil,   0);  
  Serial:=inttostr(SerialNum^);  
  end;  
   
  我用以上代码为何读过来的序列号都不一样,急

NO.1   作者: soaringsouth

哪个不是硬盘序列号,而是卷标。  
  function   TForm1.GetIdeSerialNumber(Index:   byte):   PChar;  
  const   IDENTIFY_BUFFER_SIZE   =   512;  
  type  
        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   for   future   use.   Must   be   zero.  
      end;  
      TSendCmdInParams   =   packed   record  
          //   Buffer   size   in   bytes  
          cBufferSize:   DWORD;  
          //   Structure   with   drive   register   values.  
          irDriveRegs:   TIDERegs;  
          //   Physical   drive   number   to   send   command   to   (0,1,2,3).  
          bDriveNumber:   BYTE;  
          bReserved:   array[0..2]   of   Byte;  
          dwReserved:   array[0..3]   of   DWORD;  
          bBuffer:   array[0..0]   of   Byte;   //   Input   buffer.  
      end;  
      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:   DWORD;  
          wMultSectorStuff:   Word;  
          ulTotalAddressableSectors:   DWORD;  
          wSingleWordDMA:   Word;  
          wMultiWordDMA:   Word;  
          bReserved:   array[0..127]   of   BYTE;  
      end;  
      PIdSector   =   ^TIdSector;  
      TDriverStatus   =   packed   record  
          //   Çý¶¯Æ÷·µ»ØµÄ´íÎó´úÂ룬ÎÞ´íÔò·µ»Ø0  
          bDriverError:   Byte;  
          //   IDE³ö´í¼Ä´æÆ÷µÄÄÚÈÝ£¬Ö»Óе±bDriverError   Ϊ   SMART_IDE_ERROR   ʱÓÐЧ  
          bIDEStatus:   Byte;  
          bReserved:   array[0..1]   of   Byte;  
          dwReserved:   array[0..1]   of   DWORD;  
      end;  
      TSendCmdOutParams   =   packed   record  
          //   bBufferµÄ´óС  
          cBufferSize:   DWORD;  
          //   Çý¶¯Æ÷״̬  
          DriverStatus:   TDriverStatus;  
          //   ÓÃÓÚ±£´æ´ÓÇý¶¯Æ÷¶Á³öµÄÊý¾ÝµÄ»º³åÇø£¬Êµ¼Ê³¤¶ÈÓÉcBufferSize¾ö¶¨  
          bBuffer:   array[0..0]   of   BYTE;  
      end;  
  var  
      hDevice:   Thandle;  
      cbBytesReturned:   DWORD;  
      SCIP:   TSendCmdInParams;  
      aIdOutCmd:   array[0..(SizeOf(TSendCmdOutParams)   +   IDENTIFY_BUFFER_SIZE   -   1)   -   1]   of   Byte;  
      IdOutCmd:   TSendCmdOutParams   absolute   aIdOutCmd;  
      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   :=   ;   //   Èç¹û³ö´íÔò·µ»Ø¿Õ´®  
      if   SysUtils.Win32Platform   =   VER_PLATFORM_WIN32_NT   then  
            begin   //   Windows   NT/2000/XP/.net   ¸Ä±äÃû³Æ¿ÉÊÊÓÃÓÚÆäËüÇý¶¯Æ÷£¬ÈçµÚ¶þ¸öÇý¶¯Æ÷£º   \\.\PhysicalDrive1\  
                        //   also   can   be   SCSI0   SCSI1  
                hDevice   :=   CreateFile(PChar(\\.\PhysicalDrive+IntToStr(Index)),   GENERIC_READ   or   GENERIC_WRITE,  
                                                            FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,   0,   0);  
            end   else   //   Version   Windows   95   OSR2,   Windows   98  
                hDevice   :=   CreateFile(\\.\SMARTVSD,   0,   0,   nil,   CREATE_NEW,   0,   0);  
            if   hDevice   =   INVALID_HANDLE_VALUE   then   Exit;  
            try  
                FillChar(SCIP,   SizeOf(TSendCmdInParams)   -   1,   #0);  
                FillChar(aIdOutCmd,   SizeOf(aIdOutCmd),   #0);  
                cbBytesReturned   :=   0;  
                //   Set   up   data   structures   for   IDENTIFY   command.  
                with   SCIP   do  
                    begin  
                        cBufferSize   :=   IDENTIFY_BUFFER_SIZE;  
                        //   bDriveNumber   :=   0;  
                        with   irDriveRegs   do  
                            begin  
                                bSectorCountReg   :=   1;  
                                bSectorNumberReg   :=   1;  
                                //   if   Win32Platform=VER_PLATFORM_WIN32_NT   then   bDriveHeadReg   :=   $A0  
                                //   else   bDriveHeadReg   :=   $A0   or   ((bDriveNum   and   1)   shl   4);  
                                bDriveHeadReg   :=   $A0;  
                                bCommandReg   :=   $EC;  
                            end;  
                    end;  
                if   not   DeviceIoControl(hDevice,   $0007C088,   @SCIP,   SizeOf(TSendCmdInParams)   -   1,  
                              @aIdOutCmd,   SizeOf(aIdOutCmd),   cbBytesReturned,   nil)   then   Exit;  
            finally  
                CloseHandle(hDevice);  
            end;  
            with   PIdSector(@IdOutCmd.bBuffer)^   do  
                begin  
                    ChangeByteOrder(sSerialNumber,   SizeOf(sSerialNumber));  
                    (Pchar(@sSerialNumber)   +   SizeOf(sSerialNumber))^   :=   #0;  
                    Result   :=   Pchar(@sSerialNumber);  
                end;  
  end;

NO.2   作者: soaringsouth

哪个不是硬盘序列号,而是卷标。  
  function   TForm1.GetIdeSerialNumber(Index:   byte):   PChar;  
  const   IDENTIFY_BUFFER_SIZE   =   512;  
  type  
        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   for   future   use.   Must   be   zero.  
      end;  
      TSendCmdInParams   =   packed   record  
          //   Buffer   size   in   bytes  
          cBufferSize:   DWORD;  
          //   Structure   with   drive   register   values.  
          irDriveRegs:   TIDERegs;  
          //   Physical   drive   number   to   send   command   to   (0,1,2,3).  
          bDriveNumber:   BYTE;  
          bReserved:   array[0..2]   of   Byte;  
          dwReserved:   array[0..3]   of   DWORD;  
          bBuffer:   array[0..0]   of   Byte;   //   Input   buffer.  
      end;  
      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:   DWORD;  
          wMultSectorStuff:   Word;  
          ulTotalAddressableSectors:   DWORD;  
          wSingleWordDMA:   Word;  
          wMultiWordDMA:   Word;  
          bReserved:   array[0..127]   of   BYTE;  
      end;  
      PIdSector   =   ^TIdSector;  
      TDriverStatus   =   packed   record  
          //   Çý¶¯Æ÷·µ»ØµÄ´íÎó´úÂ룬ÎÞ´íÔò·µ»Ø0  
          bDriverError:   Byte;  
          //   IDE³ö´í¼Ä´æÆ÷µÄÄÚÈÝ£¬Ö»Óе±bDriverError   Ϊ   SMART_IDE_ERROR   ʱÓÐЧ  
          bIDEStatus:   Byte;  
          bReserved:   array[0..1]   of   Byte;  
          dwReserved:   array[0..1]   of   DWORD;  
      end;  
      TSendCmdOutParams   =   packed   record  
          //   bBufferµÄ´óС  
          cBufferSize:   DWORD;  
          //   Çý¶¯Æ÷״̬  
          DriverStatus:   TDriverStatus;  
          //   ÓÃÓÚ±£´æ´ÓÇý¶¯Æ÷¶Á³öµÄÊý¾ÝµÄ»º³åÇø£¬Êµ¼Ê³¤¶ÈÓÉcBufferSize¾ö¶¨  
          bBuffer:   array[0..0]   of   BYTE;  
      end;  
  var  
      hDevice:   Thandle;  
      cbBytesReturned:   DWORD;  
      SCIP:   TSendCmdInParams;  
      aIdOutCmd:   array[0..(SizeOf(TSendCmdOutParams)   +   IDENTIFY_BUFFER_SIZE   -   1)   -   1]   of   Byte;  
      IdOutCmd:   TSendCmdOutParams   absolute   aIdOutCmd;  
      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   :=   ;   //   Èç¹û³ö´íÔò·µ»Ø¿Õ´®  
      if   SysUtils.Win32Platform   =   VER_PLATFORM_WIN32_NT   then  
            begin   //   Windows   NT/2000/XP/.net   ¸Ä±äÃû³Æ¿ÉÊÊÓÃÓÚÆäËüÇý¶¯Æ÷£¬ÈçµÚ¶þ¸öÇý¶¯Æ÷£º   \\.\PhysicalDrive1\  
                        //   also   can   be   SCSI0   SCSI1  
                hDevice   :=   CreateFile(PChar(\\.\PhysicalDrive+IntToStr(Index)),   GENERIC_READ   or   GENERIC_WRITE,  
                                                            FILE_SHARE_READ   or   FILE_SHARE_WRITE,   nil,   OPEN_EXISTING,   0,   0);  
            end   else   //   Version   Windows   95   OSR2,   Windows   98  
                hDevice   :=   CreateFile(\\.\SMARTVSD,   0,   0,   nil,   CREATE_NEW,   0,   0);  
            if   hDevice   =   INVALID_HANDLE_VALUE   then   Exit;  
            try  
                FillChar(SCIP,   SizeOf(TSendCmdInParams)   -   1,   #0);  
                FillChar(aIdOutCmd,   SizeOf(aIdOutCmd),   #0);  
                cbBytesReturned   :=   0;  
                //   Set   up   data   structures   for   IDENTIFY   command.  
                with   SCIP   do  
                    begin  
                        cBufferSize   :=   IDENTIFY_BUFFER_SIZE;  
                        //   bDriveNumber   :=   0;  
                        with   irDriveRegs   do  
                            begin  
                                bSectorCountReg   :=   1;  
                                bSectorNumberReg   :=   1;  
                                //   if   Win32Platform=VER_PLATFORM_WIN32_NT   then   bDriveHeadReg   :=   $A0  
                                //   else   bDriveHeadReg   :=   $A0   or   ((bDriveNum   and   1)   shl   4);  
                                bDriveHeadReg   :=   $A0;  
                                bCommandReg   :=   $EC;  
                            end;  
                    end;  
                if   not   DeviceIoControl(hDevice,   $0007C088,   @SCIP,   SizeOf(TSendCmdInParams)   -   1,  
                              @aIdOutCmd,   SizeOf(aIdOutCmd),   cbBytesReturned,   nil)   then   Exit;  
            finally  
                CloseHandle(hDevice);  
            end;  
            with   PIdSector(@IdOutCmd.bBuffer)^   do  
                begin  
                    ChangeByteOrder(sSerialNumber,   SizeOf(sSerialNumber));  
                    (Pchar(@sSerialNumber)   +   SizeOf(sSerialNumber))^   :=   #0;  
                    Result   :=   Pchar(@sSerialNumber);  
                end;  
  end;


 · 15260 错误 (再线等待)    »显示摘要«
    摘要: microsoft windows 2000 [version 5.00.2195] (c) 版权所有 1985-2000 microsoft corp. c:\>exp export: release 9.0.1.1.1 - production on 星期一 9月 22 14:54:23 2003 (c) copyright 2001 oracle corporation. al......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE