
    UHj7                       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 ej                  j                  d e ee      j                         j                               ddlmZ  ee      j                         j"                  d   Zedz  Zdd	d
ddZdddddddZddZddZddZddZddZddZedk(  r e        yy) zCScan object field references relevant to opcode 0x24 state updates.    )annotationsN)Path)read_sections   outzobject/context statezobject action/resource selectorz opcode24 object slot/state fieldzobject state switch input)X   Y   a   g   z9opcode24 mode0 writes current object index to object+0x61z;opcode24 mode0 writes first available slot+3 to object+0x61z1opcode24 mode1 writes 0x0059e348+3 to object+0x61z/opcode24 mode2 writes 0x0059e347 to object+0x61z3opcode24 mode0 reads object+0x67 state switch inputz&opcode24 mode0 reads object+0x58 state)i@ i@ i@ i@ i@ im@ c                (    | dk(  ry| dk(  ry| dk(  ryy)N   read   write   zwrite-immediateunknown )opcodemodrms     F/home/exedev/hwanse/tools/summarize_save_selector_object_field_refs.pyinstruction_kindr   "   s#    ~~~     c                d   t        |       }t        d |D              }| |d   |d   |d   z    }g }t        t        |      dz
        D ]  }||   }|dvr||dz      }|t        vr|d   |z   }|dk7  rdnd	}	|j                  d
|dd
|d|t        |   t        |||dz            ||||	z    j                  d      t        j                  |      d        i }
t        D ]X  }|D cg c]  }|d   |k(  s| }}t        |   t        |      t        d |D              t        d |D              d|
d
|d<   Z t        D ci c]   }d
|d|D cg c]  }|d   |k(  s| c}" }}}|d   }d}d|
|||D cg c]  }|j                  d      s| c}|dS c c}w c c}w c c}}w c c}w )Nc              3  2   K   | ]  }|d    dk(  s|  yw)namez.textNr   ).0sections     r   	<genexpr>zscan_refs.<locals>.<genexpr>.   s     NG76?g3MN   rawraw_size   >   r   r   r      var      0x08x02xr    )vaHex	offsetHexoffsetfieldaccessrawHex	routeNoter,   c              3  2   K   | ]  }|d    dk(  sd  yw)r.   r   r   Nr   r   rows     r   r   zscan_refs.<locals>.<genexpr>I   s     MsS]f5LMr   c              3  J   K   | ]  }|d    j                  d      sd  yw)r.   r   r   N)
startswithr2   s     r   r   zscan_refs.<locals>.<genexpr>J   s!     Xc(m6N6Nw6W!Xs   ##)r-   totalreadswrites0x61an  The current opcode 0x24 mode 1 write at 0x0040c680 is one of several object+0x61 writes. There are also object+0x61 readers in nearby object/runtime handlers, but this static field-reference scan does not identify a direct save-selector leaf jump. It narrows the next task to consumers around 0x0040cc6d..0x0040ef09 and helper routines around 0x004334a3..0x004355f0.zJsimple .text scan for byte object-field references with 8-bit displacementr0   )scopeoffsetSummaryfieldRefsByOffsetobject61RefsrouteRelevantRefs
conclusion)r   nextrangelenOFFSETSappendr   hexROUTE_RELEVANT_VASgetsum)exesectionstextdatarowsposr   displacementr$   raw_len	by_offsetr,   r3   offset_rowsrefs_by_offsetobject61r?   s                    r   	scan_refsrU   ,   s*   S!HNxNNDtE{DK$z*::;DDSY]# c++C!G}w&$Z#~!1"S]l3/0"\*&vtC!G}=3sW}-11#6+//3
 	$ I 
&*Fsc(mv.EsFFV_%MkMMX{XX	(
	Bvcl#$
  VCL4KC3x=F3JCKKN  f%H	T  ^"+ -1JcSWW[5IcJ  % G L  Ks6   (F6FF'F"!F"%F'<F-F-"F'c                   ddd| j                  d       ddd| j                  d       dddd	d
g
}| j                  d      xs i j                         D ]b  \  }}|j                  d| d|j                  d       d|j                  d       d|j                  d       d|j                  d       d       d |j                  g d       | j                  d      xs g D ]`  }|j                  d|j                  d       d|j                  d       d|j                  d       d|j                  d      xs d d	       b | j                  d      xs i j                  d      xs g }|j                  g d       |D ]`  }|j                  d|j                  d       d|j                  d       d|j                  d       d|j                  d      xs d d	       b |j                  d       dj	                  |      S ) Nz'# Save Selector Object Field References zScope: r:   .z- conclusion: r?   z## Offset Summaryz*| offset | field | refs | reads | writes |z"| --- | --- | ---: | ---: | ---: |r;   z| `z` | r-   z | r6   r7   r8   z |)rW   z## object+0x61 ReferencesrW   "| va | access | raw | route note || --- | --- | --- | --- |r=   r*   r.   z | `r/   r0   -r<   0x58)rW   z!## object/context+0x58 ReferencesrW   rY   rZ   
)rG   itemsrD   extendjoin)summarylinesr,   r3   	context58s        r   markdownrd   a   s)   1

'++g&'q)

\234

4,E  O4:AAC }s6($swww'7&8CGGG<L;MSQTQXQXY`QaPbbefifmfmnvfwexxz{|}	LL   {{>*0b 
#'''"#4(9':$swwx?P>QQUVYV]V]^iVjVqnqUrrtu	

 ++128b==fEKI	LL    
#'''"#4(9':$swwx?P>QQUVYV]V]^iVjVqnqUrrtu	

 
LL99Ur   c                F   dj                  d | j                  d      xs i j                         D              }dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs i j                  d      xs g D              }dj                  d	d
ddt        j                  t        | j                  d                   ddt        j                  t        | j                  d                   ddd|ddd|ddd|dg      S )Nr]   c              3  .  K   | ]  \  }}d t        j                  t        |             dt        j                  t        |j                  d                   d|j                  d       d|j                  d       d|j                  d       d  yw)	<tr><td><code></code></td><td>r-   z	</td><td>r6   r7   r8   
</td></tr>NhtmlescapestrrG   )r   r,   r3   s      r   r   zhtml_page.<locals>.<genexpr>   s      	 FC	[[V-. /{{3swww/012 3www  !www  !wwx ! "		s   BBr;   c              3    K   | ]  }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	  y	w
rg   r*   rh   r.   z</td><td><code>r/   r0   r[   ri   Nrj   r2   s     r   r   zhtml_page.<locals>.<genexpr>   s       	[[SWWW%5!678 9{{3swwx0123 4[[SWWX%6!789 :{{3sww{3:s;<= >		   C	Cr=   c              3    K   | ]  }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	  y	wro   rj   r2   s     r   r   zhtml_page.<locals>.<genexpr>   s       	[[SWWW%5!678 9{{3swwx0123 4[[SWWX%6!789 :{{3sww{3:s;<= >		rp   r<   r\   zY<!doctype html><meta charset="utf-8"><title>Save Selector Object Field References</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z.<h1>Save Selector Object Field References</h1>z
<p>Scope: r:   z.</p>z<p>r?   z</p>z<h2>Offset Summary</h2>zm<table><thead><tr><th>offset</th><th>field</th><th>refs</th><th>reads</th><th>writes</th></tr></thead><tbody>z</tbody></table>z<h2>object+0x61 References</h2>z_<table><thead><tr><th>va</th><th>access</th><th>raw</th><th>route note</th></tr></thead><tbody>z'<h2>object/context+0x58 References</h2>)r`   rG   r^   rk   rl   rm   )ra   summary_rowsref_rowscontext58_rowss       r   	html_pageru      s1   99 	 $KK8>BEEG	 	L yy  ;;~.4" H YY  [[!45;@@HNB N 99e 	L8
T[[W[[%9!:;<EB
dkk#gkk,789:$?!w)i1i#  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok$save_selector_object_field_refs.jsonFr#   )ensure_asciiindentr]   zutf-8)encoding)mkdir
write_textjsondumps)ra   out_dirs     r   write_outputsr      sD    MM$M.55AA

7q9D@ B r   c                 j   t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                         }t        |j                  j                               }t        ||j                         t        d|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz	--out-dirzwrote object field refs -> ry   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsrU   rI   
read_bytesr   r   print)parserargsra   s      r   mainr      s    $$&F
dD=4HI
$<D++-.G'4<<(	'7](]'^
_`r   __main__)r   intr   r   returnrm   )rI   bytesr   dict)ra   r   r   rm   )ra   r   r   r   r   None)r   r   )__doc__
__future__r   r   rk   r   syspathlibr   pathinsertrm   __file__resolveparentprobe_exe_scene_tablesr   rw   r   r   rC   rF   r   rU   rd   ru   r   r   __name__r   r   r   <module>r      s    I "    
  3tH~--/667 8 0 H~''*
Ul
 
+
,
%	 LMCAE8 2j'T/da zF r   