Дизассемблируем Windows Explorer — отключаем группировку на панели задач

    Однажды, в 2009 году, вышла Windows 7. В то время я сидел на Висте, которая притормаживала на моем стареньком компьютере, и я решил пересесть на семерку сразу после ее выхода.

    Первое, на что я обратил внимание после установки — новая панель задач. А конкретнее — тот факт, что она группирует кнопки по программе, к которой они принадлежат.



    Сразу же полез в настройки, чтобы отключить это безобразие, и с удивлением обнаружил, что группировка не отключается. Наиболее близкий к желаемому вариант, Never combine, кнопки все же группирует.



    Я думал, что как и мне, многим это не понравится, и был уверен, что спустя неделю-две в интернете всплывет решение этой проблемы. Но я так ничего путного и не нашел, и понял, что придется действовать самому.

    Под катом:
    • Подробная демонстрация того, как можно самостоятельно подправить принцип работы такого системного процесса, как explorer, под себя, используя отладчик OllyDbg.
    • Готовое решение описанной выше проблемы.

    Приступаем


    Для понимания описанного ниже процесса, желательно иметь базовое знание ассемблера.

    Для того, чтобы отучить панель задач от группировки, нам понадобится OllyDbgбесплатный проприетарный 32-битный отладчик уровня ассемблера для операционных систем Windows, предназначенный для анализа и модификации откомпилированных исполняемых файлов и библиотек, работающих в режиме пользователя (ring-3) © Wikipedia.

    Повторить процесс можно на ОС Windows 7 или Windows 8. К сожалению, на данный момент имеется только 32-битная версия OllyDbg, так что если у вас 64-битная ОС, повторить следующие действия у вас не получится (в таком случае можно использовать виртуальную машину).

    Инсталляция OllyDbg

    OllyDbg — портативная программа, и в инсталляции не нуждается. Создайте папку с правами записи, и перепишите туда файлы с этого архива.

    Настройка Microsoft Symbol Server

    Microsoft Symbol Server — Майкрософтовский сервер отладочных символов, благодаря которым мы, кроме чистого ассемблера, будем видеть еще и названия функций и переменных. Это очень помогает при анализе кода.

    Для этого нужно сделать следующее:
    • Скачайте этот архив, и поместите его содержание в папку программы OllyDbg.
      Что это за файлы?
      • symsrv.dll — DLL файл Майкрософта, предназначен для работы с их сервером отладочных символов. Подписан Майкрософтом.
      • symsrv.yes — пустой файл. Обозначает, что вы согласны с условиями предоставленных услуг.
      • symsrv.ini — исключает все файлы кроме тех, которые начинаются на exp — для нашего explorer.exe. Иначе, если будут качаться все символы, придется очень долго ждать, да и не нужно оно нам для данной демонстрации.
    • Включите OllyDbg, откройте настройки (Alt+O), и пометьте опцию Demangle symbolic names. Эта опция декодирует символических имена, делая их более читаемые для нас, людей.
      Скриншот
    • В настройках, откройте страницу Debugging data, и пометьте Allow access to Microsoft Symbol Server. Затем создайте папку для символов, и выберете ее в настройках, как на скриншоте.
      Скриншот
    • Перезапустите OllyDbg.

    Присоединение процесса explorer

    Как известно, панель задач — часть процесса Windows Explorer. Запускаем OllyDbg, и выбираем File -> Attach.... Затем, выбираем explorer и жмем на Attach.
    Скриншоты


    Attach, с английского — присоединять — то есть мы присоединяем наш отладчик к проводнику для его отладки.

    Затем ждем, пока все модули загрузятся. Это может занять несколько минут, и в это время проводник не будет реагировать. После завершения загрузки в строке состояния справа будет написано Paused на желтом фоне — то есть процесс приостановлен. Жмем F9 чтобы возобновить работу процесса.

    Внимание, исключения: если процесс приостанавливается, и в строке состояния появляется надпись Exception xxxxxxxx (как на скриншоте ниже), нажмите Shift+F9 чтобы передать исключение по назначению.
    Скриншот

    Обзор функций проводника

    Теперь проводник работает под надзором нашего отладчика, OllyDbg. Если связь с сервером отладочных символов прошла как следует, мы можем взглянуть на функции проводника.

    Сначала, откроем модуль процесса explorer в окошке CPU отладчика. Для этого откроем окошко модулей (буква E на голубом фоне), нажмем правой кнопкой на Explorer, и выберем View code in CPU.
    Скриншот

    Затем, нажмем правой кнопкой на код, и выберем Search for -> Names. Перед нами появится список функций, присутствующих в проводнике. Для более удобной работой со списком, отсортируем его по имени, скопируем и вставим в текст в любимый текстовой редактор.
    Скриншоты


    Итак, нам нужно отключить группировку. Логично начать поиск со слова group. В глаза сразу бросаются два класса: CTaskBtnGroup и CTaskGroup. Вместе у этих двух классов 131 функций — не очень много для беглого просмотра названий.

    Мне сложно сказать, можно ли найти нужную нам функцию, всего лишь изучая названия, так как я уже неплохо с многими из них знаком. В любом случае, нужная нам функция — CTaskGroup::DoesWindowMatch, название которой переводится как совпадает ли окошко, и делает она именно это — отвечает, подходит ли окошко к определенной группе.
    Скриншот

    Просмотр выбранной функции

    Мы нашли функцию с интересным названием, теперь давайте посмотрим, чего она из себя представляет. Вернемся в OllyDbg, нажмем на Ctrl+G и перейдем на адрес функции (тот восьмизначный номер в начале строки, в нашем случае 00973629).

    P.S. Советую включить подсветку Jumps and calls, благодаря которой четко видны вызовы функций и условные/безусловные прыжки.
    Скриншот

    Итак, вот наша функция:


    Столбцы, слева на право: адрес, байты, команды (ассемблер), комментарии.
    Голубым цветом помечены функции, желтым — переходы. На них мы и сосредоточимся.

    Первым делом, вызывается какая-то функция, и в зависимости от результата происходит переход. Здесь я на них задерживаться не буду, замечу только, что к нашей задачи они дело не имеют.

    Дальше мы видим три перехода. Первый перепрыгивает через второго и третьего. Второй и третий переходят куда-то подальше — давайте посмотрим, куда…

    Первый
    В глаза сразу бросается WinAPI функция ILIsEqual, которая сравнивает две структуры. После некоторого анализа становится ясно, что сравниваемые структуры связаны с группами. Наша цель — отменить любую группировку, так что пропатчим код так, чтобы проводник думал, что структуры не равны.



    Для этого, пропишем безусловный прыжок JMP, как на скриншоте сверху.

    Второй
    Как и в первом разе, сразу видим WinAPI функцию для сравнения, на этот раз текста — CompareStringOrdinal. Опять же, после экспериментирования становится ясно, что и это сравнение связано с группами. На этот раз сравниваются так называемые Application ID — идентификатор аппликации, по которым панель задач группирует кнопки.



    Опять же, ставим безусловный прыжок, заставляя проводника думать, что все идентификаторы разные.

    Пробуем

    Большое преимущество отладчика от, например, простого дисассемблера в том, что изменения сразу вступают в силу, так как модифицируем мы память запущенного процесса напрямую. По этой же причине нужно быть очень осторожным, так как ошибка может привести к краху процесса.

    Попробуем открыть несколько копий блокнота, и увидим, что они не группируются:



    Получилось :)

    Так как мы изменили код только в памяти запущенного процесса, наша модификация продержится только до завершения процесса.

    Бонус — декомпилированная версия функции CTaskGroup::DoesWindowMatch

    Несмотря на то, что оригинальный язык данного кода — C++, ниже превидена самописная декомпиляция на чистом C.

    /*
    return:
    S_OK if there's a match, E_FAIL otherwise
    
    *pnMatch:
    1: AppId matches, ITEMIDLIST is missing
    2: AppId matches, ITEMIDLIST doesn't match
    3: ITEMIDLIST matches
    4: hWnd already exists (pTaskItem recieves the CTaskItem)
    */
    
    HRESULT CTaskGroup_DoesWindowMatch(void /*CTaskGroup*/ *this, 
    	/*IN*/ HWND hCompareWnd, /*IN*/ ITEMIDLIST *pCompareItemIdList, /*IN*/ WCHAR *pCompareAppId, 
    	/*OUT*/ int *pnMatch, /*OUT*/ void /*CTaskItem*/ **pTaskItem)
    {
    	void /*CTaskItem*/ *CompareWndTaskItem;
    	int nMatch;
    	HRESULT hr;
    
    	nMatch = 0;
    
    	hr = this->lpVtbl->GetItemFromWindow(this, hCompareWnd, &CompareWndTaskItem);
    	if(SUCCEEDED(hr)) // if an item for this window already exists
    	{
    		if(pTaskItem)
    		{
    			*pTaskItem = NULL;
    			IUnknown_Set(pTaskItem, CompareWndTaskItem);
    		}
    
    		nMatch = 4;
    		CompareWndTaskItem->lpVtbl->Release(CompareWndTaskItem);
    	}
    	else
    	{
    		if(!(this->SomeFlags & 0x80000000))
    		{
    			if(pCompareItemIdList && this->pItemIdList && ILIsEqual(pCompareItemIdList, this->pItemIdList) != 0)
    			{
    				nMatch = 3;
    				hr = S_OK;
    			}
    			else if(pCompareAppId && CompareStringOrdinal(this->pAppId, -1, pCompareAppId, -1, TRUE) == CSTR_EQUAL)
    			{
    				hr = S_OK;
    
    				if(pCompareItemIdList && this->pItemIdList)
    					nMatch = 2;
    				else
    					nMatch = 1;
    			}
    		}
    	}
    
    	*pnMatch = nMatch;
    
    	return hr;
    }
    


    Готовое решение


    Программа 7+ Taskbar Tweaker, автором которой являюсь я, умеет отключать группировку как глобально, так и выборочно по Application ID. Кроме этого, имеются в наличие еще несколько интересных настроек панели задач.



    Заключение


    Иногда я открываю статью на хабре, которая кажется мне интересной, но после того как начинаю читать, понимаю что она не такая уж и интересная (или не очень понятная). В таких случаях я часто сразу перелистываю вниз к заключению/выводам.

    Если вы находитесь здесь по этой же причине, расскажу вкратце о чем шла речь:
    Я взял отладчик, и присоединил его к проводнику. Затем я нашел нужную функцию, и изменил ее так, чтобы проводник думал, что любое созданное окошко не подходит ни к одной из существующих групп. В связи с этим изменением, проводник перестал группировать кнопки на панели задач.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 113
    • –5
      ОМГ, правой кнопкой мыши -> Properties -> Taskbar buttons -> Never combine.
      Патчить то, что под WFP нехорошо.
      • +32
        Я вроде написал, что о существование такой опции знаю, но группировку она все равно не отменяет.

        Пример: у меня одновременно открыто несколько проектов, каждый из них лежит в своей папке.
        Мне удобно, когда панель задач выглядит подобным образом:



        В противном случае, все папки будут собраны в кучу, да и к тому же Windows не позволяет менять их распорядок. По моему не очень удобно.

        Можно, конечно, привыкнуть, но зачем? :)
        • +7
          Не знаю, как там в windows, но слышал, что тоже есть понятия нескольких рабочих столов? Почему бы не использовать их для разделения работы с несколькими проектами одновременно?
          • –8
            В windows зер из онли уан стол.
            • +24
              technet.microsoft.com/en-us/sysinternals/cc817881.aspx
              Вот вам 61кб счастья.
              • +2
                Лучше VirtuaWin
                • –1
                  Огромное спасибо! Наконец-то нашел систему виртуальных столов, где полностью корректно работает Chrome и еще некоторый нужный мне софт) Жалко, что не могу в карму плюс поставить…
                • +1
                  Не знаю как вас отблагодарить!
                  Вы только что перевернули мой мир. Да, я конечно, знал и пробовал рабочие столы от разных создателей… но работало оно «не очень». То что есть такое же от MS я не знал.

                  Спасибо
                  • 0
                    Тогда советую вам поизучать по подробнее что у них есть: technet.microsoft.com/en-us/sysinternals/bb842062
                    Тут целый кладезь полезных утилит. Кстати ихние виртуальные столы с dwm никак не хотят дружить ;)
                  • 0
                    отличная штука, спасибо :) я знал, что в виндовс есть недоступные по умолчанию рабочие столы, но не знал что активировать их так просто :) Марк Русинович опять доставляет. Раньше использовал Aston — но он немного корявенький, ну и «прошли времена уж те» (С).
                    • 0
                      Лучше Dexpot
                      Даже не знаю чего в нем нет.
                  • +2
                    Из коробки у винды такой опции нет. Есть сторонние приложения, предлагающие эту фичу, но они тоже не идеально работают.

                    Да и удобнее, по моему, когда все на одном экране. Пока есть место :)

                    А когда оно заканчивается… тот твикер, о котором я упомянул в статье, умеет не только отключать группировку, но и группировать произвольные кнопки:
                    Скриншот
                    • –3
                      я в непонятках
                      у меня у одного в Windows 7 при отключении группировки, панель задач работает так, как хотел автор?
                      • +1
                        Ну лично у меня, если попробовать перетащить мышкой один из значков, например, проводника, перетащится и второй…
                    • +18
                      Хабр торт :)
                      В macosx, когда я хочу прибегнуть к подобной модификации программы, я иду немножко другим путем.
                      С помощью obj-dump я достаю полный дамп заголовков из бинарника, а не дизасемблирую его. Имея эти заголовки я могу, воспользовавшись проектом SIMBL, IMBL (можно и без него, конечно — этот проект просто позволяет не писать сотню-другую boilerplate кода) подменить (привычный и знакомый многим swizzle) имплементации методов в момент запуска приложения.

                      Преимущество такого подхода — после обновления приложения модификация не слетит (вероятность изменения сигнатуры метода мала), бинарник не модифицируется и как следствия не слетает codesign и можно свои модификации отключить просто убрав их из инжектора.

                      Подумал, может статью написать… Такие интересные вещи можно этим делать оО
                      • +7
                        Конечно написать. Было бы интересно почитать про это дело.
                        • 0
                          Теперь нужно придумать что-то интересное.
                          Кстати, я же уже публиковался с результатом: habrahabr.ru/post/151746/
                          Только вот не описывал, как я это сделал. Надо придумать новый tweak.
                          • 0
                            Интересное — напишите, пожалуйста, аналог DeathToDSStore.app, было бы интересно посмотреть, как хорошо оно будет работать.
                            • 0
                              на съемных дисках с FAT и NTFS когда он надумает писать этот файл — пусть передумает. А если какойто извращенец хочет с флешки запускать скрипты или еще чего-нить пусть создаст в папке файл .DS_Store и тогда Finder сможет его изменять. Но чтобы создавать не мог сам…
                              • 0
                                Кстати, как насчет того, чтобы использовать xattr-ы директорий для хранения содержимого .DS_Store? Т.е. перехватывать попытку создания файла .DS_Store и форвардить его в setxattr/fsetxattr для той же директории, в которой он должен был бы храниться.

                                И функциональность Finder-а в виде цветных закладок и порядка сортировки значков сохранится, и ничего мешать не будет.
                          • 0
                            Напишите, правда — потому Хабр и торт, что такое на нем встречается!
                            • НЛО прилетело и опубликовало эту надпись здесь
                            • 0
                              напишите, с удовольствием почитаю, как, думаю, и многие на хабре. Как можно без него, как становится лучше с ним:)
                              • +1
                                Ну чтож. Уговорили. Цикл статей
                                1. Свой инжектор.
                                2. Своим инжектором встраиваемся в свое приложение и подменяем методы
                                2.1 Уже в чужое (принимаются предложения. Пока что планирую научить Ecoute ходить по списку песен одним кликом, а не двумя)
                                3. Используем для этих целей SIMBL

                                Пошел писать инжектор, к черту матан.
                                • 0
                                  просьба кинуть в ПМ линк на статью, а то могу пропустить:)
                                  • +2
                                    правильно, делегируй свою задачу в чужой список задач!
                            • –3
                              Друг, запили лучше «Пуск» в 8ку
                          • +3
                            Об этом в самом начале топика написано.
                            Речь о том, что если открыть блокнот, потом, например консоль, а потом ещё один блокнот, то они выстроятся не по порядку открытия, а два блокнота, и потом консоль.
                            То есть тут скорее фиксилась сортировка, а не группировка.
                            • +1
                              И по мне так это даже удобно (не группировка, а именно такая сортировка)… так как через некоторое время интуитивно тыкаешься в нужное место в зависимости от приложения…
                              • +1
                                Это замечательно, что Вам удобно. А мне не удобно. Поэтому всем было бы хорошо, если бы интерфейс настраивался. Но ребята из MS почему-то решили, что такие пользователи как Вы есть, а таких как я нет.
                            • +1
                              В третьем абзаце про это написали. Даже со скриншотом.
                            • +1
                              (был дубль)
                              • –3
                                Стандартная настройка Win-7 прекрасно работает, и группировки кнопок при её использовании не замечено. Это раз.

                                А два — привыкнуть к их группировке занимает от силы пару недель, и навигация потом уже не вызывает никаких затруднений.
                                • –1
                                  Just for fun?
                                  • 0
                                    Группировки не будет, если вам нужны заголовки. Меня вот они не интересуют, а группировку убрать хочется. И хороша она ровно до момента, когда придётся много раз обратиться к одной из копии приложения и дрэг&дропнуть оттуда что-нибуль. Я уже задолбался.
                                  • +1
                                    Надеюсь здесь нет юристов российского представительства мелкософта, подсудное же дело :)
                                    • +6
                                      Если не ошибаюсь, по российскому законодательству, если ты легально приобрел софт, то отлаживать и декомпилировать его имеешь право :)
                                      • 0
                                        Если не ошибаюсь, в последней редакции 4й части ГК убрали явное указание этого.
                                        • +1
                                          В действующей редакции это есть. Другое дело, что делиться полученной в результате декомпилирования информацией, вообще-то, нельзя.
                                          • 0
                                            Там разрешено только исправлять явные ошибки и несовместимость. Остальное дизассемблирование запрещено EULA, в ГК ничего не написано по этому поводу, значит, действует запрет из EULA.
                                            • 0
                                              Тут явная системная несовместимость с мозгом топик-стартера, потому нарушений ГК нет.
                                    • +5
                                      Это как раз та проблема, к которой я долго и тщетно искал решение. Думал, что таки будет когда-нибудь опубликовано решение без дополнительных утилит-твиков. Но, как Вы показали, такого решения не существует, к сожалению. Это плохая для меня новость.

                                      Но есть и хорошая новость. Теперь есть твикер которому бы я доверил свой комп (в общем случае я не доверяю подобному софту). Спасибо Вам огромное.
                                      • 0
                                        интересно, сколько нужно будет провести времени в отладчике, когда Вы пересядете на Windows 8? Там допиливать поболе придется
                                        • +2
                                          Все давно сделано :)
                                          На самом деле, портирование на Windows 8 было не такое сложное, код у обоих очень похож в плане панели задач. Единственное серьезное нововведение — поддержка нескольких мониторов.
                                          • 0
                                            Время, проведенное в отладчике, летит незаметно) Последний раз 2 игры ковырял, одну неделю, другую месяц. В итоге мозг радуется и довольно урчит.
                                          • +1
                                            Поначалу тоже бесило, что нельзя отменить группировку. А сейчас как-то попривык, даже логичной ее нахожу. Но утилитка интересная, вот бы три назад ее.
                                            • 0
                                              Вообще-то три года назад она уже была :)
                                              image
                                            • 0
                                              Microsoft Symbol Server показывает названия функций для всех программ, или только для тех, которые написаны Microsoft? Мне кажется, это странно, что из скомпилированной программы можно вынуть человекочитаемые название — разве это не избыточная информация?
                                              • 0
                                                И еще. Можно ли во время взаимодействия с процессом смотреть какой код сейчас исполняется? С паузой на каждую строку, как положено.
                                                Я почему спрашиваю: есть программа, которая на определенное событие умеет только прогрывать wav файл, хотелось бы научить ее пищать PC Speaker'ом.
                                                • 0
                                                  Можно ходить по «строкам», между чем меняя код или данные. Можно ставить breakpoint-ы. Много всякого можно.
                                                  Есть даже плагин для писания скриптов: ODBGScript.
                                                • 0
                                                  Только Майкрософтовские, конечно. В целом этот сервер предоставляет отладочные .pdb файлы, которые, кстати, можно скачать и пачкой:
                                                  msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx

                                                  Насчет избыточной информации — для этого оно и предназначено. Зачем Microsoft их публикует, я не знаю :)
                                                • 0
                                                  Рад новой статье по реверсингу. Пишите еще!
                                                  Печально, что до сих пор не сделали 64-битную Ольку.
                                                  • +1
                                                    Восхитительно. А что же круглосуточная (?) техподдержка МС?
                                                    • +5
                                                      Думаете, она удалённо добавит недостающую логику в explorer.exe? :)
                                                    • +2
                                                      замечательная программа, использую давно, спасибо вам, RaMMicHaeL, всем делать donate
                                                      • 0
                                                        Ох, спасибо тебе милчеловек за информацию по интеграции OllyDbg и Mycrosoft Symbol Server. Знатно я в своё время насиловал гугл по этому вопросу, но так и не нашел пояснений.
                                                          • –1
                                                            за исключением мелочей это прекрасный дизайн, современным дизайнерам есть чему на этом примере поучиться
                                                            • 0
                                                              Да, действительно, есть над чем поработать:
                                                              1. Неизменяемый размер окна.
                                                              2. Custom list неюзабелен из-за микроскопического размера, Allow list и Reject list тоже будут неудобны.
                                                              3. Overwrite logfile и Save to custom dir должны быть дополнены кнопочкой выбора файла/директории с помощью системного диалога.
                                                              4. Список Accept/Reject не кастомизируется.
                                                              5. Отсутствие акселераторов (хотя возможно они присутствуют, но просто не видны пока не нажат Alt).

                                                              И мы ещё не видели, что скрывается за кнопкой Pro Mode, возможно там всё это исправлено.
                                                            • +1
                                                              Пользуюсь вашей программой уже несколько лет, спасибо вам большое!
                                                              • +1
                                                                Только хотел написать «зачем изобретать велосипед, есть же замечательная 7+ Taskbar Tweaker» как вдруг… :)
                                                                • 0
                                                                  RaMMicHaeL
                                                                  Спасибо большое :-)
                                                                  Если можно, расширьте возможности «не группировать закр. элементы» для отдельных процессов, то цены не будет вашему приложению
                                                                  • +2
                                                                    Уже есть :)

                                                                    Вот
                                                                    Третья опция, Group pinned item (Группировать закрепленный элемент).

                                                                    image
                                                                • 0
                                                                  Я привык как есть, не знаю что удобнее, но привык.
                                                                  • 0
                                                                    Вот научиться бы окна в пределах группы сортировать, вот бомба была бы!
                                                                    • +5
                                                                      И это умеем :)
                                                                      Опция в твикере: Эскизы -> Менять местами перетягиванием
                                                                      • +3
                                                                        ААА чувааак! You made my day! Это то чего мне очень долго не хватало. Молю бога что это ещё и у меня в 8ке дома заработало. Задонатил немного :)
                                                                    • +2
                                                                      Мы ждали вас на хабре! Давайте теперь про ваш знаменитый плагин для Ольги :)
                                                                      • 0
                                                                        Сайт недоступен. Думал вечером скачаю, но видимо кончились лимиты на хостинге. Где можно еще скачать?
                                                                        И до кучи вопрос: есть ли простая программа — вертикальное меню без каких-либо спецэффектов, котрое открывается при подведении мыши к краю экрана?
                                                                      • 0
                                                                        Может кто на будь пропатчить Explorer так, что бы он не ругался на файлы с именами начинающимися с точки и без расширения? Типа ".htaccess".
                                                                        • +6
                                                                          Существует такой трюк: если добавить точку в конце, например ".htaccess.", Explorer ничего не будет иметь против, а последнюю точку сбросит.
                                                                          • 0
                                                                            Я про это знаю, но, как правило, вспоминаю после того, как explorer один раз откажется переименовывать.
                                                                            • 0
                                                                              Эта проверка находится в библиотеке shell32.dll, в функции IsEmptyFileName.

                                                                              Скриншот

                                                                              На скриншоте видно, что совершается проверка CMP EAX, 2E — то есть равен ли первый символ точке. Если заменить условный прыжок на безусловный, как на скриншоте, ошибки не будет.
                                                                        • +1
                                                                          Отдельное спасибо за отличную статью и отличную софтину.
                                                                          • +2
                                                                            Расскажите, пожалуйста, как Ваш твикер уживается с разными версиями explorer.exe? В разных пакетах обновления и обновлениях безопасности адреса заплаток разные же. Вы храните наборы заплаток для всех известных версий? Или распознаёте нужные адреса на ходу?
                                                                            • +3
                                                                              То, что описано в статье — демонстрация самого простого способа изменения работы процесса.
                                                                              Твикер не модифицирует код, он использует более «совместимые» методы, среди которых:
                                                                              * Хук функции методом подмены указателя в таблице виртуальных функций.
                                                                              * Внутренние структуры.
                                                                              * Subclassing окон.

                                                                              За все время существования твикера, он ни разу не ломался из за обновления explorer.exe.
                                                                              • 0
                                                                                У таблицы виртуальных функций и у внутренней структуры всё же нужно определить адрес. Как? Читаете из PDB? (Если это секретное ноу-хау, так и скажите – я отстану.)
                                                                                • +1
                                                                                  Да нет, не секрет. Все очень просто.

                                                                                  Все начинается с окошек:
                                                                                  hTaskbarWnd = FindWindow(L"Shell_TrayWnd", NULL);
                                                                                  hTaskbandWnd = (HWND)GetProp(hTaskbarWnd, L"TaskbandHWND");
                                                                                  hTaskListWnd = FindWindowEx(hTaskbandWnd, NULL, L"MSTaskListWClass", NULL);
                                                                                  

                                                                                  У этих окошек проводник хранит указатель на класс в DWLP_MSGRESULT:
                                                                                  lpTaskListLongPtr = GetWindowLongPtr(hTaskListWnd, DWLP_MSGRESULT);
                                                                                  

                                                                                  В этих классах есть много всего интересного, например массив кнопок панели задач, который, кстати, хранится в виде dynamic pointer array (DPA).
                                                                            • +1
                                                                              > Если вы находитесь здесь по этой же причине
                                                                              А я все внимательно прочитал. Спасибо, очень захватывающе.
                                                                              • +1
                                                                                Это первая программа, которую я ставлю на новую семерку.

                                                                                К сожалению, когда на новой работе оказалась 7 винда, я не смог отключить идиотские всплывающие эскизы над кнопками на панели задач (как и не смог крепить папки в виде панели задач на части рабочего стола, как можно в XP). Эскизы всплывают при ховере. Ховер — самое ужасное событие на которое можно навесить действие (для сайтов кстати тоже).

                                                                                Так вот, перерыв весь гугл, я не нашел ничего (было года 3.5 назад). Гуглил в несколько подходов в разные дни, каждый раз не в состоянии поверить что это невозможно пофиксить. Ну и в навыках гугления себя ламером не назову. Всегда считал что могу нагуглить все что угодно. Пришлось смириться.

                                                                                Так я проработал 1.5 года.
                                                                                Терпел, но не смирился.

                                                                                Потом уволился с работы, и в один прекрасный день, решил купить себе новый ноут.
                                                                                С предустановленной лицензионной win7.

                                                                                Конечно, на своем собственном ноуте у меня было еще меньше желания продолжать видеть эти эскизы и группировку. Заранее зная о проблеме (предварительно погуглив еще разок) я предупредил продавца — куплю ноут только если отключите всплывающие эскизы. Продавец воспринял спокойно (видимо знал про Taskbar Tweaker, покопался в гугле минут пять и протянул мне бумажку с написанным названием твикера.

                                                                                Вот такая история.

                                                                                Теперь твикер ставлю на все 7 по дефолту в автозагрузку.
                                                                                За программу автору невыразимый респект и почтение!
                                                                                Он — Человек с большой буквы!
                                                                                • +1
                                                                                  спасибо за программу!
                                                                                  было бы круто еще добавить возможность настраивать какие программы закрывать клавишей Esc и возможность тягать окна с Alt(хотя для этого есть твикеры но что б не ставить 2)
                                                                                  • +1
                                                                                    Просто супер!

                                                                                    image — радовался при каждом проставлении галочки.
                                                                                    • 0
                                                                                      Дизассемблер — это хорошо. Но вы будете смеяться: не далее как 3 дня назад я решал как раз эту задачу, и за пару минут нагуглилось вот что: superuser.com/questions/30007/is-there-any-way-to-hide-taskbar-labels-and-not-combine-taskbar-buttons

                                                                                      Как видите, решается простым созданием ключа в реестре. У меня, правда, размер шрифта нестандартный, поэтому пришлось поэкспериментировать с MinWidth, но в итоге все работает идеально.
                                                                                      • 0
                                                                                        Речь ведь совсем не об этом.

                                                                                        То, что описано по ссылке — вариант группировать, но не комбинировать.
                                                                                        То, что я описал в статье — полное отключение группировки.

                                                                                        Откройте у вас несколько копий блокнота, и сравните с этим скриншотом:
                                                                                        image

                                                                                        У вас они будут «слипнутые», и разлучить, или поменять местами, их не получится.
                                                                                        • 0
                                                                                          Да, вы правы: комбинирование выключилось, но группировка осталась. (Под группировкой понимается то, что 3 блокнота таскаются по панели задач, как единое целое; кстати, у вас в статье не акцентировано внимание на определении того, что такое «группировка».)
                                                                                      • 0
                                                                                        Еще было бы интересно почитать статью про то, как ваше приложение патчит эксплорер рантайм…
                                                                                        • 0
                                                                                          Что именно интересует?
                                                                                          Некоторые аспекты описаны здесь.
                                                                                          • 0
                                                                                            Просто более подробное описание этих идей. Хотя с другой стороны — читать всегда проще, чем писать… можно и самому разбраться если что.
                                                                                        • –2
                                                                                          Статья — интересная, программа — полезная, но…
                                                                                          keep it simple
                                                                                          • +3
                                                                                            Вы предлагаете визардов нагородить вместо компактного диалога настроек? Или может быть убрать настройки вовсе, как в продуктах Google и Apple?
                                                                                            • +2
                                                                                              А по-моему очень удобно. Все настройки сразу на виду. Вы можете быстро пробежаться глазами по трём колонкам настроек и выбрать то, что вам нужно. Вот если бы настроек было бы ещё больше, то уже можно было бы сделать вкладки по категориям, или слева дерево страниц с настройками.
                                                                                            • 0
                                                                                              RaMMicHaeL, а вы можете добавить в свою программу опцию показывания номера программы на «супербаре»? Что-то вроде вот этого.
                                                                                            • 0
                                                                                              Очень не хватает кастомизации часиков. Хотелось бы вывести секунды. Стандартные средства, к сожалению, не позволяют этого сделать.
                                                                                              Знаете, иногда бывает нужно что-нибудь замерить. Например, сколько секунд отрабатывает тот или иной алгоритм. И приходится либо считать в уме, либо кликать по часикам, открывая отдельный диалог. Пробовал разные утилиты — но всё не то. Хотелось бы страндартные часы, но просто с другим форматом отображения. Даже начали мысли посещать, что надо свою утилитку писать для этих целей :)
                                                                                              • 0
                                                                                                Я для этого использую clock.exe, который был ещё в NT4. Держу включенной галку «Always on top», а окно помещено в правый нижний угол поверх штатных часов. Есть и цифровой и аналоговый внешний вид, если помните.
                                                                                              • 0
                                                                                                А можно из группы выделить одно окно отдельно остальные оставляя сгруппировано?
                                                                                                • +1
                                                                                                  Можно, или с помощью опции «Перетягивать внутри/между группами правой кнопкой мыши», или с помощью инспектора задач.
                                                                                                  • 0
                                                                                                    Как работает опция «Перетягивать внутри/между группами правой кнопкой мыши» к сожалению так и не разобрался, соединить в одну группу разные приложения можно, а разъединить никак не получается, а каждый раз лазить в инспектор задач не очень удобно.
                                                                                                    • +1
                                                                                                      Если группа комбинированная, то никак.
                                                                                                      Чтобы временно раскрыть группу, можно использовать опцию Раскрывать: Активную группу / При наведении мыши.

                                                                                                      Видео пример, с 0:55 по 1:05:
                                                                                                      rammichael.com/7-taskbar-tweaker-v2-0
                                                                                                      • 0
                                                                                                        Спасибо! При раскрытии значки уже можно отделять, то что нужно.
                                                                                                • 0
                                                                                                  Просто отличная утилита! Очень помогает в работе. Спасибо))))
                                                                                                  • +1
                                                                                                    На этот раз сравниваются так называемые Application ID — идентификатор аппликации, по которым панель задач группирует кнопки.

                                                                                                    Однажды знакомая, живущая в Германии, перевела «application» как «аппликация». Я её поправил, а она возразила, что «у вас тоже скоро все так будут говорить». Видимо, она была права :)
                                                                                                    • 0
                                                                                                      А можно ли сделать так, чтобы через инспектор задач можно было переопределить для отдельного приложения отображение списков либо эскизов? Например, хочу для всего эскизы, а для проводника — списки.
                                                                                                      • 0
                                                                                                        Такой возможности нету.
                                                                                                        • 0
                                                                                                          Не планируете? Или вообще малореально такое реализовать
                                                                                                          • 0
                                                                                                            Пока нет, опция не очень востребованная.
                                                                                                            Насколько реально реализовать — сложно сказать, надо покопаться с отладчиком.
                                                                                                      • 0
                                                                                                        Вот спасибо тебе святой человек! Полдня убил пытаясь сделать так, чтобы закрепленные окна отображались значками. Яндекс в ответ на это ничего путного не выдает. Оказывается, надо было подойти с другой стороны — убрать показ меток с определенных окон. С помощью вашей программы это удалось сделать!

                                                                                                        PS: Отправил вам денежку на пиво )))

                                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.