o
    �õ±j\!  ã                   @   s’   d dl Z d dlZd dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ G dd„ dƒZdS )é    N)ÚNTRegistryHeadr)ÚNTRegistryHbin)ÚNTRegistryNKÚNKFlag)ÚNTRegistryCell)Ú	ValueList)ÚNTRegistryHR)ÚNTRegistryLH)ÚNTRegistryRI)ÚREGTYPEc                   @   sþ   e Zd Zd1dejdedefdd„Zed1de	dedefd	d
„ƒZ
ed1dejdedefdd„ƒZed2dedefdd„ƒZdd„ Zdd„ Zdd„ Zd3dd„Zdd„ Zdd„ Zd4dd„Zd4d d!„Zd"d#„ Zd$d%„ Zd5d&d'„Zd4d(d)„Zd*d+„ Zd6d-d.„Zd7d/d0„ZdS )8ÚAIOWinRegHiveNTÚreaderÚ	root_hbinÚis_filec                 C   s>   || _ d | _d | _|| _|| _|d urtƒ | _i | _i | _d S ©N)r   ÚheaderÚrootr   r   r   Ú_AIOWinRegHive__cells_lookupÚ_AIOWinRegHive__key_lookup)Úselfr   r   r   © r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiowinreg/hive.pyÚ__init__   s   
zAIOWinRegHive.__init__Údatac                 C   s   t t | ¡||d�S ©N©r   r   )r   ÚioÚBytesIO)r   r   r   r   r   r   Ú
from_bytes   ó   zAIOWinRegHive.from_bytesÚbuffc                 C   s   t | ||d�S r   )r   )r    r   r   r   r   r   Úfrom_buffer!   s   zAIOWinRegHive.from_bufferÚ	file_pathc                 C   s   t t| dƒ|dd�S )NÚrbTr   )r   Úopen)r"   r   r   r   r   Ú	from_file%   r   zAIOWinRegHive.from_filec                 C   s   | j  ¡  d S r   )r   Úclose©r   r   r   r   r&   )   s   zAIOWinRegHive.closec                 C   s4   | j d u rt | j¡| _ | jd u r|  ¡ | _d S d S r   )r   r   Úreadr   r   Úsearch_root_keyr'   r   r   r   Úsetup,   s
   

ÿzAIOWinRegHive.setupc                 C   sÎ   | j sJ| j dd¡ d}d}|dkrF| j |d¡ t | j¡}|jD ]}t|jtƒr9t	j
|jjv r9|| _ |j  S q"||j7 }|j}|dkstdƒ‚| j jD ]}t|jtƒrbt	j
|jjv rb|j  S qNtdƒ‚)Né   r   éÿÿÿÿzCould not find root key!)r   r   Úseekr   r(   ÚcellsÚ
isinstancer   r   r   ÚROOTÚflagsÚoffset_nextÚ	Exception)r   Úhbin_offsetr2   ÚhbinÚcellr   r   r   r)   2   s.   

€
÷û
€zAIOWinRegHive.search_root_keyFc                 C   s4   || j vrtj| j|| jdd�}|| j |< | j | S ©NF©Ú
nk_partial)r   r   Úload_data_from_offsetr   r   )r   Úoffsetr9   r6   r   r   r   Ú__load_cell_from_offsetK   s   


z%AIOWinRegHive.__load_cell_from_offsetc                 C   s�   t dƒD ]A}| j|jdd�}t|tƒr|}qt|ttfƒr6|jD ]}|  ||¡}|d ur2|    S q  d S |j	 
¡ | 
¡ krC|  S  d S d S )Néÿ   Tr8   )ÚrangeÚ%_AIOWinRegHive__load_cell_from_offsetÚ	offset_nkr/   r   r
   r	   Úhash_recordsÚ_AIOWinRegHive__find_subkeyÚnameÚupper)r   Úhash_recÚkey_nameÚ_ÚsubkeyÚ	thash_recÚresr   r   r   Ú__find_subkeyQ   s    

ÿþòzAIOWinRegHive.__find_subkeyc                 C   s”   | j d u r	|  ¡  |  |j¡}|d u rd S t|tƒr.|jD ]}|  ||¡}|d ur-|  S q| |¡D ]}|  |¡}|j	 
¡ | 
¡ krG|  S q3d S r   )r   r*   r?   Úoffset_lf_stabler/   r
   rA   rB   Úget_key_offsetsrC   rD   )r   ÚparentrF   ÚkeyrI   rJ   r;   Úrecr   r   r   Úfind_subkeyb   s"   


ÿ
ÿzAIOWinRegHive.find_subkeyc                 C   s    | j d u r	|  ¡  t|ƒdk r| j S || jvrKd}| j }| d¡D ]$}|  ||¡}|d u r=|du r:td|||f ƒ‚ d S |d| 7 }|}q!|| j|< | j| S )Né   Ú ú\TzJCould not find subkey! Full path: %s Working path: %s Missing key name: %sz\%s)r   r*   Úlenr   ÚsplitrQ   r3   )r   Úkey_pathÚthrowÚworking_pathÚ
parent_keyrO   Úskeyr   r   r   Úfind_keyw   s"   



zAIOWinRegHive.find_keyc                 C   sZ   | j d u r	|  ¡  g }|  ||¡}|jdkr+| j|jdd�}|jD ]	}||  |¡7 }q!|S )Nr   Fr8   )r   r*   r\   Úsubkey_cnt_stabler?   rL   rA   Ú_AIOWinRegHive__get_name)r   rW   rX   ÚnamesrO   rP   rE   r   r   r   Úenum_keyŒ   s   


zAIOWinRegHive.enum_keyc                 C   s‚   g }t dƒD ]8}| j|jdd�}t|tƒr|}qt|ttfƒr/|jD ]	}||  |¡7 }q" |S |d u r6 |S | 	|j
¡  |S |S )Nr=   Fr8   )r>   r?   r@   r/   r   r
   r	   rA   r^   ÚappendrC   )r   rE   r_   rG   rH   rI   r   r   r   Ú
__get_name˜   s"   

ûýzAIOWinRegHive.__get_namec                 C   s�   | j d u r	|  ¡  g }|jdkr|S t | j|j|jd | j¡}|jD ]"}|dk r*q#| j	|dd�}|s4q#|j
dkr?| d¡ q#| |j¡ q#|S )Nr   é   Fr8   s   default)r   r*   Ú	value_cntr   r:   r   Úoffset_value_listr   Úrecord_offsetsr?   Úflagra   rC   )r   rO   ÚvaluesÚvlÚrecord_offsetÚblockr   r   r   Úlist_values«   s    



zAIOWinRegHive.list_valuesc           	      C   s&  | j d u r	|  ¡  |d u r.| d¡dkr| dd¡\}}n
t |¡}t |¡}|  ||¡}n|}|d u r6d S |jdkr=d S t	 
| j|j|jd | j¡}|jD ]>}|dk rUqN| j|dd�}|s_qN|jdkrw|dkrv|j|j| j| jd�f  S qN||j ¡ krŒ|j|j| j| jd�f  S qNtd	| ƒ‚)
Nú	r,   rc   r   Fr8   Údefault)r   zCould not find %s)r   r*   ÚfindrV   ÚntpathÚdirnameÚbasenamer\   rd   r   r:   r   re   r   rf   r?   rg   Ú
value_typeÚ	load_datarC   Údecoder3   )	r   Ú
value_pathrX   rO   rW   Ú
value_nameri   rj   rk   r   r   r   Ú	get_valueÀ   s8   





ÿÿzAIOWinRegHive.get_valuec                 C   s„   | j d u r	|  ¡  |  ||¡}|d u rd S |jdkr@| jdu r,| j |jd d d¡ n
| j |jd d¡ | j |j¡ 	d¡S d S )Nr   Tr+   é   z	utf-16-le)
r   r*   r\   Úoffset_classnamer   r   r-   r(   Úclass_name_lengthru   )r   rW   rX   rO   r   r   r   Ú	get_classâ   s   


ûzAIOWinRegHive.get_classc                 C   s(   | j d u r	|  ¡  | j|jdd�}|jS r7   )r   r*   r?   Ú	offset_skÚsd)r   rO   Úskr   r   r   Úget_sdò   s   
zAIOWinRegHive.get_sdr,   c                 c   sb   � |d8 }|dkrd S |   |¡D ]}|dkr|}n|d | }|V  |  ||¡D ]}|V  q(qd S )Nrc   r   rS   rT   )r`   Úwalk)r   ÚpathÚdepthrO   ÚnprJ   r   r   r   r�   ù   s   €ÿúzAIOWinRegHive.walkc                 c   s,  � |   dd¡D ]Œ}|du r| |¡dkr|V  |s|du r“|  |¡}|  |¡D ]k}| ¡ }|d | }|du rA| |¡dkrA|V  |du r’| j||d�\}	}
|	tjkr`|
 ¡  |¡dkr`|V  q'|	tj	kr{t
|
ƒD ]\}}| |¡dkry|V   nqiq'|
}t|
tƒr†| ¡ }t|
ƒ |¡dkr’|V  q'qd S )NrS   r,   TrT   )rO   )r�   ro   r\   rl   ru   rx   r   ÚREG_UNKNOWNÚhexÚREG_MULTI_SZÚ	enumerater/   ÚbytesÚstr)r   ÚpatternÚin_keysÚin_valuenamesÚ	in_valuesÚkeypathrO   Ú	valuenameÚ	valuepathÚ	valuetypeÚvalueÚiÚvalÚtr   r   r   Úsearch  s<   €

þ€
€åzAIOWinRegHive.search)NTr   )F)T)TN)r,   )TTT)Ú__name__Ú
__module__Ú__qualname__r   r   r   Úboolr   Ústaticmethodr‰   r   r!   rŠ   r%   r&   r*   r)   r?   rB   rQ   r\   r`   r^   rl   rx   r|   r€   r�   r—   r   r   r   r   r      s.    




"
r   )rp   r   Úaiowinreg.filestruct.headerr   Úaiowinreg.filestruct.hbinr   Úaiowinreg.filestruct.nkr   r   Úaiowinreg.filestruct.regcellr   Úaiowinreg.filestruct.valuelistr   Úaiowinreg.filestruct.hashrecordr   Úaiowinreg.filestruct.lhr	   Úaiowinreg.filestruct.rir
   Úaiowinreg.filestruct.vkr   r   r   r   r   r   Ú<module>   s   