一个汇编开发的截图软件。
宏定义:
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'