2010-11-09 43 views
1

Nous avons un protocole personnalisé NDIS et des pilotes de miniport pour Windows Mobile 6.5. Nous aimerions permettre à l'utilisateur de désinstaller proprement ces pilotes, cependant désinstaller donne actuellement l'erreur: "n'a pas été complètement supprimé. Voulez-vous l'enlever de la liste des programmes installés?" Cela est probablement dû au fait que les pilotes sont toujours utilisés (comme indiqué par Remote Process Viewer). Malheureusement, je ne peux pas comprendre comment décharger les pilotes (en supposant que ce soit le problème). Les pilotes sont pour le matériel qui est intégré à l'appareil, il est donc impossible de supprimer simplement le périphérique et les pilotes ont débarquéesMise à jour d'un pilote Windows Mobile

  1. Y at-il une méthode de programmation de déchargement d'un pilote?
  2. Y at-il autre chose que je devrais faire lors de la désinstallation pour désinstaller proprement les pilotes?

[edit] J'aurais probablement dû mentionner tout le problème quand j'ai écrit ceci. Je me soucie vraiment de la mise à jour du pilote. Je ne dois pas nécessairement désinstaller l'ancien pilote pour le faire.

Répondre

1

Vous pouvez probablement appeler DeactivateDevice, bien que vous ayez besoin du handle du pilote (de n'importe qui appelé ActivateDevice). Pour CE 5.0 et plus tôt, au moins pour les pilotes de flux, le gestionnaire de périphériques a effectivement mis cela dans le registre sous HKLM/Drivers/Active.

Je n'ai pas cherché NDIS car je n'ai jamais voulu en décharger un. Pour cela, vous devrez peut-être appeler DeviceIoControl sur le pilote NDIS avec IOCTL_NDIS_UNBIND_ADAPTER and/or IOCTL_NDIS_DEREGISTER_ADAPTER

+0

Intéressant. DeactiveDevice fonctionne certainement. Je me demande si cela causerait des problèmes pour l'utiliser dans un environnement de production. Je suppose que l'appelant de ActivateDevice pourrait s'attendre à être toujours là ... –

0

Une possibilité est de lancer un programme au démarrage de Windows Mobile qui supprimera l'ancien pilote et copiera le nouveau dans l'emplacement.

Ceci peut être accompli en utilisant HKEY_LOCAL_MACHINE\Init comme l'indique ici:

Voici un exemple de programme:

#include <windows.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    // delete the old driver 
    BOOL result = DeleteFile(L"\\Windows\\MyDriver.dll"); 
    if (result) 
    { 
     // put the new driver in place 
     result = MoveFile(L"\\My Documents\\MyDriver_NEW.dll", 
     L"\\Windows\\MyDriver.dll"); 
    } 

    // Delete us from the registry 
    HKEY regKey = 0; 
    LONG regResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"init", 0, KEY_SET_VALUE, &regKey); 
    result = regResult == ERROR_SUCCESS; 
    if (result) 
    { 
     regResult = RegDeleteValue(regKey, L"Depend19"); 
     result = regResult == ERROR_SUCCESS; 
     if (result) 
     { 
     regResult = RegDeleteValue(regKey, L"Launch18"); 
     result = regResult == ERROR_SUCCESS; 
     } 
     RegCloseKey(regKey); 
    } 

    // we need to tell WinCE we started properly 
    SignalStarted(_ttoi(argv[1])); 

    return 0; 
} 

Les valeurs de 'Launch18' et 'Depend19' seront probablement différentes sur votre plate-forme. Assurez-vous simplement que ce programme est exécuté avant device.exe.

Remarque: Sur de nombreuses plates-formes, ce programme doit être et signé et vos certificats doivent être installés sur l'appareil. Si ce n'est pas le cas, il ne fonctionnera pas.