
    BIj2                       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  e	e      j!                         j,                  d   Zedz  Zd	Zd
ZdZdZdd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&d(dZ'd(dZ(d)d*dZ)d+dZ*e+dk(  r e*        yy),zCScan opcode 0x24-looking rows inside the current selector 2:0 root.    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset   outmap1_01amap2_02diHY i(T zfrontier leaf pointerzfrontier readerz#frontier reader false branch target)i*T i+T ioS c                    d| dS )N0x08x values    P/home/exedev/hwanse/tools/summarize_save_selector_opcode24_current_root_modes.pyhex32r      s    c{    c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     r   	load_jsonr    #   s*    ;;=::dnngn677r   c                <    t        | t              sy t        | d      S )N   )
isinstancestrintr   s    r   	parse_hexr&   )   s    eS!ub>r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr0   /   s?    (B'F~!c#h.dC033r   c                    | j                  d      xs g D ]/  }|j                  d      xs i }|j                  d      dk(  s-|c S  i S )NcurrentFrontierRootRowsselectorRootContextselectedPointerHex
0x00540714)get)selection_writersrowcontexts      r   current_root_contextr:   6   sT     $$%>?E2 ''/06B;;+,<N Ir   c                    | dddS | t         v rdt         |    dS | |v rd||    dS t        ||       dddS | dk  rd	d
dS dddS )Nmissing-)kindmeaningfrontiercnszexecutable-pointerzVA in executable imagei  zsmall-scalarzsmall scalar or scene idscalarznon-pointer scalar)FRONTIER_VALUESr   )r   r-   cns_stringss      r   classify_valuerE   >   sz    }!c22"u/EFF+e*<==He$0,9QRR&3MNN)=>>r   c                .    |ry| dk(  ry| dk(  ry| dk(  ryy)	Nz/low-byte collision inside an executable pointerr   z&opcode 0x24 mode 0 object-state branchr	   z;opcode 0x24 mode 1 writes byte(0x0059e348)+3 to object+0x61   z9opcode 0x24 mode 2 writes byte(0x0059e347) to object+0x61zQnon-dispatch mode; treat as opcode-like data until runtime trace proves executionr   )modepointer_collisions     r   mode_meaningrJ   L   s)    @qy7qyLqyJ^r   c           
        g }t        ||d      D ]@  }t        | ||      }||dz  dk7  r|dz	  dz  }|dz	  dz  }	|dz	  dz  }
t        ||      d u}g }t        ddd      D ]U  }t        | |||z         }t        |||      }|j	                  |t        ||z         |t        |      nd |d   |d	   d
       W |j	                  i dt        |      dd||z
  ddt        |      d|dd|dd|	dd|	dd|
dd|
dd|d| d|t        k(  d	t        ||      d|dt        d |D              dt        d |D                     C |S ) Nr(      $      r"         r>   r?   )r/   vaHexvalueHexr>   r?   rQ   relativeOffsetHexz+0xxrR   rH   modeHexr   02xbyte2byte2Hexbyte3byte3HexpointerCollisionopcodeCandidatecurrentBoundary	lookaheadfrontierOperandc              3  ,   K   | ]  }|d    dk(    yw)r>   r@   Nr   .0items     r   	<genexpr>zscan_rows.<locals>.<genexpr>|   s     "T$4<:#="Ts   routeCnsOperandc              3  *   K   | ]  }|d    dv   yw)r?   >   map1_01a.cnsmap2_02d.cnsNr   ra   s     r   rd   zscan_rows.<locals>.<genexpr>}   s     "m[_4	?6V#V"ms   )	ranger0   r   rE   appendr   CURRENT_BOUNDARY_VArJ   any)r,   r-   rD   startendrowsr.   r   rH   rW   rY   rI   r^   r/   
item_value
item_classs                   r   	scan_rowsrr   X   s)   DE3" $h+=EDLD0
d""$"$(59E	Ar1o 		F!#xf=J'
HkJJ rF{+1;1GE*-T"6*%i0 		 	 
U2Y
3rEz!n!5
 e
 D	

 D:
 U
 "U3K(
 U
 "U3K(
  1
 #44
 r%88
 |D*;<
 
 s"T)"TT
  s"mcl"mm!
 	'$J Kr   c                "   t        |       }t        | |      }t        |      }t        |j	                  d            }t        |j	                  d            }||t        d      t        | ||||      }|D 	cg c]
  }	|	d   s	|	 }
}	|
D 	cg c]  }	|	d   dk(  s|	 }}	|D 	cg c]
  }	|	d   s	|	 }}	|
D 	cg c]
  }	|	d   s	|	 }}	|
D 	cg c]
  }	|	d	   s	|	 }}	t        d
 |D        d       }t        d |D        i       }d}i dddt        dt        ddd|j	                  d      d|j	                  d       d|j	                  d       d||z
  dt        t              d|j	                  d      xs t        t              d|j	                  d      dt        |      dt        |
      dt        |      dt        |      d t        |      d!t        |      d"|d u||||d#|d$S c c}	w c c}	w c c}	w c c}	w c c}	w )%NrangeStartHexrangeEndHexzQcurrent selector root range was not found in save_selector_selection_writers.jsonr\   rH   r	   r[   r_   re   c              3  ,   K   | ]  }|d    s	|  yw)r]   Nr   rb   r8   s     r   rd   z build_summary.<locals>.<genexpr>   s     KSC8I4JSKs   
c              3     K   | ]I  }|j                  d       t        k(  r/|j                  d      t        k(  r|j                  d      xs i  K yw)sourcetargetopcode24BoundaryN)r6   CURRENT_SOURCECURRENT_TARGETrw   s     r   rd   z build_summary.<locals>.<genexpr>   sK      	
wwx N2swwx7HN7Z GG&'-2-	
s   AAa  The current selector 2:0 root has multiple opcode-0x24-looking mode 1 rows. The known gate boundary 0x005428e4 is present, but no opcode candidate in this root carries a direct frontier leaf, frontier reader, false-branch target, or map1_01a/map2_02d CNS operand in the next four dwords. This keeps opcode 0x24 mode 1 classified as object-state code that still needs runtime producer/selection proof, not as a strict map1_01a->map2_02d transition.scopez3current selector 2:0 root low-byte opcode 0x24 scanry   rz   selectorz2:0r4   rootRangeHexz..rootByteLengthmode1SourceHexgateBoundaryVaHexopcodeVaHexgateBoundaryValueHexopcodeValueHexrowCountopcodeCandidateCountpointerCollisionCountmode1CandidateCountfrontierOperandCountrouteCnsOperandCountcurrentBoundaryFoundblocked)r]   modeRowsfrontierOperandRowsrouteCnsOperandRowspromotionStatus
conclusion)r   r   r:   r&   r6   
ValueErrorrr   nextr|   r}   r   MODE1_SOURCErk   r)   )r,   r7   
gate_pathsr-   rD   r9   rm   rn   ro   r8   opcode_rows
mode1_rowspointer_rowsfrontier_rowsroute_cns_rowscurrent_boundarygate_boundaryr   s                     r   build_summaryr      s   
 S!H"31K"#45Ggkk/23E
GKK.
/C}lmmS(K<D"&A3#.?*@3AKA!,A#Fq0@#AJA#'CC3/A+BCCLC$/JS37H3ISJMJ%0KcC8I4JcKNKKDKTR	
!	

 	M	9 F. 	. 	E	
 	gkk*>? 	7;;787;;};U:VW 	#+ 	%- 	]..}=[GZA[ 	 1 12B C 	CI 	K 0 	 \!2 	s: 	M 2  	N 3!" 	 0 <#$ ,,-$ / + BACJKs<   9
G8G8G=G=&
H1H;
HH
HH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| j                  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}| d/   D ]f  }d0j                  d1 |j                  d2      xs g D              }|j                  d3|d4    d5|d6    d5|d7    d8|d9    d:|d;    d:| d:|d<    d=       h |j                  d       d>j                  |      S )?Nz.# Save Selector Opcode 0x24 Current Root Modes zScope: r~   .z
- route: `ry   z -> rz   `z- selector: `r   z` / selected pointer `r4   z- root range: `r   z` (r   z bytes)z- mode1 source: `r   z- gate boundary: `r   z	` value `r   z- low-byte 0x24 rows: r   z- opcode candidates: r   z- pointer collisions: r   z- mode1 candidates: r   z- direct frontier operands: r   z- route CNS operands: r   z- current boundary found: r   z- promotion status: r   z- conclusion: r   z## RowszC| va | value | mode | candidate | current | next dwords | meaning |z+| --- | --- | --- | --- | --- | --- | --- |r   <br>c              3  |   K   | ]4  }d |d    d|d    dt        j                  t        |d                 6 yw)r   rR   z` r>    r?   Nhtmlescaper$   ra   s     r   rd   zmarkdown.<locals>.<genexpr>   sH       
 Z !DL>4;;s4	??S3T2UV 
s   :<r^   z| `rQ   z` | `rR   rU   z` | r\   z | r]   r?   z |
)r6   joinrj   )summarylinesr8   r^   s       r   markdownr      s$   8

''"#1%

WX&'tGH,=+>a@

+,,B7K_C`Baabc
'.12#g>N6O5PPWX
G$456a8
W%89:)GKKPfDgChhij
 !4 56
(> ?@A
 )@!A BC
w'<=>?
&w/E'F&GH
 )?!@ AB
$W-C%D$EF
w'89:;
./0

M5/E2 z" 
KK  
,2 
 
	 	#g,uS_$5U3y>:J$$%&c#.?*@)AYKsSVW`SaRbbdf	

 
LL99Ur   c                   dj                  d | d   D              }dj                  ddddt        j                  | d          d	t        j                  | d
          dt        j                  | d          dt        j                  | 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"d#t        j                  | d$          d%d&|d'g      S )(Nr   c              3    K   | ]  }d t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                d|d    d|d    dd	j                  d
 |j	                  d      xs g D               dt        j                  t        |d                d  yw)z<tr><td><code>rQ   z</code></td><td><code>rR   rU   z</code></td><td>r\   z	</td><td>r]   r   c              3     K   | ]r  }d t        j                  t        |d               z   dz   t        j                  t        |d               z   dz   t        j                  t        |d               z    t yw)z<code>rR   z</code> r>   r   r?   Nr   ra   s     r   rd   z&html_page.<locals>.<genexpr>.<genexpr>   s       I  fj8dkk#d:6F2G&HH:UX\XcXcdghlmshtduXvvy||  @D  @K  @K  LO  PT  U^  P_  L`  @a  a  Is   A8A:r^   r?   z
</td></tr>N)r   r   r$   r   r6   rw   s     r   rd   zhtml_page.<locals>.<genexpr>   s      	[[S\!234 5[[S_!567 8[[S^!456 7$%& '$%& '{{  I  nq  nu  nu  vA  nB  nH  FH  I  I  J J{{3s9~./0 1	s   CCr   z`<!doctype html><meta charset="utf-8"><title>Save Selector Opcode 0x24 Current Root Modes</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1400px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z5<h1>Save Selector Opcode 0x24 Current Root Modes</h1>z<p>Route <code>ry   z -&gt; rz   z</code>, selector <code>r   z</code>, root <code>r   z</code>.</p>z<ul>z<li>low-byte 0x24 rows: r   z</li>z<li>opcode candidates: r   z<li>pointer collisions: r   z<li>mode1 candidates: r   z<li>direct frontier operands: r   z<li>route CNS operands: r   z<li>current boundary found: r   z<li>promotion status: r   z</ul>z<p>r   z</p>z<table><thead><tr><th>va</th><th>value</th><th>mode</th><th>candidate</th><th>current</th><th>next dwords</th><th>meaning</th></tr></thead><tbody>z</tbody></table>)r   r   r   )r   ro   s     r   	html_pager      s   99  :& D 99l 	y?
$++gh&789WU]M^A_@``xy}  zE  zE  FM  NX  FY  zZ  y[  [o  pt  p{  p{  |C  DR  |S  pT  oU  Ua  	b
"7:#6"7u=
!'*@"A!B%H
"7+B#C"DEJ
 )>!? @F
(1G)H(IO
"7+A#B"C5I
&w/E'F&GuM
 ):!; <EB
dkk',/016 	]%  r   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_opcode24_current_root_modes.jsonF),:)ensure_ascii
separatorsr   r   )mkdir
write_textr   dumpsparentr   )r   out_dirhtml_outs      r   write_outputsr   	  s{    MM$M.??KK

7:F L  dT:Ig.A r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                  d	t        d d
       | j                         }t        |j                  j                         t        |j                  i       t        |j                  g             }t        ||j                  |j                         t!        d|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz--selection-writersz$save_selector_selection_writers.jsonz--gate-pathszsave_selector_gate_paths.jsonz	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpz%wrote opcode24 current root modes -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r,   
read_bytesr    r7   r   r   r   r   print)parserargsr   s      r   mainr     s   $$&F
dD=4HI
-D#HnBno
T3A`;`a
$<
4DghD$(("-$//2&G
 '4<<7	1$,,Aq2q1r
str   __main__)r   r%   returnr$   )r   r   r   r   r   r   )r   z
str | Noner   
int | None)r,   bytesr-   
list[dict]r.   r%   r   r   )r7   dictr   r   )r   r   r-   r   rD   dict[int, str]r   r   )rH   r%   rI   boolr   r$   )r,   r   r-   r   rD   r   rm   r%   rn   r%   r   r   )r,   r   r7   r   r   r   r   r   )r   r   r   r$   )N)r   r   r   r   r   zPath | Noner   None)r   r   ),__doc__
__future__r   r   r   r   r*   syspathlibr   typingr   r   insertr$   __file__resolver   probe_exe_scene_tablesr   r   r   r   r   r   r|   r}   r   rk   rC   r   r    r&   r0   r:   rE   rJ   rr   r   r   r   r   r   __name__r   r   r   <module>r      s   I "     
   3tH~--/667 8 P P H~''*
Ul  '!584?	_'T:	:: : 
	:z$N FBu" zF r   