Windows mobile 更新Windows Mobile驱动程序

Windows mobile 更新Windows Mobile驱动程序,windows-mobile,device-driver,Windows Mobile,Device Driver,我们为Windows Mobile 6.5提供了自定义NDIS协议和微型端口驱动程序。我们希望允许用户干净地卸载这些驱动程序,但是卸载当前会出现错误:“未完全删除。是否要将其从已安装程序列表中删除?”这可能是因为驱动程序仍在使用中(如远程Process Viewer所报告的)。不幸的是,我不知道如何卸载驱动程序(假设这就是问题所在)。驱动程序用于设备内置的硬件,因此不可能简单地删除设备并卸载驱动程序 是否有卸载驱动程序的编程方法 在卸载时,我还应该做些什么来彻底卸载驱动程序 [编辑] 我写这篇文

我们为Windows Mobile 6.5提供了自定义NDIS协议和微型端口驱动程序。我们希望允许用户干净地卸载这些驱动程序,但是卸载当前会出现错误:“未完全删除。是否要将其从已安装程序列表中删除?”这可能是因为驱动程序仍在使用中(如远程Process Viewer所报告的)。不幸的是,我不知道如何卸载驱动程序(假设这就是问题所在)。驱动程序用于设备内置的硬件,因此不可能简单地删除设备并卸载驱动程序

  • 是否有卸载驱动程序的编程方法
  • 在卸载时,我还应该做些什么来彻底卸载驱动程序
  • [编辑]
    我写这篇文章的时候应该提到整个问题。我真的很关心更新驱动程序。我不一定要卸载旧的驱动程序才能做到这一点。

    您可能可以调用DeactivateDevice,但您需要有驱动程序的句柄(来自任何调用ActivateDevice的人)。对于CE 5.0及更早版本,至少对于流驱动程序,设备管理器实际上将其放在注册表的
    HKLM/drivers/Active


    我没有寻找NDI,因为我从来没有想过要卸载一个。为此,您可能需要使用

    向NDIS驱动程序调用DeviceIoControl,您可能可以调用DeactivateDevice,但您需要有驱动程序的句柄(来自任何调用ActivateDevice的人)。对于CE 5.0及更早版本,至少对于流驱动程序,设备管理器实际上将其放在注册表的
    HKLM/drivers/Active


    我没有寻找NDI,因为我从来没有想过要卸载一个。为此,您可能需要使用

    对NDIS驱动程序调用DeviceIoControl,一种可能是在Windows Mobile启动时启动一个程序,删除旧驱动程序并将新驱动程序复制到位

    这可以使用
    HKEY\U LOCAL\U MACHINE\Init
    完成,如下所述:

    以下是一个示例程序:

    #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;
    }
    
    #包括
    int _tmain(int argc,_TCHAR*argv[]
    {
    //删除旧驱动程序
    BOOL result=DeleteFile(L“\\Windows\\MyDriver.dll”);
    如果(结果)
    {
    //将新的驱动程序安装到位
    结果=移动文件(L“\\My Documents\\MyDriver\u NEW.dll”,
    L“\\Windows\\MyDriver.dll”);
    }
    //将我们从注册表中删除
    HKEY regKey=0;
    LONG regResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L“init”,0,KEY_SET_VALUE,®Key);
    结果=重新结果==错误\成功;
    如果(结果)
    {
    regResult=RegDeleteValue(regKey,L“Depend19”);
    结果=重新结果==错误\成功;
    如果(结果)
    {
    regResult=RegDeleteValue(regKey,L“Launch18”);
    结果=重新结果==错误\成功;
    }
    RegCloseKey(regKey);
    }
    //我们需要告诉WinCE我们启动正确
    信号启动(ttoi(argv[1]);
    返回0;
    }
    
    “Launch18”和“Depend19”的值在您的平台上可能会有所不同。只需确保此程序在device.exe之前运行


    注意:在许多平台上,此程序必须签名,并且您的证书需要安装在设备上。如果没有,则不会运行。

    一种可能是在Windows Mobile启动时启动一个程序,删除旧驱动程序并将新驱动程序复制到位

    这可以使用
    HKEY\U LOCAL\U MACHINE\Init
    完成,如下所述:

    以下是一个示例程序:

    #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;
    }
    
    #包括
    int _tmain(int argc,_TCHAR*argv[]
    {
    //删除旧驱动程序
    BOOL result=DeleteFile(L“\\Windows\\MyDriver.dll”);
    如果(结果)
    {
    //将新的驱动程序安装到位
    结果=移动文件(L“\\My Documents\\MyDriver\u NEW.dll”,
    L“\\Windows\\MyDriver.dll”);
    }
    //将我们从注册表中删除
    HKEY regKey=0;
    LONG regResult=RegOpenKeyEx(HKEY_LOCAL_MACHINE,L“init”,0,KEY_SET_VALUE,®Key);
    结果=重新结果==错误\成功;
    如果(结果)
    {
    regResult=RegDeleteValue(regKey,L“Depend19”);
    结果=重新结果==错误\成功;
    如果(结果)
    {
    regResult=RegDeleteValue(regKey,L“Launch18”);
    结果=重新结果==错误\成功;
    }
    RegCloseKey(regKey);
    }
    //我们需要告诉WinCE我们启动正确
    信号启动(ttoi(argv[1]);
    返回0;
    }
    
    “Launch18”和“Depend19”的值在您的平台上可能会有所不同。只需确保此程序在device.exe之前运行


    注意:在许多平台上,此程序必须签名,并且您的证书需要安装在设备上。如果没有,它就不会运行。

    很有趣。无效设备当然有效。我想知道在生产环境中使用它是否会导致任何问题。我想调用ActivateDevice的人可能会认为它仍然在那里……很有趣。无效设备当然有效。我想知道在生产环境中使用它是否会导致任何问题。我想ActivateDevice的调用方可能希望它仍然存在。。。