; Win32 API - CryptHashCertificate验证文件MD5
; CryptHashCertificate,定义于Crypt32.dll中,函数原型如下:
#cs
BOOL WINAPI CryptHashCertificate(
__in HCRYPTPROV_LEGACY hCryptProv,
__in ALG_ID Algid,
__in DWORD dwFlags,
__in const BYTE *pbEncoded,
__in DWORD cbEncoded,
__out BYTE *pbComputedHash,
__inout DWORD *pcbComputedHash
);
#ce
; 返回值为布尔型,对应au3中的int。
; hCryptProv - 没有用处,留空。
; Algid - 指定验证方式,可以是MD5或者是SHA1或其他验证方式,如果是MD5,此处添$CALG_MD5 (0x8003)。
; dwFlags - 留空。
; *pbEncoded - 指针型,指向要验证的数据。
; cbEncoded - 要验证的数据的长度。
; *pbComputedHash - 指向一个缓存区,用于存放验证结果。
; *pcbComputedHash - 输入输出型参数,作为输入时,指定pbComputedHash结构的长度,作为输出时,此值被设为所需要的缓存区域的长度。
Const $CALG_MD2 = 0x8001
Const $CALG_MD4 = 0x8002
Const $CALG_MD5 = 0x8003
Const $CALG_SHA1 = 0x8004
$sFile = @WindowsDir & "\Explorer.exe" ; 指定要验证的文件。
$hFile = FileOpen($sFile, 16)
$bData = FileRead($hFile) ; 读取文件中的数据。
$iLength = BinaryLen($bData) ; 数据长度
FileClose($hFile)
; NOTE: 此处必须先要用FileOpen以2进制模式打开文件,否则编译后或者在SCITE中运行得到的结果将不正确。
$tBuffer = DllStructCreate("byte[" & $iLength & "]")
$pBuffer = DllStructGetPtr($tBuffer)
DllStructSetData($tBuffer, 1, $bData)
$iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _
"hWnd", 0, _ ; 留空。
"dword", $CALG_MD5, _ ; 以MD5方式验证。
"dword", 0, _ ; 留空。
"ptr", $pBuffer, _ ; 要验证的数据指针。
"dword", $iLength, _ ; 数据长度。
"ptr", 0, _ ; 输出结果,第一次调用传递空值,$iResult[7]被设为所需长度。
"dword*", 0) ; 此值被设为所需要的结构大小,因为也用作输出,所以加*。
$tResult = DllStructCreate("byte[" & $iResult[7] & "]") ; 定义一个如此长度的缓冲区,用于存放验证结果。
$pResult = DllStructGetPtr($tResult)
$iResult = DllCall("Crypt32.dll", "int", "CryptHashCertificate", _; 第二次调用,函数将结果填充到$tResult中。
"hWnd", 0, _
"dword", $CALG_MD5, _
"dword", 0, _
"ptr", $pBuffer, _
"dword", $iLength, _
"ptr", $pResult, _
"dword*", $iResult[7])
If $iResult[0] <> 0 Then Msgbox(0, $sFile, StringTrimLeft(DllStructGetData($tResult, 1), 2))
$tBuffer = 0
$tResult = 0