
    Ij4                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZmZ ddlmZmZmZ  e	e      j!                         j4                  d   Zed	z  Zd
ZdZdZdZ dZ!h dZ"d dZ#d!dZ$d"dZ%d#dZ&d$dZ'd%dZ(d&dZ)d'dZ*d(dZ+d)d*dZ,d+dZ-d,dZ.d+dZ/edfd-dZ0d.dZ1e2dk(  r e1        yy)/zCSummarize the save-selector dispatch stop that resolves into .data.    )annotationsN)Path)Any)offset_to_varead_sectionsva_to_offset)HANDLER_TABLE_VAhandler_for_opcodesection_name_for_va   outmap1_01amap2_02di(T i*T i+T >   .rdata.data.textc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     J/home/exedev/hwanse/tools/summarize_save_selector_dispatch_stop_context.py	load_jsonr      s*    ;;=::dnngn677    c                    | d| dS d S )N0x08x values    r   hex32r&   $   s    $0Rc{:d:r   c                "    | rt        | d      S d S )N   )intr$   s    r   	parse_hexr*   (   s    "3ub>,,r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr5   ,   s?    (B'F~!c#h.dC033r   c                N    | D ]   }|d   }||d   z   }||cxk  r	|k  s|c S  " y )Nrawraw_sizer#   )r2   r4   sectionstartends        r   section_for_offsetr<   3   sE     gj))F S N !
 r   c                (   t        j                  d|      }g }d}	 | j                  ||      }|dk  r	 |S |dz   }t        ||      }||d   t        vr:t        ||      }|I|j                  |d   d|dt        |      t        |      d       x)Nr-   r   r   namer!   06x)r9   fileOffsetHexrefVaHexvalueHex)r/   packfindr<   SCAN_SECTIONSr   appendr&   )	r1   r2   r%   needlerefssearchhitr9   ref_vas	            r   
value_refsrL   <   s    [[u%FDF
hhvv&7 K q$Xs3?gfo]Bh,>v!#c^fe	
 	 r   c                    t        | ||      }|t        ||      nd }t        |      t        |      |d}|d|d<   |S |rd|d<   |S d|d<   |S )N)vaHexrB   valueSection
unreadablekindpointerscalar)r5   r   r&   )r1   r2   r3   r%   r9   rows         r   	dword_rowrU   T   sx    S(B'E6;6G!(E2TGr%LC
 }"F
 J	 
F J FJr   c           
     `    t        |      D cg c]  }t        | |||dz  z          c}S c c}w )Nr,   )rangerU   )r1   r2   start_vacountindexs        r   dword_windowr[   e   s,    HMeUuIc8X	%9:UUUs   +c                (    t        d | D        i       S )Nc              3     K   | ]6  }|j                  d       t        k(  r|j                  d      t        k(  r| 8 yw)sourcetargetN)getROUTE_SOURCEROUTE_TARGET).0rT   s     r   	<genexpr>zroute_gate.<locals>.<genexpr>k   s9      	
wwx L0SWWX5F,5V 	
s   <>)next)
gate_pathss    r   
route_gaterg   i   s!    	
%	
 	 r   c                
   t        |       }t        |xs g       }t        |j                  d            xs t        }t        | ||      }||dz  nt        |j                  d            }t        | ||xs d      }t        |xs ddz  z   }t        | ||      }	|	t        ||	      nd }
|	t        | ||	      ng }t        |D ch c]  }|d   	 c}      }|	|	xs dnd}|dz
  }|dz
  }d	}i d
t        dt        dt        |      dt        |      dd|xs dddt        t              dt        |      dt        |	      dt        |	      d|
d|
dk(  d|d|j                  d      d|j                  d      d|j                  d      dt        t              dt        t              t!        |      ||t#        | ||d      |	t#        | ||d      ng t#        | ||d      |
d k(  xr |d gk(  d!g d"|d#
S c c}w )$NdispatchStopVaHex   dispatchStopOpcodeHexr   r,   r9       r(   a  The dispatch stop at 0x005428f4 uses opcode low byte 0xe8, whose handler-table entry 0x00440ac0 resolves to 0x00440c28 in .data. The target has only .data pointer refs in the scanned executable sections, so this is data descriptor context, not an executable code handler. It reinforces the stop at 0x005428f4 and does not prove that the 0x005428bc writer path selects frontier leaf 0x00542ae8 or reaches reader 0x00542b0c.r^   r_   dispatchStopValueHexr!   02xhandlerTableVaHexhandlerTableEntryVaHexhandlerTableEntryValueHexentryValueHexentryValueSectionentryValueIsCodeHandlerr   handlerForOpcodegateDispatchStopHandlerVaHexdispatchStopHandlerVaHexgateDispatchStopHandlerSectiondispatchStopHandlerSectiongateDispatchStopIsCodeHandlerdispatchStopIsCodeHandlerfrontierLeafHexfrontierReaderHex   r   blocked)zGprove which descriptor/table row the 0x24 action-state boundary selectszIprove execution reaches frontier leaf 0x00542ae8 before reader 0x00542b0cz3find a strict map1_01a source coordinate or hotspot)
targetPointerRefCounttargetPointerRefSectionstargetPointerRefshandlerTableEntryWindowtargetDescriptorWindowdispatchStopWindowdispatchStopIsDescriptorContextpromotionStatusremainingProofs
conclusion)r   rg   r*   r`   DISPATCH_STOP_VAr5   r
   r	   r   rL   sortedra   rb   r&   FRONTIER_LEAFFRONTIER_READERr.   r[   )r1   rf   r2   gatestop_va
stop_valuestop_opcodehandlerentry_vaentry_valueentry_sectiontarget_refsreftarget_ref_sectionstarget_window_starttable_window_startdispatch_window_startr   s                     r   build_summaryr   s   s   S!Hj&B'D!456J:JG#x1J'1'=*t#9TXXVmMnCoK h0@qAG;#3!q"88H3(3KBMBY'+>_cM<G<S*S(K8Y[K K!HS#i.!HI0;0G;+!Q!D#dN	A  , ,  	U7^  	j 1	 
 	 2{'7a%=!>  	U#34  	!%/  	$U;%7  	{+  	]  	"=G#;  	G  	'1K(L  	)$((3O*P  	(2M)N   	5/! " 	U?3# $ "%[!1$7(#/X?QSU#VZeZq,sH>QSU"Vwy*3:OQST+8G+C+hH[`g_hHh$

 !?    "Is   H c                2   ddd| d    d| d    d| d    d	| d
    d| d    dd| d    dd| d    d| d    d| d    d| d    d| d    ddj                  | d         xs d d| d    d | d!    dd"| d#    dd$| d%    d| d&   dd'dd(d)g}| d*   D ],  }|j                  d+|d,    d-|d.    d/|d0    d1|d2    d3	       . |j                  g d4       | d5   D ]<  }|j                  d+|d6    d1|d2    d-|d7    d8|j                  d9      xs d d:	       > |j                  g d;       | d<   D ]<  }|j                  d+|d6    d1|d2    d-|d7    d8|j                  d9      xs d d:	       > |j                  g d=       | d>   D ]<  }|j                  d+|d6    d1|d2    d-|d7    d8|j                  d9      xs d d:	       > |j                  g d?       |j                  d@ | dA   D               |j                  d       dBj                  |      S )CNz%# Save Selector Dispatch Stop Context z	- route: r^   z -> r_   z- dispatch stop: `ri   z	` value `rm   z
` opcode `rk   `z- handler table: `ro   z- handler table entry: `rp   z` -> `rr   z` in rs   z- entry value is code handler: rt   z- target pointer refs: r    in , r   -z- descriptor context: r   z- frontier leaf: `r|   z- frontier reader: `r}   z- promotion status: r   r   z## Target Pointer Refsz*| ref va | section | file offset | value || --- | --- | --- | --- |r   z| `rA   z` | r9   z | `r@   z` | `rB   z` |)r   z## Handler Table Entry Windowr   %| va | value | kind | value section |r   r   rN   rQ   z | rO   z |)r   z## Target Descriptor Windowr   r   r   r   )r   z## Dispatch Stop Windowr   r   r   r   )r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw)z- Nr#   rc   items     r   rd   zmarkdown.<locals>.<genexpr>   s     D2dVDs   r   
)joinrF   extendr`   )summarylinesr   rT   s       r   markdownr      sH   /

GH%&d78+<*=>
W%89:)GLbDcCddnov  xO  pP  oQ  QR  	S
W%89:!<
"7+C#D"EVGTcLdKeejkr  tG  lH  kI  	J
)'2K*L)MN
!'*A"B!C4		RYZtRuHvH}z}G~
 )J!K LM
W%678:
w':;<A>
w'89:;

 
4#'E* *+ 
#j/"$s9~&6d3;O:PPUVYZdVeUffij	

 
LL  A  B01 
#g,uS_$5T#f+c#''R`JaJhehIiikl	

 
LL~/0 
#g,uS_$5T#f+c#''R`JaJhehIiikl	

 
LLz{+, 
#g,uS_$5T#f+c#''R`JaJhehIiikl	

 
LL01	LLD1B)CDD	LL99Ur   c                    dj                  d |D              }g }| D ]1  |j                  ddj                  fd|D              z   dz          3 d| ddj                  |       dS )	Nr   c              3  T   K   | ]   \  }}d t        j                  |       d " yw)z<th>z</th>Nhtmlescape)rc   _keylabels      r   rd   zhtml_table.<locals>.<genexpr>   s'     Q+$tDKK./u5Qs   &(z<tr>c           	   3     K   | ]<  \  }}d t        j                  t        j                  |      xs d             d > yw)z
<td><code>r   z</code></td>N)r   r   strr`   )rc   key_labelrT   s      r   rd   zhtml_table.<locals>.<genexpr>   sB      C T[[SWWS\-@S)ABC<Ps   AAz</tr>z<table><thead><tr>z</tr></thead><tbody>z</tbody></table>)r   rF   )rowscolumnsheaderbodyrT   s       @r   
html_tabler      s    WWQQQFD 
gg #* 
 	

  x';BGGDM?JZ[[r   c                d   | d   D cg c]  }|d   |d   |d   |d   d }}dj                  d | d	   D              }g d
}dj                  g dddddddddddddddddt        j                  | d          dt        j                  | d          d | d!    d"t        j                  | d#          d$	d%| d&    d'| d(    d)| d*    d+t        j                  t        | d,                d-| d.    d$d/| d0    d1t        j                  d2j                  | d3         xs d4       d5| d6    d$d7t        j                  | d8          d9d:t	        |g d;      d<t	        | d=   |      d>t	        | d?   |      d@t	        | dA   |      dBdC| dDdEdFd      S c c}w )GNr   rA   r9   r@   rB   )rA   r9   r@   rB   r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>Nr   r   s     r   rd   zhtml_page.<locals>.<genexpr>   s#     adDT!2 359as   #%r   ))rN   r3   rB   r%   )rQ   rQ   )rO   zvalue sectionr   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z4  <title>Save Selector Dispatch Stop Context</title>z	  <style>z[    body { margin: 24px; background: #111; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin: 18px 0 28px; }zP    th, td { border: 1px solid #3a3a3a; padding: 6px 8px; vertical-align: top; }z9    th { background: #202020; position: sticky; top: 0; }z    code { color: #9bd4ff; }z
  </style>z</head>z<body>z.  <h1>Save Selector Dispatch Stop Context</h1>z  <p>route: r^   z -&gt; r_   z; dispatch stop <code>ri   z</code>; promotion status: r   z.</p>z  <p>handler table <code>ro   z#</code>; handler table entry <code>rp   z</code> resolves to <code>rr   z</code> in rs   z; entry value is code handler: rt   z  <p>target pointer refs: r   r   r   r   r   z; descriptor context: r   z  <p>r   z</p>z  <h2>Target Pointer Refs</h2>))rA   zref va)r9   r9   )r@   zfile offsetr   z%  <h2>Handler Table Entry Window</h2>r   z#  <h2>Target Descriptor Window</h2>r   z  <h2>Dispatch Stop Window</h2>r   z  <h2>Remaining Proofs</h2>z  <ul>z</ul>z</body>z</html>)r   r   r   r   r   )r   r   ref_rowsproof_itemsdword_columnss        r   	html_pager      s    ./  J9~ 1J		
H  ''agN_F`aaKM 99 """ 	" 	#	"
 	Q" 	?" 	" 	f" 	U" 	[" 	D" 	'" 	" 	" 	"  	9!"" t{{78#456gdkk'RZJ[>\=]]st{  }P  uQ  tR  Rm  nr  ny  ny  zA  BS  zT  nU  mV  V[  	\#"$ $G,?$@#AAdel  nF  fG  eH  Hb  cj  kz  c{  b|  |G  HL  HS  HS  TW  X_  `s  Xt  Tu  Hv  Gw  wV  W^  _x  Wy  Vz  z  	@%"& %W-D%E$Fd4;;W[W`W`ah  jD  bE  XF  XM  JM  LN  KO  Oe  fm  nO  fP  eQ  QV  	W'"( GL12348)"* 	)+", 	8  G  	H-". 	0/"0 	745}E1"2 	.3"4 	734mD5"6 	*7"8 	7/0-@9": 	&;"< U#="> 	?"@ 	A"B 	C" " "!s   F-c                    |j                  dd       |dz  j                  t        j                  | dd      d       |:|j                  j                  dd       |j                  t        |       d       y y )	NT)parentsexist_ok(save_selector_dispatch_stop_context.jsonF),:)ensure_ascii
separatorsr   r   )mkdir
write_textr   dumpsparentr   )r   out_dirhtml_outs      r   write_outputsr      s{    MM$M.99EE

7:F F  dT:Ig.A r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                  dt        d d       | j                         }t        |j                  j                         t        |j                  dz  g             }t        ||j                  |j                         t        d	|j                  d
z          y )Nz--exezHwanse2.exe)typedefaultz	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpzsave_selector_gate_paths.jsonz-wrote save selector dispatch stop context -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r1   
read_bytesr   r   r   r   print)parserargsr   s      r   mainr   +  s    $$&F
dD=4HI
$<
4DghD$,,!@@"EG '4<<7	9$,,Is:s9t
uvr   __main__)r   r   r   r   returnr   )r%   
int | Noner   
str | None)r%   r   r   r   )r1   bytesr2   
list[dict]r3   r)   r   r   )r2   r   r4   r)   r   zdict | None)r1   r   r2   r   r%   r)   r   r   )r1   r   r2   r   r3   r)   r   dict)
r1   r   r2   r   rX   r)   rY   r)   r   r   )rf   r   r   r   )N)r1   r   rf   zlist[dict] | Noner   r   )r   r   r   r   )r   r   r   zlist[tuple[str, str]]r   r   )r   r   r   r   r   zPath | Noner   None)r   r   )3__doc__
__future__r   r   r   r   r/   syspathlibr   typingr   r   insertr   __file__resolver   probe_exe_scene_tablesr   r   r   summarize_script_handler_tabler	   r
   r   r   r   r   ra   rb   r   r   r   rE   r   r&   r*   r5   r<   rL   rU   r[   rg   r   r   r   r   r   r   __name__r#   r   r   <module>r      s
   I "     
   3tH~--/667 8 L L d d H~''*
Ul ,8;-40"V6r,^\3l 25d Bw zF r   