Exemplo n.º 1
0
PS4ResolveStatus ps4Resolve(void *function) // FIXME: thread save
{
	PS4ResolveStatus s = PS4ResolveStatusFunctionResolveError;
	PS4ResolveHandler t = NULL;
	unsigned char *b = (unsigned char *)function;

	char *moduleName = *(char **)(b + 30); // alter if resolve changes
	char *symbolName = *(char **)(b + 40);
	int *module = (int *)(*(int **)(b + 50));
	void **symbol = (void **)(*(void ***)(b + 60));

	// check arbitrary bytes
	if(*(b + 13) != 0x49 || *(b + 14) != 0x93)
		return s;

	t = ps4ResolveSetPostHandler(ps4ResolvePostIntercept);
	s = ps4ResolveModuleAndSymbol(moduleName, symbolName, module, symbol);
	ps4ResolveSetPostHandler(t);

	if(t == NULL)
		return s;
	else if((s = ps4ResolveCallHandler(ps4ResolvePostHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusInterceptContinue)) != PS4ResolveStatusInterceptContinue)
		return s;

	return PS4ResolveStatusSuccess;
}
Exemplo n.º 2
0
PS4ResolveStatus ps4ResolveModuleAndSymbol(char *moduleName, char *symbolName, int64_t *module, void **symbol)
{
	static int (*lsm)(const char *name, size_t argc, const void *argv, unsigned int flags, int a, int b) = NULL;
	int stat;

	if((stat = ps4ResolveCallHandler(ps4ResolvePreHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusInterceptContinue)) != PS4ResolveStatusInterceptContinue)
		return stat;

	if(module == NULL || symbol == NULL || moduleName == NULL || symbolName == NULL)
		if((stat = ps4ResolveCallHandler(ps4ResolveErrorHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusArgumentError)) != PS4ResolveStatusInterceptContinue)
			return stat;

	if(*module <= 0)
	{
		if(!lsm)
		{
			int64_t k = 0;
			ps4ResolveSyscall(594, "libkernel.sprx", 0, &k, 0);
			if(k <= 0)
				if((stat = ps4ResolveCallHandler(ps4ResolveErrorHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusKernelLoadError)) != PS4ResolveStatusInterceptContinue)
					return stat;
			if(ps4ResolveSyscall(591, k, "sceKernelLoadStartModule", (void **)&lsm) != 0)
				if((stat = ps4ResolveCallHandler(ps4ResolveErrorHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusLSMResolveError)) != PS4ResolveStatusInterceptContinue)
					return stat;
		}
		*module = lsm(moduleName, 0, NULL, 0, 0, 0);
		if(*module <= 0)
			if((stat = ps4ResolveCallHandler(ps4ResolveErrorHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusModuleLoadError)) != PS4ResolveStatusInterceptContinue)
				return stat;
	}

	if(ps4ResolveSyscall(591, *module, symbolName, symbol) != 0)
		if((stat = ps4ResolveCallHandler(ps4ResolveErrorHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusFunctionResolveError)) != PS4ResolveStatusInterceptContinue)
			return stat;

	if((stat = ps4ResolveCallHandler(ps4ResolvePostHandler, moduleName, symbolName, module, symbol, PS4ResolveStatusInterceptContinue)) != PS4ResolveStatusInterceptContinue)
		return stat;

	return PS4ResolveStatusSuccess;
}