Blog. Just Blog

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

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

Преобразование числа в строку с разделением на разряды

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

Преобразование числа в строку с разделением на разряды

Если вы работаете с большими десятичными числами, то наверняка согласитесь, что число с разделением на разряды (то есть с группировкой по три символа: тысячи, миллионы и так далее) воспринимается гораздо лучше, чем просто последовательность цифр. Так проще выявлять ошибки или, например, с одного взгляда можно оценить порядок числа.

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

Как проверить соответствие файла PE-формату без запуска

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

Как проверить соответствие файла PE-формату без запуска

На форуме EXEL@B встретилась интересная тема по проверке является ли файл корректным PE-файлом, но без его запуска. Статическая проверка по типовым полям PE-заголовка не дает гарантии корректности, так как можно просто приписать к валидному заголовку кусок мусора или испортить его содержимое. Придется как минимум проверить соответствие размера файла суммарному размеру секций, а более тщательные проверки потребуют самостоятельного разбора секций импорта и экспорта, TLS, релоков и еще много чего. Проще всего доверить подобные проверки самой системе.

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

Как на Ассемблере сделать скриншот отдельного окна

02.11.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Одна из интересных задач при работе с окнами - захват и сохранение скриншота выбранного окна или всего экрана целиком. Во многих руководствах по программированию для этого рекомендуют использовать функцию BitBlt.
  1.         ; Захват отдельного окна через BitBlt
  2.         invoke  GetWindowDC,[hWnd]
  3.         mov     [windowDC],eax
  4.  
  5.         invoke  CreateCompatibleDC,[windowDC]
  6.         mov     [newDC],eax
  7.  
  8.         ; Создать пустой битмап для скриншота
  9.         invoke  CreateCompatibleBitmap,[windowDC],[window_width],[window_height]
  10.         mov     [hBitmap],eax
  11.  
  12.         invoke  SelectObject,[newDC],[hBitmap]
  13.  
  14.         ; Флаг для захвата полупрозрачных окон
  15.         CAPTUREBLT = 0x40000000
  16.         invoke  BitBlt,[newDC],0,0,[window_width],[window_height],[windowDC],\
  17.                 0,0,SRCCOPY+CAPTUREBLT
  18.         ; Теперь в [hBitmap] находится изображение (Bitmap) окна
Флаг CAPTUREBLT обеспечивает захват полупрозрачных окон с альфа-каналом. Способ реально рабочий, очень простой в реализации, но у него есть один огромный недостаток. Если окно, с которого требуется сделать снимок, перекрыто другими окнами или частично находится за пределами экрана, то оно так и будет сохранено с перекрывающими кусками чужих окон, а отсутствующая на экране область и вовсе будет заменена черным пятном.

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

Автогенерация имени файла при наличии дублей

26.09.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
При разработке одной из своих программ передо мной встала задача сохранения файлов, но не просто так, а чтобы имя файла автоматически изменялось, если такой файл уже существует. С подобной задачей очень хорошо справляются менеджеры закачек и браузеры, в случае совпадения дополняя имя нового файла числовым индексом. В результате у меня получилась вот такая функция:
  1. ;---------------------------------------------------------------
  2. ; Функция автогенерации имени файла
  3. ;---------------------------------------------------------------
  4. ; lpOldName - указатель на проверяемое имя файла
  5. ; lpNewName - указатель на доступное имя файла
  6. ;---------------------------------------------------------------
  7. proc generate_filename lpOldName:DWORD, lpNewName:DWORD
  8.         locals
  9.             fname    dd ?
  10.             fext     dd ?
  11.             filename rb MAX_PATH
  12.             buff     rb MAX_PATH
  13.             idx      dd ?
  14.         endl
  15.  
  16.         pusha
  17.  
  18.         ; Получить полный путь к файла и указатель на имя
  19.         lea     edi,[filename]
  20.         lea     eax,[fname]
  21.         invoke  GetFullPathName,[lpOldName],MAX_PATH,edi,eax
  22.  
  23.         ; Проверить наличие файла или каталога
  24.         invoke  PathFileExists,edi
  25.         or      eax,eax
  26.         ; Файла нет, сразу вернуться
  27.         jz      .loc_use_filename
  28.  
  29.         ; Индекс для автогенерации имени файла
  30.         mov     [idx],1
  31.  
  32.         ; Поискать расширение в названии файла
  33.         invoke  lstrlen,edi
  34.         add     edi,eax
  35.         mov     [fext],edi
  36.         std
  37.         mov     ecx,edi
  38.         sub     ecx,[fname]
  39.         mov     al,'.'
  40.         repne   scasb
  41.         cld
  42.         or      ecx,ecx
  43.         jz      @f
  44.         ; Расширение найдено
  45.         inc     edi
  46.         mov     byte [edi],0
  47.         inc     edi
  48.         mov     [fext],edi
  49. @@:
  50.         ; Сгенерировать имя файла с индексом
  51.         lea     edi,[buff]
  52.         lea     ebx,[filename]
  53.         invoke  wsprintf,edi,.mask,ebx,[idx],[fext]
  54.         add     esp,20
  55.  
  56.         ; Проверить наличие файла или каталога
  57.         invoke  PathFileExists,edi
  58.         or      eax,eax
  59.         ; Файла нет, использовать это имя
  60.         jz      .loc_use_filename
  61.  
  62.         ; Следуюший номер счетчика
  63.         inc     [idx]
  64.         jmp     @b
  65.  
  66. .loc_use_filename:
  67.         ; Скопировать имя файла в буфер-приемник
  68.         invoke  lstrcpy,[lpNewName],edi
  69.  
  70.         popa
  71.         ret
  72.  
  73.         ; Маска для автогенерации имени файла
  74.         .mask   db '%s (%i).%s',0
  75. endp
Функции передаются два параметра: lpOldName - указатель на проверяемое имя файла и lpNewName - указатель на строку, куда будет записано первое из доступных имен файлов. Если дублей нет, то это будет оригинальное имя, если дубли есть, то имя файла будет дополнено числовым индексом в скобках. Например, если проверяется файл "filename.txt", а такой файл уже есть, то первое доступное имя файла будет "filename (1).txt". Если и такой файл существует, то имя будет "filename (2).txt", и так далее до первого свободного индекса в счетчике. Использование функции PathFileExists позволяет проверять наличие как файлов, так и каталогов. Формат добавляемого числового индекса задается маской, можете менять ее по своему усмотрению.

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

Отслеживание изменений в каталоге на Ассемблере

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

Отслеживание изменений в каталоге на Ассемблере

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

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

prev 01 ... 42 43 44 45 46 47 48 ... 68 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0052 сек.) / Память: 4.5 Mb
Наверх