我在‘windows优化大师’看到它显示以上信息,说明可以取得这些数据,但怎么取呢?
还有,如何取得被patition magic隐藏掉的分区信息?

解决方案 »

  1.   

    string(Pchar(Ptr($FEC71)));//MainBoardBiosSerialNo
    string(Pchar(Ptr($FE061)));  //MainBoardBiosName
    string(Pchar(Ptr($FE091)));  //MainBoardBiosCopyRight
    string(Pchar(Ptr($FFFF5)));    //   MainBoardBiosDate
      

  2.   

    string(Pchar(Ptr($FEC71)));//MainBoardBiosSerialNo      --怪字符
    string(Pchar(Ptr($FE061)));  //MainBoardBiosName        --空
    string(Pchar(Ptr($FE091)));  //MainBoardBiosCopyRight   --空
    string(Pchar(Ptr($FFFF5)));    //   MainBoardBiosDate   --正确看来好像不对
      

  3.   

    下面是一位前辈写的代码
    IDE.PAS (IDE硬盘参数检测)
      ?Programmed by: 刘 杰   
      ?nbsp;Designed     : 04/11/92 
      ?nbsp;Last modified: 01/26/95
      ?请使用 Turbo Pascal 7.0 编译. const 
       { read/write --------------------------- } 
       HDC_DATA    = $01F0; 
       HDC_ERROR   = $01F1; 
       HDC_SECCOU  = $01F2; 
       HDC_SECNUM  = $01F3; 
       HDC_CYLLOW  = $01F4; 
       HDC_CYLHIGH = $01F5; 
       HDC_SDH     = $01F6; 
       { read --------------------------------- } 
       HDC_STATUS  : Word = $01F7; 
       HDC_ALTSTA  = $03F6; 
       { write -------------------------------- } 
       HDC_COMMAND = $01F7; 
       HDC_FIXED   = $03F6; 
       { commands ----------------------------- } 
       HDC_COMMAND_RESTORE = $10; 
       HDC_COMMAND_SEEK    = $70; 
       HDC_COMMAND_READ    = $20; 
       HDC_COMMAND_WRITE   = $30; 
       HDC_COMMAND_FORMAT  = $50; 
       HDC_COMMAND_READVER = $90; 
       HDC_COMMAND_DIAG    = $90; 
       HDC_COMMAND_SETPAR  = $91; 
       HDC_COMMAND_WRSTACK = $E8; 
       HDC_COMMAND_RDSTACK = $E4; 
       HDC_COMMAND_READPAR = $EC; 
       HDC_COMMAND_POWER   = $E0; 
       HDC_FIXED_IRQ       = $02; 
       HDC_FIXED_RESET     = $04; 
       HDC_STATUS_ERROR    = $01; 
       HDC_STATUS_INDEX    = $02; 
       HDC_STATUS_ECC      = $04; 
       HDC_STATUS_DRQ      = $08; 
       HDC_STATUS_COMPLETE = $10; 
       HDC_STATUS_WRFAULT  = $20; 
       HDC_STATUS_READY    = $40; 
       HDC_STATUS_BUSY     = $80; 
    type 
       TIdeTypes = record 
          Cylinders, 
          Heads, 
          Sectors: Word; 
          Name: String[38]; 
       end; 
       PIdeInfo = ^TIdeInfo; 
       TIdeInfo = record 
          genconf, 
          fixcyls, 
          remcyls, 
          heads, 
          bytetrack,                     { bytes per track } 
          bytesector,                    { bytes per sector } 
          sectors,                      { sectors per track } 
          byteisg,                      { bytes intesector gap } 
          byteplo,                      { bytes in sync } 
          worduniq: Word;                { words unique status } 
          serial: array[1..20] of Char; 
          contype,                       { controller type } 
          bufsiz,                      { buffer size in 512 byte blocks } 
          byteecc: Word;              { ECC bytes trasferred in read/write long  

          firmware: array[1..8] of Char; { firmware revision } 
          model: array[1..40] of Char;   { model ID } 
          secsint,                      { number of sectors transferred per inte 
    rrupt } 
          dblword,                      { double word transfer flag } 
          writepro: Word;                { write protect } 
       end; 
    const 
       IdesInDataBase = 17; 
       IdeTypes: array[1..IdesInDataBase] of TIdeTypes = 
       ((Cylinders:667;  Heads:4;  Sectors:33; Name:'Fujitsu M2611T (42.9 MB)'), 
     
        (Cylinders:667;  Heads:8;  Sectors:33; Name:'Fujitsu M2612T (85.9 MB)'), 
     
        (Cylinders:667;  Heads:12; Sectors:33; Name:'Fujitsu M2613T (128.9 MB)') 

        (Cylinders:667;  Heads:16; Sectors:33; Name:'Fujitsu M2614T (171.9 MB)') 

        (Cylinders:782;  Heads:2;  Sectors:27; Name:'Western Digital WD93024-A ( 
    20.6 MB)'), 
        (Cylinders:782;  Heads:4;  Sectors:27; Name:'Western Digital WD93044-A ( 
    41.2 MB)'), 
        (Cylinders:845;  Heads:3;  Sectors:35; Name:'Toshiba MK232FC (45.4 MB'), 
     
        (Cylinders:845;  Heads:7;  Sectors:35; Name:'Toshiba MK234FC (106 MB'), 
        (Cylinders:965;  Heads:5;  Sectors:17; Name:'Quantum ProDrive 40AT (40 M 
    B)'), 
        (Cylinders:965;  Heads:10; Sectors:17; Name:'Quantum ProDrive 80AT (80 M 
    B)'), 
        (Cylinders:1050; Heads:2;  Sectors:40; Name:'Teac SD-340 (41 MB)'), 
        (Cylinders:776;  Heads:8;  Sectors:33; Name:'Conner CP-3104 (100 MB)'), 
        (Cylinders:745;  Heads:4;  Sectors:28; Name:'Priam 3804M (40.7 MB)'), 
        (Cylinders:980;  Heads:10; Sectors:17; Name:'Western Digitial Caviar AC2 
    80 (81 MB)'), 
        (Cylinders:560;  Heads:6;  Sectors:26; Name:'Seagate ST157A (42 MB)'), 
        (Cylinders:732;  Heads:8;  Sectors:35; Name:'ALPS ELECTRIC Co.,LTD. DR31 
    1C (102 MB)'), 
        (Cylinders:0;    Heads:0;  Sectors:0;  Name:'')); 
    type 
       parray = ^tarray; 
       tarray = array[1..256] of Word; 
    var 
       secbuf: parray; 
       drive: Byte; 
       drv: String[1]; 
    procedure printinfo; 
    var 
       id: TIdeInfo; 
       capacity: Word; 
       types: String; 
       i: Integer; 
       function zo(const value: Byte): String; 
       begin 
          if Boolean(value) then 
             zo := '' 
          else 
             zo := 'not'; 
       end; 
       function ToStr(value: LongInt): String; 
       var 
          S: String; 
       begin 
          Str(value, S); 
          ToStr := S; 
       end; 
       function ConvertHex(Value: Word): String; 
       const 
          hexTable: array[0..15] of Char = '0123456789ABCDEF'; 
       begin 
          ConvertHex := hexTable[Hi(Value) shr 4] + hexTable[Hi(Value) and $f] + 
     
                        hexTable[Lo(Value) shr 4] + hexTable[Lo(Value) and $f]; 
       end; 
       procedure SwapBytes(var Source, Dest; Len: Byte); assembler; 
       asm 
           push  ds 
           lds   si, Source 
           les   di, Dest 
           mov   cl, len 
           xor   ch, ch 
       @1: mov   ax, ds:[si] 
           xchg  ah, al 
           mov   es:[di], ax 
           inc   si 
           inc   si 
           inc   di 
           inc   di 
           loop  @1 
           pop    ds 
       end; 
      

  4.   

    begin 
       id := PIdeInfo(secbuf)^; 
       { get disk type by characteristics } 
       i := 1; 
       while IdeTypes[i].Cylinders <> 0 do 
          Begin 
      if (IdeTypes[i].cylinders = id.fixcyls) and 
         (IdeTypes[i].heads = id.heads) and 
         (IdeTypes[i].sectors = id.sectors) then 
                Begin 
                   types := IdeTypes[i].name; 
                   break; 
                end; 
             inc(i); 
          end; 
       { unknown disk } 
       if (IdeTypes[i].cylinders = 0) then 
          Begin 
             types := ' '; 
             { calculate capacity in MB } 
      capacity := (LongInt(id.fixcyls) * id.heads * id.sectors) div 2048; 
             types := types + ToStr(capacity); 
             types := types + ' Mbytes'; 
          end; 
       { swap bytes in ASCII fields except for WD disks } 
       if (i <> 4) and (i <> 5) then 
          Begin 
             SwapBytes(id.serial, id.serial, 10); 
             SwapBytes(id.firmware, id.firmware, 4); 
             SwapBytes(id.model, id.model, 20); 
          end; 
       WriteLn('Drive ', drive-2, '     :', types); 
       WriteLn('Drive ID    : ', ConvertHex(id.genconf)); 
       WriteLn('Cylinders   : ', id.fixcyls{, ' ' id.remcyls, ' removables'}); 
       WriteLn('Heads       : ', id.heads); 
       Writeln('Sectors     : ', id.sectors); 
       WriteLn('Serial No.  : ', id.serial); 
       WriteLn('Firmware    : ', id.firmware); 
       WriteLn('Model       : ', id.model); 
    {   WriteLn('Bytes per track         : ', id.bytetrack); 
       Writeln('Bytes per sector        : ', id.bytesector); 
       WriteLn('Bytes of intersector gap: ', id.byteisg); 
       Writeln('Bytes of sync           : ', id.byteplo); 
       WriteLn('Controller type         : ', id.contype);} 
       Writeln('Buffer      : ', id.bufsiz div 2, ' KBytes'); 
       WriteLn('Bytes of ECC: ', id.byteecc); 
    end; 
    procedure readsect; assembler; 
    asm 
    { poll DRQ } 
    @1: mov   dx, HDC_STATUS 
        in    al, dx 
        and   al, HDC_STATUS_BUSY 
        or    al, al 
        jne   @1 
    { read up sector } 
        mov   cx, 256 
        mov   dx, HDC_DATA 
        les   di, secbuf 
    @2: in    ax, dx 
        mov   es:[di], ax 
        inc   di 
        inc   di 
        loop  @2 
    end; 
    function DriveValid(Drive: Char; var Drv: Byte): Boolean; assembler; 
    asm 
        mov   ah, 19h      { Save the current drive in BL } 
        int   21h 
        mov   bl, al 
        mov   dl, Drive    { Select the given drive } 
        sub   dl, 'A' 
        les   di, DRV 
        mov   es:[di], dl 
        mov   ah, 0Eh 
        int   21h 
        mov   ah, 19h      { Retrieve what DOS thinks is current } 
        int   21h 
        mov   cx, 0        { Assume false } 
        cmp   al, dl       { Is the current drive the given drive? } 
        jne   @1 
        mov   cx, 1        { It is, so the drive is valid } 
        mov   dl, bl       { Restore the old drive } 
        mov   ah, 0eh 
        int   21h 
    @1: xchg  ax, cx       { Put the return value into AX } 
    end; 
    function CurDisk: Byte; assembler; 
    { Returns current drive } 
    asm 
        mov   ah, 19h 
        int   21h 
    end; 
    begin 
       Writeln('IDE ver 1.2  (c) 1995 Keenvim software workgroup, Inc.'); 
       writeln('Programmed by  Mr. LiuJie'#13#10); 
       if ParamCount > 0 then 
          Begin 
             drv := ParamStr(1); 
             drv[1] := UpCase(drv[1]); 
             if not DriveValid(drv[1], Drive) or not (drv[1] in ['C'..'Z']) then 
     
                Begin 
                   WriteLn('There isn''t such drive or drive invalid!'); 
                   Halt(1); 
                end; 
          end 
       else 
          drive := CurDisk; 
       { disable interrupt from drive } 
       Port[HDC_FIXED] := HDC_FIXED_IRQ; 
       { set up task file parameter } 
       Port[HDC_SDH] := $A0 + (drive shl 4); 
       { issue read parameters } 
       Port[HDC_COMMAND] := HDC_COMMAND_READPAR; 
       GetMem(secbuf, SizeOf(secbuf)); 
       { read up sector } 
       readsect; 
       { print out info } 
       printinfo; 
       FreeMem(secbuf, SizeOf(secbuf)); 
    end. 
    ********************
    程序是编译过了,可是一运行就死机,帮我看看如何
     
    unit Getsn;interfaceuses
      Windows, SysUtils, Classes;type
      TGetsn = class(TComponent)
      private  protected
        { Protected declarations }
      public
        { Public declarations }
      published
        { Published declarations }
      end;var
      pw:array[1..256] of word;
      idt,int_idt:dword;
      Base:dword;
      Entry:word;  function inp(rdx:WORD):byte;
      function inpw(rdx:WORD):word;
      procedure outp(rdx:WORD;ral:integer);
      function WaitIde:integer;
      procedure ReadIDE;
      procedure NowInRing0;
      procedure GetIDEInfo;
      function harddisksn:string;implementation
    function inp(rdx:WORD):byte;Assembler;
    asm
      xor eax, eax
      mov dx, rdx
      in al, dx
      mov result,al
    end;function inpw(rdx:WORD):word;Assembler;
    asm
      xor eax, eax
      mov dx, rdx
      in  ax, dx
      mov result,ax;
    end;procedure outp(rdx:WORD;ral:integer);Assembler;
    asm
      mov dx, rdx
      mov eax, ral
      out dx, al
    end;function WaitIde:integer;
    var
      al:word;
    begin
      al:=inp($1F7);
      while (al<$80)do
        al:=inp($1F7);
      result:=al;
    end;
    procedure ReadIDE;
    var
      al,i:byte;
    begin
      WaitIde;
      outp($1F6,$A0);
      al:= WaitIde;
      if ((al and $50)<>$50) then exit;
      outp($1F6,$A0);
      outp($1F7,$EC);
      al:=WaitIde;
      if ((al and $58)<>$58) then exit;
      for i:=0 to 255 do
        pw[i]:=inpw($1F0);
    end;procedure NowInRing0;Assembler;
    asm
      push  ebp
      mov   ebp,esp
      call  ReadIDE;
      cli
      mov     ebx, int_idt
      mov     ax, Entry
      mov     word ptr[ebx-4], ax
      mov     eax, Base
      shr   eax, 16
      mov   [ebx+2], ax
      sti
      leave
      iretd
    end;
    procedure GetIDEInfo;Assembler;
    var
      dwExcept:DWORD;
    begin
     dwexcept:=dword(addr(nowinring0));
     asm
      mov     eax, fs:[0]
      push eax
      sidt    [esp-02h]
      pop     ebx
      mov     idt, ebx
      add     ebx, $1C
      mov     int_idt, ebx
      mov     eax, [ebx]
      mov     [Base], eax
      mov     ax, [ebx-4]
      mov     [Entry], ax
      cli
      mov     esi, dwExcept
      push esi
      mov     [ebx-4], si
      shr     esi, 16
      mov     [ebx+2], si
      pop     esi
      sti           //到这里死机
      int     3
    end;end;
    function harddisksn:string;
    var
      s:array[1..80] of char;
      i,j:integer;
    begin
      GetIDEInfo;
      j:=0;
      for i:=0 to 9 do
        while (j<=19) do
        begin
          s[j]:=chr(pw[10+i]shr 8);
          j:=j+1;
          s[j]:=chr(pw[10+i]and $FF);
          j:=j+1;
        end;
      s[j]:=chr(0);
      result:=s;
    end;end.