;hsp3.21 ;packlist.as #include "anthspex3.as" #define MAX_PATH 260 sdim file,MAX_PATH ;対象ファイル file=dir_cmdline if file=="" { dialog "exe",16,"HSP exe ファイル": if stat==0 { end } file=refstr } exist file: flen=strsize: if flen<0 { dialog "not found "+file: end } ;exe解析 sdim buf,flen bload file,buf,flen c=peek(buf,0): d=peek(buf,1) if (c!='M')|(d!='Z') { dialog file+"は実行ファイルではありません": end } longpeek p,buf,60 ;PEフォーマットヘッダ先頭 c=peek(buf,p): d=peek(buf,p+1): e=wpeek(buf,p+2) if (c!='P')|(d!='E')|(e!=0) { dialog file+"のファイルフォーマットには対応していません": end } longpeek align,buf,p+60 ;ファイルアラインメント nsec=wpeek(buf,p+6) ;IMAGE_SECTION_HEADERの数 p+=248: maxtop=0 repeat nsec longpeek c,buf,p+20 ;IMAGE_SECTIONのファイル上先頭位置 if c>maxtop { maxtop=c: longpeek d,buf,p+16 ;同上長さ } p+=40 loop pend=(maxtop+d+align-1)/align*align ;↑多くの場合、pendが「DPMX」の位置だが、例外もある s="DPMX": bfind buf,s,4,pend: pdpm=stat if pdpm>=(flen-4) { dialog "HSPで作成されたexeファイルではありません": end } ;ファイルのリストアップ num=wpeek(buf,pdpm+8) ;4バイトかも p=pdpm+16 repeat num ;strmid s,buf,p,16 ;HSP Ver. 3.1のstrmidのバグに対応 memcpy s,buf,16,0,p mes s p+=32 loop stop