
Быстрый поиск
Введите фрагмент названия статьи для поиска

Вывод изображения на Ассемблере с помощью WIC
13.08.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
На сайте уже есть две статьи про загрузку и вывод изображения с помощью GDI+ и OLE, сегодня расскажу про еще очередной способ загрузки изображений, на этот раз с помощью WIC (Windows Imaging Component). Эта технология позволяет не привязываться к конкретным форматам изображений, а делегировать большую часть рутинной работы системе. Если установлен соответствующий графический кодек и система в принципе может открыть изображение во встроенном Просмотрщике фотографий, значит его можно будет прочитать и при помощи Windows Imaging Component. Например, популярный формат WebP в чистой Windows 7 не открывается, но если поставить кодеки, то все сразу заработает.Переходим к программированию. Поскольку это COM-технология, то нам понадобится описание множества GUID, констант и интерфейсов. Надо ли говорить, что FASM про них ничего не знает? А множество действительно внушительное.
Code (Assembler) : Убрать нумерацию
- ; GUID {CACAF262-9370-4615-A13B-9F5539DA4C0A}
- CLSID_WICImagingFactory dd 0CACAF262h
- dw 09370h
- dw 04615h
- db 0A1h, 03Bh, 09Fh, 055h, 039h, 0DAh, 04Ch, 00Ah
- ; GUID {EC5EC8A9-C395-4314-9C77-54D7A935FF70}
- IID_IWICImagingFactory dd 0EC5EC8A9h
- dw 0C395h
- dw 04314h
- db 09Ch, 077h, 054h, 0D7h, 0A9h, 035h, 0FFh, 070h
- ; IID_IWICImagingFactory Interface
- struct IWICImagingFactory
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWICImagingFactory
- CreateDecoderFromFilename dd ? ; 00Ch
- CreateDecoderFromStream dd ? ; 010h
- CreateDecoderFromFileHandle dd ? ; 014h
- CreateComponentInfo dd ? ; 018h
- CreateDecoder dd ? ; 01Ch
- CreateEncoder dd ? ; 020h
- CreatePalette dd ? ; 024h
- CreateFormatConverter dd ? ; 028h
- CreateBitmapScaler dd ? ; 02Ch
- CreateBitmapClipper dd ? ; 030h
- CreateBitmapFlipRotator dd ? ; 034h
- CreateStream dd ? ; 038h
- CreateColorContext dd ? ; 03Ch
- CreateColorTransformer dd ? ; 040h
- CreateBitmap dd ? ; 044h
- CreateBitmapFromSource dd ? ; 048h
- CreateBitmapFromSourceRect dd ? ; 04Ch
- CreateBitmapFromMemory dd ? ; 050h
- CreateBitmapFromHBITMAP dd ? ; 054h
- CreateBitmapFromHICON dd ? ; 058h
- CreateComponentEnumerator dd ? ; 05Ch
- CreateFastMetadataEncoderFromDecoder dd ? ; 060h
- CreateFastMetadataEncoderFromFrameDecode dd ? ; 064h
- CreateQueryWriter dd ? ; 068h
- CreateQueryWriterFromReader dd ? ; 06Ch
- ends
- ; IID_IWICBitmapDecoder Interface
- struct IWICBitmapDecoder
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWICBitmapDecoder
- QueryCapability dd ? ; 00Ch
- Initialize dd ? ; 010h
- GetContainerFormat dd ? ; 014h
- GetDecoderInfo dd ? ; 018h
- CopyPalette dd ? ; 01Ch
- GetMetadataQueryReader dd ? ; 020h
- GetPreview dd ? ; 024h
- GetColorContexts dd ? ; 028h
- GetThumbnail dd ? ; 02Ch
- GetFrameCount dd ? ; 030h
- GetFrame dd ? ; 034h
- ends
- ; IWICBitmapFrameDecode Interface
- struct IWICBitmapFrameDecode
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWICBitmapFrameDecode
- GetSize dd ? ; 00Ch
- GetPixelFormat dd ? ; 010h
- GetResolution dd ? ; 014h
- CopyPalette dd ? ; 018h
- CopyPixels dd ? ; 01Ch
- GetMetadataQueryReader dd ? ; 020h
- GetColorContexts dd ? ; 024h
- GetThumbnail dd ? ; 028h
- ends
- ; IID_IWICFormatConverter Interface
- struct IWICFormatConverter
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWICFormatConverter
- GetSize dd ? ; 00Ch
- GetPixelFormat dd ? ; 010h
- GetResolution dd ? ; 014h
- CopyPalette dd ? ; 018h
- CopyPixels dd ? ; 01Ch
- Initialize dd ? ; 020h
- CanConvert dd ? ; 024h
- ends
- ; IID_IWICBitmap Interface
- struct IWICBitmap
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWICBitmap
- GetSize dd ? ; 00Ch
- GetPixelFormat dd ? ; 010h
- GetResolution dd ? ; 014h
- CopyPalette dd ? ; 018h
- CopyPixels dd ? ; 01Ch
- Lock dd ? ; 020h
- SetPalette dd ? ; 024h
- SetResolution dd ? ; 028h
- ends
- ; IID_IWICBitmapLock Interface
- struct IWICBitmapLock
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IWICBitmapLock
- GetSize dd ? ; 00Ch
- GetStride dd ? ; 010h
- GetDataPointer dd ? ; 014h
- GetPixelFormat dd ? ; 018h
- ends
- ; GUID {6FDDC324-4E03-4BFE-B185-3D77768DC910}
- GUID_WICPixelFormat32bppPBGRA dd 06FDDC324h
- dw 04E03h
- dw 04BFEh
- db 0B1h, 085h, 03Dh, 077h, 076h, 08Dh, 0C9h, 010h
- CLSCTX_INPROC_SERVER = 0x01
- WICBitmapDitherTypeNone = 0x00000000
- WICBitmapPaletteTypeCustom = 0x00000000
- WICBitmapCacheOnDemand = 0x00000001
- WICBitmapLockWrite = 0x00000002
- WICDecodeMetadataCacheOnDemand = 0x00000000
Читать статью целиком »
Просмотров: 463 | Комментариев: 5

Как определить уровень UAC своего процесса
07.08.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как известно, контроль учетных записей (UAC) является основополагающим компонентом общей концепции безопасности Microsoft. UAC помогает уменьшить воздействие вредоносных программ и защищать данные от несанкционированного доступа. Если для работы ваших приложений понадобится доступ к защищенным объектам, то система выдаст соответствующее предупреждение с запросом о предоставлении таких прав. Особенно это актуально для системы Win10 и выше, где Проводник всегда запускается в контексте безопасности обычного пользователя и, соответственно, все запущенные в нем процессы также будут иметь обычные права. Для повышения прав приложения можно запускать от имени Администратора.Для того, чтобы определить, как именно было запущено ваше приложение, то есть в нормальном режиме или от имени Администратора, есть специальные функции. Но сперва, как обычно, не известные FASM константы.
Code (Assembler) : Убрать нумерацию
- TOKEN_QUERY_SOURCE = 0x0010
- TOKEN_QUERY = 8h
- TokenElevationType = 18
- TokenElevationTypeDefault = 1
- TokenElevationTypeFull = 2
- TokenElevationTypeLimited = 3
Code (Assembler) : Убрать нумерацию
- invoke GetCurrentProcess
- invoke OpenProcessToken,eax,TOKEN_QUERY,hToken
- invoke GetTokenInformation,[hToken],TokenElevationType,tet,4,dSize
Читать статью целиком »
Просмотров: 512 | Комментариев: 6

32-bit ASM Calculator 1.12
27.07.2022 | Категория: Мои программы | Автор: ManHunter

Скриншот программы 32-bit ASM Calculator
32-битный калькулятор, написан как обычно для личных нужд, потому что "ксорить дворды в уме" уже поднадоело :) Позволяет выполнять арифметические и битовые команды Ассемблера, в том числе команды, использующие при вычислениях значение Carry Flag. Результат операции отображается в шестнадцатеричном виде с возможностью реверса байт, в десятичном виде с возможностью знакового отображения, в бинарном с разбивкой на октеты и в текстовом, если есть такая возможность. Кроме этого калькулятор показывает состояние флагов процессора сразу после выполнения выбранной операции и условные переходы, которые сработают при этой комбинации флагов. Состоянием флагов можно также управлять и вручную. Встроенный конвертер позволяет быстро переводить числа из десятичной, шестнадцатеричной, двоичной и других систем счисления, текстовых строк и битового представления. Вы можете сразу устанавливать полученное число в качестве значений операндов.
Читать статью целиком »
Просмотров: 45426 | Комментариев: 174

Встроенный браузер в приложении на Ассемблере
06.07.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter

Встроенный браузер в приложении на Ассемблере
Сегодня будем рисовать свой браузер, а точнее внедрять фрейм web-браузера в интерфейс нашего приложения. Нечто подобное мы уже делали, но там были отдельные страницы, а сейчас полноценный браузер, встроенный в приложение. Языком исполнения, естественно, будет Ассемблер.
Читать статью целиком »
Просмотров: 780 | Комментариев: 9

Как сделать иконку на кнопке справа от текста
25.06.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
При помощи сообщение BM_SETIMAGE на кнопку можно добавить иконку, в обычном режиме она будет располагаться слева от надписи. Для одной из моих программ понадобилось разместить иконку на кнопке справа от надписи. Да, я в курсе про самостоятельную отрисовку кнопок, про субклассирование и прочие навороты, но хотелось обойтись малой кровью. Поразмыслив, я решил задачу с помощью расширенного стиля окна WS_EX_LAYOUTRTL, который применяется к отдельно взятой кнопке. По прямому назначению он используется для корректной отрисовки содержимого окна на арабском или других языках с направлением письма справа-налево. Как оказалось, для иконок это тоже неплохо работает.Вот код для переключения иконки на положение справа. Подразумевается, что иконка уже ранее была установлена на кнопку при инициализации окна или при создании элемента управления.
Code (Assembler) : Убрать нумерацию
- ; Установить иконку справа от текста
- invoke GetDlgItem,[hwnddlg],ID_BUTTON
- mov ebx,eax
- ; Добавить стиль Right-to-Left
- invoke GetWindowLong,ebx,GWL_EXSTYLE
- or eax,WS_EX_LAYOUTRTL
- invoke SetWindowLong,ebx,GWL_EXSTYLE,eax
- ; Обновить иконку
- invoke SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
- invoke SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
Code (Assembler) : Убрать нумерацию
- ; Установить иконку слева от текста
- invoke GetDlgItem,[hwnddlg],ID_BUTTON
- mov ebx,eax
- ; Убрать стиль Right-to-Left
- invoke GetWindowLong,ebx,GWL_EXSTYLE
- and eax,not WS_EX_LAYOUTRTL
- invoke SetWindowLong,ebx,GWL_EXSTYLE,eax
- ; Обновить иконку
- invoke SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
- invoke SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
Читать статью целиком »
Просмотров: 442 | Комментариев: 0
