procedure TForm1.Button1Click(Sender: TObject); var hDriveHandle: THandle; procedure TForm1.Button1Click(Sender: TObject); const BytesPerSector = 512; SectorCount = 1; //读写扇区数 SectorStart = 0; //起始扇区数 drive = ''''\\.\C:''''; //驱动盘 var str: String; p: PChar; i: Cardinal; begin hDriveHandle := CreateFile(drive, GENERIC_ALL, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if (hDriveHandle <> INVALID_HANDLE_VALUE) then begin p := allocmem(SectorCount * ByteSPerSector);//p 必须是新申请的内存或全局变量,不能是局部变量 //定义为局部变量是不能读写磁盘的 FileSeek(hDriveHandle, SectorStart * BytesPerSector, 0); //起始扇区 if FileRead(hDriveHandle, p[0], SectorCount * BytesperSector)<> //读扇区 SectorCount * BytesperSector then raise Exception.Create(''''Read Error!''''); str :=''''''''; for i := 0 to 512 - 1 do begin str := str + Format(''''%.2x'''', [integer(p[i])]); if i mod 16 = 15 then str := str + #13; end; ShowMessage(str); FileSeek(hDriveHandle, SectorStart * BytesPerSector, 0); //起始扇区 if FileWrite(hDriveHandle, p[0], SectorCount * BytesperSector)<> //写扇区 SectorCount * BytesperSector then raise Exception.Create(''''Write Error!''''); FreeMem(p, SectorCount * BytesperSector); Closehandle(hDriveHandle); end; end; procedure TForm1.Button2Click(Sender: TObject); const BytesPerSector = 512; SectorCount = 1; //读写扇区数 SectorStart = 0; //起始扇区数 drive = ''''\\.\PHYSICALDRIVE0''''; //物理磁盘 var str: String; p: PChar; i: Cardinal; begin hDriveHandle := CreateFile(drive, GENERIC_ALL, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if (hDriveHandle <> INVALID_HANDLE_VALUE) then begin p := allocmem(SectorCount * ByteSPerSector);//p 必须是新申请的内存或全局变量,不能是局部变量 //定义为局部变量是不能读写磁盘的 FileSeek(hDriveHandle, SectorStart * BytesPerSector, 0); //起始扇区 if FileRead(hDriveHandle, p[0], SectorCount * BytesperSector)<> //读扇区 SectorCount * BytesperSector then raise Exception.Create(''''Read Error!''''); str :=''''''''; for i := 0 to 512 - 1 do begin str := str + Format(''''%.2x'''', [integer(p[i])]); if i mod 16 = 15 then str := str + #13; end; ShowMessage(str); FileSeek(hDriveHandle, SectorStart * BytesPerSector, 0); //起始扇区 if FileWrite(hDriveHandle, p[0], SectorCount * BytesperSector)<> //写扇区 SectorCount * BytesperSector then raise Exception.Create(''''Write Error!''''); FreeMem(p, SectorCount * BytesperSector); Closehandle(hDriveHandle); end; end;
|