Eher Native API -> LdrGetProcedureAddress()



  • Hallo,

    wenn ich einen Funktionstypen wie folgt habe:

    typedef PKBDTABLES (*KBDLAYERDESCRIPTOR)(VOID);
    

    ... und mithilfe der Funktion:

    NTSYSAPI 
    NTSTATUS
    NTAPI
    LdrGetProcedureAddress(
    	IN HANDLE         ModuleHandle,
    	IN PANSI_STRING   FunctionName OPTIONAL,
    	IN WORD           Ordinal OPTIONAL,
    	OUT PVOID		*FunctionAddress
    	);
    

    ... dessen Adresse erhalten möchte, wie müßte dann der Aufruf:

    KBDLAYERDESCRIPTOR KbdLayerDescriptor;
    LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)KbdLayerDescriptor);
    

    ... korrekt aussehen? Ich denke, daß ich irgendwo noch einen Indirector o.ä. einfügen muß. Das habe ich auch an verschiedenen möglichen und unmöglichen Stellen probiert, aber geholfen hat's nicht. Also irgendein Problem mit Pointer referenzieren/dereferenzieren scheint mir hier die Ursache zu sein.



  • Habe jetzt ein wenig rumgeschweinert und es zumindest zum Laufen gebracht.
    Allerdings würde mich die korrekte Schreibweise noch stark interessieren.
    Ich habe jetzt einfach einen Pointer auf einen Pointer deklariert.
    Dann rufe ich diesen Pointer als Funktion gecastet auf:

    typedef PKBDTABLES (*KBDLAYERDESCRIPTOR)(VOID);
    
    int mymain(int argc, char* argv[])
    {
    	UNICODE_STRING usBla;
    	ANSI_STRING asFunction;
    	HANDLE hModule;
    	KBDLAYERDESCRIPTOR KbdLayerDescriptor;
    	PVOID *X;
    	PKBDTABLES Desc;
    
    	RtlInitUnicodeString(&usBla, L"kbdus.dll");
    	LdrLoadDll(NULL, 0, &usBla, &hModule);
    
    	RtlInitAnsiString(&asFunction, "KbdLayerDescriptor");
    	LdrGetProcedureAddress(hModule, &asFunction, 0, X);
    	printf("%8.8X\n", (DWORD)*X);
    	Desc = ((KBDLAYERDESCRIPTOR)*X)();
    	printf("%4.4X\n", *Desc->pusVSCtoVK);
    	printf("%2.2X\n", Desc->bMaxVSCtoVK);
    	printf("%8.8X\n", (DWORD)Desc);
    }
    

    Wie kann ich aber sofort nen korrekten Cast hinbekommen, so daß ich die
    Variable "KbdLayerDescriptor" benutzen kann???



  • (void **)&KbdLayerDescriptor funktioniert.



  • LOL -> Jetzt haben wir den C/C++ Programmierern mal gezeigt, was Delphi Programmierer können oder wie? das die Lösung von jemanden kam, der auch C/C++ beruflich macht, verschweigen wir einfach mal. 😃


Anmelden zum Antworten