Advertisement
|
[x]
Attachment Details
|
||
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: |
/*****************************************************************
* nsProcess NSIS plugin v1.5 *
* *
* 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) *
* *
* Source function FIND_PROC_BY_NAME based *
* upon the Ravi Kochhar (kochhar@physiology.wisc.edu) code *
* Thanks iceman_k (FindProcDLL plugin) and *
* DITMan (KillProcDLL plugin) for point me up *
*****************************************************************/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Tlhelp32.h>
#include "ConvFunc.h"
/* Defines */
#define NSIS_MAX_STRLEN 1024
#define SystemProcessInformation 5
#define STATUS_SUCCESS 0x00000000L
#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004L
typedef struct _SYSTEM_THREAD_INFO {
FILETIME ftCreationTime;
DWORD dwUnknown1;
DWORD dwStartAddress;
DWORD dwOwningPID;
DWORD dwThreadID;
DWORD dwCurrentPriority;
DWORD dwBasePriority;
DWORD dwContextSwitches;
DWORD dwThreadState;
DWORD dwUnknown2;
DWORD dwUnknown3;
DWORD dwUnknown4;
DWORD dwUnknown5;
DWORD dwUnknown6;
DWORD dwUnknown7;
} SYSTEM_THREAD_INFO;
typedef struct _SYSTEM_PROCESS_INFO {
DWORD dwOffset;
DWORD dwThreadCount;
DWORD dwUnkown1[6];
FILETIME ftCreationTime;
DWORD dwUnkown2;
DWORD dwUnkown3;
DWORD dwUnkown4;
DWORD dwUnkown5;
DWORD dwUnkown6;
WCHAR *pszProcessName;
DWORD dwBasePriority;
DWORD dwProcessID;
DWORD dwParentProcessID;
DWORD dwHandleCount;
DWORD dwUnkown7;
DWORD dwUnkown8;
DWORD dwVirtualBytesPeak;
DWORD dwVirtualBytes;
DWORD dwPageFaults;
DWORD dwWorkingSetPeak;
DWORD dwWorkingSet;
DWORD dwUnkown9;
DWORD dwPagedPool;
DWORD dwUnkown10;
DWORD dwNonPagedPool;
DWORD dwPageFileBytesPeak;
DWORD dwPageFileBytes;
DWORD dwPrivateBytes;
DWORD dwUnkown11;
DWORD dwUnkown12;
DWORD dwUnkown13;
DWORD dwUnkown14;
SYSTEM_THREAD_INFO ati[ANYSIZE_ARRAY];
} SYSTEM_PROCESS_INFO;
/* Include conversion functions */
#define xatoi
#define xitoa
#include "ConvFunc.h"
/* NSIS stack structure */
typedef struct _stack_t {
struct _stack_t *next;
char text[1];
} stack_t;
stack_t **g_stacktop;
char *g_variables;
unsigned int g_stringsize;
#define EXDLL_INIT() \
{ \
g_stacktop=stacktop; \
g_variables=variables; \
g_stringsize=string_size; \
}
/* Global variables */
char szBuf[NSIS_MAX_STRLEN];
/* Funtions prototypes and macros */
int FIND_PROC_BY_NAME(char *szProcessName, BOOL bTerminate);
int popinteger();
void pushinteger(int integer);
int popstring(char *str, int len);
void pushstring(const char *str, int len);
/* NSIS functions code */
void __declspec(dllexport) _FindProcess(HWND hwndParent, int string_size,
char *variables, stack_t **stacktop)
{
EXDLL_INIT();
{
int nError;
popstring(szBuf, NSIS_MAX_STRLEN);
nError=FIND_PROC_BY_NAME(szBuf, FALSE);
pushinteger(nError);
}
}
void __declspec(dllexport) _KillProcess(HWND hwndParent, int string_size,
char *variables, stack_t **stacktop)
{
EXDLL_INIT();
{
int nError;
popstring(szBuf, NSIS_MAX_STRLEN);
nError=FIND_PROC_BY_NAME(szBuf, TRUE);
pushinteger(nError);
}
}
void __declspec(dllexport) _Unload(HWND hwndParent, int string_size,
char *variables, stack_t **stacktop)
{
}
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
int FIND_PROC_BY_NAME(char *szProcessName, BOOL bTerminate)
// Find the process "szProcessName" if it is currently running.
// This works for Win95/98/ME and also WinNT/2000/XP.
// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE"
// will both work. If bTerminate is TRUE, then process will be terminated.
//
// Return codes are as follows:
// 0 = Success
// 601 = No permission to terminate process
// 602 = Not all processes terminated successfully
// 603 = Process was not currently running
// 604 = Unable to identify system type
// 605 = Unsupported OS
// 606 = Unable to load NTDLL.DLL
// 607 = Unable to get procedure address from NTDLL.DLL
// 608 = NtQuerySystemInformation failed
// 609 = Unable to load KERNEL32.DLL
// 610 = Unable to get procedure address from KERNEL32.DLL
// 611 = CreateToolhelp32Snapshot failed
//
// Change history:
// created 06/23/2000 - Ravi Kochhar (kochhar@physiology.wisc.edu)
// http://www.neurophys.wisc.edu/ravi/software/
// modified 03/08/2002 - Ravi Kochhar (kochhar@physiology.wisc.edu)
// - Borland-C compatible if BORLANDC is defined as
// suggested by Bob Christensen
// modified 03/10/2002 - Ravi Kochhar (kochhar@physiology.wisc.edu)
// - Removed memory leaks as suggested by
// Jonathan Richard-Brochu (handles to Proc and Snapshot
// were not getting closed properly in some cases)
// modified 14/11/2005 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
// - Combine functions FIND_PROC_BY_NAME and KILL_PROC_BY_NAME
// - Code has been optimized
// - Now kill all processes with specified name (not only one)
// - Cosmetic improvements
// - Removed error 632 (Invalid process name)
// - Changed error 602 (Unable to terminate process for some other reason)
// - BORLANDC define not needed
// modified 04/01/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
// - Removed CRT dependency
// modified 21/04/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
// - Removed memory leak as suggested by {_trueparuex^}
// (handle to hSnapShot was not getting closed properly in some cases)
// modified 21/04/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
// - Removed memory leak as suggested by {_trueparuex^}
// (handle to hSnapShot was not getting closed properly in some cases)
// modified 19/07/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
// - Code for WinNT/2000/XP has been rewritten
// - Changed error codes
// modified 31/08/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
// - Removed memory leak as suggested by Daniel Vanesse
{
char szName[MAX_PATH];
OSVERSIONINFO osvi;
HMODULE hLib;
HANDLE hProc;
ULONG uError;
BOOL bFound=FALSE;
BOOL bSuccess=FALSE;
BOOL bFailed=FALSE;
// First check what version of Windows we're in
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
if (!GetVersionEx(&osvi)) return 604;
if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT &&
osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
return 605;
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// WinNT/2000/XP
SYSTEM_PROCESS_INFO *spi;
SYSTEM_PROCESS_INFO *spiCount;
DWORD dwSize=0x4000;
DWORD dwData;
ULONG (WINAPI *NtQuerySystemInformationPtr)(ULONG, PVOID, LONG, PULONG);
if (hLib=LoadLibraryA("NTDLL.DLL"))
{
NtQuerySystemInformationPtr=(ULONG(WINAPI *)(ULONG, PVOID, LONG, PULONG))GetProcAddress(hLib, "NtQuerySystemInformation");
if (NtQuerySystemInformationPtr)
{
while (1)
{
if (spi=LocalAlloc(LMEM_FIXED, dwSize))
{
uError=(*NtQuerySystemInformationPtr)(SystemProcessInformation, spi, dwSize, &dwData);
if (uError == STATUS_SUCCESS) break;
LocalFree(spi);
if (uError != STATUS_INFO_LENGTH_MISMATCH)
{
uError=608;
break;
}
}
else
{
uError=608;
break;
}
dwSize*=2;
}
}
else uError=607;
FreeLibrary(hLib);
}
else uError=606;
if (uError != STATUS_SUCCESS) return uError;
spiCount=spi;
while (1)
{
if (spiCount->pszProcessName)
{
WideCharToMultiByte(CP_ACP, 0, spiCount->pszProcessName, -1, szName, MAX_PATH, NULL, NULL);
if (!lstrcmpi(szName, szProcessName))
{
// Process found
bFound=TRUE;
if (bTerminate == TRUE)
{
// Open for termination
if (hProc=OpenProcess(PROCESS_TERMINATE, FALSE, spiCount->dwProcessID))
{
if (TerminateProcess(hProc, 0))
bSuccess=TRUE;
else
bFailed=TRUE;
CloseHandle(hProc);
}
}
else break;
}
}
if (spiCount->dwOffset == 0) break;
spiCount=(SYSTEM_PROCESS_INFO *)((char *)spiCount + spiCount->dwOffset);
}
LocalFree(spi);
}
else
{
// Win95/98/ME
PROCESSENTRY32 pe;
char *pName;
HANDLE hSnapShot;
BOOL bResult;
HANDLE (WINAPI *CreateToolhelp32SnapshotPtr)(DWORD, DWORD);
BOOL (WINAPI *Process32FirstPtr)(HANDLE, LPPROCESSENTRY32);
BOOL (WINAPI *Process32NextPtr)(HANDLE, LPPROCESSENTRY32);
if (hLib=LoadLibraryA("KERNEL32.DLL"))
{
CreateToolhelp32SnapshotPtr=(HANDLE(WINAPI *)(DWORD, DWORD)) GetProcAddress(hLib, "CreateToolhelp32Snapshot");
Process32FirstPtr=(BOOL(WINAPI *)(HANDLE, LPPROCESSENTRY32)) GetProcAddress(hLib, "Process32First");
Process32NextPtr=(BOOL(WINAPI *)(HANDLE, LPPROCESSENTRY32)) GetProcAddress(hLib, "Process32Next");
if (CreateToolhelp32SnapshotPtr && Process32NextPtr && Process32FirstPtr)
{
// Get a handle to a Toolhelp snapshot of all the systems processes.
if ((hSnapShot=(*CreateToolhelp32SnapshotPtr)(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
// Get the first process' information.
pe.dwSize=sizeof(PROCESSENTRY32);
bResult=(*Process32FirstPtr)(hSnapShot, &pe);
// While there are processes, keep looping and checking.
while (bResult)
{
//Get file name
for (pName=pe.szExeFile + lstrlen(pe.szExeFile) - 1; *pName != '\\' && *pName != '\0'; --pName);
if (!lstrcmpi(++pName, szProcessName))
{
// Process found
bFound=TRUE;
if (bTerminate == TRUE)
{
// Open for termination
if (hProc=OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID))
{
if (TerminateProcess(hProc, 0))
bSuccess=TRUE;
else
bFailed=TRUE;
CloseHandle(hProc);
}
}
else break;
}
//Keep looking
bResult=(*Process32NextPtr)(hSnapShot, &pe);
}
CloseHandle(hSnapShot);
}
else uError=611;
}
else uError=610;
FreeLibrary(hLib);
}
else uError=609;
}
if (bFound == FALSE) return 603;
if (bTerminate == TRUE)
{
if (bSuccess == FALSE) return 601;
if (bFailed == TRUE) return 602;
}
return 0;
}
int popinteger()
{
char szInt[32];
popstring(szInt, 32);
return xatoi(szInt);
}
void pushinteger(int integer)
{
char szInt[32];
xitoa(integer, szInt, 0);
pushstring(szInt, 32);
}
//Function: Removes the element from the top of the NSIS stack and puts it in the buffer
int popstring(char *str, int len)
{
stack_t *th;
if (!g_stacktop || !*g_stacktop) return 1;
th=(*g_stacktop);
lstrcpyn(str, th->text, len);
*g_stacktop=th->next;
GlobalFree((HGLOBAL)th);
return 0;
}
//Function: Adds an element to the top of the NSIS stack
void pushstring(const char *str, int len)
{
stack_t *th;
if (!g_stacktop) return;
th=(stack_t*)GlobalAlloc(GPTR, sizeof(stack_t) + len);
lstrcpyn(th->text, str, len);
th->next=*g_stacktop;
*g_stacktop=th;
}
|
|
Loading Advertisement... |