Быстрый поиск
Введите фрагмент названия статьи для поиска
Как программно создать ярлык
08.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ярлыки - одна из ключевых сущностей Windows. Это специальные файлы, служащие указателями на папки, программы или команды. Для управления ярлыками в Windows используется COM-объект ShellLink, точнее одна версия для ANSI и вторая для юникода. Они отличаются своими GUID. В любом из этих объектов реализовано по два интерфейса. Интерфейс IShellLink, с помощью которого можно получать и изменять свойства ярлыка, и интерфейс IPersistFile для работы непосредственно с самим файлом ярлыка.Для доступа к COM-объектам первым делом надо обозначить их GUID:
Code (Assembler) : Убрать нумерацию
- ; GUID {00021401-0000-0000-C000-000000000046}
- CLSID_ShellLink dd 00021401h
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {000214F9-0000-0000-C000-000000000046}
- IID_IShellLinkW dd 000214F9h
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {0000010B-0000-0000-C000-000000000046}
- IID_IPersistFile dd 0000010Bh
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
Code (Assembler) : Убрать нумерацию
- ; IID_IShellLinkW Interface
- struct IShellLinkWDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetPath dd ?
- GetIDList dd ?
- SetIDList dd ?
- GetDescription dd ?
- SetDescription dd ?
- GetWorkingDirectory dd ?
- SetWorkingDirectory dd ?
- GetArguments dd ?
- SetArguments dd ?
- GetHotkey dd ?
- SetHotkey dd ?
- GetShowCmd dd ?
- SetShowCmd dd ?
- GetIconLocation dd ?
- SetIconLocation dd ?
- SetRelativePath dd ?
- Resolve dd ?
- SetPath dd ?
- ends
- ; IID_IPersistFile Interface
- struct IPersistFileDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetClassID dd ?
- IsDirty dd ?
- Load dd ?
- Save dd ?
- SaveCompleted dd ?
- GetCurFile dd ?
- ends
Читать статью целиком »
Просмотров: 1297 | Комментариев: 0
Вывод изображения на Ассемблере с помощью OLE
21.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже разбирал загрузку и вывод изображения с помощью GDI+, но это далеко не единственный способ загрузки изображения из файла. В дополнение к этой теме предлагаю рассмотреть еще один способ, как можно загрузить изображение из файла средствами OLE. Сперва пропишем GUID объекта IID_IPicture и создадим структуру для методов интерфейса IPicture. В MSDN методы перечислены в алфавитном порядке, а не так, как они фактически идут в интерфейсе, имейте это в виду.Code (Assembler) : Убрать нумерацию
- ; GUID {7BF80980-BF32-101A-8BBB-00AA00300CAB}
- IID_IPicture dd 7BF80980h
- dw 0BF32h
- dw 0101Ah
- db 08Bh, 0BBh, 0h, 0AAh, 0h, 030h, 00Ch, 0ABh
- ; IPicture Interface
- struct IPicture
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IPicture
- get_Handle dd ?
- get_hPal dd ?
- get_Type dd ?
- get_Width dd ?
- get_Height dd ?
- Render dd ?
- set_hPal dd ?
- get_CurDC dd ?
- SelectPicture dd ?
- get_KeepOriginalFormat dd ?
- set_KeepOriginalFormat dd ?
- PictureChanged dd ?
- SaveAsFile dd ?
- get_Attributes dd ?
- SetHdc dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; Прочитать файл в память
- invoke _lopen,fname,OF_READ
- cmp eax,-1
- je loc_free_1
- mov ebx,eax
- ; Получить размер файла
- invoke GetFileSize,ebx,NULL
- mov [file_size],eax
- ; Выделить память под файл
- invoke GetProcessHeap
- mov [hProcHeap],eax
- invoke HeapAlloc,[hProcHeap],0,[file_size]
- mov [hLock],eax
- ; Загрузить картинку в память
- invoke _lread,ebx,[hLock],[file_size]
- invoke _lclose,ebx
Читать статью целиком »
Просмотров: 3080 | Комментариев: 0
Как программно свернуть все окна
04.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Есть разные способы программно свернуть все открытые окна. Простой и топорный вариант решения - эмуляция нажатия клавиш Win+M, которые и выполняют команду "Свернуть все окна". Делается это через последовательность вызовов keybd_event.Code (Assembler) : Убрать нумерацию
- ; Эмуляция нажатия клавиш Win+M
- invoke keybd_event,VK_LWIN,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,'M',0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Code (Assembler) : Убрать нумерацию
- ; Эмуляция нажатия клавиш Win+Shift+M
- invoke keybd_event,VK_LWIN,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LSHIFT,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,'M',0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LSHIFT,0,KEYEVENTF_KEYUP,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Читать статью целиком »
Просмотров: 1926 | Комментариев: 5
Обработка перетаскивания ссылок в окно приложения
16.04.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обработка перетаскивания ссылок в окно приложения
С перетаскиванием файлов в окно приложения мы уже давно разобрались, это реализуется несложно. Теперь давайте разберем более интересную задачу, а именно перетаскивание в окно приложения ссылок или текста из браузеров, текстовых редакторов и других программ.
Читать статью целиком »
Просмотров: 1886 | Комментариев: 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
Читать статью целиком »
Просмотров: 1901 | Комментариев: 2