FPPS4/sys/kern/kern_authinfo.pas

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.