Example #1
0
int rt_thread_kill(rt_thread_t tid, int sig)
{
    siginfo_t si;
	rt_base_t level;
	struct siginfo_node *si_node;

    RT_ASSERT(tid != RT_NULL);
    if (!sig_valid(sig)) return -RT_EINVAL;

    dbg_log(DBG_INFO, "send signal: %d\n", sig);
    si.si_errno = RT_EINTR;
    si.si_signo = sig;
    si.si_code  = SI_USER;
    si.si_value.sival_ptr = RT_NULL;

	level = rt_hw_interrupt_disable();
    if (tid->sig_pending & sig_mask(sig))
    {
        /* whether already emits this signal? */
        struct rt_slist_node *node;
        struct siginfo_node  *entry;

		node = (struct rt_slist_node *)tid->si_list;
		rt_hw_interrupt_enable(level);

		/* update sig infor */
		rt_enter_critical();
        for (; (node) != RT_NULL; node = node->next)
        {
            entry = rt_slist_entry(node, struct siginfo_node, list);
            if (entry->si.si_signo == sig)
            {
                memcpy(&(entry->si), &si, sizeof(siginfo_t));
				rt_exit_critical();
                return 0;
            }
        }
		rt_exit_critical();

		/* disable interrupt to protect tcb */
		level = rt_hw_interrupt_disable();
    }
	else
	{
Example #2
0
void rt_signal_unmask(int signo)
{
    rt_base_t level;
    rt_thread_t tid = rt_thread_self();

    level = rt_hw_interrupt_disable();

    tid->sig_mask |= sig_mask(signo);

    /* let thread handle pended signals */
    if (tid->sig_mask & tid->sig_pending)
    {
        rt_hw_interrupt_enable(level);
        _signal_deliver(tid);
    }
    else 
    {
        rt_hw_interrupt_enable(level);
    }
}
Example #3
0
void QueryCvarProvider::InitCookie()
{
	if (m_engine_cvar_cookie) return;

	DebugMessage("Trying to get g_iQueryCvarCookie ...");

	basic_string modulename("engine");

#ifdef GNUC
	if (SourceSdk::InterfacesProxy::m_game != SourceSdk::CounterStrikeGlobalOffensive)
	{
		modulename.append("_srv");
	}
#endif

#ifdef WIN32
	modulename.append(".dll");

	HMODULE engine_module_handle(GetModuleHandleA(modulename.c_str()));

	mem_byte * pstart(nullptr);
	mem_byte * pend(nullptr);
	if (engine_module_handle != NULL)
	{
		MODULEINFO modinfo;

		K32GetModuleInformation(GetCurrentProcess(), engine_module_handle, &modinfo, sizeof(MODULEINFO));

		pstart = (mem_byte*)modinfo.lpBaseOfDll;
		pend = pstart + 0x44A400;

		mem_byte *sig_code(nullptr);
		mem_byte * sig_mask(nullptr);
		size_t sig_size(0);
		size_t sig_off(0);

		if (SourceSdk::InterfacesProxy::m_game == SourceSdk::CounterStrikeGlobalOffensive)
		{
			sig_code = new mem_byte[156]
			{
				0x55, 0x8B, 0xEC, 0x83,
				0xE4, 0xF8, 0x83, 0xEC,
				0x3C, 0x56, 0x8B, 0x75,
				0x08, 0x2B, 0x35, 0xD4,
				0x12, 0x7B, 0x10, 0xC1,
				0xFE, 0x04, 0x83, 0xFE,
				0x01, 0x7C, 0x08, 0x3B,
				0x35, 0x98, 0x11, 0x7B,
				0x10, 0x7E, 0x0D, 0x68,
				0xB0, 0x39, 0x4A, 0x10,
				0xE8, 0x63, 0x0B, 0x06,
				0x00, 0x83, 0xC4, 0x04,
				0xA1, 0x8C, 0x11, 0x7B,
				0x10, 0x8D, 0x4C, 0x24,
				0x08, 0x8B, 0x74, 0xB0,
				0xFC, 0x8D, 0x46, 0x04,
				0xF7, 0xDE, 0x1B, 0xF6,
				0x23, 0xF0, 0xE8, 0x15,
				0x4F, 0xEF, 0xFF, 0xA1,
				0x38, 0xCE, 0x52, 0x10,
				0x8B, 0xC8, 0xFF, 0x75,
				0x0C, 0x83, 0x4C, 0x24,
				0x24, 0x01, 0x40, 0x89,
				0x4C, 0x24, 0x1C, 0x8D,
				0x4C, 0x24, 0x10, 0xA3,
				0x38, 0xCE, 0x52, 0x10,
				0xE8, 0x53, 0x5F, 0xFF,
				0xFF, 0x8B, 0x06, 0x8D,
				0x4C, 0x24, 0x08, 0x83,
				0x4C, 0x24, 0x20, 0x01,
				0xF7, 0x5C, 0x24, 0x18,
				0x6A, 0x00, 0x6A, 0x00,
				0x51, 0x8B, 0xCE, 0xFF,
				0x50, 0x7C, 0x8B, 0x74,
				0x24, 0x18, 0x8D, 0x4C,
				0x24, 0x08, 0xE8, 0x5D,
				0x18, 0xEF, 0xFF, 0x8B,
				0xC6, 0x5E, 0x8B, 0xE5,
				0x5D, 0xC2, 0x08, 0x00
			};

			sig_mask = new mem_byte[156]
			{
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF
			};

			sig_off = 0x4C;
			sig_size = 156;
		}
		else
		{
			sig_code = new mem_byte[105]
			{
				0x55, 0x8B, 0xEC, 0x81,
				0xEC, 0x18, 0x01, 0x00,
				0x00, 0xA1, 0x7C, 0x2A, //T
				0x3C, 0x10, 0x8B, 0xC8,
				0x40, 0xC6, 0x85, 0xEC,
				0xFE, 0xFF, 0xFF, 0x01,
				0x80, 0x7D, 0x10, 0x00,
				0xA3, 0x7C, 0x2A, 0x3C, //T
				0x10, 0x8B, 0x45, 0x0C,
				0xC7, 0x85, 0xF0, 0xFE,
				0xFF, 0xFF, 0x00, 0x00,
				0x00, 0x00, 0xC7, 0x85,
				0xE8, 0xFE, 0xFF, 0xFF,
				0x60, 0x51, 0x2F, 0x10,
				0x89, 0x8D, 0xF8, 0xFE,
				0xFF, 0xFF, 0x89, 0x85,
				0xFC, 0xFE, 0xFF, 0xFF,
				0x75, 0x08, 0xF7, 0xD9,
				0x89, 0x8D, 0xF8, 0xFE,
				0xFF, 0xFF, 0x8B, 0x4D,
				0x08, 0x8D, 0x95, 0xE8,
				0xFE, 0xFF, 0xFF, 0x6A,
				0x00, 0x52, 0x8B, 0x01,
				0xFF, 0x50, 0x74, 0x8B,
				0x85, 0xF8, 0xFE, 0xFF,
				0xFF, 0x8B, 0xE5, 0x5D,
				0xC3
			};

			sig_mask = new mem_byte[105]
			{
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00, //T
				0x00, 0x00, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00, //T
				0x00, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF
			};

			sig_off = 0xA;
			sig_size = 105;
		}

		sig_ctx ctx(sig_code, sig_mask, sig_size, sig_off);

#else
	modulename.append(".so");

	basic_string relpath(Helpers::format("./bin/%s", modulename.c_str()));

	void ** modinfo = (void **)dlopen(relpath.c_str(), RTLD_NOW | RTLD_NOLOAD);
	void * engine_module_handle = nullptr;
	if (modinfo != NULL)
	{

		//mm_module_handle = dlsym(modinfo, ".init_proc");
		// FIXME : Use link_map to get memory bounds of the module
		engine_module_handle = *modinfo;
		dlclose(modinfo);
	}
	if (engine_module_handle)
	{
		mem_byte * pstart = (mem_byte*)engine_module_handle;
		mem_byte * pend = pstart + 0x44A400;
		mem_byte *sig_code(nullptr);
		mem_byte * sig_mask(nullptr);
		size_t sig_size(0);
		size_t sig_off(0);

		if (SourceSdk::InterfacesProxy::m_game == SourceSdk::CounterStrikeGlobalOffensive)
		{
			sig_code = new mem_byte[234]
			{
				0x55, 0x89, 0xE5, 0x57,
				0x56, 0x8D, 0x75, 0xC4,
				0x53, 0x83, 0xEC, 0x5C,
				0xC7, 0x45, 0xC0, 0x68,
				0x8A, 0x54, 0x00, 0x0F,
				0xB6, 0x45, 0x10, 0x89,
				0x34, 0x24, 0x8B, 0x7D,
				0x0C, 0x88, 0x45, 0xB7,
				0xE8, 0x0B, 0x4B, 0xF6,
				0xFF, 0x8B, 0x15, 0x38, //T
				0xD5, 0x72, 0x00, 0xC6, //T
				0x45, 0xDC, 0x01, 0x8B,
				0x5D, 0xCC, 0xC7, 0x45,
				0xC0, 0x88, 0x91, 0x54,
				0x00, 0xC7, 0x45, 0xC4,
				0xCC, 0x91, 0x54, 0x00,
				0xC7, 0x45, 0xE0, 0x9C,
				0x4C, 0x7E, 0x00, 0x8D,
				0x42, 0x01, 0x89, 0x55,
				0xD0, 0xA3, 0x38, 0xD5,
				0x72, 0x00, 0x8B, 0x45,
				0xD8, 0x83, 0xC8, 0x03,
				0x81, 0xFB, 0x00, 0x47,
				0x7E, 0x00, 0x89, 0x45,
				0xD8, 0x0F, 0x84, 0x89,
				0x00, 0x00, 0x00, 0x89,
				0x3C, 0x24, 0xE8, 0x75,
				0xC9, 0x62, 0x00, 0x89,
				0x1C, 0x24, 0x8D, 0x5D,
				0xC0, 0x89, 0x44, 0x24,
				0x08, 0x89, 0x7C, 0x24,
				0x04, 0xE8, 0x42, 0x39,
				0x36, 0x00, 0x80, 0x7D,
				0xB7, 0x00, 0x75, 0x0C,
				0x8B, 0x45, 0xD0, 0x83,
				0x4D, 0xD8, 0x01, 0xF7,
				0xD8, 0x89, 0x45, 0xD0,
				0x8B, 0x55, 0x08, 0x8D,
				0x5D, 0xC0, 0x8B, 0x02,
				0xC7, 0x44, 0x24, 0x0C,
				0x00, 0x00, 0x00, 0x00,
				0xC7, 0x44, 0x24, 0x08,
				0x00, 0x00, 0x00, 0x00,
				0x89, 0x5C, 0x24, 0x04,
				0x89, 0x14, 0x24, 0xFF,
				0x90, 0x80, 0x00, 0x00,
				0x00, 0x8B, 0x55, 0xE0,
				0xC7, 0x45, 0xC0, 0x88,
				0x91, 0x54, 0x00, 0x8B,
				0x5D, 0xD0, 0xC7, 0x45,
				0xC4, 0xCC, 0x91, 0x54,
				0x00, 0x8D, 0x4A, 0xF4,
				0x81, 0xF9, 0x90, 0x4C,
				0x7E, 0x00, 0x75, 0x37,
				0x89, 0x34, 0x24, 0xE8,
				0x40, 0x4B, 0xF6, 0xFF,
				0x83, 0xC4, 0x5C, 0x89,
				0xD8, 0x5B, 0x5E, 0x5F,
				0x5D, 0xC3
			};

			sig_mask = new mem_byte[234]
			{
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0x00, //T
				0x00, 0x00, 0x00, 0xFF, //T
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00,
				0x00, 0x00, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00,
				0x00, 0x00, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00,
				0x00, 0x00, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00,
				0x00, 0x00, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0x00, 0x00, 0x00, 0x00,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF
			};

			sig_off = 39;
			sig_size = 234;
		}
		else
		{
			sig_code = new mem_byte[116]
			{
				0x55, 0x89, 0xE5, 0x81,
				0xEC, 0x38, 0x01, 0x00,
				0x00, 0xA1, 0x70, 0xBF, //T
				0x2C, 0x00, 0xC6, 0x85,
				0xDC, 0xFE, 0xFF, 0xFF,
				0x01, 0xC7, 0x85, 0xE0,
				0xFE, 0xFF, 0xFF, 0x00,
				0x00, 0x00, 0x00, 0x80,
				0x7D, 0x10, 0x00, 0xC7,
				0x85, 0xD8, 0xFE, 0xFF,
				0xFF, 0x68, 0x2E, 0x23,
				0x00, 0x8B, 0x55, 0x08,
				0x8D, 0x48, 0x01, 0x89,
				0x85, 0xE8, 0xFE, 0xFF,
				0xFF, 0x89, 0x0D, 0x70, //T
				0xBF, 0x2C, 0x00, 0x8B,
				0x4D, 0x0C, 0x89, 0x8D,
				0xEC, 0xFE, 0xFF, 0xFF,
				0x75, 0x08, 0xF7, 0xD8,
				0x89, 0x85, 0xE8, 0xFE,
				0xFF, 0xFF, 0x8B, 0x02,
				0x8D, 0x8D, 0xD8, 0xFE,
				0xFF, 0xFF, 0xC7, 0x44,
				0x24, 0x08, 0x00, 0x00,
				0x00, 0x00, 0x89, 0x4C,
				0x24, 0x04, 0x89, 0x14,
				0x24, 0xFF, 0x50, 0x78,
				0x8B, 0x85, 0xE8, 0xFE,
				0xFF, 0xFF, 0xC9, 0xC3
			};

			sig_mask = new mem_byte[116]
			{
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0x00, 0x00, //T
				0x00, 0x00, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0x00, 0x00, 0x00,
				0x00, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0x00, //T
				0x00, 0x00, 0x00, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
				0xFF, 0xFF, 0xFF, 0xFF,
			};

			sig_off = 0xA;
			sig_size = 116;
		}

		sig_ctx ctx(sig_code, sig_mask, sig_size, sig_off);

#endif

		ScanMemoryRegion(pstart, pend, &ctx);

		if (ctx.m_out != nullptr)
		{
			m_engine_cvar_cookie = reinterpret_cast<SourceSdk::QueryCvarCookie_t *>(*(reinterpret_cast<size_t**>(ctx.m_out)));

			if (m_engine_cvar_cookie != nullptr)
			{
				DebugMessage(Helpers::format("g_iQueryCvarCookie = %d", *m_engine_cvar_cookie));
			}
			else
			{
				g_Logger.Msg<MSG_ERROR>("Failed to get g_iQueryCvarCookie.");
			}
		}
		else
		{
			g_Logger.Msg<MSG_ERROR>("Sigscan failed for g_iQueryCvarCookie.");
		}

		if (sig_mask)
			delete[] sig_mask;
		if (sig_code)
			delete[] sig_code;
	}
	else
	{
		DebugMessage("engine module not found.");
	}
	}

void QueryCvarProvider::FixQueryCvarCookie()
{
	if (m_engine_cvar_cookie)
	{
		if (*m_engine_cvar_cookie < 1 || *m_engine_cvar_cookie == std::numeric_limits<SourceSdk::QueryCvarCookie_t>::max())
		{
			*m_engine_cvar_cookie = 1;
		}
	}
}

SourceSdk::QueryCvarCookie_t QueryCvarProvider::StartQueryCvarValue(SourceSdk::edict_t * pEntity, const char * pName)
{
	FixQueryCvarCookie();
	return SourceSdk::InterfacesProxy::GetServerPluginHelpers()->StartQueryCvarValue(pEntity, pName);
}