无忧启动论坛

标题: WinPE 驱动程序最终解决方案 [打印本页]

作者: Yonsm    时间: 2007-1-4 21:21
标题: WinPE 驱动程序最终解决方案
终于搞定了……!完美!

对于 WinPE 驱动程序外置或打包,chenall 已经作了 BAT 方式的解决方式。但是这依赖于繁琐的外部程序和BAT命令,效率不高且不适合定制。今天女里搞了一下,终于搞定了最终解决方案:

1. 把每种驱动放在一个目录中(每个 INF 文件名前,加上“_”开头,作为起始标志),然后把所有的驱动程序打包成为一个 CAB 文件(可能由于 INF 是 TXT 的关系,CAB 压缩率比 7Z 还高一点,且不需要使用固实压缩,解压缩单个文件时速度大大提高)。

2. 用下面的程序代码(完成功能和源代码稍后提供在其它的帖子中),指定 CAB 路径,即可自动从 CAB 安装驱动:

1) 代码会自动检测所有 PCI 设备;
2) 然后遍历 CAB 内的一个 INF 文件内容;
3) 如果找到匹配的硬件,则解压缩 INF 所在目录中随后的 所有文件到 %TEMP% 中;
4) 安装驱动程序;
5) 转跳到 2,继续遍历下一个 INF。

优点:
1) 支持把各种类型的驱动放在一个 CAB 中,如显卡 + 网卡,等。
2) 高压缩。经测试,12M 的所有网卡 驱动,压缩后为 2.9M。
3) 硬盘(或 RAMDISK 盘)空间要求少,不匹配的驱动不会被解压缩。
4) 安装驱动后,可以删除 CAB 文件,腾出空间。这样 RAMDISK 启动的WinPE就能腾出空间,不必使用 RAMDRV 和 FBWF。
5) CAB 解压缩不需要而外程序的支持,SetupAPI 是 Windows 内置的接口。(如何生成CAB,推荐用 RAR 等压缩工具压缩为 RAR 等,然后用 ArcConvert 转换即可)

代码片段如下,如有需要可以定制,想怎么样就怎么样:


  1. // Header
  2. #include <SetupAPI.h>
  3. #include <DevGuid.h>
  4. #include <RegStr.h>
  5. #include <CfgMgr32.h>
  6. #pragma comment(lib, "SetupAPI.lib")
  7. #ifdef _UNICODE
  8. #define STR_UpdateDriverForPlugAndPlayDevices "UpdateDriverForPlugAndPlayDevicesW"
  9. #else
  10. #define STR_UpdateDriverForPlugAndPlayDevices "UpdateDriverForPlugAndPlayDevicesA"
  11. #endif
  12. typedef BOOL (WINAPI* PUPNP)(HWND  hWnd, PCTSTR ptzID, PCTSTR ptzPath, DWORD dwFlags, PBOOL bReboot);

  13. // Compare device
  14. PSTR DevCmp(PSTR pszStr1, PSTR pszStr2)
  15. {
  16.     PSTR p = pszStr2;
  17.     for (UINT i = 0; *p; p++)
  18.     {
  19.         if ((*p == '&') && (++i == 2))
  20.         {
  21.             break;
  22.         }
  23.     }
  24.     UINT uCmp = (UINT) (p - pszStr2);

  25.     p = pszStr1;
  26.     while (*p)
  27.     {
  28.         if (UMemCmp(p, pszStr2, uCmp) == 0)
  29.         {
  30.             return p;
  31.         }
  32.         p++;
  33.     }
  34.     return NULL;
  35. }

  36. // CAB callback
  37. UINT CALLBACK DevProc(PVOID pvContext, UINT uMsg, UINT_PTR upParam1, UINT_PTR upParam2)
  38. {
  39.     static BOOL s_bExtract = FALSE;
  40.     static TCHAR s_tzDevID[MAX_NAME] = {0};
  41.     static TCHAR s_tzInfPath[MAX_PATH] = {0};
  42.     if (uMsg == SPFILENOTIFY_FILEINCABINET)
  43.     {
  44.         // Is INF file or followed by INF file
  45.         FILE_IN_CABINET_INFO *p = (FILE_IN_CABINET_INFO*) upParam1;
  46.         PCTSTR q = UStrRChr(p->NameInCabinet, '\\');
  47.         q = q ? (q + 1) : p->NameInCabinet;
  48.         if ((*q == '_') || s_bExtract)
  49.         {
  50.             // Extract INF or driver file
  51.             if (*q == '_')
  52.             {
  53.                 q++;
  54.             }
  55.             UStrCopy(p->FullTargetName + GetTempPath(MAX_PATH, p->FullTargetName), q);
  56.             return FILEOP_DOIT;
  57.         }
  58.         else
  59.         {
  60.             // Skip
  61.             return FILEOP_SKIP;
  62.         }
  63.     }
  64.     else if (uMsg == SPFILENOTIFY_FILEEXTRACTED)
  65.     {
  66.         PCTSTR ptzTarget = ((FILEPATHS*) upParam1)->Target;
  67.         if (UStrStr(ptzTarget, TEXT(".INF")) == NULL)
  68.         {
  69.             // Not INF
  70.             return NO_ERROR;
  71.         }

  72.         // Open INF
  73.         PSTR pszFile = (PSTR) UFileLoad(ptzTarget, NULL);
  74.         if (pszFile == NULL)
  75.         {
  76.             return NO_ERROR;
  77.         }

  78.         for (PSTR p = (PSTR) pvContext; *p; p += UAStrLen(p) + 1)
  79.         {
  80.             if ((*p != '#') && DevCmp(pszFile, p))
  81.             {
  82.                 // Found Device
  83.                 UAStrToStr(s_tzDevID, p, MAX_NAME);
  84.                 UStrCopy(s_tzInfPath, ptzTarget);
  85.                 //UTrack(TEXT("\r\nFound %s: %s\r\n\r\n"), s_tzDevID, s_tzInfPath);
  86.                 s_bExtract = TRUE;
  87.                 *p = '#';
  88.                 return NO_ERROR;
  89.             }
  90.         }

  91.         // This is next INF
  92.         if (s_bExtract)
  93.         {
  94.             // Previous is uses INF
  95.             s_bExtract = FALSE;
  96.             HMODULE hLib = LoadLibrary(TEXT("NewDev"));
  97.             if (hLib)
  98.             {
  99.                 // Install INF
  100.                 PUPNP p = (PUPNP) GetProcAddress(hLib, STR_UpdateDriverForPlugAndPlayDevices);
  101.                 if (p)
  102.                 {
  103.                     BOOL bReboot = FALSE;
  104.                     p(NULL, s_tzDevID, s_tzInfPath, 3, &bReboot);
  105.                     UTrack(TEXT("\r\nInstall %s: %s\r\n\r\n"), s_tzDevID, s_tzInfPath);
  106.                 }
  107.                 FreeLibrary(hLib);
  108.             }
  109.         }
  110.         
  111.         // Delete INF
  112.         UFileDelete(ptzTarget);
  113.     }
  114.     return NO_ERROR;
  115. }

  116. #define MAX_DevID (MAX_STR * 4)
  117. UINT DevEnum(PSTR pszDev, PCTSTR ptzClass = REGSTR_KEY_PCIENUM)
  118. {
  119.     // Lookup device
  120.     HDEVINFO hDev = SetupDiGetClassDevs(NULL, ptzClass, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES );
  121.     if (hDev == INVALID_HANDLE_VALUE)
  122.     {
  123.         return E_FAIL;
  124.     }

  125.     // Lookup Device ID
  126.     UINT uSize = 0;
  127.     SP_DEVINFO_DATA sdDev = {sizeof(SP_DEVINFO_DATA)};
  128.     for (UINT i = 0; (uSize < MAX_DevID) && SetupDiEnumDeviceInfo(hDev, i, &sdDev); i++)
  129.     {
  130.         DWORD dwData;
  131.         DWORD dwSize = MAX_DevID- uSize;
  132.         if (SetupDiGetDeviceRegistryPropertyA(hDev, &sdDev, SPDRP_HARDWAREID, &dwData, (PBYTE) pszDev + uSize, dwSize, &dwSize))
  133.         {
  134. #ifndef _DEBUG
  135.             // List problem device only
  136.             ULONG uProblem = 0;
  137.             ULONG uStatus = DN_HAS_PROBLEM;
  138.             CM_Get_DevNode_Status(&uStatus, &uProblem, sdDev.DevInst, 0);
  139.             if (uProblem)
  140. #endif
  141.             {
  142.                 uSize += UAStrLen(pszDev + uSize) + 1;
  143.             }
  144.         }
  145.     }

  146.     SetupDiDestroyDeviceInfoList(hDev);
  147.     pszDev[uSize] = pszDev[uSize + 1] = 0;
  148.     return uSize;
  149. }

  150. // Install device
  151. HRESULT Devi(PTSTR ptzCmd)
  152. {
  153.     // Skip if Control Key pressed.
  154.     if (GetAsyncKeyState(VK_CONTROL) & 0x8000)
  155.     {
  156.         return S_FALSE;
  157.     }

  158.     // Enum device ID
  159.     CHAR szDev[MAX_DevID];
  160.     UINT uSize = DevEnum(szDev, TEXT("PCI"));
  161.     uSize +=  DevEnum(szDev + uSize, TEXT("USB"));
  162.     if (uSize == 0)
  163.     {
  164.         // No device
  165.         return ERROR_DEVICE_NOT_CONNECTED;
  166.     }

  167. #ifdef _DEBUG
  168.     for (PSTR p = szDev; *p; p += UAStrLen(p) + 1)
  169.     {
  170.         UTrack(TEXT("%hs\r\n"), p);
  171.     }
  172. #endif

  173.     // Lookup CAB file
  174.     TCHAR tzPath[MAX_PATH];
  175.     ExpandEnvironmentStrings(ptzCmd, tzPath, MAX_PATH);
  176.     SetupIterateCabinet(tzPath, 0, DevProc, szDev);

  177.     return S_OK;
  178. }
复制代码

[ 本帖最后由 Yonsm 于 2007-1-5 12:33 AM 编辑 ]
作者: zts59    时间: 2007-1-4 21:26
呵呵,不是很懂,感觉是把CMD批处理程序化。非常不错,效率提高。望能把成品发出来试试~~~
作者: strongchen    时间: 2007-1-4 21:29
呵呵,又有新的亮点出现了。。。
作者: Yonsm    时间: 2007-1-4 21:30
原帖由 zts59 于 2007-1-4 09:26 PM 发表
呵呵,不是很懂,感觉是把CMD批处理程序化。非常不错,效率提高。望能把成品发出来试试~~~


并非如此!解压、查找、安装程序等都是自己搞定的,不需要 BartPE 等支持的。另外,不需要解压缩全部驱动(当然,CMD的也不要)。

内置外置都行。推荐内置,CAB 压缩后不大
作者: 潇湘晨光    时间: 2007-1-4 21:30
又有新突破了。
作者: acoa    时间: 2007-1-4 21:31
支持,请把作品发出来让大家测试。
作者: strongchen    时间: 2007-1-4 21:32
原帖由 Yonsm 于 2007-1-4 09:30 PM 发表


并非如此!解压、查找、安装程序等都是自己搞定的,不需要 BartPE 等支持的。另外,不需要解压缩全部驱动(当然,CMD的也不要)。

内置外置都行。推荐内置,CAB 压缩后不大


嗯,这样省去了很多步骤。。。比较关系自己定制方面的问题,容易进行定制是yy的基本。。。^_^
作者: Yonsm    时间: 2007-1-4 21:35
原帖由 strongchen 于 2007-1-4 09:32 PM 发表


嗯,这样省去了很多步骤。。。比较关系自己定制方面的问题,容易进行定制是yy的基本。。。^_^

CAB 可随意订制,命令本身没什么好定制的了。上面我说的订制是指 代码。

但是 CAB 定制就 OK 了,只要把不同的驱动压缩在一起,即可。上面的代码会自动检测的。
作者: wanghh    时间: 2007-1-4 21:37
支持,请把作品发出来让大家测试。
作者: Yonsm    时间: 2007-1-4 21:41
稍后上传。DEVI 自动安装只是其中之一,下面是所有的命令:


欢迎使用 RXPE - Rescue Windows XP Environment 扩展设置工具!


一、简介

RXPE 是为扩展设置 Windows PE 而制作的小工具。

    ◎ 支持常规的扩展设置命令。
    ◎ 支持外部命令增加程序的功能。
    ◎ 支持命令行、命令列表文件和图形界面,所有命令均使用统一格式,一看就会使用。
    ◎ 细微周到的功能支持。
    ◎ 短小精干,运行迅速。
    ◎ 源代码公开,方便更改定制。在源代码中增加扩展命令非常容易。


二、命令

■ Regi <HKLM|HKCU|HKCR|HKU|HKCC><\子项\>[键值][=[#]数据]

  ◎ 功能:设置或删除注册表数据。
  
  ◎ 参数:
    ※ 子项              所选 ROOTKEY 下注册表项的完整名。

    ※ 键值              要操作的键值。如果省略,则操作默认键值;如果为“!”且没有“=”,则用于删除整个子项。

    ※ 数据              要设置的数据。如果没有“=”则删除;如果有“#”则表示 REG_DWORD 整数类型的数据,否则为字符串。
  
  ◎ 示例:Regi HKCU\SOFTWRE\RXPE\Version=#1200

  ◎ 备注:无。

■ Envi [名称][=值]

  ◎ 功能:如果大写的 ENVI 将设置系统的环境变量;否则仅设置用于 RXPE.EXE 的环境变量。
  
  ◎ 参数:分别指定环境变量名称和值。如果不指定值,则删除环境变量;如果不指定名称和值,则设置以下环境变量:
         Favorites      收藏夹目录
         Desktop        桌面目录
         StartMenu      开始菜单目录
         Startup        启动菜单目录
         Programs       程序菜单目录
         Recent         新近文件目录
         SendTo         发送到目录
         System         系统目录
         Windows        Windows 目录
         Personal       我的文档目录
         QuickLaunch    快速启动目录
  
  ◎ 示例:ENVI

  ◎ 备注:如果名称的最后一个字符为大写,才会通知系系使环境变量更改生效。

■ Link <快捷方式路径><,目标路径>[,运行参数][,图标路径][,图标索引]

  ◎ 功能:添加快捷方式。
  
  ◎ 参数:

    ※ 快捷方式路径      指定要生成的快捷方式的路径(.lnk 可以省略)。

    ※ 目标路径          指定快捷方式的目标路径。如果目标路径的结尾处有字符“?”,则快捷方式的起始位置(或者说当前目录)为临时文件夹“%TEMP%”;否则,为目标文件所在的目录。如果目标路径的结尾处有字符“<”,则快捷方式的启动方式为最小化方式启动;如果是“>”,则以隐藏方式启动;否则,为正常方式启动。

    ※ 运行参数          目标程序运行参数。

    ※ 图标路径          快捷方式图标的路径。

    ※ 图标索引          快捷方式图标的在文件资源中的序号,0 为第一个图标(不填写则默认)。   
   
  ◎ 示例:Link $Desktop\宽带连接,PPPOE.CMD<,,RASDIAL.DLL,19

  ◎ 备注:无。

■ Dele <文件路径>

  ◎ 功能:删除文件或目录。
  
  ◎ 参数:指定要删除的文件路径,支持环境变量扩展和通配符。
  
  ◎ 示例:Dele %SystemRoot%\INF\*.PNF

  ◎ 备注:如果以 RAMDISK 方式启动系统,可删除一些启动后无用的文件(如 2 MB 的 NTOSKRNL.EXE)来增加 RAMDISK 的可写空间。

■ Devi <CAB 路径>

  ◎ 功能:从 CAB 文件中安装驱动程序。
   
  ◎ 参数:CAB 完整路径。把每个驱动单独放在一个目录中,然后把所有的驱动程序按备注中的说明,打包成 CAB 即可。
  
  ◎ 示例:DEVI %SystemRoot%\DRV.CAB

  ◎ 备注:CAB 文件中的。其中的 INF 文件必须以“_”开头(使用改名工具,添加“_”前缀);并且,请最后放一个目录和空的INF(如“ZZZ\ZZ.INF”),否则最后一个驱动不会自动安装(但会解压)。可以用此功能安装驱动程序,然后删除掉 CAB 文件(如果是 RAMDISK 方式启动),以腾出空间。

■ Send <按键代码1>[,按键代码2][,按键代码3]...

  ◎ 功能:模拟按键。
  
  ◎ 参数:虚拟按键代码,如 VK_RETURN,请参相关考编程文档。
  
  ◎ 示例:Send 0x12<,0x09<,0x09>,0x12>

  ◎ 备注:上面的示例模拟 Alt+Tab。如果按键代码以“<”结束,则仅模拟按键按下;“>”则仅模拟按键弹起;否则模拟按下并弹起。按键代码支持 16 进制,如“SendKey 0x90”表示按下 NumLock 键。

■ Wait <毫秒>

  ◎ 功能:等待指定时间后再继续执行命令。
  
  ◎ 参数:指定时间,单位为毫秒。
  
  ◎ 示例:Wait 5000

  ◎ 备注:无。

■ Shut [0|1|2]...

  ◎ 功能:注销|关机|重起。
  
  ◎ 参数:关机方式。
  
  ◎ 示例:Shut

  ◎ 备注:使用经修改的 USER32.DLL,配合此命令使用,将可以拦截所有的关闭系统调用,达到正确关闭的目的(注意,此功能是快速关机,可能不会保存所有数据)。

■ Exec <程序路径>[ 参数]

  ◎ 功能:执行外部命令。
  
  ◎ 格式:执行外部命令。
  
  ◎ 参数:指定程序路径。
  
  ◎ 示例:ExeCmd CMD.EXE /C "DEL /Q /F %TEMP%"

  ◎ 备注:如果路径结尾处有字符“?”,则等待外部命令执行完后才继续执行下一条命令;否则立即返回并执行下一条。如果目标路径的结尾处有字符“<”,则快捷方式的启动方式为最小化方式启动;如果是“>”,则以隐藏方式启动;否则,为正常方式启动。另外,此命令可以支持使用特定参数调用 DLL 函数,功能比 RegSvr32 强大的多,命令格式为“<DLL 路径,函数名称>[,[#]参数1][,[#]参数2][,[#]参数3][,[#]参数4]”。

■ Kill <进程名称>

  ◎ 功能:强制终止指定的进程。
  
  ◎ 参数:进程名称,即 EXE 文件名(不包含路径)。
  
  ◎ 示例:Kill WinLogon

  ◎ 备注:此命令将终止与 <进程名称> 前部分匹配的所有进程。

■ Load [文件路径]

  ◎ 功能:逐条运行命令文件中的命令。
   
  ◎ 参数:指定文件的路径。如果省略,假设 RXPE 本身的 EXE 文件名为 RXPE.EXE,则自动搜索每个分区上的 RXPE.INI 和 RXPE\RXPE.INI 文件。把 RXPE.EXE 改名即可实现自定义命令文件的名称。
  
  ◎ 示例:Load

  ◎ 备注:RXPE 支持把所有的命令写在一个文件种逐条执行。RXPE 命令文件最后一行必须是空行,否则最后一行无法被执行。注意,如果在命令文件中使用此命令,要仔细分析,防止嵌套调用。

■ Init [文件路径]

  ◎ 功能:初始化桌面,然后执行 Load 功能。
   
  ◎ 参数:请参看 Load。
  
  ◎ 示例:Init

  ◎ 备注:此功能用于代替 WinLogon 登录系统,RXPE 可以完全控制登录进度。

■ Logo [[!]文件路径]

  ◎ 功能:显示启动画面。
   
  ◎ 参数:图片文件路径,支持 BMP/JPG/PNG/GIF 等各式(需要 GDI+ 支持)。如果参数为空,则关闭启动画面(渐隐淡出)。
  
  ◎ 示例:Logo !%SystemRoot%\RXPE.JPG

  ◎ 备注:上例中,将使用内部图片显示启动画面。“!”表示后台执行,不阻塞。

■ Text [文字][#颜色][,Left][,Top][,Right][,Bottom]

  ◎ 功能:在启动画面中显示进度文字。
   
  ◎ 参数:文字为空则不显示文字。
  
  ◎ 示例:TEXT 正在注册组件……#0xFFDDDD,4,745,128,768

  ◎ 备注:首次显示文字的时候必须指定位置,否则不会显示。

■ Help

  ◎ 功能:显示帮助信息。
   
  ◎ 参数:无。
  
  ◎ 示例:Help

  ◎ 备注:无。


三、备注

◎ RXPE 命令文件必须使用 UNICODE 格式。

◎ RXPE 命令不区分大小写(ENVI 除外)。

◎ RXPE 命令之后可以跟数量不限的空格和制表符。

◎ 上面的命令中 <> 内的参数表示必须输入,[] 内的表示可以省略。

◎ RXPE 中使用的路径支持环境变量替换(如“%TEMP%\X.TXT”)。

◎ 通常情况下,您只需要编辑一个命令文件 RXPE.INI,里面列出需要执行的命令。然后在 PE 启动的时候执行“RXPE.EXE Init”即可。


四、致谢

◎ 感谢 老九 的热心帮助和意见。
◎ 感谢 无忧论坛 提供的讨论场所。


要获取更多信息,请访问 WWW.YONSM.NET


Yonsm
Yonsm@163.com
WWW.Yonsm.NET
2007.1.4,杭州

作者: Yonsm    时间: 2007-1-4 21:57
我倒!“CAB 压缩率比 7z 还高”——原来我说错了!竟然是 ArcConvert 转换的时候丢掉了部分目录,难道 CAB 有目录数限制?正在确认
作者: strongchen    时间: 2007-1-4 22:18
原帖由 Yonsm 于 2007-1-4 09:57 PM 发表
我倒!“CAB 压缩率比 7z 还高”——原来我说错了!竟然是 ArcConvert 转换的时候丢掉了部分目录,难道 CAB 有目录数限制?正在确认


用wincab直接压,支持目录和最高压缩率。不过应该没有7z压缩率高(指7z的一般压缩水平)
另外不知道你用的驱动是什么版本,我的12。17版里面的inf都是用老九的工具处理过的。。
13M压缩后不超过3M

[ 本帖最后由 strongchen 于 2007-1-4 10:20 PM 编辑 ]
作者: blueblueblue    时间: 2007-1-4 22:23
又有新突破了请把作品发出来让大家测试。
作者: wanghh    时间: 2007-1-4 22:31
原帖由 strongchen 于 2007-1-4 10:18 PM 发表


用wincab直接压,支持目录和最高压缩率。不过应该没有7z压缩率高(指7z的一般压缩水平)
另外不知道你用的驱动是什么版本,我的12。17版里面的inf都是用老九的工具处理过的。。
13M压缩后不超过3M

老猫又该更新了。:handshake:victory:
作者: zhaohj    时间: 2007-1-4 22:44
新的驱动解决方案即将出台,期待中......
作者: lxl1638    时间: 2007-1-4 23:23
似乎有新料,什么时候参提供试用?
作者: SJB_11_    时间: 2007-1-4 23:32
支持个好东西
作者: tiancai4126    时间: 2007-1-4 23:49
又来了一个热心同志啊! 我去你的blog看看!
作者: lxl1638    时间: 2007-1-5 00:07
大师一定很忙,影响一下,见谅。

最好提供一个安装界面和安装选项给用户选择,如 网卡、显卡、声卡等,让用户选择安装所需的设备,因为大多数时候用于维护系统的PE无需声卡之类的。
作者: Yonsm    时间: 2007-1-5 00:19
原帖由 strongchen 于 2007-1-4 10:18 PM 发表


用wincab直接压,支持目录和最高压缩率。不过应该没有7z压缩率高(指7z的一般压缩水平)
另外不知道你用的驱动是什么版本,我的12。17版里面的inf都是用老九的工具处理过的。。
13M压缩后不超过3M


就是用你的驱动包,添加了 NVIDIA 的网卡,似乎不支持 Intel 945 上的板载网卡?

另外,建议全部重新整理一下驱动包,全部做成一下形式,不要在来个 OTHERS 之类的:

品牌1\型号1
   \型号2
  \型号3
  \型号4
         ......
品牌2\型号1
   \型号2
  \型号3
  \型号4

顺便说一声,WinCAB 在压缩多目录 CAB 文件的时候经常出错的。ArcConvert 我重新下载了最新版本,没问题了,但是压缩后13M -> 3.7M 左右,而你压缩的 7Z 是 2.9M。
作者: Yonsm    时间: 2007-1-5 00:25
原帖由 lxl1638 于 2007-1-5 12:07 AM 发表
大师一定很忙,影响一下,见谅。

最好提供一个安装界面和安装选项给用户选择,如 网卡、显卡、声卡等,让用户选择安装所需的设备,因为大多数时候用于维护系统的PE无需声卡之类的。


因为不是专门做得单独程序,所以还没有考虑。暂时只是我自己整理的 PE 中的一个登录设置程序。CAB 驱动加载只是一个其中的命令。
前面的代码还有点小问题,我正在测试,有空我会尽快发布——明后天吧,周末以前。

至于细致到网卡、显卡还是声卡,并没有这样的方案,我是这样做的:

1. 枚举所有 PCI 和 USB 设备的 ID,记录为 DevID 列表
2. 在 CAB 中枚举所有的 INF,在每个 INF 中查找 DevID,如果匹配,则表示找到设备的 INF->安装 INF。就这样。

速度很快,基本上可以把所有的设备都枚举一下,但是我想只选择 USB 和 PCI 就行了——不知道 PCI Express 是以什么开头的,不会是 PCIE 吧?总之暂时没有考虑这么多。

你可以看看代码的思路,都是 API 的调用,转换成 Delphi 也很快的。

另外,大师之称实不敢当,都是在这里学的。

[ 本帖最后由 Yonsm 于 2007-1-5 12:35 AM 编辑 ]
作者: yjliu668    时间: 2007-1-5 08:27
WinPE越来越象WinXP了,支持!
作者: lyajx8888    时间: 2007-1-5 08:29
不错,支持一个!谢谢楼主
作者: op336    时间: 2007-1-5 08:44
又有新的亮点出现了。。。
作者: qqj    时间: 2007-1-5 09:06
又有新突破了,期待高人的作品。
作者: chowyu    时间: 2007-1-5 09:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: oar    时间: 2007-1-5 11:41
耐心等待驱动最佳方案
作者: jxyun99    时间: 2007-1-5 12:46
耐心等待驱动最佳方案
作者: jasonwang    时间: 2007-1-5 13:21
耐心等待成品放出
作者: epo    时间: 2007-1-5 14:34
期待佳作
作者: zhfzl2006    时间: 2007-1-5 14:46
支持!!!期待!!!
作者: nn2nn    时间: 2007-1-5 16:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: haiwy    时间: 2007-1-5 17:42
期待楼主完美的新作.....建议作成ISO格式,可以硬盘和光盘使用.
作者: mackyliu    时间: 2007-1-5 17:46
很优秀的想法,相信楼主一定能够很好的实现,支持一下.
作者: 123    时间: 2007-1-5 17:55
很强啊!值得研究!
作者: Yonsm    时间: 2007-1-6 06:14
已经搞定了,在这里有实际在使用的东西:http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1

没有单独的版本,有需要的可以到我的BLOG上下载代码。最终的思路是:

枚举硬件 ID,遍历 INF 内容,使用模糊匹配的方法,遇到符合要求的 INF,就解压缩他后面的所有文件,直到遇到下一个 INF 为止。

因为使用的是自定的匹配方法,所以速度是非常快的。

解压缩提取驱动后,我没有做安装动作了,因为我认为驱动安装交给网络配置程序吧,这样启动速度更快些。
作者: lxl1638    时间: 2007-1-6 13:53
原帖由 Yonsm 于 2007-1-5 12:25 AM 发表
不知道 PCI Express 是以什么开头的,不会是 PCIE 吧?总之暂时没有考虑这么多。


又来学习了,本人没有 PCI Express 之类的设备。下面是某ATI显卡的INF文件其中一行。其中的 PCI-E Edition 是不是 PCI Express ,它的设备类型是不是仍然用传统的 PCI 呢?(为了兼容,仍然用传统的PCI)。
"All-in-Wonder 2006 PCI-E Edition"=ati2mtag_RV515,PCI\VEN_1002&DEV_7146&SUBSYS_03221002

作者: lxl1638    时间: 2007-1-6 13:56
原帖由 Yonsm 于 2007-1-6 06:14 AM 发表
已经搞定了,在这里有实际在使用的东西:http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1

没有单独的版本,有需要的可以到我的BLOG上下载代码。最终的思路是:

枚举硬件 ID,遍历 INF 内 ...


又学了不少,谢谢。
本人打算做一个单独的版本,可以通过界面或命令行参数选择硬件,如网卡、显卡和声卡三种。
但水平有限,不知最后如何。

[ 本帖最后由 lxl1638 于 2007-1-6 02:00 PM 编辑 ]
作者: catchsun    时间: 2007-1-6 14:16
老九,加油
作者: coolqvu    时间: 2007-1-6 14:19
牛啊。。。 有单独版就好咯
作者: Yonsm    时间: 2007-1-6 14:22
原帖由 lxl1638 于 2007-1-6 01:53 PM 发表


又来学习了,本人没有 PCI Express 之类的设备。下面是某ATI显卡的INF文件其中一行。其中的 PCI-E Edition 是不是 PCI Express ,它的设备类型是不是仍然用传统的 PCI 呢?(为了兼容,仍然用传统的PCI)。


下面是代码片断,看其中的 "PCI" 注释掉了,就是说会枚举所有的美配置过的系统设备,通吃。但 ACPI 设备除外。


  1.         // Lookup device
  2.         HDEVINFO hDev = SetupDiGetClassDevs(NULL, NULL[color=Red]/*TEXT("PCI")*/[/color], 0, DIGCF_ALLCLASSES);
  3.         if (hDev == INVALID_HANDLE_VALUE)
  4.         {
  5.                 return E_FAIL;
  6.         }

  7.         // Build SPDRP_HARDWAREID list
  8.         CHAR szDevID[MAX_STR];
  9.         PSTR p = szDevID;
  10.         SP_DEVINFO_DATA sdDev = {sizeof(SP_DEVINFO_DATA)};
  11.         for (UINT i = 0; ((p - szDevID) < sizeof(szDevID)) && SetupDiEnumDeviceInfo(hDev, i, &sdDev); i++)
  12.         {
  13.                 // Exclude configured device
  14.                 ULONG uProblem = 0;
  15.                 ULONG uStatus = DN_HAS_PROBLEM;
  16.                 CM_Get_DevNode_Status(&uStatus, &uProblem, sdDev.DevInst, 0);
  17.                 if (uProblem != CM_PROB_NOT_CONFIGURED)
  18.                 {
  19.                         continue;
  20.                 }

  21.                 // Exclude ACPI device
  22.                 if (SetupDiGetDeviceRegistryPropertyA(hDev, &sdDev, SPDRP_HARDWAREID, NULL, (PBYTE) p, sizeof(szDevID) - (UINT) (p - szDevID), NULL) &&
  23.                         (*((PDWORD) p) != 'IPCA'))
  24.                 {
  25.                         // Trim some stuff for quick search
  26.                         for (UINT k = 0; *p; p++)
  27.                         {
  28.                                 if ((*p == '&') && (++k == 2))
  29.                                 {
  30.                                         *p = 0;
  31.                                         break;
  32.                                 }
  33.                         }
  34.                         p++;
  35.                 }
  36.         }
  37.         *p = 0;

  38.         SetupDiDestroyDeviceInfoList(hDev);
  39.         if (szDevID[0] == 0)
  40.         {
  41.                 // No device
  42.                 return ERROR_NO_MATCH;
  43.         }
复制代码

作者: Yonsm    时间: 2007-1-6 14:25
原帖由 coolqvu 于 2007-1-6 02:19 PM 发表
牛啊。。。 有单独版就好咯


我只是提供一个想法,并且提供在我YY的 RXPE 中的一个程序经实际使用可行。你也可以到 http://www.yonsm.net/read.php?286 上下载单独的程序的,仅使用 RXPE.EXE DEVI ABC.CAB 也可以的阿。

不过据说老九会去做更通用的版本。大家可以期待。
作者: acoa    时间: 2007-1-6 14:30
是不是在acb.cab里只要显卡或声卡的驱动,也一样可以安装成功?
作者: Yonsm    时间: 2007-1-6 14:34
原帖由 acoa 于 2007-1-6 02:30 PM 发表
是不是在acb.cab里只要显卡或声卡的驱动,也一样可以安装成功?


是的,但我没有测试。
你也可以用建立单独的显卡包,然后在RXPE.INI 中添加一条 DEVI 命令。
如果要登录后立即安装驱动,可以在这之后马上执行 BARTPE -pnp 命令。(其实安装驱动很简单,一条 API 调用就搞定,但是按我的想法,定位系统维护的话,大多数时间启动的时候不要安装驱动,要用的时候再安装吧。启动的时候进提取驱动)
作者: coolqvu    时间: 2007-1-6 14:46
原帖由 Yonsm 于 2007-1-6 02:25 PM 发表


我只是提供一个想法,并且提供在我YY的 RXPE 中的一个程序经实际使用可行。你也可以到 http://www.yonsm.net/read.php?286 上下载单独的程序的,仅使用 RXPE.EXE DEVI ABC.CAB 也可以的阿。

不过据说老九会 ...


你又知道我看的明白?
我是第一次来这个版的   我要问一下你所说是驱动包能否外置,也就是说放在其它盘上,还是要指定在同一个目录下。
作者: Yonsm    时间: 2007-1-6 14:59
原帖由 coolqvu 于 2007-1-6 02:46 PM 发表


你又知道我看的明白?
我是第一次来这个版的   我要问一下你所说是驱动包能否外置,也就是说放在其它盘上,还是要指定在同一个目录下。


当然可以外置!指定目录即可。
作者: catchsun    时间: 2007-1-6 15:17
让winpe启动时运行rxpe.exe,应该如何设置呀?不是只须将rxpe.exe放在IMG的根目录下即可呀?
作者: catchsun    时间: 2007-1-6 15:40
顶一下
作者: Yonsm    时间: 2007-1-6 16:01
原帖由 catchsun 于 2007-1-6 03:17 PM 发表
让winpe启动时运行rxpe.exe,应该如何设置呀?不是只须将rxpe.exe放在IMG的根目录下即可呀?


对呀,不过随便放在哪里都行,只能遥找到路径的地方。

不像PENETCFG.EXE这个东西,哇靠!bartpe.exe 不放在 System32种它就是不行!Windows目录虽也不可以,MD!
作者: catchsun    时间: 2007-1-6 16:08
Yonsm老兄,要让rxpe.exe运行,要写什么命令呀?
作者: rui    时间: 2007-1-6 16:11
PCI-E、PCI-X 原则上都应该是PCI设备,我提供2个PCI-E无线网卡的驱动信息文件请楼主研究一下。顺便期待一下。。。

PCIE网卡INF文件.rar

61.15 KB, 下载次数: 72, 下载积分: 无忧币 -2

PCIE网卡INF文件


作者: Yonsm    时间: 2007-1-6 16:12
原帖由 catchsun 于 2007-1-6 04:08 PM 发表
Yonsm老兄,要让rxpe.exe运行,要写什么命令呀?

?
看说明,一看就明白了吧
作者: Yonsm    时间: 2007-1-6 16:13
原帖由 rui 于 2007-1-6 04:11 PM 发表
PCI-E、PCI-X 原则上都应该是PCI设备,我提供2个PCI-E无线网卡的驱动信息文件请楼主研究一下。顺便期待一下。。。


不限于 pci 设备的啊,现在已经没有这个问题了。支持搜索出了 ACpI外的所有硬件驱动
作者: acoa    时间: 2007-1-6 16:15
希望也能支持USB网卡
作者: Yonsm    时间: 2007-1-6 16:18
原帖由 acoa 于 2007-1-6 04:15 PM 发表
希望也能支持USB网卡

上面不是刚说支持所有硬件吗?不限于网卡什么的
作者: acoa    时间: 2007-1-6 16:38
那就太好了,说不定pcmica网卡也能用了。
作者: wgykk    时间: 2007-1-6 16:43
希望能早点出来
作者: rocin    时间: 2007-1-6 16:47
标题: dingging

作者: catchsun    时间: 2007-1-6 17:07
呵,已经出来了
作者: chenall    时间: 2007-1-6 17:19
顶一下,支持。

有没有测试过了的?看一下好像没有人报告结果?

[ 本帖最后由 chenall 于 2007-1-6 05:22 PM 编辑 ]
作者: Yonsm    时间: 2007-1-6 17:34
原帖由 chenall 于 2007-1-6 05:19 PM 发表
顶一下,支持。

有没有测试过了的?看一下好像没有人报告结果?


另一个帖子里有人说了结果的,在 REBOOT 的贴子里。

另外,马上就发现了一些问题,晚上我尽快修正:INF中 Device 是小写的话将无法匹配。
作者: acoa    时间: 2007-1-6 17:44
请老大记得把Ctrl+Alt+Del 这个命令加进去啊
越来越体会到老大这个工具的强大。

[ 本帖最后由 acoa 于 2007-1-6 06:27 PM 编辑 ]
作者: wgykk    时间: 2007-1-6 21:06
下载下来看了一下,不是我想要的东西。还不如CHENALL的批处理来得方便准确。我想要的是可以搜索并直接安装驱动,PE系统下直接可以使用。楼主的东西好象只能将驱动放到PE系统相应文件夹,不知道能否安装好驱动?我没有测试过。另外,更改文件名也是挺麻烦的事情。
作者: acoa    时间: 2007-1-6 22:26
原帖由 wgykk 于 2007-1-6 09:06 PM 发表
下载下来看了一下,不是我想要的东西。还不如CHENALL的批处理来得方便准确。我想要的是可以搜索并直接安装驱动,PE系统下直接可以使用。楼主的东西好象只能将驱动放到PE系统相应文件夹,不知道能否安装好驱动?我 ...

真是不识货。
作者: Yonsm    时间: 2007-1-6 22:36
原帖由 acoa 于 2007-1-6 05:44 PM 发表
请老大记得把Ctrl+Alt+Del 这个命令加进去啊
越来越体会到老大这个工具的强大。


已经加上去了,晚上睡觉前我会更新的。还在做其它的测试和检查。
作者: tiancai4126    时间: 2007-1-6 22:36
我也下载了! 慢慢研究! 楼上的不要理他,个人观点不同,他意识跟不上!
作者: willsion    时间: 2007-1-7 00:43
期待不断突破
作者: strongchen    时间: 2007-1-7 00:55
原帖由 Yonsm 于 2007-1-6 05:34 PM 发表

另一个帖子里有人说了结果的,在 REBOOT 的贴子里。

另外,马上就发现了一些问题,晚上我尽快修正:INF中 Device 是小写的话将无法匹配。


测试了,可以(我的是8139网络卡)

iso启动也没问题,研究了一下,功能强的没话说了,不过要出一分详细说明才行。

另外提出了个bt的想法,写到你的网站上了。。
作者: catchsun    时间: 2007-1-7 09:21
严重期待呀
作者: wyy_wj    时间: 2007-1-7 12:05
好贴没人顶?
我顶
作者: lasti    时间: 2007-1-7 19:10
我帮你顶吧,因为这个想法却是不错,但是linux早已经可以了,ubuntu啊
作者: 欠你滴泪    时间: 2007-1-7 19:51
真是好东东啊
作者: wchf2    时间: 2007-1-9 04:28
确实先进啊,没有了B盘,空闲内存又多10兆,开心:lol:lol

真是好东西!!!
作者: hjlali    时间: 2007-5-18 01:29
唉,要好好学习,很多都不懂。
作者: carwars    时间: 2007-5-21 22:49
期待佳作!!!!:lol
作者: heman6888    时间: 2007-5-21 23:17
又有新突破了!!试试~~~
作者: 988668    时间: 2007-5-21 23:40
:) 谢谢分享哦,下来看看看看
作者: killboy88    时间: 2007-5-31 13:05
试用版还未出现吗?
帖子都沉了啦。。。。。
作者: 萧林儿    时间: 2007-6-7 11:32
看了有点头大。代码好多。
作者: bg7img    时间: 2007-6-7 20:30
支持,请把作品发出来让大家测试
作者: lcmzx    时间: 2007-6-8 18:38
学习了,进步了!
作者: huong    时间: 2007-6-9 01:08
学习。作品发出来让大家测试
作者: huong    时间: 2007-6-9 01:13
学习。作品发出来让大家测试
作者: xiaojia321    时间: 2007-7-29 12:23
你太猛了,手机软件,电脑系统,你都会啊,厉害
作者: jndscz    时间: 2007-7-29 13:03
:D :D 应该有成果了吧
作者: sunbin846205    时间: 2007-7-29 13:49
不是很懂 不过还是支持的说
小弟现在只会在一个U盘装PE 然后加点东西
作者: amazingosp    时间: 2007-7-29 16:57
CELETASK  的作者,想不到也来这里混了,,支持一个
作者: wbkboy    时间: 2007-7-29 18:45
貌似还不错。。。。。。。。。。。。。。。。。。。
作者: 老送    时间: 2007-7-31 02:55
真的很棒,,,期待佳作
作者: mayin_15    时间: 2007-7-31 12:15
自动检测硬件ID,查找匹配的INF安装相关驱动,可以做成智能驱动安装软件啊:lol
作者: baosheng00    时间: 2010-8-11 12:37
这个得支持,以后可以用光盘,而 不是用硬盘,这样就不怕中毒了。
作者: anoh    时间: 2010-8-31 00:02
留个记号.......




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3