mirror of https://github.com/red-prig/fpPS4.git
428 lines
13 KiB
Plaintext
428 lines
13 KiB
Plaintext
unit kern_authinfo;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
type
|
|
p_proc_type_info=^t_proc_type_info;
|
|
t_proc_type_info=packed record
|
|
size :QWORD;
|
|
bptype:DWORD;
|
|
pflags:DWORD;
|
|
end;
|
|
{$IF sizeof(t_proc_type_info)<>16}{$STOP sizeof(t_proc_type_info)<>16}{$ENDIF}
|
|
|
|
p_authinfo=^t_authinfo;
|
|
t_authinfo=packed record
|
|
app_type :QWORD;
|
|
app_caps :array[0..3] of QWORD; //62 bit IsSystem;61 bit IsGame;60 bit IsNongame;
|
|
app_attrs:array[0..3] of QWORD;
|
|
unknow :array[0..7] of QWORD;
|
|
end;
|
|
{$IF sizeof(t_authinfo)<>136}{$STOP sizeof(t_authinfo)<>136}{$ENDIF}
|
|
|
|
const
|
|
//eLoadOptions
|
|
LOAD_OPTIONS_DEFAULT =$0000;
|
|
LOAD_OPTIONS_LOAD_SUSPENDED =$0001;
|
|
LOAD_OPTIONS_USE_SYSTEM_LIBRARY_VERIFICATION =$0002;
|
|
LOAD_OPTIONS_SLV_MODE_WARN =$0004;
|
|
LOAD_OPTIONS_ARG_STACK_SIZE =$0008;
|
|
LOAD_OPTIONS_FULL_DEBUG_REQUIRED =$0010;
|
|
|
|
//mmap_flags
|
|
//bit 1 -> is_big_app
|
|
//bit 2 -> first find addr is (1 shl 33) ->
|
|
// _sceKernelMapFlexibleMemory
|
|
// _sceKernelMapDirectMemory
|
|
// sceKernelMapDirectMemory2
|
|
|
|
//attributeExe
|
|
//bit 1 -> use in [libkernel_exception] ->
|
|
// -> sceKernelInstallExceptionHandler
|
|
// -> sceKernelRemoveExceptionHandler
|
|
// -> sceKernelAddGpuExceptionEvent
|
|
// -> sceKernelDeleteGpuExceptionEvent
|
|
// -> sceKernelBacktraceSelf
|
|
//bit 2 -> sys_mdbg_service
|
|
|
|
type
|
|
TCUSANAME=array[0..9] of AnsiChar;
|
|
|
|
const
|
|
//SceLncAppType
|
|
SCE_LNC_APP_TYPE_INVALID =-1;
|
|
SCE_LNC_APP_TYPE_NULL = 0;
|
|
SCE_LNC_APP_TYPE_SHELL_UI = 1; //isSystemApp
|
|
SCE_LNC_APP_TYPE_DAEMON = 2; //isSystemApp
|
|
SCE_LNC_APP_TYPE_CDLG = 3; //isSystemApp
|
|
SCE_LNC_APP_TYPE_MINI_APP = 4; //isSystemApp
|
|
SCE_LNC_APP_TYPE_BIG_APP = 5;
|
|
SCE_LNC_APP_TYPE_SHELL_CORE= 6; //isSystemApp
|
|
SCE_LNC_APP_TYPE_SHELL_APP = 7; //isSystemApp
|
|
|
|
//[preloadPrxFlags] -> sceSysmodulePreloadModuleForLibkernel
|
|
//0x0000000004 libSceNet
|
|
//0x0000000008 libSceIpmi
|
|
//0x0000000010 libSceMbus
|
|
//0x0000000020 libSceRegMgr
|
|
//0x0000000040 libSceRtc
|
|
//0x0000000080 libSceAvSetting
|
|
//0x0000000100 libSceVideoOut
|
|
//0x0000000200 libSceGnmDriver
|
|
//0x0000000400 libSceAudioOut
|
|
//0x0000000800 libSceAudioIn
|
|
//0x0000001000 libSceAjm
|
|
//0x0000002000 libScePad
|
|
//0x0000004000 libSceCamera
|
|
//0x0000008000 libSceDbg
|
|
//0x0000010000 libSceNetCtl
|
|
//0x0000020000 libScettp
|
|
//0x0000040000 libSceSsl
|
|
//0x0000080000 libSceNpCommon
|
|
//0x0000100000 libSceNpManager
|
|
//0x0000200000 libSceNpWebApi
|
|
//0x0000400000 libSceSaveData
|
|
//0x0000800000 libSceSystemService
|
|
//0x0001000000 libSceUserService
|
|
//0x0002000000 libSceCommonDialog
|
|
//0x0004000000 libSceSysUtil
|
|
//0x0008000000 libScePerf
|
|
//0x0010000000 libSceWebKit2ForVideoService
|
|
//0x0020000000 libSceOrbisCompatForVideoService
|
|
//0x0040000000 libSceFios2,libc
|
|
//0x0080000000 libSceRazorCpu
|
|
//0x0100000000 libSceRazorCpu_debug
|
|
//0x1000000000 libSceHttp2
|
|
//0x2000000000 libSceNpGameIntent
|
|
//0x4000000000 libSceNpWebApi2
|
|
|
|
type
|
|
t_title_workaround=packed record
|
|
version:Integer;
|
|
align :Integer;
|
|
ids :array[0..1] of QWORD;
|
|
end;
|
|
|
|
//workaround ids bits number
|
|
const
|
|
BUG107292_EXTRA_USB_AUDIO_DEVICE =$00;
|
|
BUG119504_SUSPEND_BLACK_LIST =$01;
|
|
BUG113237_LIVE_DETAIL_BLACK_LIST =$02;
|
|
BUG117780_GPU_DOUBLE_PRECISION =$03;
|
|
BUG134640_FFXIV_MOVIE_CRASH =$04;
|
|
BUG140207_FAKE_BG_EXECUTION =$05;
|
|
BUG140207_DELAY_SUSPEND =$06;
|
|
BUG141751_FORCE_VIDEO_RECORDING_COMPATIBLE =$07;
|
|
BUG141953_FORCE_CONTENT_SEARCH_COMPATIBLE =$08;
|
|
BUG135666_FORCED_BASE_MODE =$09;
|
|
BUG142996_NEW_QUICK_MENU_BLACK_LIST =$0A;
|
|
BUG146562_PRODUCT_DETAIL_BLACK_LIST =$0B;
|
|
BUG141677_DISABLE_SERVICE_ENTITLEMENT_UPDATE_EVENT =$0C;
|
|
BUG158272_EXTERNAL_HDD_BLACK_LIST =$0D;
|
|
BUG159526_INVALIDATE_ENTITLEMENT_IN_APPLICATION_DB =$0E;
|
|
BUG163566_BOOST_MODE_BLACK_LIST =$0F;
|
|
BUG171584_EXTERNAL_HDD_ACCESS_LATENCY =$10;
|
|
BUG183465_SPECIAL_ISSUE =$11;
|
|
BUG183542_NEO_VDDNB_VID_3STEP =$12;
|
|
BUG183542_NEO_VDDNB_VID_4STEP =$13;
|
|
BUG183542_NEO_VDDNB_VID_5STEP =$14;
|
|
BUG184831_NEO_VDDNB_VID_STEP_UP_ALL_TITLE =$15;
|
|
BUG180029_SAVE_DATA_MEMORY_TIMEOUT_10SEC =$16;
|
|
BUG180341_WEBAPI_NOT_COPY_ERROR_JSON =$17;
|
|
BUG180847_USE_RECRYPT_BLOCKS =$18;
|
|
BUG182301_NP_MANAGER_KEEP_COMPATIBLE =$19;
|
|
BUG182170_OSK =$1A;
|
|
BUG188290_NEO_SCLK_DOWN_LEVEL1 =$1B;
|
|
BUG188290_NEO_SCLK_DOWN_LEVEL2 =$1C;
|
|
BUG188290_NEO_SCLK_DOWN_LEVEL3 =$1D;
|
|
BUG187987_NTS_CONNECTHASHTABLE =$1E;
|
|
BUG190872_HIDE_4K =$1F;
|
|
BUG191849_HDCP_CHECK_APP_ONLY =$20;
|
|
BUG193000_USE_OLD_WEB_BROWSER_ENGINE =$21;
|
|
BUG186690_IME_DISABLE_REMOTE_PLAY =$22;
|
|
BUG196278_IME_DISABLE_REMOTE_PLAY_WITH_DISABLE_CONTROLLER=$23;
|
|
BUG196285_IME_PACKED_UPDATE_TEXT =$24;
|
|
BUG186690_IME_REMOTE_PLAY_FINISHED_BY_PRESS_ENTER =$25;
|
|
BUG196699_SYSMODULE_SWITCH_LIBSSL =$26;
|
|
BUG192912_PLAYGO_FULL_MULTISTREAM =$27;
|
|
BUG201910_DINO_FRONTIER_DLSYM =$28;
|
|
BUG202240_HIKARU_UTADA_SCHED =$29;
|
|
BUG198989_ANTHEM_KERNEL_PANIC =$2A;
|
|
BUG202952_SSL_CHECK_RECV_PENDING_ALWAYS_TRUE =$2B;
|
|
BUG203700_PARTY_ROLLBACK =$2C;
|
|
CAMELOT3106_USE_OLD_STYLE_USER_AGENT =$2D;
|
|
BUG209289_SESSION_SIGNALING_TERMINATE_ON_LEFT =$2E;
|
|
BUG198642_LB_SYNC_RESET_TO_FIX_CURSOR_8000 =$2F;
|
|
BUG198642_LB_SYNC_RESET_NOT_TO_FIX_CURSOR =$30;
|
|
BUG210925_ENABLE_TLS_BUG_FIX =$31;
|
|
NUM_WORKAROUND_ID =$32;
|
|
|
|
{
|
|
[render_mode] (sceKernelGetRenderingMode)
|
|
0xff -> Changing is prohibited -> 1920x1080
|
|
0 -> Default -> 1920x1080
|
|
1 -> High Resolution. -> 3840x2160
|
|
2 -> Enhanced Full HD. -> 1920x1080
|
|
}
|
|
|
|
type
|
|
p_appinfo=^t_appinfo;
|
|
t_appinfo=packed record
|
|
AppId :Integer; //4
|
|
mmap_flags :Integer; //4
|
|
attributeExe :Integer; //4
|
|
attribute2 :Integer; //4
|
|
CUSANAME :TCUSANAME; //10 titleId
|
|
debug_level :Byte; //1
|
|
slv_flags :Byte; //1 eLoadOptions
|
|
miniAppDmemFlags:Byte;
|
|
render_mode :Byte;
|
|
mdbg_out :Byte;
|
|
requiredHdcpType:Byte;
|
|
preloadPrxFlags :QWORD;
|
|
attribute :Integer;
|
|
hasParamSfo :Integer;
|
|
titleWorkaround :t_title_workaround;
|
|
end;
|
|
{$IF sizeof(t_appinfo)<>72}{$STOP sizeof(t_appinfo)<>72}{$ENDIF}
|
|
|
|
var
|
|
g_authinfo:t_authinfo;
|
|
g_appinfo :t_appinfo;
|
|
|
|
function sceSblACMgrHasMmapSelfCapability(info:p_authinfo):Boolean;
|
|
function sceSblACMgrHasUseHp3dPipeCapability(info:p_authinfo):Boolean;
|
|
function sceSblACMgrIsVideoplayerProcess(info:p_authinfo):Boolean;
|
|
function sceSblACMgrHasUseVideoServiceCapability(info:p_authinfo):Boolean;
|
|
function sceSblACMgrIsNongameUcred(info:p_authinfo):Boolean;
|
|
function sceSblACMgrIsSystemUcred(info:p_authinfo):Boolean;
|
|
function sceSblACMgrHasSceProgramAttribute(info:p_authinfo):Boolean;
|
|
function sceSblACMgrIsDebuggableProcess(info:p_authinfo):Boolean;
|
|
function sceSblACMgrIsAllowedToMmapSelf(icurr,ifile:p_authinfo):Boolean;
|
|
function sceSblACMgrIsDiagProcess(info:p_authinfo):Boolean;
|
|
function is_sce_prog_attr_20_800000(info:p_authinfo):Boolean;
|
|
function is_sce_prog_attr_20_400000(info:p_authinfo):Boolean;
|
|
function is_sce_prog_attr_40_800000(info:p_authinfo):Boolean;
|
|
function is_sce_prog_attr_40_400000(info:p_authinfo):Boolean;
|
|
|
|
function sys_get_proc_type_info(dst:Pointer):Integer;
|
|
function sys_get_authinfo(pid:Integer;info:Pointer):Integer;
|
|
|
|
implementation
|
|
|
|
uses
|
|
errno,
|
|
systm,
|
|
kern_proc;
|
|
|
|
function sceSblACMgrHasMmapSelfCapability(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=(info^.app_caps[1] and QWORD($400000000000000))<>0;
|
|
end;
|
|
|
|
function sceSblACMgrHasUseHp3dPipeCapability(info:p_authinfo):Boolean;
|
|
var
|
|
app_type:QWORD;
|
|
begin
|
|
app_type:=info^.app_type;
|
|
if ((app_type<>QWORD($3800000000000009)) and (app_type<>QWORD($380100000000002c))) then
|
|
begin
|
|
Exit(false);
|
|
end;
|
|
Exit(true);
|
|
end;
|
|
|
|
function sceSblACMgrIsVideoplayerProcess(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=(info^.app_type + QWORD($c7ffffffefffffff)) < 2;
|
|
end;
|
|
|
|
function sceSblACMgrHasUseVideoServiceCapability(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=(info^.app_caps[1] and QWORD($200000000000000))<>0;
|
|
end;
|
|
|
|
function sceSblACMgrIsNongameUcred(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=(info^.app_caps[0] and QWORD($1000000000000000))<>0;
|
|
end;
|
|
|
|
function sceSblACMgrIsSystemUcred(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=(info^.app_caps[0] and QWORD($4000000000000000))<>0;
|
|
end;
|
|
|
|
function sceSblACMgrHasSceProgramAttribute(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=(info^.app_attrs[0] and QWORD($80000000))<>0;
|
|
end;
|
|
|
|
function sceSblACMgrIsDebuggableProcess(info:p_authinfo):Boolean;
|
|
var
|
|
attr:QWORD;
|
|
begin
|
|
attr:=info^.app_attrs[0];
|
|
if ((attr and QWORD($1000000))=0) then
|
|
begin
|
|
if ((attr and QWORD($2000000))<>0) then
|
|
begin
|
|
Exit(true);
|
|
end;
|
|
//sceSblRcMgrIsAllowULDebugger
|
|
end;
|
|
//sceSblRcMgrIsSoftwagnerQafForAcmgr
|
|
Exit(false);
|
|
end;
|
|
|
|
function sceSblACMgrIsAllowedToMmapSelf(icurr,ifile:p_authinfo):Boolean;
|
|
begin
|
|
Result:=True;
|
|
if ((icurr^.app_caps[1] and QWORD($400000000000000))=0) or
|
|
((ifile^.app_attrs[0] and QWORD($8000000))=0) then
|
|
begin
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function sceSblACMgrIsDiagProcess(info:p_authinfo):Boolean;
|
|
var
|
|
attr:QWORD;
|
|
begin
|
|
Result:=True;
|
|
attr:=info^.app_type and QWORD($ff0f000000000000);
|
|
if (attr<>QWORD($3801000000000000)) and (attr<>QWORD($3802000000000000)) then
|
|
begin
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function is_sce_prog_attr_20_800000(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=True;
|
|
if ((info^.app_caps[1] and QWORD($2000000000000000))=0) or
|
|
((info^.app_attrs[0] and QWORD($800000))=0) then
|
|
begin
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function is_sce_prog_attr_20_400000(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=True;
|
|
if ((info^.app_caps[1] and QWORD($2000000000000000))=0) or
|
|
((info^.app_attrs[0] and QWORD($400000))=0) then
|
|
begin
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function is_sce_prog_attr_40_800000(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=True;
|
|
if ((info^.app_caps[1] and QWORD($4000000000000000))=0) or
|
|
((info^.app_attrs[0] and QWORD($800000))=0) then
|
|
begin
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function is_sce_prog_attr_40_400000(info:p_authinfo):Boolean;
|
|
begin
|
|
Result:=True;
|
|
if ((info^.app_caps[1] and QWORD($4000000000000000))=0) or
|
|
((info^.app_attrs[0] and QWORD($400000))=0) then
|
|
begin
|
|
Result:=False;
|
|
end;
|
|
end;
|
|
|
|
function sys_get_proc_type_info(dst:Pointer):Integer;
|
|
var
|
|
info:t_proc_type_info;
|
|
begin
|
|
info:=Default(t_proc_type_info);
|
|
|
|
Result:=copyin(dst,@info.size,SizeOf(QWORD));
|
|
if (Result<>0) then Exit;
|
|
|
|
if (info.size<>SizeOf(t_proc_type_info)) then Exit(EINVAL);
|
|
|
|
info.bptype:=p_proc.p_budget_ptype;
|
|
|
|
if sceSblACMgrIsVideoplayerProcess(@g_authinfo) then
|
|
begin
|
|
info.pflags:=info.pflags or $04;
|
|
end;
|
|
|
|
if sceSblACMgrHasUseVideoServiceCapability(@g_authinfo) then
|
|
begin
|
|
info.pflags:=info.pflags or $10;
|
|
end;
|
|
|
|
if sceSblACMgrHasSceProgramAttribute(@g_authinfo) then
|
|
begin
|
|
info.pflags:=info.pflags or $40;
|
|
end;
|
|
|
|
if sceSblACMgrIsDebuggableProcess(@g_authinfo) then
|
|
begin
|
|
info.pflags:=info.pflags or $80;
|
|
end;
|
|
|
|
//sceSblACMgrIsJitCompilerProcess() -> | 0x01
|
|
//sceSblACMgrIsJitApplicationProcess() -> | 0x02
|
|
//sceSblACMgrIsVideoplayerProcess() -> | 0x04
|
|
//sceSblACMgrIsDiskplayeruiProcess() -> | 0x08
|
|
//sceSblACMgrHasUseVideoServiceCapability() -> | 0x10
|
|
//sceSblACMgrIsWebcoreProcess() -> | 0x20
|
|
//sceSblACMgrHasSceProgramAttribute() -> | 0x40
|
|
//sceSblACMgrIsDebuggableProcess() -> | 0x80
|
|
|
|
Result:=copyout(@info,dst,SizeOf(t_proc_type_info));
|
|
end;
|
|
|
|
function sys_get_authinfo(pid:Integer;info:Pointer):Integer;
|
|
var
|
|
data:t_authinfo;
|
|
x,y:QWORD;
|
|
begin
|
|
Result:=0;
|
|
|
|
if (pid<>0) and
|
|
(pid<>p_proc.p_pid) then
|
|
begin
|
|
Exit(ESRCH);
|
|
end;
|
|
|
|
data:=Default(t_authinfo);
|
|
|
|
//if (priv_check(td,686)=0) then
|
|
//begin
|
|
// data:=g_authinfo;
|
|
//end else
|
|
begin
|
|
x:=g_authinfo.app_type;
|
|
y:=x+QWORD($c7ffffffeffffffc);
|
|
|
|
if (y < $f) and (((QWORD($6001) shr (y and $3f)) and 1)<>0) then
|
|
begin
|
|
data.app_type:=x;
|
|
end;
|
|
|
|
data.app_caps[0]:=g_authinfo.app_caps[0] and QWORD($7000000000000000);
|
|
end;
|
|
|
|
if (info<>nil) then
|
|
begin
|
|
Result:=copyout(@data,info,SizeOf(t_authinfo));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
end.
|
|
|