new_mount_system

This commit is contained in:
Pavel 2025-07-18 14:59:35 +03:00
parent 7accf0c40d
commit 520cb4343b
18 changed files with 1603 additions and 876 deletions

View File

@ -1643,6 +1643,14 @@
<Filename Value="sys\md\md_systm_fork.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="gui\form_filler.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="gui\game_mount.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -1,28 +1,36 @@
object frmCfgEditor: TfrmCfgEditor
Left = 448
Height = 319
Top = 198
Width = 400
Left = 629
Height = 339
Top = 127
Width = 459
Caption = 'Config Editor'
ClientHeight = 319
ClientWidth = 400
ClientHeight = 339
ClientWidth = 459
Position = poMainFormCenter
LCLVersion = '3.6.0.0'
LCLVersion = '3.8.0.0'
object EditPages: TPageControl
Left = 0
Height = 270
Top = 0
Width = 397
ActivePage = Tab_PS4System
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = BtnOk
Left = 5
Height = 289
Top = 5
Width = 449
ActivePage = Tab_MainInfo
Align = alCustom
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 5
BorderSpacing.Top = 5
BorderSpacing.Right = 5
BorderSpacing.Bottom = 10
TabIndex = 5
TabIndex = 0
TabOrder = 0
object Tab_MainInfo: TTabSheet
Caption = 'Main'
ClientHeight = 242
ClientWidth = 389
ClientHeight = 261
ClientWidth = 441
object Label1: TLabel
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Tab_MainInfo
@ -31,7 +39,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 15
Top = 10
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -42,35 +50,16 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Label1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideRight.Control = BtnExpLog
Left = 10
Height = 23
Top = 35
Width = 369
Width = 396
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
TabOrder = 0
end
object Edt_MainInfo_fork_proc: TCheckBox
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Edt_MainInfo_data
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 184
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Run in a separate process'
TabOrder = 4
end
object Label2: TLabel
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Edt_MainInfo_LogFile
@ -80,60 +69,12 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 15
Top = 68
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Default System Firmware folder:'
end
object Edt_MainInfo_system: TEdit
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
Left = 10
Height = 23
Top = 93
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
TabOrder = 2
end
object Label3: TLabel
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Edt_MainInfo_system
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 126
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Default System data folder:'
end
object Edt_MainInfo_data: TEdit
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Label3
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
Left = 10
Height = 23
Top = 151
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
TabOrder = 3
Caption = 'Default Firmware folder:'
end
object BtnLogOpen: TButton
AnchorSideTop.Control = Edt_MainInfo_LogFile
@ -141,7 +82,7 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_LogFile
AnchorSideBottom.Side = asrBottom
Left = 343
Left = 370
Height = 21
Top = 36
Width = 35
@ -154,49 +95,140 @@ object frmCfgEditor: TfrmCfgEditor
TabOrder = 1
OnClick = BtnLogOpenClick
end
object BtnSysOpen: TButton
AnchorSideTop.Control = Edt_MainInfo_system
AnchorSideRight.Control = Edt_MainInfo_system
object BtnExpLog: TSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Edt_MainInfo_LogFile
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_system
AnchorSideBottom.Side = asrBottom
Left = 343
Height = 21
Top = 94
Width = 35
Anchors = [akTop, akRight, akBottom]
AnchorSideBottom.Control = Edt_MainInfo_LogFile
AnchorSideBottom.Side = asrCenter
Left = 411
Height = 20
Top = 36
Width = 20
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Top = 1
BorderSpacing.Right = 1
BorderSpacing.Bottom = 1
Caption = '...'
TabOrder = 5
OnClick = BtnSysOpenClick
BorderSpacing.Left = 5
BorderSpacing.Right = 10
Images = frmMain.SmallImageList
ImageIndex = 0
OnClick = BtnExpLogClick
end
object BtnDataOpen: TButton
AnchorSideTop.Control = Edt_MainInfo_data
AnchorSideRight.Control = Edt_MainInfo_data
object Edt_MainInfo_FirmwareList: TListBox
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = BtnAddFw
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_data
AnchorSideBottom.Control = Tab_MainInfo
AnchorSideBottom.Side = asrBottom
Left = 343
Height = 21
Top = 152
Width = 35
Anchors = [akTop, akRight, akBottom]
Left = 10
Height = 102
Top = 149
Width = 421
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 10
BorderSpacing.Top = 3
BorderSpacing.Right = 10
BorderSpacing.Bottom = 10
ItemHeight = 0
TabOrder = 3
end
object BtnAddFw: TSpeedButton
AnchorSideLeft.Control = Edt_MainInfo_FirmwareList
AnchorSideTop.Control = Edt_MainInfo_DefaultFirmware
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_FirmwareList
Left = 10
Height = 20
Top = 126
Width = 20
AutoSize = True
BorderSpacing.Top = 1
BorderSpacing.Right = 1
BorderSpacing.Bottom = 1
Caption = '...'
TabOrder = 6
OnClick = BtnDataOpenClick
BorderSpacing.Top = 10
BorderSpacing.Right = 5
Images = frmMain.SmallImageList
ImageIndex = 1
OnClick = BtnAddFwClick
end
object BtnRemFw: TSpeedButton
AnchorSideLeft.Control = BtnAddFw
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BtnAddFw
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_FirmwareList
Left = 35
Height = 20
Top = 126
Width = 20
AutoSize = True
Images = frmMain.SmallImageList
ImageIndex = 2
OnClick = BtnRemFwClick
end
object Label3: TLabel
AnchorSideLeft.Control = BtnRemFw
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Edt_MainInfo_LogFile
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_FirmwareList
Left = 65
Height = 15
Top = 124
Width = 366
Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Left = 10
BorderSpacing.Right = 10
BorderSpacing.Bottom = 10
Caption = 'Firmware folder list:'
end
object Edt_MainInfo_DefaultFirmware: TComboBox
AnchorSideLeft.Control = Tab_MainInfo
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BtnExpSys
Left = 10
Height = 23
Top = 93
Width = 396
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
ItemHeight = 15
TabOrder = 2
OnGetItems = Edt_MainInfo_DefaultFirmwareGetItems
end
object BtnExpSys: TSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Edt_MainInfo_DefaultFirmware
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Tab_MainInfo
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MainInfo_LogFile
AnchorSideBottom.Side = asrCenter
Left = 411
Height = 20
Top = 94
Width = 20
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Left = 5
BorderSpacing.Right = 10
Images = frmMain.SmallImageList
ImageIndex = 0
OnClick = BtnExpSysClick
end
end
object Tab_BootparamInfo: TTabSheet
Caption = 'Bootparam'
ClientHeight = 242
ClientWidth = 389
ClientHeight = 261
ClientWidth = 441
object Edt_BootparamInfo_neo: TCheckBox
AnchorSideLeft.Control = Tab_BootparamInfo
AnchorSideTop.Control = Tab_BootparamInfo
@ -205,7 +237,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 10
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -222,7 +254,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 39
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -239,7 +271,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 68
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -256,7 +288,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 97
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -273,7 +305,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 126
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -290,7 +322,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 155
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -307,7 +339,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 184
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -318,8 +350,8 @@ object frmCfgEditor: TfrmCfgEditor
end
object Tab_JIT: TTabSheet
Caption = 'JIT'
ClientHeight = 242
ClientWidth = 389
ClientHeight = 261
ClientWidth = 441
object Edt_JITInfo_print_asm: TCheckBox
AnchorSideLeft.Control = Tab_JIT
AnchorSideTop.Control = Tab_JIT
@ -328,7 +360,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 10
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -345,7 +377,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 39
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -362,7 +394,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 68
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -379,7 +411,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 19
Top = 97
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -390,23 +422,24 @@ object frmCfgEditor: TfrmCfgEditor
end
object Tab_Misc: TTabSheet
Caption = 'Misc'
ClientHeight = 242
ClientWidth = 389
ClientHeight = 261
ClientWidth = 441
object Edt_MiscInfo_strict_ps4_freq: TCheckBox
AnchorSideLeft.Control = Tab_Misc
AnchorSideTop.Control = Tab_Misc
AnchorSideTop.Control = Edt_MiscInfo_fork_proc
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_Misc
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 10
Width = 369
Top = 39
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Strict rdtsc timer frequency'
TabOrder = 0
TabOrder = 1
end
object Edt_MiscInfo_renderdoc_capture: TCheckBox
AnchorSideLeft.Control = Tab_Misc
@ -416,20 +449,39 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 39
Width = 369
Top = 68
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Use renderdoc capture'
TabOrder = 1
TabOrder = 2
end
object Edt_MiscInfo_fork_proc: TCheckBox
AnchorSideLeft.Control = Tab_Misc
AnchorSideTop.Control = Tab_Misc
AnchorSideRight.Control = Tab_Misc
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Tab_MainInfo
AnchorSideBottom.Side = asrBottom
Left = 10
Height = 19
Top = 10
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
BorderSpacing.Bottom = 10
Caption = 'Run in a separate process'
TabOrder = 0
end
end
object Tab_Vulkan: TTabSheet
Caption = 'Vulkan'
ClientHeight = 242
ClientWidth = 389
ClientHeight = 261
ClientWidth = 441
object Edt_VulkanInfo_device_cmb: TComboBox
AnchorSideLeft.Control = Tab_Vulkan
AnchorSideTop.Control = Label4
@ -439,7 +491,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 23
Top = 35
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -456,7 +508,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 15
Top = 10
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -472,7 +524,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 165
Top = 68
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
AutoFill = True
AutoSize = True
@ -489,7 +541,7 @@ object frmCfgEditor: TfrmCfgEditor
ChildSizing.Layout = cclTopToBottomThenLeftToRight
ChildSizing.ControlsPerLine = 7
ClientHeight = 145
ClientWidth = 365
ClientWidth = 417
ColumnLayout = clVerticalThenHorizontal
Columns = 2
Items.Strings = (
@ -516,22 +568,36 @@ object frmCfgEditor: TfrmCfgEditor
end
object Tab_PS4System: TTabSheet
Caption = 'PS4 System'
ClientHeight = 242
ClientWidth = 389
ClientHeight = 261
ClientWidth = 441
object PanelHalf: TPanel
AnchorSideLeft.Control = Tab_PS4System
AnchorSideLeft.Side = asrCenter
AnchorSideRight.Control = Tab_PS4System
AnchorSideRight.Side = asrCenter
Left = 188
Height = 49
Top = 64
Left = 214
Height = 26
Top = 151
Width = 12
Anchors = [akTop, akLeft, akRight]
BevelOuter = bvNone
Enabled = False
TabOrder = 0
end
object Label5: TLabel
AnchorSideLeft.Control = Tab_PS4System
AnchorSideTop.Control = Edt_PS4SystemService_SystemName
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_PS4System
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 68
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Language:'
end
object Edt_PS4SystemService_Language: TComboBox
AnchorSideLeft.Control = Tab_PS4System
AnchorSideTop.Control = Label5
@ -541,7 +607,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 23
Top = 93
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -591,7 +657,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 23
Top = 151
Width = 168
Width = 194
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -613,7 +679,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 15
Top = 126
Width = 168
Width = 194
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -627,10 +693,10 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_PS4System
AnchorSideRight.Side = asrBottom
Left = 210
Left = 236
Height = 23
Top = 151
Width = 169
Width = 195
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -650,10 +716,10 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_PS4System
AnchorSideRight.Side = asrBottom
Left = 210
Left = 236
Height = 15
Top = 126
Width = 169
Width = 195
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -668,7 +734,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 15
Top = 184
Width = 168
Width = 194
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -683,7 +749,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 23
Top = 209
Width = 168
Width = 194
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -704,29 +770,13 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 15
Top = 10
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'System Name:'
end
object Label5: TLabel
AnchorSideLeft.Control = Tab_PS4System
AnchorSideTop.Control = Edt_PS4SystemService_SystemName
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_PS4System
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 68
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Language:'
end
object Edt_PS4SystemService_SystemName: TEdit
AnchorSideLeft.Control = Tab_PS4System
AnchorSideTop.Control = Label9
@ -736,7 +786,7 @@ object frmCfgEditor: TfrmCfgEditor
Left = 10
Height = 23
Top = 35
Width = 369
Width = 421
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
@ -752,9 +802,9 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 315
Left = 374
Height = 25
Top = 284
Top = 304
Width = 75
Anchors = [akRight, akBottom]
AutoSize = True
@ -772,7 +822,7 @@ object frmCfgEditor: TfrmCfgEditor
AnchorSideBottom.Side = asrBottom
Left = 10
Height = 25
Top = 284
Top = 304
Width = 75
Anchors = [akLeft, akBottom]
AutoSize = True

View File

@ -6,12 +6,15 @@ interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
ExtCtrls,
ExtCtrls, Buttons,
lclintf,
Vulkan,
vDevice,
game_info;
game_info,
form_filler;
type
TVulkanDevGuid=class(TComponent)
@ -31,11 +34,14 @@ type
{ TfrmCfgEditor }
TfrmCfgEditor = class(TForm)
BtnExpSys: TSpeedButton;
BtnRemFw: TSpeedButton;
BtnCancel: TButton;
BtnSysOpen: TButton;
BtnAddFw: TSpeedButton;
BtnOk: TButton;
BtnLogOpen: TButton;
BtnDataOpen: TButton;
Edt_MainInfo_DefaultFirmware: TComboBox;
Edt_MiscInfo_fork_proc: TCheckBox;
Edt_PS4SystemService_SystemName: TEdit;
Edt_PS4SystemService_ButtonAssign: TComboBox;
Edt_PS4SystemService_TimeFormat: TComboBox;
@ -54,12 +60,9 @@ type
Edt_BootparamInfo_print_pmap: TCheckBox;
Edt_BootparamInfo_print_jit_preload: TCheckBox;
Edt_JITInfo_memory_guard: TCheckBox;
Edt_MainInfo_fork_proc: TCheckBox;
Edt_MainInfo_LogFile: TEdit;
Edt_BootparamInfo_neo: TCheckBox;
EditPages: TPageControl;
Edt_MainInfo_system: TEdit;
Edt_MainInfo_data: TEdit;
Edt_MiscInfo_renderdoc_capture: TCheckBox;
Label1: TLabel;
Label2: TLabel;
@ -70,20 +73,23 @@ type
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Edt_MainInfo_FirmwareList: TListBox;
PanelHalf: TPanel;
BtnExpLog: TSpeedButton;
Tab_PS4System: TTabSheet;
Tab_Vulkan: TTabSheet;
Tab_Misc: TTabSheet;
Tab_JIT: TTabSheet;
Tab_MainInfo: TTabSheet;
Tab_BootparamInfo: TTabSheet;
procedure BtnAddFwClick(Sender: TObject);
procedure BtnCancelClick(Sender: TObject);
procedure BtnDataOpenClick(Sender: TObject);
procedure BtnExpLogClick(Sender: TObject);
procedure BtnExpSysClick(Sender: TObject);
procedure BtnOkClick(Sender: TObject);
procedure BtnLogOpenClick(Sender: TObject);
procedure BtnSysOpenClick(Sender: TObject);
procedure PageInit(const TabName:RawByteString;obj:TAbstractObject);
procedure PageSave(const TabName:RawByteString;obj:TAbstractObject);
procedure BtnRemFwClick(Sender: TObject);
procedure Edt_MainInfo_DefaultFirmwareGetItems(Sender: TObject);
procedure VulkanInit;
procedure FormInit;
procedure FormSave;
@ -108,6 +114,7 @@ uses
TypInfo,
Rtti,
ms_shell_hack,
ps4_libSceSystemService;
var
@ -142,71 +149,120 @@ begin
Close;
end;
procedure DoOpenFile(Edit:TEdit);
function DoOpenFile(const Input,InitialDir:RawByteString):RawByteString;
var
d:TOpenDialog;
Cookie:Pointer;
begin
Cookie:=RegisterDllHack;
Result:=Input;
d:=nil;
try
d:=TOpenDialog.Create(nil);
d.InitialDir:=Edit.Text;
d.InitialDir:=InitialDir;
d.Options:=[ofPathMustExist,ofEnableSizing,ofViewDetail];
if d.Execute then
begin
Edit.Text:=d.FileName;
Result:=d.FileName;
end;
except
//
end;
FreeAndNil(d);
UnregisterDllHack(Cookie);
end;
procedure DoOpenDir(Edit:TEdit);
function DoOpenDir(const Input,InitialDir:RawByteString):RawByteString;
var
d:TSelectDirectoryDialog;
Cookie:Pointer;
begin
Cookie:=RegisterDllHack;
Result:=Input;
d:=nil;
try
d:=TSelectDirectoryDialog.Create(nil);
d.InitialDir:=Edit.Text;
d.InitialDir:=InitialDir;
d.Options:=[ofPathMustExist,ofEnableSizing,ofViewDetail];
if d.Execute then
begin
Edit.Text:=d.FileName;
Result:=d.FileName;
end;
except
//
end;
FreeAndNil(d);
UnregisterDllHack(Cookie);
end;
procedure TfrmCfgEditor.BtnLogOpenClick(Sender: TObject);
begin
DoOpenFile(Edt_MainInfo_LogFile);
Edt_MainInfo_LogFile.Text:=DoOpenFile(Edt_MainInfo_LogFile.Text,Edt_MainInfo_LogFile.Text);
end;
procedure TfrmCfgEditor.BtnSysOpenClick(Sender: TObject);
procedure TfrmCfgEditor.BtnAddFwClick(Sender:TObject);
var
new:RawByteString;
begin
DoOpenDir(Edt_MainInfo_system);
new:=DoOpenDir('','');
if (new='') then Exit;
Edt_MainInfo_FirmwareList .Items.Add(new);
Edt_MainInfo_DefaultFirmware.Items.Add(new);
end;
procedure TfrmCfgEditor.BtnDataOpenClick(Sender: TObject);
procedure TfrmCfgEditor.BtnRemFwClick(Sender: TObject);
var
i:Integer;
begin
DoOpenDir(Edt_MainInfo_data);
i:=Edt_MainInfo_FirmwareList.ItemIndex;
if (i>=0) and (i<Edt_MainInfo_FirmwareList.Count) then
begin
Edt_MainInfo_FirmwareList .Items.Delete(i);
Edt_MainInfo_DefaultFirmware.Items.Delete(i);
end;
end;
type
TMyControl=class(TControl)
public
property Text;
procedure TfrmCfgEditor.Edt_MainInfo_DefaultFirmwareGetItems(Sender: TObject);
var
i:Integer;
S:RawByteString;
begin
if (Edt_MainInfo_DefaultFirmware.Items.Count=0) and
(Edt_MainInfo_FirmwareList .Items.Count<>0) then
begin
//preload
For i:=0 to Edt_MainInfo_FirmwareList.Items.Count-1 do
begin
S:=Edt_MainInfo_FirmwareList.Items.Strings[i];
Edt_MainInfo_DefaultFirmware.Items.Add(S);
end;
end;
end;
TMyButtonControl=class(TButtonControl)
public
property Checked;
function OpenFolderOfFile(APath:RawByteString): Boolean;
begin
APath:=ExtractFilePath(APath);
if (Trim(APath)='') then
begin
APath:=GetCurrentDir;
end;
Result:=OpenDocument(APath);
end;
//src: TComboBox;
procedure TfrmCfgEditor.BtnExpLogClick(Sender: TObject);
begin
OpenFolderOfFile(Edt_MainInfo_LogFile.Text);
end;
procedure TfrmCfgEditor.BtnExpSysClick(Sender: TObject);
begin
OpenDocument(Edt_MainInfo_DefaultFirmware.Text);
end;
Function TVulkanDevGuid.GetText:RawByteString;
var
@ -279,8 +335,19 @@ begin
end;
//
type
TCfgFormData=class(TFormDataProvider)
procedure SetText (control:TComponent;const Text:RawByteString); override;
function GetText (control:TComponent):RawByteString; override;
procedure SetInteger(control:TComponent;i:Integer); override;
function GetInteger(control:TComponent):Integer; override;
procedure SetBool (control:TComponent;B:Boolean); override;
function GetBool (control:TComponent):Boolean; override;
procedure SetClass (control:TComponent;Obj:TObject); override;
procedure GetClass (control:TComponent;Obj:TObject); override;
end;
procedure SetText(control:TComponent;const Text:RawByteString);
procedure TCfgFormData.SetText(control:TComponent;const Text:RawByteString);
begin
if (control is TVulkanDevGuid) then
begin
@ -292,7 +359,7 @@ begin
end;
end;
function GetText(control:TComponent):RawByteString;
function TCfgFormData.GetText(control:TComponent):RawByteString;
begin
Result:='';
if (control is TVulkanDevGuid) then
@ -307,7 +374,7 @@ end;
//
procedure SetInteger(control:TComponent;i:Integer);
procedure TCfgFormData.SetInteger(control:TComponent;i:Integer);
begin
if (control is TVulkanAppFlags) then
begin
@ -337,7 +404,7 @@ begin
end;
end;
function GetInteger(control:TComponent):Integer;
function TCfgFormData.GetInteger(control:TComponent):Integer;
begin
Result:=0;
if (control is TVulkanAppFlags) then
@ -352,7 +419,7 @@ end;
//
procedure SetBool(control:TComponent;B:Boolean);
procedure TCfgFormData.SetBool(control:TComponent;B:Boolean);
begin
if control.InheritsFrom(TButtonControl) then
begin
@ -360,7 +427,7 @@ begin
end;
end;
function GetBool(control:TComponent):Boolean;
function TCfgFormData.GetBool(control:TComponent):Boolean;
begin
Result:=False;
if control.InheritsFrom(TButtonControl) then
@ -369,114 +436,48 @@ begin
end;
end;
procedure TCfgFormData.SetClass(control:TComponent;Obj:TObject);
var
A:TStringArray;
i:Integer;
begin
if control.InheritsFrom(TListBox) then
begin
A:=TStringArray(Obj);
if (Length(A.values)>0) then
For i:=0 to High(A.values) do
begin
TListBox(control).Items.Add(A.values[i]);
end;
end;
end;
procedure TCfgFormData.GetClass(control:TComponent;Obj:TObject);
var
A:TStringArray;
i,c:Integer;
begin
if control.InheritsFrom(TListBox) then
begin
A:=TStringArray(Obj);
c:=TListBox(control).Items.Count;
SetLength(A.values,c);
if (c>0) then
For i:=0 to c-1 do
begin
A.values[i]:=TListBox(control).Items.Strings[i];
end;
end;
end;
//
procedure TfrmCfgEditor.PageInit(const TabName:RawByteString;obj:TAbstractObject);
var
i:TRttiPropertyIterator;
p:TRttiProperty;
TypeKind:TTypeKind;
cname:RawByteString;
control:TComponent;
begin
i:=obj.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
cname:='Edt_'+TabName+'_'+p.Name;
control:=FindComponent(cname);
Assert(control<>nil,cname);
if (control=nil) then Exit;
TypeKind:=p.PropertyType.TypeKind;
case TypeKind of
tkSString,
tkLString,
tkAString:
begin
SetText(control,p.GetValue(obj).AsString);
end;
tkInteger:
begin
SetInteger(control,p.GetValue(obj).AsInteger);
end;
tkBool:
begin
SetBool(control,p.GetValue(obj).AsBoolean);
end;
else
Assert(false);
end;
i.Next;
end;
finally
i.free;
end;
end;
procedure TfrmCfgEditor.PageSave(const TabName:RawByteString;obj:TAbstractObject);
var
i:TRttiPropertyIterator;
p:TRttiProperty;
TypeKind:TTypeKind;
cname:RawByteString;
control:TComponent;
begin
i:=obj.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
cname:='Edt_'+TabName+'_'+p.Name;
control:=FindComponent(cname);
Assert(control<>nil,cname);
if (control=nil) then Exit;
TypeKind:=p.PropertyType.TypeKind;
case TypeKind of
tkSString,
tkLString,
tkAString:
begin
p.SetValue(obj,GetText(control));
end;
tkInteger:
begin
p.SetValue(obj,GetInteger(control));
end;
tkBool:
begin
p.SetValue(obj,GetBool(control));
end;
else
Assert(false);
end;
i.Next;
end;
finally
i.free;
end;
end;
Function GetApiVersionStr(apiVersion:TVkUInt32):RawByteString;
begin
Result:=IntToStr(VK_API_VERSION_MAJOR(apiVersion))+'.'+
@ -561,80 +562,30 @@ end;
procedure TfrmCfgEditor.FormInit;
var
i:TRttiPropertyIterator;
p:TRttiProperty;
obj:TObject;
Provider:TCfgFormData;
begin
VulkanInit;
EditPages.ActivePageIndex:=0;
i:=FConfigInfo.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
Provider:=TCfgFormData.Create;
p:=i.GetProperty;
FormLoad(Self,Provider,FConfigInfo);
case p.PropertyType.TypeKind of
tkClass:
begin
obj:=p.GetValue(FConfigInfo).AsObject;
if (obj<>nil) then
if obj.InheritsFrom(TAbstractObject) then
begin
PageInit(p.Name,TAbstractObject(obj));
end;
end;
else;
end;
i.Next;
end;
finally
i.free;
end;
Provider.Free;
Show;
end;
procedure TfrmCfgEditor.FormSave;
var
i:TRttiPropertyIterator;
p:TRttiProperty;
obj:TObject;
Provider:TCfgFormData;
begin
i:=FConfigInfo.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
Provider:=TCfgFormData.Create;
p:=i.GetProperty;
form_filler.FormSave(Self,Provider,FConfigInfo);
case p.PropertyType.TypeKind of
tkClass:
begin
obj:=p.GetValue(FConfigInfo).AsObject;
if (obj<>nil) then
if obj.InheritsFrom(TAbstractObject) then
begin
PageSave(p.Name,TAbstractObject(obj));
end;
end;
else;
end;
i.Next;
end;
finally
i.free;
end;
Provider.Free;
end;
end.

262
gui/form_filler.pas Normal file
View File

@ -0,0 +1,262 @@
unit form_filler;
{$mode ObjFPC}{$H+}
interface
uses
Classes,
SysUtils,
Controls,
StdCtrls,
TypInfo,
Rtti,
game_info;
type
TFormDataProvider=class
procedure SetText (control:TComponent;const Text:RawByteString); virtual; abstract;
function GetText (control:TComponent):RawByteString; virtual; abstract;
procedure SetInteger(control:TComponent;i:Integer); virtual; abstract;
function GetInteger(control:TComponent):Integer; virtual; abstract;
procedure SetBool (control:TComponent;B:Boolean); virtual; abstract;
function GetBool (control:TComponent):Boolean; virtual; abstract;
procedure SetClass (control:TComponent;Obj:TObject); virtual; abstract;
procedure GetClass (control:TComponent;Obj:TObject); virtual; abstract;
end;
type
TMyControl=class(TControl)
public
property Text;
end;
TMyButtonControl=class(TButtonControl)
public
property Checked;
end;
procedure PageLoad(Parent:TComponent;
const TabName:RawByteString;
Provider:TFormDataProvider;
src:TAbstractObject);
procedure FormLoad(Parent:TComponent;
Provider:TFormDataProvider;
src:TAbstractObject);
procedure PageSave(Parent:TComponent;
const TabName:RawByteString;
Provider:TFormDataProvider;
dst:TAbstractObject);
procedure FormSave(Parent:TComponent;
Provider:TFormDataProvider;
dst:TAbstractObject);
implementation
procedure PageLoad(Parent:TComponent;
const TabName:RawByteString;
Provider:TFormDataProvider;
src:TAbstractObject);
var
i:TRttiPropertyIterator;
p:TRttiProperty;
TypeKind:TTypeKind;
cname:RawByteString;
control:TComponent;
begin
i:=src.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
cname:='Edt_'+TabName+'_'+p.Name;
control:=Parent.FindComponent(cname);
Assert(control<>nil,'Control:'+cname+' not found!');
if (control=nil) then Exit;
TypeKind:=p.PropertyType.TypeKind;
case TypeKind of
tkSString,
tkLString,
tkAString:
begin
Provider.SetText(control,p.GetValue(src).AsString);
end;
tkInteger:
begin
Provider.SetInteger(control,p.GetValue(src).AsInteger);
end;
tkBool:
begin
Provider.SetBool(control,p.GetValue(src).AsBoolean);
end;
tkClass:
begin
Provider.SetClass(control,p.GetValue(src).AsObject);
end;
else
Assert(false);
end;
i.Next;
end;
finally
i.free;
end;
end;
procedure FormLoad(Parent:TComponent;
Provider:TFormDataProvider;
src:TAbstractObject);
var
i:TRttiPropertyIterator;
p:TRttiProperty;
obj:TObject;
begin
i:=src.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
case p.PropertyType.TypeKind of
tkClass:
begin
obj:=p.GetValue(src).AsObject;
if (obj<>nil) then
if obj.InheritsFrom(TAbstractObject) then
begin
PageLoad(Parent,p.Name,Provider,TAbstractObject(obj));
end;
end;
else;
end;
i.Next;
end;
finally
i.free;
end;
end;
//////////////
procedure PageSave(Parent:TComponent;
const TabName:RawByteString;
Provider:TFormDataProvider;
dst:TAbstractObject);
var
i:TRttiPropertyIterator;
p:TRttiProperty;
TypeKind:TTypeKind;
cname:RawByteString;
control:TComponent;
begin
i:=dst.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
cname:='Edt_'+TabName+'_'+p.Name;
control:=Parent.FindComponent(cname);
Assert(control<>nil,cname);
if (control=nil) then Exit;
TypeKind:=p.PropertyType.TypeKind;
case TypeKind of
tkSString,
tkLString,
tkAString:
begin
p.SetValue(dst,Provider.GetText(control));
end;
tkInteger:
begin
p.SetValue(dst,Provider.GetInteger(control));
end;
tkBool:
begin
p.SetValue(dst,Provider.GetBool(control));
end;
tkClass:
begin
Provider.GetClass(control,p.GetValue(dst).AsObject);
end;
else
Assert(false);
end;
i.Next;
end;
finally
i.free;
end;
end;
procedure FormSave(Parent:TComponent;
Provider:TFormDataProvider;
dst:TAbstractObject);
var
i:TRttiPropertyIterator;
p:TRttiProperty;
obj:TObject;
begin
i:=dst.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
case p.PropertyType.TypeKind of
tkClass:
begin
obj:=p.GetValue(dst).AsObject;
if (obj<>nil) then
if obj.InheritsFrom(TAbstractObject) then
begin
PageSave(Parent,p.Name,Provider,TAbstractObject(obj));
end;
end;
else;
end;
i.Next;
end;
finally
i.free;
end;
end;
end.

View File

@ -1,85 +1,342 @@
object frmGameEditor: TfrmGameEditor
Left = 501
Height = 319
Top = 124
Width = 397
Left = 318
Height = 311
Top = 113
Width = 467
Caption = 'Game editor'
ClientHeight = 319
ClientWidth = 397
ClientHeight = 311
ClientWidth = 467
OnClose = FormClose
Position = poMainFormCenter
LCLVersion = '3.6.0.0'
LCLVersion = '3.8.0.0'
object EditPages: TPageControl
AnchorSideBottom.Control = BtnOk
Left = 0
Height = 274
Height = 266
Top = 0
Width = 397
ActivePage = TabMain
Width = 467
ActivePage = TabFolders
Align = alCustom
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Bottom = 10
TabIndex = 0
TabIndex = 1
TabOrder = 0
object TabMain: TTabSheet
Caption = 'Main'
ClientHeight = 246
ClientWidth = 389
object GridMain: TStringGrid
Left = 0
Height = 246
Top = 0
Width = 389
Align = alClient
AutoFillColumns = True
ColCount = 2
FixedRows = 0
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goEditing, goThumbTracking, goSmoothScroll]
RowCount = 1
ClientHeight = 238
ClientWidth = 459
object Label1: TLabel
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = TabMain
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 10
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Name:'
end
object Edt_GameInfo_Name: TEdit
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Label1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 10
Height = 23
Top = 35
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
MaxLength = 65
TabOrder = 0
TitleStyle = tsNative
OnEditingDone = GridEditingDone
OnSelectEditor = GridSelectEditor
ColWidths = (
64
321
)
end
object Label2: TLabel
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Edt_GameInfo_Name
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 68
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'TitleId:'
end
object Edt_GameInfo_TitleId: TEdit
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 10
Height = 23
Top = 93
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
MaxLength = 65
ReadOnly = True
TabOrder = 1
end
object Label3: TLabel
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Edt_GameInfo_TitleId
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = PanelHalf
Left = 10
Height = 15
Top = 126
Width = 203
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Master version:'
end
object Edt_GameInfo_Version: TEdit
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Label3
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = PanelHalf
Left = 10
Height = 23
Top = 151
Width = 203
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
MaxLength = 65
ReadOnly = True
TabOrder = 2
end
object Label4: TLabel
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Edt_GameInfo_Version
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 184
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Exec command:'
end
object Edt_GameInfo_Exec: TEdit
AnchorSideLeft.Control = TabMain
AnchorSideTop.Control = Label4
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 10
Height = 23
Top = 209
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
MaxLength = 65
TabOrder = 5
end
object PanelHalf: TPanel
AnchorSideLeft.Control = TabMain
AnchorSideLeft.Side = asrCenter
AnchorSideRight.Side = asrCenter
Left = 223
Height = 23
Top = 151
Width = 12
BevelOuter = bvNone
Enabled = False
TabOrder = 4
TabStop = True
end
object Label7: TLabel
AnchorSideLeft.Control = PanelHalf
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Edt_GameInfo_TitleId
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 245
Height = 15
Top = 126
Width = 204
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Application version:'
end
object Edt_GameInfo_AppVer: TEdit
AnchorSideLeft.Control = PanelHalf
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Label3
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = TabMain
AnchorSideRight.Side = asrBottom
Left = 245
Height = 23
Top = 151
Width = 204
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
MaxLength = 65
ReadOnly = True
TabOrder = 3
end
end
object TabMounts: TTabSheet
Caption = 'Mounts'
ClientHeight = 246
ClientWidth = 389
object GridMounts: TStringGrid
Left = 0
Height = 246
Top = 0
Width = 389
Align = alClient
AutoFillColumns = True
ColCount = 2
FixedRows = 0
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goEditing, goThumbTracking, goSmoothScroll]
RowCount = 1
object TabFolders: TTabSheet
Caption = 'Folders'
ClientHeight = 238
ClientWidth = 459
object Label5: TLabel
AnchorSideLeft.Control = TabFolders
AnchorSideTop.Control = TabFolders
AnchorSideRight.Control = TabFolders
AnchorSideRight.Side = asrBottom
Left = 10
Height = 15
Top = 10
Width = 439
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Game:'
end
object Edt_MountList_game: TEdit
AnchorSideLeft.Control = TabFolders
AnchorSideTop.Control = Label5
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BtnExpGame
Left = 10
Height = 23
Top = 35
Width = 414
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
TabOrder = 0
TitleStyle = tsNative
OnEditingDone = GridEditingDone
OnSelectEditor = GridSelectEditor
ColWidths = (
64
304
)
OnExit = Edt_MountList_gameExit
end
object BtnGameOpen: TButton
AnchorSideTop.Control = Edt_MountList_game
AnchorSideRight.Control = Edt_MountList_game
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Edt_MountList_game
AnchorSideBottom.Side = asrBottom
Left = 388
Height = 21
Top = 36
Width = 35
Anchors = [akTop, akRight, akBottom]
AutoSize = True
BorderSpacing.Top = 1
BorderSpacing.Right = 1
BorderSpacing.Bottom = 1
Caption = '...'
TabOrder = 1
OnClick = BtnGameOpenClick
end
object BtnExpGame: TSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Edt_MountList_game
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = TabFolders
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrCenter
Left = 429
Height = 20
Top = 36
Width = 20
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Left = 5
BorderSpacing.Right = 10
Images = frmMain.SmallImageList
ImageIndex = 0
OnClick = BtnExpGameClick
end
object Label6: TLabel
AnchorSideTop.Control = Edt_MountList_game
AnchorSideTop.Side = asrBottom
AnchorSideRight.Side = asrBottom
Left = 8
Height = 15
Top = 68
Width = 451
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Firmware:'
end
object Edt_MountList_firmware: TComboBox
AnchorSideLeft.Control = TabFolders
AnchorSideTop.Control = Label6
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BtnExpFw
Left = 10
Height = 23
Top = 93
Width = 414
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
ItemHeight = 15
TabOrder = 2
OnGetItems = Edt_MountList_firmwareGetItems
end
object BtnExpFw: TSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Edt_MountList_firmware
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = TabFolders
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Side = asrCenter
Left = 429
Height = 20
Top = 94
Width = 20
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Left = 5
BorderSpacing.Right = 10
Images = frmMain.SmallImageList
ImageIndex = 0
OnClick = BtnExpFwClick
end
end
object TabParamSfo: TTabSheet
Caption = 'param.sfo'
ClientHeight = 246
ClientWidth = 389
ClientHeight = 238
ClientWidth = 459
object GridParamSfo: TStringGrid
Left = 0
Height = 246
Height = 238
Top = 0
Width = 389
Width = 459
Align = alClient
AutoFillColumns = True
ColCount = 2
@ -88,11 +345,9 @@ object frmGameEditor: TfrmGameEditor
RowCount = 1
TabOrder = 0
TitleStyle = tsNative
OnEditingDone = GridEditingDone
OnSelectEditor = GridSelectEditor
ColWidths = (
64
304
374
)
end
end
@ -103,7 +358,7 @@ object frmGameEditor: TfrmGameEditor
AnchorSideBottom.Side = asrBottom
Left = 10
Height = 25
Top = 284
Top = 276
Width = 75
Anchors = [akLeft, akBottom]
AutoSize = True
@ -121,9 +376,9 @@ object frmGameEditor: TfrmGameEditor
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 312
Left = 382
Height = 25
Top = 284
Top = 276
Width = 75
Anchors = [akRight, akBottom]
AutoSize = True

View File

@ -6,11 +6,14 @@ interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls,
StdCtrls, Grids,
StdCtrls, Grids, Buttons,
LCLIntf,
ms_shell_hack,
game_info,
form_filler,
param_sfo_gui;
type
@ -18,34 +21,49 @@ type
{ TfrmGameEditor }
TfrmGameEditor = class(TForm)
BtnExpGame: TSpeedButton;
BtnExpFw: TSpeedButton;
BtnGameOpen: TButton;
BtnOk: TButton;
BtnCancel: TButton;
EditPages: TPageControl;
GridMain: TStringGrid;
GridMounts: TStringGrid;
Edt_GameInfo_Name: TEdit;
Edt_GameInfo_Exec: TEdit;
Edt_GameInfo_TitleId: TEdit;
Edt_GameInfo_Version: TEdit;
Edt_GameInfo_AppVer: TEdit;
Edt_MountList_game: TEdit;
Edt_MountList_firmware: TComboBox;
GridParamSfo: TStringGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
PanelHalf: TPanel;
TabMain: TTabSheet;
TabMounts: TTabSheet;
TabFolders: TTabSheet;
TabParamSfo: TTabSheet;
procedure BtnExpFwClick(Sender: TObject);
procedure BtnExpGameClick(Sender: TObject);
procedure BtnGameOpenClick(Sender: TObject);
procedure BtnOkClick(Sender: TObject);
procedure BtnCancelClick(Sender: TObject);
procedure Edt_MountList_firmwareGetItems(Sender: TObject);
procedure Edt_MountList_gameExit(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormInit(UpdateTitle:Boolean);
procedure FormSave;
procedure LoadParamSfo(UpdateTitle:Boolean);
procedure GridSelectEditor(Sender:TObject;aCol,aRow:Integer;var Editor:TWinControl);
procedure GridEditingDone(Sender: TObject);
private
Fapp0_row :Integer;
FName_row :Integer;
FTitleId_row:Integer;
FVersion_row:Integer;
Fapp0p:RawByteString;
Fgame:RawByteString;
public
OnSave :TNotifyEvent;
Item :TGameItem;
ParamSfo:TParamSfoFile;
OnSave :TNotifyEvent;
FConfigInfo:TConfigInfo;
FItem :TGameItem;
FParamSfo :TParamSfoFile;
end;
var
@ -61,147 +79,32 @@ uses
{ TfrmGameEditor }
type
TFieldInfo=class(TComponent)
procedure SelectEditor(Grid:TStringGrid;aCol,aRow:Integer;var Editor:TWinControl); virtual; abstract;
end;
TFieldInfoPath=class(TFieldInfo)
procedure SelectEditor(Grid:TStringGrid;aCol,aRow:Integer;var Editor:TWinControl); override;
end;
TButtonPath=class(TButton)
public
aRow:Integer;
Form :TWinControl;
Editor:TWinControl;
procedure EditorExit(Sender:TObject);
procedure OpenDir(Sender:TObject);
end;
procedure TButtonPath.EditorExit(Sender:TObject);
begin
Editor.OnEnter:=nil;
Editor.OnExit :=nil;
if not Focused then
begin
Hide;
end;
end;
type
TMyStringGrid=class(TStringGrid)
function NewBtn:TButtonPath;
procedure EditorDirEnter(Sender:TObject);
end;
procedure TButtonPath.OpenDir(Sender:TObject);
function DoOpenDir(const Input,InitialDir:RawByteString):RawByteString;
var
d:TSelectDirectoryDialog;
Cookie:Pointer;
begin
Cookie:=RegisterDllHack;
Result:=Input;
d:=nil;
try
d:=TSelectDirectoryDialog.Create(nil);
with TMyStringGrid(Editor.Parent) do
begin
d.InitialDir:=Cells[1,aRow];
end;
d.InitialDir:=InitialDir;
d.Options:=[ofPathMustExist,ofEnableSizing,ofViewDetail];
if d.Execute then
with TMyStringGrid(Editor.Parent) do
begin
Cells[1,aRow]:=d.FileName;
Result:=d.FileName;
end;
except
//
end;
FreeAndNil(d);
UnregisterDllHack(Cookie);
TfrmGameEditor(Self.Form).LoadParamSfo(True);
Hide;
end;
function TMyStringGrid.NewBtn:TButtonPath;
var
i:Integer;
btn:TButtonPath;
begin
btn:=nil;
if (ComponentCount<>0) then
for i:=0 to ComponentCount-1 do
begin
if Components[i] is TButtonPath then
begin
btn:=TButtonPath(Components[i]);
Break;
end;
end;
if (btn=nil) then
begin
btn:=TButtonPath.Create(Self);
btn.Form:=TWinControl(Self.Tag);
btn.AutoSize:=True;
btn.Caption:='...';
btn.Parent:=Self;
btn.BorderSpacing.Top :=-3;
btn.BorderSpacing.Right :=-3;
btn.BorderSpacing.Bottom:=-3;
end;
btn.aRow:=Self.Row;
btn.AnchorSide[akTop].Side:=asrTop;
btn.AnchorSide[akTop].Control:=Editor;
btn.AnchorSide[akRight].Side:=asrBottom;
btn.AnchorSide[akRight].Control:=Editor;
btn.AnchorSide[akBottom].Side:=asrBottom;
btn.AnchorSide[akBottom].Control:=Editor;
btn.Anchors:=[akTop,akRight,akBottom];
btn.Editor:=Editor;
Result:=btn;
end;
procedure TMyStringGrid.EditorDirEnter(Sender:TObject);
var
btn:TButtonPath;
begin
btn:=NewBtn;
btn.OnClick:=@btn.OpenDir;
Editor.OnExit:=@btn.EditorExit;
btn.Show;
end;
procedure TFieldInfoPath.SelectEditor(Grid:TStringGrid;aCol,aRow:Integer;var Editor:TWinControl);
begin
Editor.OnEnter:=@TMyStringGrid(Grid).EditorDirEnter;
end;
procedure AddRow(Grid:TStringGrid;const name,value:RawByteString;info:TFieldInfo);
procedure AddRow(Grid:TStringGrid;const name,value:RawByteString;obj:TObject);
var
i:Integer;
begin
@ -209,69 +112,45 @@ begin
Grid.RowCount:=i+1;
Grid.Cells[0,i]:=name;
Grid.Cells[1,i]:=value;
Grid.Objects[0,i]:=info;
Grid.Objects[0,i]:=obj;
end;
type
TGameFormData=class(TFormDataProvider)
procedure SetText(control:TComponent;const Text:RawByteString); override;
function GetText(control:TComponent):RawByteString; override;
end;
procedure TGameFormData.SetText(control:TComponent;const Text:RawByteString);
begin
if control.InheritsFrom(TControl) then
begin
TMyControl(control).Text:=Text;
end;
end;
function TGameFormData.GetText(control:TComponent):RawByteString;
begin
Result:='';
if control.InheritsFrom(TControl) then
begin
Result:=TMyControl(control).Text;
end;
end;
procedure TfrmGameEditor.FormInit(UpdateTitle:Boolean);
var
fip:TFieldInfoPath;
i:TRttiPropertyIterator;
p:TRttiProperty;
Provider:TGameFormData;
begin
EditPages.ActivePageIndex:=0;
GridMain.Clear;
GridMounts.Clear;
Provider:=TGameFormData.Create;
//TypInfo.SetRawByteStrProp();
FormLoad(Self,Provider,FItem);
//AddRow(GridMain,'Name:',nil);
Provider.Free;
//
fip:=TFieldInfoPath.Create(Self);
//
i:=Item.FGameInfo.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
case p.Name of
'Name' :FName_row :=GridMain.RowCount;
'TitleId':FTitleId_row:=GridMain.RowCount;
'Version':FVersion_row:=GridMain.RowCount;
else;
end;
AddRow(GridMain,p.Name+':',p.GetValue(Item.FGameInfo).AsString,nil);
i.Next;
end;
finally
i.free;
end;
i:=Item.FMountList.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
case p.Name of
'app0':Fapp0_row:=GridMounts.RowCount;
else;
end;
AddRow(GridMounts,'/'+p.Name,p.GetValue(Item.FMountList).AsString,fip);
i.Next;
end;
finally
i.free;
end;
//////
LoadParamSfo(UpdateTitle);
@ -280,52 +159,13 @@ end;
procedure TfrmGameEditor.FormSave;
var
i:TRttiPropertyIterator;
p:TRttiProperty;
Provider:TGameFormData;
begin
i:=Item.FGameInfo.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
Provider:=TGameFormData.Create;
p:=i.GetProperty;
p.SetValue(Item.FGameInfo,GridMain.Cells[1,i.i]);
form_filler.FormSave(Self,Provider,FItem);
i.Next;
end;
finally
i.free;
end;
i:=Item.FMountList.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
p:=i.GetProperty;
p.SetValue(Item.FMountList,GridMounts.Cells[1,i.i]);
i.Next;
end;
finally
i.free;
end;
end;
function GetGridVal(Grid:TStringGrid;ARow:Integer):RawByteString;
begin
Result:='';
if (ARow<0) and (ARow>=Grid.RowCount) then Exit;
//
Result:=Grid.Cells[1,ARow];
end;
procedure SetGridVal(Grid:TStringGrid;ARow:Integer;const value:RawByteString);
begin
if (ARow<0) and (ARow>=Grid.RowCount) then Exit;
//
Grid.Cells[1,ARow]:=value;
Provider.Free;
end;
procedure TfrmGameEditor.LoadParamSfo(UpdateTitle:Boolean);
@ -333,40 +173,39 @@ var
i:Integer;
V:RawByteString;
begin
V:=GetGridVal(GridMounts,Fapp0_row);
V:=Edt_MountList_game.Text;
if (Fgame=V) then Exit;
if (Fapp0p=V) then Exit;
FreeAndNil(FParamSfo);
FreeAndNil(ParamSfo);
FParamSfo:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(V)+
DirectorySeparator+
'sce_sys'+
DirectorySeparator+
'param.sfo');
ParamSfo:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(V)+
DirectorySeparator+
'sce_sys'+
DirectorySeparator+
'param.sfo');
Fapp0p:=V;
Fgame:=V;
GridParamSfo.Clear;
if (ParamSfo=nil) then
if (FParamSfo=nil) then
begin
SetGridVal(GridMain,FTitleId_row,'???');
SetGridVal(GridMain,FVersion_row,'???');
Edt_GameInfo_TitleId.Text:='???';
Edt_GameInfo_Version.Text:='???';
Exit;
end;
if (Length(ParamSfo.params)=0) then Exit;
For i:=0 to High(ParamSfo.params) do
if (Length(FParamSfo.params)=0) then Exit;
For i:=0 to High(FParamSfo.params) do
begin
if (ParamSfo.params[i].format=SFO_FORMAT_UINT32) then
if (FParamSfo.params[i].format=SFO_FORMAT_UINT32) then
begin
V:='0x'+HexStr(ParamSfo.params[i].GetUInt,8);
V:='0x'+HexStr(FParamSfo.params[i].GetUInt,8);
end else
begin
V:=Trim(ParamSfo.params[i].GetString);
V:=Trim(FParamSfo.params[i].GetString);
end;
AddRow(GridParamSfo,ParamSfo.params[i].name,V,nil);
AddRow(GridParamSfo,FParamSfo.params[i].name,V,nil);
end;
GridParamSfo.AutoSizeColumn(0);
@ -374,34 +213,45 @@ begin
//
if not UpdateTitle then Exit;
V:=ParamSfo.GetString('TITLE');
SetGridVal(GridMain,FName_row,V);
V:=FParamSfo.GetString('TITLE');
Edt_GameInfo_Name.Text:=V;
V:=ParamSfo.GetString('TITLE_ID');
SetGridVal(GridMain,FTitleId_row,V);
V:=FParamSfo.GetString('TITLE_ID');
Edt_GameInfo_TitleId.Text:=V;
V:=ParamSfo.GetString('APP_VER');
SetGridVal(GridMain,FVersion_row,V);
V:=FParamSfo.GetString('VERSION');
Edt_GameInfo_Version.Text:=V;
V:=FParamSfo.GetString('APP_VER');
Edt_GameInfo_AppVer.Text:=V;
end;
procedure TfrmGameEditor.GridSelectEditor(Sender:TObject;aCol,aRow:Integer;var Editor:TWinControl);
var
obj:TObject;
begin
obj:=TStringGrid(Sender).Objects[0,aRow];
if (obj=nil) then Exit;
if not obj.InheritsFrom(TFieldInfo) then Exit;
//
TStringGrid(Sender).Tag:=PtrInt(Self);
//
TFieldInfo(obj).SelectEditor(TStringGrid(Sender),aCol,aRow,Editor);
end;
procedure TfrmGameEditor.GridEditingDone(Sender: TObject);
procedure TfrmGameEditor.Edt_MountList_gameExit(Sender: TObject);
begin
LoadParamSfo(True);
end;
procedure TfrmGameEditor.BtnGameOpenClick(Sender: TObject);
var
new:RawByteString;
begin
new:=DoOpenDir('',Edt_MountList_game.Text);
if (new='') then Exit;
Edt_MountList_game.Text:=new;
LoadParamSfo(True);
end;
procedure TfrmGameEditor.BtnExpGameClick(Sender: TObject);
begin
OpenDocument(Edt_MountList_game.Text);
end;
procedure TfrmGameEditor.BtnExpFwClick(Sender: TObject);
begin
OpenDocument(Edt_MountList_firmware.Text);
end;
procedure TfrmGameEditor.BtnOkClick(Sender: TObject);
begin
FormSave;
@ -418,20 +268,41 @@ begin
Close;
end;
procedure TfrmGameEditor.Edt_MountList_firmwareGetItems(Sender: TObject);
var
i,c:Integer;
S:RawByteString;
begin
if (FConfigInfo<>nil) then
begin
c:=FConfigInfo.MainInfo.FirmwareList.GetArrayCount;
if (c<>0) and (Edt_MountList_firmware.Items.Count<>c) then
begin
Edt_MountList_firmware.Items.Clear;
//preload
For i:=0 to c-1 do
begin
S:=FConfigInfo.MainInfo.FirmwareList.values[i];
Edt_MountList_firmware.Items.Add(S);
end;
end;
end;
end;
procedure TfrmGameEditor.FormClose(Sender:TObject;var CloseAction:TCloseAction);
begin
if (Item<>nil) then
if (FItem<>nil) then
begin
if Item.FLock then
if FItem.FLock then
begin
Item.FLock:=False;
FItem.FLock:=False;
end else
begin
FreeAndNil(Item);
FreeAndNil(FItem);
end;
end;
//
FreeAndNil(ParamSfo);
FreeAndNil(FParamSfo);
//
CloseAction:=caFree;
end;

View File

@ -99,6 +99,18 @@ type
Destructor Destroy(); override;
end;
TStringArray=class(TAbstractArray)
values:array of RawByteString;
//
Destructor Destroy; override;
//
Function GetArrayCount:SizeInt; override;
Function GetArrayItem(i:SizeInt):TValue; override;
Function AddObject:TAbstractObject; override;
Function AddArray :TAbstractArray; override;
procedure AddValue(Value:TValue); override;
end;
TBootParamInfo=class(TAbstractObject)
private
FNeo :Boolean;
@ -135,26 +147,28 @@ type
TMainInfo=class(TAbstractObject)
private
FLogFile :RawByteString;
Fsystem :RawByteString;
Fdata :RawByteString;
Ffork_proc:Boolean;
FLogFile :RawByteString;
FDefaultFirmware:RawByteString;
FFirmwareList :TStringArray;
published
property LogFile :RawByteString read FLogFile write FLogFile;
property system :RawByteString read Fsystem write Fsystem;
property data :RawByteString read Fdata write Fdata;
property fork_proc:Boolean read Ffork_proc write Ffork_proc;
property LogFile :RawByteString read FLogFile write FLogFile;
property DefaultFirmware:RawByteString read FDefaultFirmware write FDefaultFirmware;
property FirmwareList :TStringArray read FFirmwareList write FFirmwareList;
public
Constructor Create; override;
end;
TMiscInfo=class(TAbstractObject)
private
Ffork_proc :Boolean;
Fstrict_ps4_freq :Boolean;
Frenderdoc_capture:Boolean;
published
property fork_proc :Boolean read Ffork_proc write Ffork_proc;
property strict_ps4_freq :Boolean read Fstrict_ps4_freq write Fstrict_ps4_freq;
property renderdoc_capture:Boolean read Frenderdoc_capture write Frenderdoc_capture;
public
Constructor Create; override;
end;
TVulkanInfo=class(TAbstractObject)
@ -183,18 +197,6 @@ type
Constructor Create; override;
end;
TStringArray=class(TAbstractArray)
values:array of RawByteString;
//
Destructor Destroy; override;
//
Function GetArrayCount:SizeInt; override;
Function GetArrayItem(i:SizeInt):TValue; override;
Function AddObject:TAbstractObject; override;
Function AddArray :TAbstractArray; override;
procedure AddValue(Value:TValue); override;
end;
TPS4LoadExec=class(TAbstractObject)
private
FPath:RawByteString;
@ -227,27 +229,25 @@ type
FName :RawByteString;
FTitleId:RawByteString;
FVersion:RawByteString;
FAppVer :RawByteString;
FExec :RawByteString;
FParam :RawByteString;
published
property Name :RawByteString read FName write FName;
property TitleId:RawByteString read FTitleId write FTitleId;
property Version:RawByteString read FVersion write FVersion;
property AppVer :RawByteString read FAppVer write FAppVer;
property Exec :RawByteString read FExec write FExec;
property Param :RawByteString read FParam write FParam;
public
Constructor Create; override;
end;
TMountList=class(TAbstractObject)
private
Fapp0 :RawByteString;
Fsystem:RawByteString;
Fdata :RawByteString;
Fgame :RawByteString;
Ffirmware:RawByteString;
published
property app0 :RawByteString read Fapp0 write Fapp0 ;
property system:RawByteString read Fsystem write Fsystem;
property data :RawByteString read Fdata write Fdata ;
property game :RawByteString read Fgame write Fgame ;
property firmware:RawByteString read Ffirmware write Ffirmware;
public
Constructor Create; override;
end;
@ -264,10 +264,16 @@ type
TGameStartupInfo=class(TAbstractObject)
public
FReader :Boolean;
FPipe :THandle;
FConfInfo:TConfigInfo;
FGameItem:TGameItem;
FReader :Boolean;
FPipe :THandle;
FConfInfo :TConfigInfo;
FGameItem :TGameItem;
FLocalDir :RawByteString;
FhasParamSfo:Integer;
published
property Pipe :THandle read FPipe write FPipe;
property LocalDir:RawByteString read FLocalDir write FLocalDir;
property hasParamSfo:Integer read FhasParamSfo write FhasParamSfo;
public
Constructor Create(Reader:Boolean); reintroduce;
Destructor Destroy; override;
@ -1091,9 +1097,13 @@ end;
Constructor TMainInfo.Create;
begin
inherited;
FLogFile:='log.txt';
Fsystem :=DirectorySeparator+'system';
Fdata :=DirectorySeparator+'data';
FLogFile :='log.txt';
FDefaultFirmware:=DirectorySeparator+'firmware';
end;
Constructor TMiscInfo.Create;
begin
inherited;
Ffork_proc:=True;
end;
@ -1152,14 +1162,14 @@ begin
FExec:='/app0/eboot.bin';
FTitleId:='???';
FVersion:='???';
FAppVer :='???';
end;
Constructor TMountList.Create;
begin
inherited;
Fapp0 :=DirectorySeparator;
Fsystem:=DirectorySeparator+'system';
Fdata :=DirectorySeparator+'data';
Fgame :=DirectorySeparator;
Ffirmware:=DirectorySeparator+'firmware';
end;
//
@ -1187,15 +1197,14 @@ end;
Procedure TGameStartupInfo.Serialize(Stream:TStream);
begin
Stream.Write(FPipe,SizeOf(THandle));
inherited Serialize(Stream);
FConfInfo.Serialize(Stream);
FGameItem.Serialize(Stream);
end;
Procedure TGameStartupInfo.Deserialize(Stream:TStream);
begin
FPipe:=0;
Stream.Read(FPipe,SizeOf(THandle));
inherited Deserialize(Stream);
FConfInfo.Deserialize(Stream);
FGameItem.Deserialize(Stream);
end;

248
gui/game_mount.pas Normal file
View File

@ -0,0 +1,248 @@
unit game_mount;
{$mode ObjFPC}{$H+}
interface
uses
game_info;
var
g_LocalDir:RawByteString='';
procedure InitMount(GameStartupInfo:TGameStartupInfo);
implementation
uses
sysutils,
errno,
vfs_mountroot,
subr_backtrace;
function get_errno_str(err:Integer):RawByteString;
begin
case err of
EPERM :Result:='Operation not permitted';
ENOENT :Result:='No such file or directory';
EACCES :Result:='Permission denied';
EEXIST :Result:='Directory exists';
ENOTDIR:Result:='Not a directory';
else
Result:=IntToStr(err);
end;
end;
function mount_mkdir(path:PChar):Integer;
begin
Result:=vfs_mountroot.mount_mkdir(path);
if (Result<>0) then
begin
print_error_td('[mkdir error]'+#13#10+
' path:"'+path+'"'#13#10+
' err:'+get_errno_str(Result)
,True);
end;
end;
function mount_into_sandbox(fstype,fspath,from,opts:PChar;flags:QWORD;ignore:Boolean):Integer;
begin
Result:=vfs_mountroot.mount_into_sandbox(fstype,fspath,from,opts,flags);
if (Result<>0) and (not ignore) then
begin
print_error_td('[mount error]'+#13#10+
' from:"'+from+'"'#13#10+
' to:"'+fspath+'"'#13#10+
' err:'+get_errno_str(Result)
,True);
end;
end;
function unix_to_host(const name:RawByteString):RawByteString;
var
i:Integer;
begin
Result:=name;
if (DirectorySeparator<>'/') then
For i:=1 to Length(Result) do
begin
if (Result[i]='/') then
begin
Result[i]:=DirectorySeparator;
end;
end;
end;
const
MM_CREATE =-1;
MM_GAME =0;
MM_FIRMWARE=1;
MM_LOCAL =2;
MM_LAST =2;
type
t_mnt_flags=Set of (mfReadOnly,mfIgnoreErr,mfForceDir);
type
pp_mount_dir=^p_mount_dir;
p_mount_dir=^t_mount_dir;
t_mount_dir=object
dst :pchar;
src :pchar;
mode :Shortint;
flags :t_mnt_flags;
term :Boolean;
childs:p_mount_dir;
end;
t_mount_dir_iterator=object
_curr:pp_mount_dir;
stack:array[0..3] of p_mount_dir;
function curr:p_mount_dir; inline;
procedure init(dir:p_mount_dir); inline;
function next(err:Integer):Boolean; inline;
end;
function t_mount_dir_iterator.curr:p_mount_dir; inline;
begin
Result:=_curr^;
end;
procedure t_mount_dir_iterator.init(dir:p_mount_dir); inline;
begin
stack[0]:=dir;
_curr:=@stack[0];
end;
function t_mount_dir_iterator.next(err:Integer):Boolean; inline;
var
prev:p_mount_dir;
begin
if (_curr=nil) then Exit(False);
prev:=_curr^;
if (err=0) and (prev^.childs<>nil) then
begin
_curr:=_curr+1; //down
_curr^:=prev^.childs;
end else
begin
_curr^:=prev+1; //next
end;
repeat
if (_curr^^.term) then
begin
if (_curr=@stack[0]) then
begin
_curr:=nil;
Exit(False);
end else
begin
_curr :=_curr -1; //up
_curr^:=_curr^+1; //next
end;
end else
begin
Exit(True);
end;
until false;
end;
const
SYSTEM_COMMON_DIRS:array[0..12] of t_mount_dir=(
(dst:'/%s/common/cert' ;src:'%s/system/common/cert' ;mode:MM_FIRMWARE;flags:[mfReadOnly]), // CA_LIST.cer
(dst:'/%s/common/etc' ;src:'%s/system/common/etc' ;mode:MM_FIRMWARE;flags:[mfReadOnly,mfIgnoreErr]),
(dst:'/%s/common/font' ;src:'%s/preinst/common/font' ;mode:MM_FIRMWARE;flags:[mfReadOnly]), // *.ttf
(dst:'/%s/common/font2' ;src:'%s/system/common/font2' ;mode:MM_FIRMWARE;flags:[mfReadOnly]),
(dst:'/%s/common/httpcache' ;src:'%s/system_data/common/httpcache';mode:MM_LOCAL ;flags:[mfForceDir]),
(dst:'/%s/common/lib' ;src:'%s/system/common/lib' ;mode:MM_FIRMWARE;flags:[mfReadOnly]),
(dst:'/%s/common/mms' ;src:'%s/system_data/common/mms/' ;mode:MM_LOCAL ;flags:[mfForceDir]), // av_content.db
(dst:'/%s/common/mms_ro' ;src:'%s/system/common/mms_ro' ;mode:MM_FIRMWARE;flags:[mfReadOnly,mfIgnoreErr]), // template_content.db
(dst:'/%s/common/playready' ;src:'%s/user/common/playready' ;mode:MM_LOCAL ;flags:[mfReadOnly,mfForceDir ]),
(dst:'/%s/common/text_layout' ;src:'%s/system/common/text_layout' ;mode:MM_FIRMWARE;flags:[mfReadOnly,mfIgnoreErr]),
(dst:'/%s/common/text_to_speech';src:'%s/system/common/text_to_speech';mode:MM_FIRMWARE;flags:[mfReadOnly,mfIgnoreErr]),
(dst:'/%s/common/webkit' ;src:'%s/system/common/webkit' ;mode:MM_FIRMWARE;flags:[mfReadOnly,mfIgnoreErr]),
(term:True)
);
SYSTEM_DIRS:array[0..5] of t_mount_dir=(
(dst:'/%s/becore' ;src:'' ;mode:MM_CREATE ;flags:[]), // system app only
(dst:'/%s/common' ;src:'' ;mode:MM_CREATE ;flags:[];childs:@SYSTEM_COMMON_DIRS),
(dst:'/%s/common_temp';src:'' ;mode:MM_CREATE ;flags:[]),
(dst:'/%s/priv' ;src:'%s/system/priv';mode:MM_FIRMWARE;flags:[mfReadOnly]), // system app only
(dst:'/%s/sqlite' ;src:'' ;mode:MM_CREATE ;flags:[]),
(term:True)
);
SANDBOX_DIRS:array[0..7] of t_mount_dir=(
(dst:'/app0' ;src:'%s' ;mode:MM_GAME ;flags:[mfReadOnly]),
(dst:'/av_contents';src:'%s/user/av_contents';mode:MM_LOCAL ;flags:[mfForceDir]),
(dst:'/data' ;src:'%s/user/data' ;mode:MM_LOCAL ;flags:[mfForceDir]),
(dst:'/host' ;src:'' ;mode:MM_CREATE;flags:[mfReadOnly]),
(dst:'/hostapp' ;src:'' ;mode:MM_CREATE;flags:[mfReadOnly]),
(dst:'/system_tmp' ;src:'%s/system_tmp' ;mode:MM_LOCAL ;flags:[mfForceDir]),
(dst:'/%s' ;src:'' ;mode:MM_CREATE;flags:[mfReadOnly];childs:@SYSTEM_DIRS),
(term:True)
);
procedure InitMount(GameStartupInfo:TGameStartupInfo);
var
err:Integer;
fs_iterator:t_mount_dir_iterator;
fs_source:array[0..MM_LAST] of RawByteString;
fs_dst:RawByteString;
fs_src:RawByteString;
begin
//temp hack
err:=mount_into_sandbox('ufs','/savedata0','savedata',nil,0,True);
fs_source[MM_GAME ]:=ExcludeTrailingPathDelimiter(GameStartupInfo.FGameItem.FMountList.game );
fs_source[MM_FIRMWARE]:=ExcludeTrailingPathDelimiter(GameStartupInfo.FGameItem.FMountList.firmware);
fs_source[MM_LOCAL ]:=ExcludeTrailingPathDelimiter(GameStartupInfo.LocalDir);
g_LocalDir:=GameStartupInfo.LocalDir;
//--sandbox--
fs_iterator.init(@SANDBOX_DIRS);
repeat
with fs_iterator.curr^ do
begin
fs_dst:=Format(dst,['system']);
if (mode=MM_CREATE) then
begin
err:=mount_mkdir(pchar(fs_dst));
end else
begin
fs_src:=Format(unix_to_host(src),[fs_source[mode]]);
if (mfForceDir in flags) then
begin
ForceDirectories(fs_src);
end;
err:=mount_into_sandbox('ufs',pchar(fs_dst),pchar(fs_src),nil,ord(mfReadOnly in flags)*MNT_RDONLY,mfIgnoreErr in flags);
end;
end;
until (not fs_iterator.next(err));
//--sandbox--
//UPDATE: sandbox root IS NOT read-only
//err:=vfs_mount_path('ufs','/','/',nil,MNT_RDONLY or MNT_UPDATE);
end;
end.

View File

@ -16,7 +16,8 @@ uses
host_ipc,
host_ipc_interface,
md_host_ipc,
game_info;
game_info,
game_mount;
type
TGameRunConfig=record
@ -25,6 +26,7 @@ type
FConfInfo:TConfigInfo;
FGameItem:TGameItem;
FhasParamSfo:Integer;
end;
TGameProcessSimple=class(TGameProcess)
@ -39,10 +41,9 @@ function run_item(const cfg:TGameRunConfig):TGameProcess;
implementation
uses
errno,
sys_sysinit,
kern_param,
kern_exec,
vfs_mountroot,
sys_crt, //<- init writeln redirect
sys_tty,
md_exception, //<- install custom
@ -200,7 +201,7 @@ var
curr:PPChar;
begin
if (argv=nil) then Exit;
curr:=argv+1; //skip exec
curr:=argv;
while (curr^<>nil) do
begin
FreeMem(curr^);
@ -253,10 +254,9 @@ begin
Result:=1;
//init
argc:=1;
argc:=0;
argv:=AllocMem(SizeOf(Pointer)*2);
argv[0]:=nil; //exec place
argv[1]:=nil; //truncate
argv[0]:=nil; //truncate
curr:=@params[1];
last:=curr;
@ -336,11 +336,22 @@ begin
Result:=argc;
end;
function get_errno_str(err:Integer):RawByteString;
begin
case err of
EPERM :Result:='Operation not permitted';
ENOENT :Result:='No such file or directory';
EACCES :Result:='Permission denied';
EEXIST :Result:='Directory exists';
ENOTDIR:Result:='Not a directory';
else
Result:=IntToStr(err);
end;
end;
procedure prepare(GameStartupInfo:TGameStartupInfo); SysV_ABI_CDecl;
var
err:Integer;
len:Integer;
exec:array[0..PATH_MAX] of Char;
argv:PPChar;
i,argc:Integer;
Item:TGameItem;
@ -367,8 +378,8 @@ begin
Item:=GameStartupInfo.FGameItem;
g_appinfo.mmap_flags:=1; //is_big_app ???
g_appinfo.CUSANAME:=Item.FGameInfo.TitleId;
//g_appinfo.hasParamSfo:=1; TODO: check
g_appinfo.CUSANAME :=Item.FGameInfo.TitleId;
g_appinfo.hasParamSfo:=GameStartupInfo.hasParamSfo;
//g_appinfo.debug_level:=1;
g_appinfo.titleWorkaround.version:=69;
@ -383,51 +394,23 @@ begin
kern_reserve_2mb_page(0,M2MB_DEFAULT);
///
Writeln('Name :',Item.FGameInfo.Name );
Writeln('TitleId:',Item.FGameInfo.TitleId);
Writeln('Version:',Item.FGameInfo.Version);
Writeln('Exec :',Item.FGameInfo.Exec );
Writeln('Param :',Item.FGameInfo.Param );
Writeln('Name :',Item.FGameInfo.Name );
Writeln('TitleId :',Item.FGameInfo.TitleId );
Writeln('Version :',Item.FGameInfo.Version );
Writeln('AppVer :',Item.FGameInfo.AppVer );
Writeln('Exec :',Item.FGameInfo.Exec );
Writeln('app0 :',Item.FMountList.app0 );
Writeln('system :',Item.FMountList.system);
Writeln('data :',Item.FMountList.data );
Writeln('game :',Item.FMountList.game );
Writeln('firmware:',Item.FMountList.firmware );
//temp hack
err:=vfs_mount_mkdir('ufs','/savedata0' ,'savedata',nil,0);
Writeln('LocalDir:',GameStartupInfo.LocalDir );
//fs guest host
err:=vfs_mount_mkdir('ufs','/app0' ,pchar(Item.FMountList.app0 ),nil,MNT_RDONLY);
if (err<>0) then
begin
print_error_td('error mount "'+Item.FMountList.app0+'" to "/app0" code='+IntToStr(err));
end;
err:=vfs_mount_mkdir('ufs','/system',pchar(Item.FMountList.system),nil,MNT_RDONLY);
if (err<>0) then
begin
print_error_td('error mount "'+Item.FMountList.system+'" to "/system" code='+IntToStr(err));
end;
err:=vfs_mount_mkdir('ufs','/data' ,pchar(Item.FMountList.data ),nil,0);
if (err<>0) then
begin
print_error_td('error mount "'+Item.FMountList.data+'" to "/data" code='+IntToStr(err));
end;
InitMount(GameStartupInfo);
///argv
argv:=nil;
argc:=parse_params(Item.FGameInfo.Param,argv);
FillChar(exec,SizeOf(exec),0);
len:=Length(Item.FGameInfo.Exec);
if (len>PATH_MAX) then len:=PATH_MAX;
Move(pchar(Item.FGameInfo.Exec)^,exec,len);
argv[0]:=@exec;
argc:=parse_params(Item.FGameInfo.Exec,argv);
Writeln('main_thread:',HexStr(curkthread));
@ -443,19 +426,28 @@ begin
Flush(stdout);
err:=main_execve(argv[0],argv,nil);
//free data
free_params(argv);
if (argv[0]=nil) then
begin
err:=ENOENT;
end else
begin
err:=main_execve(argv[0],argv,nil);
end;
if (err=0) then
begin
//free data
free_params(argv);
//jump to code
main_switch_context;
end else
if (err<>0) then
begin
print_error_td('error execve "'+exec+'" code='+IntToStr(err));
print_error_td('[execve error]'+#13#10+
' cmd:"'+argv[0]+'"'#13#10+
' err:'+get_errno_str(err)
,False);
end;
//
@ -529,7 +521,7 @@ begin
parent:=md_pidfd_open(md_getppid);
pipefd:=GameStartupInfo.FPipe;
pipefd:=GameStartupInfo.Pipe;
pipefd:=md_pidfd_getfd(parent,pipefd);
kipc:=THostIpcPipeKERN.Create;
@ -575,12 +567,15 @@ begin
GameStartupInfo.FConfInfo:=cfg.FConfInfo;
GameStartupInfo.FGameItem:=cfg.FGameItem;
GameStartupInfo.LocalDir :=GetAppConfigDir(False);
GameStartupInfo.hasParamSfo:=cfg.FhasParamSfo;
SetStdHandle(STD_OUTPUT_HANDLE,cfg.hOutput);
SetStdHandle(STD_ERROR_HANDLE ,cfg.hError );
fork_info:=Default(t_fork_proc);
if cfg.FConfInfo.MainInfo.fork_proc then
if cfg.FConfInfo.MiscInfo.fork_proc then
begin
Result:=TGameProcessPipe.Create;
Result.g_fork:=True;

View File

@ -1,7 +1,7 @@
object frmMain: TfrmMain
Left = 334
Left = 682
Height = 343
Top = 200
Top = 344
Width = 623
Caption = 'fpPS4'
ClientHeight = 343
@ -293,4 +293,29 @@ object frmMain: TfrmMain
57E7E20D65ED54000000000000000000C8C8FF01EBADDADA
}
end
object SmallImageList: TImageList
AllocBy = 3
Left = 320
Top = 144
Bitmap = {
4C7A030000001000000010000000290200000000000078DAED93CB4B1B5114C6
071F8821A96EBA145CF40F9042ABD82E04DDB40B77FE012E2A0ABA75D5AE440A
2E9A165C145C088281C49828BED0344C7C558AF8689399D816A241F0912E9A68
20A966F279CFD4C943329371845221073EEEBD33F777CF771F0700873B48743F
782F4C94A7020E0E8A4497E94870708FF4F0C44AC97D20F52BA388BFFF3277BD
42224E74D75AA99FCBEA9594082130517E699427295E6E7E3FDE7A05C159A1ED
DF59C95475ADCABC7F419705527409385F5195F47B81F92F93457DB579E9331E
91DD2EFC98AD933D517BBAD3C9D6F764FD6BB021EF6384575F2219139096FEB0
3680C38D0E843E3514E5292FB114F1080F765F724B115E7991D9B71A4F5E292F
317BD30FE5B9D4D23819F5B37766D6E4697DF21C110719E393E7524BE3B494A4
FB67EFA82CA5767E7FF307A0849CEB3A12D16F2CBF85EDC96CA535D4EE38BCD6
9E61BECFD567FAFB7C0B8293E675ADDAF8ECE0AA597D6D1FF8DAE2B45FDA0BE5
3DF0B5C683EE9A4D9EE72A8AD517CD11274D6F44B7E544AE1997E5988D5F2BEC
FF1AB69EA6D878D7933489FAB7E589C3CF3576E8CBA0BE213EE8058425E3BC7F
1EF83AA38BCFDD2FC9DEF7FC023B53C09613F6DE6717B9FF6C3D8D31AD7C0A87
4D3BF0651CD81803D64781D51160F963413F325F84033F0C783F14E4C9539E7F
E659E1ECBDCDF9FEBB1B63BACE4F239F2EDEF30E581C32CE2FBC05E6060CF1B6
EEA7D9F7CBFA5C294A718BFAD7D27DA87F4DFF3AEABF14FF26AE007B18885F
}
end
end

View File

@ -30,6 +30,9 @@ uses
cfg_edit,
game_run,
param_sfo_gui,
playgo_chunk_gui,
host_ipc_interface;
type
@ -77,6 +80,7 @@ type
TfrmMain = class(TForm)
MainImageList: TImageList;
SmallImageList: TImageList;
MIFind: TMenuItem;
MIShowExplorer: TMenuItem;
MIDevide3: TMenuItem;
@ -132,6 +136,7 @@ type
FGameList :TGameList;
FGameProcess:TGameProcess;
FGameItem :TGameItem;
FParamSfo :TParamSfoFile;
FConfigInfo:TConfigInfo;
@ -183,8 +188,6 @@ var
implementation
uses
param_sfo_gui,
playgo_chunk_gui,
game_find,
@ -491,6 +494,15 @@ begin
end;
end;
function LoadParamSfoFile2(const game:RawByteString):TParamSfoFile;
begin
Result:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(game)+
DirectorySeparator+
'sce_sys'+
DirectorySeparator+
'param.sfo');
end;
function TfrmMain.OnParamSfoInit(mlen:DWORD;buf:Pointer):Ptruint; //PARAM_SFO_INIT
var
ParamSfo:TParamSfoFile;
@ -500,13 +512,14 @@ begin
if (FGameItem=nil) then Exit;
V:=FGameItem.MountList.app0;
ParamSfo:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(V)+
DirectorySeparator+
'sce_sys'+
DirectorySeparator+
'param.sfo');
if (FParamSfo=nil) then
begin
ParamSfo:=LoadParamSfoFile2(FGameItem.MountList.game);
FParamSfo:=ParamSfo;
end else
begin
ParamSfo:=FParamSfo;
end;
if (ParamSfo=nil) then
begin
@ -540,7 +553,7 @@ begin
if (FGameItem=nil) then Exit;
V:=FGameItem.MountList.app0;
V:=FGameItem.MountList.game;
playgo_file:=LoadPlaygoFile(ExcludeTrailingPathDelimiter(V)+
DirectorySeparator+
@ -646,8 +659,7 @@ begin
Item:=TGameItem.Create;
FGameItem.CopyTo(Item);
Item.GameInfo.Exec :=data.Path;
Item.GameInfo.Param:=encode_shell(data.argv);
Item.GameInfo.Exec:=encode_shell(data.Path)+' '+encode_shell(data.argv);
cfg.hOutput:=FAddHandle;
cfg.hError :=FAddHandle;
@ -717,7 +729,7 @@ begin
//
FGrid.Cells[0,i]:=Item.FGameInfo.Name;
FGrid.Cells[1,i]:=Item.FGameInfo.TitleId;
FGrid.Cells[2,i]:=Item.FGameInfo.Version;
FGrid.Cells[2,i]:=Item.FGameInfo.AppVer;
//
FGrid.Objects[0,i]:=Item;
end;
@ -734,7 +746,7 @@ begin
//
FGrid.Cells[0,i]:=Item.FGameInfo.Name;
FGrid.Cells[1,i]:=Item.FGameInfo.TitleId;
FGrid.Cells[2,i]:=Item.FGameInfo.Version;
FGrid.Cells[2,i]:=Item.FGameInfo.AppVer;
//
FGrid.Objects[0,i]:=Item;
//
@ -752,7 +764,7 @@ begin
//
FGrid.Cells[0,i]:=Item.FGameInfo.Name;
FGrid.Cells[1,i]:=Item.FGameInfo.TitleId;
FGrid.Cells[2,i]:=Item.FGameInfo.Version;
FGrid.Cells[2,i]:=Item.FGameInfo.AppVer;
end;
procedure TGameList.UpdateItem(Item:TGameItem);
@ -764,7 +776,7 @@ begin
//
FGrid.Cells[0,i]:=Item.FGameInfo.Name;
FGrid.Cells[1,i]:=Item.FGameInfo.TitleId;
FGrid.Cells[2,i]:=Item.FGameInfo.Version;
FGrid.Cells[2,i]:=Item.FGameInfo.AppVer;
end;
procedure TGameList.DelItem(Item:TGameItem);
@ -1163,7 +1175,7 @@ begin
TITLE :=FGameItem.FGameInfo.Name;
TITLE_ID:=FGameItem.FGameInfo.TitleId;
APP_VER :=FGameItem.FGameInfo.Version;
APP_VER :=FGameItem.FGameInfo.AppVer;
if (TITLE='') then
begin
@ -1241,10 +1253,10 @@ var
begin
form:=TfrmGameEditor.Create(Self);
form.Item:=TGameItem.Create;
form.FConfigInfo:=FConfigInfo;
form.FItem :=TGameItem.Create;
form.Item.FMountList.system:=FConfigInfo.MainInfo.system;
form.Item.FMountList.data :=FConfigInfo.MainInfo.data;
form.FItem.FMountList.firmware:=FConfigInfo.MainInfo.DefaultFirmware;
form.OnSave:=@Self.DoAdd;
@ -1270,12 +1282,12 @@ begin
begin
form:=TfrmGameEditor.Create(Self);
form.Item:=TGameItem.Create;
form.FConfigInfo:=FConfigInfo;
form.FItem :=TGameItem.Create;
form.Item.FMountList.system:=FConfigInfo.MainInfo.system;
form.Item.FMountList.data :=FConfigInfo.MainInfo.data;
form.FItem.FMountList.firmware:=FConfigInfo.MainInfo.DefaultFirmware;
form.Item.FMountList.app0:=d.FileName;
form.FItem.FMountList.game:=d.FileName;
form.OnSave:=@Self.DoAdd;
@ -1304,13 +1316,14 @@ begin
form:=TfrmGameEditor.Create(Self);
form.Item:=Item;
form.FConfigInfo:=FConfigInfo;
form.FItem:=Item;
Item.FLock:=True;
form.OnSave:=@Self.DoEdit;
form.FormInit(False);
form.FormInit(True);
end;
procedure TfrmMain.TBConfigClick(Sender: TObject);
@ -1376,10 +1389,10 @@ begin
if Length(S)<Length(Item.GameInfo.Exec) then
begin
S:=IncludeTrailingPathDelimiter(Item.MountList.app0)+ExtractFilePath(S);
S:=IncludeTrailingPathDelimiter(Item.MountList.game)+ExtractFilePath(S);
end else
begin
S:=Item.MountList.app0;
S:=Item.MountList.game;
end;
OpenDocument(S);
@ -1388,6 +1401,7 @@ end;
procedure TfrmMain.MIRunClick(Sender: TObject);
var
Item:TGameItem;
ParamSfo:TParamSfoFile;
aRow:Integer;
cfg:TGameRunConfig;
begin
@ -1400,6 +1414,8 @@ begin
Item:=FGameList.GetItemRow(aRow);
ParamSfo:=LoadParamSfoFile2(Item.MountList.game);
LogEnd;
ClearLog;
@ -1410,6 +1426,7 @@ begin
cfg.FConfInfo:=FConfigInfo;
cfg.FGameItem:=Item;
cfg.FhasParamSfo:=ord(ParamSfo<>nil);
if Item.FLock then Exit;
@ -1419,6 +1436,8 @@ begin
begin
Item.FLock:=True;
FGameItem:=Item;
FParamSfo:=ParamSfo;
ParamSfo:=nil;
SetButtonsState(mdsStarted);
@ -1427,6 +1446,8 @@ begin
FGameProcess.g_ipc.FHandler:=IpcHandler;
end;
end;
FreeAndNil(ParamSfo);
end;
procedure TfrmMain.TBPlayClick(Sender: TObject);
@ -1487,6 +1508,7 @@ begin
FGameItem.FLock:=False;
FGameItem:=nil;
end;
FreeAndNil(FParamSfo);
//
CloseMainWindows;
//
@ -1577,9 +1599,9 @@ var
begin
form:=TfrmGameEditor(Sender);
Item:=form.Item;
Item:=form.FItem;
form.Item:=nil;
form.FItem:=nil;
FGameList.InsertItem(Item);
//
@ -1593,11 +1615,11 @@ var
begin
form:=TfrmGameEditor(Sender);
Item:=form.Item;
Item:=form.FItem;
Item.FLock:=False;
form.Item:=nil;
form.FItem:=nil;
FGameList.UpdateItem(Item);
//

BIN
icons/Add_04_16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

BIN
icons/Folder_19_16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

BIN
icons/Remove_01_16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

View File

@ -26,7 +26,7 @@ function exec_copyin_args(args:p_image_args;
argv:ppchar;
envv:ppchar):Integer;
function kern_execve(td:p_kthread;args:p_image_args):Integer;
function kern_execve(td:p_kthread;args:p_image_args;mode:Integer=0):Integer;
function main_execve(fname:pchar;argv,envv:ppchar):Integer;
procedure main_switch_context;
function sys_execve(fname:pchar;argv,envv:ppchar):Integer;
@ -1478,7 +1478,7 @@ end;
const
fexecv_proc_title='(fexecv)';
function do_execve(td:p_kthread;args:p_image_args):Integer;
function do_execve(td:p_kthread;args:p_image_args;mode:Integer):Integer;
label
_fullpath,
exec_fail,
@ -1813,9 +1813,9 @@ done2:
VFS_UNLOCK_GIANT(vfslocked);
if (error<>0) then
if (error<>0) and (mode=0) then
begin
print_error_td('error execve "'+args^.fname+'" code='+IntToStr(error));
print_error_td('error execve "'+args^.fname+'" code='+IntToStr(error),True);
exec_free_args(args);
@ -1829,7 +1829,7 @@ done2:
Exit(error);
end;
function kern_execve(td:p_kthread;args:p_image_args):Integer;
function kern_execve(td:p_kthread;args:p_image_args;mode:Integer=0):Integer;
var
error:Integer;
begin
@ -1837,7 +1837,7 @@ begin
Assert((td^.td_pflags and TDP_EXECVMSPC)=0,'nested execve');
error:=do_execve(td, args);
error:=do_execve(td, args, mode);
if ((td^.td_pflags and TDP_EXECVMSPC)<>0) then
begin
@ -1857,7 +1857,7 @@ begin
if (error=0) then
begin
error:=kern_execve(curkthread, @args);
error:=kern_execve(curkthread, @args, 1);
end;
Result:=(error);

View File

@ -13,7 +13,7 @@ procedure print_frame(var f:text;frame:Pointer);
procedure print_backtrace(var f:text;rip,rbp:Pointer;skipframes:sizeint);
procedure print_backtrace_td(var f:text);
procedure print_error_td(const str:shortstring);
procedure print_error_td(const str:shortstring;resumable:Boolean=False);
implementation
@ -315,14 +315,19 @@ begin
print_backtrace(stderr,Pointer(td^.td_frame.tf_rip),Pointer(td^.td_frame.tf_rbp),0);
end;
procedure print_error_td(const str:shortstring);
procedure print_error_td(const str:shortstring;resumable:Boolean=False);
begin
thread_suspend_all(p_host_ipc_td);
Writeln(StdErr,str);
print_backtrace_td(StdErr);
p_host_ipc.error(str);
print_backtrace_td(StdErr);
if resumable then
begin
thread_resume_all(p_host_ipc_td);
end;
end;
end.

View File

@ -92,10 +92,10 @@ function vfs_donmount(fsflags:QWORD;fsoptions:p_uio):Integer;
function dounmount(mp:p_mount;flags:Integer):Integer;
function mount_argb(ma:p_mntarg;flag:Integer;name:PChar):p_mntarg;
function mount_argf(ma:p_mntarg;name,fmt:PChar;const Args:Array of const):p_mntarg; register;
function mount_argb (ma:p_mntarg;flag:Integer;name:PChar):p_mntarg;
function mount_argf (ma:p_mntarg;name,fmt:PChar;const Args:Array of const):p_mntarg; register;
function mount_argsu(ma:p_mntarg;name:PChar;val:Pointer;len:Integer):p_mntarg;
function mount_arg(ma:p_mntarg;name:PChar;val:Pointer;len:Integer):p_mntarg;
function mount_arg (ma:p_mntarg;name:PChar;val:Pointer;len:Integer):p_mntarg;
procedure free_mntarg(ma:p_mntarg);
function kernel_nmount(ma:p_mntarg;flags:QWORD):Integer;
@ -1028,6 +1028,7 @@ begin
vput(vp);
Exit(EINVAL);
end;
mp:=vp^.v_mount;
{
* We only allow the filesystem to be reloaded if it
@ -1050,11 +1051,13 @@ begin
vput(vp);
Exit(error);
end;
if (vfs_busy(mp, MBF_NOWAIT)<>0) then
begin
vput(vp);
Exit(EBUSY);
end;
VI_LOCK(vp);
if ((vp^.v_iflag and VI_MOUNT)<>0) or (vp^.v_mountedhere<>nil) then
begin
@ -1063,19 +1066,27 @@ begin
vput(vp);
Exit(EBUSY);
end;
vp^.v_iflag:=vp^.v_iflag or VI_MOUNT;
VI_UNLOCK(vp);
VOP_UNLOCK(vp, 0);
MNT_ILOCK(mp);
mp^.mnt_flag:=mp^.mnt_flag and (not MNT_UPDATEMASK);
mp^.mnt_flag:=(mp^.mnt_flag or fsflags) and (MNT_RELOAD or MNT_FORCE or MNT_UPDATE or
MNT_SNAPSHOT or MNT_ROOTFS or MNT_UPDATEMASK or MNT_RDONLY);
mp^.mnt_flag:=(mp^.mnt_flag or fsflags) and
(MNT_RELOAD or
MNT_FORCE or
MNT_UPDATE or
MNT_SNAPSHOT or
MNT_ROOTFS or
MNT_UPDATEMASK or
MNT_RDONLY);
if ((mp^.mnt_flag and MNT_ASYNC)=0) then
begin
mp^.mnt_kern_flag:=mp^.mnt_kern_flag and (not MNTK_ASYNC);
end;
MNT_IUNLOCK(mp);
mp^.mnt_optnew:=optlist^;
vfs_mergeopts(mp^.mnt_optnew, mp^.mnt_opt);
@ -1143,6 +1154,7 @@ begin
begin
vfs_freeopts(mp^.mnt_opt);
end;
mp^.mnt_opt:=mp^.mnt_optnew;
optlist^:=nil;
VFS_STATFS(mp, @mp^.mnt_stat);
@ -1224,6 +1236,7 @@ begin
NDFREE(@nd, NDF_ONLY_PNBUF);
vp:=nd.ni_vp;
if ((fsflags and MNT_UPDATE)=0) then
begin
pathbuf:=Default(t_mname);

View File

@ -11,11 +11,14 @@ uses
const
MNT_RDONLY=vmount.MNT_RDONLY;
MNT_UPDATE=vmount.MNT_UPDATE;
procedure vfs_mountroot();
function vfs_mount_path (fstype,fspath,from,opts:PChar;flags:QWORD):Integer;
function vfs_mount_mkdir (fstype,fspath,from,opts:PChar;flags:QWORD):Integer;
function vfs_unmount_rmdir(path:PChar;flags:Integer):Integer;
function vfs_mount_path (fstype,fspath,from,opts:PChar;flags:QWORD):Integer;
function mount_mkdir (path:PChar):Integer;
function mount_rmdir (path:PChar):Integer;
function mount_into_sandbox (fstype,fspath,from,opts:PChar;flags:QWORD):Integer;
function unmount_from_sandbox(path:PChar;flags:Integer):Integer;
implementation
@ -357,16 +360,26 @@ begin
Result:=kernel_nmount(ma,flags);
end;
function vfs_mount_mkdir(fstype,fspath,from,opts:PChar;flags:QWORD):Integer;
function mount_mkdir(path:PChar):Integer;
begin
Result:=kern_mkdir(path,UIO_SYSSPACE,&777);
end;
function mount_rmdir(path:PChar):Integer;
begin
Result:=kern_rmdir(path,UIO_SYSSPACE);
end;
function mount_into_sandbox(fstype,fspath,from,opts:PChar;flags:QWORD):Integer;
begin
Result:=kern_mkdir(fspath,UIO_SYSSPACE,&777);
if (Result=0) then
if (Result=0) or (Result=EEXIST) then
begin
Result:=vfs_mount_path(fstype,fspath,from,opts,flags);
end;
end;
function vfs_unmount_rmdir(path:PChar;flags:Integer):Integer;
function unmount_from_sandbox(path:PChar;flags:Integer):Integer;
begin
Result:=kern_unmount(path,flags);
if (Result=0) then