#include <tlhelp32.h>
void ErrorExit(String lpFun)
{ /* funkcja obsługujaca błędy */
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(lpFun.t_str())+40)*sizeof(TCHAR));
wsprintf((LPTSTR)lpDisplayBuf,
TEXT("%s failed with error %d: %s"),
lpFun, dw, lpMsgBuf);
MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
ExitProcess(dw);
}
//---------------------------------------------------------------------------
BOOL ProcessExists(String ProcesName, HANDLE &hProcess)
{ /* funkcja sprawdzająca czy proces istnieje */
DWORD ExitCode;
HANDLE Snap;
PROCESSENTRY32 proces;
Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
proces.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(Snap, &proces))
{
do
{
if(proces.szExeFile[0] != '[')
{
if(SameText(proces.szExeFile, ProcesName))
{
TOKEN_PRIVILEGES tPriv;
LUID luid;
HANDLE hWndTok;
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hWndTok))
{ ErrorExit("OpenProcessToken: "); }
if(!LookupPrivilegeValue(NULL, "SeDebugPrivilege", &luid ))
{ ErrorExit("LookupPrivilegeValue: "); }
tPriv.PrivilegeCount = 1;
tPriv.Privileges[0].Luid = luid;
tPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(hWndTok, false, &tPriv, sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL))
{ ErrorExit("AdjustTokenPrivileges: "); }
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, proces.th32ProcessID);
if(GetLastError() > 0) { ErrorExit("OpenProcess: "); }
CloseHandle(Snap);
return true;
}
}
}while(Process32Next(Snap , &proces));
}
CloseHandle(Snap);
return false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WinExec(("C:\\program1.exe " + Edit1->Text + "@ip -pw " + Edit2->Text + " \"./skrypt " + Edit5->Text + " > dane1\"").c_str(), SW_SHOW);
HANDLE hProcess;
while(1) /* oczekiwanie na uruchomienie procesu */
{
if(ProcessExists("program1.exe", hProcess)) break;
}
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
ShowMessage("Proces: program1.exe został zamknięty");
}