private void tSearchButton_Click(object sender, EventArgs e) { if (pid == 0) { SetStatus("No Process Selected"); return; } var pm = ps4.GetProcessMaps(pid); if (pm.FindEntry("(NoName)clienthandler") == null) { SetStatus("RPC Stub Not Found"); return; } titleIdTextBox.Text = titleIdTextBox.Text.ToUpper().Replace("-", "").Replace(" ", ""); if (titleIdTextBox.Text.Length != 9) { SetStatus("Invalid Title"); return; } var dirNameAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024); var paramAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataParam)) * 1024); var titleidAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataTitleId))); SceSaveDataTitleId titleid = new SceSaveDataTitleId { data = titleIdTextBox.Text }; SceSaveDataDirNameSearchCond searchCond = new SceSaveDataDirNameSearchCond { userId = GetUser(), titleId = titleidAddr }; SceSaveDataDirNameSearchResult searchResult = new SceSaveDataDirNameSearchResult { dirNames = dirNameAddr, dirNamesNum = 1024, param = paramAddr, }; ps4.WriteMemory(pid, titleidAddr, titleid); tDirsComboBox.DataSource = Find(searchCond, searchResult); ps4.FreeMemory(pid, dirNameAddr, Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024); ps4.FreeMemory(pid, paramAddr, Marshal.SizeOf(typeof(SceSaveDataParam)) * 1024); ps4.FreeMemory(pid, titleidAddr, Marshal.SizeOf(typeof(SceSaveDataTitleId))); if (tDirsComboBox.Items.Count > 0) { SetStatus($"Found {tDirsComboBox.Items.Count} Save Directories :D"); } else { SetStatus("Found 0 Save Directories :("); } }
private void searchButton_Click(object sender, EventArgs e) { if (!ps4.IsConnected) { SetStatus("Not connected to ps4"); return; } if (pid == 0) { SetStatus("dont forget to click setup"); return; } if (selectedGame == null) { SetStatus("No game selected"); return; } var pm = ps4.GetProcessMaps(pid); if (pm.FindEntry("(NoName)clienthandler") == null) { SetStatus("RPC Stub Not Found"); return; } var dirNameAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024 + 0x10 + Marshal.SizeOf(typeof(SceSaveDataParam)) * 1024); var titleIdAddr = dirNameAddr + (uint)Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024; var paramAddr = titleIdAddr + 0x10; SceSaveDataDirNameSearchCond searchCond = new SceSaveDataDirNameSearchCond { userId = GetUser(), titleId = titleIdAddr }; SceSaveDataDirNameSearchResult searchResult = new SceSaveDataDirNameSearchResult { dirNames = dirNameAddr, dirNamesNum = 1024, param = paramAddr, }; ps4.WriteMemory(pid, titleIdAddr, selectedGame); dirsComboBox.DataSource = Find(searchCond, searchResult); ps4.FreeMemory(pid, dirNameAddr, Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024 + 0x10 + Marshal.SizeOf(typeof(SceSaveDataParam)) * 1024); if (dirsComboBox.Items.Count > 0) { SetStatus($"Found {dirsComboBox.Items.Count} Save Directories :D"); dirsComboBox.Enabled = true; mountButton.Enabled = true; } else { SetStatus("Found 0 Save Directories :("); } }
private void searchButton_Click(object sender, EventArgs e) { if (pid == 0) { SetStatus("No Process Selected"); return; } var pm = ps4.GetProcessMaps(pid); if (pm.FindEntry("(NoName)clienthandler") == null) { SetStatus("RPC Stub Not Found"); return; } var dirNameAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024); var paramAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataParam)) * 1024); SceSaveDataDirNameSearchCond searchCond = new SceSaveDataDirNameSearchCond { userId = GetUser() }; SceSaveDataDirNameSearchResult searchResult = new SceSaveDataDirNameSearchResult { dirNames = dirNameAddr, dirNamesNum = 1024, param = paramAddr, }; dirsComboBox.DataSource = Find(searchCond, searchResult); ps4.FreeMemory(pid, dirNameAddr, Marshal.SizeOf(typeof(SceSaveDataDirName)) * 1024); ps4.FreeMemory(pid, paramAddr, Marshal.SizeOf(typeof(SceSaveDataParam)) * 1024); if (dirsComboBox.Items.Count > 0) { SetStatus($"Found {dirsComboBox.Items.Count} Save Directories :D"); } else { SetStatus("Found 0 Save Directories :("); } }
private SearchEntry[] Find(SceSaveDataDirNameSearchCond searchCond, SceSaveDataDirNameSearchResult searchResult) { var searchCondAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond)) + Marshal.SizeOf(typeof(SceSaveDataDirNameSearchResult))); var searchResultAddr = searchCondAddr + (uint)Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond)); ps4.WriteMemory(pid, searchCondAddr, searchCond); ps4.WriteMemory(pid, searchResultAddr, searchResult); var ret = ps4.Call(pid, stub, libSceSaveDataBase + offsets.sceSaveDataDirNameSearch, searchCondAddr, searchResultAddr); WriteLog($"sceSaveDataDirNameSearch ret = 0x{ret:X}"); if (ret == 0) { searchResult = ps4.ReadMemory <SceSaveDataDirNameSearchResult>(pid, searchResultAddr); SearchEntry[] sEntries = new SearchEntry[searchResult.hitNum]; var paramMemory = ps4.ReadMemory(pid, searchResult.param, (int)searchResult.hitNum * Marshal.SizeOf(typeof(SceSaveDataParam))); var dirNamesMemory = ps4.ReadMemory(pid, searchResult.dirNames, (int)searchResult.hitNum * 32); for (int i = 0; i < searchResult.hitNum; i++) { SceSaveDataParam tmp = (SceSaveDataParam)PS4DBG.GetObjectFromBytes(PS4DBG.SubArray(paramMemory, i * Marshal.SizeOf(typeof(SceSaveDataParam)), Marshal.SizeOf(typeof(SceSaveDataParam))), typeof(SceSaveDataParam)); sEntries[i] = new SearchEntry { dirName = System.Text.Encoding.UTF8.GetString(PS4DBG.SubArray(dirNamesMemory, i * 32, 32)), title = System.Text.Encoding.UTF8.GetString(tmp.title), subtitle = System.Text.Encoding.UTF8.GetString(tmp.subTitle), detail = System.Text.Encoding.UTF8.GetString(tmp.detail), time = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tmp.mtime).ToString(), }; } ps4.FreeMemory(pid, searchCondAddr, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond)) + Marshal.SizeOf(typeof(SceSaveDataDirNameSearchResult))); return(sEntries); } ps4.FreeMemory(pid, searchCondAddr, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond)) + Marshal.SizeOf(typeof(SceSaveDataDirNameSearchResult))); return(new SearchEntry[0]); }
private SearchEntry[] Find(SceSaveDataDirNameSearchCond searchCond, SceSaveDataDirNameSearchResult searchResult) { var searchCondAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond))); var searchResultAddr = ps4.AllocateMemory(pid, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchResult))); ps4.WriteMemory(pid, searchCondAddr, searchCond); ps4.WriteMemory(pid, searchResultAddr, searchResult); var ret = ps4.Call(pid, stub, libSceSaveDataBase + offsets.sceSaveDataDirNameSearch, searchCondAddr, searchResultAddr); WriteLog($"sceSaveDataDirNameSearch ret = 0x{ret:X}"); if (ret == 0) { searchResult = ps4.ReadMemory <SceSaveDataDirNameSearchResult>(pid, searchResultAddr); SearchEntry[] sEntries = new SearchEntry[searchResult.hitNum]; for (uint i = 0; i < searchResult.hitNum; i++) { SceSaveDataParam tmp = ps4.ReadMemory <SceSaveDataParam>(pid, searchResult.param + i * (uint)Marshal.SizeOf(typeof(SceSaveDataParam))); sEntries[i] = new SearchEntry { dirName = ps4.ReadMemory <string>(pid, searchResult.dirNames + i * 32), title = tmp.title, subtitle = tmp.subTitle, detail = tmp.detail, time = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(tmp.mtime).ToString(), }; } ps4.FreeMemory(pid, searchCondAddr, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond))); ps4.FreeMemory(pid, searchResultAddr, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchResult))); return(sEntries); } ps4.FreeMemory(pid, searchCondAddr, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchCond))); ps4.FreeMemory(pid, searchResultAddr, Marshal.SizeOf(typeof(SceSaveDataDirNameSearchResult))); return(new SearchEntry[0]); }