1 votes

Comment mapper la mémoire de l'appelant dans un pilote de périphérique Windows CE après la fin d'un appel à XXX_IOControl ?

J'implémente une ioctl dans un pilote de périphérique Windows CE qui prend un pointeur sur un gros morceau de mémoire d'application pour effectuer des E/S asynchrones initiées par un appel de l'application à DeviceIoControl.

Lors de l'utilisation de MapCallerPtr(), le pointeur n'est plus mappé lorsque la fonction XXX_IOControl est renvoyée ; lorsque le pointeur est utilisé dans l'IST, il n'est plus mappé, ce qui entraîne un plantage.

Quelle est la meilleure façon de mapper le pointeur au-delà de la fin de l'appel à XXX_IOControl ? L'application garantit que la mémoire restera valide jusqu'à ce qu'elle reçoive une indication du pilote que ce dernier en a terminé avec elle.

Il s'agit de Windows CE 5.0.

1voto

janm Points 9310

Je réponds à ma propre question :

Dans XXX_IOControl, mappez le pointeur à l'aide de MapPtrToProcess() et enregistrez les autorisations du thread à l'aide de GetCurrentPermissions(). Dans le thread qui utilisera le pointeur mappé, appelez SetProcPermissions() avec la valeur de retour sauvegardée de GetCurrentPermissions(), déréférencez les pointeurs, puis restaurez les permissions du thread lorsque vous aurez terminé.

DWORD saved_perms = SetProcPermissions(caller_perms);
... Do stuff ...
SetProcPermissions(saved_perms);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X