private static int Free(ServiceCtx context) { long inputPosition = context.Request.GetBufferType0x21().Position; long outputPosition = context.Request.GetBufferType0x22().Position; NvMapFree args = MemoryHelper.Read <NvMapFree>(context.Memory, inputPosition); NvMapHandle map = GetNvMap(context, args.Handle); if (map == null) { Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!"); return(NvResult.InvalidInput); } if (map.DecrementRefCount() <= 0) { DeleteNvMap(context, args.Handle); Logger.PrintInfo(LogClass.ServiceNv, $"Deleted map {args.Handle}!"); args.Address = map.Address; args.Flags = 0; } else { args.Address = 0; args.Flags = FlagNotFreedYet; } args.Size = map.Size; MemoryHelper.Write(context.Memory, outputPosition, args); return(NvResult.Success); }
private static int Free(ServiceCtx Context) { long InputPosition = Context.Request.GetBufferType0x21().Position; long OutputPosition = Context.Request.GetBufferType0x22().Position; NvMapFree Args = AMemoryHelper.Read <NvMapFree>(Context.Memory, InputPosition); NvMapHandle Map = GetNvMap(Context, Args.Handle); if (Map == null) { Context.Device.Log.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{Args.Handle:x8}!"); return(NvResult.InvalidInput); } if (Map.DecrementRefCount() <= 0) { DeleteNvMap(Context, Args.Handle); Context.Device.Log.PrintInfo(LogClass.ServiceNv, $"Deleted map {Args.Handle}!"); Args.Address = Map.Address; Args.Flags = 0; } else { Args.Address = 0; Args.Flags = FlagNotFreedYet; } Args.Size = Map.Size; AMemoryHelper.Write(Context.Memory, OutputPosition, Args); return(NvResult.Success); }