|
|
Community > ReactOS Newsletter Archive > ReactOS Newsletter: 时事通讯 49 期时事通讯 49 期by Z98 on 2008-11-17 网络配置Johannes Anderwald 一直努力修正在他使用 COM 界面以便重新实现网络配置和设置对话框于 netcfgx.dll 而导致在网络设置出现一个持续性的错误。Johannes 也必须实现 COM 界面,既然它们不曾存在过,而如今就位于 netshell.dll。不幸的,似乎是 dhcpclient 在错误的注册表键储存设置,从而导致提取 DNS 信息时失败并且将那些依赖这个信息的应用程序给崩溃了。这结合了 iphlpapi 的错误以及新代码设置为发布前,因为我们不能直接发布损坏的网络工具。 top定时Stefan Ginsberg 在较早前于内核里发现一系列的定时错误而感到震惊并且正在尝试修正它。当与其他开发者请教后,这个问题终于解决了。当中比较严重的问题是当更改系统时间时,所做的更改顺序居然是错误的并且可以造成一个竞争条件从而将系统给僵死。另一个比较没有那么严重的问题则是牵涉到定时并不会在特定的条件下每当系统时间更改后自动过期。 topPSEH 2.0以 KJK::Hyperion 亲口说的,"PSEH 2.0 是个非常糟糕,仅 GCC-only,仅 x86 的破解...总而言之,它应该是在滥用编译器界里创下了世界记录。" 虽然 PSEH 2.0 仍然是个名副其实的破解,但比起 1.1 却是有了很大的改进,它使用了 setjmp,假循环,以及各式各样奇怪的优化行为以便提供外表上有 SEH 的支持。 真正的 SEH 能够隐藏一些其实是被其他函数所嵌套的函数,如此一来它们将与其他代码块相似。这是重要的,既然这些子函数必须能够与外层的函数共享变量以便提供异常处理的用途。其中一个方法达到这样的目的是通过之前所描述的隐藏。这样的最终结果是 SEH 将允许数个函数共享同一个堆栈,却是在技术上 C 标准并不支持的东西。 PSEH 1.1 却没有这么做,从而需要一个非常痛苦的解决方法。基本上,您需要在主函数定义的结构里声明所有的共享变量为本地变量并且将让 PSEH 传递一个指针到可能需要它的子函数。尽管 2.0 技术上没有做到隐藏函数,它却通过 GCC 的非常不标准的功能而达到相同的功能,这也能够移除需要定义该结构的共享变量。GCC 本身其实都会那么做,所以只是获取一个指针传递到该结构的问题罢了。这是可以办到的,但是最终结果是非常难看的代码。但是这样却让 PSEH 2.0 与真正SEH 的语法一致性高达 99%。至于 1.1 的一致性呢,那么我最好还是说我已经忘记了。 至于移植 PSEH 到 ARM 以及 x64,KJK 是可以办到的,但是需要很多工作。 topMSVC任何人认识 KJK 的就会知道有了某些东西激励他做个 PSEH 2.0,并且关于 1.1 的投诉是不足够的,这是因为当中的一半是由 KJK 本人做出的。事实上,KJK 其实开始一个努力能够终于让 ReactOS 使用微软的 C/C++ 编译器来编译。使用 MSVC 就能够在编译的时候无需 PSEH 并且真正的允许使用 SEH,这就是当中一个理由尝试让 PSEH 的语法更相似于 SHE。否则,它将会变得更加难以维护一个能够在 GCC 和 MSVC 二者构建的主干。 目前所使用的标题饱受了数个瑕疵所困扰着,当中之一是使用 #pragma system_header,一个 GCC 的功能来隐藏全部文件有它的警告。它的原先用意是镇压那些警告是因为使用那些 Windows API(应用程式介面)所需的非标准功能,但却导致隐藏所有的错误。你可以想像这一切所导致的草率,这是因为现在已经不再捕捉不正确或者重复的定义以及其他真正的问题。Stefan 因此就正在阅读每个标题并且移除它,然后再尝试处理所破坏包装的问题。或许这告诉我们,这个 pragma 并不在内核本身中存在。当中一个 Stefan 比较常见的错误是重定义,在多个地方有定义了许多常量和宏指令。这个问题糟糕到构建环境居然溢出,从而 Stefan 需要检查日志以便查看那些错误是在哪里发生的。 连同清理标题本身,Stefan 也正在分开它们到真正的 DDK 和 PSDK,并删除数个混合用户模式和内核模式的组件标题,以及交叉包括这两者。一旦这个完成之后,或许我们可以创建一个分开的 PSDK 和 DDK。 top |