
    UHj=                       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	 ej                  j                  d e e	e      j                         j                               ddlmZmZ  e	e      j                         j&                  d   Zedz  Zg dZg d	Zg d
Zdddg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Z#efd!dZ$d"dZ%e&dk(  r e%        yy)#zPSummarize code paths that assign the context+0xa8 selection-buffer base pointer.    )annotationsN)Path)offset_to_varead_sections   out)          )zfixed-selection-buffer-basezstatic-gate-address-refzruntime-pointer-mode-proof)z2fixed context+0xa8 base for the current route pathz7direct static reference to the 0xe8/0xea gate addresseszXruntime pointer-mode proof selecting the correct global/save/object base before the gateHwanse2.exezEcontext+0xa8 assignment scan and static gate-address reference checks)pathdescriptionc                    d| dS )N0x08x values    K/home/exedev/hwanse/tools/summarize_save_selector_selection_buffer_bases.pyhex32r   &       c{    c                    d| dS )Nr   02xr   r   s    r   hex8r   *   r   r   c                    g }d}	 | j                  ||      }|dk  r|S t        ||      }||j                  |       |dz   }>)Nr   r   )findr   append)exesectionspatternrowsoffsethitvas          r   pattern_hitsr&   .   sU    DF
hhw'7K(C(>KKOq r   c                    t        j                  d|      }t        | ||      }t        |      |d d D cg c]  }t	        |       c}fS c c}w )N<I   )structpackr&   lenr   )r   r    targetr!   refsrefs         r   dword_pattern_ref_countr0   ;   sG    kk$'GXw/Dt9T#2Y7cuSz7777s   Ac           	        t         j                  d      }g }d}	 | j                  ||      }|dk  r	 |S t        ||      }|{|t	        |      z   dz   t	        |       k  r^t        j                  d| |t	        |      z         d   }|j                  |t        |      |t        |      |dk(  rdn|dk(  rdnd	d
d       |dz   })Nc780a8000000r      r(   Y zglobal selection buffervE zsave/runtime blockzimmediate basezmov dword [eax+0xa8], imm32)r%   vaHexbasebaseHexsourceinstructionr   )	bytesfromhexr   r   r,   r*   unpack_fromr   r   )r   r    r!   r"   searchr$   r%   r7   s           r   immediate_assignmentsr?   A   s    mmN+GDF
hhw'7& K% (C(>cCL014C@%%dCs7|1CDQGDKKr ; z) . z) .)<  q+ r   c           
         t         j                  d      }dddddddddd	d
dddddddd}t        | ||      D cg c]&  }|t        |      dd|j	                  |ddd      ( c}S c c}w )N8981a8000000z(saved pointer table 0x0059dd70[stream+2]zdword[0x0059dd70 + stream[2]*4])r9   baseExpressionz$save block slot selected by stream+1z0x00457750 + stream[1] * 0xd8z5runtime object pointer table selected by context+0xf2z#dword[0x0059db30 + context[0xf2]*4]z1runtime object pointer table selected by stream+2zdword[0x0059db30 + stream[2]*4]z+save block slot selected by object field +3z0x00457750 + object[3] * 0xd8)iZW@ i=d@ id@ id@ iA iA zmov dword [ecx+0xa8], eax)r%   r6   r:   zregister-computed baseeax)r;   r<   r&   r   get)r   r    r!   knownr%   s        r   register_assignmentsrF   ^   s    mmN+G A?

 ==

 NC

 J?

 D=

 NC
+EB sHg6  2Y6	
 ii'?SXYZ		
  s    +A.c                \   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g}g }|D ]  }t         D ]y  }t        |j                  d      t              r|d   |z   nd }d}g }|t	        | ||      \  }}|j                  |d   |d   t        |      |t        |      nd |||d   d       {  |S )N
0x0059e310r4   z,global selection buffer immediate assignmentT)r8   r7   r9   static
0x004576d8r5   z'save/runtime block immediate assignmentz0x00457750+n*0xd8iPwE zindexed save block slot baseFzdword[0x0059db30+i*4]z!runtime object pointer table basezdword[0x0059dd70+i*4]zsaved pointer table baser7   r   r8   r9   rI   )r8   
baseSource	offsetHex
addressHexdirectDwordRefCountdirectDwordRefsstaticAddress)GATE_OFFSETS
isinstancerD   intr0   r   r   r   )	r   r    basesr"   r7   r#   addresscountr.   s	            r   gate_address_rowsrW      s    $D		
 $?		
 +4		
 /9		
 /0		
3E@ D " 	F/9$((6:JC/Pd6lV+VZGE D"5c8WMtKK	?"8n!&\070CeGn',#'!%h 	  Kr   c                   t        |       }t        | |      }t        | |      }t        | |      }|D cg c]  }|d   dv r|d   r
|d   dkD  r| }}d}i ddd	t	        |      d
t	        |      d|d|d|dt	        |      dddddddt
        dt        dt        dt	        t              ddd|S c c}w )NrL   >   0xe80xearP   rN   r   a  The selection-buffer pointer at context+0xa8 is not a single fixed array. Static handler paths can point it at 0x0059e310 or 0x004576d8, while other paths compute a save-slot base or load an object pointer from 0x0059db30/0x0059dd70. The gate offsets 0xe8/0xea therefore need runtime pointer-mode evidence before they can prove fallthrough. Exact dword refs to the static 0x0059e310+0xe8/0xea and 0x004576d8+0xe8/0xea addresses are absent, so the producer is still unresolved.contextFieldHex
0x000000a8immediateAssignmentCountregisterAssignmentCountimmediateAssignmentsregisterAssignmentsgateAddressRows#knownStaticGateOffsetDirectRefCountruntimePointerModeStillRequiredT
proofFoundFselectionBufferBaseProofFound failedSelectionBufferBaseGateIdsmissingEvidenceevidenceRefsevidenceRefCountpromotionStatusblocked
conclusion)r   r?   rF   rW   r,   %FAILED_SELECTION_BUFFER_BASE_GATE_IDS&SELECTION_BUFFER_BASE_MISSING_EVIDENCE#SELECTION_BUFFER_BASE_EVIDENCE_REFS)r   r    
immediates	registersaddress_rowsrowknown_static_e8_ea_refsrl   s           r   build_summaryru      s_   S!H&sH5J$S(3I$S(3L#{// %&* 	 	Z <"C
O 	"3y> 	
	
 	y 	< 	.s3J/K 	*4 	e 	( 	+,Q 	A 	; 	C CD 	9  	j! s   B;c                   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g}|j                  d | d   D               |j                  g d       |j                  d | d   D               |j                  g d       |j                  d | d   D               |j                  g d       | d   D ],  }|j                  d |d!    d"|d#    d$|d%    d&|d'    d(	       . |j                  g d)       | d*   D ],  }|j                  d |d!    d$|d%    d&|d+    d"|d'    d(	       . |j                  g d,       | d-   D ]O  }|j                  d |d#    d$|d.    d&|d/    d"|d0   xs d1 d$|d2    d3d4j                  |d5         xs d1 d6       Q |j                  d       d7j                  |      S )8Nz&# Save Selector Selection Buffer Bases z- context field: `r[   `z- immediate assignments: r]   z!- register/computed assignments: r^   z"- static gate-offset direct refs: rb   z'- runtime pointer mode still required: rc   z- proofFound: `rd   z"- selectionBufferBaseProofFound: `re   z- promotion status: `rj   rl   z## Failed Gatesc              3  (   K   | ]
  }d | d  yw)- `rx   Nr   .0items     r   	<genexpr>zmarkdown.<locals>.<genexpr>   s     W43tfAWs   rf   )rw   z## Missing Evidencerw   c              3  &   K   | ]	  }d |   yw)z- Nr   r{   s     r   r~   zmarkdown.<locals>.<genexpr>   s     D2dVDs   rg   )rw   z## Evidence Refsrw   c              3  8   K   | ]  }d |d    d|d      yw)rz   r   z`: r   Nr   r|   rs   s     r   r~   zmarkdown.<locals>.<genexpr>   s/       c&k]#c-012s   rh   )rw   z## Immediate Assignmentsrw   z$| va | base | source | instruction || --- | --- | --- | --- |r_   z| `r6   z` | `r8   z` | r9   z | `r:   z` |)rw   z## Register Assignmentsrw   z/| va | source | base expression | instruction |r   r`   rB   )rw   z## Gate Offset Address Checksrw   zF| base | source | offset | address | direct dword refs | sample refs |z&| --- | --- | --- | --- | ---: | --- |ra   rK   rL   rM   -rN   z | , rO   z |
)extendr   join)summarylinesrs   s      r   markdownr      s   0

W%678:
#G,F$G#HI
+G4M,N+OP
,W5Z-[,\]
1':[2\1]^
',/02
,W5T-U,VVWX
(9 :;1=


E" 
LLW73U+VWW	LL  
 
LLD1B)CDD	LL  
 
LL >*  
LL   -. ns3w<.c)n-=T#h-PTUXYfUgThhklmn	LL   ,- 
#g,tCM?$s;K7L6MUSVWdSeRffij	

 
LL   () 
#i.!c,&7%8S=M<N OL!(S)c2G.H-Iyy./07C8<	

 
LL99Ur   c                   dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }g }| d   D ]x  }|j                  d	t        j                  |d
          dt        j                  |d          dt        j                  |d          dt        j                  |d          d	       z g }| d   D ]x  }|j                  d	t        j                  |d
          dt        j                  |d          dt        j                  |d          dt        j                  |d          d	       z g }| d   D ]  }|j                  d	t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d   xs d       d|d    dt        j                  dj                  |d         xs d       d        dj                  g dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3t        j                  | d4          d5| d6    d7| d8    d9| d:    d;| d<    d=| d>    d?t        j                  | d@          dAdBt        j                  | dC          dDdEdF| dGdHdF| dGdIdF| dGdJdK|dLdMdN|dLdOdP|dLdQdRd      S )SNrw   c              3  N   K   | ]  }d t        j                  |       d  yw)
<li><code>z</code></li>Nhtmlescaper{   s     r   r~   zhtml_page.<locals>.<genexpr>(  s+       T[[&'|4   #%rf   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li></li>Nr   r{   s     r   r~   zhtml_page.<locals>.<genexpr>,  s+       t{{4 !'r   rg   c              3     K   | ]9  }d t        j                  |d          dt        j                  |d          d ; yw)r   r   z	</code>: r   r   Nr   r   s     r   r~   zhtml_page.<locals>.<genexpr>0  sE       T[[V-.iCDV8W7XX]^s   ?Arh   r_   z<tr><td><code>r6   z</code></td><td><code>r8   z</code></td><td>r9   z</td><td><code>r:   z</code></td></tr>r`   rB   ra   rK   rL   rM   r   rN   z	</td><td>r   rO   z
</td></tr>r   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">z5  <title>Save Selector Selection Buffer Bases</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z,    h1 { margin: 0 0 8px; font-size: 24px; }z/    h2 { margin: 24px 0 8px; font-size: 18px; }z<    p { max-width: 1120px; color: #bbb; line-height: 1.45; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zF    th { position: sticky; top: 0; background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z/  <h1>Save Selector Selection Buffer Bases</h1>z  <p>context field <code>r[   z</code>; immediate assignments r]   z ; register/computed assignments r^   z!; static gate-offset direct refs rb   z'; runtime pointer mode still required: rc   z; proofFound <code>rd   z</code>; promotion status: rj   z.</p>z  <p>rl   z</p>z  <h2>Failed Gates</h2>z  <ul>z</ul>z  <h2>Missing Evidence</h2>z  <h2>Evidence Refs</h2>z   <h2>Immediate Assignments</h2>zc  <table><thead><tr><th>va</th><th>base</th><th>source</th><th>instruction</th></tr></thead><tbody>z  </tbody></table>z  <h2>Register Assignments</h2>zn  <table><thead><tr><th>va</th><th>source</th><th>base expression</th><th>instruction</th></tr></thead><tbody>z%  <h2>Gate Offset Address Checks</h2>z  <table><thead><tr><th>base</th><th>source</th><th>offset</th><th>address</th><th>direct dword refs</th><th>sample refs</th></tr></thead><tbody>z</body>z</html>)r   r   r   r   )r   failed_gatesmissing_evidenceevidence_refsimmediate_rowsrs   register_rowsrr   s           r   	html_pager   '  s   77 >? L ww -.  GG >* M N-. 
S\23 4S^45 6;;s8}-. /S%789 :		

 M,- 
S\23 4;;s8}-. /S)9%:;< =S%789 :		

 L() 

S^45 6;;s<012 3S%567 8S%6%=#>? @,-. /;;tyy->)?@GCHI J		


 99 ,,, 	, 	#	,
 	Q, 	@, 	, 	r, 	1, 	7, 	:, 	G, 	f, 	t, 	Q,  	'!," 	#,$ 	%,& 	',( 	:),* $DKK8I0J$K#LLkls  uO  mP  lQ  Qq  ry  zS  rT  qU  Uv  w~  d  we  vf  fM  NU  Vw  Nx  My  yL  MT  Ua  Mb  Lc  c~  C  J  J  KR  Sd  Ke  f  ~g  gl  	m+,, GL12348-,. 	"/,0 e$1,2 	&3,4 !"%(5,6 	#7,8 u%9,: 	+;,< 	n=,> 
?,@ 	A,B 	*C,D 	yE,F 
G,H 	I,J 	0K,L 	\M,N 
O,P 	Q,R 	S,T 	U,V 	W, , ,r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz)save_selector_selection_buffer_bases.jsonF   )ensure_asciiindentr   zutf-8)encoding)save_selector_selection_buffer_bases.html)mkdir
write_textjsondumpsr   )r   out_dirs     r   write_outputsr     sf    MM$M.::FF

7q9D@ G  ::FFyQXGYdkFlr   c                 v   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                         }t        |j                  j                               }t        ||j                         t        d|j                  dz          y )N)r   z--exer   )typedefaultz	--out-dirz.wrote save selector selection buffer bases -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsru   r   
read_bytesr   r   print)parserargsr   s      r   mainr     s    $$9F
dD=4HI
$<DDHH//12G'4<<(	:4<<Ju;u:v
wxr   __main__)r   rS   returnstr)r   r;   r    
list[dict]r!   r;   r   z	list[int])r   r;   r    r   r-   rS   r   ztuple[int, list[str]])r   r;   r    r   r   r   )r   r;   r   dict)r   r   r   r   )r   r   r   r   r   None)r   r   )'r   
__future__r   r   r   r   r*   syspathlibr   r   insertr   __file__resolveparentprobe_exe_scene_tablesr   r   r   r   r   rQ   rm   rn   ro   r   r   r&   r0   r?   rF   rW   ru   r   r   r   r   __name__r   r   r   <module>r      s    V "     
  3tH~--/667 8 > H~''*
Ul!) %
* & ^' #
8:$N2j#LDNYx 25 my zF r   