線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1719
推到 Plurk!
推到 Facebook!

算MD5時TFileStream.Creat 開svchost.exe失敗

缺席
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-24 12:23:12 IP:210.69.xxx.xxx 未訂閱
算 hashvalue 時 TFileStream.Create 開啟 svchost.exe 失敗, 錯誤訊息     
C:\Windows\system32\svchost.exe 程序無法存取檔案, 因為檔案正由另一個程序使用
程式碼
function MD5File(sFileName:String):String;
Var
  Digest: T4x4LongWordRecord;
  S, S1: String;
  i: Integer;
  md5: TIdHashMessageDigest5;
  fs : TFileStream;
  FileHandle : Integer;
begin
  SetLength(S, 16);
  md5:=TIdHashMessageDigest5.Create;      try
    fs := TFileStream.Create(sFileName, fmOpenRead)
  except
    //raise Exception.Create('Could not open the input file for read access.');
  end;      Digest :=md5.HashValue(fs);
  Move(Digest, S[1], 16);
  for i := 1 to Length(S) do begin
    S1 := S1   Format('x', [Byte(S[i])]);
  end;
  while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0';
  Result:=S1;
  md5.Free;
  
end;
 
有辦法開啟 svchost.exe 計算 md5 值嗎 ? 謝謝 發表人 - pcboy2 於 2004/09/24 12:30:05
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-24 12:32:29 IP:210.69.xxx.xxx 未訂閱
如果不在 IDE 環境直接執行程式 (不是可以避免 except 捕捉), 結果仍有錯誤, 錯誤訊息 Access violation at address 00415D55 in module 'Project1.exe'. Read of address 00000000.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-24 12:34:30 IP:210.69.xxx.xxx 未訂閱
改用下面方法, 結果不管開啟任何檔案, 在 Digest :=md5.HashValue(fs); 就停住了    
function MD5File(sFileName:String):String;
Var
  Digest: T4x4LongWordRecord;
  S, S1: String;
  i: Integer;
  md5: TIdHashMessageDigest5;
  fs : TFileStream;
  FileHandle : Integer;
begin
  SetLength(S, 16);
  md5:=TIdHashMessageDigest5.Create;      FileHandle := FileOpen(sFileName, fmOpenWrite or fmShareDenyNone);
  if FileHandle > 0 then
  begin
    fs := TFileStream.Create(FileHandle);        Digest :=md5.HashValue(fs);
    Move(Digest, S[1], 16);
    for i := 1 to Length(S) do begin
      S1 := S1   Format('x', [Byte(S[i])]);
    end;
    while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0';
    Result:=S1;
    md5.Free;
  end
  else
    Result := 'N/A';
end;
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-24 14:20:00 IP:219.80.xxx.xxx 未訂閱
你好
    看了你的程式有幾點問題, 以紅色標註並說明
    
    
function MD5File1(sFileName:String):String;
Var
  Digest: T4x4LongWordRecord;
  S, S1: String;
  i: Integer;
  md5: TIdHashMessageDigest5;
  fs : TFileStream;
  FileHandle : Integer;
begin
  SetLength(S, 16);    
{
你這段應該是要判斷檔案存在與否,我覺得你該修正, 但就算不修正也不是主要的錯誤.
1 有 FileExists 可以使用
2 你沒有釋放 FileHandle
}
//  FileHandle := FileOpen(sFileName, fmOpenWrite or fmShareDenyNone);
//  if FileHandle > 0 then      if FileExists (sFileName) then
  begin    {
檔案存在時再建立物件,不要無謂浪費系統資源
}      md5:=TIdHashMessageDigest5.Create;    {
這是你的致命傷,fs 呼叫的方式並不是這樣的, 下面是呼叫的方式
constructor Create(const FileName: string; Mode: Word); overload;
constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload; 
}
//    fs := TFileStream.Create(FileHandle);        fs := TFileStream.Create(sFileName, fmOpenRead);
    try
      Digest :=md5.HashValue(fs);
      Move(Digest, S[1], 16);
      for i := 1 to Length(S) do begin
        S1 := S1   Format('x', [Byte(S[i])]);
      end;
      while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0';
      Result:=S1;
      
善用 try ... finally 來釋放資源        finally
      md5.Free;
      fs.Free;
    end;
  end
  else
    Result := 'N/A';
end;
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-24 16:17:58 IP:210.69.xxx.xxx 未訂閱

這是你的致命傷,fs 呼叫的方式並不是這樣的, 下面是呼叫的方式
constructor Create(const FileName: string; Mode: Word); overload;
constructor Create(const FileName: string; Mode: Word; Rights: Cardinal); overload; 
}
//    fs := TFileStream.Create(FileHandle);
小弟輸入到 fs := TFileStream.Create( 畫面跳出有 3 種方式 還一種是 AHandle : Integer; 原因原先用的方式失敗, 所以改用其他方式試試看
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-24 16:25:36 IP:210.69.xxx.xxx 未訂閱

unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  IdHash, IdHashMessageDigest;    type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}
function MD5File(sFileName:String):String;
Var
  Digest: T4x4LongWordRecord;
  S, S1: String;
  i: Integer;
  md5: TIdHashMessageDigest5;
  fs : TFileStream;
begin
  SetLength(S, 16);      if FileExists (sFileName) then
  begin
    md5:=TIdHashMessageDigest5.Create;
    try
      // fs := TFileStream.Create(sFileName, fmOpenRead or fmShareDenyWrite)
      fs := TFileStream.Create(sFileName, fmOpenRead);
      Digest :=md5.HashValue(fs);
      Move(Digest, S[1], 16);
      for i := 1 to Length(S) do begin
        S1 := S1   Format('x', [Byte(S[i])]);
      end;
      while Pos(' ', S1) > 0 do S1[Pos(' ', S1)] := '0';
      Result:=S1;
    finally
      md5.Free;
      fs.Free;
    end;
  end;    end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(MD5File('c:\windows\system32\svchost.exe'));
  ShowMessage(MD5File('C:\WINDOWS\SYSTEM32\DRIVERS\ATAPI.SYS'));
end;    end.
c:\windows\system32\svchost.exe 可以算出結果 怪, 原本不行, 可能是 fs.Free; 沒寫, 原本的程式是完整程式中的一個函式, 有計算 svchost.exe 不只一次, 為了減少其他影響, 這次只做完整小測試 但是這次換別的出問題錯誤訊息 : C:\Windows\system32\drivers\atapi.sys 程序無法存取檔案, 因為檔案正由另一個程序使用
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-24 16:26:20 IP:210.69.xxx.xxx 未訂閱
SORRY ! 不小心多貼 發表人 - pcboy2 於 2004/09/24 16:28:43
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-28 07:03:28 IP:202.39.xxx.xxx 未訂閱
一個想法, 把要開啟的檔案先複製(copy)一份 再來開啟檢查, 不知可行嗎?
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-30 10:25:20 IP:210.69.xxx.xxx 未訂閱
嘗試過, 不讓開啟, 或許敝人剛好使用的方式是無法開啟檔案的方式 有人測試成功嗎 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
magicbear
一般會員


發表:5
回覆:10
積分:3
註冊:2004-11-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-29 21:34:06 IP:202.175.xxx.xxx 未訂閱
有些檔案是windows防止開啟的, 例如部份Driver, sam等密碼及SOFTWARE等, 系統個人資料檔等, 又或是是其他程序用獨佔模式也沒法開啟!!
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-30 17:41:04 IP:61.221.xxx.xxx 未訂閱
hihi 各位大大 pcboy大大 我測試的結果可以抓到MD5 環境Win2000P Delphi7 svchost.Exe MD5 CCFC400F3305A61CBD8AD2A6F5671E4B ATAPI.SYS MD5 8C718AA8C77041B3285D55A0CE980867 搞不懂!搞不懂!永遠都搞不懂!!
系統時間:2024-05-17 9:57:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!