diff --git a/fpPS4.lpi b/fpPS4.lpi index 2c81f3bb..87920e18 100644 --- a/fpPS4.lpi +++ b/fpPS4.lpi @@ -1486,6 +1486,15 @@ + + + + + + + + + diff --git a/gui/cfg_edit.lfm b/gui/cfg_edit.lfm index 344ce4e0..e908bfb1 100644 --- a/gui/cfg_edit.lfm +++ b/gui/cfg_edit.lfm @@ -1,7 +1,7 @@ object frmCfgEditor: TfrmCfgEditor - Left = 473 + Left = 422 Height = 319 - Top = 205 + Top = 234 Width = 400 Caption = 'Config Editor' ClientHeight = 319 @@ -543,7 +543,7 @@ object frmCfgEditor: TfrmCfgEditor Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 BorderSpacing.Bottom = 10 - Caption = 'ok' + Caption = 'OK' TabOrder = 1 OnClick = BtnOkClick end diff --git a/gui/game_edit.lfm b/gui/game_edit.lfm index 28e58894..01c646b6 100644 --- a/gui/game_edit.lfm +++ b/gui/game_edit.lfm @@ -1,14 +1,14 @@ object frmGameEditor: TfrmGameEditor - Left = 632 + Left = 497 Height = 319 - Top = 214 + Top = 119 Width = 397 Caption = 'Game editor' ClientHeight = 319 ClientWidth = 397 OnClose = FormClose Position = poMainFormCenter - LCLVersion = '3.4.0.0' + LCLVersion = '3.6.0.0' object EditPages: TPageControl AnchorSideBottom.Control = BtnOk Left = 0 @@ -108,7 +108,7 @@ object frmGameEditor: TfrmGameEditor Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 BorderSpacing.Bottom = 10 - Caption = 'ok' + Caption = 'OK' TabOrder = 1 OnClick = BtnOkClick end diff --git a/gui/game_info.pas b/gui/game_info.pas index 81f0fd76..00a975cf 100644 --- a/gui/game_info.pas +++ b/gui/game_info.pas @@ -383,8 +383,9 @@ begin tkAString:S:=S+'"'+StringToJSONString(value.AsString,False)+'"'; tkInteger:S:=S+IntToStr(value.AsInteger); + tkQWord :S:=S+IntToStr(value.AsUInt64); - tkBool:S:=S+BoolToStr(value.AsBoolean,'true','false'); + tkBool :S:=S+BoolToStr(value.AsBoolean,'true','false'); else Assert(False); @@ -633,8 +634,9 @@ begin tkAString:Stream.WriteAnsiString(p.GetValue(Self).AsString); tkInteger:Stream.WriteDWord(p.GetValue(Self).AsInteger); + tkQWord :Stream.WriteQWord(p.GetValue(Self).AsInteger); - tkBool:Stream.WriteByte(Byte(p.GetValue(Self).AsBoolean)); + tkBool :Stream.WriteByte(Byte(p.GetValue(Self).AsBoolean)); tkClass: begin @@ -673,13 +675,15 @@ begin TypeKind:=p.PropertyType.TypeKind; case TypeKind of + tkSString, tkLString, tkAString:p.SetValue(Self,Stream.ReadAnsiString); tkInteger:p.SetValue(Self,Integer(Stream.ReadDWord)); + tkQWord :p.SetValue(Self,QWord (Stream.ReadQWord)); - tkBool:p.SetValue(Self,Boolean(Stream.ReadByte)); + tkBool :p.SetValue(Self,Boolean(Stream.ReadByte)); tkClass: begin @@ -727,6 +731,7 @@ begin tkLString, tkAString, tkInteger, + tkQWord , tkBool :p.SetValue(dst,p.GetValue(Self)); tkClass: @@ -855,6 +860,7 @@ begin tkLString, tkAString, tkInteger, + tkQWord , tkBool :Stream.WriteValue(p.Name,p.GetValue(Self)); tkClass: @@ -882,13 +888,101 @@ begin end; Procedure TAbstractArray.Serialize(Stream:TStream); +var + i,c:SizeInt; + V:TValue; + obj:TObject; begin - Assert(false); + c:=GetArrayCount; + + Stream.WriteQWord(c); //Size Header + + if (c<>0) then + For i:=0 to c-1 do + begin + V:=GetArrayItem(i); + + Stream.WriteDWord(DWORD(V.Kind)); //Type Header + + case V.Kind of + + tkSString, + tkLString, + tkAString:Stream.WriteAnsiString(V.AsString); + + tkInteger:Stream.WriteDWord(V.AsInteger); + tkQWord :Stream.WriteQWord(V.AsUInt64); + + tkBool :Stream.WriteByte(Byte(V.AsBoolean)); + + tkClass: + begin + //Use Class Header? + obj:=V.AsObject; + + if (obj<>nil) then + if obj.InheritsFrom(TAbstractObject) then + begin + TAbstractObject(obj).Serialize(Stream); + end; + end; + + else + Assert(false); + end; + + end; end; Procedure TAbstractArray.Deserialize(Stream:TStream); +var + i,c:SizeInt; + Kind:TTypeKind; + V:TValue; + obj:TObject; begin - Assert(false); + c:=Stream.ReadQWord; //Size Header + + if (c<>0) then + For i:=0 to c-1 do + begin + V:=Default(TValue); + + Kind:=TTypeKind(Stream.ReadDWord); //Type Header + + case Kind of + + tkSString, + tkLString, + tkAString:V:=Stream.ReadAnsiString; + + tkInteger:V:=Integer(Stream.ReadDWord); + tkQWord :V:=QWord (Stream.ReadQWord); + + tkBool :V:=Boolean(Stream.ReadByte); + + tkClass: + begin + //Use Class Header? + V:=AddObject; + + obj:=V.AsObject; + + if (obj<>nil) then + if obj.InheritsFrom(TAbstractObject) then + begin + TAbstractObject(obj).Deserialize(Stream); + end; + end; + + else + Assert(false); + end; + + //save + AddValue(V); + end; + end; Procedure TAbstractArray.CopyTo(dst:TAbstractObject); @@ -916,6 +1010,7 @@ begin tkLString, tkAString, tkInteger, + tkQWord , tkBool :Stream.WriteValue('',V); tkClass: diff --git a/gui/game_run.pas b/gui/game_run.pas index 82073c34..f7fc37ae 100644 --- a/gui/game_run.pas +++ b/gui/game_run.pas @@ -8,11 +8,13 @@ uses windows, Classes, SysUtils, + CharStream, Dialogs, kern_thr, md_sleep, md_pipe, host_ipc, + host_ipc_interface, md_host_ipc, game_info; @@ -262,25 +264,6 @@ begin end; -type - TPCharStream=class(TCustomMemoryStream) - public - constructor Create(P:PChar;len:SizeUint); virtual; overload; - procedure SetNew(P:PChar;len:SizeUint); - end; - -constructor TPCharStream.Create(P:PChar;len:SizeUint); -begin - inherited Create; - SetPointer(P,len); -end; - -procedure TPCharStream.SetNew(P:PChar;len:SizeUint); -begin - SetPosition(0); - SetPointer(P,len); -end; - procedure fork_process(data:Pointer;size:QWORD); SysV_ABI_CDecl; var td:p_kthread; @@ -314,7 +297,9 @@ begin kipc:=THostIpcPipeKERN.Create; kipc.set_pipe(pipefd); - p_host_ipc:=kipc; + p_host_ipc :=kipc; + p_host_handler:=THostIpcHandler.Create; + p_host_ipc .FHandler:=p_host_handler; td:=nil; r:=kthread_add(@prepare,GameStartupInfo,@td,0,'[main]'); @@ -407,7 +392,9 @@ begin g_ipc:=s_mgui_ipc; - p_host_ipc:=s_kern_ipc; + p_host_ipc :=s_kern_ipc; + p_host_handler:=THostIpcHandler.Create; + p_host_ipc .FHandler:=p_host_handler; Ftd:=nil; r:=kthread_add(@prepare,GameStartupInfo,@Ftd,0,'[main]'); diff --git a/gui/main.pas b/gui/main.pas index 4d9c89e9..ccc5b9f6 100644 --- a/gui/main.pas +++ b/gui/main.pas @@ -147,10 +147,11 @@ type FGameMainForm:TGameMainForm; - function OnKevent (mlen:DWORD;buf:Pointer):Ptruint; //KEV_EVENT - function OnMainWindows(mlen:DWORD;buf:Pointer):Ptruint; //MAIN_WINDOWS - function OnCaptionFPS (mlen:DWORD;buf:Pointer):Ptruint; //CAPTION_FPS - function OnError (mlen:DWORD;buf:Pointer):Ptruint; //ERROR + function OnKevent (mlen:DWORD;buf:Pointer):Ptruint; //KEV_EVENT + function OnMainWindows (mlen:DWORD;buf:Pointer):Ptruint; //MAIN_WINDOWS + function OnCaptionFPS (mlen:DWORD;buf:Pointer):Ptruint; //CAPTION_FPS + function OnError (mlen:DWORD;buf:Pointer):Ptruint; //ERROR + function OnParamSfoInit(mlen:DWORD;buf:Pointer):Ptruint; //PARAM_SFO_INIT function get_caption_format:RawByteString; function OpenMainWindows():THandle; @@ -177,6 +178,8 @@ var implementation uses + param_sfo_gui, + game_find, windows, @@ -396,6 +399,51 @@ begin end; end; +function TfrmMain.OnParamSfoInit(mlen:DWORD;buf:Pointer):Ptruint; //PARAM_SFO_INIT +var + ParamSfo:TParamSfoFile; + mem:TMemoryStream; + V:RawByteString; +begin + Result:=Ptruint(-1); + + if (FGameItem=nil) then Exit; + + V:=FGameItem.MountList.app0; + + ParamSfo:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(V)+ + DirectorySeparator+ + 'sce_sys'+ + DirectorySeparator+ + 'param.sfo'); + + if (ParamSfo=nil) then + begin + V:='"{$GAME}/sce_sys/param.sfo" not found, continue?'; + + if (MessageDlgEx(V,mtError,[mbOK,mbAbort],Self)=mrOK) then + begin + Exit(0); + end else + begin + Exit(Ptruint(-1)); + end; + end; + + if (FGameProcess<>nil) then + if (FGameProcess.g_ipc<>nil) then + begin + mem:=TMemoryStream.Create; + ParamSfo.Serialize(mem); + FreeAndNil(ParamSfo); + + FGameProcess.g_ipc.SendSync(HashIpcStr('PARAM_SFO_LOAD'),mem.Size,mem.Memory); + end; + + FreeAndNil(ParamSfo); + Result:=0; +end; + //ShowMessage(GetEnumName(TypeInfo(mtype),ord(mtype))); var @@ -675,10 +723,11 @@ var begin IpcHandler:=THostIpcHandler.Create; - IpcHandler.AddCallback('KEV_EVENT' ,@OnKevent ); - IpcHandler.AddCallback('MAIN_WINDOWS',@OnMainWindows); - IpcHandler.AddCallback('CAPTION_FPS' ,@OnCaptionFPS ); - IpcHandler.AddCallback('ERROR' ,@OnError ); + IpcHandler.AddCallback('KEV_EVENT' ,@OnKevent ); + IpcHandler.AddCallback('MAIN_WINDOWS' ,@OnMainWindows ); + IpcHandler.AddCallback('CAPTION_FPS' ,@OnCaptionFPS ); + IpcHandler.AddCallback('ERROR' ,@OnError ); + IpcHandler.AddCallback('PARAM_SFO_INIT',@OnParamSfoInit); ReadConfigFile; diff --git a/gui/param_sfo_gui.pas b/gui/param_sfo_gui.pas index 2c776863..5aed477d 100644 --- a/gui/param_sfo_gui.pas +++ b/gui/param_sfo_gui.pas @@ -5,7 +5,9 @@ unit param_sfo_gui; interface uses - sysutils; + sysutils, + rtti, + game_info; const //sfo_value_format @@ -38,17 +40,33 @@ type // - TParamSfoValue=packed object - format:ptruint; - name,value:RawByteString; - Function GetString:RawByteString; - Function GetUInt :DWORD; + TParamSfoValue=class(TAbstractObject) + private + Fformat:ptruint; + Fname :RawByteString; + Fvalue :RawByteString; + published + property format:ptruint read Fformat write Fformat; + property name :RawByteString read Fname write Fname; + property value :RawByteString read Fvalue write Fvalue; + public + Function GetString:RawByteString; + Function GetUInt :DWORD; end; - TParamSfoFile=class + TParamSfoFile=class(TAbstractArray) params:array of TParamSfoValue; - Function GetString(const name:RawByteString):RawByteString; - Function GetUInt (const name:RawByteString):DWORD; + // + Destructor Destroy; override; + // + Function GetString(const name:RawByteString):RawByteString; + Function GetUInt (const name:RawByteString):DWORD; + // + Function GetArrayCount:SizeInt; override; + Function GetArrayItem(i:SizeInt):TValue; override; + Function AddObject:TAbstractObject; override; + Function AddArray :TAbstractArray; override; + procedure AddValue(Value:TValue); override; end; function LoadParamSfoFile(const path:RawByteString):TParamSfoFile; @@ -159,6 +177,7 @@ begin SetLength(value,size); Move(PChar(value_table+entry_table[i].value_offset)^,PChar(value)^,size); + Result.params[i]:=TParamSfoValue.Create; Result.params[i].format:=entry_table[i].format; Result.params[i].name :=name; Result.params[i].value :=value; @@ -213,6 +232,19 @@ begin end; end; +Destructor TParamSfoFile.Destroy; +var + i:Integer; +begin + if (Length(params)=0) then Exit; + For i:=0 to High(params) do + begin + FreeAndNil(params[i]); + end; + SetLength(params,0); + inherited; +end; + Function TParamSfoFile.GetString(const name:RawByteString):RawByteString; var i:Integer; @@ -247,6 +279,38 @@ begin end; end; +////// + +Function TParamSfoFile.GetArrayCount:SizeInt; +begin + Result:=Length(params); +end; + +Function TParamSfoFile.GetArrayItem(i:SizeInt):TValue; +begin + if (i>=Length(params)) then + begin + Result:=TValue.Empty; + end else + begin + Result:=params[i]; + end; +end; + +Function TParamSfoFile.AddObject:TAbstractObject; +begin + Result:=TParamSfoValue.Create; +end; + +Function TParamSfoFile.AddArray:TAbstractArray; +begin + Result:=nil; +end; + +procedure TParamSfoFile.AddValue(Value:TValue); +begin + Insert(Value.AsObject,params,Length(params)); +end; end. diff --git a/rtl/charstream.pas b/rtl/charstream.pas new file mode 100644 index 00000000..7bd6fbbd --- /dev/null +++ b/rtl/charstream.pas @@ -0,0 +1,32 @@ +unit CharStream; + +{$mode ObjFPC}{$H+} + +interface + +uses + Classes; + +type + TPCharStream=class(TCustomMemoryStream) + public + constructor Create(P:PChar;len:SizeUint); virtual; overload; + procedure SetNew(P:PChar;len:SizeUint); + end; + +implementation + +constructor TPCharStream.Create(P:PChar;len:SizeUint); +begin + inherited Create; + SetPointer(P,len); +end; + +procedure TPCharStream.SetNew(P:PChar;len:SizeUint); +begin + SetPosition(0); + SetPointer(P,len); +end; + +end. + diff --git a/src/param_sfo_ipc.pas b/src/param_sfo_ipc.pas new file mode 100644 index 00000000..f0355f66 --- /dev/null +++ b/src/param_sfo_ipc.pas @@ -0,0 +1,96 @@ +unit param_sfo_ipc; + +{$mode ObjFPC}{$H+} + +interface + +procedure init_param_sfo; +function ParamSfoGetString(const name:RawByteString):RawByteString; +function ParamSfoGetUInt (const name:RawByteString):DWORD; + +implementation + +uses + SysUtils, + CharStream, + atomic, + sys_bootparam, + host_ipc_interface, + param_sfo_gui, + kern_rwlock; + +var + param_sfo_lock :Pointer=nil; + param_sfo_lazy_init:Integer=0; + param_sfo_file :TParamSfoFile=nil; + +type + TParamSfoLoaderIpc=object + function OnLoad(mlen:DWORD;buf:Pointer):Ptruint; + end; + +function TParamSfoLoaderIpc.OnLoad(mlen:DWORD;buf:Pointer):Ptruint; +var + mem:TPCharStream; +begin + Result:=0; + + Writeln('PARAM_SFO_LOAD'); + + mem:=TPCharStream.Create(buf,mlen); + + param_sfo_file:=TParamSfoFile.Create; + param_sfo_file.Deserialize(mem); + + mem.Free; +end; + +procedure init_param_sfo; +var + Loader:TParamSfoLoaderIpc; + err:Integer; +begin + if( param_sfo_lazy_init=2) then Exit; + + if CAS(param_sfo_lazy_init,0,1) then + begin + rw_wlock(param_sfo_lock); + + p_host_handler.AddCallback('PARAM_SFO_LOAD',@Loader.OnLoad); + + err:=p_host_ipc.SendSync(HashIpcStr('PARAM_SFO_INIT'),0,nil); + + if (err<>0) then + begin + Assert(false,'PARAM_SFO_INIT error='+IntToStr(err)); + end; + + param_sfo_lazy_init:=2; + rw_wunlock(param_sfo_lock); + end else + begin + //sunc + rw_wlock (param_sfo_lock); + rw_wunlock(param_sfo_lock); + end; +end; + +function ParamSfoGetString(const name:RawByteString):RawByteString; +begin + init_param_sfo; + rw_rlock(param_sfo_lock); + Result:=param_sfo_file.GetString(name); + rw_runlock(param_sfo_lock); +end; + +function ParamSfoGetUInt(const name:RawByteString):DWORD; +begin + init_param_sfo; + rw_rlock(param_sfo_lock); + Result:=param_sfo_file.GetUInt(name); + rw_runlock(param_sfo_lock); +end; + + +end. + diff --git a/src/ps4_libsceappcontent.pas b/src/ps4_libsceappcontent.pas index 01812ddb..1112058f 100644 --- a/src/ps4_libsceappcontent.pas +++ b/src/ps4_libsceappcontent.pas @@ -10,6 +10,9 @@ uses implementation +uses + param_sfo_ipc; + { uses sys_path, @@ -85,6 +88,8 @@ function ps4_sceAppContentInitialize(initParam:PSceAppContentInitParam;bootParam begin Writeln('sceAppContentInitialize'); + param_sfo_ipc.init_param_sfo; + Result:=0; end; @@ -94,12 +99,10 @@ begin if (value=nil) then Exit(SCE_APP_CONTENT_ERROR_PARAMETER); Case SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG of SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG :value^:=SCE_APP_CONTENT_APPPARAM_SKU_FLAG_FULL; - { - SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_1'); - SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_2:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_2'); - SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_3:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_3'); - SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_4'); - } + SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_1'); + SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_2:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_2'); + SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_3:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_3'); + SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_4'); else Result:=SCE_APP_CONTENT_ERROR_PARAMETER; end; @@ -135,6 +138,7 @@ begin Result:=FormatTmpPath(PChar(mountPoint)); _sig_unlock; } + Result:=-1; end; function ps4_sceAppContentTemporaryDataMount(mountPoint:pSceAppContentMountPoint):Integer; @@ -144,6 +148,7 @@ begin Result:=FetchTmpMount(PChar(mountPoint),SCE_APP_CONTENT_TEMPORARY_DATA_OPTION_FORMAT); _sig_unlock; } + Result:=-1; end; function ps4_sceAppContentTemporaryDataMount2(option:DWORD;mountPoint:pSceAppContentMountPoint):Integer; @@ -153,6 +158,7 @@ begin Result:=FetchTmpMount(PChar(mountPoint),option); _sig_unlock; } + Result:=-1; end; function ps4_sceAppContentTemporaryDataUnmount(mountPoint:pSceAppContentMountPoint):Integer; @@ -162,6 +168,7 @@ begin Result:=UnMountTmpPath(PChar(mountPoint)); _sig_unlock; } + Result:=-1; end; function ps4_sceAppContentTemporaryDataGetAvailableSpaceKb(mountPoint:pSceAppContentMountPoint;availableSpaceKb:PQWORD):Integer; @@ -171,6 +178,7 @@ begin Result:=GetTmpPathAvailableSpaceKb(PChar(mountPoint),availableSpaceKb); _sig_unlock; } + Result:=-1; end; function ps4_sceAppContentDownloadDataGetAvailableSpaceKb(mountPoint:pSceAppContentMountPoint;availableSpaceKb:PQWORD):Integer; @@ -180,6 +188,7 @@ begin Result:=GetDownloadAvailableSpaceKb(PChar(mountPoint),availableSpaceKb); _sig_unlock; } + Result:=-1; end; function ps4_sceAppContentGetEntitlementKey(serviceLabel:SceNpServiceLabel; diff --git a/sys/host_ipc.pas b/sys/host_ipc.pas index 3bb6cf27..bc486e32 100644 --- a/sys/host_ipc.pas +++ b/sys/host_ipc.pas @@ -52,8 +52,9 @@ type procedure Pack(mtype,mlen,mtid:DWORD;buf:Pointer); function Recv:PQNode; procedure Flush; - procedure RecvSync(node:PQNode); - function RecvKevent(mlen:DWORD;buf:Pointer):Ptruint; + procedure RecvResultNode (node:PQNode); + procedure RecvResultDirect(mlen,mtid:DWORD;buf:Pointer); + function RecvKevent (mlen:DWORD;buf:Pointer):Ptruint; procedure UpdateKevent(); procedure WakeupKevent(); virtual; public @@ -165,7 +166,7 @@ begin end; end; -procedure THostIpcConnect.RecvSync(node:PQNode); +procedure THostIpcConnect.RecvResultNode(node:PQNode); var value:Ptruint; mlen:DWORD; @@ -183,6 +184,22 @@ begin TriggerNodeSync(node^.header.mtid,value); end; +procedure THostIpcConnect.RecvResultDirect(mlen,mtid:DWORD;buf:Pointer); +var + value:Ptruint; +begin + value:=0; + + if (mlen>SizeOf(Ptruint)) then + begin + mlen:=SizeOf(Ptruint); + end; + + Move(buf^,value,mlen); + + TriggerNodeSync(mtid,value); +end; + procedure kq_wakeup(data:Pointer); SysV_ABI_CDecl; begin THostIpcConnect(data).WakeupKevent(); @@ -249,7 +266,7 @@ begin if (node^.header.mtype=iRESULT) then begin - RecvSync(node); + RecvResultNode(node); end else begin OnMsg:=GetCallback(node^.header.mtype); @@ -441,7 +458,14 @@ procedure THostIpcSimpleKERN.Send(mtype,mlen,mtid:DWORD;buf:Pointer); begin if (FDest<>nil) then begin - FDest.Pack(mtype,mlen,mtid,buf); + if (mtype=iRESULT) then + begin + //Trigger Direct on Simple mode! + FDest.RecvResultDirect(mlen,mtid,buf); + end else + begin + FDest.Pack(mtype,mlen,mtid,buf); + end; // if Assigned(Classes.WakeMainThread) then begin diff --git a/sys/md/md_host_ipc.pas b/sys/md/md_host_ipc.pas index 08202671..637e5250 100644 --- a/sys/md/md_host_ipc.pas +++ b/sys/md/md_host_ipc.pas @@ -44,6 +44,7 @@ type THostIpcPipeMGUI=class(THostIpcPipe) Ftd_handle:TThreadID; procedure Recv_pipe; override; + Function Push(Node:Pointer):Boolean; override; procedure thread_new; override; procedure thread_free; override; end; @@ -131,8 +132,6 @@ begin if ((events and (BEV_EVENT_ERROR or BEV_EVENT_EOF))<>0) then begin - - Exit; end; @@ -214,6 +213,18 @@ begin end; end; +Function THostIpcPipeMGUI.Push(Node:Pointer):Boolean; +begin + if (PQNode(Node)^.header.mtype=iRESULT) then + begin + //Trigger Direct on GUI side! + RecvResultNode(Node); + end else + begin + Result:=inherited; + end; +end; + procedure THostIpcPipeMGUI.thread_new; begin if (Ftd_handle=0) then diff --git a/sys/sys_bootparam.pas b/sys/sys_bootparam.pas index 1a325ccd..3747c501 100644 --- a/sys/sys_bootparam.pas +++ b/sys/sys_bootparam.pas @@ -8,7 +8,7 @@ uses host_ipc_interface; const - CPUID_BASE_MODE=$710f13; //$710f31 + CPUID_BASE_MODE=$710f13; // $710f31 CPUID_NEO_MODE =$740f00; var @@ -26,6 +26,7 @@ var p_print_gpu_hint :Boolean=False; p_host_ipc :THostIpcInterface=nil; + p_host_handler :THostIpcHandler =nil; function p_host_ipc_td:Pointer;