Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Как узнать, что системе требуется перезагрузка после установки обновлений

14.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как узнать, что системе требуется перезагрузка после установки обновлений

Ранее я рассказывал, как можно отключить принудительную перезагрузку при установке обновлений Windows. Сегодня копнем немного глубже, а именно научимся программно определять, что система ожидает эту самую перезагрузку. Зачем это нужно? Например, такое состояние означает, что некоторые файлы из пакета обновлений установлены не до конца, а значит лучше не производить никаких рискованных действий типа массированных инсталляций.

Читать статью целиком »
Просмотров: 564 | Комментариев: 0

Перехват и обработка Alt+Tab

13.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня поэкспериментируем с системными событиями. Это очень мощный и интересный инструмент, с помощью которого можно оперативно реагировать на события до того момента, как они дойдут до приложения. В качестве примера будем перехватывать окно переключения процессов, которое появляется при нажатии комбинации Alt+Tab, а также обрабатывать выбор элементов в этом окне. Начнем с описания нужных нам констант.
  1. EVENT_SYSTEM_SWITCHSTART = 0x0014
  2. EVENT_SYSTEM_SWITCHEND   = 0x0015
  3. EVENT_OBJECT_FOCUS       = 0x8005
  4.  
  5. WINEVENT_OUTOFCONTEXT    = 0x0000
  6. WINEVENT_SKIPOWNPROCESS  = 0x0002
Затем при инициализации окна или где-нибудь в начале приложения при помощи функции SetWinEventHook подписываемся на системные события EVENT_SYSTEM_SWITCHSTART и EVENT_SYSTEM_SWITCHEND. Правильнее будет сказать, что на интервал всех событий с идентификаторами, расположенными между ними, включая границы. Но, поскольку они идут друг за другом, то получается, что только на эти два события.
  1. wminitdialog:
  2.         ; Обнулить хэндл окна Alt+Tab
  3.         mov     [hwndat],0
  4.         invoke  SetWinEventHook,EVENT_SYSTEM_SWITCHSTART,EVENT_SYSTEM_SWITCHEND,\
  5.                 NULL,WinEventProc,0,0,WINEVENT_OUTOFCONTEXT+WINEVENT_SKIPOWNPROCESS
  6.         mov     [hook],eax
Останется только оформить обработчик событий WinEventProc. Для большей универсальности он будет также отвечать за обработку выбора элементов в окне Alt+Tab.

Читать статью целиком »
Просмотров: 543 | Комментариев: 5

Передача данных приложению с помощью WM_DROPFILES

09.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обрабатывать перетаскивание файлов в окно программы мы уже умеем, а сегодня узнаем, как сэмулировать это действие, то есть передать стороннему приложению список файлов через отправку сообщения WM_DROPFILES.

Начинаем с описания структуры DROPFILES, потому что FASM про нее ничего не знает. Так часто приходится писать подобное, что впору уже вводить какую-нибудь аббревиатуру, типа "Самостоятельно Описываем Структуры, Недостающие Интерфейсы, Константы Ассемблера" - "С.О.С.Н.И.К.А". Шутка.
  1. struct DROPFILES
  2.         pFiles dd ?
  3.         pt     POINT
  4.         fNC    dw ?
  5.         fWide  dw ?
  6. ends
Перед отправкой сообщения окну надо заполнить структуру DROPFILES. Значимыми полями являются pFiles - указатель на список файлов относительно начала структуры, и fWide - в каком формате передаются имена файлов, ASCII или юникод. Хотя на расположение списка файлов в памяти нет явных ограничений, обычно этот список размещается прямо за структурой и завершается нулевым байтом. Соответственно, указатель на этот список будет равен размеру структуры DROPFILES. Память под все это дело надо выделять с учетом нулевых разделителей между именами файлов и завершающим нулем.

Ну и сам код. Определяем размер и выделяем память, заполняем структуру и имена файлов, отправляем сообщение целевому окну.
  1.         ; Размер структуры DROPFILES
  2.         mov     ebx,sizeof.DROPFILES
  3.         inc     ebx
  4.  
  5.         ; Длина имени первого файла
  6.         invoke  lstrlen,file1
  7.         add     ebx,eax
  8.         inc     ebx
  9.  
  10.         ; Длина имени второго файла
  11.         invoke  lstrlen,file2
  12.         add     ebx,eax
  13.         inc     ebx
  14.  
  15.         ; Выделить память
  16.         invoke  GlobalAlloc,GMEM_SHARE+GMEM_MOVEABLE+GMEM_ZEROINIT,ebx
  17.         mov     [mem],eax
  18.         invoke  GlobalLock,eax
  19.         mov     [dfiles],eax
  20.  
  21.         ; Заполнить структуру DROPFILES
  22.         mov     edi,[dfiles]
  23.         mov     [edi+DROPFILES.pFiles],sizeof.DROPFILES
  24.         mov     [edi+DROPFILES.pt.x],0
  25.         mov     [edi+DROPFILES.pt.y],0
  26.         mov     [edi+DROPFILES.fNC],FALSE
  27.         mov     [edi+DROPFILES.fWide],FALSE
  28.         add     edi,sizeof.DROPFILES
  29.  
  30.         ; Дописать к ней передаваемые файлы
  31.         mov     esi,file1
  32. @@:
  33.         lodsb
  34.         stosb
  35.         or      al,al
  36.         jnz     @b
  37.  
  38.         mov     esi,file2
  39. @@:
  40.         lodsb
  41.         stosb
  42.         or      al,al
  43.         jnz     @b
  44.  
  45.         ; Завершающий нулевой байт
  46.         xor     eax,eax
  47.         stosb
  48.  
  49.         ; Отправить сообщение WM_DROPFILES
  50.         invoke  GlobalUnlock,[mem]
  51.         invoke  PostMessage,[destination_window],WM_DROPFILES,[mem],0
  52.         invoke  GlobalFree,[mem]
Обратите внимание, что отправка сообщения выполняется через PostMessage, иначе целевое приложение по какой-то причине может подвиснуть.

Читать статью целиком »
Просмотров: 355 | Комментариев: 0

Ввод пароля в консоли

01.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Ввод пароля в консоли

Не знаю как вам, а мне очень не нравится метод ввода пароля в никсовой консоли. Введенные символы не показываются даже замаскированными, ввод не реагирует на вставку пароля из буфера обмена, а главное, нельзя удалять ошибочно введенный символ. Я понимаю, безопасность, все дела, но неудобно же! И решил я сделать свой вариант ввода пароля для консольных приложений. Чтобы и "звездочки" показывались, и вставка работала, и символы можно было удалять. Вот что у меня получилось.

Читать статью целиком »
Просмотров: 732 | Комментариев: 4

Как получить список устройств ввода

26.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как получить список устройств ввода

Как узнать, подключена ли к компьютеру клавиатура и/или мышь? Ответить на этот вопрос можно путем перечисления всех подключенных системных устройств ввода при помощи функции GetRawInputDeviceList. Она позволяет получить список идентификаторов и типов устройств ввода, а на основании идентификатора при помощи функции GetRawInputDeviceInfo можно узнать об этом устройстве более детальную информацию.

Читать статью целиком »
Просмотров: 814 | Комментариев: 8

prev 01 ... 06 07 08 09 10 11 12 ... 49 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0023 сек.) / Память: 4.75 Mb
Наверх