[ create a new paste ] login | about

Link: http://codepad.org/KaZEgAA8    [ raw code | fork ]

C++, pasted on Jul 3:
#undef _UNICODE

#pragma comment (lib, "tier0.lib")
#pragma comment (lib, "tier1.lib")
#pragma comment (lib, "vstdlib.lib")
#pragma comment (linker, "/NODEFAULTLIB:libcmt")

#define CLIENT_DLL
//#define GMOD_BETA

//String stuff
#include <string>
#include <sstream>

//Lua module interface
#include "gmod/GMLuaModule.h"
#include <windows.h>
#include <TlHelp32.h>
#include <psapi.h>
#include <tchar.h>
#include <iostream>
#include <cstdlib>
#include "dbg.h"
#include "color.h"
#define PROCESS_METAID 2355
GMOD_MODULE( Open, Close );
LUA_FUNCTION(process_getall){
	BOOL            working = 0;
	PROCESSENTRY32  lppe = {0};
	DWORD           targetPid = 0;
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(hSnapshot) {
		ILuaObject* ret=Lua()->GetNewTable();
		lppe.dwSize = sizeof(lppe);
		working=Process32First(hSnapshot, &lppe);
		int i=0;
		while(working) {
			i++;
			ILuaObject* proc=Lua()->GetNewTable();
			proc->SetMember("exefile",lppe.szExeFile);
			proc->SetMember("usage",(float)lppe.cntUsage);
			proc->SetMember("threads",(float)lppe.cntThreads);
			proc->SetMember("size",(float)lppe.dwSize);
			proc->SetMember("pid",(float)lppe.th32ProcessID);
			proc->SetMember("parentpid",(float)lppe.th32ParentProcessID);
			proc->SetMember("threads",(float)lppe.cntThreads);
			proc->SetMember("moduleid",(float)lppe.th32ModuleID);
			proc->SetMember("flags",(float)lppe.dwFlags);
			proc->SetMember("heapid",(float)lppe.th32DefaultHeapID);
			proc->SetMember("threadpriority",(float)lppe.pcPriClassBase);
			ret->SetMember(i,proc);
			working = Process32Next(hSnapshot, &lppe);
		}
		Lua()->Push(ret);
		CloseHandle(hSnapshot);
		return 1;
	}else{
		return 0;
	}
	return 0;
}

LUA_FUNCTION(process_getbypid){
	int pid=Lua()->GetInteger(1);
	HANDLE proc=OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);
	if(proc){
		ILuaObject* PROCESS_META=Lua()->GetMetaTable("Process", PROCESS_METAID);
		Lua()->PushUserData(PROCESS_META, proc);
		PROCESS_META->UnReference();
		return 1;
	}
	return 0;
}
LUA_FUNCTION(process_kill){
	Lua()->CheckType(1, PROCESS_METAID);
	int exitcode=Lua()->GetType(2)==GLua::TYPE_NUMBER ? Lua()->GetNumber(2) : 0;
	HANDLE* handle=static_cast<HANDLE*>(Lua()->GetUserData(1));
	Lua()->Push(TerminateProcess(handle, exitcode)!=0);
	return 1;
}
LUA_FUNCTION(process_getpath){
	Lua()->CheckType(1, PROCESS_METAID);
	int exitcode=Lua()->GetType(2)==GLua::TYPE_NUMBER ? Lua()->GetNumber(2) : 0;
	HANDLE* handle=static_cast<HANDLE*>(Lua()->GetUserData(1));
	LPSTR Buffer;
	if(GetModuleFileNameEx(handle, 0, Buffer, MAX_PATH)){
		Lua()->Push(reinterpret_cast<char*>(Buffer));
		return 1;
	}
	return 0;
}
LUA_FUNCTION(process_getmeminfo){
	Lua()->CheckType(1, PROCESS_METAID);
	int exitcode=Lua()->GetType(2)==GLua::TYPE_NUMBER ? Lua()->GetNumber(2) : 0;
	HANDLE* handle=static_cast<HANDLE*>(Lua()->GetUserData(1));
	PROCESS_MEMORY_COUNTERS pmc;
	if(GetProcessMemoryInfo(handle, &pmc, sizeof(pmc))){
		ILuaObject* ret=Lua()->GetNewTable();
		ret->SetMember("PageFaultCount",(float)pmc.PageFaultCount);
		ret->SetMember("PeakWorkingSetSize",(float)pmc.PeakWorkingSetSize);
		ret->SetMember("WorkingSetSize",(float)pmc.WorkingSetSize);
		ret->SetMember("QuotaNonPagedPoolUsage",(float)pmc.QuotaNonPagedPoolUsage);
		ret->SetMember("QuotaPeakPagedPoolUsage",(float)pmc.QuotaPeakPagedPoolUsage);
		ret->SetMember("QuotaPagedPoolUsage",(float)pmc.QuotaPagedPoolUsage);
		ret->SetMember("QuotaPeakNonPagedPoolUsage",(float)pmc.QuotaPeakNonPagedPoolUsage);
		ret->SetMember("PagefileUsage",(float)pmc.PagefileUsage);
		ret->SetMember("PeakPagefileUsage",(float)pmc.PeakPagefileUsage);
		Lua()->Push(ret);
		return 1;
	}
	return 0;
}
LUA_FUNCTION(process_getmodinfo){
	Lua()->CheckType(1, PROCESS_METAID);
	int exitcode=Lua()->GetType(2)==GLua::TYPE_NUMBER ? Lua()->GetNumber(2) : 0;
	HANDLE* handle=static_cast<HANDLE*>(Lua()->GetUserData(1));
	HMODULE modules[1024];
	DWORD cbNeeded;
	if(EnumProcessModules(handle, modules, sizeof(modules), &cbNeeded)){
		ILuaObject* ret=Lua()->GetNewTable();
		for ( int i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ){
			TCHAR Buffer[MAX_PATH];
			if(GetModuleFileNameEx(handle, modules[i], Buffer, sizeof(Buffer)/sizeof(TCHAR))){
				ret->SetMember(i+1,reinterpret_cast<char*>(Buffer));
			}
		}
		Lua()->Push(ret);
		return 1;
	}
	return 0;
}
LUA_FUNCTION(process_getname){
	Lua()->CheckType(1, PROCESS_METAID);
	int exitcode=Lua()->GetType(2)==GLua::TYPE_NUMBER ? Lua()->GetNumber(2) : 0;
	HANDLE* handle=static_cast<HANDLE*>(Lua()->GetUserData(1));
	LPSTR Buffer;
	if(GetModuleBaseName(handle, 0, Buffer, MAX_PATH)){
		Lua()->Push(reinterpret_cast<char*>(Buffer));
		return 1;
	}
	return 0;
}
LUA_FUNCTION(process_gc){
	Lua()->CheckType(1, PROCESS_METAID);
	int exitcode=Lua()->GetType(2)==GLua::TYPE_NUMBER ? Lua()->GetNumber(2) : 0;
	HANDLE* handle=static_cast<HANDLE*>(Lua()->GetUserData(1));
	CloseHandle(handle);
	return 0;
}
int Open(lua_State *L) {
	
	Color Blue( 0, 162, 232, 255 );
	Color White ( 255, 255, 255, 255 );
	HANDLE hToken;
	LUID sedebugnameValue;
	TOKEN_PRIVILEGES tkp;
	
	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
		ConColorMsg(Blue, "gm_process");
		ConColorMsg( White, ": Couldn't get process token! Not running as administrator?\n" );
		return 0;
	}
	
	if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
		ConColorMsg(Blue, "gm_process");
		ConColorMsg( White, ": Couldn't get privilege value! Not running as administrator?\n" );
		CloseHandle(hToken);
		return 0;
	}
	tkp.PrivilegeCount = 1;
	tkp.Privileges[0].Luid = sedebugnameValue;
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL)) {
		ConColorMsg(Blue, "gm_process");
		ConColorMsg( White, ": Couldn't adjust token privileges! Not running as administrator?\n" );
		CloseHandle(hToken);
		return 0;
	}
	Lua()->NewGlobalTable("process");
	ILuaObject* obj=Lua()->GetGlobal("process");
		obj->SetMember("GetAll",process_getall);
		obj->SetMember("GetByPID",process_getbypid);
		
	ILuaObject* PROCESS_META=Lua()->GetMetaTable("Process",PROCESS_METAID);
		PROCESS_META->SetMember("Kill",process_kill);
		PROCESS_META->SetMember("GetPath",process_getpath);
		PROCESS_META->SetMember("GetName",process_getname);
		PROCESS_META->SetMember("GetMemoryInfo",process_getmeminfo);
		PROCESS_META->SetMember("GetModuleInfo",process_getmodinfo);
		PROCESS_META->SetMember("Close",process_gc);
		PROCESS_META->SetMember("__gc",process_gc);
		
		PROCESS_META->SetMember("__index",PROCESS_META);
	ConColorMsg( Blue, "gm_process" );
	ConColorMsg( White, ": Loaded!\n" );

	return 0;
}

int Close(lua_State *L) {
	return 0;
}


Create a new paste based on this one


Comments: