Mass_Storage_Class和Serial_Class模式问题

lfc311   2008-10-27 13:30 楼主
我写了个应用程序,通过写注册表来实现这两种模式的切换,应用程序的代码是:
[code]
const TCHAR szregRootKey[] = TEXT("Drivers\USB\FunctionDrivers");
const TCHAR szregDefaultClientDriver[] = TEXT("Mass_Storage_Class");

        long lResult = 0;       
        lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szregRootKey, 0, KEY_ALL_ACCESS, &hDrvKey);
        if(ERROR_SUCCESS == lResult)
        {       
                WRITE_REG_SZ(L"DefaultClientDriver",szregDefaultClientDriver);                       
        }
        RegCloseKey(hDrvKey);
        KernelIoControl (IOCTL_HAL_REBOOT,NULL,0,NULL,0,NULL);

可是系统重新启动的时候还是不能切换,我已经把注册表信息
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
           "DefaultClientDriver"=- ; erase previous default
           "DefaultClientDriver"="Serial_Class"
          
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
        ;"DefaultClientDriver"=- ; erase previous default
        ; "DefaultClientDriver"="Mass_Storage_Class"
添加到HIVE BOOT SECTION和END HIVE BOOT SECTION之间了~~
请教高手

回复评论 (14)

怎么没有人回答啊~~~
点赞  2008-10-27 14:30
这个以前试过,应该是可以的。
首先确认你做的修改保存住了,
然后两种模式都能工作。
点赞  2008-10-27 14:44
“首先确认你做的修改保存住了,”什么意思?
点赞  2008-10-27 14:45
怎么确认?
点赞  2008-10-27 14:46
用注册表工具看啊,PB不是有远程工具吗?
点赞  2008-10-27 14:59
可以切换的,而且应该不需要重起吧,动态的切换
RegCloseKey(hDrvKey);
KernelIoControl (IOCTL_HAL_REBOOT,NULL,0,NULL,0,NULL);
在重起前是不是要刷注册表到文件系统中,有个函数叫FlushRegistry还是别的,查一下帮助文档吧
或者是注册表中把相应的项置上,这样Close注册表的时候会自动刷到Flash上的,不然重起注册表配置会丢
点赞  2008-10-27 15:26
恩,LS说的对,我改了下应用程序,
[code]
        long lResult = 0;       
        lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szregRootKey, 0, KEY_ALL_ACCESS, &hDrvKey);
        if(ERROR_SUCCESS == lResult)
        {       
                WRITE_REG_SZ(L"DefaultClientDriver",szregDefaultClientDriver);                       
        }
        RegCloseKey(hDrvKey);

        lResult = RegFlushKey(HKEY_LOCAL_MACHINE);
        if(ERROR_SUCCESS == lResult)
        {       
                KernelIoControl (IOCTL_HAL_REBOOT,NULL,0,NULL,0,NULL);                       
        }
        else
        {
                AfxMessageBox(L"Fail!");       
        }
可是这样还是不行,是不是要把USB的相关信息都要放到HIVE BOOT SECTION和END HIVE BOOT SECTION之间啊??
点赞  2008-10-27 15:38
LS说的对,我把应用程序改成如下:
[code]
        long lResult = 0;       
        lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szregRootKey, 0, KEY_ALL_ACCESS, &hDrvKey);
        if(ERROR_SUCCESS == lResult)
        {       
                WRITE_REG_SZ(L"DefaultClientDriver",szregDefaultClientDriver);                       
        }
        RegCloseKey(hDrvKey);

        lResult = RegFlushKey(HKEY_LOCAL_MACHINE);
        if(ERROR_SUCCESS == lResult)
        {       
                KernelIoControl (IOCTL_HAL_REBOOT,NULL,0,NULL,0,NULL);                       
        }
        else
        {
                AfxMessageBox(L"Fail!");       
        }

可是还是不行~
是不是USB的相关信息都要放到HIVE BOOT SECTION和END HIVE BOOT SECTION之间啊?
请教高手
点赞  2008-10-27 15:41
请确认修改的注册表,重启后是不是保存住了。
点赞  2008-10-27 17:23
我觉得改注册不行,应该调用USB function controller driver
createfile("UFN1:"...
deviceiocontrol(...IOCTL_UFN_CHANGE_CURRENT_CLIENT
点赞  2008-10-28 17:38
10楼说得对。
看看这篇文章,上面有代码。
http://www.eggheadcafe.com/software/aspnet/29416837/how-to-switch-default-usb.aspx
点赞  2008-10-31 15:58
学习一下
点赞  2008-10-31 17:48
学习一下
点赞  2008-10-31 20:05
如果不重启行不行?
点赞  2009-12-2 16:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复