2010-11-26 11 views
0

Je cherche à ce que mon programme lise une valeur d'une adresse de mémoire, et fasse un peu de travail basé sur la valeur de l'adresse. La façon dont je l'ai fait actuellement est que j'ai la méthode exécutée dans un temporisateur toutes les 50 millisecondes, où il lit l'adresse et fait le travail avec la valeur. Est-il possible que je pourrais accrocher sur l'adresse et ne pas avoir besoin de la minuterie, ou au moins lire l'adresse chaque fois qu'il est mis à jour?Est-il possible de lire une valeur de mémoire en temps réel?

+0

Est-ce une propriété ou est-ce simplement de la pure mémoire? (Peut-être écrit en code natif). S'il y a un setter, vous pouvez simplement appeler un événement dans le setter. – CodesInChaos

+0

C'est juste de la pure mémoire. C'est une valeur du plugin-conteneur que Firefox utilise pour ses plugins. – PuppyKevin

Répondre

1

Ancien problème de traction/poussée (Interruptions réalisées selon le même concept). Vous avez besoin d'un hook au niveau de l'OS lorsque Firefox écrit dans sa mémoire virtuelle. La technique est utilisée pour la tricherie de jeu. NtWriteVirtualMemory est un bon choix pour accrocher depuis que vous n'avez pas besoin d'un crochet global (il suffit de regarder Firefox). Habituellement, les hooks globaux à l'écriture de mémoire sont utilisés pour détecter l'injection de DLL (une défense faible contre la correction de la mémoire). Here vous pouvez trouver un article de dieu sur l'accrochage API.

1

Bien sûr, vous pouvez utiliser le modèle d'observateur see here. L'observateur exécutera un travail dès que la valeur changera.

+0

En C#, les événements sont essentiellement une version intégrée au langage du modèle d'observateur. Je recommande d'utiliser les fonctionnalités de langue intégrées au lieu de lancer votre propre "observateur" classique. –

+0

ok, je ne suis pas si famillirar avec C#, mais en fonction de l'objectif de toute cette application, il pourrait être amusant de l'implémenter à la main si c'est juste un projet de jouet. – benzen

2

Cela dépend de la façon dont les données sont écrites dans l'adresse mémoire. Si ce sont des données que votre programme écrit - vous pouvez facilement envelopper l'accès à cette mémoire avec une méthode ou une propriété (ce qui est une bonne idée de toute façon), et déclencher un événement quand il change. Au lieu d'interroger la valeur, vous pouvez simplement vous abonner à l'événement.

+0

Et si c'est de la mémoire que mon programme n'écrit pas? – PuppyKevin

+0

@PuppyKevin: Alors il va probablement exiger des sondages comme vous le faites maintenant .... –

0

Le système d'exploitation peut avoir des hooks de débogueur dans lesquels vous pouvez immédiatement intercepter toute écriture sur la page de mémoire virtuelle où réside la variable d'intérêt.