FASM桌面截图片保存到文件

一个汇编开发的截图软件。吐舌头



宏定义:




macro fill buffer, count, [graylevel]
{
  local cnn
        push    edi
         mov    ecx, sizeof.BITMAP_CONTEXT
         mov    edi, buffer
         xor    eax, eax
         rep    stosb
         pop    edi
         
         mov    [buffer + BITMAP_CONTEXT.header1.bfType], $4d42
         mov    [buffer + BITMAP_CONTEXT.header1.bfOffBits], sizeof.BITMAPFILEHEADER + sizeof.BITMAPINFOHEADER
         mov    [buffer + BITMAP_CONTEXT.header1.bfSize], sizeof.BITMAPFILEHEADER + sizeof.BITMAPINFOHEADER

    if count < $10
         mov    ecx, $1
         shl    ecx, count
         add    [buffer + BITMAP_CONTEXT.header1.bfOffBits], ecx
         add    [buffer + BITMAP_CONTEXT.header1.bfSize], ecx
    end if
    
    if ~ graylevel eq
    
    end if
    
         mov    [buffer + BITMAP_CONTEXT.header2.biSize], sizeof.BITMAPINFOHEADER
      invoke    GetSystemMetrics, SM_CXSCREEN
         mov    [buffer + BITMAP_CONTEXT.header2.biWidth], eax
      invoke    GetSystemMetrics, SM_CYSCREEN
         mov    [buffer + BITMAP_CONTEXT.header2.biHeight], eax
      
         mov    [buffer + BITMAP_CONTEXT.header2.biPlanes], $1
         mov    [buffer + BITMAP_CONTEXT.header2.biBitCount], count
         mov    [buffer + BITMAP_CONTEXT.header2.biCompression], BI_RGB  ; raw RGB uncompressed data.
         mul    [buffer + BITMAP_CONTEXT.header2.biWidth] ; height x width
         xor    edx, edx
       movzx    ebx, [buffer + BITMAP_CONTEXT.header2.biBitCount]
         mul    ebx  ; colors per each pixels.
        
         xor    ecx, ecx 
        test    al, $7
          jz    cnn
         inc    ecx
  cnn:
         shr    eax, $3   ; RGB, 3x8.
         add    eax, ecx
         
         mov    [buffer + BITMAP_CONTEXT.header2.biSizeImage], eax
         add    [buffer + BITMAP_CONTEXT.header1.bfSize], eax
}

macro write name, buffer, colors
{
  local label1
  local label2
         mov    ecx, $0
         mov    eax, name
         mov    [_type], eax
  label1:
         inc    ecx
         shr    eax, $8
         jnz    label1
             
         mov    [_type + ecx], $706d622e
         add    ecx, $4
         mov    [_type + ecx], $0
      invoke    CreateFile, _file, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
         cmp    eax, INVALID_HANDLE_VALUE
          jz    label2
        push    esi
         mov    esi, eax
      invoke    WriteFile, esi, buffer, dword [buffer + BITMAP_CONTEXT.header1.bfOffBits], bytesX, NULL
      invoke    WriteFile, esi, colors, dword [buffer + BITMAP_CONTEXT.header2.biSizeImage], bytesX, NULL
      invoke    CloseHandle, esi
         pop    esi
  label2:
}
未分配的变量区。
section '.bss' readable writeable
    instance  dd ?
    bmp_clrs  dd ?
      bytesX  dd ?
       
_printbuffer  CHAR $2ff
 _seh_buffer  CHAR $300
 
       _file  db 'bitmap_'
       _type  rd $3

         sym  SYSTEMTIME
         bmi  BITMAP_CONTEXT
代码区:
section '.text' code readable executable
;section '.flat' readable writeable executable
  start:
      invoke    GetModuleHandle, NULL
         mov    [instance], eax

      invoke    SetUnhandledExceptionFilter, excepthandler
         
      invoke    GetDC, NULL
         mov    esi, eax
      invoke    CreateCompatibleDC, eax
         mov    edi, eax
         
        fill    bmi, $20
      
      ; DIB_RGB_COLORS = $0, DIB_PAL_COLORS = $1
         lea    eax, [bmi.header2]
      invoke    CreateDIBSection, esi, bmi.header2, $0, bmp_clrs, NULL, $0
        push    eax
      invoke    SelectObject, edi, eax
        push    eax
      invoke    BitBlt, edi, $0, $0, [bmi.header2.biWidth], [bmi.header2.biHeight], esi, $0, $0, SRCCOPY
         pop    eax
      invoke    SelectObject, edi, eax
         
       write    '32b', bmi, [bmp_clrs]
         
         pop    eax
      invoke    DeleteObject, eax
         
        fill    bmi, $18
      
      ; DIB_RGB_COLORS = $0, DIB_PAL_COLORS = $1
         lea    eax, [bmi.header2]
      invoke    CreateDIBSection, esi, bmi.header2, $0, bmp_clrs, NULL, $0
        push    eax
      invoke    SelectObject, edi, eax
        push    eax
      invoke    BitBlt, edi, $0, $0, [bmi.header2.biWidth], [bmi.header2.biHeight], esi, $0, $0, SRCCOPY
         pop    eax
      invoke    SelectObject, edi, eax
         
       write    '24b', bmi, [bmp_clrs]
         
         pop    eax
      invoke    DeleteObject, eax
         
        fill    bmi, $8
      
      ; DIB_RGB_COLORS = $0, DIB_PAL_COLORS = $1
         lea    eax, [bmi.header2]
      invoke    CreateDIBSection, esi, bmi.header2, $0, bmp_clrs, NULL, $0
        push    eax
      invoke    SelectObject, edi, eax
        push    eax
      invoke    BitBlt, edi, $0, $0, [bmi.header2.biWidth], [bmi.header2.biHeight], esi, $0, $0, SRCCOPY
         pop    eax
      invoke    SelectObject, edi, eax
         
       write    '16b', bmi, [bmp_clrs]
         
         pop    eax
      invoke    DeleteObject, eax
         
        fill    bmi, $8
      
      ; DIB_RGB_COLORS = $0, DIB_PAL_COLORS = $1
         lea    eax, [bmi.header2]
      invoke    CreateDIBSection, esi, bmi.header2, $1, bmp_clrs, NULL, $0
        push    eax
      invoke    SelectObject, edi, eax
        push    eax
      invoke    BitBlt, edi, $0, $0, [bmi.header2.biWidth], [bmi.header2.biHeight], esi, $0, $0, SRCCOPY
         pop    eax
      invoke    SelectObject, edi, eax
         
       write    '8b', bmi, [bmp_clrs]   
         
         pop    eax
      invoke    DeleteObject, eax
         
        fill    bmi, $20, $100
      
      ; DIB_RGB_COLORS = $0, DIB_PAL_COLORS = $1
         lea    eax, [bmi.header2]
      invoke    CreateDIBSection, esi, bmi.header2, $1, bmp_clrs, NULL, $0
        push    eax
      invoke    SelectObject, edi, eax
        push    eax
      invoke    BitBlt, edi, $0, $0, [bmi.header2.biWidth], [bmi.header2.biHeight], esi, $0, $0, SRCCOPY
         pop    eax
      invoke    SelectObject, edi, eax
         
       write    'gray', bmi, [bmp_clrs]
         
         pop    eax
      invoke    DeleteObject, eax
      invoke    DeleteDC, edi
      invoke    ReleaseDC, NULL, esi
         
         xor    eax, eax
      invoke    ExitProcess, eax
导入DLL函数
section '.idata' import data readable writeable

  library kernel32, 'kernel32.dll', \
    user32, 'user32.dll', \
    gdi32, 'gdi32.dll'

  include 'apia\kernel32.inc'
  include 'apia\user32.inc'
  include 'apia\gdi32.inc'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值