Ah, je crois que j'ai trouvé :
kernel_LibsPtr renvoie un void*
Or tu stockes ce void* dans un *(long*), autrement dit, un long.
Essaie de caster la valeur de retour de kernel_LibsPtr en long explicitement.
*(long*)(((unsigned long)Data) + *Offset) = (long)kernel_LibsPtr(Descriptor, (short) *Func);PS : J'ai laissé ton signed long pour ne pas casser ta structure, mais c'est la mort dans l'âme...

(je n'avais pas vu que kernel_* renvoyait un pointeur)