WinAsm Studio, The Assembly IDE - Free Downloads, Source Code
Sponsors
Articles
Programming Quick Start
32-bit Assembler is Easy
Porting Iczelion tutorials
What is FASM
Hard Drive Recovery
Wiring your own LAN
Personal menu
Welcome Guest
User:
Pass:
Register!
Resend Validation Email
 
Forum
 

Check if application is already running, it terminates the app, but always shows that the app has been terminated even when it was never running

Slider
Quote Post


Extremely Active Member
******

Group: Moderators
Posts: 287
Member No.: 5004
Joined: 11-May 07


It terminates the app, but always shows that the app has been terminated even when it was never running.



CODE
start:

   invoke LoadIcon,hInstance,200   ; icon ID


   invoke GetModuleHandle, NULL
   mov    hInstance,eax
   
   invoke GetCommandLine
   mov    CommandLine,eax
   
   invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT

  ; with ReqNTPrivilege call, we ask for the 'SeShutdownPrivilege'
  ; note string names of possible privilege are in windows.inc

   invoke  ReqNTPrivilege, SADD("SeShutdownPrivilege")
   .if eax == FALSE
     invoke  MessageBox,NULL,addr msg_NotPL,addr BoxName,MB_OK
     invoke  ExitProcess,NULL
   .endif

   invoke ExitProcess,eax
   
KillProcess proc lpszExecutable:LPSTR
   LOCAL bLoop:BOOL
   LOCAL bResult:BOOL
   LOCAL pe32:PROCESSENTRY32
   LOCAL hProcess:HANDLE
   LOCAL hProcesses:HANDLE

   mov bLoop,TRUE
   mov bResult,FALSE

  ; Returns an open handle to the specified snapshot if successful or - 1 otherwise.
   invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
   mov hProcesses,eax   ;  Did not need 2 copies of your snap shot

   mov pe32.dwSize,SIZEOF PROCESSENTRY32

   invoke Process32First,hProcesses,ADDR pe32
   .IF eax
       .WHILE bLoop
           invoke CompareString, LOCALE_USER_DEFAULT, NORM_IGNORECASE, addr pe32.szExeFile, -1, lpszExecutable, -1
           .IF eax==2; check if strings are equal in lexical value

                    ;  With having addr pe32.th32ProcessID you were getting an invalid PID
               invoke OpenProcess, PROCESS_TERMINATE, FALSE, pe32.th32ProcessID; returns handle  

                .IF eax!=NULL
                   mov hProcess, eax       ; Need to save the process handle to terminate
                   invoke TerminateProcess, hProcess, 0
                   invoke CloseHandle, hProcess; fails if eax is zero
                   
                   mov bResult,TRUE;
                   
               .endif
           .endif
         ; why go on to next process ?
          invoke Process32Next, hProcesses, ADDR pe32
          ; Retrieves information about the next process recorded in a system snapshot.

           mov bLoop,eax
       .endw
       invoke CloseHandle,hProcesses
   .endif
   mov eax,bResult
   ret

KillProcess endp

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
   LOCAL wc:WNDCLASSEX
   LOCAL msg:MSG
   LOCAL hwnd:HWND
   LOCAL tc   :DWORD

   mov   wc.cbSize,SIZEOF WNDCLASSEX
   mov   wc.style, CS_HREDRAW or CS_VREDRAW
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   push  hInstance
   pop   wc.hInstance
   mov   wc.hbrBackground,COLOR_BTNFACE+1
   mov   wc.lpszMenuName,NULL
   mov   wc.lpszClassName,OFFSET ClassName
   
   invoke LoadIcon,NULL,IDI_APPLICATION
   mov   wc.hIcon,eax
   mov   wc.hIconSm,eax
   
   invoke LoadCursor,NULL,IDC_ARROW
   mov   wc.hCursor,eax
   
 
   invoke RegisterClassEx, addr wc

   INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
          WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\; creates a "hidden" window
          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
          hInst,NULL
   mov   hwnd,eax

   invoke ShowWindow, hwnd,SW_MINIMIZE   ;Minimal window
   invoke UpdateWindow, hwnd

  ; -------------------
  ; Close screen
  ; -------------------
     invoke SendMessage,hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL

  ;-----------------------------------
  ; Loop until PostQuitMessage is sent
  ;-----------------------------------
   StartLoop:
     invoke GetMessage,ADDR msg,NULL,0,0
     cmp eax, 0
     je ExitLoop
     invoke TranslateMessage, ADDR msg
     invoke DispatchMessage,  ADDR msg
     jmp StartLoop
   ExitLoop:
   
   mov     eax,msg.wParam
   ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   
   LOCAL bResult:BOOL
   LOCAL bLoop:BOOL

   .IF uMsg==WM_DESTROY
       invoke PostQuitMessage,NULL

   .ELSEIF uMsg==WM_CREATE
       mov eax, -1       ;FALSE
       
       mov bResult,eax

       invoke MessageBox,0,OFFSET sucesstext,OFFSET started,MB_OK
       invoke KillProcess,OFFSET ProcessName
                 
       ret
   
   .ELSE
       invoke DefWindowProc,hWnd,uMsg,wParam,lParam        
       ret
   .ENDIF
   
   xor eax,eax
   ret
WndProc endp

ReqNTPrivilege proc lpPrivilegeName:DWORD

; return TRUE (not zero) in eax if privilege is granted
; lpPrivilegeName parameter points to a string with request privilege name

   LOCAL   hProcess:DWORD
   LOCAL   hToken:DWORD
   LOCAL   phToken:DWORD
   LOCAL   RetLen:DWORD
   LOCAL   pRetLen:DWORD
   LOCAL   tkp:TOKEN_PRIVILEGES
   LOCAL   tkp_old:TOKEN_PRIVILEGES
;
   invoke  GetCurrentProcess
   mov     hProcess, eax
   lea     eax, hToken
   mov     phToken, eax
   invoke  OpenProcessToken, hProcess, \
           TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, \
           phToken  
   .if eax != FALSE
     lea     eax, tkp.Privileges[0].Luid
     invoke  LookupPrivilegeValue, NULL, \
             lpPrivilegeName, \
             eax
     lea     eax, RetLen
     mov     pRetLen, eax
     mov     tkp.PrivilegeCount, 1
     mov     tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
     invoke  AdjustTokenPrivileges, hToken, \
             NULL, \
             addr tkp, \
             sizeof tkp_old, \
             addr tkp_old, \
             pRetLen
   .endif
   ret
   
ReqNTPrivilege endp

end start

PMEmail Poster
Top
Slider
Quote Post


Extremely Active Member
******

Group: Moderators
Posts: 287
Member No.: 5004
Joined: 11-May 07


Here is the complete code, disregard previous code. :-)

CODE
; Only_One_Running.asm   Determine if program is already running    
;
.586
.model flat,stdcall
option casemap:none

include  \masm32\include\windows.inc
include  \masm32\include\user32.inc
include  \masm32\include\kernel32.inc
include  \masm32\include\shlwapi.inc
include  \masm32\macros\macros.asm
include  \masm32\include\advapi32.inc

includelib  \masm32\lib\advapi32.lib
includelib  \masm32\lib\user32.lib
includelib  \masm32\lib\kernel32.lib
includelib  \masm32\lib\shlwapi.lib

; Local Prototypes

   IsWinNT         PROTO
   ReqNTPrivilege  PROTO :DWORD
   
.const

   dwMaskNT        DWORD   2

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

.data

  msg_NotNT   BYTE    "This is NOT an NT system.",0
  msg_NotPL   BYTE    "Privilege requested NOT granted.",0
  BoxName     BYTE    "ASM Win NT Shutdown",0
  ClassName    BYTE   "MainWinClass",0
  AppName      BYTE   "CLOSE THIS WINDOW!",0
  ProcessName  BYTE   "notepad.exe",0
  started      BYTE   "KillIt",0
  sucesstext  BYTE    "Notepad has been terminated!",0
  failedtext   BYTE   "Notepad is not currently running!",0

.data?

  hInstance   HINSTANCE ?
  CommandLine LPSTR     ?

.code

start:

   invoke LoadIcon,hInstance,200  ; icon ID


   invoke GetModuleHandle, NULL
   mov    hInstance,eax
   
   invoke GetCommandLine
   mov    CommandLine,eax
   
   invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT

 ; with ReqNTPrivilege call, we ask for the 'SeShutdownPrivilege'
 ; note string names of possible privilege are in windows.inc

   invoke  ReqNTPrivilege, SADD("SeShutdownPrivilege")
   .if eax == FALSE
     invoke  MessageBox,NULL,addr msg_NotPL,addr BoxName,MB_OK
     invoke  ExitProcess,NULL
   .endif

   invoke ExitProcess,eax
   
KillProcess proc lpszExecutable:LPSTR
   LOCAL bLoop:BOOL
   LOCAL bResult:BOOL
   LOCAL pe32:PROCESSENTRY32
   LOCAL hProcess:HANDLE
   LOCAL hProcesses:HANDLE

   mov bLoop,TRUE
   mov bResult,FALSE

 ; Returns an open handle to the specified snapshot if successful or - 1 otherwise.
   invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0

   mov hProcesses,eax  ;  Did not need 2 copies of your snap shot

   mov pe32.dwSize,SIZEOF PROCESSENTRY32

   invoke Process32First,hProcesses,ADDR pe32

  .IF eax
       .WHILE bLoop
           invoke CompareString, LOCALE_USER_DEFAULT, NORM_IGNORECASE, addr pe32.szExeFile, -1, lpszExecutable, -1
           .IF eax==2; check if strings are equal in lexical value

                   ;  With having addr pe32.th32ProcessID you were getting an invalid PID
               invoke OpenProcess, PROCESS_TERMINATE, FALSE, pe32.th32ProcessID; returns handle  

                .IF eax!=NULL
                   mov hProcess, eax      ; Need to save the process handle to terminate
                   invoke TerminateProcess, hProcess, 0
                   invoke CloseHandle, hProcess; fails if eax is zero
                   
                   mov bResult,TRUE;
                   
               .endif
           .endif
         ; why go on to next process ?
          invoke Process32Next, hProcesses, ADDR pe32
         ; Retrieves information about the next process recorded in a system snapshot.

           mov bLoop,eax
       .endw
       invoke CloseHandle,hProcesses
   .endif
   mov eax,bResult
   ret

KillProcess endp

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
   LOCAL wc:WNDCLASSEX
   LOCAL msg:MSG
   LOCAL hwnd:HWND
   LOCAL tc   :DWORD

   mov   wc.cbSize,SIZEOF WNDCLASSEX
   mov   wc.style, CS_HREDRAW or CS_VREDRAW
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   push  hInstance
   pop   wc.hInstance
   mov   wc.hbrBackground,COLOR_BTNFACE+1
   mov   wc.lpszMenuName,NULL
   mov   wc.lpszClassName,OFFSET ClassName
   
   invoke LoadIcon,NULL,IDI_APPLICATION
   mov   wc.hIcon,eax
   mov   wc.hIconSm,eax
   
   invoke LoadCursor,NULL,IDC_ARROW
   mov   wc.hCursor,eax
   
 
   invoke RegisterClassEx, addr wc

;but, i noticed that WM_CREATE may not always return 0
;if EAX (from bResult) is -1, it will cause the window to be destroyed
;CreateWindowEx will return invalid handle

INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
          WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
          hInst,NULL
   mov   hwnd,eax

   invoke ShowWindow, hwnd,SW_MAXIMIZE    
   invoke UpdateWindow, hwnd

 ; Close screen
   
     invoke SendMessage,hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL

 ; Loop until PostQuitMessage is sent
   
   StartLoop:
     invoke GetMessage,ADDR msg,NULL,0,0
     cmp eax, 0
     je ExitLoop
     invoke TranslateMessage, ADDR msg
     invoke DispatchMessage,  ADDR msg
     jmp StartLoop

   ExitLoop:
   
   mov     eax,msg.wParam
   ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   
   LOCAL bResult:BOOL
   LOCAL bLoop:BOOL

   .IF uMsg==WM_DESTROY
       invoke PostQuitMessage,NULL

   .ELSEIF uMsg==WM_CREATE

       mov eax, -1      ;FALSE note: same message if zero is checked ?
       
       mov bResult,eax

     ; int 3

       invoke MessageBox,0,OFFSET sucesstext,OFFSET started,MB_OK
       invoke KillProcess,OFFSET ProcessName
                 
       ret
   
   .ELSE

       invoke DefWindowProc,hWnd,uMsg,wParam,lParam        
       ret
   .ENDIF
   
   xor eax,eax
   ret

WndProc endp

ReqNTPrivilege proc lpPrivilegeName:DWORD

; return TRUE (not zero) in eax if privilege is granted
; lpPrivilegeName parameter points to a string with request privilege name

   LOCAL   hProcess:DWORD
   LOCAL   hToken:DWORD
   LOCAL   phToken:DWORD
   LOCAL   RetLen:DWORD
   LOCAL   pRetLen:DWORD
   LOCAL   tkp:TOKEN_PRIVILEGES
   LOCAL   tkp_old:TOKEN_PRIVILEGES
;
   invoke  GetCurrentProcess
   mov     hProcess, eax
   lea     eax, hToken
   mov     phToken, eax
   invoke  OpenProcessToken, hProcess, \
           TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, \
           phToken  
   .if eax != FALSE
     lea     eax, tkp.Privileges[0].Luid
     invoke  LookupPrivilegeValue, NULL, \
             lpPrivilegeName, \
             eax
     lea     eax, RetLen
     mov     pRetLen, eax
     mov     tkp.PrivilegeCount, 1
     mov     tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
     invoke  AdjustTokenPrivileges, hToken, \
             NULL, \
             addr tkp, \
             sizeof tkp_old, \
             addr tkp_old, \
             pRetLen
   .endif
   ret
   
ReqNTPrivilege endp

end start
PMEmail Poster
Top
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

Topic Options Reply to this topicStart new topicStart Poll

 

Sponsors
Computer Science

Internet
C/C++
Hardware & PC maintenance

HiEditor

General Discussions
Suggestions/Bug Reports
WinAsm Studio

General Discussions
Suggestions/Bug Reports
WinAsm Studio FAQ
Multilingual User Interface
Add-Ins
Assembly Programming

Main
Newbies
Projects
Custom Controls
Snippets
Announcements & Rules

Announcements

General

Online Degrees - Distance Learning
The Heap
Russian
Google