Код (C): SetWindowPos(hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); Функцию запихнул конец в блока WM_CREATE. Стало поверх окон, только диспетчер задач всё равно сверху, если флажок соответствующий включен. Теперь время можно контролировать в ютубе.
Мои часы (FASM, GDI+), выход по двойному клику: Код (ASM): format PE64 GUI WINDOW_HEIGHT equ 32 ; Высота окна DLU TIMER_ID equ 123124 ; ID таймера COLOR_ACTIVE equ 0xC000AF70 ; Цвет активных сегментов ARGB COLOR_INACTIVE equ 0x20007F30 ; Цвет неактивных сегментов ARGB ; Вызов GDI+ функций с проверкой macro gdip_invoke proc, [arg] { common invoke proc, arg .if eax jmp .error_handler .endif } ; Вызов API функции с проверкой BOOL значения macro bool_invoke proc, [arg] { common invoke proc, arg .if ~eax jmp .error_handler .endif } entry main ; Точка входа include 'win64wx.inc' section '.idata' import data readable writeable library kernel32, 'kernel32.dll', \ gdi32, 'gdi32.dll', \ user32, 'user32.dll', \ gdiplus, 'gdiplus.dll' import kernel32, \ GetLocalTime, 'GetLocalTime', \ ExitProcess, 'ExitProcess' import gdi32, \ CreateCompatibleBitmap, 'CreateCompatibleBitmap', \ CreateCompatibleDC, 'CreateCompatibleDC', \ DeleteDC, 'DeleteDC', \ DeleteObject, 'DeleteObject', \ SelectObject, 'SelectObject' import user32, \ DialogBoxIndirectParam, 'DialogBoxIndirectParamW', \ EndDialog, 'EndDialog', \ GetClientRect, 'GetClientRect', \ SetTimer, 'SetTimer', \ UpdateLayeredWindow, 'UpdateLayeredWindow', \ GetDC, 'GetDC', \ ReleaseDC, 'ReleaseDC', \ ReleaseCapture, 'ReleaseCapture', \ SendMessage, 'SendMessageW', \ SetWindowPos, 'SetWindowPos' import gdiplus, \ GdiplusStartup, 'GdiplusStartup', \ GdiplusShutdown, 'GdiplusShutdown', \ GdipSetSmoothingMode, 'GdipSetSmoothingMode', \ GdipDeleteGraphics, 'GdipDeleteGraphics', \ GdipCreateFromHDC, 'GdipCreateFromHDC', \ GdipGraphicsClear, 'GdipGraphicsClear', \ GdipCreateSolidFill, 'GdipCreateSolidFill', \ GdipDeleteBrush, 'GdipDeleteBrush', \ GdipFillEllipse, 'GdipFillEllipse', \ GdipResetWorldTransform, 'GdipResetWorldTransform', \ GdipTranslateWorldTransform, 'GdipTranslateWorldTransform', \ GdipScaleWorldTransform, 'GdipScaleWorldTransform', \ GdipRotateWorldTransform, 'GdipRotateWorldTransform', \ GdipFillPolygon, 'GdipFillPolygon', \ GdipSetSolidFillColor, 'GdipSetSolidFillColor' section '.data' data readable writable hGdipToken dq 0 ; GDI+ токен hBitmap dq 0 ; Буферный GDI растр hGraphics dq 0 ; GDI+ контекст для рисования hBrush dq 0 ; GDI+ кисть hDC dq 0 ; Буферный GDI контест hOldBmp dq 0 ; Оригинальный растр буферного контекста bBlink db 0 ; Переменная мерцания сегментов разделителей fSegSize dd ? ; Высота сегмента float rcWindow RECT ? ; Прямоугольник окна section '.text' code readable executable ; Шаблон диалогового окна g_dlg_template: dd DS_CENTER or WS_POPUP dd WS_EX_LAYERED dw 0, 0, 0, WINDOW_HEIGHT * 385 / 100, WINDOW_HEIGHT, 0, 0 du 'Clock', 0 ; GpInput структура g_gdip_input: dd 1 dq 0 dd 0 dd 0 ; Сегменты цифр 0-9 (номер бита уазывает сегмент): ; ; 5 ; - ; 3|4|1 ; - ; 2|6|0 ; _ g_segments: db 0x6F, 0x03, 0x76, 0x73, 0x1b, 0x79, 0x7d, 0x23, 0x7F, 0x7B ; Точки сегмента ; ---------- ; / \ ; \ / ; ---------- g_segment_points: dd 0.1, 0.1, 0.2, 0.0, 0.8, 0.0, 0.9, 0.1, 0.8, 0.2, 0.2, 0.2, 0.1, 0.1 ; Позиция разрядов g_segments_pos: dd 0.0, 1.3, 3.0, 4.3, 6.0, 7.3 ; Нарисовать сегмент proc draw_seg, x:DWORD, y:DWORD, h:DWORD mov [x], ecx mov [y], edx mov [h], r8d ; Размеры полигона относительно высоты сегмента gdip_invoke GdipResetWorldTransform, [hGraphics] gdip_invoke GdipScaleWorldTransform, [hGraphics], float [fSegSize], float [fSegSize], 0 .if ~[h] ; Для вертикальных сегментов - поворот и сдвиг на пол сегмента mov eax, 0.2 movd xmm1, eax addss xmm1, [x] mov eax, 0.1 movd xmm2, eax addss xmm2, [y] gdip_invoke GdipTranslateWorldTransform, [hGraphics], rdx, r8, 0 gdip_invoke GdipRotateWorldTransform, [hGraphics], float dword 90.0, 0 .else mov eax, 0.1 movd xmm1, eax addss xmm1, [x] gdip_invoke GdipTranslateWorldTransform, [hGraphics], rdx, float [y], 0 .endif gdip_invoke GdipFillPolygon, [hGraphics], [hBrush], g_segment_points, 7, 0 .error_handler: ret endp ; Нарисовать цифру proc draw_dig uses rsi rbx, val:DWORD, pos:DWORD locals fXMM6 rb 16 fXMM7 rb 16 endl movdqu xword [fXMM6], xmm6 movdqu xword [fXMM7], xmm7 ; Загрузить позицию левого и правого сегментов movss xmm6, [g_segments_pos + edx * 4] mov eax, 1.0 movd xmm7, eax addss xmm7, xmm6 ; Загрузить биты сегмента xor esi, esi movzx ebx, byte [g_segments + ecx] .repeat ; Получить бит сегмента в CF shr ebx, 1 .if CARRY? gdip_invoke GdipSetSolidFillColor, [hBrush], COLOR_ACTIVE .else gdip_invoke GdipSetSolidFillColor, [hBrush], COLOR_INACTIVE .endif mov r8d, esi and r8d, 4 .if esi < 2 movd ecx, xmm7 .else movd ecx, xmm6 .endif .if esi = 6 mov edx, 2.0 .else test esi, 1 .if ZERO? mov edx, 1.0 .else mov edx, 0.0 .endif .endif stdcall draw_seg inc esi .until esi = 7 .error_handler: .exit_proc: movdqu xmm6, xword [fXMM6] movdqu xmm7, xword [fXMM7] ret endp ; Обработчик диалогового окна proc dlg_proc uses rdi rbx, hWnd, uMsg, wParam, lParam locals tTime SYSTEMTIME tPT POINT dwBF dd ? hDCTemp dq ? endl mov [hWnd], rcx .if rdx = WM_TIMER & r8 = TIMER_ID invoke GetLocalTime, addr tTime gdip_invoke GdipGraphicsClear, [hGraphics], 0x01000000 lea rdi, [tTime.wHour] xor ebx, ebx .repeat mov ax, [rdi] mov cl, 10 div cl mov [rdi], ax and eax, 0x0ff stdcall draw_dig, eax, ebx inc ebx mov ax, [rdi] shr eax, 8 stdcall draw_dig, eax, ebx add rdi, 2 inc ebx .until ebx = 6 xor [bBlink], 1 .if ZERO? gdip_invoke GdipSetSolidFillColor, [hBrush], COLOR_INACTIVE .else gdip_invoke GdipSetSolidFillColor, [hBrush], COLOR_ACTIVE .endif ; Отрисовка разделителей gdip_invoke GdipResetWorldTransform, [hGraphics] gdip_invoke GdipScaleWorldTransform, [hGraphics], float [fSegSize], float [fSegSize], 0 gdip_invoke GdipFillEllipse, [hGraphics], [hBrush], float dword 2.65, float dword 0.7, float dword 0.2, float dword 0.2 gdip_invoke GdipFillEllipse, [hGraphics], [hBrush], float dword 2.65, float dword 1.3, float dword 0.2, float dword 0.2 gdip_invoke GdipFillEllipse, [hGraphics], [hBrush], float dword 5.65, float dword 0.7, float dword 0.2, float dword 0.2 gdip_invoke GdipFillEllipse, [hGraphics], [hBrush], float dword 5.65, float dword 1.3, float dword 0.2, float dword 0.2 mov qword [tPT], 0 mov [dwBF], 0x01ff0000 ; BLENDFUNCTION SRC_ALPHA bool_invoke UpdateLayeredWindow, [hWnd], 0, 0, rcWindow.right, [hDC], addr tPT, 0, addr dwBF, ULW_ALPHA bool_invoke SetWindowPos, [hWnd], HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOREDRAW .elseif rdx = WM_LBUTTONDOWN bool_invoke ReleaseCapture invoke SendMessage, [hWnd], WM_NCLBUTTONDOWN, 2, 0 .elseif rdx = WM_CLOSE jmp .destroy_dialog .elseif rdx = WM_INITDIALOG bool_invoke GetClientRect, [hWnd], rcWindow cvtsi2ss xmm0, [rcWindow.bottom] mov eax, 0.45 movd xmm1, eax mulss xmm0, xmm1 movss [fSegSize], xmm0 invoke GetDC, 0 .if ~rax jmp .destroy_dialog .release_dc_and_destroy: invoke ReleaseDC, [hDCTemp], 0 jmp .destroy_dialog .else mov [hDCTemp], rax invoke CreateCompatibleDC, rax .if ~rax jmp .release_dc_and_destroy .else mov [hDC], rax invoke CreateCompatibleBitmap, [hDCTemp], [rcWindow.right], [rcWindow.bottom] .if ~rax jmp .release_dc_and_destroy .else mov [hBitmap], rax .endif invoke SelectObject, [hDC], rax .if ~rax jmp .release_dc_and_destroy .endif .endif invoke ReleaseDC, [hDCTemp], 0 .endif gdip_invoke GdipCreateFromHDC, [hDC], hGraphics gdip_invoke GdipSetSmoothingMode, [hGraphics], 4 gdip_invoke GdipCreateSolidFill, 0, hBrush bool_invoke SetTimer, [hWnd], TIMER_ID, 500, 0 .elseif rdx = WM_LBUTTONDBLCLK .destroy_dialog: .error_handler: invoke EndDialog, [hWnd], 0 .endif xor eax, eax ret endp proc main gdip_invoke GdiplusStartup, hGdipToken, g_gdip_input, 0 invoke DialogBoxIndirectParam, 0, g_dlg_template, 0, dlg_proc, 0 .error_handler: .if [hBrush] invoke GdipDeleteBrush, [hBrush] .endif .if [hDC] invoke SelectObject, [hDC], [hOldBmp] invoke DeleteDC, [hDC] .endif .if [hGraphics] invoke GdipDeleteGraphics, [hGraphics] .endif .if [hBitmap] invoke DeleteObject, [hBitmap] .endif .if [hGdipToken] invoke GdiplusShutdown, [hGdipToken] .endif invoke ExitProcess, 0 endp
Thetrik, я уже как-то привык к вашей ФАСМо-ассемблерной виртуозности, но тем не менее, не перестаю удивляться. Спасибо за код. Mikl___'у тоже спасибо за MASM'овский код. В общем, тред\ветка - удалась, ничего не скажешь. Еще раз всем спасибо. P.S. Thetrik, вы Манхантеру для его блога эти часы продайте - он такие вещи любит. Единственное, что может его смутить, так это разрядность x64 - он, по-моему, в ней еще не разобрался.
Интересный вариант 7seg_clock, но несколько усложнённая реализация. ---- Убираем макросы, создающие паразитный код, упрощаем алгоритм, максимум вычислений - локально, без вызова внешних функций. В результате Спойлер: код Код (ASM): format PE64 GUI 5.0 at 140000000h entry main include "win64a.inc" WINDOW_HEIGHT equ 34 TIMER_ID equ 7 COLOR_ equ 0C000AF70h X_scale equ 30.0 Y_scale equ 27.0 macro gcall prg* { common call prg if defined checkgp test eax, eax jnz .error_handler end if } macro bcall prg* { common call prg if defined checkgp test eax, eax jz .error_handler end if } ; checkgp equ 1 ; -------------------- hWnd equ 40 dpFrame$ equ 88 align 8 dlg_proc: push rbx push rbp push rsi push rdi add rsp, -dpFrame$ lea rdi, [rsp+32] mov [rdi+hWnd],rcx cmp dx, WM_TIMER jne .next1 .timer: call draw_dig lea rax, [rsi+24] xor edx, edx xor r8d, r8d movups xmm0,[rax] movups xmm1,[rax+16] lea r9, [rax+40] movaps [rdi],xmm0 movaps [rdi+16],xmm1 mov qword [rdi+32],ULW_ALPHA mov rcx, [rdi+hWnd] bcall [UpdateLayeredWindow] align 8 .dpret: xor eax, eax add rsp, dpFrame$ pop rdi pop rsi pop rbp pop rbx ret .next1: cmp dx, WM_LBUTTONDOWN jne .next2 .lbuttondown: mov edx, WM_NCLBUTTONDOWN mov r8d, 2 xor r9d, r9d call [SendMessageA] jmp .dpret .next2: cmp dx, WM_LBUTTONDBLCLK je .error_handler cmp dx, WM_INITDIALOG je initdialog cmp dx, WM_CLOSE jne .dpret .error_handler: if defined checkgp mov rcx, [rdi+hWnd] end if xor edx, edx call [EndDialog] jmp .dpret ; -------------------- ddFrame$ equ 144 align 8 draw_dig: push rdi movaps [rsp-16],xmm6 add rsp, - ddFrame$ lea rsi, [hGraphics] lea rbp, [rsp+40] lea rdx, [rsi + Matrix0 - hGraphics] and qword [rdx + 32],0 mov rcx, [rsi] call [GdipSetWorldTransform] lea rcx, [rbp+32] call [GetLocalTime] lea rax, [rsi + k0_2 - hGraphics] movddup xmm0,qword [rax] movddup xmm6,qword [rax + k0_7 - k0_2] mov rbx, qword [rax + k2_65 - k0_2] movaps [rbp-8],xmm0 mov byte [rbp+8],1 mov dx, [rbp+44] cmp word [rax + second - k0_2],dx mov word [rax + second - k0_2],dx jne .grclear xor edi, edi shr rbx, 32 jmp .drawel .grclear: mov edx, 1000000h mov rcx, [rsi] gcall [GdipGraphicsClear] mov byte [rbp+8],2 mov [rbp+16],rax lea rdx, [rbp+40] lea rdi, [segments] mov [rbp+24],rdx .loopfills: mov cl, 10 mov al, 2 xadd [rbp+24], rax mov ax, [rax] div cl movzx edx, al movzx eax, ah mov dl, [rdi+rdx] mov al, [rdi+rax] shl eax, 7 or eax, edx or [rbp+16],rax ror qword [rbp+16],14 cmp byte [rbp+8],0 je .setpdr .drawel: mov rcx, [rsi] mov rdx, [rsi+8] movd xmm2,ebx movss xmm3,xmm6 gcall [GdipFillEllipse] psrldq xmm6,4 dec byte [rbp+8] js .error_handler test edi, edi jz .drawel jmp .loopfills .setpdr: shr qword [rbp+16], 22 lea rbx, [Matrix0] mov eax, 6 mov [rbp],rax lea rdi, [rbp+24] lea ecx, [eax+3] movlps xmm6, qword [rbx - Matrix0 + scale] add rsi, -72 rep movsq add rdi, -72 jmp .shift align 16 .loopfilln: movlps xmm0,[rdi] mulps xmm0, xmm6 movlps qword [rbx + 32],xmm0 mov rcx, [rsi] mov rdx, rbx gcall [GdipSetWorldTransform] mov rcx,[rsi] mov rdx,[rsi+8] lea r8, [spoints] mov r9d, 6 gcall [GdipFillPolygon2] align 8 .decCnt: add rdi, 8 dec byte [rbp] js .nextNumber lea rdx, [rbx+40] cmp byte [rbp],3 cmove rbx, rdx .shift: shr qword [rbp+16],1 jc .loopfilln jmp .decCnt .nextNumber: cmp [rbp+16],rax je .error_handler mov byte [rbp],6 lea rbx, [Matrix0] ror qword [rdi+8],32 movss xmm1, [rdi+8] mov ecx, 4 add rdi, -56 .loopadd: movddup xmm0,xmm1 addps xmm0,[rdi+rax] movaps [rdi+rax],xmm0 add al, 16 loop .loopadd jmp .shift .error_handler: add rsp, ddFrame$ movaps xmm6,[rsp-16] pop rdi ret ; -------------------- mFrame$ equ 88 hGdipToken equ 40 main: add rsp, -mFrame$ lea rcx, [rsp+hGdipToken] lea rdx, [rcx+8] mov dword [rdx], 1 movups [rdx+8], xmm0 xor r8d, r8d gcall [GdiplusStartup] lea rdx, [dlg_template] xor ecx, ecx lea r9, [dlg_proc] xor r8d, r8d call [DialogBoxIndirectParamA] .error_handler: mov rcx, [hBrush] test ecx, ecx jz .clk0001 call [GdipDeleteBrush] .clk0001: mov rcx, [hGraphics] test ecx, ecx jz .clk0002 call [GdipDeleteGraphics] .clk0002: mov rcx, [rsp+hGdipToken] test ecx, ecx jz .clk0003 call [GdiplusShutdown] .clk0003: mov rcx, [hDC] test ecx, ecx jz .clkexit mov rdx, [hOldBmp] call [SelectObject] mov rcx, rax call [DeleteObject] mov rcx, [hDC] call [DeleteDC] .clkexit: xor ecx, ecx add rsp, mFrame$ jmp [ExitProcess] ; -------------------- align 8 initdialog: lea rdx, [rcWindow] mov rbp, rdx bcall [GetClientRect] xor ecx, ecx call [GetDC] if defined checkgp test eax, eax jz dlg_proc.error_handler end if mov rcx, rax mov rsi, rax call [CreateCompatibleDC] if defined checkgp test eax, eax jnz .mkbmp .release_dc_and_destroy: mov rcx, rsi xor edx, edx call [ReleaseDC] jmp dlg_proc.error_handler .mkbmp: end if mov [hDC], rax mov rbx, rax mov rcx, rsi mov edx, [rbp+RECT.right] mov r8d, [rbp+RECT.bottom] call [CreateCompatibleBitmap] if defined checkgp test eax, eax jz .release_dc_and_destroy end if mov rdx, rax mov rcx, rbx call [SelectObject] mov [rbp - (rcWindow -hOldBmp)],rax mov rcx,rsi xor edx, edx call [ReleaseDC] mov rcx, rbx lea rdx, [hGraphics] mov rsi, rdx gcall [GdipCreateFromHDC] mov rcx,[rsi] mov edx, 4 gcall [GdipSetSmoothingMode] xor ecx, ecx lea rdx, [rsi+8] gcall [GdipCreateSolidFill] mov edx, COLOR_ mov rcx, [rsi+8] gcall [GdipSetSolidFillColor] mov rcx, [rdi+hWnd] or rdx, -1 xor r8d, r8d xor r9d, r9d movaps [rdi],xmm0 mov dword [rdi+16], SWP_NOMOVE or SWP_NOSIZE or SWP_NOREDRAW or SWP_NOSENDCHANGING bcall [SetWindowPos] mov rcx, [rdi+hWnd] mov edx, TIMER_ID mov r8d, 500 xor r9d, r9d call [SetTimer] jmp dlg_proc.timer if defined checkgp .error_handler: jmp dlg_proc.error_handler end if ; -------------------- align 8 segments: db 7Bh,60h,37h, 67h, 6Ch, 4Fh, 5Fh, 62h, 7Fh, 6Fh align 8 spoints: dd 0.1, 0.1, 0.2, 0.0, 0.8, 0.0, 0.9, 0.1, 0.8, 0.2, 0.2, 0.2 spos: dd 0.1,2.0, 0.1,0.0, 0.1,1.0, 0.2,0.1, 0.2,1.1, 1.2,0.1, 1.2,1.1 dd 0,0, 1.7,1.3 hGraphics dq 0 hBrush dq 0 hOldBmp dq 0 hDC dq 0 tPT dq PTs PTs dq 0 dwBF dq BF rcWindow RECT 0,0,0,0 scale dd X_scale,Y_scale align 16 Matrix0 dd 1.0 dd 0 dd 1952533809 dd -1 dd X_scale dd 0 dd 0 dd Y_scale dd 0 dd 0 Matrix90 dd 1.0 dd 0 dd 1952533809 dd -1 dd 0 dd Y_scale dd -X_scale dd 0 dd 0 dd 0 BF dd 1FF0000h align 8 k0_2 dd 0.2 dd 0 k0_7 dd 0.7 k1_3 dd 1.3 k2_65 dd 2.65 k5_65 dd 5.65 second dw 0 align 4 dlg_template: dd DS_CENTER or WS_POPUP, WS_EX_LAYERED dw 0,0,0, WINDOW_HEIGHT * 385 / 100, WINDOW_HEIGHT, 0,0 du 'SClock',0 ; -------------------- data import library kernel32, 'kernel32', \ gdi32, 'gdi32', \ user32, 'user32', \ gdiplus, 'gdiplus' import kernel32, \ GetLocalTime, 'GetLocalTime', \ ExitProcess, 'ExitProcess' import gdi32, \ CreateCompatibleBitmap, 'CreateCompatibleBitmap', \ CreateCompatibleDC, 'CreateCompatibleDC', \ SelectObject, 'SelectObject', \ DeleteObject, 'DeleteObject', \ DeleteDC, 'DeleteDC' import user32, \ DialogBoxIndirectParamA, 'DialogBoxIndirectParamA', \ EndDialog, 'EndDialog', \ GetClientRect, 'GetClientRect', \ SetTimer, 'SetTimer', \ UpdateLayeredWindow, 'UpdateLayeredWindow', \ GetDC, 'GetDC', \ ReleaseDC, 'ReleaseDC', \ SendMessageA, 'SendMessageA', \ SetWindowPos, 'SetWindowPos' import gdiplus, \ GdiplusStartup, 'GdiplusStartup', \ GdiplusShutdown, 'GdiplusShutdown', \ GdipSetSmoothingMode, 'GdipSetSmoothingMode', \ GdipCreateFromHDC, 'GdipCreateFromHDC', \ GdipGraphicsClear, 'GdipGraphicsClear', \ GdipCreateSolidFill, 'GdipCreateSolidFill', \ GdipSetSolidFillColor, 'GdipSetSolidFillColor', \ GdipFillEllipse, 'GdipFillEllipse', \ GdipSetWorldTransform, 'GdipSetWorldTransform', \ GdipFillPolygon2, 'GdipFillPolygon2', \ GdipDeleteBrush, 'GdipDeleteBrush', \ GdipDeleteGraphics, 'GdipDeleteGraphics' end data исполняемый файл худеет вдвое Если немного подшаманить заголовок и ужать, то и втрое
Rbnz, нет обработки ошибок, для уменьшения размера можно убрать еще очистку ресурсов которая в любом случае будет при завершении приложения.
Нет ошибок, нет и обработки. ) При надобности можно разкомментировать 29ю строку кода и она появится. Без очистки ресурсов - не есть хорошо. Безболезненно можно укротить : Код (Text): ; xor ecx, ecx mov ecx, COLOR_ lea rdx, [rsi+8] gcall [GdipCreateSolidFill] ; mov edx, COLOR_ ; mov rcx, [rsi+8] ; gcall [GdipSetSolidFillColor]
Rbnz Да, файл ужмется таки да.... Но память процесса таки будет 8192 в обеих случаях Но файл таки ужмется, токо не на диске... Вообще занятно.. Покрутил Clock7.exe.zip Занятная ручная работа (доработка с Импортом ) восстановил СЖАМКАННЫЕ функции: <Function CALL [DWORD]: 16 > 4000031B => 14000031B и т.д. 0 4000031B KERNEL32.GetLocalTime 1 400005DA USER32.GetClientRect 2 40000623 USER32.ReleaseDC 3 40000677 USER32.SetTimer 4 400005E2 USER32.GetDC 5 400002F8 USER32.SendMessageA 6 4000029C USER32.UpdateLayeredWindow 7 40000302 USER32.EndDialog 8 400002BA USER32.SetWindowPos 9 400001E6 USER32.DialogBoxIndirectParamA 10 40000238 GDI32.DeleteObject 11 40000245 GDI32.DeleteDC 12 40000614 GDI32.SelectObject 13 4000022F GDI32.SelectObject 14 400005EE GDI32.CreateCompatibleDC 15 40000608 GDI32.CreateCompatibleBitmap также и все gcall для GDI... gdiplus GdiplusStartup GdiplusShutdown GdipSetSmoothingMode GdipDeleteGraphics GdipCreateFromHDC GdipGraphicsClear GdipCreateSolidFill GdipDeleteBrush GdipFillEllipse GdipTranslateWorldTransform GdipRotateWorldTransform GdipFillPolygon2 GdipSetSolidFillColor GdipSetWorldTransform 14 функций В Clock7.zip меньше import gdiplus, \ GdiplusStartup, 'GdiplusStartup', \ GdiplusShutdown, 'GdiplusShutdown', \ GdipSetSmoothingMode, 'GdipSetSmoothingMode', \ GdipCreateFromHDC, 'GdipCreateFromHDC', \ GdipGraphicsClear, 'GdipGraphicsClear', \ GdipCreateSolidFill, 'GdipCreateSolidFill', \ GdipSetSolidFillColor, 'GdipSetSolidFillColor', \ GdipFillEllipse, 'GdipFillEllipse', \ GdipSetWorldTransform, 'GdipSetWorldTransform', \ GdipFillPolygon2, 'GdipFillPolygon2', \ GdipDeleteBrush, 'GdipDeleteBrush', \ GdipDeleteGraphics, 'GdipDeleteGraphics' На Windows 10 LTSC грузит DLL: Модули процесса: 33 0: Clock7.exe 140000000-ImageBase 1400000D0-OEP 00001004-ImageSize (4 100) 1: ntdll.dll 7FF917470000-ImageBase 00000000-OEP 001EE000-ImageSize (2 023 424) 2: KERNEL32.DLL 7FF915000000-ImageBase 7FF915017B60-OEP 000B3000-ImageSize (733 184) 3: KERNELBASE.dll 7FF9141B0000-ImageBase 7FF9141CB7D0-OEP 0029D000-ImageSize (2 740 224) 4: gdi32.DLL 7FF917270000-ImageBase 7FF917274110-OEP 00029000-ImageSize (167 936) 5: gdi32full.dll 7FF914000000-ImageBase 7FF9140402E0-OEP 001A7000-ImageSize (1 732 608) 6: msvcp_win.dll 7FF913F60000-ImageBase 7FF913F733F0-OEP 000A0000-ImageSize (655 360) 7: ucrtbase.dll 7FF9144D0000-ImageBase 7FF9144E1E00-OEP 000FA000-ImageSize (1 024 000) 8: USER32.dll 7FF917020000-ImageBase 7FF91702F500-OEP 00197000-ImageSize (1 667 072) 9: win32u.dll 7FF9144B0000-ImageBase 00000000-OEP 00020000-ImageSize (131 072) 10: IMM32.DLL 7FF9150C0000-ImageBase 7FF9150C15F0-OEP 0002E000-ImageSize (188 416) 11: gdiplus.DLL 7FF8EFC70000-ImageBase 7FF8EFCC6E90-OEP 001A4000-ImageSize (1 720 320) 12: msvcrt.dll 7FF914690000-ImageBase 7FF9146978B0-OEP 0009E000-ImageSize (647 168) 13: combase.dll 7FF914C10000-ImageBase 7FF914CEFF50-OEP 0032A000-ImageSize (3 317 760) 14: RPCRT4.dll 7FF917320000-ImageBase 7FF917379A70-OEP 00118000-ImageSize (1 146 880) 15: bcryptPrimitives.dll 7FF9145D0000-ImageBase 7FF9146086A0-OEP 00082000-ImageSize (532 480) 16: uxtheme.dll 7FF911950000-ImageBase 7FF911977E40-OEP 0009C000-ImageSize (638 976) 17: MSCTF.dll 7FF916BE0000-ImageBase 7FF916C26410-OEP 0016C000-ImageSize (1 490 944) 18: sechost.dll 7FF914F40000-ImageBase 7FF914F5F770-OEP 000A2000-ImageSize (663 552) 19: bcrypt.dll 7FF914660000-ImageBase 7FF914668E70-OEP 00026000-ImageSize (155 648) 20: OLEAUT32.dll 7FF916DB0000-ImageBase 7FF916DCD7D0-OEP 000C4000-ImageSize (802 816) 21: ADVAPI32.dll 7FF9166B0000-ImageBase 7FF9166C4230-OEP 000A8000-ImageSize (688 128) 22: kernel.appcore.dll 7FF913480000-ImageBase 7FF913483BA0-OEP 00011000-ImageSize (69 632) 23: TextInputFramework.dll 7FF903D50000-ImageBase 7FF903D77A20-OEP 00093000-ImageSize (602 112) 24: CoreUIComponents.dll 7FF90B8C0000-ImageBase 7FF90B93D560-OEP 00320000-ImageSize (3 276 800) 25: CoreMessaging.dll 7FF90FEF0000-ImageBase 7FF90FF43030-OEP 000E1000-ImageSize (921 600) 26: SHCORE.dll 7FF9171C0000-ImageBase 7FF9171FB2F0-OEP 000A7000-ImageSize (684 032) 27: ntmarta.dll 7FF9127C0000-ImageBase 7FF9127C7090-OEP 00031000-ImageSize (200 704) 28: wintypes.dll 7FF910700000-ImageBase 7FF91072AEA0-OEP 00151000-ImageSize (1 380 352) 29: dwmapi.dll 7FF911A40000-ImageBase 7FF911A43670-OEP 0002E000-ImageSize (188 416) 30: CRYPT32.dll 7FF913C40000-ImageBase 7FF913C8FA10-OEP 001FE000-ImageSize (2 088 960) 31: MSASN1.dll 7FF9134A0000-ImageBase 7FF9134A5A20-OEP 00012000-ImageSize (73 728) 32: CRYPTSP.dll 7FF913F40000-ImageBase 7FF913F448D0-OEP 0001B000-ImageSize (110 592) Понравилось
vitokop, Все эти 32 dll пользует система. Сама прог. напрямую использует 4: kernel32, gdi32, user32, gdiplus. Они есть в секции импорта -- разница вариантов в том, что Thetrik, использует функции GDI+ для трансформации координат и масштабирования. В моём варианте - напрямую обработка матрицы трансформации, а функций для трансформации - всего 1 (GdipSetWorldTransform) и отрисовка 2: GdipFillPolygon2 и GdipFillEllipse Ужаты1й файл: бинарник. Заголовок сокращён, каталогов ВООБЩЕ в нём нет. Секция импорта так же отсутствует. Вручную она занимает меньше места. И если скомпрессить код чем то типа LZH... такое и получается
Это не память процесса, а страниц только в конкретном его модуле. Глобальная память зависит от кол-ва дескрипторов в древе VAD процесса. Например для "7seg_clock.exe" система выделила аж 380 вирт.страниц (1.5МБ), которые прописаны в VAD: Код (Text): 0: kd> !process 0 1 7seg_clock.exe PROCESS fffffa80023fd060 Cid: 0554 Peb: 7fffffdd000 ParentCid: 0b88 VadRoot: fffffa80033d3b80 Vads: 67 Private: 380 <------// 0: kd> !vm Total Private: 374279 ( 1497116 Kb) 06b0 explorer.exe 6635 ( 26540 Kb) 0334 Totalcmd.exe 2535 ( 10140 Kb) 00d8 AkelPad.exe 887 ( 3548 Kb) 066c livekd64.exe 669 ( 2676 Kb) 0974 FASMW.EXE 475 ( 1900 Kb) 063c 7seg_clock.exe 380 ( 1520 Kb) <-------// 0004 System 30 ( 120 Kb) То-есть можно запихать все секции в одну, но это экономия на спичках, т.к. особо не повлият на общий размер процесса. А "Clock7.exe" на моей Win7.x64 падает каждый раз с разными ошибками:
Rbnz ..На доработку показывет NT Headers файла: //+++++++++ => должны УДОВЛЕТВОРЯТЬ Загрузчику Windows Процес: D:\masm41\example\Часы\Clock\Clock7.exe Модуль: IMAGE_DOS_HEADER 0000: 5A4D { Magic number if ('MZ') 0x5A4D then DOS} //+++++++++++ 0002: 0000 { Bytes on last page of file } .................................................................... 000E: 0000 { Initial (relative) SS value } 0010: 4550 { Initial SP value } //++++++++++==> Signatura NT: NT Hreaders 0012: 0000 { Checksum } 0014: 8664 { Initial IP value } //++++++++ 8664 { Machine its: x64 } Далее смотри IMAGE_NТ_HEADER ..................................................................... 003A: 0000 { Reserved word } 003C: 00000010 { File address of new exe header } //++++++++++ ==> NT Hreaders IMAGE_NТ_HEADER 0010: 00004550 { Signature if 0x00004550 then PE} 0014: 8664 { Machine its: x64 } 0016: 0001 { NumberOfSections } 0018: 671C8568 { TimeDateStamp = 10/26/2024 09:00:08 } 001C: 00000000 { PointerToSymbolTable } 0020: 00000000 { NumberOfSymbols } 0024: 0080 { SizeOfOptionalHeader } 0026: 022F { Characteristics } //+++++++++ { $0001 Relocation info stripped from file } //+++++++++ { $0002 File is executable (i.e. no unresolved externel references) } //+++++++++ { $0004 Line numbers stripped from file } { $0008 Local symbols stripped from file } { $0020 Application can handle > 2GB address} { $0200 Debugging info stripped from file in .DBG file } IMAGE_OPTION_HEADER 0028: 020B { Magic PE32+} 002A: 0E { MajorLinkerVersion } 002B: 00 { MinorLinkerVersion } { LinkerVersion = 14.0 } 002C: 00000F34 { SizeOfCode } 0030: 00000000 { SizeOfInitializedData } 0034: 00000000 { SizeOfUninitializedData } 0038: 000000D0 { AddressOfEntryPoint } 003C: 00000010 { BaseOfCode } //++ 0040: 0000000140000000 { ImageBase } 0048: 00000010 { SectionAlignment } //++ 004C: 00000010 { FileAlignment } //++ 0050: 0006 { MajorOperatingSystemVersion } 0052: 0000 { MinorOperatingSystemVersion } { OperatingSystemVersion = 6.00 } 0054: 0000 { MajorImageVersion } 0056: 0000 { MinorImageVersion } { ImageVersion = 0.00 } 0058: 0006 { MajorSubsystemVersion } 005A: 0000 { MinorSubsystemVersion } { SubsystemVersion = 6.00 } 005C: 00000000 { Reserved1 } 0060: 00001004 { SizeOfImage } //+++++ 0064: 000000D0 { SizeOfHeaders } //++++++ 0068: 000030F2 { CheckSum } //+++ ==> !!!! 006C: 0002 { Subsystem: Image runs in the Windows GUI subsystem} //++++++ 006E: 0000 { DllCharacteristics } 0070: 0000000000100000 { SizeOfStackReserve } 0078: 0000000000001000 { SizeOfStackCommit } 0080: 0000000000100000 { SizeOfHeapReserve } 0088: 0000000000001000 { SizeOfHeapCommit } 0090: 00000000 { LoaderFlags } 0094: 00000000 { NumberOfRvaAndSizes } { IMAGE_DATA_DIRECTORY } 0 - Таблица экспорта 0098: 00000000 { N=0 VirtualAddress } //++++++++ !! 009C: 00000000 { N=0 Size } //++++++++ !! 1 - Таблица импорта 00A0: 00000000 { N=1 VirtualAddress } //++++++++ !! 00A4: 00000000 { N=1 Size } //++++++++ !! 2 - Таблица ресурсов 00A8: 7865742E { N=2 VirtualAddress } 00AC: 00000074 { N=2 Size } 3 - Таблица исключений 00B0: 00000956 { N=3 VirtualAddress } 00B4: 000000D0 { N=3 Size } 4 - Таблица гарантий (SECURITY) 00B8: 00000F34 { N=4 VirtualAddress } 00BC: 000000D0 { N=4 Size } 5 - Таблица настройки адресов 00C0: 00000000 { N=5 VirtualAddress } //++++++++ !! 00C4: 00000000 { N=5 Size } //++++++++ !! 6 - Таблица отладочной информации (DEBUG ) 00C8: 00000000 { N=6 VirtualAddress } 00CC: E0000020 { N=6 Size } 7 - Таблица строк описаний (COPYRIGHT or ARCHITECTURE) 00D0: 26358D48 { N=7 VirtualAddress } 00D4: 66000000 { N=7 Size } 8 - IMAGE_DIRECTORY_ENTRY_GLOBALPTR 00D8: ACD4EBB9 { N=8 VirtualAddress } 00DC: 0928BA56 { N=8 Size } 9 - IMAGE_DIRECTORY_ENTRY_TLS 00E0: DB310000 { N=9 VirtualAddress } 00E4: 5FC11966 { N=9 Size } 10 - IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 00E8: 89ACC588 { N=10 VirtualAddress } 00EC: 40C0D2C5 { N=10 Size } 11 - IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 00F0: CB30CDD2 { N=11 VirtualAddress } 00F4: 30C5440F { N=11 Size } 12 - IMAGE_DIRECTORY_ENTRY_IAT (Import Address Table) 00F8: CAFFAAE8 { N=12 VirtualAddress } 00FC: 8D48EA75 { N=12 Size } 13 - IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 0100: 0009233D { N=13 VirtualAddress } 0104: 00BBB900 { N=13 Size } 14 - IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTIOR 0108: 8D480000 { N=14 VirtualAddress } 010C: 00009D35 { N=14 Size } 15 - Недокументирована 0110: F3575600 { N=15 VirtualAddress } 0114: 5F5EA548 { N=15 Size } Адрес секции .text находим по __ImageFirstSection64: function FieldOffset(const Struc; const Field): Cardinal; begin Result := Cardinal(@Field) - Cardinal(@Struc); end; function __ImageFirstSection64(NtHeader: PImageNtHeaders64): PImageSectionHeader; begin Result := Pointer( Cardinal(NtHeader) + FieldOffset(NtHeader^, NtHeader^.OptionalHeader) + NtHeader^.FileHeader.SizeOfOptionalHeader ); end; SECTION HEADER #0 ==> совпадает якобы с <Таблица ресурсов> 00A8: 7865742E 00AC: 00000074 00A8: {name = .text} 00B0: 00000956 { VirtualSize } 00B4: 000000D0 { Section RVA / VirtualAddress } 00B8: 00000F34 { Phisical Size / SizeOfRawData } 00BC: 000000D0 { Phisical Offset / PointerToRawData } 00C0: 00000000 { PointerToRelocations } 00C4: 00000000 { PointerToLinenumbers } 00C8: 0000 { NumberOfRelocations } 00CA: 0000 { NumberOfLinenumbers } 00CC: E0000020 { Characteristics } { Section contains code } { Section is executable } { Section is readable } { Section is writeable } <+= !!! ><s>< Нет Экспорта Нет Импорта
На запакованном 1.7КБ интересные дела происходят, например https://prnt.sc/-PG5rYCoxcb1 https://prnt.sc/eFJMk3yWrm-E
alex_dz, Нету ни в папке minidump системы, ни в папке отладчика x64dbg. В окне крэша показывает: Код (Text): Сигнатура проблемы: Имя события проблемы: APPCRASH Имя модуля с ошибкой: Clock7.exe Код исключения: c0000005 Смещение исключения: 000000000000040f Версия ОС: 6.1.7601.2.1.0.256.48 Код языка: 1049 Дополнительные сведения 1: 48fd Дополнительные сведения 2: 48fd5e1d5c4cfcb9fbf4ae6ea7a7dd6a Дополнительные сведения 3: 2830 Дополнительные сведения 4: 2830a54577f30708e31d56de3ab1617e
а ежели запустить из-под дебаггера часики? верняк покажет где падает у мну тоже Win7 SP1 x64 - пашет норм https://prnt.sc/9Z4aVRjilyln
Marylin, Win7.x64 под руками нет.... На 8.1.x64 - проблем нет Несложно определить причину падения с помощью x64dbg --- Сообщение объединено, 27 окт 2024 --- vitokop, там не только экспорта и импорта нет. Вообще нет ни одного каталога. В стандартном заголовке их 16. Последний ужатый вариант: 1792 байта
..несложно это как? Вот встаёт отладчик где-то в нёдрах ntdll, хотя в логах говорит, что это оер. В стеке вызовов чисто, в настройках брейк на tls снят. И что дальше? --- Сообщение объединено, 27 окт 2024 --- ну и ладно.. это я просто к сведению говорю.
Marylin, смотри вкладку "Саll Stack". В русифицированном она называется "Стек вызовов". Последний вызов из твоего файла и будет искомой точкой бага