MD5 Hash einer dll errechnen
-
@xenayoo:
Memmory Mapping bedeuted, dass die Datei geöffnet wird und dann in den Speicher gemappt wird. Heißt: Du greifst auf eine Speicheraddresse zu, aber der Zugriff wird in die Datei weitergeleitet (genau genommen ist es noch etwas komplizierter, du greifst auf den Speicher zu und die Daten werden verzögert beim schließen oder beim Aufruf einer bestimmten Funktion (Name fällt mir grad nicht ein) zurückgeschrieben).
Funktionieren tut das mit den Funktionen CreateFile, CreateFileMapping und MapViewOfFile.Aber wenn du dich schon vor CreateFile zurückschreckst, bin ich mir nicht sicher, ob dir das jetz schon zumutbar ist. LoadLibrary ist wie bereits von dot erwähnt keine gute Lösung.
-
Hallo, danke für die Hilfe bis jetzt.
Das LoadLibrary() habe ich in einigen Internetbeiträgen so gesehen. Jedoch ist die Erklärung von dot einleuchtend und so will ich mich mal an CreatFile()heranwagen. Mein Problem ist halt, dass ich mit den MSDN-Beiträgen oft nach Stunden nur teilweise etwas anfangen kann. Z.B. sieht mein Code bis jetzt so aus:
#include <windows.h> ...... int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HANDLE hFile; hFile = CreateFile("AvgRa32.dll", // Filename GENERIC_READ, // Zugriffsmodus FILE_SHARE_READ, // auch andere können die Datei Lesen NULL, // Sicherheitsattribute OPEN_EXISTING, // existierende Datei öffnen 0, // Flags und Attribute NULL); // Handle zu einer Schablonendatei... if(hFile != INVALID_HANDLE_VALUE) { DWORD dwFileSize; dwFileSize = GetFileSize( hFile, NULL); if(dwFileSize != 0xFFFFFFFF) { ..... } } CloseHandle(hFile); }
Ich darf mal an dieser Stelle auf meine Verwendung von GetFileSize hindeuten. Das sieht etwas anders aus.
DWORD dwHigh, dwLow; dwLow = GetFileSize( hFile, &dwHigh);
Ich habe zwar schon gelesen, dass es da wohl zwei unterschiedliche Angaben (High und Low) gibt, aber ich kann nichts damit anfangen.
Frage ist jetzt: Wie geht es weiter? Ich habe einmal das Hndle hFile und je nachdem welche Variante ich nehme entweder nur den Low-Wert in Bytes oder den Low-Wert und den HighWert. Wenn ich das richtig verstehe, benötige ich noch die Startadresse im Speicher. Dafür muss die dll nicht nur geöffnet sondern auch geladen werden....
Jens
-
xenayoo schrieb:
Ich habe zwar schon gelesen, dass es da wohl zwei unterschiedliche Angaben (High und Low) gibt, aber ich kann nichts damit anfangen.
Die beiden ergeben zusammen die Länge bei sehr grossen Dateien
ULARGE_INTEGER zahl; zahl.LowPart = highpart; zahl.HighPart = lowpart;
Für kleine Dateien kannst Du es so lassen wie es ist.
Den Anfang hast Du ja jetzt schon, einfach nach Anleitung weitermachen:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366542(v=vs.85).aspx
-
Wenn man es einfach nur verwenden will geht auch:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380(v=vs.85).aspx
-
So ein geschiss für eine DLL zu hashen... hajaiai
-
_hmmm schrieb:
So ein geschiss für eine DLL zu hashen... hajaiai
Besseren Vorschlag?
-
Jonas OSDever schrieb:
Besseren Vorschlag?
Da es sich vermutlich eher um eine kleinere Datei handelt, die zudem nur einmal
zum Prozessstart getestet werden soll (und dann nie mehr) ist es wohl
tatsächlich ok die Datei zu öffnen, die Grösse zu ermitteln und dann alles als
Block in den Speicher zu laden.1. CreateFile (alias OpenFile) 2. GetFileSize 3. GlobalAlloc 4. ReadFile 5. CloseHandle 6. Prüfsumme berechnen 7. GlobalFree
Also das Beispiel von Microsoft mit dynamisch allokiertem Speicher.
-
_hmmm schrieb:
So ein geschiss für eine DLL zu hashen... hajaiai
Für jemanden, der alles kann und weiß ist das sicher alles 'geschiss'. Ich will damit primär etwas lernen. Ich hoffe, du erlaubst mir das, Danke.
-
Da es sich vermutlich eher um eine kleinere Datei handelt, die zudem nur einmal
zum Prozessstart getestet werden soll (und dann nie mehr) ist es wohl
tatsächlich ok die Datei zu öffnen, die Grösse zu ermitteln und dann alles als
Block in den Speicher zu laden.1. CreateFile (alias OpenFile) 2. GetFileSize 3. GlobalAlloc 4. ReadFile 5. CloseHandle 6. Prüfsumme berechnen 7. GlobalFree
Also das Beispiel von Microsoft mit dynamisch allokiertem Speicher.[/quote]
Dazu hätte ich zwei Fragen:
Zum einen Was sind kleine Dateien bzw. ab wann spricht man von großen Dateien? (Ich vermute die Grenze liegt hier im maximalen Wert von DWORD -> 4.294.967.295).
Die zweite Frage: Wie würde man es denn mit großen Dateien machen? Häppchenweise laden?Danke und schönes Wochenende
Jens
-
xenayoo schrieb:
Dazu hätte ich zwei Fragen:
Zum einen Was sind kleine Dateien bzw. ab wann spricht man von großen Dateien? (Ich vermute die Grenze liegt hier im maximalen Wert von DWORD -> 4.294.967.295).Das muss man wohl relativ zu den vorhandenen Resourcen sehen.
dabei sollte man natürlich nicht von seinem möglicherweise gut ausgestatteten
Entwicklersystem ausgehen sondern von dem System was man als Minimum-Anforderung
definiert.Dabei ist zu unterscheiden ob die Daten auf dem Stack, auf dem Heap auf einem
deutlich langsameren Ort (Festplatte, NAS, ..) liegen sollen oder können.Wenn man von einem 32Bit Prozess ausgeht würden tatsächlich Dateien von mehr als 4GB nicht mehr am Stück nutzbar sein, da ein Pointer ja bekanntlich nur 32Bit lang ist.
Unter Windows XP (mit 32 bit) hat das ganze System insgesammt weniger als 4GB
physikalischen Speicher zu Verfügung. Das System würde also relativ schnell
Teile auf die Festplatte auslagern.xenayoo schrieb:
Die zweite Frage: Wie würde man es denn mit großen Dateien machen? Häppchenweise laden?
Wenn man davon ausgeht das man einen 64Bit (oder mehr) Prozess hat und genügend
Arbeitsspeicher, könnte man alles "am Stück" verarbeiten.Bei sehr grossen Dateien wäre es wohl besser (notwendig) die Daten in Blöcken
zu verarbeiten. Dabei ist es egal ob man eine Datei mit ReadFile() fortlaufend
liest oder den View auf einem MemoryMapped File verschiebt [MapViewOfFile()].Im Fall einer DLL ist aber vermutlich die Datei eher klein (wenige kByte).