Быстрый поиск
Введите фрагмент названия статьи для поиска
Обработка перетаскивания ссылок в окно приложения
16.04.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обработка перетаскивания ссылок в окно приложения
С перетаскиванием файлов в окно приложения мы уже давно разобрались, это реализуется несложно. Теперь давайте разберем более интересную задачу, а именно перетаскивание в окно приложения ссылок или текста из браузеров, текстовых редакторов и других программ.
Читать статью целиком »
Просмотров: 1818 | Комментариев: 0
Преобразование символических ссылок в путь к файлу
08.02.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
"По следам наших публикаций". В одной из недавних статей я использовал код для преобразования символических ссылок на файл в привычный путь. Немного поразмыслив, я решил доработать его до полноценной универсальной функции, которая будет приводить любые "кривые" пути и символические ссылки к человекопонятному виду. Функция разворачивает переменные окружения, исправляет обратные слеши, а также обрабатывает символические ссылки вида "\SystemRoot\explorer.exe", "\Device\HarddiskVolume1\WINDOWS\win.ini", "\??\E:\asm\" и "file:///C:/Windows/explorer.exe". Поддерживаются файлы, каталоги и диски.Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------
- ; Функция нормализации пути к файлу или каталогу
- ;------------------------------------------------------------
- ; Параметры:
- ; lpPath - указатель на исходный путь
- ; lpNorm - указатель на строку с нормализованным путем
- ; На выходе:
- ; EAX = 1 - путь успешно нормализован
- ; EAX = 0 - путь не найден
- ;------------------------------------------------------------
- proc normalize_path lpPath:DWORD,lpNorm:DWORD
- _OBJ_CASE_INSENSITIVE = 0x00000040
- _FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
- _FILE_READ_DATA = 1
- ; Тип запрашиваемой информации
- _ObjectNameInformation = 1
- ; Структура для получения результата
- struct _OBJECT_NAME_INFORMATION
- Length dw ?
- MaximumLength dw ?
- Buffer dd ?
- String rw MAX_PATH-1
- ends
- ; Структура для юникодной строки
- struct _UNICODE_STRING
- Length dw ?
- MaximumLength dw ?
- Buffer dd ?
- ends
- ; Структура для статуса выполнения операции
- struct _IO_STATUS_BLOCK
- Status dd ?
- Pointer dd ?
- Information dd ?
- ends
- ; Структура для атрибутов объекта
- struct _OBJECT_ATTRIBUTES
- Length dd ?
- RootDirectory dd ?
- ObjectName dd ?
- Attributes dd ?
- SecurityDescriptor dd ?
- SecurityQualityOfService dd ?
- ends
- locals
- hFile dd ?
- tmp_name rw MAX_PATH-1
- dDisk dd ?
- szDisk rw 4
- result dd ?
- szTmp rw MAX_PATH-1
- ObjectName _UNICODE_STRING
- ObjectAttributes _OBJECT_ATTRIBUTES
- IoStatusBlock _IO_STATUS_BLOCK
- dwSize dd ?
- ObjectNameInfo _OBJECT_NAME_INFORMATION
- endl
- pusha
- mov [result],0
- ; Преобразовать File URL в путь
- lea eax,[dwSize]
- mov dword [eax],MAX_PATH*2
- lea ebx,[szTmp]
- invoke PathCreateFromUrl,[lpPath],ebx,eax,0
- or eax,eax
- jz @f
- mov ebx,[lpPath]
- @@:
- ; Развернуть переменные окружения
- lea eax,[tmp_name]
- invoke ExpandEnvironmentStrings,ebx,eax,MAX_PATH*2
- ; Исправить обратные слеши
- lea ebx,[tmp_name]
- mov esi,ebx
- mov edi,ebx
- .loc_fix_slashes:
- lodsw
- cmp ax,'/'
- jne @f
- mov ax,'\'
- @@:
- stosw
- or ax,ax
- jnz .loc_fix_slashes
- ; Путь уже нормализован?
- cmp word [ebx+2],':'
- jne @f
- ; Больше ничего делать не требуется
- invoke lstrcpy,[lpNorm],ebx
- mov [result],1
- jmp .loc_ret
- @@:
- lea eax,[ObjectName]
- invoke RtlInitUnicodeString,eax,ebx
- push _FILE_SYNCHRONOUS_IO_NONALERT
- push FILE_SHARE_READ+FILE_SHARE_WRITE+FILE_SHARE_DELETE
- lea eax,[IoStatusBlock]
- push eax
- lea ebx,[ObjectAttributes]
- push ebx
- mov [ebx+_OBJECT_ATTRIBUTES.Length],sizeof._OBJECT_ATTRIBUTES
- lea eax,[ObjectName]
- mov [ebx+_OBJECT_ATTRIBUTES.ObjectName],eax
- mov [ebx+_OBJECT_ATTRIBUTES.Attributes],_OBJ_CASE_INSENSITIVE
- push _FILE_READ_DATA+SYNCHRONIZE
- lea eax,[hFile]
- push eax
- invoke NtOpenFile
- or eax,eax
- jz @f
- ; Файл открыть не удалось
- lea ebx,[tmp_name]
- invoke lstrcpy,[lpNorm],ebx
- jmp .loc_ret
- @@:
- lea ebx,[dwSize]
- ; Получить размер информации
- invoke NtQueryObject,[hFile],_ObjectNameInformation,NULL,0,ebx
- ; Получить информацию об объекте
- push ebx
- push [dwSize]
- lea eax,[ObjectNameInfo]
- push eax
- invoke NtQueryObject,[hFile],_ObjectNameInformation
- or eax,eax
- jz @f
- ; Имя объекта получить не удалось
- lea ebx,[tmp_name]
- invoke lstrcpy,[lpNorm],ebx
- invoke NtClose,[hFile]
- jmp .loc_ret
- @@:
- ; Сохранить полученное имя
- lea eax,[ObjectNameInfo]
- lea eax,[eax+_OBJECT_NAME_INFORMATION.String]
- lea ebx,[tmp_name]
- invoke lstrcpy,ebx,eax
- ; Закрыть открытый файл
- invoke NtClose,[hFile]
- ; Перебрать все диски, начиная с A:
- mov [dDisk],1
- .loc_find_drive:
- invoke GetLogicalDrives
- @@:
- test eax,[dDisk]
- jnz @f
- shl [dDisk],1
- jnz @b
- ; Диск определить не удалось
- lea ebx,[tmp_name]
- invoke lstrcpy,[lpNorm],ebx
- jmp .loc_ret
- @@:
- lea eax,[szDisk]
- mov dword [eax],0x003A0041 ; 'A:' в юникоде
- mov dword [eax+4],0
- mov ecx,[dDisk]
- bsr ecx,ecx
- add dword [eax],ecx
- ; Следующий диск
- shl [dDisk],1
- ; Преобразовать букву диска в строку типа \Device\HarddiskVolume1
- lea eax,[szDisk]
- lea ebx,[szTmp]
- invoke QueryDosDevice,eax,ebx,MAX_PATH*2
- or eax,eax
- ; Диска нет, пропускаем
- jz @f
- ; Сравнить начало пути со строкой устройства
- mov ecx,eax
- lea esi,[tmp_name]
- mov edi,ebx
- repe cmpsw
- or ecx,ecx
- jnz @f
- ; Только буква диска
- lea eax,[szDisk]
- invoke lstrcpy,[lpNorm],eax
- mov [result],1
- jmp .loc_ret
- @@:
- cmp ecx,1
- jne .loc_find_drive
- ; Дополнительная проверка корректности пути
- dec esi
- dec esi
- cmp word [esi],'\'
- jne .loc_find_drive
- ; Диск + оставшийся путь к файлу
- lea eax,[szDisk]
- invoke lstrcpy,[lpNorm],eax
- invoke lstrcat,[lpNorm],esi
- mov [result],1
- .loc_ret:
- popa
- mov eax,[result]
- ret
- endp
Читать статью целиком »
Просмотров: 1844 | Комментариев: 2
Работа с иконками файлов на Ассемблере
23.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Работа с иконками файлов на Ассемблере
Я уже рассказывал, как можно получить иконку из окна чужого приложения, сегодня тема будет похожей. Разница в том, что иконку мы будем получать из файла на диске. Применений для этого может быть много, например, чтобы отрисовать в вашем приложении красивый список файлов, нарисовать всплывающее меню, заменить иконку в собранном джойнере или патче. Для работы с иконками в WInAPI есть несколько функций, каждая со своими особенностями. В этой статье я попытаюсь подробно рассказать о них.
Читать статью целиком »
Просмотров: 2302 | Комментариев: 2
Как закрепить программу в панели задач на Ассемблере
20.09.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как закрепить программу в панели задач на Ассемблере
В Windows 7 есть возможность закрепления часто используемых программ прямо на панели задач. Что-то типа панели быстрого запуска предыдущих версий Windows, только более ущербное. Некоторые инсталляторы автоматически закрепляют устанавливаемые ими программы на панели задач без подтверждения пользователя, и мне стало интересно, как это можно сделать программным путем. В качестве языка для реализации, естественно, был выбран Ассемблер, но тут используются стандартные WinAPI, так что можно без проблем переписать на любой другой язык программирования.
Читать статью целиком »
Просмотров: 2736 | Комментариев: 9
Работа с INI-файлами на Ассемблере
21.06.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Работа с INI-файлами на Ассемблере
Конфигурационные ini-файлы появились в самых первых версиях Windows. Изначально в них хранились только настройки Windows, а затем они стали использоваться для хранения параметров других приложений. Начиная с Windows 95, Microsoft объявил ini-файлы устаревшими и с тех пор предлагает использовать системный реестр для хранения всех настроек и данных программ. Лично я считаю, что приложения должны быть легко переносимыми между компьютерами, а также легко и полностью деинсталлироваться, поэтому внедрение в систему должно быть минимальным. Хранение всех настроек в ini-файле или в xml-файле в папке с программой - это, на мой взгляд, самое правильное решение, а в реестр нужно залезать только в случае крайней необходимости.
Читать статью целиком »
Просмотров: 4277 | Комментариев: 5