Wie Datei in den Speicher laden und die Adresse bekommen?



  • Hallo,
    ich arbeite im Moment an einem Programm, um in einem sog. RAM Dump nach Pointer zu suchen. Dabei möchte ich erst einen solchen Dump in den Speicher laden und alle möglichen Pointer auslesen. Dabei soll die Adresse, des ersten Bytes des Dumps in eine Variable gespeichert werden.

    Habe schon ein wenig selber experimentiert und kann den Dump mehr oder weniger öffnen. Er wird aber nicht in den Speicher geladen:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    	{
    		if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
    		{
    			System::IO::StreamReader ^sr = gcnew
    				System::IO::StreamReader(openFileDialog1->FileName);
    			MessageBox::Show("Dump loaded successfully");
    			sr->Close();
    
    			this->button1->Click += gcnew
    				System::EventHandler(this, &MyForm::button1_Click);
    		}
    	}
    

    Dass die Datei nicht geladen wird weiß ich, weil der belegte Platz im Arbeitsspeicher kaum zunimmt (obwohl der Dump über 900MB groß ist).
    Den Code dafür fand ich bei einer Hilfe-Seite von Microsoft.



  • Wenn du die Datei komplett in den Speicher laden möchtest, dann benutze

    array<Byte>^ content = File::ReadAllBytes(filename);
    

    PS: Und die Button-Click Zuweisung unten im Code ist überflüssig.



  • Th69 schrieb:

    Wenn du die Datei komplett in den Speicher laden möchtest, dann benutze

    array<Byte>^ content = File::ReadAllBytes(filename);
    

    Muss ich File und filename mit irgendwas ersetzen?

    Error C3861 'ReadAllBytes': identifier not found
    Error (active) name followed by '::' must be a class or namespace name
    Error (active) identifier "filename" is undefined
    Error C2653 'File': is not a class or namespace name
    Error C2065 'filename': undeclared identifier
    Warning C4829 Possibly incorrect parameters to function main. Consider 'int main(Platform::ArrayPlatform::String^^ argv)'



  • Da fehlt noch der Namespace (aber den gibt man hier im Forum selten an) - also entweder

    array<Byte>^ content = System::IO::File::ReadAllBytes(filename);
    

    oder aber oben in der Datei

    using namespace System::IO;
    

    Und selbstverständlich mußt du für 'filename' einen passenden Wert angeben. 😕

    Kennst du eigentlich schon den hier als "wichtig" markierten Artikel: Windows Forms und Visual C++ MACHT KEINEN SINN!?
    Da du anscheinend noch Anfänger bist, rate ich dir von C++/CLI ab (dies ist nur was für die Interop-Programmierung zwischen nativem C++ und .NET).

    PPS: Ich habe jetzt erst gelesen, daß deine Dump-Datei 900MB groß ist - da macht es aber keinen Sinn diese ganz in den Speicher zu laden...



  • Th69 schrieb:

    Da fehlt noch der Namespace (aber den gibt man hier im Forum selten an) - also entweder

    array<Byte>^ content = System::IO::File::ReadAllBytes(filename);
    

    oder aber oben in der Datei

    using namespace System::IO;
    

    Und selbstverständlich mußt du für 'filename' einen passenden Wert angeben. 😕

    Kennst du eigentlich schon den hier als "wichtig" markierten Artikel: Windows Forms und Visual C++ MACHT KEINEN SINN!?
    Da du anscheinend noch Anfänger bist, rate ich dir von C++/CLI ab (dies ist nur was für die Interop-Programmierung zwischen nativem C++ und .NET).

    Funktioniert super, danke!
    Wie kann ich nun die Adresse des ersten Bytes der geladenen Datei in eine Variable speichern?

    Den Artikel kenne ich und ich bin von CLI auch nicht gerade begeistert. Mit dem Programm möchte ich versuchen, mittels dem in der .asm Datei vorhandenen x64 Assembler-Code nach Pointer zu suchen, um in einem nützlichen Beispiel mit x64 Assembler vertrauter zu werden. (Auf ähnliche Art und Weise habe ich auch PPC Assembler gelernt 🙂 ).