// Copyright (C) 2026 SharpEmu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later using System; using System.Threading; using SharpEmu.HLE; namespace SharpEmu.Libs.Np; public static class NpWebApi2Exports { private const int NpWebApi2ErrorInvalidArgument = unchecked((int)0x80553402); private static int _initialized; [SysAbiExport( Nid = "+o9816YQhqQ", ExportName = "sceNpWebApi2Initialize", Target = Generation.Gen4 | Generation.Gen5, LibraryName = "libSceNpWebApi2")] public static int NpWebApi2Initialize(CpuContext ctx) { var httpContextId = unchecked((int)ctx[CpuRegister.Rdi]); var poolSize = ctx[CpuRegister.Rsi]; if (httpContextId <= 0 || poolSize == 0) { return SetReturn(ctx, NpWebApi2ErrorInvalidArgument); } Interlocked.Exchange(ref _initialized, 1); TraceNpWebApi2("init", httpContextId, poolSize); return SetReturn(ctx, 0); } [SysAbiExport( Nid = "bEvXpcEk200", ExportName = "sceNpWebApi2Terminate", Target = Generation.Gen4 | Generation.Gen5, LibraryName = "libSceNpWebApi2")] public static int NpWebApi2Terminate(CpuContext ctx) { var libraryContextId = unchecked((int)ctx[CpuRegister.Rdi]); Interlocked.Exchange(ref _initialized, 0); TraceNpWebApi2("term", libraryContextId, 0); return SetReturn(ctx, 0); } private static int SetReturn(CpuContext ctx, int result) { ctx[CpuRegister.Rax] = unchecked((ulong)result); return result; } private static void TraceNpWebApi2(string operation, int id, ulong arg0) { if (!string.Equals(Environment.GetEnvironmentVariable("SHARPEMU_LOG_NP_WEB_API2"), "1", StringComparison.Ordinal)) { return; } Console.Error.WriteLine( $"[LOADER][TRACE] npwebapi2.{operation} id={id} arg0=0x{arg0:X16} initialized={Volatile.Read(ref _initialized)}"); } }