[ Eurora3D Team @ 06.01.2007. 14:58 ] @
Ovo je MASM32 primer CommandLine programa za unistavanje procesa pod Win32.



Za ostale asemblere koji ne podrzavaju invoke treba izmeniti pozive ka Api funkcijama
Primer:
invoke MessageBox,0,addr Text,addr Titl,MB_OK
sa
push MB_OK
push offset Titl
push offset Text
push 0
call MessageBox

U programu su koriscene i neke Masm High Level funkcija (iz masm32.lib) (inString , szRight) koje treba zameniti svojim.



trmPresess.asm
Code:

;(c) Eurora3D Team - http://www.extramedia.co.yu/eurora3d/
;Program za ukidanje procesa / programa
;Koriscenje - Komandna Linija (napisite je u Notepad-u i snimite kao NekoIme.bat
;NAPOMENA : velika i mala slova u imenu programa moraju da budu ista kao u TaskMenageru npr.: notepad.exe ne Notepad.exe
;Komandna Linija : trmProcess C:\NekiProgram.exe ili trmProcess NekiProgram.exe
;Isto vazi i za pozivanje iz nekog drugog programa (C:\trmProcess.exe notepad.exe) 
;Program nema GUI i nije vidljiv pri izvrsenju
;Ovaj kod je napisan za Assembler MASM32 sa HighLevel funkcijama
;Komande za assembler MASM32 
;C:\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"C:\Masm32\Include" "trmProcess.asm"
;i linker
;C:\Masm32\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"C:\Masm32\Lib" /OUT:"trmProcess.exe" "trmProcess.obj" 

.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include user32.inc
   include kernel32.inc
   include masm32.inc
   include MACROS.ASM
   includelib user32.lib
   includelib kernel32.lib
   includelib masm32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.data
  
   hSnapShot            DD             ?                    ; snapshot handler
   hSnapShot2           DD             ?                    ; snapshot handler
   myProcess            PROCESSENTRY32 <>                   ; process struktura
   hProcess dd ?

.data?
   hInstance HINSTANCE ?
   CommandLine LPSTR ?

.code


; ---------------------------------------------------------------------------


start:
    invoke GetModuleHandle, NULL
    mov    hInstance,eax
    invoke GetCommandLine
    mov    CommandLine,eax
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL Com[256]:byte
LOCAL blank:DWORD
LOCAL del:DWORD
LOCAL lenn:DWORD
LOCAL buff1[MAX_PATH]:byte
LOCAL buff2[MAX_PATH]:byte
;********************************************************
;Command Line Parser - Uklanjamo prvi deo CommLine (ime programa "trmPrograma ")
invoke lstrcpy,addr Com,CmdLine
invoke lstrlen,addr Com
mov buff1[0],0
mov buff2[0],0
mov lenn,eax
mov blank,eax
mov del,eax
invoke lstrcpy,addr buff1,addr Com
invoke InString,1,addr Com,SADD(" ")
mov blank,eax
.if eax==0
    invoke lstrcpy,addr buff1,addr Com
    jmp @F
.endif
mov eax,lenn
sub eax,blank
invoke szRight,addr Com,addr buff1,eax
@@:
mov eax,lenn
invoke lstrcpy,addr buff2,addr buff1
invoke InString,1,addr Com,SADD("\")
.while eax!=0
mov del,eax
.if eax<lenn
    inc del
.endif
mov edi,lenn
sub edi,del
inc edi
invoke szRight,addr Com,addr buff2,edi
invoke InString,del,addr Com,SADD("\")
.endw
invoke lstrlen,addr buff1
.if eax==0
    ret
.endif
invoke lstrlen,addr buff2
.if eax==0
    ret
.endif
;Za debugovanje obrisite ; ispred sledece dve linije
;invoke MessageBox,0,addr buff1,SADD("trmProcess"),MB_OK
;invoke MessageBox,0,addr buff2,SADD("trmProcess"),MB_OK
;
;*****************************************************
;Process Unistavanje
    pushad 
    invoke  CreateToolhelp32Snapshot, TH32CS_SNAPALL, 0    ; kreiranje snapshot
      mov     hSnapShot, eax                                 ;cuvanje snapshot hendlera
      mov     myProcess.dwSize, sizeof myProcess             ; podesavamo velicinu  Proc. strukture
      invoke  Process32First,hSnapShot, ADDR myProcess       ; dobijamo prvi proces
      .while eax; kruzimo kroz sve procese
      ; Ovde imamo dva if-a jedan za punu aresu programa a drugi samo za ima programa 
     invoke lstrcmp,addr myProcess.szExeFile,addr buff1
     .if eax==0
         invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,myProcess.th32ProcessID
         .if eax !=0
         mov hProcess,eax
         invoke TerminateProcess,hProcess,0
         invoke CloseHandle,hProcess
         .endif
     .endif
     invoke lstrcmp,addr myProcess.szExeFile,addr buff2
     .if eax==0
         invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE,myProcess.th32ProcessID
         .if eax !=0
         mov hProcess,eax
         invoke TerminateProcess,hProcess,0
         invoke CloseHandle,hProcess
         .endif
     .endif
     invoke  Process32Next,hSnapShot, ADDR myProcess      ;dobijamo sledeci proces u eax-u 
      .endw
      invoke  CloseHandle,hSnapShot
      popad 
;********************************************************** 
    ret
WinMain endp

end start

Uz primer zakacen je i zip sa sors kodom i napravljenim programom
[ Eurora3D Team @ 29.05.2007. 22:04 ] @
Da dodam i ovo
Unistavanje procesa je bukvalan prevod (ovakvi izrazi se cesto koristi u dokumentaciji).
Bolji (blazi) pevod bi bio Ukidanje rada nekog programa.
[ Eurora3D Team @ 14.07.2007. 01:12 ] @
System Tray primer

Ispod je kod / primer za koriscenje System Tray-a (malih ikonica kod sata u Windowsu) u Win32 assembler - u.
Kod je za MASM32 assembler.
Svi komentari i uputstva su u kodu.
Da bi se assemblirao potreban je assembler MASM32

Code:

;MASM32 Primer koriscenja System Tray-a
;Program kreira prozor. Kada korisnik pritisne dugme _ za minimalizovanje
;program pravi tray i konicu i meni na njoj koji je dostupan desnim klikom
;Dok je Tray ikonica aktivna glavni prozor je nevidljiv i obrnuto

.386 
.model flat,stdcall 
option casemap:none 
;inkludovali smo potrebne inc i lib fajlove
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\shell32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\shell32.lib 

;Globalne konstante i promenljive u programu su ispod
WM_SHELLNOTIFY equ WM_USER+5 
IDI_TRAY equ 0 
IDM_RESTORE equ 1000 
IDM_EXIT equ 1010 
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD 

.data 
ClassName  db "TrayIconWinClass",0 
AppName    db "TrayIcon Demo",0 
RestoreString db "&Vrati na predhodnu velicinu",0 
ExitString   db "I&skljuci program",0 

.data? 
hInstance dd ? 
note NOTIFYICONDATA <> 
hPopupMenu dd ? 

.code 
start: 
;Klasican start , uzimamo modul handler i idemo na WinMain . 
    invoke GetModuleHandle, NULL 
    mov    hInstance,eax 
    invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT ; Iz ove procedure cemo se vratiti kada prozor bude unisten
    invoke ExitProcess,eax ;i ovo je kraj programa . 

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
 ;Klasicna WinMain procedura koja kreira jedan prozor
 
    LOCAL wc:WNDCLASSEX 
    LOCAL msg:MSG 
    LOCAL hwnd:HWND 
    mov   wc.cbSize,SIZEOF WNDCLASSEX ; Punjenje WNDCLASSEX strukture wd. Koristimo mov i Stack (Push Pop)
    mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS ;stil prozora
    mov   wc.lpfnWndProc, OFFSET WndProc ;Nasa window procedura (to je sledeca funkcija u programu)
    mov   wc.cbClsExtra,NULL ;broj extra bajtova za klasu (ovo se nekad koristi da bi se neki podatci cuvali u ovoj strukturi)
    mov   wc.cbWndExtra,NULL ;slicno kao i gornji komentar
    push  hInst 
    pop   wc.hInstance ;instanca programa. Svaki process ima svoj jedinstveni ID u windows-u
    mov   wc.hbrBackground,COLOR_APPWORKSPACE ;boja prozora
    mov   wc.lpszMenuName,NULL ;meni nemamo
    mov   wc.lpszClassName,OFFSET ClassName ;ime klase prozora
    invoke LoadIcon,NULL,IDI_APPLICATION ;klasicna app ikonica
    mov   wc.hIcon,eax 
    mov   wc.hIconSm,eax 
    invoke LoadCursor,NULL,IDC_ARROW ;kursor strelica
    mov   wc.hCursor,eax 
    invoke RegisterClassEx, addr wc  ;Da bi registrovali klasu za nas window i u sledecoj liniji  ga kreiramo
    invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\ 
    WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU+WS_MINIMIZEBOX+WS_MAXIMIZEBOX+WS_VISIBLE,CW_USEDEFAULT,\ 
    CW_USEDEFAULT,350,200,NULL,NULL,hInst,NULL 
    mov   hwnd,eax 
    .while TRUE ; Ovo je Message loop iz koje se izlazi kad iskljucimo prozor. Do tada je aktivna WndProc koja je pozvana kroz DispatchMessage
        invoke GetMessage, ADDR msg,NULL,0,0 
        .BREAK .IF (!eax) 
        invoke TranslateMessage, ADDR msg 
        invoke DispatchMessage, ADDR msg 
    .endw 
    mov eax,msg.wParam 
    ret 
WinMain endp 

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
;Ovo je nasa window procedura u kojoj procesuiramo poruke za nas prozor koje nas zanimaju
    LOCAL pt:POINT ;lokalna promenljiva tipa tacka x,y
    .if uMsg==WM_CREATE ; Ova poruka je poslada nasem prozoru od windowsa prilikom kreiranja
        invoke CreatePopupMenu ;Kreiramo Popup meni ( onaj koji se pokazuje desnim klikom )
        mov hPopupMenu,eax ; i cuvamo njegov handler u promenjljivoj
        invoke AppendMenu,hPopupMenu,MF_STRING,IDM_RESTORE,addr RestoreString ; dodajemo 2 itema u nas meni
        invoke AppendMenu,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString ;ovo je drugi
    .elseif uMsg==WM_DESTROY ;Ova poruka je poslata nasem prozoru od windowsa kada prozor treba da se unisti
        invoke DestroyMenu,hPopupMenu ; Brisemo nas Popup meni
        invoke PostQuitMessage,NULL ;i saljemo poruku o prekidu
    .elseif uMsg==WM_SIZE ; Ova poruka je poslada nasem prozoru od windowsa kada prozor treba da promeni velicinu
        .if wParam==SIZE_MINIMIZED ; U wParamu imamo vrstu promene velicine . Treba nam poruka za minimalizovanje
            mov note.cbSize,sizeof NOTIFYICONDATA ;popunjavamo strukturu za notifikaciju (kada predjemo misem preko ikonice u tray-u)
            push hWnd 
            pop note.hwnd ;ID naseg prozora
            mov note.uID,IDI_TRAY ; ID koji se odredjivati nasu ikonicu .Ovaj id smo mi odredili i on je 0
            mov note.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP ;flagovi 
            mov note.uCallbackMessage,WM_SHELLNOTIFY ; ovo je callback poruka koju cemo da dobijemo od windowsa (iz system tray-a)
            invoke LoadIcon,NULL,IDI_APPLICATION ; koristimo klasicnu app ikonicu 
            mov note.hIcon,eax 
            invoke lstrcpy,addr note.szTip,addr AppName ;Ovo je tekst koji se vidi kad se misem predje preko tray ikonice
            invoke ShowWindow,hWnd,SW_HIDE ; Sakrivamo nas prozor
            invoke Shell_NotifyIcon,NIM_ADD,addr note ;I aktiviramo tray notifikaciju
        .endif 
    .elseif uMsg==WM_COMMAND ; Ove komandne poruke dobijamo od nase Popup menija
    ;Imamo 2 itema Vrati velicinu  i Izlaz . 
        .if lParam==0 
            invoke Shell_NotifyIcon,NIM_DELETE,addr note ;U svakom slucaju tray nam vise ne treba
            mov eax,wParam 
            .if ax==IDM_RESTORE ;ako je komanda sa naseg menija IDM_RESTORE
                invoke ShowWindow,hWnd,SW_RESTORE ;Onda vracamo prozor u prvobitno stanje
            .else ;inace 
                invoke DestroyWindow,hWnd ;posto je nasa druga komanda za Izlaz unistavamo prozor i kasnije izlazimo iz programa
            .endif 
        .endif 
    .elseif uMsg==WM_SHELLNOTIFY ;Ako smo dobili poruku iz tray-a
        .if wParam==IDI_TRAY ;sa nasim ID-om
            .if lParam==WM_RBUTTONDOWN ; ako je pritisnuto desno dugme
                invoke GetCursorPos,addr pt ;uzimamo poziciju kursora da bi tu prikazali nas Popup meni
                invoke SetForegroundWindow,hWnd ;postavljamo nas prozor kao gornji iako nije vidljiv (ovo je bitan trik)
                invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL ; prikazujemo nas Popup meni
                invoke PostMessage,hWnd,WM_NULL,0,0 ;saljemo null prozoru
            .elseif lParam==WM_LBUTTONDBLCLK ;ako je dva puta kliknuto na ikonicu
                invoke SendMessage,hWnd,WM_COMMAND,IDM_RESTORE,0 ;saljemo WM_RESTORE poruku nasem prozoru
                                                                    ;(kao da smo kliknuli Vrati u nasem meniju)
            .endif 
        .endif 
    .else 
        invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; ako nije nista od ovoga prepustamo windowsu da procesuira window poruku 
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 

end start 
;Assembliranje
;Snimite fail kao Tray.asm
;Komandna linija za assembler MASM32 i linker
;Snimiti sledece 2 linije u fail sa nastavkom bat (bez prvih znakova ;) i pokrenite taj fail

;C:\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"C:\Masm32\Include" "Tray.asm"
;C:\Masm32\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"C:\Masm32\Lib" /OUT:"Tray.exe" "Tray.obj" "Tray.res"

;NAPOMENA Ako bat fail nije u folderu sa asm failom ispravite gornje linije upisujuci punu putanju do asm faila
;Ako asembler nije u folderu koji je gore naznacen izmenite putanje do assemblera i linkera