2016-03-18 2 views
0

J'ai 2 structures de données à la fois dans mon injecteur et dll:C++ passer un lambda à partir d'une structure de données

struct SubData_t 
{ 
    int SubTest; 
}; 

struct DataHolder_t 
{ 
    int Test; 
    SubData_t SubData; 
}; 

Voici comment j'attribuer les valeurs de la structure de données:

DataHolder_t *DataHolder = new DataHolder_t(); 
DataHolder->Test = 123; 
DataHolder->SubData.SubTest = 456; 

int ResponseCode = Inject(4321, "test.dll", DataHolder); 

Et c'est une fonction LoadLibrary personnalisée qui transmet les données à l'exportation dll:

int Inject(DWORD ProcessId, char *DLLFile, DataHolder_t *Data) 
{ 
    // ... 
    LoadRemoteLibraryR(hProcess, lpBuffer, dwLength, NULL, 0xd13f5171 /* dllexport EntryPoint hash */, (LPVOID)Data, (DWORD)(sizeof(struct DataHolder_t) + 1)); 
    // ... 
} 

Puis-je obtenir les données dans l'exportation dll et assignez e Les valeurs de e de lpUserdata à la structure de données:

DLLEXPORT BOOL EntryPoint(LPVOID lpUserdata, DWORD nUserdataLen) 
{ 
    DataHolder_t *DataHolder = (struct DataHolder_t *)lpUserdata; 

    char buffer[100]; 
    sprintf(buffer, "%d | %d", DataHolder->Test, DataHolder->SubData.SubTest); 

    MessageBox(NULL, buffer, "Test", MB_OK); 

    return TRUE; 
} 

Cependant, je suis nouveau lambdas et ne peut pas comprendre comment (s'il est même possible) pour passer lambda (fonctions) de la même manière à l'exportation dll. Ou existe-t-il un autre moyen de transmettre les fonctions/la logique à l'exportation dll, afin qu'elles puissent être appelées à partir du processus cible auquel la DLL a été injectée?

Répondre

0

Utilisez l'effacement de type, comme std::function, ou un fac-similé raisonnable, et transmettez le paramètre effacé par type comme référence, au lieu de passer en valeur, pour de meilleurs résultats.

+0

Merci pour la réponse. Voulez-vous dire quelque chose comme ça par hasard? http://stackoverflow.com/questions/23962019/how-to-initialize-stdfunction-with-a-member-function –

+0

Vous êtes sur la bonne voie. Les réponses à cette autre question montrent plusieurs façons de le faire, que vous pouvez adapter à votre propre cas. –

+0

Bon à savoir, 'std :: bind' semble intéressant dans cette question particulière. Je vais essayer de chercher plus et tripoter autour. Merci pour une réponse rapide à nouveau! –