J'ai une application Windows qui doit être exécutée en 32 bits (en raison d'autres limitations hors de mon contrôle). Cependant, mon application doit appeler et accéder à un pilote qui peut être 32 bits ou 64 bits selon le système sur lequel il est installé.Utilisation d'un pilote 64 bits à partir d'une application 32 bits
J'accède au pilote via des appels DeviceIoControl(), en échangeant des structures de données déclarées dans un fichier include. Les structures de données contiennent des champs déclarés comme "DWORD_PTR" (le fichier d'inclusion que je ne contrôle pas non plus). Mon problème est que sur un système de 64 bits, le pilote s'attend à ce que les structures contiennent un entier de 64 bits (à cause de la déclaration DWORD_PTR). Cependant, mon programme 32 bits voit ces DWORD_PTR comme des entiers de 32 bits. J'ai alors une discordance de données entre ma version de programme des structures de données et la compréhension du conducteur de ces structures.
DeviceIoControl() échoue avec ERROR_INSUFFICIENT_BUFFER (La zone de données transmise à un appel système est trop petite). J'ai confirmé que je ne reçois pas cette erreur si je passe une version 64 bits des structures au pilote.
J'ai quelques options laids de ce gâchis. Mais je me demande si quelqu'un a de meilleures suggestions?
Solution:
- déclarer une nouvelle copie des structures partagées avec de vrais champs de données 64-bits (__int64)
- vérifier dynamiquement l'architecture du système d'exploitation (32/64)
- Utilisation la version 32 bits ou 64 bits des structures pour les appels DeviceIoControl().
Inconvénients:
- I doivent conserver une copie explicite 64 bits de la déclaration de structures manuellement. Cela peut être une douleur avec le temps.
Mes autres solutions sont la variation de celle-ci, mais ils toujours impliquent maintenant une copie de la définition des structures (par exemple dans un IDL pour les serveurs COM en option).
Modifier: Ceci est un pilote Microsoft et il semble qu'il n'utilise pas IoIs32bitsProcess (irp)!
Je ne contrôle pas le pilote. IoIs32BitProcess() est appelé à partir du pilote, pas de mon application. Évidemment, non parce que j'obtiens des codes d'erreur ERROR_INSUFFICIENT_BUFFER (La zone de données passée à un appel système est trop petite.) –
Oh si vous n'avez pas le contrôle sur le code source du pilote, vous devez avoir accès aux déclarations de structure pilote fournit. S'ils ne fournissent rien, vous devez expérimenter avec des structures 32 bits et 64 bits. –
Ils fournissent des déclarations de structure. Mais ils déclarent les champs comme DWORD_PTR. Donc, je suis fondamentalement bloqué avec ma solution laide. Je travaille, je l'ai testé, mais j'espérais quelque chose de plus propre. –