param_sfo 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/get_sfo_info +55 -0
  3. data/lib/SFO.rb +146 -0
  4. metadata +86 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cf828ff35de041284fbf51306a95be0676515624
4
+ data.tar.gz: b33b136e60c56022b036ac12a206fda3110e912c
5
+ SHA512:
6
+ metadata.gz: 10733853834ea5922a3ea3cf78ddbdac85670da535bb126e4cefe91187a7f712ad0bdb51819334fe3bcec0a1bfa098ee1cd987e5781fa3664e27974db432c64c
7
+ data.tar.gz: 3cff9546770fb777ba8b0651e3cb28864e6f5df7652fa9abae27abbcb19ef034343623e5b4a4cf9bef6aa21adbf5688d3c158b16b3d214c71cf9ef8137832203
data/bin/get_sfo_info ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ require "SFO"
3
+ require "http"
4
+
5
+ def self.read_data(f)
6
+ #puts "Open"
7
+ count = 0
8
+ while record = f.read(1024)
9
+ count += record.length
10
+ if (found = /\000PSF/.match(record)) != nil
11
+ then
12
+ #puts "Found SFO magic at #{count}"
13
+ f.seek(found.begin(0) - 1024, IO::SEEK_CUR)
14
+ res = SFO::parse_sfo(f)
15
+ #puts res
16
+ if (res != nil)
17
+ then
18
+ return res
19
+ end
20
+ end
21
+ end
22
+ #puts 'Nothing found'
23
+ end
24
+
25
+ def self.get_sfo_from_pkg(url)
26
+ #puts "Requesting #{url}"
27
+ if (url.include? 'http')
28
+ then
29
+ f = StringIO.new
30
+ tries = 0;
31
+ while (f.length == 0 && tries < 5)
32
+ tries += 1;
33
+ body = HTTP.get(url).body
34
+ while((tmp = body.readpartial) != nil && f.length <= 1024*1024*3)
35
+ f << tmp
36
+ end
37
+ end
38
+ f.seek(0)
39
+ read_data(f)
40
+ else
41
+ open(url, 'r') do |f|
42
+ read_data(f)
43
+ end
44
+ end
45
+ end
46
+
47
+ if (ARGV[0] == nil)
48
+ then
49
+ puts 'Usage: get_sfo_info [URL|File]'
50
+ else
51
+ sfo = self.get_sfo_from_pkg ARGV[0]
52
+ sfo.each_pair do |key,value|
53
+ puts "#{key}: #{value}"
54
+ end
55
+ end
data/lib/SFO.rb ADDED
@@ -0,0 +1,146 @@
1
+ require "bindata"
2
+
3
+ class SFO
4
+ def self.transform_data(key,data)
5
+ case key
6
+ when :SYSTEM_VER
7
+ disp_as_hex data
8
+ when :PUBTOOLVER
9
+ disp_as_hex data
10
+ when :REMOTE_PLAY_KEY_ASSIGN
11
+ disp_as_hex data
12
+ when :DOWNLOAD_DATA_SIZE
13
+ disp_as_hex data
14
+ when :APP_TYPE
15
+ disp_as_hex data
16
+ when :PARENTAL_LEVEL
17
+ disp_as_hex data
18
+ when :PT_PARAM
19
+ disp_as_hex data
20
+ when :DEV_FLAG
21
+ disp_as_hex data
22
+ when :PUBTOOLMINVER
23
+ disp_as_hex data
24
+ when :ATTRIBUTE
25
+ Attribute.read(data.to_binary_s.reverse)
26
+ when :ATTRIBUTE2
27
+ Attribute2.read(data.to_binary_s.reverse)
28
+ else
29
+ data.to_binary_s.strip
30
+ end
31
+ end
32
+
33
+ def self.disp_as_hex(item)
34
+ item.to_binary_s.reverse.unpack('H*')[0]
35
+ end
36
+
37
+ class Attribute < BinData::Record
38
+ bit1 :display_location_flag
39
+ bit1 :unknown_value_15
40
+ bit1 :supports_HDR
41
+ bit1 :unknown_value_14
42
+ bit1 :unknown_value_13
43
+ bit1 :requires_PSVR
44
+ bit1 :unknown_value_12
45
+ bit1 :unknown_value_11
46
+ bit1 :support_NEO_mode_on_PRO
47
+ bit1 :unknown_value_10
48
+ bit1 :unknown_value_9
49
+ bit1 :unknown_value_8
50
+ bit1 :unknown_value_7
51
+ bit1 :unknown_value_6
52
+ bit1 :unknown_value_5
53
+ bit1 :cpu_mode_7cpu
54
+ bit1 :cpu_mode_6cpu
55
+ bit1 :psvr_support
56
+ bit1 :unknown_value_4
57
+ bit1 :unknown_value_3
58
+ bit1 :unknown_value_2
59
+ bit1 :hdcp_disalbed_non_games
60
+ bit1 :hdcp_enabled
61
+ bit1 :suspend_on_output_resolution_change
62
+ bit1 :unknown_value_1
63
+ bit1 :share_button_overriden
64
+ bit1 :common_dialog_accept_system_setting
65
+ bit1 :suspend_on_lose_focus
66
+ bit1 :stereoscopic_3d
67
+ bit1 :ps_move
68
+ bit1 :common_dialog_accept_is_cross
69
+ bit1 :support_logout
70
+ end
71
+
72
+ class Attribute2 < BinData::Record
73
+ bit1 :unknown_value_24
74
+ bit1 :unknown_value_23
75
+ bit1 :unknown_value_22
76
+ bit1 :unknown_value_21
77
+ bit1 :unknown_value_20
78
+ bit1 :unknown_value_19
79
+ bit1 :unknown_value_18
80
+ bit1 :unknown_value_17
81
+ bit1 :unknown_value_16
82
+ bit1 :unknown_value_15
83
+ bit1 :unknown_value_14
84
+ bit1 :unknown_value_13
85
+ bit1 :unknown_value_12
86
+ bit1 :unknown_value_11
87
+ bit1 :unknown_value_10
88
+ bit1 :unknown_value_9
89
+ bit1 :unknown_value_8
90
+ bit1 :unknown_value_7
91
+ bit1 :unknown_value_6
92
+ bit1 :support_team_on_team_tournament_sdk4500
93
+ bit1 :support_one_on_one_match_sdk3500
94
+ bit1 :unknown_value_5
95
+ bit1 :does_not_apply_dummy_psmove_tracking_to_cpu
96
+ bit1 :support_broadcase_separate_mode
97
+ bit1 :unknown_value_4
98
+ bit1 :unknown_value_3
99
+ bit1 :psvr_eye_setting_dynamic_config
100
+ bit1 :psvr_personal_eye_setting_disabled
101
+ bit1 :unknown_value_2
102
+ bit1 :support_content_search
103
+ bit1 :support_video_recording
104
+ bit1 :unknown_value_1
105
+ end
106
+
107
+ class Header < BinData::Record
108
+ uint32le :magic
109
+ uint32le :version
110
+ uint32le :key_table_start
111
+ uint32le :data_table_start
112
+ uint32le :tables_entries
113
+ end
114
+
115
+ class Sfo_index_table_entry < BinData::Record
116
+ uint16le :key_offset
117
+ uint16le :data_fmt
118
+ uint32le :data_len
119
+ uint32le :data_max_len
120
+ uint32le :data_offset
121
+ end
122
+
123
+ class SFO < BinData::Record
124
+ endian :little
125
+ Header :header
126
+ array :index_entries, :type => Sfo_index_table_entry, :initial_length => lambda { header.tables_entries }
127
+ array :key_table, :type => :stringz, :initial_length => lambda { header.tables_entries }
128
+ array :data_table, :initial_length => lambda { header.tables_entries }, :byte_align => 4 do
129
+ #many of these should be little endian values, but we reverse byte order later.
130
+ array :data, :type => :uint8, :read_abs_offset => lambda {index_entries[index]}, :initial_length => lambda {index_entries[index].data_max_len}
131
+ end
132
+ end
133
+
134
+ #Takes a stream as an argument
135
+ def self.parse_sfo(stream)
136
+ sfo = SFO.read(stream)
137
+ unless sfo.header.magic == 1179865088
138
+ return nil
139
+ end
140
+ sfoHash = Hash[sfo.key_table.zip(sfo.data_table)].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
141
+ sfoHash.each_key do |key|
142
+ sfoHash[key] = transform_data(key,sfoHash[key])
143
+ end
144
+ sfoHash
145
+ end
146
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: param_sfo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Fenny Fatal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bindata
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.4.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.4'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.4.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: http
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 3.3.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 3.3.0
53
+ description: A simple parser utility for param.sfo
54
+ email: fenny@fennyfatal.com
55
+ executables:
56
+ - get_sfo_info
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - bin/get_sfo_info
61
+ - lib/SFO.rb
62
+ homepage: http://rubygems.org/gems/param_sfo
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.4.6
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Param.sfo
86
+ test_files: []