1703 更新后,碎片整理驱动器 (dfrgui.exe) 将无法启动

1703 更新后,碎片整理驱动器 (dfrgui.exe) 将无法启动

大家好,这是我的 HP Elitebook 8760w 上的创作者 (1703) 更新 (OS Build 15063.413) 后出现的一个奇怪的问题。Defragment and Optimize drives根本无法启动。例如,单击Start menu -> Microsoft Administrative Tools -> Defragment and Optimize Drives没有任何反应。打开任务管理器后,显然没有启动任何进程。(或运行的进程不足以注册)此外,打开管理员控制台并执行dfrgui.exe也没有任何反应。

我希望这里有人可能对如何进一步调试该问题有一些想法。从下面执行的内核跟踪来看,尝试启动dfrgui.exe结果退出状态 259和实际错误代码 15005显然指向的事件数据与清单中提供的模板不匹配?昨天早上更新之前,碎片整理和优化驱动器工作正常,现在却不行了。

我已经从更新目录更新到 KB4022716(OS Build 15063.447)——没有帮助(它确实修复了第一个版本 .413 更新中的许多其他问题)。

以下是我从命令行获取的一些诊断信息,dfrgui -- 无,defrag -- OK:

PS C:\Users\david> dfrgui
PS C:\Users\david> write-host $?
True

PS C:\Users\david> dfrgui /?
PS C:\Users\david> dfrgui c:


PS C:\Users\david> defrag /?
 Microsoft Drive Optimizer
 Copyright (c) 2013 Microsoft Corp.

Description:

        Optimizes and defragments files on local volumes to
         improve system performance.

<snip>

为了进一步解决问题,我使用一个简短的批处理文件创建了尝试启动 dfrgui.exe 的内核跟踪:

logman start "NT Kernel Logger" -p "Windows Kernel Trace" (process,thread,img,disk,net,registry) -o systemevents.etl -ets
dfrgui.exe
logman stop "NT Kernel Logger" -ets

然后我处理了事件文件,系统事件.etl,(5.5M)tracerpt systemevents.etl产生了巨大的 46M dumpfile.xml。我查看了转储文件并将其与相关的开始和结束事件配对dfrgui.exe(幸好只有 428K)。但是,我不是解释窗口内核跟踪的专家。这两个文件都太大了,无法在这里使用,但如果它们有帮助,我可以提供更多部分。

一组引人注目的事件数据是:

 <EventData>
   <Data Name="UniqueProcessKey">0xFFFFA008A692A2C0</Data>
   <Data Name="ProcessId">0xFCC</Data>
   <Data Name="ParentId">0x25F8</Data>
   <Data Name="SessionId">       1</Data>
   <Data Name="ExitStatus">259</Data>
   <Data Name="DirectoryTableBase">0x1EAF8A000</Data>
   <Data Name="Flags">       0</Data>
   <Data Name="UserSID">\\ELITE\david</Data>
   <Data Name="ImageFileName">dfrgui.exe</Data>
   <Data Name="CommandLine">dfrgui.exe</Data>
   <Data Name="PackageFullName"></Data>
   <Data Name="ApplicationId"></Data>
  </EventData>

看起来,下一个事件很重要,因为它与处理错误有关:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
   <Provider Guid="{9e814aad-3204-11d2-9a82-006008a86939}" />
   <EventID>0</EventID>
   <Version>3</Version>
   <Level>0</Level>
   <Task>0</Task>
   <Opcode>1</Opcode>
   <Keywords>0x0</Keywords>
   <TimeCreated SystemTime="2017-07-02T00:16:57.024179100-0500" />
   <Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
   <Execution ProcessID="9720" ThreadID="11156" ProcessorID="2" KernelTime="45" UserTime="15" />
   <Channel />
   <Computer />
  </System>
  <ProcessingErrorData>
   <ErrorCode>15005</ErrorCode>
   <DataItemName />
   <EventPayload>CC0F0000082800000040659081D9FFFF00E0649081D9FFFF0000C8987A00000000E0C7987A0000000F000000000000008020DDE7F77F000000B0B8987A00000000000000080502000000</EventPayload>
  </ProcessingErrorData>
  <RenderingInfo Culture="en-US">
   <Opcode>Start</Opcode>
   <Provider>MSNT_SystemTrace</Provider>
   <EventName xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">Thread</EventName>
  </RenderingInfo>
  <ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
   <EventGuid>{3d6fa8d1-fe05-11d0-9dda-00c04fd7ba7c}</EventGuid>
  </ExtendedTracingInfo>
 </Event>

错误15005代码为:

ERROR_EVT_INVALID_EVENT_DATA
  15005 (0x3A9D)
  The event data raised by the publisher is not compatible 
  with the event template definition in the publisher's manifest.

(根据: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681384(v=vs.85).aspx

我怀疑答案就埋在作为内核跟踪的一部分我发布的长字节串中。(这是我不知道如何解码的东西)。

我发现 ExitStatus 259 有点讽刺:

“重要提示:GetExitCodeProcess 函数仅在线程终止后才返回应用程序定义的有效错误代码。因此,应用程序不应使用 STILL_ACTIVE (259) 作为错误代码。如果线程返回 STILL_ACTIVE (259) 作为错误代码,则测试此值的应用程序可能会将其解释为线程仍在运行,并在线程终止后继续测试线程是否完成,这可能会使应用程序陷入无限循环。”

看:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

有人知道我可以尝试什么来运行 dfrgui.exe 吗?如果没有,我还可以做其他诊断吗?我已经在微软问答板上发帖,但到目前为止,我只收到了“Me Too”的回复和回滚的建议。(因为这似乎是我知道的唯一问题,所以回滚的风险几乎不大)。下一步该尝试什么?如果我可以发布其他可能有帮助的内容,请告诉我。


在 Biswa 的建议下,在查找了更多选项描述以defrag.exe确保操作对我的 SSD 正确后,我尝试手动调整它。它似乎dfrag.exe除了启动然后退出外什么也没做。例如,

PS C:\Users\david\Documents\dev\gtk\gtkwrite> defrag /C /H /O /V
Microsoft Drive Optimizer
Copyright (c) 2013 Microsoft Corp.

PS C:\Users\david\Documents\dev\gtk\gtkwrite> write-host $?
True

因此,它似乎defrag什么也没做,只是打印版权信息并退出。我也尝试过让它C: /A /V进行C具体分析,但无论我怎么尝试,它都只是打印版权信息并退出。

我对 defrag.exe 运行了另一个内核跟踪,输出几乎与 dfrgui.exe 相同。相同的 259 ExitStatus。defrag.exe ExitStatus 之后的事件中的 EventPayload 是:

<EventPayload>B4090000EC2B000000C0430081D6FFFF0060430081D6FFFF00003802BC00000000E03702BC0000000F0000000000000060B0E1B7F77F000000B04102BC00000000000000080502000000</EventPayload>

答案1

啊哈!我找到问题了!

由于某种无法解释的原因(也许是在 1703 安装时宇宙字符串被错误调整,或者只是小精灵),"Optimize drives"服务启动失败"Disabled"。不要问我如何或为什么...

基本上,通过侦听TaskMgr服务,我找到了'defragsvc'我随后单击 的那个"open in Services"。然后我发现“defragsvc”实际上已被重命名"Optimize drives"。检查属性后,我发现它已禁用(我将其改为'Manual')然后就好了!点击碎片整理和优化驱动器在开始菜单中现在可以正常工作。

一个该死的应用程序不告诉你,让你头疼了 4 天“嘿,我基于残疾人服务”当您从命令行调用它时...

现在微软开发人员面临的问题是“到底是什么原因导致在 1703 更新期间将其设置为禁用??“在 1703 更新之前它并没有被禁用。

相关内容