
    Jj;<                       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mZ ddl	m
Z
 ej                  j                  d e ee      j                         j                                ddlmZ ddlmZmZ  ee      j                         j,                  d   Zed	z  Zd
ZdZdZdZdZdZddh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'd#d$dZ(d%dZ)e*dk(  r e)        yy)&zISeparate real opcode 0x09 stores from pointer-shaped low-byte collisions.    )annotationsN)Path)Any)read_sections)handler_for_opcodesection_name_for_va   outmap1_01amap2_02dz0:0z1:0z2:0i@ c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     P/home/exedev/hwanse/tools/summarize_save_selector_opcode09_pointer_collisions.py	load_jsonr      s*    ;;=::dnngn677    c                     | sy t        | d      S )N   )int)values    r   	parse_hexr   $   s    ub>r   c                6    t        |      }|y t        | |      S N)r   r   )sections	value_hexr   s      r   value_sectionr#   *   s!    i E}x//r   c                   t        | |j                  d            }|j                  d      dk(  }|j                  d      t        v }|xr |d u}|j                  d      xs i }i d|d|j                  d      d|j                  d      d|d|j                  d      d	|j                  d	      d|j                  d      d
|j                  d
      d|j                  d      d|j                  d      d|j                  d      du d|j                  d      du d| d|d|xr | d|d|d|rdiS |rdiS diS )NvalueHexstoredPointerSourceunsupported-modemodestoredPointerClassselectorvaHexvalueSectionmodeHexstoredPointerHexstoredPointerKindkindstoredPointerSelectorstoresCurrentRootTstoresCurrentRangesupportedStoremodeSupportedByHandler"unsupportedModeReturnsWithoutStoreunsupportedModepointerCollisionclassificationz!pointer-shaped low-byte collisionz-unsupported mode without mapped pointer valuezdecoded selected-pointer store)r#   getOPCODE09_SUPPORTED_MODES)r!   r*   rowsectionunsupportedmode_supportedpointer_collisionstored_classs           r   classify_rowrB   1   s   Hcggj&9:G''/04FFKWWV_(@@N#;t(;77/06BLH! 	CGGJ' 		
 	 	3779% 	sww'<= 	CGG$67 	\--f5 	 !1!1*!= 	SWW%89TA 	cgg&:;tC 	k/ 	!. 	-k.P.>P  	;!" 	-#$ 	  0' ,  <+ . -/ r   c                   |xs t        t        dz  i       }|xs t        t        dz  i       }t        |       }t        | |d      }g }|j	                  d      xs g D ]^  }|j	                  d      }|j	                  d      xs g D ]3  }|j	                  d      dk(  s|j                  t        |||             5 ` |D cg c]!  }|j	                  d      t        t        hv r|# }	}|D cg c]  }|j	                  d      t        k(  s| }
}t        |	D ch c]C  }|j	                  d	      r0t        |j	                  d
      t              r|j	                  d
      E c}      }|	D cg c]&  }|j	                  d	      r|j	                  d      r|( }}d}|j	                  d      xs g D ]X  }|j	                  d      xs i }|j	                  d      dk(  s-|j	                  d      ?|j	                  d      dk(  sT|dz  }Z d}i dt        dt        dt        dt        dt        d|j	                  d      dddt        t              D cg c]  }d|d 
 c}d!d"d#t!        |      d$t!        |	      d%t#        d& |	D              d't#        d( |	D              d)t#        d* |	D              d+t!        |      d,|D cg c]  }d|d 
 c}d-t%        |      xr t!        |      t#        d. |	D              k(  t#        d/ |	D              t!        |
      t#        d0 |
D              |d1d2|g d3|d4	S c c}w c c}w c c}w c c}w c c}w c c}w )5N0save_selector_selected_pointer_opcode_paths.json0save_selector_opcode08_unreadable_producers.json	   contextScansr*   rows	opcodeHex0x09r7   r(   r8   r   activationsproducerproducerOpcodeHexproducerValueSectionr&   r'   r	   a)  Opcode 0x09 zero-extends the stream mode byte and only implements modes 0 and 1; unsupported modes jump to the handler epilogue without a selected-pointer store. The unsupported source/predecessor opcode 0x09 rows are pointer-shaped low-byte collisions: the full dword lands in mapped .text/.data while only its low byte is 0x09. They do not decode a stored selected pointer and therefore do not provide a static path into current selector 2:0. Valid source/predecessor opcode 0x09 rows are mode 0 next-stream stores back into their own selector ranges.sourcetargetsourceSelectorpredecessorSelectorcurrentSelectoropcode09HandlerHexhandlerVaHexopcode09ModeSourcezzero-extended-u8opcode09SupportedModesHex0x02xr6   Topcode09RowCount#sourceOrPredecessorOpcode09RowCount,sourceOrPredecessorSupportedOpcode09RowCountc              3  ,   K   | ]  }|d    s	d  yw)r4   r	   N .0r<   s     r   	<genexpr>z build_summary.<locals>.<genexpr>   s     ;x#befvbwA;x   
2sourceOrPredecessorUnsupportedModeOpcode09RowCountc              3  ,   K   | ]  }|d    s	d  ywr7   r	   Nr^   r_   s     r   ra   z build_summary.<locals>.<genexpr>   s     Ahkl}h~!Arb   +sourceOrPredecessorPointerCollisionRowCountc              3  ,   K   | ]  }|d    s	d  yw)r8   r	   Nr^   r_   s     r   ra   z build_summary.<locals>.<genexpr>   s     :yadewax1:yrb   7sourceOrPredecessorUnsupportedModePointerCollisionCount&sourceOrPredecessorUnsupportedModesHex7sourceOrPredecessorUnsupportedModesAllPointerCollisionsc              3  ,   K   | ]  }|d    s	d  ywre   r^   r_   s     r   ra   z build_summary.<locals>.<genexpr>   s     P=N9O1Prb   c              3  ,   K   | ]  }|d    s	d  yw)r3   r	   Nr^   r_   s     r   ra   z build_summary.<locals>.<genexpr>   s     8ys_bcw_x8yrb   c              3  ,   K   | ]  }|d    s	d  ywre   r^   r_   s     r   ra   z build_summary.<locals>.<genexpr>   s     5jCSVWhSia5jrb   Fblocked)z5capture selected-pointer runtime state at opcode 0x08z)capture a real selector 2:0 gameplay savez3find a strict map1_01a source coordinate or hotspot)	)sourceOrPredecessorCurrentRangeStoreCountcurrentOpcode09RowCount&currentUnsupportedModeOpcode09RowCount%activationLinkedPointerCollisionCount%opcode09PointerCollisionPromotesRoutepromotionStatusrH   remainingProofs
conclusion)r   OUTr   r   r:   appendrB   SOURCE_SELECTORPREDECESSOR_SELECTORCURRENT_SELECTORsorted
isinstancer   SOURCETARGETr;   lensumbool)exeselected_pointer_opcode_pathsunreadable_producersr!   handlerrH   scanr*   r<   source_or_predecessorcurrent_rowsunsupported_source_modesunsupported_pointer_collisions!activation_linked_collision_countrL   rv   r(   s                    r   build_summaryr   S   s   
 %B %Y@@
F! 0 9@@
4 S!H h5GD-11.AGR C88J'88F#)r 	CCww{#v-L8SAB	CC 77:?4H"II 	  $(SC377:+>BR+RCSLS%('77$%*SWWV_c*J 	'   -&77$%#''2D*E 	&" & )*%#''6<" 377:&,"LL,-734@237II-2-3	% #&#&# 	/# 	3	#
 	+# 	gkk.9# 	0# 	$&IaBb%c$4*o%c# 	-d# 	CI# 	.s3H/I# 	7;xI^;x8x# 	=cAOdA># 	6s:yH]:y7y# 	B3GeCf#  	1Og2htRSz?2h!#" 	B)* Q23P 5PPQ'#, 698yF[8y5y#&|#4255j<5j2j1R16$

 !E# #? T'
&: &d 3is+   &M/M	M	AM/+MMMc                    | j                  d      rd| j                  d       S | j                  d      r'd| j                  d      xs | j                  d       S | j                  d      xs d	S )
Nr8   z
collision r,   r4   zstore r1   r/   r9   -)r:   )r<   s    r   	row_briefr      so    
ww!"CGGN3455
ww  78XCGGDW<XYZZ77#$++r   c                b   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j                  | d          d| d     d!| d"    d#| d$    d%| d&    d'| d(    d)| d*    d	d| d+   dd,dd-d.g}| d/   D ]  }|j                  d0|j                  d1       d2|j                  d3       d2|j                  d4       d2|j                  d5       d6|j                  d7       d8|j                  d9      xs d: d;|j                  d<      xs d: d6t        |       d=        |j	                  g d>       |j	                  d? | d@   D               |j                  d       dAj                  |      S )BNz.# Save Selector Opcode 0x09 Pointer Collisions z	- route: rO   z -> rP   z- opcode 0x09 handler: `rT   `z- opcode 0x09 mode source: rV   z- opcode 0x09 supported modes: , rW   z*- unsupported modes return without store: r6   z- opcode 0x09 rows: rZ   z'- source/predecessor opcode 0x09 rows: r[   z1- source/predecessor supported opcode 0x09 rows: r\   z8- source/predecessor unsupported-mode opcode 0x09 rows: rc   z-- source/predecessor pointer-collision rows: rf   z:- source/predecessor unsupported-mode pointer collisions: rh   z(- source/predecessor unsupported modes: ri   z?- source/predecessor unsupported modes all pointer collisions: rj   z+- source/predecessor current-range stores: ro   z-- current unsupported-mode opcode 0x09 rows: rq   z(- activation-linked pointer collisions: rr   z-- opcode09 pointer collision promotes route: rs   z- promotion status: `rt   rv   z## Rowszc| selector | va | value | mode | mode supported | value section | stored pointer | classification |z1| --- | --- | --- | --- | --- | --- | --- | --- |rH   z| `r*   z` | `r+   r%   r-   z` | r5   z | r,   r   z | `r.   z |)r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw)z- Nr^   r`   items     r   ra   zmarkdown.<locals>.<genexpr>   s     D2dVDs   ru   
)joinrx   r:   r   extend)summarylinesr<   s      r   markdownr      s   8

GH%&d78+<*=>
"7+?#@"AC
%g.B&C%DE
)$))G<W4X*Y)Z[
4W=a5b4cd
w'9:;<
1':_2`1ab
;GDr<s;tu
B7K  DA  CB  	C
7@m8n7op
DW  NG  FH  EI  	J
2499WEm=n3o2pq
I'  SL  KM  JN  	O
5g>i6j5kl
7@h8i7jk
27;b3c2de
7@g8h7ij
(9 :;1=


m;7E: v 
#''*%&eCGGG,<+=U377:CVBW X	"#40H(I'J#cggVdNeNlilMm n*+2s34	#7GrK	

 
LL01	LLD1B)CDD	LL99Ur   c           #        dj                  d | d   D              }dj                  d | d   D              }dj                  d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 t        j                  d!j                  | d"                d#| d$    d%d&| d'    d(| d)    d*| d+    d,t        j                  d!j                  | d-                d.| d/    d0| d1    d2| d3    d%d4| d5    d6| d7    d8| d9    d:| d;    d%	d<t        j                  | d=          d>d?d@|dAdB| dCdDg      S )ENr   c              3    K   | ]q  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d	      xs d
             dt        j                  t        |j                  d      xs d
             dt        j                  t	        |             d t yw)z<tr><td><code>r*   z</code></td><td><code>r+   r%   r-   z</code></td><td>r5   z	</td><td>r,   r   z</td><td><code>r.   z
</td></tr>N)htmlescapestrr:   r   r_   s     r   ra   zhtml_page.<locals>.<genexpr>   s4      	[[SWWZ%8!9:; <[[SWWW%5!678 9[[SWWZ%8!9:; <[[SWWY%7!89: ;{{3sww'?@ABC D{{3sww~6=#>?@ A[[SWW-?%@%GC!HIJ K{{9S>*+ ,		s   E8E:rH   r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>N)r   r   r   s     r   ra   zhtml_page.<locals>.<genexpr>   s#     \tDKK-.e4\s   #%ru   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">z=  <title>Save Selector Opcode 0x09 Pointer Collisions</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[    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; }z,    th { background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z7  <h1>Save Selector Opcode 0x09 Pointer Collisions</h1>z  <p>route rO   z -&gt; rP   z; handler <code>rT   z</code>; mode source rV   z; supported modes r   rW   z); unsupported modes return without store r6   z.</p>z)  <p>source/predecessor opcode 0x09 rows r[   z,; source/predecessor pointer-collision rows rf   z&; unsupported-mode pointer collisions rh   z; unsupported modes ri   z+; unsupported modes all pointer collisions rj   z*; source/predecessor current-range stores ro   z,; opcode09 pointer collision promotes route rs   z3  <p>source/predecessor supported opcode 0x09 rows r\   z7; source/predecessor unsupported-mode opcode 0x09 rows rc   z,; current unsupported-mode opcode 0x09 rows rq   z'; activation-linked pointer collisions rr   z  <p>rv   z</p>z  <h2>Rows</h2>z  <table><thead><tr><th>selector</th><th>va</th><th>value</th><th>mode</th><th>mode supported</th><th>value section</th><th>stored pointer</th><th>classification</th></tr></thead><tbody>z  </tbody></table>z  <h2>Remaining Proofs</h2><ul>z</ul>z</body></html>)r   r   r   )r   	body_rowsproofss      r   	html_pager      s{   		  6? I WW\IZA[\\F99"PGq0es6&A
dkk'("345WT[[QYIZ=[<\\lmt  vJ  nK  mL  La  bf  bm  bm  nu  vJ  nK  bL  aM  M_  `d  `k  `k  lp  lu  lu  v}  ~Y  vZ  l[  `\  _]  ]F  GN  Os  Gt  Fu  uz  	{
3G<a4b3c  dP  QX  YF  QG  PH  Hn  ov  wp  oq  nr  rF  GK  GR  GR  SW  S\  S\  ]d  eM  ]N  SO  GP  FQ  Q|  }D  E~  }  |@  @j  kr  s^	  k_	  j`	  `	L
  M
T
  U
|
  M
}
  L
~
  ~
C  	D
=gFt>u=v  wn  ov  wk  ol  nm  mY  Za  bJ  ZK  YL  Ls  t{  |c  td  se  ej  	k
GL12348 	E
)&77  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_opcode09_pointer_collisions.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                  i             }t        ||j                  |j                         t!        d|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz--selected-pointerrD   z--unreadable-producersrE   z	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpz6wrote save selector opcode 0x09 pointer collisions -> r   )argparseArgumentParseradd_argumentr   ROOTrw   
parse_argsr   r   
read_bytesr   selected_pointerr   r   r   r   print)parserargsr   s      r   mainr     s   $$&F
dD=4HI
,4GyAyz
0tSK}E}~
$<
4DghD$'',$++R0G
 '4<<7	B4<<  SC  DC  CD  E  Fr   __main__)r   r   r   r   returnr   )r   
str | Noner   z
int | None)r!   
list[dict]r"   r   r   r   )r!   r   r*   r   r<   dictr   r   )NN)r   bytesr   dict | Noner   r   r   r   )r<   r   r   r   )r   r   r   r   r    )r   r   r   r   r   zPath | Noner   None)r   r   )+__doc__
__future__r   r   r   r   syspathlibr   typingr   r   insertr   __file__resolver   probe_exe_scene_tablesr   summarize_script_handler_tabler   r   r   r   rw   r~   r   ry   rz   r{   OPCODE09_HANDLERr;   r   r   r#   rB   r   r   r   r   r   r   __name__r^   r   r   <module>r      s   O "    
   3tH~--/667 8 0 R H~''*
Ul		   q6 80H 26(,W	W#.W &W 
	Wt,'T+\BF" zF r   