Hallo,
ich habe ein Problem mit der Funktion _MD5ForFile aus der Hash.au3 einen MD5 Hash für größere (>1GB) Dateien zu erstellen. Die Funktion bricht immer mit dem Error 3 ab, was laut Beschreibung "3 - MapViewOfFile function or call to it failed" bedeutet. Ich habe schon einige Tests durchgeführt und festgestellt das es mit der RAM Größe im System zusammenhängt. Die Funktion versucht die gesamte Datei in den RAM zu laden um den Hash zu erstellen und wenn im PC nicht genügend RAM vorhanden ist, kommt diese Fehlermeldung. In der MSDN habe ich dann auch entsprechende Hinweise dazu gefunden.
http://msdn.microsoft.com/en-us/library/…1(v=vs.85).aspx
"For files that are larger than the address space, you can only map a small portion of the file data at one time. When the first view is complete, you can unmap it and map a new view"
Weiss einer von euch wie man diese Funktion so erweitert, dass sie die Dateien in kleineren Blöcken bearbeitet?
Vielen Dank schon mal...
; #FUNCTION# ;===============================================================================
;
; Name...........: _MD5ForFile
; Description ...: Calculates MD5 value for the specific file.
; Syntax.........: _MD5ForFile ($sFile)
; Parameters ....: $sFile - Full path to the file to process.
; Return values .: Success - Returns MD5 value in form of hex string
; - Sets @error to 0
; Failure - Returns empty string and sets @error:
; |1 - CreateFile function or call to it failed.
; |2 - CreateFileMapping function or call to it failed.
; |3 - MapViewOfFile function or call to it failed.
; |4 - MD5Init function or call to it failed.
; |5 - MD5Update function or call to it failed.
; |6 - MD5Final function or call to it failed.
; Author ........: trancexx
;
;==========================================================================================
Func _MD5ForFile($sFile)
Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _
"wstr", $sFile, _
"dword", 0x80000000, _ ; GENERIC_READ
"dword", 1, _ ; FILE_SHARE_READ
"ptr", 0, _
"dword", 3, _ ; OPEN_EXISTING
"dword", 0, _ ; SECURITY_ANONYMOUS
"ptr", 0)
If @error Or $a_hCall[0] = -1 Then
Return SetError(1, 0, "")
EndIf
Local $hFile = $a_hCall[0]
[/autoit][autoit][/autoit][autoit]$a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _
"hwnd", $hFile, _
"dword", 0, _ ; default security descriptor
"dword", 2, _ ; PAGE_READONLY
"dword", 0, _
"dword", 0, _
"ptr", 0)
If @error Or Not $a_hCall[0] Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
Return SetError(2, 0, "")
EndIf
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
[/autoit][autoit][/autoit][autoit]Local $hFileMappingObject = $a_hCall[0]
[/autoit][autoit][/autoit][autoit]$a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _
"hwnd", $hFileMappingObject, _
"dword", 4, _ ; FILE_MAP_READ
"dword", 0, _
"dword", 0, _
"dword", 0)
If @error Or Not $a_hCall[0] Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(3, 0, "")
EndIf
Local $pFile = $a_hCall[0]
Local $iBufferSize = FileGetSize($sFile)
Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
"dword buf[4];" & _
"ubyte in[64];" & _
"ubyte digest[16]")
DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))
[/autoit][autoit][/autoit][autoit]If @error Then
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(4, 0, "")
EndIf
DllCall("advapi32.dll", "none", "MD5Update", _
"ptr", DllStructGetPtr($tMD5_CTX), _
"ptr", $pFile, _
"dword", $iBufferSize)
If @error Then
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(5, 0, "")
EndIf
DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))
[/autoit][autoit][/autoit][autoit]If @error Then
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Return SetError(6, 0, "")
EndIf
DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))
[/autoit][autoit][/autoit][autoit]Return SetError(0, 0, $sMD5)
[/autoit][autoit][/autoit][autoit]EndFunc ;==>_MD5ForFile
[/autoit]