Для Windows XP есть полностью рабочий пример: rouse.drkb.ru/winapi.php#fwoledragdrop
Для Vista и выше, в нем работает только копирование в буфер и вставка, перетаскивание не срабатывает.
По всей видимости требуется поддержка дополнительных интерфейсов, по аналогии с реализацией расширений проводника на базе IShellFolder (там требовалось поддержка IPersistFolder2 и еще какой-то, на вскидку уже не помню).
Пока что руки не дошли для добавления поддержки Vista и выше, как появиться время — обновлю пример.
Ну я думаю это перебор :)
Так можно и псевдохэндлы для процесса и нити (-1/-2) в константы вынести.
Я думаю здесь логика проста — есть список, список ZERO_BASE, т.о. в списке не может быть элементов по отрицательному индексу.
А раз это не возможно — зачем такие сложности? :)
If the index value is 0xFFFFFFFF, the return value is a count of the dropped files. Note that the index variable itself returns unchanged, and therefore remains 0xFFFFFFFF.
Судя по коду (пардон переводил на лету без тестирования) он должен работать в том числе и под XE3.
По крайней мере я не вижу препятствий, ибо работа со строковыми буферами в юникодных версиях Delphi автоматом будет нивелироваться вызовом DragQueryFileW
Можно и готовым решением, только это статья по реализации перехвата с использованием Delphi, под которую кстати я не знаю, существует ли порт API Detours или нет.
Задача статьи была дать понимание как это работает, а готовые решения они немного для другого предназначены. :)
— если в начале перехватываемой функции сразу за основным телом следуем XMM инструкция — то вы получите проблему
— если на один исполняемый образ ссылаются более 1 активного потока выполнения
Эмм, так ведь это применяется только в случае HotPatch. т.е. когда мы имеем функцию которая всегда начинается с двубайтовой инструкции и предваряется пятью нопами. Т.е. что будет в начале MOV EDI, EDI, что вместо нее будет JMP SHORT -7, на XMM инструкцию это никак не повлияет. То-же относится и к лимитированию по длину прыжка — у нас всегда есть пять нопов перед процедурой.
Что-же по поводу CMPXCHG8B то именно для данной ситуации он ИМХО избыточен, но вот если у нас нет первой двубайтовой инструкции и нопов спереди, то его использование более чем оправдано.
Ну а Dr регистры — это все-же отладчик, это уже немножко вне рамок статьи :)
Я постараюсь объяснить свою позицию.
Ms-Rem очень отличный специалист и энтузиаст своего дела.
Но он больше придерживается позиции взлома ПО и практически не рассматривает в своих статьях методы противодействия.
Почему придерживается?
Да если честно, я считаю что он просто сошел со сцены и стараюсь не верить в ту историю с аварией.
(по крайней мере очень сильно стараюсь не верить ибо ходят слухи не первый год, что это не так).
Я же работаю немного с другой стороны баррикад, где приходится знать всю эту «подноготную» плюс немножко еще, чтобы опережать хотя-бы на шаг.
Кстати немножко по Вашей статье, я заметил в ней небольшой недочет (правда не принципиальный).
Кроме того, если размер функции меньше 5 байт, перехват просто невозможен.
Это немного не верно, минимальный размер функции которую действительно нельзя перехватить равен одному байту, но в данном случае это будет RET и смысл в его перехвате попросту отсутствует.
Для двубайтовых функций есть диапазон в 256 байт.
Т.е. места достаточно для JMP SHORT, при условии что в ближайших 127 байтах сверху или снизу, будет неиспользуемые 5 байт для JMP NEAR OFFSET.
Ваша статья хорошая, не спорю.
Правда у Вас рассмотрен исключительно сплайсинг, я же попытался рассмотреть данный вопрос немного более обширно. Надеюсь получилось ;)
А кто сказал, что это используется в реальном ПО? :)
Это код из определенной утилиты, высылаемой пользователю в том случае, если у него что-то там опять не работает :)
Для Vista и выше, в нем работает только копирование в буфер и вставка, перетаскивание не срабатывает.
По всей видимости требуется поддержка дополнительных интерфейсов, по аналогии с реализацией расширений проводника на базе IShellFolder (там требовалось поддержка IPersistFolder2 и еще какой-то, на вскидку уже не помню).
Пока что руки не дошли для добавления поддержки Vista и выше, как появиться время — обновлю пример.
Так можно и псевдохэндлы для процесса и нити (-1/-2) в константы вынести.
Я думаю здесь логика проста — есть список, список ZERO_BASE, т.о. в списке не может быть элементов по отрицательному индексу.
А раз это не возможно — зачем такие сложности? :)
http://msdn.microsoft.com/en-us/library/windows/desktop/bb776408(v=vs.85).aspx
Unsigned тип данных, поэтому в скобках я и привел DWORD(-1) — что есть аналог…
Она сейчас находится в процессе перевода, но в принципе все описанное в ней гарантированно должно работать под XE3.
Либо есть мой вариант реализации: rouse.drkb.ru/winapi.php#fwoledragdrop
По крайней мере я не вижу препятствий, ибо работа со строковыми буферами в юникодных версиях Delphi автоматом будет нивелироваться вызовом DragQueryFileW
Задача статьи была дать понимание как это работает, а готовые решения они немного для другого предназначены. :)
Эмм, так ведь это применяется только в случае HotPatch. т.е. когда мы имеем функцию которая всегда начинается с двубайтовой инструкции и предваряется пятью нопами. Т.е. что будет в начале MOV EDI, EDI, что вместо нее будет JMP SHORT -7, на XMM инструкцию это никак не повлияет. То-же относится и к лимитированию по длину прыжка — у нас всегда есть пять нопов перед процедурой.
Что-же по поводу CMPXCHG8B то именно для данной ситуации он ИМХО избыточен, но вот если у нас нет первой двубайтовой инструкции и нопов спереди, то его использование более чем оправдано.
Ну а Dr регистры — это все-же отладчик, это уже немножко вне рамок статьи :)
Ms-Rem очень отличный специалист и энтузиаст своего дела.
Но он больше придерживается позиции взлома ПО и практически не рассматривает в своих статьях методы противодействия.
Почему придерживается?
Да если честно, я считаю что он просто сошел со сцены и стараюсь не верить в ту историю с аварией.
(по крайней мере очень сильно стараюсь не верить ибо ходят слухи не первый год, что это не так).
Я же работаю немного с другой стороны баррикад, где приходится знать всю эту «подноготную» плюс немножко еще, чтобы опережать хотя-бы на шаг.
Это немного не верно, минимальный размер функции которую действительно нельзя перехватить равен одному байту, но в данном случае это будет RET и смысл в его перехвате попросту отсутствует.
Для двубайтовых функций есть диапазон в 256 байт.
Т.е. места достаточно для JMP SHORT, при условии что в ближайших 127 байтах сверху или снизу, будет неиспользуемые 5 байт для JMP NEAR OFFSET.
Общее направление просто похожее :)
Правда у Вас рассмотрен исключительно сплайсинг, я же попытался рассмотреть данный вопрос немного более обширно. Надеюсь получилось ;)
Это код из определенной утилиты, высылаемой пользователю в том случае, если у него что-то там опять не работает :)