Comment lire une valeur d’une adresse codée en dur en C ++?

Je cherche à lire la valeur qui se trouve dans l’adresse 302H. Le but est de lire une entrée du matériel (une partie d’une stack de 104pc). Lorsque Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302. le code suivant, obtenez cette erreur: Unhandled exception at 0x004134b9 in setOutput.exe: 0xC0000005: Access violation reading location 0x00000302.

 #include  #define PORTBASE 0x302 int _tmain(int argc, char *argv[]) { int value; int volatile * port = (int *) PORTBASE; printf("port = %d\n", port); value = *port; printf("port value = %d\n", value); } 

MODIFIER:

Je cours ce sous veuves xp. Seule la documentation que je peux trouver sur le tableau est ci-dessous entrez la description de l'image ici

MODIFIER:

D’après vos réponses ci-dessous, je constate que je dois écrire un pilote pour le tableau. Quelqu’un peut-il m’indiquer une ressource sur la façon de le faire?

Pour accéder à la mémoire physique directement sous Windows, vous devez développer un pilote. Je vous suggère de lire sur l’ espace d’adressage virtuel pour savoir pourquoi. La nouvelle: Les adresses mémoire que vous voyez à partir d’un processus en mode utilisateur n’ont aucun lien avec les adresses en mémoire physiques, et les adresses où le matériel vit sont protégées par le système d’exploitation afin d’empêcher les applications en mode utilisateur de gâcher des choses.

Je suppose que votre programme fonctionne en tant qu’utilisateur normal. Pour vous éviter d’endommager le système d’exploitation et de le faire planter, les systèmes d’exploitation et les processeurs modernes vous empêchent d’accéder à de la mémoire qui n’appartient pas à votre programme.

Pour accéder à cette mémoire de périphérique, vous devrez exécuter le mode CPU du kernel plutôt que le mode utilisateur. Le moyen habituel d’utiliser de tels périphériques consiste à écrire un pilote de périphérique de bas niveau qui s’exécute en mode kernel et à l’utiliser comme interface avec votre programme en mode utilisateur.

Vous n’êtes pas autorisé à accéder au matériel directement à partir d’un programme en mode utilisateur. Vous avez besoin d’un pilote de périphérique pour cela.

Le matériel n’est-il pas accompagné de logiciels à installer? Consultez la documentation du logiciel pour savoir comment l’appeler.

Il existe plusieurs pilotes prêts à l’emploi permettant aux applications en mode utilisateur de lire et d’écrire des ports IO; l’un des plus connus est inpout32.dll , d’autres sont mentionnés ici . Pour les trouver, une bonne clé de recherche est “write parallel port NT” (puisqu’ils sont le plus souvent utilisés pour cette tâche).

En général, ils fonctionnent en chargeant un pilote en mode kernel (action nécessitant des privilèges d’administrateur), puis en l’appelant à partir de usermode chaque fois que vous appelez la fonction dll pour effectuer une lecture / écriture.

Notez cependant que la plupart de ces bibliothèques ne disposent d’aucune forme de contrôle d’access. Ainsi, en chargeant leur pilote, vous autorisez en réalité toute application connaissant son utilisation à lire / écrire sur des ports d’E / S, ce qui constitue une véritable sécurité. risque.

Bien sûr, si vous voulez tout faire, vous pouvez télécharger Windows Device Driver SDK