7
7
Inspired from https://github.com/LongSoft/PFSExtractor-RS by Nikolaj Schlej
8
8
"""
9
9
10
- title = 'Dell PFS BIOS Extractor v4.5 '
10
+ title = 'Dell PFS BIOS Extractor v4.6 '
11
11
12
12
import os
13
13
import re
@@ -74,7 +74,7 @@ class PFS_ENTRY(ctypes.LittleEndianStructure) :
74
74
75
75
def pfs_print (self ) :
76
76
GUID = '' .join ('%0.8X' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .GUID ))
77
- VersionType = '' .join ('%0.4X ' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .VersionType ))
77
+ VersionType = '' .join ('%0.2X ' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .VersionType ))
78
78
Version = '' .join ('%0.4X' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .Version ))
79
79
Unknown = '' .join ('%0.8X' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .Unknown ))
80
80
@@ -108,7 +108,7 @@ class PFS_ENTRY_R2(ctypes.LittleEndianStructure) :
108
108
109
109
def pfs_print (self ) :
110
110
GUID = '' .join ('%0.8X' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .GUID ))
111
- VersionType = '' .join ('%0.4X ' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .VersionType ))
111
+ VersionType = '' .join ('%0.2X ' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .VersionType ))
112
112
Version = '' .join ('%0.4X' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .Version ))
113
113
Unknown = '' .join ('%0.8X' % int .from_bytes (struct .pack ('<I' , val ), 'little' ) for val in reversed (self .Unknown ))
114
114
@@ -634,7 +634,8 @@ def pfs_extract(buffer, pfs_index, pfs_name, pfs_count) :
634
634
635
635
data_ext = '.data.bin' if is_advanced else '.bin' # Simpler Data Extension for non-advanced users
636
636
meta_ext = '.meta.bin' if is_advanced else '.bin' # Simpler Metadata Extension for non-advanced users
637
- full_name = '%d%s -- %d %s v%s' % (pfs_index , pfs_name , file_index , file_name , file_version )
637
+ full_name = '%d%s -- %d %s v%s' % (pfs_index , pfs_name , file_index , file_name , file_version ) # Full Entry Name
638
+ safe_name = re .sub (r'[\\/*?:"<>|]' , '_' , full_name ) # Replace common Windows reserved/illegal filename characters
638
639
639
640
is_zlib = True if file_type == 'ZLIB' else False # Determine if PFS Entry Data was zlib-compressed
640
641
@@ -644,13 +645,13 @@ def pfs_extract(buffer, pfs_index, pfs_name, pfs_count) :
644
645
# Some Data may be Text or XML files with useful information for non-advanced users
645
646
is_text , final_data , file_ext , write_mode = bin_is_text (file_data , file_type , False , is_advanced )
646
647
647
- final_name = '%s%s' % (full_name , data_ext [:- 4 ] + file_ext if is_text else data_ext )
648
+ final_name = '%s%s' % (safe_name , data_ext [:- 4 ] + file_ext if is_text else data_ext )
648
649
final_path = os .path .join (output_path , final_name )
649
650
650
651
with open (final_path , write_mode ) as o : o .write (final_data ) # Write final Data
651
652
652
653
if file_data_sig and is_advanced : # Store Data Signature (advanced users only)
653
- final_name = '%s.data.sig' % full_name
654
+ final_name = '%s.data.sig' % safe_name
654
655
final_path = os .path .join (output_path , final_name )
655
656
656
657
with open (final_path , 'wb' ) as o : o .write (file_data_sig ) # Write final Data Signature
@@ -661,13 +662,13 @@ def pfs_extract(buffer, pfs_index, pfs_name, pfs_count) :
661
662
# Some Data may be Text or XML files with useful information for non-advanced users
662
663
is_text , final_data , file_ext , write_mode = bin_is_text (file_meta , file_type , True , is_advanced )
663
664
664
- final_name = '%s%s' % (full_name , meta_ext [:- 4 ] + file_ext if is_text else meta_ext )
665
+ final_name = '%s%s' % (safe_name , meta_ext [:- 4 ] + file_ext if is_text else meta_ext )
665
666
final_path = os .path .join (output_path , final_name )
666
667
667
668
with open (final_path , write_mode ) as o : o .write (final_data ) # Write final Data Metadata
668
669
669
670
if file_meta_sig and is_advanced : # Store Metadata Signature (advanced users only)
670
- final_name = '%s.meta.sig' % full_name
671
+ final_name = '%s.meta.sig' % safe_name
671
672
final_path = os .path .join (output_path , final_name )
672
673
673
674
with open (final_path , 'wb' ) as o : o .write (file_meta_sig ) # Write final Data Metadata Signature
@@ -770,7 +771,7 @@ def show_exception_and_exit(exc_type, exc_value, tb) :
770
771
771
772
sys .exit (1 )
772
773
773
- # Set pause-able Python exception hander
774
+ # Set pause-able Python exception handler
774
775
sys .excepthook = show_exception_and_exit
775
776
776
777
# Show script title
@@ -824,7 +825,7 @@ def show_exception_and_exit(exc_type, exc_value, tb) :
824
825
input_name ,input_extension = os .path .splitext (os .path .basename (input_file ))
825
826
input_dir = os .path .dirname (os .path .abspath (input_file ))
826
827
827
- print ('\n File: %s%s' % (input_name , input_extension ))
828
+ print ('\n *** %s%s' % (input_name , input_extension ))
828
829
829
830
# Check if input file exists
830
831
if not os .path .isfile (input_file ) :
0 commit comments