无忧启动论坛

标题: 技术探讨:PE中的即插即用(5.25更新Pnp源代码) [打印本页]

作者: yamingw    时间: 2008-5-5 18:33
标题: 技术探讨:PE中的即插即用(5.25更新Pnp源代码)
大家可能都知道,在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 编辑 ]
作者: lxl1638    时间: 2008-5-5 18:50
原帖由 yamingw 于 2008-5-5 06:33 PM 发表
大家可能都知道,在XP Embbeded中,系统就能实现即插即用,而在PE中是不能实现对很多设备的即插即用的。这是因为即插即用系统在不同的环境中表现是不一样的。这里先说原理,再探讨一下几种不完美的解决方案。
...


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

[ 本帖最后由 netwinxp 于 2008-5-5 08:18 PM 编辑 ]
作者: fxyq    时间: 2008-5-5 23:25
学习了,谢谢大家的讲解……
作者: 天上的白云    时间: 2008-5-6 07:51
学习了,不错的贴子
作者: nm888    时间: 2008-5-6 08:19
好方法,很好的技术帖,谢谢分享。
作者: 135956    时间: 2008-5-6 08:56
强劲,有时间要实践一下。
作者: hhhhhh    时间: 2008-5-6 09:15
看来还有待进一步探讨来完善解决这个问题。
作者: tmlu110    时间: 2008-5-6 09:30
说实话不是很懂,但支持一下。
作者: abigapple8    时间: 2008-5-6 10:13
真是有很多强悍的人啊
作者: bailang3106    时间: 2008-5-6 11:18
也只能支持下了. 其他的说不上什么
作者: xxnkof    时间: 2008-5-7 10:27
这么好的贴,要顶上去!
作者: yamingw    时间: 2008-5-25 13:33
懒得找HTTPS的那个贴了,就在这补充一下,使用证书管理以前先注册一下Initpki.dll才能使用其全部功能。
作者: liuhj    时间: 2008-5-25 14:58
“Rundll32.exe syssetup.dll,UpdatePnpDeviceDrivers”命令可以安装即插即用驱动,运行效果与“HWPNP +all /u /p”相当,但是运行效率大不相同,后者几十秒钟就可以完成,而前者却需要1000秒钟以上,非常慢。
作者: yuan_53770    时间: 2008-5-25 16:08
不错,先了解了解
作者: dododoma    时间: 2008-5-25 20:24
谢谢分享!!学习啦!!
作者: netwinxp    时间: 2008-5-25 20:54
原帖由 liuhj 于 2008-5-25 14:58 发表
“Rundll32.exe syssetup.dll,UpdatePnpDeviceDrivers”命令可以安装即插即用驱动,运行效果与“HWPNP +all /u /p”相当,但是运行效率大不相同,后者几十秒钟就可以完成,而前者却需要1000秒钟以上,非常慢。

应该没那么长吧-_-!!不过还是应该谢谢您的方法。
作者: lxl1638    时间: 2008-5-26 13:52
原帖由 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, 下载次数: 55)

未命名.JPG

作者: lxl1638    时间: 2008-5-26 14:09
大家到PE中试验(代替BartPE.exe),看看上面的 s1.exe 效果如何。
作者: 135956    时间: 2008-5-26 14:54
看到头晕晕,只好拿做好的来试试了。
作者: bobo55    时间: 2008-5-26 15:51
原帖由 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, 下载次数: 56)

2008-05-27_155000.PNG

作者: bobo55    时间: 2008-5-26 15:58

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

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

2008-05-27_155419.PNG

作者: yamingw    时间: 2008-5-26 17:56
标题: 回复 #20 lxl1638 的帖子
s1 的效果有个缺点,就是有些驱动需要用户点  确定 。而 BartPE 是“略过”了这些“无用”的驱动而实现全自动的。
作者: hwd6    时间: 2008-5-26 21:03
这个强,先收藏再看,谢谢楼主
作者: lxl1638    时间: 2008-5-26 23:11
原帖由 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


作者: bobo55    时间: 2008-5-27 13:31
原帖由 lxl1638 于 2008-5-26 11:11 PM 发表


启动UPnp即插用服务...
NET START SSDPSRV 
START UPnp.EXE  不知是不是这样用? 但pe内未有UPnp服务。可能还缺少文件。。。设备管理器未增加新的项目。后再用命令
RunDll32.exe Syssetup.dll,UpdatePnpDeviceDrivers,设备管理器找到一堆硬件。
作者: pengjun88    时间: 2009-8-22 02:43
先顶后看。。。。。。。。。。。。。。。
作者: macowen    时间: 2009-8-24 13:26
楼主真厉害 支持一下
作者: 皓轩你好    时间: 2014-6-28 14:20
谢谢楼主分享
作者: 2011henry26    时间: 2017-4-7 23:32
标题: RE: 技术探讨:PE中的即插即用(5.25更新Pnp源代码)
本帖最后由 2011henry26 于 2017-4-7 23:35 编辑

请教老师 :Sp3 版本 的SETUPAPI.DLL 修改设置GlobalSetupFlags = 40 。如何寻找偏移地址 ?




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