Blog. Just Blog

Быстрый поиск

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

Как узнать состояние лотка CD-ROM

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

Как узнать состояние лотка CD-ROM

В комментариях к моей статье про управление лотком CD-ROM был задан правильный вопрос про то, как узнать состояние лотка CD-ROM, открыт он или закрыт. Обычно все программы, управляющие лотками CD-ROM, хранили эту информацию на основании своих последних действий. То есть, если программа открыла лоток привода, то в своем внутреннем массиве данных она ставит признак "открыто" и наоборот. Причем этот статус вполне мог не соответствовать реальному положению дел, если после этого лоток был закрыт или открыт вручную. Долгое время других способов определения статуса лотка CD-ROM не было. Но программист Александр (Rouse_) Багель в одной из своих разработок предложил хитрый способ определять реальное состояние лотка CD-ROM. Он заключается в том, чтобы отправить команду SCSIOP_MECHANISM_STATUS в запросе IOCTL_SCSI_PASS_THROUGH через функцию DeviceIoControl. Исходный пример был написан на Delphi, мне осталось его только перевести на Ассемблер.

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

Перехват буфера обмена на Ассемблере

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

Перехват буфера обмена на Ассемблере

Сегодня разберем интересную тему - перехват буфера обмена. Применений этому перехвату можно найти много: менеджеры буфера обмена, хранящие последние несколько скопированных текстов; программы, выполняющие заданные действия, если в буфере обмена появилось кодовое слово; кейлоггеры, перехватывающие пароли и тексты пользователя; одно время были популярны трояны, подменяющие в буфере обмена номера электронных кошельков на свои собственные. Область применения любой технологии, как обычно, ограничивается только вашей фантазией. Но это все лирика, пора переходить к программированию.

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

Extreme Reboot & Shutdown 1.1

06.05.2013 | Категория: Мои программы | Автор: ManHunter

Скриншот программы Extreme Reboot & Shutdown

Комплект небольших программ, предназначенных для принудительного выключения и перезагрузки компьютера, гибернации и перевода системы в спящий режим. Программы extreme_off.exe и force_off.exe схожи по функционалу, разница только в используемых функциях. Мгновенно выключают компьютер без сохранения данных, никаких предупреждений не выдается. Программы extreme_reboot.exe и force_reboot.exe - программный аналог кнопки Reset. Никаких предупреждений не выдается, все процессы завершаются мгновенно и без сохранения данных, компьютер перезагружается. Используйте эти программы осторожно, не стоит злоупотреблять некорректным завершением работы системы! Программы safe_off.exe и safe_reboot.exe корректно завершают работу системы, а затем, соответственно, выключают или перезагружают компьютер. Аналог обычного "Пуск" - "Завершение работы". Программа hibernate.exe переводит систему в режим гибернации, а sleep.exe - в спящий режим. Все эти программы можно запускать из пакетных файлов или из заданий планировщиков.

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

Как узнать название шрифта в диалоговом окне приложения

14.03.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы получить информацию о шрифте, используемом в окне или его отдельном элементе, можно применить следующий код.
  1.         ; Отправить окну запрос на получение информации о шрифте
  2.         invoke  SendMessage,[hWindow],WM_GETFONT,NULL,NULL
  3.         or      eax,eax
  4.         ; Данные о шрифте получить не удалось
  5.         jz      cant_get_font
  6.  
  7.         ; Получить объект с описанием шрифта
  8.         invoke  GetObject,eax,sizeof.LOGFONT,font
  9.         ; Теперь в font.lfFaceName строка названия шрифта
Сперва окну посылается сообщение WM_GETFONT, которое возвращает хэндл объекта-описателя шрифта. Если хэндл получить не удалось, то окно использует системный шрифт по умолчанию или не обрабатывает это сообщение. Но это еще не все. Чтобы получить подробное описание со всеми характеристиками шрифта, надо при помощи функции GetObject из полученного хэндла заполнить структуру LOGFONT. Один из параметров этой структуры lfFaceName - строка ASCIIZ с названием шрифта, максимальная длина которой 32 символа. Очень быстро и просто. У меня такой трюк используется в программе WinDowzer.

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

Получение иконки из окна чужого приложения

23.07.2012 | Категория: Образ мышления: Assembler | Автор: ManHunter
В некоторых приложениях, например, в различных таскменеджерах, возникает задача получить иконку окна другого приложения, чтобы затем использовать ее в своем контексте. Делается это очень просто. Окну посылается сообщение WM_GETICON с параметром ICON_SMALL или ICON_BIG, в зависимости от того, маленькую или большую иконку надо получить. Если это не срабатывает, то можно попробовать получить иконку при помощи функции GetClassLong, соответственно, с параметром GCL_HICONSM или GCL_HICON. Если и в этом случае хэндл иконки получить не удалось, то значит не судьба. Или приложение, которому принадлежит окно, не отвечает, или же окно просто не имеет иконки. Для облегчения задачи я написал следующую функцию:
  1. ;--------------------------------------------------------------
  2. ; Функция получения иконки окна
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;--------------------------------------------------------------
  6. ; Параметры:
  7. ;     hwnd - хэндл окна
  8. ;     dType - тип иконки (0 - 16x16, 1 - 32x32)
  9. ; На выходе:
  10. ;     EAX - хэндл иконки или -1 если окна не существует
  11. ;--------------------------------------------------------------
  12. proc    GetIcon hwnd:DWORD, dType:DWORD
  13.         pusha
  14.  
  15.         ; Такое окно существует?
  16.         invoke  IsWindow,[hwnd]
  17.         or      eax,eax
  18.         jnz     @f
  19.  
  20.         ; Окно не найдено
  21.         mov     eax,-1
  22.         jmp     .loc_ret
  23. @@:
  24.         ; Какую иконку надо получить?
  25.         cmp     [dType],0
  26.         jne     .get_big_icon
  27.  
  28.         ; Получить хэндл маленькой иконки
  29. .get_small_icon:
  30.         invoke  SendMessage,[hwnd],WM_GETICON,ICON_SMALL,0
  31.         or      eax,eax
  32.         jnz     .loc_ret
  33.         invoke  GetClassLong,[hwnd],GCL_HICONSM
  34.         or      eax,eax
  35.         jnz     .loc_ret
  36.         jmp     .load_def
  37.  
  38.         ; Получить хэндл большой иконки
  39. .get_big_icon:
  40.         invoke  SendMessage,[hwnd],WM_GETICON,ICON_BIG,0
  41.         or      eax,eax
  42.         jnz     .loc_ret
  43.         invoke  GetClassLong,[hwnd],GCL_HICON
  44.         or      eax,eax
  45.         jnz     .loc_ret
  46.  
  47.         ; Получить хэндл иконки по умолчанию
  48. .load_def:
  49.         invoke  LoadIcon,NULL,IDI_WINLOGO
  50.  
  51. .loc_ret:
  52.         mov     [dType],eax
  53.         popa
  54.  
  55.         ; Вернуть результат
  56.         mov     eax,[dType]
  57.         ret
  58. endp
Параметры: hwnd - хэндл окна, из которого надо получить иконку, dType - тип иконки, большая или маленькая. Функция самодостаточная, не требует дополнительных переменных в сегменте данных. На выходе в регистре EAX возвращается хэндл иконки или -1, в случае, если запрошенного окна не существует. Если же окно существует, но по какой-то причине не удалось получить его иконку, то вместо нее функция возвращает хэндл дефолтной иконки из библиотеки Windows.

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

01 ... 27 28 29 30 31 32 33 ... 37
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 3 (0.0199 сек.) / Память: 4.5 Mb
Наверх