RtlCopyMemory() von Kernel32.dll richtig aufrufen



  • Hallo,
    ich möchte die Funktion RtlCopyMemory() der Kernel32 DLL aufrufen, jedoch ist die Funtion in "winnt.h" (Windows.h inkludiert) so deklariert: "#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))"

    Da ich aber die CRT nicht benutze, bekomme ich einen Fehler wegen der memcpy() Funktion.

    Wie kann ich also die richtige Funktion der Kernel32 DLL aufrufen?

    Benutze Visual Studio

    Vielen Dank



  • Gar nicht, da du wie schon richtig gesagt hast, es lediglich ein Makro ist. memcpy und memset kannst du dir auch einfach nachbauen. Zu beachten ist, dass beide funktion vom compiler generierte intrinsics sind, daher solltest du 'gesamte Programmoptimierung' (schalter /GL) ausstellen.

    #pragma function(memcpy)
    #pragma function(memset)
    extern "C" void* memset(void *d, int v, size_t l)
    {
    	char *e = (char*)d;
    	while(l --> 0)
    		*e++ = v;
    	return d;
    }
    extern "C" void* memcpy(void *d, const void *s, size_t l)
    {
    	char *e = (char*)d;
    	const char *f = (const char*)s;
    	while(l --> 0)
    		*e++ = *f++;
    	return d;
    }
    


  • Vielen Dank, ich wunder mich nur weshalb es so schwer sein muss, eine einfache Funktion einer DLL aufzurufen. Die Funktion ist ja ganz klar in der DLL definiert...



  • Sie ist eben nicht in kernel32.dll definiert, sondern ist lediglich ein Makro 😉



  • Wie kommst du auf die Idee, die Funktion aufrufen zu wollen?



  • Du hast recht, "Die Funktion ist ja ganz klar in der DLL definiert..." ist falsch.
    Danke dir, und hier hab ich mal ein freundlicheres memcpy herausgesucht http://www.danielvik.com/2010/02/fast-memcpy-in-c.html



  • Was meinst du mit freundlich?



  • Mechanics, ich wollte bytes aus einem input buffer in einen kleineren angepassten buffer kopieren. Das ganze findet in einer read-Funktion statt. Sollte eigentlich nichts besonderes sein.

    roflo, ich weiß, ist ein wenig komisch ausgedrückt und gibt sowieso nur wenige Situationen bei denen das eine Rolle spielt. Ich hab halt als ich das geschrieben habe an diese paar Sätze gedacht: "While this is pretty good for the Motorola processor, it is not very efficient on a PowerPC that does not have any instructions for post incrementing pointers. The PowerPC uses four instructions for the same task that only required one instruction on the Motorola processor." und "Unfortunately some processors have no instructions for either pre increment or post increment of pointers."



  • Windows läuft weder auf Motorolla, noch auf PowerPcs. Wenn man unter Windows entwickelt, warum sollte man die CRT nicht nutzen wollen?



  • Trojaner, Viren, superkleine programme. Bin grad selbst beim Thema 🙂



  • Geht mir nur darum, dass falls ich die Funktion mal brauche, sie auch mit mir herumtragen kann.
    Ich habe ja nichts gegen die Simplere.



  • In meinem kernel32.dll gibt es eine Funktion mit dem Namen RtlCopyMemory.



  • #ifdef RtlZeroMemory
    #undef RtlZeroMemory
    #endif
    DECLSPEC_IMPORT VOID WINAPI RtlCopyMemory(PVOID, PVOID, SIZE_T);
    


  • So natürlich, wie komm ich auf zero..

    Cu30p3 schrieb:

    #ifdef RtlCopyMemory
    #undef RtlCopyMemory
    #endif
    DECLSPEC_IMPORT VOID WINAPI RtlCopyMemory(PVOID, PVOID, SIZE_T);
    


  • roflo schrieb:

    while(l --> 0)
    		*e++ = v;
    
    while(l --> 0)
    		*e = v, e -=- true;
    


  • So natürlich, wie komm ich auf zero..

    Cu30p3 schrieb:
    C:
    #ifdef RtlCopyMemory
    #undef RtlCopyMemory
    #endif
    DECLSPEC_IMPORT VOID WINAPI RtlCopyMemory(PVOID, PVOID, SIZE_T);

    "Fehler LNK2019 Verweis auf nicht aufgel÷stes externes Symbol ""__declspec(dllimport) void __stdcall RtlCopyMemory(void *,void *,unsigned long)" (__imp_?RtlCopyMemory@@YGXPAX0K@Z)" in Funktion "_main"."

    Die anderen kernel Funktion funktionieren, kann also nicht am Linken liegen.



  • schreib extern "C" davor:

    extern "C"
    {
        DECLSPEC_IMPORT VOID WINAPI RtlCopyMemory(PVOID, PVOID, SIZE_T);
    }
    


  • "Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "__imp__RtlCopyMemory@12" in Funktion "_main""

    Außerdem sind die zwei auch immer dabei:
    "Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "@__security_check_cookie@4" in Funktion "_main""
    "Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "___security_cookie" in Funktion "_main""



  • Wenn du die CRT etc nicht mitlinkst sind die letzten beiden klar. Einfach in den Projekteinstellungen unter C++ alle sicherheitsüberprüfungen deaktivieren oder auf standard setzen.
    Edit: hab mir jetzt mal eigenhändigs die kernel32.dll unter die lupe genommen und siehe da, sie exportiert keine funktion 'RtlCopyMemory'.
    Aber 'RtlMoveMemory', was genau das gleiche macht.



  • Hab ich nach Biolunar's post auch gemacht, und jop, keine copy memory 😃


Log in to reply