Win10的Bug-资源管理器如果有搜索过再最小化时导致重新搜索问题
资源管理器如果有搜索过文件, 再查看其他路径, 再最小化时导致重新搜索
Bug跟踪
- procmon 查看文件, 触发Bug搜索, 找到文件夹列表条目, 看callstack
发现在 Windows.Storage.Search.dll - 继续跟踪找到 CDefView::_OnDelayedFilterContents
- 继续: CDefView::_SetTextFilter
4, 继续: CSearchBox::_OnEditChange - 再继续找到消息 0x402, 发送源自 CSearchBox::OnListenedPropertyChanged
.text:00000001800BAB40 BA 02 04 00 00 mov edx, 402h ; Msg
.text:00000001800BAB45 4C 63 8D B0 00 00 00 movsxd r9, dword ptr [rbp+0B0h] ; lParam
.text:00000001800BAB4C 41 B8 00 03 00 00 mov r8d, 300h ; wParam
.text:00000001800BAB52 48 8B 4D 40 mov rcx, [rbp+40h] ; hWnd
.text:00000001800BAB56 C7 85 9C 00 00 00 01 00 00+ mov dword ptr [rbp+9Ch], 1
.text:00000001800BAB60 48 FF 15 51 B9 0F 00 call cs:__imp_PostMessageW
- 分析手动搜索和Bug触发方式
手动输入
0000000002E8D0C8 00007FFE8DE64E8B 00007FFE77EBAB60 100 explorerframe.Windows::Internal::SyncRootHelpers::`dynamic atexit destructor for 's_syncRootManagerRegistryPath''+264C0
0000000002E8D1C8 00007FFE77E81D0C 00007FFE8DE64E8B 2A0 dui70.DirectUI::Element::OnPropertyChanged+53B
0000000002E8D468 00007FFE8DE5EE7C 00007FFE77E81D0C 180 explorerframe.CSearchEditBox::OnPropertyChanged+3C
0000000002E8D5E8 00007FFE8DE6467F 00007FFE8DE5EE7C F0 dui70.DirectUI::Element::_PostSourceChange+45C
0000000002E8D6D8 00007FFE8DE4CC4F 00007FFE8DE6467F 40 dui70.DirectUI::Element::_SetValue+33F
0000000002E8D718 00007FFE77EBF770 00007FFE8DE4CC4F 70 dui70.public: long __cdecl DirectUI::Element::SetContentString(unsigned short const * __ptr64) __ptr64+3F
0000000002E8D788 00007FFE70716446 00007FFE77EBF770 E0 explorerframe.Windows::Internal::SyncRootHelpers::`dynamic atexit destructor for 's_syncRootManagerRegistryPath''+2B0D0
0000000002E8D868 00007FFE70715B9A 00007FFE70716446 A0 msftedit.CCallMgrCenter::SendAllNotifications+316
0000000002E8D908 00007FFE7071365E 00007FFE70715B9A C80 msftedit.CCallMgrCenter::ExitContext+15A
0000000002E8E588 00007FFE77F18D7A 00007FFE7071365E 90 msftedit.CTxtEdit::TxSendMessage+A6E
0000000002E8E618 00007FFE8DE69202 00007FFE77F18D7A 390 explorerframe.public: virtual void __cdecl CSearchEditBox::OnInput(struct DirectUI::InputEvent * __ptr64) __ptr64+41A
0000000002E8E9A8 00007FFE8DDADC91 00007FFE8DE69202 A0 dui70.DirectUI::Element::_DisplayNodeCallback+4F2
最小化触发Bug
0000000002E8C038 00007FFE8DE64E8B 00007FFE77EBAB60 100 explorerframe.Windows::Internal::SyncRootHelpers::`dynamic atexit destructor for 's_syncRootManagerRegistryPath''+264C0
0000000002E8C138 00007FFE77E81D0C 00007FFE8DE64E8B 2A0 dui70.DirectUI::Element::OnPropertyChanged+53B
0000000002E8C3D8 00007FFE8DE5EE7C 00007FFE77E81D0C 180 explorerframe.CSearchEditBox::OnPropertyChanged+3C
0000000002E8C558 00007FFE8DE6467F 00007FFE8DE5EE7C F0 dui70.DirectUI::Element::_PostSourceChange+45C
0000000002E8C648 00007FFE8DE4CC4F 00007FFE8DE6467F 40 dui70.DirectUI::Element::_SetValue+33F
0000000002E8C688 00007FFE77EBF770 00007FFE8DE4CC4F 70 dui70.public: long __cdecl DirectUI::Element::SetContentString(unsigned short const * __ptr64) __ptr64+3F
0000000002E8C6F8 00007FFE70716446 00007FFE77EBF770 E0 explorerframe.Windows::Internal::SyncRootHelpers::`dynamic atexit destructor for 's_syncRootManagerRegistryPath''+2B0D0
0000000002E8C7D8 00007FFE70715B9A 00007FFE70716446 A0 msftedit.CCallMgrCenter::SendAllNotifications+316
0000000002E8C878 00007FFE7070CD50 00007FFE70715B9A 2A0 msftedit.CCallMgrCenter::ExitContext+15A
0000000002E8CB18 00007FFE706E91A1 00007FFE7070CD50 40 msftedit.CTxtEdit::SetText+730
0000000002E8CB58 00007FFE77E84A85 00007FFE706E91A1 60 msftedit.public: virtual long __cdecl CTxtEdit::TxSetText(unsigned short const * __ptr64) __ptr64+21
0000000002E8CBB8 00007FFE77EBF630 00007FFE77E84A85 30 explorerframe.CSearchEditBox::_SetText+45
0000000002E8CBE8 00007FFE77E863A7 00007FFE77EBF630 30 explorerframe.Windows::Internal::SyncRootHelpers::`dynamic atexit destructor for 's_syncRootManagerRegistryPath''+2AF90
0000000002E8CC18 00007FFE77E40854 00007FFE77E863A7 70 explorerframe.public: virtual long __cdecl CSearchBox::HideSuggestions(void) __ptr64+17
0000000002E8CC88 00007FFE77E3FB00 00007FFE77E40854 120 explorerframe.CExplorerFrame::_OnSize+170
从这可以看到触发的原因: 窗体在最小化时触发 OnSize, OnSize导致隐藏自动完成, 隐藏自动完成导致重新更新搜索框的值, 这样就产生了重新搜索
- 修改dll修改bug
简单可以直接修改HideSuggestions, 这个一般没用, 直接在隐藏自动完成时不更新值
public: virtual long __cdecl CSearchBox::HideSuggestions(void) __ptr64
00007FFE77E86390 | 48:83EC 28 | sub rsp,0x28 |
00007FFE77E86394 | 48:8B49 38 | mov rcx,qword ptr [rcx+0x38] |
00007FFE77E86398 | B8 05400080 | mov eax,0x80004005 |
00007FFE77E8639D | 48:85C9 | test rcx,rcx |
00007FFE77E863A0 | EB 05 | jmp explorerframe.7FFE77E863A7 |
00007FFE77E863A2 | E8 0D000000 | call <explorerframe.public: long __cdecl CSearchEditBox::HideSuggestions(void) __ptr |
00007FFE77E863A7 | 48:83C4 28 | add rsp,0x28 |
00007FFE77E863AB | C3 | ret |
修改后确认有效, 替换系统dll操作会有点麻烦

浙公网安备 33010602011771号