2008-10-06 7 views
1

J'implémente un ioctl dans un pilote de périphérique Windows CE qui prend un pointeur vers une grande partie de la mémoire de l'application pour effectuer des E/S asynchrones initiées via un appel d'application à DeviceIoControl. Lors de l'utilisation de MapCallerPtr(), le pointeur n'est pas mappé lorsque la fonction XXX_IOControl renvoie; lorsque le pointeur est utilisé dans l'IST, il n'est plus mappé, ce qui entraîne un plantage.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?

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'il ait reçu une indication du conducteur que le pilote en a fini avec lui.

Ceci est sur Windows CE 5.0.

Répondre

1

répondre à ma propre question:

En XXX_IOControl, mappez le pointeur à l'aide MapPtrToProcess() et enregistrer les autorisations du fil à l'aide GetCurrentPermissions(). Dans le thread qui utilisera le pointeur mappé, appelez SetProcPermissions() avec la valeur de retour enregistrée à partir de GetCurrentPermissions(), les pointeurs de déréférencement, puis restaurez les autorisations de thread une fois terminé.

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