SNMP WinAPI - Conversion d'un code C++
Publié : mar. 04/févr./2020 8:15
Bonjour tout le monde !
Je souhaiterais pouvoir requêter des périphériques réseaux en SNMP v2.
J'ai déjà des programmes fonctionnels qui utilisent les exécutables issus de Net-Snmp mais je voudrais le faire sans passer par des applications externes. J'ai repéré quelques scripts en Purebasic où les gens recréent les paquets entièrement mais je n'ai rien trouvé de fonctionnel (ou bien je m'y suis mal pris)
Après quelques recherches, je me suis rendu compte que Windows a une API dédiée (jusqu'au v2c). J'ai fouiné et trouvé un code C++ plutôt bien foutu et pas trop compliqué :
https://github.com/microsoft/Windows-cl ... Helper.Cpp
https://github.com/microsoft/Windows-cl ... mpUtil.Cpp
https://github.com/microsoft/Windows-cl ... SnmpUtil.h
Le header pour toutes les déclarations des constantes et structures : http://www.naic.edu/~phil/hardware/vert ... /winsnmp.h
Et voici le code adapté en PureBasic : http://s000.tinyupload.com/?file_id=028 ... 9679928152
(2 fichiers de code et les 3 librairies indispensables)
Alors normalement vous devriez avoir un plantage au bout de quelques secondes. Plantage qui provient de la fonction SnmpRecvMsg() sur laquelle je coince complètement.
Par contre en utilisant Wireshark ou équivalent, vous verrez que la requête Snmp est bien envoyée et que le retour fonctionne aussi (pour l'instant je n'ai testé qu'un simple GET).
Voilà ! Maintenant j'espère que vous pourrez m'aider à débugger ce programme.
En vous remerciant.
PS : J'utilise PureBasic en 64bits sur un Windows 7, ce sont donc les librairies 64 bits.
Edit : En compilant en 32 bits sous Windows 7 32 bits, j'ai une erreur "Invalid memory access. (write error at address 1)" au même endroit. Mais le tool Variable Viewer m'indique que les pointeurs passés en paramètre de SnmpRecvMsg se sont bien remplis sauf le *pSession\hpdu que je n'arrive pas à vérifier. Il semblerait que le plantage vienne bien de cette variable qui n'arrive pas à être remplie en sortie de la fonction.
Edit2 : c'est bon j'ai trouvé pourquoi ça plantait : une histoire de pointeurs... Il ne reste plus qu'à formater correctement le résultat mais printf() avec des formats est utilisé et là je ne connais pas. Si vous avez une idée...
Je souhaiterais pouvoir requêter des périphériques réseaux en SNMP v2.
J'ai déjà des programmes fonctionnels qui utilisent les exécutables issus de Net-Snmp mais je voudrais le faire sans passer par des applications externes. J'ai repéré quelques scripts en Purebasic où les gens recréent les paquets entièrement mais je n'ai rien trouvé de fonctionnel (ou bien je m'y suis mal pris)
Après quelques recherches, je me suis rendu compte que Windows a une API dédiée (jusqu'au v2c). J'ai fouiné et trouvé un code C++ plutôt bien foutu et pas trop compliqué :
https://github.com/microsoft/Windows-cl ... Helper.Cpp
https://github.com/microsoft/Windows-cl ... mpUtil.Cpp
https://github.com/microsoft/Windows-cl ... SnmpUtil.h
Le header pour toutes les déclarations des constantes et structures : http://www.naic.edu/~phil/hardware/vert ... /winsnmp.h
Et voici le code adapté en PureBasic : http://s000.tinyupload.com/?file_id=028 ... 9679928152
(2 fichiers de code et les 3 librairies indispensables)
Alors normalement vous devriez avoir un plantage au bout de quelques secondes. Plantage qui provient de la fonction SnmpRecvMsg() sur laquelle je coince complètement.
Par contre en utilisant Wireshark ou équivalent, vous verrez que la requête Snmp est bien envoyée et que le retour fonctionne aussi (pour l'instant je n'ai testé qu'un simple GET).
Voilà ! Maintenant j'espère que vous pourrez m'aider à débugger ce programme.
En vous remerciant.
PS : J'utilise PureBasic en 64bits sur un Windows 7, ce sont donc les librairies 64 bits.
Edit : En compilant en 32 bits sous Windows 7 32 bits, j'ai une erreur "Invalid memory access. (write error at address 1)" au même endroit. Mais le tool Variable Viewer m'indique que les pointeurs passés en paramètre de SnmpRecvMsg se sont bien remplis sauf le *pSession\hpdu que je n'arrive pas à vérifier. Il semblerait que le plantage vienne bien de cette variable qui n'arrive pas à être remplie en sortie de la fonction.
Edit2 : c'est bon j'ai trouvé pourquoi ça plantait : une histoire de pointeurs... Il ne reste plus qu'à formater correctement le résultat mais printf() avec des formats est utilisé et là je ne connais pas. Si vous avez une idée...