亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 小巧磁盤編輯器.txt

?? D7設計的小巧磁盤編輯器 Window2000/Xp下的小巧磁盤編輯器
?? TXT
字號:
                                                   Window2000/Xp下的小巧磁盤編輯器
     提起磁盤編輯器,我們就會想到Winhex,Advanced Disk Catalog ,Edittool等常用軟件.如果能自己動手制作一個類似的磁盤工具,那將是很有趣的.這里就使用Dephi7在Window2000/2003/Xp環境下設計一款小巧的磁盤編輯器,可以在Fat32,Ntfs文件系統在正常工作.可以實現磁盤扇區的讀取,修改,復制等常用功能.程序運行效果如圖1所示.
     在Dephi新建一個項目,在窗體上放置一個stringgrid控件,用來顯示和修改磁盤扇區的內容.兩個按鈕,分別用來讀寫相應扇區.兩個spinedit控件,用來設置起始扇區和讀寫扇區的數目.一個DriveComboBox控件,用來選擇磁盤.statusbar狀態條用來顯示當前狀態.
     程序的關鍵是利用CreateFile(drive, GENERIC_ALL,  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0)函數來打開需要讀寫的驅動器,然后利用ReadFile,WriteFile來進行磁盤讀寫。程序的核心是如何動態顯示和修改磁盤扇區的內容.這里使用了兩個整數型的數組seca和secb分別用來記錄扇區的原始內容和修改后的內容.不管是否修改了扇區內容,在對磁盤進行寫操作時,把數組secb作為數據源來提供扇區寫入所需的數據.當然不點擊"寫扇區"按鈕的話,一切操作都是安全的.
程序中用來在stringgrid中顯示扇區內容的代碼如下:
procedure tform1.BytesToGrid;  //此過程將扇區內容顯示在stringgrid中.這里的stringgrid的option屬性應包括:goFixedVertLine, goFixedHorzLine, goRangeSelect, goEditing, goTabs, goAlwaysShowEditor.
var
  i,j,k:Integer;
  c: Char;
  fbuf:pchar;
begin
   n:=nsectors.Value; //讀寫的扇區數
   s:=startsector.Value;//起始扇區數
   setlength(seca,n*bytepersectors);
   setlength(secb,n*bytepersectors); //動態設置數組的長度,seca和secb分別記錄原始和變化后的扇區數據
   StatusBar1.Panels[1].Text := '';
   hDeviceHandle := CreateFile(driver, GENERIC_ALL, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0);//打開磁盤
   if (hDeviceHandle<> INVALID_HANDLE_VALUE) then  //是否打開成功
   begin
   fbuf:=allocmem(n*bytepersectors);
   FileSeek(hDevicehandle,s*bytepersectors,0); //定位扇區
    if FileRead(hDevicehandle,fbuf[0],n*bytepersectors)<>n*bytepersectors then
           raise exception.create('讀磁盤錯誤!');
    stringgrid1.Rowcount:=n*32+1;//根據選擇的扇區數動態的改變網格的行數
    for i:=0 to ((n*bytepersectors) div 16)-1 do
        StringGrid1.Cells[0,i+1] := IntToHex(i*16,4)+':';   //格式化顯示stringgrid的0行表頭信息
    for i:=0 to ((n*bytepersectors) div 16)-1 do
    for j:=1 to 16 do
      begin
      seca[j-1+16*i]:=integer(fbuf[j-1+16*i]);//將扇區數據轉換為整型
      secb[j-1+16*i]:=seca[j-1+16*i];  //初始扇區數組數據
      end;
    for i:=0 to ((n*bytepersectors) div 16)-1 do begin
    StringGrid1.Cells[0,i+1] := IntToHex(i*16,4)+':';  //格式化顯示stringgrid的0列內容
    for j:=1 to 16 do begin
      K := seca[j-1+16*i];
      StringGrid1.Cells[j,i+1]:=format('%.2x',[integer(fbuf[j-1+16*i])]);//在stringgrid的1至16列格式化數據顯示
      C :=chr(k);
      if c<' ' then c:='.';
      StringGrid1.Cells[j+17,i+1] := c; //在stringgrid18至33列顯示對應的asc碼
      StatusBar1.Panels[1].Text := Format('邏輯磁盤 '+DriveComboBox1.Drive+'第 %D 扇區起連續'+inttostr(n)+'個扇區',[s]);
    end;
   end;
   freemem(fbuf);//釋放內存
   closehandle(hDeviceHandle);  //關閉句柄
  end;
end; 
程序的完整源代碼如下:
 unit diskedirunt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, shellapi,FileCtrl, Grids, ComCtrls;

type
  TForm1 = class(TForm)
    DriveComboBox1: TDriveComboBox;
    Button1: TButton; //寫扇區按鈕
    startsector: TSpinEdit;
    nsectors: TSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    StatusBar1: TStatusBar;
    StringGrid1: TStringGrid;
    Button2: TButton; //讀扇區按鈕
    Label3: TLabel;
    procedure FormShow(Sender: TObject);
    procedure DriveComboBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
      var Value: String);
    procedure StringGrid1Exit(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure nsectorsChange(Sender: TObject);
    procedure startsectorChange(Sender: TObject);
  private
   driver:pchar;  //驅動器名稱
   bytepersectors:integer; //每扇區字節數,默認為512
   s,n:integer;
   seca,secb:array of integer;  //分別保存原始和變化的扇區數據
   procedure BytesToGrid;
   procedure OnFocusChange;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ColOld: Integer = 1;   //根據用戶的在stringgrid的選擇改變光標所在的行列數
  RowOld: Integer = 1;
  CellKeyPress: Integer;  //判斷在stringgrid中的按鍵
  CharSellsCount:integer =17;  
  hdevicehandle:thandle;  //文件句柄
  Form1: TForm1;

implementation

uses wlt;

{$R *.dfm}

procedure TForm1.OnFocusChange;  //在stringgrid里改變光標位置時動態刷新數組的內容
var
  I: Integer;
  C: Char;
begin
  I := ColOld-1+(RowOld-1)*16;
  with StringGrid1 do
    if Length(Cells[ColOld,RowOld])>2 then begin   //沒有修改則顯示seca中的原始數據
      Cells[ColOld,RowOld] := IntToHex(seca[i],2);
    end else
    try
      secb[i] := StrToInt('$'+Cells[ColOld,RowOld]); //保存修改后的扇區數據到secb數組中
      C := Chr(secb[i]);
      if c<' ' then c:='.';
      Cells[ColOld+17,RowOld] := C;
    except; end;
end;

procedure tform1.BytesToGrid; //在stringgrid中動態顯示扇區的內容
var
  i,j,k:Integer;
  c: Char;
  fbuf:pchar;
begin
   n:=nsectors.Value;
   s:=startsector.Value;
   setlength(seca,n*bytepersectors);
   setlength(secb,n*bytepersectors);
   StatusBar1.Panels[1].Text := '';
   hDeviceHandle := CreateFile(driver, GENERIC_ALL, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0);
   if (hDeviceHandle<> INVALID_HANDLE_VALUE) then
   begin
   fbuf:=allocmem(n*bytepersectors);
   FileSeek(hDevicehandle,s*bytepersectors,0);
    if FileRead(hDevicehandle,fbuf[0],n*bytepersectors)<>n*bytepersectors then
           raise exception.create('讀磁盤錯誤!');
    stringgrid1.Rowcount:=n*32+1;
    for i:=0 to ((n*bytepersectors) div 16)-1 do
        StringGrid1.Cells[0,i+1] := IntToHex(i*16,4)+':';
    for i:=0 to ((n*bytepersectors) div 16)-1 do
    for j:=1 to 16 do
      begin
      seca[j-1+16*i]:=integer(fbuf[j-1+16*i]);
      secb[j-1+16*i]:=seca[j-1+16*i];
      end;
    for i:=0 to ((n*bytepersectors) div 16)-1 do begin
    StringGrid1.Cells[0,i+1] := IntToHex(i*16,4)+':';
    for j:=1 to 16 do begin
      K := seca[j-1+16*i];
      StringGrid1.Cells[j,i+1]:=format('%.2x',[integer(fbuf[j-1+16*i])]);
      C :=chr(k);
      if c<' ' then c:='.';
      StringGrid1.Cells[j+17,i+1] := c;
      StatusBar1.Panels[1].Text := Format('邏輯磁盤 '+DriveComboBox1.Drive+'第 %D 扇區起連續'+inttostr(n)+'個扇區',[s]);
    end;
   end;
   freemem(fbuf);
   closehandle(hDeviceHandle);
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  driver:=pchar('\\.\'+drivecombobox1.Drive+':');//在formshow中設置初始驅動器值
  BytesToGrid;
end;

procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
  Button2Click(self);//改變驅動器時,刷新網格顯示
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
   startsector.Value:=0;
   nsectors.Value:=1;
   bytepersectors:=512;
   with StringGrid1 do begin //網格分兩部分,一邊以16進制顯示扇區數據,一邊顯示相應的asc值.
    ColWidths[0] := 50;
    for i := 17 to 33 do begin
      TabStops[i] := False;
      ColWidths[i] := 11; //設置網格列的寬度
    end;
    for i := 1 to 16 do Cells[i,0] := IntToHex(i-1,2); //設置表頭信息
    for i := 18 to 33 do Cells[i,0] := IntToHex(i-18,1);
    Cells[0,0] := '偏移';
 end;
end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin     //根據在網格中的按鍵,進行光標的定位
if Key<>#8 then begin
    Key := UpCase(Key);
    if not (Key in ['0'..'9','A'..'F']) then Key := #0 else    //只允許輸入特定字符
     with StringGrid1 do
      if CellKeyPress>1 then begin
        if Length(Cells[Col,Row])>1 then begin
          if (Col+1+CharSellsCount)<ColCount then begin
            Col := Col+1;   //光標換列
            CellKeyPress := 1;
          end else begin
            if (Row+1)<RowCount then begin
              Col := 1; Row := Row+1; //光標換行
              CellKeyPress := 1;
            end else Key := #0;
          end;
        end;
      end else Inc(CellKeyPress);
  end;
  if Key<>#0 then StatusBar1.Panels[1].Text := Format('修改邏輯磁盤 '+DriveComboBox1.Drive+'第 %D 扇區',[startsector.Value]);  //,如進行扇區數據的修改,則在狀態欄中顯示修改信息
end;


procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
  ARow: Integer; var Value: String);  //根據在網格中選擇的位置改變記錄行列的ColOld ,
  RowOld 變量的值.
var   
  S: String;
  L: Integer;
begin
  with StringGrid1 do begin
    S := Cells[ColOld,RowOld];
    L := Length(S);
    case L of
      0: Cells[ColOld,RowOld] := '00';
      1: Cells[ColOld,RowOld] := '0'+S;
    end;
  end;
  ColOld := ACol;
  RowOld := ARow;
end;


procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
with StringGrid1 do
    if Col<16 then
      Col := Col+1
    else begin
      Col := 1; Row := Row+1; //改變行列的值
    end;
  OnFocusChange;  //當光標所在的行列變化時,刷新網格顯示.
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean); //選擇網格數據時動態刷新網格內容
begin
if aCol>16 then CanSelect := False;
  CellKeyPress := 0;
  OnFocusChange;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState); //當修改扇區數據時,對修改的部分進行醒目的顯示
var
i:integer;
begin
with StringGrid1.Canvas do
    if (aCol>0) and (aRow>0) then begin
      case aCol of
        1..16: I := aCol-1+(aRow-1)*16;
        18..33: I := aCol-18+(aRow-1)*16;
      else I := -1;
      end;
      if I>=0 then
        if seca[I]<>secb[I] then begin //對原始seca數據和變化的secb數據進行對比,不同則表示修改了扇區數據
          Brush.Color := clred;
          FillRect(Rect);
          TextOut(Rect.Left+2,Rect.Top+2,StringGrid1.Cells[aCol,aRow]);
        end;  //重新以紅色顯示修改的數據
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 driver:=pchar('\\.\'+drivecombobox1.Drive+':');
 BytesToGrid;  //讀取扇區數據
end;

procedure TForm1.Button1Click(Sender: TObject);  //將指定的扇區寫至選擇的邏輯盤的對應扇區位置
var
p:pchar;
i,j:integer;
writesec:string;
begin
    if Form2.ShowModal <> mrOk then Exit; //顯示磁盤寫入的窗體
    driver:=pchar('\\.\'+form2.DriveComboBox1.Drive+':'); //取得指定邏輯盤
    p:=allocmem(n*bytepersectors);
    setlength(writesec,n*bytepersectors); //動態設置字符串長度,用以保存扇區數據
    writesec:='';
    for i:=0 to ((n*bytepersectors) div 16)-1 do
    for j:=1 to 16 do
     writesec := writesec + chr(secb[j-1+16*i]); //將secb中的保存的扇區數據轉移至特定字符串中
     p:=pchar(writesec);//將數據轉化為pchar類型
    hDeviceHandle := CreateFile(driver, GENERIC_ALL,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,0, 0); //打開目標盤
    if (hDeviceHandle <> INVALID_HANDLE_VALUE) then
    begin
     FileSeek(hDevicehandle,form2.SpinEdit1.Value*bytepersectors,0); //扇區定位
    if FileWrite(hDevicehandle,p[0],n*bytepersectors)<>n*bytepersectors then  //寫入扇區數據,完成扇區寫操作1
       raise exception.create('Write錯誤%d');
    StatusBar1.Panels[1].Text :='寫邏輯磁盤 '+form2.DriveComboBox1.Drive+'成功!';
    closehandle(hDeviceHandle); //關閉句柄
 end;
end;

procedure TForm1.nsectorsChange(Sender: TObject);
begin
   if nsectors.Value<1 then  //改變扇區數量時進行判斷
   begin
   MessageBox(0, '扇區數不能為0!','小巧磁盤編輯器', MB_OK + MB_ICONERROR + MB_DEFBUTTON2 +
       MB_TOPMOST);
   nsectors.Value:=1;
   end;
   Button2Click(self);//改變網格數據
end;

procedure TForm1.startsectorChange(Sender: TObject);
begin
Button2Click(self); //起始扇區改變時,改變網格的內容
end;

end.
寫扇區的源碼如下:
unit wlt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, FileCtrl;

type
  TForm2 = class(TForm)  //寫扇區窗體
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label2: TLabel;
    SpinEdit1: TSpinEdit;
    DriveComboBox1: TDriveComboBox;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
spinedit1.Value:=0; //起始扇區數置0
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
if MessageBox(0, '磁盤扇區寫入可能存在危險,是否繼續?',
       '小巧磁盤編輯器', MB_YESNO + MB_ICONERROR + MB_DEFBUTTON2 +
       MB_TOPMOST) = IDNO then
 close;      
end;

end.
 當然這只是在windows2000/xp下讀寫扇區的的一般方法.還有一些需要進一步完善的地方.例如判斷磁盤的總扇區數,進行必要的約束等.限于篇幅就不一一列舉了.

測試環境: Dephi7+Windows2000,Ntfs文件系統.

    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99久久久欧美国产| 国产精品久久久久久久久久久免费看| 97se亚洲国产综合自在线| 久88久久88久久久| 国产一区日韩二区欧美三区| 久久精品国产精品亚洲综合| 奇米影视7777精品一区二区| 免费成人在线视频观看| 免费高清在线视频一区·| 久久99精品一区二区三区三区| 美女视频黄 久久| 精品午夜久久福利影院| 国产激情一区二区三区| av一二三不卡影片| 在线观看一区日韩| 91精品国产高清一区二区三区| 欧美一区二区三区四区五区| 精品国产99国产精品| 国产欧美精品一区二区三区四区| 国产精品免费观看视频| 亚洲女人的天堂| 日本亚洲欧美天堂免费| 精品亚洲国内自在自线福利| 99久久精品免费看| 欧美日韩夫妻久久| 久久久久久久久久久电影| 国产精品福利影院| 日韩精品乱码免费| 暴力调教一区二区三区| 欧美伦理视频网站| 亚洲国产经典视频| 午夜伦欧美伦电影理论片| 国产伦精品一区二区三区视频青涩 | 91麻豆免费看| 欧美精品久久久久久久多人混战| 亚洲精品一区二区三区四区高清| 亚洲视频一区二区免费在线观看| 日韩精品电影在线| 不卡免费追剧大全电视剧网站| 欧美日韩免费观看一区三区| 国产日韩欧美亚洲| 日韩影视精彩在线| 99精品欧美一区二区蜜桃免费| 9191精品国产综合久久久久久| 欧美国产一区二区| 男男成人高潮片免费网站| jizz一区二区| 欧美成人综合网站| 亚洲观看高清完整版在线观看| 国产jizzjizz一区二区| 欧美精品电影在线播放| 国产精品久久久爽爽爽麻豆色哟哟| 日韩精品一区第一页| 91影院在线观看| 久久久久久久久免费| 欧美aⅴ一区二区三区视频| 欧美在线不卡视频| 亚洲女爱视频在线| 99综合影院在线| 国产欧美视频在线观看| 韩国一区二区三区| 日韩免费成人网| 日日骚欧美日韩| 精品视频123区在线观看| 国产精品色在线观看| 国产综合色产在线精品| 日韩三级av在线播放| 日日摸夜夜添夜夜添国产精品| 在线一区二区三区四区| 综合电影一区二区三区| 成人福利视频在线看| 国产女主播视频一区二区| 国产在线精品免费av| 欧美本精品男人aⅴ天堂| 日本中文在线一区| 欧美一卡二卡在线| 另类小说色综合网站| 日韩色视频在线观看| 蜜臀av一级做a爰片久久| 欧美一级精品在线| 久久99九九99精品| 欧美激情一区二区三区不卡| 成人自拍视频在线| 亚洲欧美怡红院| 一本一本大道香蕉久在线精品| 亚洲欧美激情视频在线观看一区二区三区 | 成人av电影免费在线播放| 国产日韩在线不卡| av在线这里只有精品| 成人免费在线播放视频| 日本高清无吗v一区| 亚洲高清视频在线| 精品国一区二区三区| 国产老肥熟一区二区三区| 国产亚洲欧美在线| 91麻豆精品在线观看| 亚洲成人在线网站| 久久中文娱乐网| 91老师国产黑色丝袜在线| 午夜精品久久久久久久久久久| 欧美一级免费观看| 成人91在线观看| 亚洲成a人片在线观看中文| 日韩精品一区二区三区视频| 国产精品亚洲一区二区三区在线| 亚洲三级免费电影| 欧美一区二区三区在线观看视频| 国产麻豆91精品| 亚洲综合自拍偷拍| 久久色在线观看| 欧美日韩中文另类| 国产精品123区| 天堂午夜影视日韩欧美一区二区| 精品91自产拍在线观看一区| 色综合久久久久| 国内久久精品视频| 一区二区三区丝袜| 国产香蕉久久精品综合网| 欧美三级一区二区| 成人久久18免费网站麻豆 | 91蜜桃免费观看视频| 午夜视频久久久久久| 国产免费久久精品| 欧美一卡2卡3卡4卡| 色婷婷av一区二区三区软件| 韩国精品久久久| 三级不卡在线观看| 一区二区成人在线观看| 日本一二三不卡| 精品久久久久久久久久久院品网 | 九色综合狠狠综合久久| 亚洲在线视频网站| 国产精品久久综合| 久久精品人人做人人综合| 9191久久久久久久久久久| 欧美综合一区二区三区| 97久久精品人人爽人人爽蜜臀 | 亚洲三级在线看| 欧美激情中文不卡| 久久久综合视频| 久久综合九色综合97婷婷| 欧美日韩一区久久| 在线观看av一区| 在线视频一区二区免费| 91美女片黄在线观看| 不卡电影一区二区三区| 成人高清视频在线观看| 成人高清视频在线| 91在线观看一区二区| 成人av免费在线播放| 97精品视频在线观看自产线路二| 成人美女在线观看| 91麻豆swag| 色婷婷综合久久久中文一区二区| bt欧美亚洲午夜电影天堂| 成人精品gif动图一区| 成人激情动漫在线观看| 99免费精品视频| 色8久久人人97超碰香蕉987| 91丨porny丨首页| 色婷婷av一区二区三区gif| 欧美影院精品一区| 91精品国产乱| 久久久久99精品一区| 中文字幕一区日韩精品欧美| 中文字幕在线播放不卡一区| 樱花草国产18久久久久| 亚洲bt欧美bt精品777| 麻豆91在线观看| 国产不卡视频在线观看| 91在线小视频| 在线成人av网站| 久久精品男人天堂av| 中文字幕一区二区三区视频| 亚洲综合激情网| 老司机精品视频一区二区三区| 国产精品白丝jk白祙喷水网站| 成人国产精品免费观看视频| 欧美日韩一区三区四区| 精品日本一线二线三线不卡| 国产精品丝袜久久久久久app| 一区二区三区在线影院| 人人爽香蕉精品| 成人激情小说乱人伦| 91精品在线免费| 中文av一区二区| 三级在线观看一区二区| 不卡一区中文字幕| 91精品国产高清一区二区三区| 亚洲国产精品v| 日本欧美一区二区在线观看| 国产成人aaa| 宅男噜噜噜66一区二区66| 国产精品三级视频| 日本女优在线视频一区二区| 99精品国产99久久久久久白柏 | 国产精品久久久久久一区二区三区| 一区二区三区蜜桃网| 国产尤物一区二区在线| 欧美日韩国产成人在线91|