From 13badbb4c0a16deb2058254538c53cc1e6329a1a Mon Sep 17 00:00:00 2001
From: Gliniak <Gliniak93@gmail.com>
Date: Mon, 6 Jan 2025 12:14:29 +0100
Subject: [PATCH] [XAM] Fixed issue with savefile removal via
 XamContentDeleteInternal

Removed all lpunknown_t in xam_content.cc file and replaced with lpvoid_t
---
 src/xenia/kernel/xam/xam_content.cc | 45 ++++++++++++++++++-----------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/src/xenia/kernel/xam/xam_content.cc b/src/xenia/kernel/xam/xam_content.cc
index 57894e072..edaef5619 100644
--- a/src/xenia/kernel/xam/xam_content.cc
+++ b/src/xenia/kernel/xam/xam_content.cc
@@ -74,9 +74,9 @@ DECLARE_XAM_EXPORT2(XamContentGetLicenseMask, kContent, kStub, kHighFrequency);
 
 dword_result_t XamContentResolve_entry(dword_t user_index,
                                        lpvoid_t content_data_ptr,
-                                       lpunknown_t buffer_ptr,
-                                       dword_t buffer_size, dword_t unk1,
-                                       dword_t unk2, dword_t unk3) {
+                                       lpvoid_t buffer_ptr, dword_t buffer_size,
+                                       dword_t unk1, dword_t unk2,
+                                       dword_t unk3) {
   auto content_data = content_data_ptr.as<XCONTENT_DATA*>();
 
   // Result of buffer_ptr is sent to RtlInitAnsiString.
@@ -351,7 +351,7 @@ dword_result_t XamContentOpenFile_entry(dword_t user_index,
 DECLARE_XAM_EXPORT1(XamContentOpenFile, kContent, kStub);
 
 dword_result_t XamContentFlush_entry(lpstring_t root_name,
-                                     lpunknown_t overlapped_ptr) {
+                                     lpvoid_t overlapped_ptr) {
   X_RESULT result = X_ERROR_SUCCESS;
   if (overlapped_ptr) {
     kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);
@@ -363,7 +363,7 @@ dword_result_t XamContentFlush_entry(lpstring_t root_name,
 DECLARE_XAM_EXPORT1(XamContentFlush, kContent, kStub);
 
 dword_result_t XamContentClose_entry(lpstring_t root_name,
-                                     lpunknown_t overlapped_ptr) {
+                                     lpvoid_t overlapped_ptr) {
   // Closes a previously opened root from XamContentCreate*.
   auto result =
       kernel_state()->content_manager()->CloseContent(root_name.value());
@@ -381,7 +381,7 @@ dword_result_t XamContentGetCreator_entry(dword_t user_index,
                                           lpvoid_t content_data_ptr,
                                           lpdword_t is_creator_ptr,
                                           lpqword_t creator_xuid_ptr,
-                                          lpunknown_t overlapped_ptr) {
+                                          lpvoid_t overlapped_ptr) {
   if (!is_creator_ptr) {
     return X_ERROR_INVALID_PARAMETER;
   }
@@ -449,7 +449,7 @@ dword_result_t XamContentGetThumbnail_entry(dword_t user_index,
                                             lpvoid_t content_data_ptr,
                                             lpvoid_t buffer_ptr,
                                             lpdword_t buffer_size_ptr,
-                                            lpunknown_t overlapped_ptr) {
+                                            lpvoid_t overlapped_ptr) {
   const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index);
 
   if (!user) {
@@ -494,7 +494,7 @@ dword_result_t XamContentSetThumbnail_entry(dword_t user_index,
                                             lpvoid_t content_data_ptr,
                                             lpvoid_t buffer_ptr,
                                             dword_t buffer_size,
-                                            lpunknown_t overlapped_ptr) {
+                                            lpvoid_t overlapped_ptr) {
   const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index);
 
   if (!user) {
@@ -518,10 +518,15 @@ dword_result_t XamContentSetThumbnail_entry(dword_t user_index,
 }
 DECLARE_XAM_EXPORT1(XamContentSetThumbnail, kContent, kImplemented);
 
-dword_result_t XamContentDelete_entry(dword_t user_index,
-                                      lpvoid_t content_data_ptr,
-                                      lpunknown_t overlapped_ptr) {
+dword_result_t xeXamContentDelete(dword_t user_index, lpvoid_t content_data_ptr,
+                                  dword_t content_data_size,
+                                  lpvoid_t overlapped_ptr) {
   uint64_t xuid = 0;
+  XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();
+  if (content_data_size == sizeof(XCONTENT_AGGREGATE_DATA)) {
+    content_data = *content_data_ptr.as<XCONTENT_AGGREGATE_DATA*>();
+  }
+
   if (user_index != XUserIndexNone) {
     const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index);
 
@@ -532,8 +537,6 @@ dword_result_t XamContentDelete_entry(dword_t user_index,
     xuid = user->xuid();
   }
 
-  XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();
-
   auto result =
       kernel_state()->content_manager()->DeleteContent(xuid, content_data);
 
@@ -544,14 +547,22 @@ dword_result_t XamContentDelete_entry(dword_t user_index,
     return result;
   }
 }
+
+dword_result_t XamContentDelete_entry(dword_t user_index,
+                                      lpvoid_t content_data_ptr,
+                                      lpvoid_t overlapped_ptr) {
+  return xeXamContentDelete(user_index, content_data_ptr, sizeof(XCONTENT_DATA),
+                            overlapped_ptr);
+}
 DECLARE_XAM_EXPORT1(XamContentDelete, kContent, kImplemented);
 
 dword_result_t XamContentDeleteInternal_entry(lpvoid_t content_data_ptr,
-                                              lpunknown_t overlapped_ptr) {
+                                              lpvoid_t overlapped_ptr) {
   // INFO: Analysis of xam.xex shows that "internal" functions are wrappers with
-  // 0xFE as user_index
-  return XamContentDelete_entry(XUserIndexNone, content_data_ptr,
-                                overlapped_ptr);
+  // 0xFE as user_index.
+  // In XAM content size is set to 0x200.
+  return xeXamContentDelete(XUserIndexNone, content_data_ptr,
+                            sizeof(XCONTENT_AGGREGATE_DATA), overlapped_ptr);
 }
 DECLARE_XAM_EXPORT1(XamContentDeleteInternal, kContent, kImplemented);