2 Stimmen

Funktioniert RTLCopyMemory unter Vista?

Ich habe festgestellt, dass RTL Verschieben Der Speicher scheint gut zu funktionieren. Aber wenn ich versuche, RTL zu verwenden Kopieren Erinnerung, die ich bekomme: "Kann den DLL-Einstiegspunkt RtlCopyMemory in kernel32 nicht finden". Hier ist meine Deklaration:

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlCopyMemory" ( _
    ByVal dest As Long, _
    ByVal source As Long, _
    ByVal bytLen As Long)

5voto

Aaron Klotz Punkte 10727

RtlCopyMemory es inline bereitgestellt . Sie ist definiert in winnt.h als memcpy . Das bedeutet, dass sie nicht in einer Win32-DLL enthalten ist, sondern Teil der C-Laufzeitbibliothek ist. Sie könnten versuchen zu importieren memcpy de c:\windows\system32\msvcrt.dll .

3voto

MarkJ Punkte 29670

Warum verwenden Sie nicht einfach RtlMoveMemory ? Es funktioniert genau wie RtlCopyMemory mit dem Unterschied, dass es mit überlappendem Speicher anders umgeht.

Bruce McKinney Pionierarbeit geleistet die Verwendung von RtlMoveMemory vor über 10 Jahren und es ist Standard für das Kopieren von VB6-Speicher seither.

1voto

GiM Punkte 430

Ich weiß, dass dies eine alte Frage ist, aber ich hatte das gleiche Problem, also dachte ich, ich könnte antworten.

RtlCopyMemory in kernel32.dll sollte ein Weiter exportieren in ntdll, aber irgendwie Jungs bei MS Das habe ich verpasst auf der x64-Version von Vista (ich weiß nicht, wie es auf x86 ist) (siehe unten).

Sie können versuchen, es direkt aus ntdll zu importieren, wenn es nur für Ihre Bedürfnisse ist.

EDIT: die Methode, die ich meine, wird nicht exportiert, aber mit Symbols ist sie in ntdll sichtbar als RtlCopyMemoryNonTemporal

EDIT2: Nur um sicherzugehen, dass ich einige Dinge überprüft habe, hier die Zusammenfassung:

  • sowohl RtlCopyMemory als auch RtlCopyMemoryNonTemporal werden von ntdll.dll in x64-Vista exportiert (einfach, SP1, SP2)
  • es gibt eine Exportweiterleitung für RtlCopyMemory in kernel32.dll in x64 Vista's
  • Es gibt nicht exportiert RtlCopyMemoryNonTemporal in ntdll.dll in x86 Vistas

So sollte es sein, wenn Sie eine x64-Anwendung schreiben.

P.S. Ich war falsch über x64 vs x86, weil ich x86 app kompiliert wurde, und es auf x64 (WOW-Modus) ausgeführt, also verwendete sie die 32-Bit-Version von kernel32 und ntdll und nicht die x64-Version.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X