无忧启动论坛

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

技术探讨:PE中的即插即用(5.25更新Pnp源代码)

  [复制链接]
跳转到指定楼层
1#
发表于 2008-5-5 18:33:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家可能都知道,在XP Embbeded中,系统就能实现即插即用,而在PE中是不能实现对很多设备的即插即用的。这是因为即插即用系统在不同的环境中表现是不一样的。这里先说原理,再探讨一下几种不完美的解决方案。
    当一个支持即插即用的设备插入或被检测到时,内核态的即插即用组件Services.exe会以参数-setup启动,搜集设备信息,然后传到用户态的即插即用管理器Umpnpmgr.dll,由 Umpnpmgr.dll 调用包括Newdev.dll在内的一系列组件进行处理INF等文件,最后将SYS或只传递信息给内核,开始驱动。
    在PE中,Services.exe和Umpnpmgr.dll会检测HKLM\system\setup下的systemsetupinprogress键值,等于1表示setup进程正在运行,Services.exe和Umpnpmgr.dll会自动让位给Setup;如果等于0,其他组件可能工作不正常,比如SAM 。解决办法是修改Services.exe和Umpnpmgr.dll。使用UltraEdit查找ASCII并选择使用正则表达式s?e?t?u?p?i?n?p?r?o?g?r?e?s?s或HEX:530079007300740065006d005300650074007500700049006e00500072006f006700720065007300
73,因为字符串是以UniCode形式存储的。将最后的S改为T,变成systemsetupinprogrest,并在注册表HKLM\system\setup下建立DWORD systemsetupinprogrest = 0 。修改SETUPAPI.DLL中CopyFiles为DopyFiles,也可以用XCAB处理一下PE所有的INF文件。最后添加各个设备类别的注册表键值HKLM\system\controlset001\control\classes ,hklm\system\controlset001\enum等。这个自己努力吧。
    大家讨论最多也是最烦的是这个过程中的驱动认证。问题就在Setupapi.dll。正常的Setupapi.dll中有一个全局标志GlobalSetupFlags = 0,Setupapi.dll 会检测是否为NT_Embedded环境,如果是则GlobalSetupFlags = 40,如果不是就麻烦了,它会进行一系列的认证。除了HKCU\Software\Policies\Microsoft\Windows NT\Driver Signing,HKCU\Software\Policies\Microsoft\Windows NT\Non-Driver Signing,Setupapi.dll 还要以HKLM\System\WPA\PnP中的Seed计算一个MD5 hash值,与HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup下的PrivateHash对比。
    不修改SETUPAPI.DLL的方法只有编程如下(Bartpe.exe 也使用这种方法): antiWPA.rar (1.54 KB, 下载次数: 284)
修改SETUPAPI.DLL的方法很简单。UltraEdit定位到sp2版本的SETUPAPI.DLL 7D198h处,将00改为40,即直接设置GlobalSetupFlags = 40。

——————————————————————————————————————————————————————————————————
    5.25:实在对不住大家,上面的程序只能在PE中上网后才能使用!所以基本没什么用处。Bartpe使用了一个奇怪的方法,而且此方法在正常的XP系统中是没用的。我在网上查了查,毫无结果,只能自己反汇编成CPP,原理未知,但已经验证的确有效!

//用法:取消驱动验证SetSigpolicy(0,1);还原驱动验证SetSigpolicy(1,1);

char __cdecl SetSigpolicy(char a1, char a2)
{
  char v2;
  HMODULE v3;
  HMODULE v4;
  FARPROC v5;
  HKEY hKey;
  DWORD cbData;
  DWORD Type;
  DWORD Data;
  _SYSTEMTIME SystemTime;

  hKey = 0;
  cbData = 4;
  v2 = 0;
  if ( !RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\WPA\\PnP", 0, KEY_QUERY_VALUE, &hKey) )//正常XP不存在此键值
  {
    if ( !RegQueryValueExA(hKey, "seed", 0, &Type, (BYTE *)&Data, &cbData) )
    {
      if ( cbData == 4 )
      {
        if ( Type == 4 )                                        // REG_DWORD
        {
          v3 = LoadLibraryA("setupapi.dll");
          v4 = v3;
          if ( v3 )
          {
            v5 = GetProcAddress(v3, "pSetupGetRealSystemTime");
            if ( v5 )
            {
     
              SystemTime.wDayOfWeek = 4 * (a2 & 1); //参数2赋值到wDayOfWeek低位
              SystemTime.wYear = HIWORD(Data);//Seed高位赋值给wYear
              SystemTime.wMilliseconds = (((4 * (a1 & 3)))<<16) + LOBYTE(SystemTime.wMilliseconds);//参数1赋值到wMilliseconds高位

              SystemTime.wMinute = LOWORD(Data);//Seed低位赋值给wMinute
              ((int (__stdcall *)(_SYSTEMTIME *))v5)(&SystemTime);//调用pSetupGetRealSystemTime
              v2 = 1;
            }
            FreeLibrary(v4);
          }
        }
      }
    }
  }
  if ( hKey )
    RegCloseKey(hKey);
  return v2;
}


源代码中的Pnp是Syssetup.DLL中的UpdatePnpDeviceDrivers,Bartpe中的要稍微复杂一些,故意略过了一些PE中不需要的东西。
可以这样用:RunDll32.exe Syssetup.dll,UpdatePnpDeviceDrivers
Syssetup.Dll 需要Sfc.dll,sfcfiles.dll,sfcos.dll 才能正常工作,再加上一些INF和驱动,你就会发现PE中的设备管理器显示的内容和正常XP一样了。(虽说没多大作用)

Syssetup.DLL中的UpdatePnpDeviceDrivers 源代码 s1.rar (3.34 KB, 下载次数: 402)

显示更多信息的Bartpe.exe BARTPE.rar (19.69 KB, 下载次数: 303)

[ 本帖最后由 yamingw 于 2008-5-25 01:23 PM 编辑 ]

点评

请教老师 :Sp3 版本 的SETUPAPI.DLL 修改设置GlobalSetupFlags = 40 。如何寻找偏移地址?  发表于 2017-4-7 23:36

评分

参与人数 1无忧币 +5 收起 理由
2011henry26 + 5 很给力!

查看全部评分

推荐
发表于 2008-5-5 18:50:10 | 只看该作者
原帖由 yamingw 于 2008-5-5 06:33 PM 发表
大家可能都知道,在XP Embbeded中,系统就能实现即插即用,而在PE中是不能实现对很多设备的即插即用的。这是因为即插即用系统在不同的环境中表现是不一样的。这里先说原理,再探讨一下几种不完美的解决方案。
...


收藏了,另,修改文件的方法能否适用不同系统(XP/2003/Vista)的PE?
回复

使用道具 举报

推荐
发表于 2008-5-5 19:48:10 | 只看该作者
即插即用的技术是酱紫实现的——当一块符合PNPBIOS标准的设备插入到硬件系统中,PNPBIOS将为这块设备的ROM分配一段内存地址(这也就是系统无法真正完全拥有4G内存的原因),如果符合ACPI的话,就会在ACPI空间生成ACPI表项,用来操作此硬件,如果是PCI设备的话,还会在PCI配置空间分配256字节的该设备PCI配置空间项,并将这些变化报告给NTOSKRNL.EXE,然后NTOSKRNL发送“发现设备接口更改通知”消息(具体接口俺没研究),如果我们的程序对该消息也处理,则我们也会即插即用:)热拔除过程和此类似。把新硬件的HWID写入注册表可能也是NTOSKRNL干的。

[ 本帖最后由 netwinxp 于 2008-5-5 08:18 PM 编辑 ]
回复

使用道具 举报

推荐
发表于 2008-5-5 19:13:50 | 只看该作者
路过,转贴并支持一下。;)
回复

使用道具 举报

5#
发表于 2008-5-5 23:25:24 | 只看该作者
学习了,谢谢大家的讲解……
回复

使用道具 举报

6#
发表于 2008-5-6 07:51:42 | 只看该作者
学习了,不错的贴子
回复

使用道具 举报

7#
发表于 2008-5-6 08:19:20 | 只看该作者
好方法,很好的技术帖,谢谢分享。
回复

使用道具 举报

8#
发表于 2008-5-6 08:56:08 | 只看该作者
强劲,有时间要实践一下。
回复

使用道具 举报

9#
发表于 2008-5-6 09:15:00 | 只看该作者
看来还有待进一步探讨来完善解决这个问题。
回复

使用道具 举报

10#
发表于 2008-5-6 09:30:51 | 只看该作者
说实话不是很懂,但支持一下。
回复

使用道具 举报

11#
发表于 2008-5-6 10:13:09 | 只看该作者
真是有很多强悍的人啊
回复

使用道具 举报

12#
发表于 2008-5-6 11:18:07 | 只看该作者
也只能支持下了. 其他的说不上什么
回复

使用道具 举报

13#
发表于 2008-5-7 10:27:44 | 只看该作者
这么好的贴,要顶上去!
回复

使用道具 举报

14#
 楼主| 发表于 2008-5-25 13:33:29 | 只看该作者
懒得找HTTPS的那个贴了,就在这补充一下,使用证书管理以前先注册一下Initpki.dll才能使用其全部功能。
回复

使用道具 举报

15#
发表于 2008-5-25 14:58:18 | 只看该作者
“Rundll32.exe syssetup.dll,UpdatePnpDeviceDrivers”命令可以安装即插即用驱动,运行效果与“HWPNP +all /u /p”相当,但是运行效率大不相同,后者几十秒钟就可以完成,而前者却需要1000秒钟以上,非常慢。
回复

使用道具 举报

16#
发表于 2008-5-25 16:08:01 | 只看该作者
不错,先了解了解
回复

使用道具 举报

17#
发表于 2008-5-25 20:24:28 | 只看该作者
谢谢分享!!学习啦!!
回复

使用道具 举报

18#
发表于 2008-5-25 20:54:22 | 只看该作者
原帖由 liuhj 于 2008-5-25 14:58 发表
“Rundll32.exe syssetup.dll,UpdatePnpDeviceDrivers”命令可以安装即插即用驱动,运行效果与“HWPNP +all /u /p”相当,但是运行效率大不相同,后者几十秒钟就可以完成,而前者却需要1000秒钟以上,非常慢。

应该没那么长吧-_-!!不过还是应该谢谢您的方法。
回复

使用道具 举报

19#
发表于 2008-5-26 13:52:40 | 只看该作者
原帖由 yamingw 于 2008-5-5 06:33 PM 发表
大家可能都知道,在XP Embbeded中,系统就能实现即插即用,而在PE中是不能实现对很多设备的即插即用的。这是因为即插即用系统在不同的环境中表现是不一样的。这里先说原理,再探讨一下几种不完美的解决方案。
...


将 antiWPA.c 在2003系统中用VC2005中编译,大家测试一下能否可用?
s1.exe 也来了,本人试验被禁用的网卡也出来的,大家到PE中试验一下。

s1.rar (4.06 KB, 下载次数: 87)

antiWPA.rar (3.41 KB, 下载次数: 96)

[ 本帖最后由 lxl1638 于 2008-5-26 02:08 PM 编辑 ]

未命名.JPG (44.45 KB, 下载次数: 59)

未命名.JPG
回复

使用道具 举报

20#
发表于 2008-5-26 14:09:35 | 只看该作者
大家到PE中试验(代替BartPE.exe),看看上面的 s1.exe 效果如何。
回复

使用道具 举报

21#
发表于 2008-5-26 14:54:29 | 只看该作者
看到头晕晕,只好拿做好的来试试了。
回复

使用道具 举报

22#
发表于 2008-5-26 15:51:20 | 只看该作者
原帖由 tmlu110 于 2008-5-6 09:30 AM 发表
说实话不是很懂,但支持一下。




lz:
光盘,xp系统和PE内未有 sfcos.dll,在网上也没找到下载?
内核只替换了Bartpe.exe ,加入了Syssetup.Dll ,Sfc.dll,sfcfiles.dll,
pe开机时,原来不显示的徽标认证都蹦出来了。。。设备管理器未见其他项目。
不知哪一步做错了?
不懂编程,未改Syssetup.Dll 。。。

2008-05-27_155000.PNG (12.27 KB, 下载次数: 59)

2008-05-27_155000.PNG
回复

使用道具 举报

23#
发表于 2008-5-26 15:58:28 | 只看该作者

后pe内加入sfc_os.dll后,显示如图:可能是成功了。。。

2008-05-27_155419.PNG (8.18 KB, 下载次数: 53)

2008-05-27_155419.PNG
回复

使用道具 举报

24#
 楼主| 发表于 2008-5-26 17:56:51 | 只看该作者

回复 #20 lxl1638 的帖子

s1 的效果有个缺点,就是有些驱动需要用户点  确定 。而 BartPE 是“略过”了这些“无用”的驱动而实现全自动的。
回复

使用道具 举报

25#
发表于 2008-5-26 21:03:15 | 只看该作者
这个强,先收藏再看,谢谢楼主
回复

使用道具 举报

26#
发表于 2008-5-26 23:11:52 | 只看该作者
原帖由 bobo55 于 2008-5-26 03:58 PM 发表
http://bbs.wuyou.net/images/common/back.gif
后pe内加入sfc_os.dll后,显示如图:可能是成功了。。。


先不要用 RunDll32.exe Syssetup.dll,UpdatePnpDeviceDrivers
试试这个(只有3K)看看:

UPnp.rar

1.68 KB, 下载次数: 97, 下载积分: 无忧币 -2

回复

使用道具 举报

27#
发表于 2008-5-27 13:31:12 | 只看该作者
原帖由 lxl1638 于 2008-5-26 11:11 PM 发表


启动UPnp即插用服务...
NET START SSDPSRV 
START UPnp.EXE  不知是不是这样用? 但pe内未有UPnp服务。可能还缺少文件。。。设备管理器未增加新的项目。后再用命令
RunDll32.exe Syssetup.dll,UpdatePnpDeviceDrivers,设备管理器找到一堆硬件。
回复

使用道具 举报

28#
发表于 2009-8-22 02:43:47 | 只看该作者
先顶后看。。。。。。。。。。。。。。。
回复

使用道具 举报

29#
发表于 2009-8-24 13:26:06 | 只看该作者
楼主真厉害 支持一下
回复

使用道具 举报

30#
发表于 2014-6-28 14:20:04 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-1 19:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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