2012-09-26 32 views
0

我下面的檢查文件的數字簽名的代碼文件的哈希在Sysinternals計算使用CryptCATAdminCalcHashFromFileHandle在VB

在那裏,我需要得到一個文件的哈希值。對於那部分我使用下面的代碼。

 'Open file 
     Dim fs As FileStream = New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 8) 


     'Get the size we need for our hash. 
     Dim fileHandle As IntPtr = fs.SafeFileHandle.DangerousGetHandle() 
     Dim hashSize As Integer 
     Dim hash As Byte() = New Byte(256) {} 

     Dim b As Boolean = CryptCATAdminCalcHashFromFileHandle(fileHandle, hashSize, Nothing, 0) 

     'check results 
     System.Console.WriteLine(fileHandle) 
     System.Console.WriteLine(hashSize) 
     System.Console.WriteLine(hash) 
     System.Console.WriteLine(b) 

使用wintrust.dll如下

<DllImport("Wintrust.dll", PreserveSig:=True, SetLastError:=False)> _ 
    Private Shared Function CryptCATAdminCalcHashFromFileHandle(ByRef fileHandle As IntPtr, ByVal hash As IntPtr, ByVal hashSize As Byte(), ByVal dwFlags As Integer) As Boolean 
    End Function 

輸出的文件句柄獲取不同執行不同的值(這是確定) 但HASHSIZE和哈希始終是零。而b總是假的。

我在這裏錯過了什麼。 請指點

回答

2

宣言應該是這樣的:

<DllImport("Wintrust.dll", PreserveSig:=True, SetLastError:=False)> _ 
Private Shared Function CryptCATAdminCalcHashFromFileHandle(ByVal fileHandle As IntPtr, ByRef hashSize As Integer, ByVal hash As Byte(), ByVal dwFlags As Integer) As Boolean 
End Function 

需要初始化hashSize到您的緩衝區的大小,和緩衝傳遞給函數:

hashSize = 256 
Dim b As Boolean = CryptCATAdminCalcHashFromFileHandle(fileHandle, hashSize, hash, 0) 

應該hashSize在函數完成時更新以包含實際的散列大小。

(我的VB是很生疏,所以道歉,對任何拼寫錯誤。)

+1

你的VB仍然有pollish,因爲這似乎正確= P。優秀。 – WhozCraig

+0

我不知道該如何謝謝你。我幾個小時都在苦苦掙扎。從未想過將ByRef更改爲ByVal for fileHandle。再次感謝arx。 –