请问Delphi读写硬盘、移动硬盘分区表的方法?

解决方案 »

  1.   

    在实模式下我就会,在Windows的保护模式下就未试过
      

  2.   

    转贴
    很危险!-------------------------------------
    读、写Win2K的分区表 
    给你个读的例子,写的没敢试验,因为我只有一个HD.[:D]procedure TForm1.Button1Click(Sender: TObject);
    var  hFile:THandle ;
         bytesread:DWORD;
         buf: array[0..511] of char ;
         Security: TSecurityAttributes;begin hFile:=CreateFile('\\.\PhysicalDrive0',GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil ,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
      if hFile=INVALID_HANDLE_VALUE then
      begin
        ShowMessage('No file exists yet.' );
        Exit;
      end;
      if not  ReadFile(hFile, buf, sizeof(buf), bytesread, nil) then showmessage('Error');end;
    -----------------------------------------
    四、WIN2000中的磁盘扇区读写
        在WINNT和WIN2000中磁盘被看做一种标准设备,可以使用CreateFile象打开文件一样打开并存取。CreateFile支持两种方式的磁盘设备--逻辑磁盘(格式为"\\.\C:")和物理磁盘(格式为"\\.\PHYSICALDRIVEx",其中x为数字),例如打开A:盘进行读取操作,只要这样:
         HANDLE hDev=CreateFile("\\\\.\\A:",GENERIC_READ,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
    如果得到的句柄有效,就可以使用ReadFile来读取了,
         ReadFile(hDev,Buffer,512,&dwRet,0);
    读取结束要关闭该句柄,
         CloseHandle(hDev);
    这比WIN95/98下的磁盘扇区读取方便多了。
        另外,上面的例子是操作逻辑磁盘的,它包括软驱、硬盘分区等;物理磁盘指的是实际的硬盘,它不关心该硬盘被分成几个区,硬盘的编号是从0开始的,"\\.\PHYSICALDRIVE0"表示第一块硬盘,其它依此类推。大家可能马上会想起,利用这种机制可以对硬盘的分区表进行存取了。确实如此,此时便可以对硬盘的主引导扇区(独立存在的一个扇区,包含分区表信息,不同于磁盘分区的BOOT区)进行操作了。
         unsigned char Buffer[512]={0};
         HANDLE hDev=CreateFile("\\\\.\\PHYSICALDRIVE0",GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
         WriteFile(hDev,Buffer,512,&dwRet,0);
         CloseHandle(hDev);危险!!!千万别这么做!!!
      

  3.   

    就采用上面所说的物理访问方法_____________________
    http://lysoft.7u7.net
      

  4.   

    用WMI可以读取系统信息,
    具体怎么用偶也不知道,
    去MSDN上学习一下吧取得硬盘数我想到一个笨办法:
    还是利用CreateFile的返回值for i:=0 to 7 do
    begin
         hDevice =CreateFile('\\.\PhysicalDrive'+IntToStr(i),.......
         if hDevic=INVALID_HANDLE_VALUE then
         begin
             ShowMessage('Physical Drive count is'+Inttostr(i+1));
             break;
         end;
    end;