无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 30221|回复: 91
打印 上一主题 下一主题

WinPE 驱动程序最终解决方案

[复制链接]
跳转到指定楼层
1#
发表于 2007-1-4 21:21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
终于搞定了……!完美!

对于 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 编辑 ]
2#
发表于 2007-1-4 21:26:18 | 只看该作者
呵呵,不是很懂,感觉是把CMD批处理程序化。非常不错,效率提高。望能把成品发出来试试~~~
回复

使用道具 举报

3#
发表于 2007-1-4 21:29:46 | 只看该作者
呵呵,又有新的亮点出现了。。。
回复

使用道具 举报

4#
 楼主| 发表于 2007-1-4 21:30:13 | 只看该作者
原帖由 zts59 于 2007-1-4 09:26 PM 发表
呵呵,不是很懂,感觉是把CMD批处理程序化。非常不错,效率提高。望能把成品发出来试试~~~


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

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

使用道具 举报

5#
发表于 2007-1-4 21:30:19 | 只看该作者
又有新突破了。
回复

使用道具 举报

6#
发表于 2007-1-4 21:31:27 | 只看该作者
支持,请把作品发出来让大家测试。
回复

使用道具 举报

7#
发表于 2007-1-4 21:32:22 | 只看该作者
原帖由 Yonsm 于 2007-1-4 09:30 PM 发表


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

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


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

使用道具 举报

8#
 楼主| 发表于 2007-1-4 21:35:02 | 只看该作者
原帖由 strongchen 于 2007-1-4 09:32 PM 发表


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

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

但是 CAB 定制就 OK 了,只要把不同的驱动压缩在一起,即可。上面的代码会自动检测的。
回复

使用道具 举报

9#
发表于 2007-1-4 21:37:40 | 只看该作者
支持,请把作品发出来让大家测试。
回复

使用道具 举报

10#
 楼主| 发表于 2007-1-4 21:41:43 | 只看该作者
稍后上传。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,杭州
回复

使用道具 举报

11#
 楼主| 发表于 2007-1-4 21:57:16 | 只看该作者
我倒!“CAB 压缩率比 7z 还高”——原来我说错了!竟然是 ArcConvert 转换的时候丢掉了部分目录,难道 CAB 有目录数限制?正在确认
回复

使用道具 举报

12#
发表于 2007-1-4 22:18:14 | 只看该作者
原帖由 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 编辑 ]
回复

使用道具 举报

13#
发表于 2007-1-4 22:23:55 | 只看该作者
又有新突破了请把作品发出来让大家测试。
回复

使用道具 举报

14#
发表于 2007-1-4 22:31:45 | 只看该作者
原帖由 strongchen 于 2007-1-4 10:18 PM 发表


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

老猫又该更新了。:handshake:victory:
回复

使用道具 举报

15#
发表于 2007-1-4 22:44:32 | 只看该作者
新的驱动解决方案即将出台,期待中......
回复

使用道具 举报

16#
发表于 2007-1-4 23:23:35 | 只看该作者
似乎有新料,什么时候参提供试用?
回复

使用道具 举报

17#
发表于 2007-1-4 23:32:58 | 只看该作者
支持个好东西
回复

使用道具 举报

18#
发表于 2007-1-4 23:49:45 | 只看该作者
又来了一个热心同志啊! 我去你的blog看看!
回复

使用道具 举报

19#
发表于 2007-1-5 00:07:39 | 只看该作者
大师一定很忙,影响一下,见谅。

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

使用道具 举报

20#
 楼主| 发表于 2007-1-5 00:19:00 | 只看该作者
原帖由 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。
回复

使用道具 举报

21#
 楼主| 发表于 2007-1-5 00:25:23 | 只看该作者
原帖由 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 编辑 ]
回复

使用道具 举报

22#
发表于 2007-1-5 08:27:15 | 只看该作者
WinPE越来越象WinXP了,支持!
回复

使用道具 举报

23#
发表于 2007-1-5 08:29:13 | 只看该作者
不错,支持一个!谢谢楼主
回复

使用道具 举报

24#
发表于 2007-1-5 08:44:29 | 只看该作者
又有新的亮点出现了。。。
回复

使用道具 举报

25#
发表于 2007-1-5 09:06:22 | 只看该作者
又有新突破了,期待高人的作品。
回复

使用道具 举报

26#
发表于 2007-1-5 09:08:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

27#
发表于 2007-1-5 11:41:26 | 只看该作者
耐心等待驱动最佳方案
回复

使用道具 举报

28#
发表于 2007-1-5 12:46:19 | 只看该作者
耐心等待驱动最佳方案
回复

使用道具 举报

29#
发表于 2007-1-5 13:21:36 | 只看该作者
耐心等待成品放出
回复

使用道具 举报

30#
发表于 2007-1-5 14:34:09 | 只看该作者
期待佳作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-23 05:13

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表