luoluoxuan

    1. Paul,chao,我的两个真实串口的注册表如下: [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]    "Order"=dword:0    "InterfaceType"=dword:0    "IoBase"=dword:10030000    "IoLen"=dword:20    "Irq"=dword:9    "DeviceArrayIndex"=dword:0    "Prefix"="COM"    "Index"=dword:3    "Dll"="Serial.dll" [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial2]    "Order"=dword:0    "InterfaceType"=dword:0    "IoBase"=dword:10031000    "IoLen"=dword:20    "Irq"=dword:8    "DeviceArrayIndex"=dword:1    "Prefix"="COM"    "Index"=dword:2    "Dll"="Serial.dll" 我研究了一下mdd.c中的COM_Init()发现没有对COM Index的记录呀   DEBUGMSG (ZONE_INIT,(TEXT("Try to open %s\r\n"), (LPCTSTR)Identifier));     hKey = OpenDeviceKey((LPCTSTR)Identifier);     if ( !hKey ) {DEBUGMSG (ZONE_INIT | ZONE_ERROR,(TEXT("Failed to open devkeypath, COM_Init failed\r\n")));            LocalFree(pSerialHead);            return(NULL);     }     datasize = sizeof(DWORD);     if ( RegQueryValueEx(hKey, L"有这个DeviceArrayIndex", NULL, &kvaluetype,(LPBYTE)&DevIndex, &datasize) ) {         DEBUGMSG (ZONE_INIT | ZONE_ERROR,(TEXT("Failed to get DeviceArrayIndex value, COM_Init failed\r\n")));         RegCloseKey (hKey);         LocalFree(pSerialHead);         return(NULL);     }     datasize = sizeof(DWORD);     if ( RegQueryValueEx(hKey, L"有这个Priority256", NULL, &kvaluetype,                          (LPBYTE)&pSerialHead->Priority256, &datasize) ) {         pSerialHead->Priority256 = DEFAULT_CE_THREAD_PRIORITY;         DEBUGMSG (ZONE_INIT | ZONE_WARN,(TEXT("Failed to get Priority256 value, defaulting to %d\r\n"), pSerialHead->Priority256));     }     RegCloseKey (hKey);     DEBUGMSG (ZONE_INIT,               (TEXT("DevIndex %X\r\n"), DevIndex));     // Initialize hardware dependent data.     pSerialHead->pHWObj = GetSerialObject( DevIndex );     if ( !pSerialHead->pHWObj ) {         DEBUGMSG(ZONE_ERROR | ZONE_INIT,                  (TEXT("Error in GetSerialObject, COM_Init failed\n\r")));         LocalFree(pSerialHead);         return(NULL);     }     DEBUGMSG (ZONE_INIT, (TEXT("About to call HWInit(%s,0x%X)\r\n"),Identifier, pSerialHead));     pHWHead = pSerialHead->pHWObj->pFuncTbl->HWInit(Identifier, pSerialHead, pSerialHead->pHWObj);     pSerialHead->pHWHead = pHWHead; 只有DeviceArrayIndex和Priority256 况且即使有,按照流驱动的加载顺序: 1)加载驱动。在当系统启动时,设备管理器搜寻注册表的HKEY_LOCAL_MACHINE\Driver\BuiltIn键下面的子键,并逐一加载子键下的每个驱动,此过程叫BusEnum。 2)设备管理器从注册表的dll键值中获取驱动程序所在的DLL文件名。 3)设备管理器调用LoadDriver()函数把DLL加载到自己的虚拟地址空间内。 4)设备管理器在注册表的HKEY_LOCAL_MACHINE\Driver\Active下面,记录所有已经加载的驱动程序[2]。 5)设备管理器调用驱动中的XXX_Init()函数。 6)在XXX_Init()中,通常对硬件进行一些基本的初始化操作。通过以上6步,流接口驱动被成功加载。 7)应用程序使用该设备。首先它调用CreateFile()打开设备。CreateFile()是在FileSys.exe中实现的。但是FileSys.exe只作简单判断,如果发现打开的设备驱动程序而不是一个文件,那么就重新把主动权交还给设备管理器。 由此可见COM_Init()的执行要先于CreateFile(),那么COM_Init()执行完毕之后我注册表中的两个个串口的Index会同时被记录的呀

最近访客

< 1/1 >

统计信息

已有48人来访过

  • 芯积分:--
  • 好友:--
  • 主题:--
  • 回复:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言