143 lines
3.7 KiB
NASM
143 lines
3.7 KiB
NASM
|
|
||
|
; Component Object Model usage demonstration
|
||
|
|
||
|
format PE64 GUI 5.0
|
||
|
entry start
|
||
|
|
||
|
include 'win64a.inc'
|
||
|
|
||
|
struc GUID def
|
||
|
{
|
||
|
match d1-d2-d3-d4-d5, def
|
||
|
\{
|
||
|
.Data1 dd 0x\#d1
|
||
|
.Data2 dw 0x\#d2
|
||
|
.Data3 dw 0x\#d3
|
||
|
.Data4 db 0x\#d4 shr 8,0x\#d4 and 0FFh
|
||
|
.Data5 db 0x\#d5 shr 40,0x\#d5 shr 32 and 0FFh,0x\#d5 shr 24 and 0FFh,0x\#d5 shr 16 and 0FFh,0x\#d5 shr 8 and 0FFh,0x\#d5 and 0FFh
|
||
|
\}
|
||
|
}
|
||
|
|
||
|
interface ITaskBarList,\
|
||
|
QueryInterface,\
|
||
|
AddRef,\
|
||
|
Release,\
|
||
|
HrInit,\
|
||
|
AddTab,\
|
||
|
DeleteTab,\
|
||
|
ActivateTab,\
|
||
|
SetActiveAlt
|
||
|
|
||
|
CLSCTX_INPROC_SERVER = 0x1
|
||
|
CLSCTX_INPROC_HANDLER = 0x2
|
||
|
CLSCTX_LOCAL_SERVER = 0x4
|
||
|
CLSCTX_INPROC_SERVER16 = 0x8
|
||
|
CLSCTX_REMOTE_SERVER = 0x10
|
||
|
CLSCTX_INPROC_HANDLER16 = 0x20
|
||
|
CLSCTX_INPROC_SERVERX86 = 0x40
|
||
|
CLSCTX_INPROC_HANDLERX86 = 0x80
|
||
|
CLSCTX_ESERVER_HANDLER = 0x100
|
||
|
CLSCTX_NO_CODE_DOWNLOAD = 0x400
|
||
|
CLSCTX_NO_CUSTOM_MARSHAL = 0x1000
|
||
|
CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000
|
||
|
CLSCTX_NO_FAILURE_LOG = 0x4000
|
||
|
CLSCTX_DISABLE_AAA = 0x8000
|
||
|
CLSCTX_ENABLE_AAA = 0x10000
|
||
|
CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000
|
||
|
|
||
|
ID_EXIT = IDCANCEL
|
||
|
ID_SHOW = 100
|
||
|
ID_HIDE = 101
|
||
|
|
||
|
IDD_COMDEMO = 1
|
||
|
|
||
|
section '.text' code readable executable
|
||
|
|
||
|
start:
|
||
|
sub rsp,8 ; Make stack dqword aligned
|
||
|
|
||
|
invoke CoInitialize,NULL
|
||
|
invoke CoCreateInstance,CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList,ShellTaskBar
|
||
|
|
||
|
invoke GetModuleHandle,0
|
||
|
invoke DialogBoxParam,rax,IDD_COMDEMO,HWND_DESKTOP,COMDemo,0
|
||
|
|
||
|
cominvk ShellTaskBar,Release
|
||
|
|
||
|
invoke ExitProcess,0
|
||
|
|
||
|
proc COMDemo uses rbx, hwnd,msg,wparam,lparam
|
||
|
mov [hwnd],rcx
|
||
|
cmp edx,WM_INITDIALOG
|
||
|
je .wminitdialog
|
||
|
cmp edx,WM_COMMAND
|
||
|
je .wmcommand
|
||
|
cmp edx,WM_CLOSE
|
||
|
je .wmclose
|
||
|
xor eax,eax
|
||
|
jmp .finish
|
||
|
.wminitdialog:
|
||
|
jmp .processed
|
||
|
.wmcommand:
|
||
|
cmp r8,BN_CLICKED shl 16 + ID_EXIT
|
||
|
je .wmclose
|
||
|
cmp r8,BN_CLICKED shl 16 + ID_SHOW
|
||
|
je .show
|
||
|
cmp r8,BN_CLICKED shl 16 + ID_HIDE
|
||
|
jne .processed
|
||
|
.hide:
|
||
|
cominvk ShellTaskBar,HrInit
|
||
|
cominvk ShellTaskBar,DeleteTab,[hwnd]
|
||
|
jmp .processed
|
||
|
.show:
|
||
|
mov rbx,[ShellTaskBar]
|
||
|
comcall rbx,ITaskBarList,HrInit
|
||
|
comcall rbx,ITaskBarList,AddTab,[hwnd]
|
||
|
comcall rbx,ITaskBarList,ActivateTab,[hwnd]
|
||
|
jmp .processed
|
||
|
.wmclose:
|
||
|
invoke EndDialog,[hwnd],0
|
||
|
.processed:
|
||
|
mov eax,1
|
||
|
.finish:
|
||
|
ret
|
||
|
endp
|
||
|
|
||
|
section '.data' data readable writeable
|
||
|
|
||
|
CLSID_TaskbarList GUID 56FDF344-FD6D-11D0-958A-006097C9A090
|
||
|
IID_ITaskbarList GUID 56FDF342-FD6D-11D0-958A-006097C9A090
|
||
|
|
||
|
ShellTaskBar ITaskBarList
|
||
|
|
||
|
section '.idata' import data readable
|
||
|
|
||
|
library kernel,'KERNEL32.DLL',\
|
||
|
user,'USER32.DLL',\
|
||
|
ole,'OLE32.DLL'
|
||
|
|
||
|
import kernel,\
|
||
|
GetModuleHandle,'GetModuleHandleA',\
|
||
|
ExitProcess,'ExitProcess'
|
||
|
|
||
|
import user,\
|
||
|
DialogBoxParam,'DialogBoxParamA',\
|
||
|
EndDialog,'EndDialog'
|
||
|
|
||
|
import ole,\
|
||
|
CoInitialize,'CoInitialize',\
|
||
|
CoCreateInstance,'CoCreateInstance'
|
||
|
|
||
|
section '.rsrc' resource data readable
|
||
|
|
||
|
directory RT_DIALOG,dialogs
|
||
|
|
||
|
resource dialogs,\
|
||
|
IDD_COMDEMO,LANG_ENGLISH+SUBLANG_DEFAULT,comdemo
|
||
|
|
||
|
dialog comdemo,'Taskbar item control',70,70,170,24,WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME
|
||
|
dialogitem 'BUTTON','Show',ID_SHOW,4,4,45,15,WS_VISIBLE+WS_TABSTOP
|
||
|
dialogitem 'BUTTON','Hide',ID_HIDE,54,4,45,15,WS_VISIBLE+WS_TABSTOP
|
||
|
dialogitem 'BUTTON','Exit',ID_EXIT,120,4,45,15,WS_VISIBLE+WS_TABSTOP
|
||
|
enddialog
|