Funktionsoffset herauskriegen.



  • Hallo Forum,

    wie kriege ich zu einer Klasse den Offset heraus?

    ITaskScheduler *pITS;
    pITS->Release();
    

    Diese Funktion möchte ich mit der Api Funktion DispCallFunc starten. Diese Funktion benötigt als Erstes die Instanz der Klasse (einen Pointer auf das Objekt) und als Zweites den Offset zur Funktion. Wie kriege nun diesen Offset heraus?

    Viele Grüße

    Peter



  • Ich benötige keinen Sourcecode. Nur eine Möglichkeit wie ich es überhaupt herausbekomme. Bei einfachen Klassen zählt man einfach per pro Funktion um 4 Bytes hoch. Aber hier ist ein Interface dazwischen...



  • Hm, &its->Release müsste die Adresse der Funktion sein,
    jetzt müsstest du nur noch das mit dem Anfang der Klasse verrechnen.



  • Hallo devil81,

    erstmal vielen Dank für den Tip:-) Mit dem Ampersand direkt hat es noch nicht funktioniert.

    ITaskScheduler *pITS;
    unsigned long (__stdcall IUnknown::*funcp)(); 
    funcp=pITS->Release;
    

    Aber so geht es...

    Peter



  • Den Funktionsoffset habe ich jetzt so ermittelt. Könnte es sein das er wirklich "889631" ist? Wenn ich diesen Offset der Api Funktion DispCallFunc gebe schmiert mir das Programm ab. Bzw unhandeled exception...

    #include "stdafx.h"
    #include <windows.h>
    #include <objbase.h>
    #include <initguid.h>
    #include <ole2.h>
    #include <mstask.h>
    #include <msterr.h>
    #include <objidl.h>
    #include <wchar.h>
    #include <stdio.h>
    
    int main(int argc, char **argv) {
      ITaskScheduler *pITS;
    
      // Init
      CoInitialize(NULL);
      CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void **) &pITS);
    
      // Set the pointer.
      unsigned long (__stdcall ITaskScheduler::*funcp)(); 
      funcp=pITS->Release;
      // Look for offset in debug window.
    
      // pITS->Release();  <- This function has to be called via DispCallFunc.
      DispCallFunc(pITS, 0x000D931F, CC_STDCALL, 3, 0, 0, 0, retval);
    
      return 0;
    }
    

    Errechnung des Funktionsoffsets. Zahlen sind aus dem Debug Window entnommen und in den Funktionsaufruf von DispCallFunc eingesetzt.
    0x0040100f - 0x00327cf0
    = 0x000D931F
    = 889631



  • Sicher das es das Offset ist was du übergeben musst ?



  • Ich denke schon: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/automat/htm/chap5_6jc3.asp

    HRESULT DispCallFunc(
    void * pvInstance,
    ULONG_PTR oVft,
    CALLCONV cc,
    VARTYPE vtReturn,
    UINT cActuals,
    VARTYPE * prgvt,
    VARIANTARG ** prgpvarg,
    VARIANT * pvargResult);

    Parameters

    pvInstance: Pointer to an instance of the interface described by this type description.
    oVft: For FUNC_VIRTUAL functions, specifies the offset in the VTBL.
    cc: The calling convention. One of the CALLCONV values, such as CC_STDCALL.
    vtReturn: The variant type of the function return value. DispCallFunc uses VT_EMPTY to represent void.
    cActuals: The number of function parameters.
    prgvt: An array of variant types of the function parameters.
    prgpvarg: The function parameters.
    pvargResult: The function result.

    The return value obtained from the returned HRESULT is one of the following:
    S_OK Success.
    E_INVALIDARG One of the arguments was invalid.
    E_POINTER Function address was NULL


Anmelden zum Antworten