|
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 |
|

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 |
|
| |
|
|
|
| Slider |
|

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 |
|
| |
|
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:
Track this topic
Receive email notification when a reply has been made to this topic and you are not active on the board.
Subscribe to this forum
Receive email notification when a new topic is posted in this forum and you are not active on the board.
Download / Print this Topic
Download this topic in different formats or view a printer friendly version.
|
|
|