@@ -350,14 +350,20 @@ def b_export(self, dname):
350350 self .bmps .append (pad * 64 * 64 )
351351 w = self .STRIPE_WIDTH * 64
352352 h *= len (self .bmps )// self .STRIPE_WIDTH
353- c_bmp = b"" if not self .pal else self .PALETTE
354- if self .btype == self .BIN_CONTAINER :
355- collage_builder = (lambda x , a = self , PAD = len (pad ), WIDTH = range (w // 64 ): b'' .join ([b'' .join ([a .bmps [a .STRIPE_WIDTH * (x + 1 )- 1 - k ][64 * PAD * j :64 * PAD * (j + 1 )] for k in WIDTH ]) for j in range (64 )]))
353+ if len (self .bmps ) == 0 or len (self .bmps ) < self .STRIPE_WIDTH :
354+ self .b_log (sys .stdout , False , 1 , "Not enough files to build collage with default collage -WIDTH of %d" % (self .STRIPE_WIDTH ))
356355 else :
357- collage_builder = (lambda x , a = self , PAD = len (pad ), WIDTH = range (w // 64 ): b'' .join ([b'' .join ([a .bmps [a .STRIPE_WIDTH * x + k ][64 * PAD * j :64 * PAD * (j + 1 )] for k in WIDTH ]) for j in range (64 )]))
358- c_bmp += b'' .join (map (collage_builder , range (h // 64 )))
359- self .b_write (os .path .join (dname , "%s_collage.bmp" % (self .fname )), self .b_export_bmp (w , h , c_bmp ))
360- self .b_log (sys .stdout , False , 0 , "Successfully exported collage file." )
356+ try :
357+ c_bmp = b"" if not self .pal else self .PALETTE
358+ if self .btype == self .BIN_CONTAINER :
359+ collage_builder = (lambda x , a = self , PAD = len (pad ), WIDTH = range (w // 64 ): b'' .join ([b'' .join ([a .bmps [a .STRIPE_WIDTH * (x + 1 )- 1 - k ][64 * PAD * j :64 * PAD * (j + 1 )] for k in WIDTH ]) for j in range (64 )]))
360+ else :
361+ collage_builder = (lambda x , a = self , PAD = len (pad ), WIDTH = range (w // 64 ): b'' .join ([b'' .join ([a .bmps [a .STRIPE_WIDTH * x + k ][64 * PAD * j :64 * PAD * (j + 1 )] for k in WIDTH ]) for j in range (64 )]))
362+ c_bmp += b'' .join (map (collage_builder , range (h // 64 )))
363+ self .b_write (os .path .join (dname , "%s_collage.bmp" % (self .fname )), self .b_export_bmp (w , h , c_bmp ))
364+ self .b_log (sys .stdout , False , 0 , "Successfully exported collage file." )
365+ except IndexError :
366+ self .b_log (sys .stdout , False , 1 , "Not enough files to build collage with default collage -WIDTH of %d" % (self .STRIPE_WIDTH ))
361367 return True
362368 def b_export_bmp (self , width , height , data ):
363369 if not self .pal :
@@ -375,7 +381,7 @@ def b_flush(self):
375381 return True
376382
377383if __name__ == "__main__" :
378- prs = argparse .ArgumentParser (description = "RDP Bitmap Cache parser (v. 3.04, 2023/12/02 )" )
384+ prs = argparse .ArgumentParser (description = "RDP Bitmap Cache parser (v. 3.05, 2026/08/04 )" )
379385 prs .add_argument ("-s" , "--src" , help = "Specify the BMCache file or directory to process." , required = True )
380386 prs .add_argument ("-d" , "--dest" , help = "Specify the directory where to store the extracted bitmaps." , required = True )
381387 prs .add_argument ("-c" , "--count" , help = "Only extract the given number of bitmaps." , type = int , default = - 1 )
@@ -396,18 +402,35 @@ def b_flush(self):
396402 for root , dirs , files in os .walk (args .src ):
397403 for f in files :
398404 if f .rsplit ("." , 1 )[- 1 ].upper () in ["BIN" , "BMC" ]:
399- if args .verbose :
400- sys .stdout .write ("[---] File '%s' has been found.%s" % (os .path .join (root , f ), os .linesep ))
401- src_files .append (os .path .join (root , f ))
405+ file_path = os .path .join (root , f )
406+ try :
407+ file_size = os .path .getsize (file_path )
408+ except OSError :
409+ file_size = 0
410+ if file_size > 0 :
411+ if args .verbose :
412+ sys .stdout .write ("[---] File '%s' has been found.%s" % (file_path , os .linesep ))
413+ src_files .append (file_path )
414+ else :
415+ sys .stdout .write ("[!!!] File '%s' is zero bytes, skipping file.%s" % (file_path , os .linesep ))
402416 if len (src_files ) == 0 :
403417 sys .stderr .write ("No suitable files were found under '%s' directory.%s" % (args .src , os .linesep ))
404418 exit (- 1 )
405419 elif not os .path .isfile (args .src ):
406420 sys .stderr .write ("Invalid -s/--src parameter; use -h/--help for help.%s" % (os .linesep ))
407421 exit (- 1 )
408422 else :
409- sys .stdout .write ("[+++] Processing a single file: '%s'.%s" % (args .src , os .linesep ))
410- src_files .append (args .src )
423+ file_size = 0
424+ try :
425+ file_size = os .path .getsize (args .src )
426+ except OSError :
427+ file_size = 0
428+ if file_size > 0 :
429+ sys .stdout .write ("[+++] Processing a single file: '%s'.%s" % (args .src , os .linesep ))
430+ src_files .append (args .src )
431+ else :
432+ sys .stdout .write ("[!!!] File '%s' is Zero-Bytes.%s" % (args .src , os .linesep ))
433+
411434 for src in src_files :
412435 sys .stdout .write ("[+++] Processing a file: '%s'.%s" % (src , os .linesep ))
413436 if bmcc .b_import (src ):
0 commit comments