Win10的Bug-资源管理器如果有搜索过再最小化时导致重新搜索问题

资源管理器如果有搜索过文件, 再查看其他路径, 再最小化时导致重新搜索
Bug跟踪

  1. procmon 查看文件, 触发Bug搜索, 找到文件夹列表条目, 看callstack
    发现在 Windows.Storage.Search.dll
  2. 继续跟踪找到 CDefView::_OnDelayedFilterContents
  3. 继续: CDefView::_SetTextFilter
    4, 继续: CSearchBox::_OnEditChange
  4. 再继续找到消息 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
  1. 分析手动搜索和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导致隐藏自动完成, 隐藏自动完成导致重新更新搜索框的值, 这样就产生了重新搜索

  1. 修改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操作会有点麻烦

posted @ 2025-04-09 12:04  Yofoo  阅读(123)  评论(0)    收藏  举报