o
    àý°j ã                   @   st  d dl mZ d dl mZ d dlZd dlZd dlmZmZmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$e ƒZ!G d%d&„ d&e
e!eƒƒZ"G d'd(„ d(eƒZ#G d)d*„ d*e#ƒZ$G d+d,„ d,e$ƒZ%G d-d.„ d.e$ƒZ&G d/d0„ d0e$ƒZ'G d1d2„ d2e$ƒZ(G d3d4„ d4e'ƒZ)G d5d6„ d6e(ƒZ*G d7d8„ d8e#ƒZ+G d9d:„ d:e#ƒZ,G d;d<„ d<eƒZ-e-ƒ Z.G d=d>„ d>e+ƒZ/G d?d@„ d@e/ƒZ0G dAdB„ dBe/ƒZ1G dCdD„ dDe#ƒZ2e2Z3G dEdF„ dFeƒZ4dS )Gé    )Údivision)Úprint_functionN)ÚpackÚunpack_fromÚcalcsize)Úwith_metaclassÚPY3)ÚLOG)ÚEnum)Úuuidtup_to_binc                   @   sÚ   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd+dd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zd,dd„Zedd„ ƒZd-dd„Zd-dd„Zdd„ Zedd„ ƒZd,dd „Zd,d!d"„Zd,d#d$„Zd,d%d&„Zd'd(„ Zd,d)d*„ZdS ).ÚNDRzb
    This will be the base class for all DCERPC NDR Types and represents a NDR Primitive Type
    © é   NFc                 C   s
  t  | ¡ || _i | _|du r*| jdkr| j| _| jdkr!| j| _t| dƒr*| j	| _
| j| j | j D ]D\}}|  |¡rF|| jd| j|< q3|dkrPd| j|< q3t| d¡ƒdkrrzt| d¡d	 ƒ| j|< W q3   d | j|< Y q3g | j|< q3|d urƒ|  |¡ d S d S )
NTr   Úalign64©ÚisNDR64ú:ó    ú=é   é   )ÚobjectÚ__init__Ú_isNDR64ÚfieldsÚcommonHdr64Ú	commonHdrÚstructure64Ú	structureÚhasattrr   ÚalignÚreferentÚisNDRÚlenÚsplitÚevalÚ
fromString©ÚselfÚdatar   Ú	fieldNameÚfieldTypeOrClassr   r   ú‰/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/dcerpc/v5/ndr.pyr   3   s0   




ÿzNDR.__init__c                 C   s<  t dƒ}||kr“| jdu rd| _t| j ¡ ƒD ]}t| j| tƒr)| j|  |¡ q| jdkr3| j| _	| j
dkr<| j
| _t| dƒrE| j| _| j	| j | j D ]B\}}t| j| tƒrŽ|| j| jkrŽt| j| tƒdu rŽ| | }|| jd| j|< d| j| jv rŠ|| j| jd< qN|| |< qNd S d S | jdu rœtdƒ‚d S )	N)z$71710533-BEBA-4937-8319-B5DBEF9CCC36z1.0FTr   r   r   ÚDatazShouldn't be here)r   r   Úlistr   ÚkeysÚ
isinstancer   ÚchangeTransferSyntaxr   r   r   r   r   r   r    r!   Ú	__class__ÚNDRPOINTERNULLÚ	Exception)r(   Ú	newSyntaxÚNDR64Syntaxr*   r+   Ú
backupDatar   r   r,   r1   P   s8   
€


$€è
þzNDR.changeTransferSyntaxc                 C   sP  t |tƒr;t| jd}t | j| tƒr|| j|< d S d| j| jv r7t | j| jd tƒr9|| j| jd< d S d S d S t |tƒr| j| jj|jjkrR|| j|< d S t | j| d tƒr‚| j| d jj|jjkrr|| j| d< d S t 	d| j| d jj ¡ d S t 	d| j| jj ¡ d S t | j| tƒr¡|| j| d< d S || j|< d S )Nr   r-   z0Can't setitem with class specified, should be %s)
r0   r3   r   r   Ú
NDRPOINTERr   r2   Ú__name__r	   Úerror©r(   ÚkeyÚvaluer   r   r,   Ú__setitem__r   s(   
þ
 zNDR.__setitem__c                 C   s8   t | j| tƒrd| j| jv r| j| d S | j| S ©Nr-   )r0   r   r   ©r(   r<   r   r   r,   Ú__getitem__‹   s   
zNDR.__getitem__c                 C   s   |   ¡ S ©N)ÚgetData©r(   r   r   r,   Ú__str__‘   s   zNDR.__str__c                 C   s   t |  ¡ ƒS rB   )r#   rC   rD   r   r   r,   Ú__len__”   s   zNDR.__len__r   c                 C   s   t |ƒ| S rB   )r#   )r(   r)   Úoffsetr   r   r,   Ú
getDataLen˜   ó   zNDR.getDataLenc                 C   ó    t  | ¡r| }t|tƒrdS dS ©NTF)ÚinspectÚisclassÚ
issubclassr   ©ÚfieldÚmyClassr   r   r,   r"   ›   ó
   

z	NDR.isNDRc                 C   s,  |d u r| j j}d| }td| ƒ | j| j | j D ]x}|d }|| jv r“t| j| tƒrE| j| j	d||f |d d td| ƒ qt| j| t
ƒrˆtd| ƒ t| j| ƒD ]&\}}t|tƒrw|j	d	||f |d d td
| ƒ qZtd|||f ƒ qZtd| ƒ qtd||| | f ƒ qd S )Nú z
%sr   z%s%s:{r   ©Úindentz%s}z%s[z%s%s:z%s,z%s%s: {%r},ú%s]z
%s%s: {%r})r2   r9   Úprintr   r   r!   r   r0   r   ÚdumpRawr.   Ú	enumerate)r(   ÚmsgrU   ÚindrP   ÚiÚnumÚjr   r   r,   rX   £   s*   
 
€îzNDR.dumpRawc                 C   s¦   |d u r| j j}d| }|dkrtd| dd | j| j | j D ]/\}}|| jv rPt| j| tƒrF| j| j	d||d f |d df q!td	| |  dd q!d S )
NrS   Ú ú%s©Úendz
%s%-31sr   r   rT   ú %r)
r2   r9   rW   r   r   r!   r   r0   r   Údump)r(   rZ   rU   r[   r*   Ú	fieldTyper   r   r,   rd   ¼   s   
(€ûzNDR.dumpc                 C   ó   | j S rB   )r    rD   r   r   r,   ÚgetAlignmentÉ   ó   zNDR.getAlignmentc                 C   sX   t | tƒrzt|  d¡d ƒ}W n	   d}Y nd}|dkr(|||  | }|S d}|S )Nr   r   )r0   Ústrr   r$   )re   ÚsoFarÚ	alignmentÚpadr   r   r,   ÚcalculatePadÌ   s   
þzNDR.calculatePadc                 C   sª   d}| j | j D ]J\}}z'|  ||¡}|dkr!||7 }|d| 7 }|  |||¡}||7 }|t|ƒ7 }W q tyR } zt t|ƒ¡ t d||| j	f ¡ ‚ d }~ww |S )Nr   r   ó   ¿ú#Error packing field '%s | %s' in %s©
r   r   rm   r   r#   r4   r	   r:   ri   r2   )r(   rj   r)   r*   r+   rl   ÚresÚer   r   r,   rC   Ý   s"   
€ýzNDR.getDatac                 C   s’   |}| j | j D ]<\}}z||  ||¡7 }||  ||||¡7 }W q tyD } zt t|ƒ¡ t d|||||d … f ¡ ‚ d }~ww || S ©Nú$Error unpacking field '%s | %s | %r'é   )r   r   rm   Úunpackr4   r	   r:   ri   )r(   r)   rG   Úoffset0r*   r+   rr   r   r   r,   r&   ú   s   
 €ýzNDR.fromStringc                 C   sÞ   t | j| tƒr| j|  |¡S | j| }|d d… dkrdS | d¡}t|ƒdkrOz
|  ||d |¡W S    t|d i | jƒ| j|< |  ||d |¡ Y S |d u rWtdƒ‚|d d… dkrjt	|d	ƒrh| ¡ S |S t||ƒS )
Nr   Ú_r   r   r   r   zTrying to pack Noner   rC   )
r0   r   r   rC   r$   r#   r   r%   r4   r   )r(   r*   r+   rj   r)   Útwor   r   r,   r     s&   



zNDR.packc                 C   s´   t | j| tƒr| j|  ||¡S | d¡}t|ƒdkr&|  ||d ||¡S |dkrKt |tƒr8| j|  ||¡S |  ||¡}|||| … | j|< |S t|||ƒd | j|< t	|ƒS )Nr   r   r   r   )
r0   r   r   r&   r$   r#   rv   rH   r   r   )r(   r*   r+   r)   rG   ry   ÚdataLenr   r   r,   rv   .  s   

z
NDR.unpackc                 C   s\   t |tƒdu rt|ƒS | d¡}t|ƒdkr|  |d |¡S |d d… dkr*t|ƒS t|ƒS )NFr   r   r   r   r   )r0   ri   r#   r$   ÚcalcPackSizer   )r(   r+   r)   ry   r   r   r,   r{   E  s   
zNDR.calcPackSizec                 C   sˆ   t |tƒdu rt|ƒ| S | d¡}t|ƒdkr!|  |d ||¡S | d¡}t|ƒdkr2t|ƒ| S |d d… dkr@t|ƒ| S t|ƒS )NFr   r   r   Ú*r   r   )r0   ri   r#   r$   ÚcalcUnPackSizer   ©r(   r+   r)   rG   ry   r   r   r,   r}   U  s   

zNDR.calcUnPackSize©NF©r   ©Nr   )r9   Ú
__module__Ú__qualname__Ú__doc__r!   r   r   r   r   r    Úitemr   r   r1   r>   rA   rE   rF   rH   Ústaticmethodr"   rX   rd   rg   rm   rC   r&   r   rv   r{   r}   r   r   r   r,   r   &   s<    
"








r   c                   @   ó   e Zd ZdZdZdS )ÚNDRSMALLr   ))r-   zb=0N©r9   r‚   rƒ   r    r   r   r   r   r,   rˆ   k  ó    rˆ   c                   @   r‡   )Ú	NDRUSMALLr   ))r-   zB=0Nr‰   r   r   r   r,   r‹   q  rŠ   r‹   c                   @   s   e Zd Zddd„ZdS )Ú
NDRBOOLEANNr   c                 C   sH   |d u r| j j}|dkrt|dd | d dkrtdƒ d S tdƒ d S )Nr_   rS   ra   r-   r   z TRUEz FALSE©r2   r9   rW   ©r(   rZ   rU   r   r   r,   rd   x  s   zNDRBOOLEAN.dumpr   )r9   r‚   rƒ   rd   r   r   r   r,   rŒ   w  s    rŒ   c                   @   r‡   )ÚNDRCHARr   ))r-   ÚcNr‰   r   r   r   r,   r   ƒ  rŠ   r   c                   @   r‡   )ÚNDRSHORTr   ))r-   z<h=0Nr‰   r   r   r   r,   r‘   ‰  rŠ   r‘   c                   @   r‡   )Ú	NDRUSHORTr   ))r-   z<H=0Nr‰   r   r   r   r,   r’     rŠ   r’   c                   @   r‡   )ÚNDRLONGr   ))r-   z<l=0Nr‰   r   r   r   r,   r“   •  rŠ   r“   c                   @   r‡   )ÚNDRULONGr   ©)r-   ú<L=0Nr‰   r   r   r   r,   r”   ›  rŠ   r”   c                   @   r‡   )ÚNDRHYPERé   ))r-   z<q=0Nr‰   r   r   r   r,   r—   ¡  rŠ   r—   c                   @   r‡   )Ú	NDRUHYPERr˜   ©)r-   ú<Q=0Nr‰   r   r   r   r,   r™   §  rŠ   r™   c                   @   r‡   )ÚNDRFLOATr   ))r-   z<f=0Nr‰   r   r   r   r,   rœ   ­  rŠ   rœ   c                   @   r‡   )ÚNDRDOUBLEFLOATr˜   ))r-   z<d=0Nr‰   r   r   r   r,   r   ³  rŠ   r   c                   @   s   e Zd Zdd„ ZdS )ÚEnumTypec                 C   s   | j | jS rB   )Ú	enumItemsr=   )r(   Úattrr   r   r,   Ú__getattr__º  rI   zEnumType.__getattr__N)r9   r‚   rƒ   r¡   r   r   r   r,   rž   ¹  s    rž   c                   @   s>   e Zd ZdZdZdZdZG dd„ deƒZdd„ Z	ddd„Z
d	S )ÚNDRENUMr   r   ))r-   z<H))r-   ú<Lc                   @   ó   e Zd ZdS )zNDRENUM.enumItemsN©r9   r‚   rƒ   r   r   r   r,   rŸ   Ì  ó    rŸ   c                 C   s&   t |tƒr|j| d< d S t | ||¡S r?   )r0   r
   r=   r   r>   r;   r   r   r,   r>   Ï  s   
zNDRENUM.__setitem__Nr   c                 C   sF   |d u r| j j}|dkrt|dd td|  | jd ¡j dd d S )Nr_   rS   ra   z %sr-   )r2   r9   rW   rŸ   r   ÚnamerŽ   r   r   r,   rd   Õ  s
   "zNDRENUM.dumpr   )r9   r‚   rƒ   r    r   r   r   r
   rŸ   r>   rd   r   r   r   r,   r¢   ½  s    r¢   c                   @   sp   e Zd Zedd„ ƒZedd„ ƒZddd„Zddd	„Zd
d„ Zdd„ Z	ddd„Z
ddd„Zddd„Zddd„ZdS )ÚNDRCONSTRUCTEDTYPEc                 C   rJ   rK   )rL   rM   rN   r8   rO   r   r   r,   Ú	isPointerß  rR   zNDRCONSTRUCTEDTYPE.isPointerc                 C   rJ   rK   )rL   rM   rN   ÚNDRUNIONrO   r   r   r,   ÚisUnionç  rR   zNDRCONSTRUCTEDTYPE.isUnionr   c                 C   sf   d}| j | j D ](\}}t| j| tƒr0|| j|  t|ƒ| ¡7 }|| j|  t|ƒ| ¡7 }q|S )Nr   )r   r   r0   r   r¨   ÚgetDataReferentsr#   ÚgetDataReferent)r(   rj   r)   r*   r+   r   r   r,   r¬   ï  s   €z#NDRCONSTRUCTEDTYPE.getDataReferentsc                 C   s°  d}|}t | dƒdu rdS d| jv r| d dkrdS | jD ]¸\}}z•t| j| tƒs2t| j| tƒrn| jr:d}d}nd}d	}|||  | }|dkrS||7 }d
| }	nd}	||7 }| j|  |¡}|	t||  	|¡ƒ | }n|  
||¡}
|
dkr‚||
7 }|d|
 7 }||  |||¡7 }t| j| tƒr¯|| j|  |t|ƒ ¡7 }|| j|  |t|ƒ ¡7 }|t|ƒ }W q tyÕ } zt t|ƒ¡ t d||| jf ¡ ‚ d }~ww |S )Nr   r!   FÚ
ReferentIDr   r˜   ú<Qr   r£   ó   ïó   Ìro   )r   r   r!   r0   ÚNDRUniConformantArrayÚNDRUniConformantVaryingArrayr   rC   r   ÚgetArrayMaximumSizerm   r¨   r¬   r#   r­   r4   r	   r:   ri   r2   )r(   rj   r)   ÚsoFar0r*   r+   ÚarrayItemSizeÚarrayPackStrÚpad0ÚarrayPaddingrl   rr   r   r   r,   r­   ÷  sN   
 
€ýz"NDRCONSTRUCTEDTYPE.getDataReferentc                 C   st   t |tƒdu rt|ƒS | d¡}t|ƒdkr3d}|D ]}|  | j¡r%d}n| j}||  ||¡7 }q|S t | ||¡S )NFr|   r   r   r   )r0   ri   r#   r$   r"   r…   r{   r   )r(   r+   r)   ry   ÚanswerÚeachr…   r   r   r,   r{   2  s   
zNDRCONSTRUCTEDTYPE.calcPackSizec                 C   sF   | j | j d d ur| j | j d dkr| j | j d S | j |  ¡ S )NÚMaximumCountr   )r   ÚgetArraySize)r(   r*   r   r   r,   r´   D  s   (z&NDRCONSTRUCTEDTYPE.getArrayMaximumSizec           	      C   s¼   | j rd}d}nd}d}|||  | }||7 }t| j| tƒr)t|||ƒd }n/t| j| tƒrNt|||ƒd }|| j| jd< t||||d  ƒd }n
t|||| ƒd }||| fS )Nr˜   r¯   r   r£   r   r¼   r   )r   r0   r   r²   r   r³   )	r(   r*   r)   rG   r¶   ÚarrayUnPackStrrl   Ú	arraySizeÚmaximumCountr   r   r,   r½   J  s   zNDRCONSTRUCTEDTYPE.getArraySizec                 C   s^   |}| j | j D ]"\}}t| j| tƒr*|| j|  ||¡7 }|| j|  ||¡7 }q|| S rB   )r   r   r0   r   r¨   ÚfromStringReferentsÚfromStringReferent)r(   r)   rG   rw   r*   r+   r   r   r,   rÁ   f  s   €z&NDRCONSTRUCTEDTYPE.fromStringReferentsc           
      C   s^  t | dƒdur	dS |}d| jv r| d dkrdS | jD ]\}}zgt| j| tƒs0t| j| tƒrO|  |||¡\}}||7 }| j|  |¡ | j|  ||¡}n||  	||¡7 }|  
||||¡}t| j| tƒr|| j|  ||| ¡7 }|| j|  ||| ¡7 }||7 }W q tyª }	 zt t|	ƒ¡ t d|||||d … f ¡ ‚ d }	~	ww || S )Nr!   Tr   r®   rt   ru   )r   r   r!   r0   r²   r³   r½   ÚsetArraySizer&   rm   rv   r¨   rÁ   rÂ   r4   r	   r:   ri   ©
r(   r)   rG   rw   r*   r+   r¿   ÚadvanceStreamÚsizerr   r   r   r,   rÂ   n  s4   
  €ýz%NDRCONSTRUCTEDTYPE.fromStringReferentc                 C   sL   t |tƒdu rt|ƒ| S | d¡}t|ƒdkrt|ƒ| S t | |||¡S )NFr|   r   )r0   ri   r#   r$   r   r}   r~   r   r   r,   r}   ”  s   
z!NDRCONSTRUCTEDTYPE.calcUnPackSizeNr€   )r9   r‚   rƒ   r†   r©   r«   r¬   r­   r{   r´   r½   rÁ   rÂ   r}   r   r   r   r,   r¨   Þ  s    



;


&r¨   c                   @   s^   e Zd Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zddd„Zddd„Z	ddd„Z
ddd„ZdS )ÚNDRArrayNr   c                 C   sÖ   |d u r| j j}d| }|dkrt|dd t| d tƒr_td| ƒ |d7 }t| jd ƒD ]"\}}t|tƒrH|jd| |d d	f td
ƒ q.td||f ƒ q.td|d d…  dd d S td| d  dd d S )NrS   r_   ra   r-   z
%s[z    r`   r   rT   ú,z%s %r,rV   éüÿÿÿrc   )	r2   r9   rW   r0   r.   rY   r   r   rd   )r(   rZ   rU   r[   r]   r^   r   r   r,   rd      s   

zNDRArray.dumpc                 C   s
   || _ d S rB   ©r¿   )r(   rÆ   r   r   r,   rÃ   ´  s   
zNDRArray.setArraySizec                 C   rf   rB   rÊ   rD   r   r   r,   r½   ·  rh   zNDRArray.getArraySizec                 C   sF   t | dƒr| jd ur|  | j¡r| jd D ]}| |¡ qt | |¡S )Nr…   r-   )r   r…   r"   r   r1   r¨   )r(   r5   r…   r   r   r,   r1   º  s
   zNDRArray.changeTransferSyntaxc                 C   sP   d}t | dƒr&| jd ur&|  | j¡r|  ¡  ¡ }n|  | jd¡}||kr&|}|S )Nr   r…   r   )r   r…   r"   rg   r{   )r(   r    ÚtmpAlignr   r   r,   rg   Ã  s   zNDRArray.getAlignmentc           	      C   s¶   d}|}| j D ]Q\}}z.|  |¡du r'|  ||¡}|dkr'||7 }|d| 7 }|  |||¡}||7 }|t|ƒ }W q tyX } zt t|ƒ¡ t d||| j	f ¡ ‚ d }~ww |S )Nr   Fr   ó   Êro   )
r   r"   rm   r   r#   r4   r	   r:   ri   r2   ©	r(   rj   r)   rµ   r*   r+   rl   rq   rr   r   r   r,   rC   Ñ  s&   €ýzNDRArray.getDatac           
      C   sŽ  |  d¡}t|ƒdkr¿d}|  | j¡r"d}| j}|| jd| jd< n
| j}d }|| jd< | j| D ]>}|  | jt|ƒ| ¡}	|	dkrH|d|	 7 }|d u rd|d	kr\tr\t|t	ƒr\t
|gƒ}|t||ƒ7 }q1|| t|ƒ| ¡7 }q1|d ur—| j| D ]}t|tƒr–|| t|ƒ| ¡7 }|| t|ƒ| ¡7 }qy| jd= t| tƒs¥t| tƒr±|  t| j| ƒ¡ |S t| j| ƒ| j|d
 < |S t | |||¡S )Nr|   r   r   r   r   Ú_tmpItemr   ó   Ýr   r   )r$   r#   r"   r…   r   r   rm   r   r0   ÚintÚbytesr   rC   r¨   r¬   r­   r²   r³   rÃ   )
r(   r*   r+   rj   ry   rº   r…   Ú	dataClassr»   rl   r   r   r,   r   è  s@   



€þzNDRArray.packc                 C   s¤   |}| j | j D ]E\}}z|  |¡du r||  ||¡7 }|  ||||¡}||7 }W q tyM } zt t|ƒ¡ t d|||||d … f ¡ ‚ d }~ww || S )NFrt   ru   )	r   r   r"   rm   rv   r4   r	   r:   ri   )r(   r)   rG   rw   r*   r+   rÆ   rr   r   r   r,   r&     s    €ýzNDRArray.fromStringc                 C   sæ  |  d¡}g }d}|}t|ƒdkrêt| tƒr|  ¡ }	nt| tƒr'| |d  }	n| |d  }	|  | j¡rBd}
| j}|| jd| j	d< n
| j}
d }|
| j	d< d}|	rª|t|ƒ| k rª|  
| j|| ¡}|dkri||7 }|d u r|t|
ƒ }| t|
||| ƒd ¡ n|| jd}| ||| ¡}| |¡ ||| 7 }|	d8 }	|}|	rª|t|ƒ| k sX|d urÛt|ƒ tƒrÛg }|D ]}| ||| ¡}||7 }| ||| ¡}||7 }| |¡ q¸|}~| j	d= || j	|< || | S t | ||||¡S )Nr|   r   r   r   r   r   rÎ   )r$   r#   r0   r²   r½   r³   r"   r…   r   r   rm   r   Úappendr   r&   r¨   rÁ   rÂ   rv   )r(   r*   r+   r)   rG   ry   rº   Ú
soFarItemsrw   ÚnumItemsr…   ÚdataClassOrCodeÚnsofarrl   ÚitemnrÆ   Úanswer2r   r   r,   rv   $  s\   





ó
zNDRArray.unpackr   r€   )r9   r‚   rƒ   rd   rÃ   r½   r1   rg   rC   r   r&   rv   r   r   r   r,   rÇ   Ÿ  s    
	


+rÇ   c                   @   s   e Zd ZdZdS )ÚNDRUniFixedArray©)r-   r   N)r9   r‚   rƒ   r   r   r   r   r,   rÚ   c  s    rÚ   c                   @   s*   e Zd ZdZdZdZd	dd„Zdd„ ZdS )
r²   r   ))r-   z*MaximumCountNFc                 C   ó   t  | ||¡ d| jd< d S ©Nr   r¼   ©rÇ   r   r   ©r(   r)   r   r   r   r,   r   u  ó   zNDRUniConformantArray.__init__c                 C   ó   d | j d< t | ||¡S )Nr¼   ©r   rÇ   r>   r;   r   r   r,   r>   z  ó   
z!NDRUniConformantArray.__setitem__r   )r9   r‚   rƒ   r…   r   r   r   r>   r   r   r   r,   r²   i  s    
r²   c                   @   s    e Zd ZdZdZdZdd„ ZdS )ÚNDRUniVaryingArrayr   )©ÚOffsetr–   ©ÚActualCountz<L=len(Data)©r-   z*ActualCount)©ræ   r›   ©rè   z<Q=len(Data)ré   c                 C   rá   )Nrè   râ   r;   r   r   r,   r>     rã   zNDRUniVaryingArray.__setitem__N)r9   r‚   rƒ   r…   r   r   r>   r   r   r   r,   rä   €  s
    rä   c                   @   s8   e Zd ZdZdZdZdZddd„Zd	d
„ Zddd„Z	dS )r³   r   )rå   rç   )rê   rë   )ré   NFc                 C   rÜ   rÝ   rÞ   rß   r   r   r,   r   £  rà   z%NDRUniConformantVaryingArray.__init__c                 C   s"   d | j d< d | j d< t | ||¡S )Nr¼   rè   râ   r;   r   r   r,   r>   ¨  s   

z(NDRUniConformantVaryingArray.__setitem__r   c           	      C   s®   d}|}| j | j D ]J\}}z'|  ||¡}|dkr#||7 }|d| 7 }|  |||¡}||7 }|t|ƒ }W q
 tyT } zt t|ƒ¡ t d||| j	f ¡ ‚ d }~ww |S )Nr   r   ó   Ëro   rp   rÍ   r   r   r,   rC   ­  s$   €ýz$NDRUniConformantVaryingArray.getDatar   r€   )
r9   r‚   rƒ   r…   r   r   r   r   r>   rC   r   r   r   r,   r³   ’  s    
r³   c                   @   s    e Zd Zddd„Zddd„ZdS )ÚNDRVaryingStringr   c                 C   s^   | d dd … dkr)t rt| d tƒdu r| d d | d< nd | d ¡d | d< t | |¡S )Nr-   éÿÿÿÿó    Fr   )r   r0   r.   Újoinrä   rC   )r(   rj   r   r   r,   rC   Å  s
   zNDRVaryingString.getDatac                 C   s&   t  | ||¡}| d d d… | d< |S )Nr-   rî   )rä   r&   )r(   r)   rG   Úretr   r   r,   r&   Ð  s   zNDRVaryingString.fromStringNr€   )r9   r‚   rƒ   rC   r&   r   r   r   r,   rí   Ä  s    
rí   c                   @   r¤   )ÚNDRConformantVaryingStringNr¥   r   r   r   r,   rò   ×  r¦   rò   c                   @   s(   e Zd Zd	dd„Zd	dd„Zdd„ ZdS )
Ú	NDRSTRUCTr   c                 C   sì  d}d}|}| j | j d d }t| j| tƒs t| j| tƒrH| jr(d}d}nd}d}|||  | }|dkrA||7 }d| }nd}||7 }nd}|  ¡ }	|	dkrh|	||	  |	 }
|
dkrh||
7 }|d	|
 7 }| j | j D ]…\}}zbt| j| tƒsƒt| j| tƒr¼| j|  |¡}t| t	ƒr«|d |… }||d … }|| t
||  |¡ƒ | }n|t
||  |¡ƒ | }d}d}n|  
|||¡}||7 }|t|ƒ t|ƒ | }W qn tyó } zt t|ƒ¡ t d
||| jf ¡ ‚ d }~ww |S )Nr   rî   r   r˜   r¯   r   r£   ó   îó   «ro   )r   r   r0   r   r²   r³   r   rg   rC   r8   r   r´   r#   r4   r	   r:   ri   r2   )r(   rj   r)   r¹   rµ   ÚlastItemr¶   r·   r¸   rk   rl   r*   r+   rq   ÚpointerDatarr   r   r   r,   rC   Þ  sX    

 
€ýzNDRSTRUCT.getDatac                 C   s¾  |}| j | j d d }t| tƒr9| j}|  ¡ }|dkr&||||  | 7 }| j D ]\}}||  ||||¡7 }q)n| j | j }t| j| tƒsOt| j| tƒr’| j	rWd}	d}
nd}	d}
||	||	  |	 7 }t| j| tƒr~t
|
||ƒd }| j|  |¡ nt
|
||ƒd }|| j| jd< ||	7 }|  ¡ }|dkr¤||||  | 7 }|D ]4\}}z||  ||||¡7 }W q¦ tyÚ } zt t|ƒ¡ t d|||||d	 … f ¡ ‚ d }~ww || S )
Nrî   r   r˜   r¯   r   r£   r¼   rt   ru   )r   r   r0   r8   rg   rv   r   r²   r³   r   r   rÃ   r4   r	   r:   ri   )r(   r)   rG   rw   rö   ÚstructureFieldsrk   r*   r+   r¶   r¾   r¿   rÀ   rr   r   r   r,   r&   E  sJ   
ÿ  €ýzNDRSTRUCT.fromStringc                 C   s\   d}| j | j | j D ] \}}t| j| tƒr| j|  ¡ }n|  |d¡}||kr+|}q|S )Nr   r   )r   r   r!   r0   r   r   rg   r{   )r(   r    r*   r+   rË   r   r   r,   rg   ”  s   €zNDRSTRUCT.getAlignmentNr€   )r9   r‚   rƒ   rC   r&   rg   r   r   r   r,   ró   Ý  s    

gOró   c                   @   sR   e Zd ZdeffZdeffZi Zddd„Zdd„ Z	dd	d
„Z
ddd„Zdd„ ZdS )rª   ÚtagNFc                 C   sF  || _ || _i | _|du r(| jdkr| j| _| jdkr| j| _t| dƒr(| j| _	| j| j | j
 D ]d\}}|  |¡rd|  |¡rJ|| j|d| j|< q1|  |¡rZ|| j|d| j|< q1|| jd| j|< q1|dkrnd | j|< q1t| d¡ƒdkrzt| d¡d	 ƒ| j|< W q1   d | j|< Y q1d
| j|< q1|d ur¡|  |¡ d S d S ©NTr   r   ©r   ÚtopLevelr   r   r   r   r   r   )rü   r   r   r   r   r   r   r   r   r    r!   r"   r©   r«   r#   r$   r%   r&   )r(   r)   r   rü   r*   r+   r   r   r,   r   Ä  s8   





ÿzNDRUNION.__init__c                 C   sº   |dkrVd| _ || jv r&| j| f| _ | jd | j| jd || jd d< d S d| jv rP| jd d u r6d| _ n| jd f| _ | jd | j| jd d| jd d< d S td| ƒ‚t | ||¡S )Nrù   r   rû   r-   Údefaultéÿÿ  úUnknown tag %d for union!)	r   Úunionr   r   rü   r   r4   r¨   r>   r;   r   r   r,   r>   ç  s   

zNDRUNION.__setitem__r   c                 C   sà  d}|}|   ¡ }|dkr|||  | }nd}|dkr%||7 }|d| 7 }| jD ]J\}}z'|  ||¡}|dkrA||7 }|d| 7 }|  |||¡}||7 }|t|ƒ }W q( tyr }	 zt t|	ƒ¡ t d||| j	f ¡ ‚ d }	~	ww | j
ryd}
n
t| dƒrd}
nd	}
|
||
  |
 }|dkr™|d
| 7 }||7 }| jdkr |S | jD ]J\}}z'|  ||¡}|dkr¼||7 }|d| 7 }|  |||¡}||7 }|t|ƒ }W q£ tyí }	 zt t|	ƒ¡ t d||| j	f ¡ ‚ d }	~	ww |S )Nr   r   ó   ¼ó   »ro   r˜   ÚnotAlignr   r   ó   ½r   ó   ¾)rg   r   rm   r   r#   r4   r	   r:   ri   r2   r   r   r   )r(   rj   r)   rµ   rk   rl   r*   r+   rq   rr   r    r   r   r,   rC   ÿ  sf   €ý


€ýzNDRUNION.getDatac                 C   sX  |}|   ¡ }|dkr|||  | }nd}|dkr||7 }t|ƒ| dkr„| jd d jd d  d¡d }t|||ƒd }|| jv rU| j| f| _| jd | j| j	d n/d| jv r~| jd d u red| _n| jd f| _| jd | j| j	d d| j
d	 d
< ntd| ƒ‚| jD ]<\}}	z||  |	|¡7 }||  ||	||¡7 }W q‡ tyÃ }
 zt t|
ƒ¡ t d||	|||d … f ¡ ‚ d }
~
ww | jrÊd}n
t| dƒrÒd}nd}||||  | 7 }| jdkrç|| S | jD ]=\}}	z||  |	|¡7 }||  ||	||¡7 }W qê ty' }
 zt t|
ƒ¡ t d||	|||d … f ¡ ‚ d }
~
ww || S )Nr   r   r   r   rû   rý   r   rþ   rù   r-   rÿ   rt   ru   r˜   r  )rg   r#   r   r   r$   r   r   r   r   rü   r   r4   rm   rv   r	   r:   ri   r   )r(   r)   rG   rw   rk   rl   Útagtyperù   r*   r+   rr   r    r   r   r,   r&   B  sb   "

 €ý


 €ýzNDRUNION.fromStringc                 C   sž   d}| j r| j| j }n| j}|D ] \}}t| j| tƒr%| j|  ¡ }n|  |d¡}||kr1|}q| j rM| j 	¡ D ]\}}|| j d ¡ }||krL|}q:|S )Nr   r   r   )
r   r   r   r0   r   r   rg   r{   r   Úvalues)r(   r    r   r*   r+   rË   r   r   r,   rg   ˆ  s$   €€zNDRUNION.getAlignment©NFFr€   )r9   r‚   rƒ   r’   r   r”   r   r   r   r>   rC   r&   rg   r   r   r   r,   rª   ·  s    ÿÿ
#

CFrª   c                   @   s&   e Zd ZdZdZdZdZd	dd„ZdS )
r3   r   r˜   r•   rš   Nr   c                 C   s8   |d u r| j j}|dkrtd| dd tddd d S )Nr_   r`   rS   ra   ú NULLr   rŽ   r   r   r,   rd   ¯  s
   zNDRPOINTERNULL.dumpr   )r9   r‚   rƒ   r    r   r   r   rd   r   r   r   r,   r3   ¥  s    r3   c                   @   s`   e Zd ZdZdZdZdZdZddd	„Zd
d„ Z	dd„ Z
ddd„Zddd„Zddd„Zdd„ ZdS )r8   r   r˜   ))r®   z<L=0xff))r®   z<Q=0xffrÛ   NFc                 C   sR   t j| d |d |du r| j| _d| _|d u r"t dd¡| jd< d S |  |¡ d S )Nr   Tr   r   rþ   r®   )ró   r   r!   r   ÚrandomÚrandintr   r&   ©r(   r)   r   rü   r   r   r,   r   Ç  s   zNDRPOINTER.__init__c                 C   s.   || j v du r| j d  ||¡S t | ||¡S )NFr-   )r   r>   ró   r;   r   r   r,   r>   ×  s   zNDRPOINTER.__setitem__c                 C   sR   || j v r!t| j | tƒrd| j | j v r| j | d S | j | S | j d  |¡S r?   )r   r0   r   rA   r@   r   r   r,   rA   Þ  s   

zNDRPOINTER.__getitem__r   c                 C   s‚   d}|   | jd d |¡}|dkr||7 }d| }| jd dkr9t| jƒdkr,d| d< n| jdu r5|d S |d	 S |t | |¡ S )
Nr   r   r   ó   ªr®   r-   Ts           s       )rm   r   r   r#   r!   r   ró   rC   )r(   rj   r)   rl   r   r   r,   rC   è  s   

zNDRPOINTER.getDatac                 C   sˆ   |   | jd d |¡}||7 }| jdu rd}nd}t|||ƒd dkr9d| d< d| jd< | jdu r5|d	 S |d
 S t | ||¡}|| S )Nr   r   Tr¯   r£   r®   r   r-   r˜   r   )rm   r   r   r   r   ró   r&   )r(   r)   rG   rl   Ú	unpackStrÚretValr   r   r,   r&   û  s   


zNDRPOINTER.fromStringc                 C   s„   |d u r| j j}|dkrtd| dd t| jd tƒr(| jd jd|d d S | d dkr6td	dd d S td
| d  dd d S )Nr_   r`   rS   ra   r-   rT   r®   r   r	  rc   )r2   r9   rW   r0   r   r   rd   rŽ   r   r   r,   rd     s   zNDRPOINTER.dumpc                 C   s   | j du rdS dS )NTr˜   r   )r   rD   r   r   r,   rg      s   
zNDRPOINTER.getAlignmentr  r€   r   )r9   r‚   rƒ   r    r   r   r   r!   r   r>   rA   rC   r&   rd   rg   r   r   r   r,   r8   ¹  s    




r8   c                   @   s   e Zd ZdeffZdS )ÚPNDRUniConformantVaryingArrayr-   N)r9   r‚   rƒ   r³   r!   r   r   r   r,   r  ,  s    ÿr  c                   @   s    e Zd ZdeffZddd„ZdS )ÚPNDRUniConformantArrayr-   NFc                 C   s   t  | |||¡ d S rB   )r8   r   r  r   r   r,   r   5  s   zPNDRUniConformantArray.__init__r  )r9   r‚   rƒ   r²   r!   r   r   r   r   r,   r  1  s    ÿr  c                   @   sL   e Zd ZdZdZdZdZdZdZddd„Z	ddd	„Z
dd
d„Zddd„ZdS )ÚNDRCALLr   r   NFc                 C   s@  || _ i | _|du r%| jdkr| j| _| jdkr| j| _t| dƒr%| j| _| j| j | j	 D ]d\}}|  
|¡ra|  |¡rG|| j dd| j|< q.|  |¡rW|| j dd| j|< q.|| j d| j|< q.|dkrkd | j|< q.t| d¡ƒdkrzt| d¡d	 ƒ| j|< W q.   d | j|< Y q.d
| j|< q.|d urž|  |¡ d S d S rú   )r   r   r   r   r   r   r   r   r    r!   r"   r©   r«   r#   r$   r%   r&   r'   r   r   r,   r   B  s6   





ÿzNDRCALL.__init__r   c                 C   s   t  | ||¡ tdƒ d S )Nz

)r¨   rd   rW   rŽ   r   r   r,   rd   c  s   zNDRCALL.dumpc           
      C   s¼  d}|}| j | j D ]Ñ\}}z®|  ||¡}|dkr#||7 }|d| 7 }t| j| tƒs3t| j| tƒr„| jr?d|d  d }nd|d  d }|  |||| ¡}|  	|¡}| jrnd|d  d }|d| td|ƒ | 7 }nd|d  d }|d| td|ƒ | 7 }n	||  |||¡7 }|t
|ƒ }t| j| tƒr»|| j|  |¡7 }|t
|ƒ }|| j|  |¡7 }|t
|ƒ }W q
 tyÛ }	 zt t|	ƒ¡ t d	||| jf ¡ ‚ d }	~	ww |S )
Nr   r   rõ   r˜   r   ó   Îr¯   r£   ro   )r   r   rm   r0   r   r²   r³   r   r   r´   r#   r¨   r¬   r­   r4   r	   r:   ri   r2   )
r(   rj   r)   rµ   r*   r+   rl   rq   r¿   rr   r   r   r,   rC   g  sH   ÿ
€€ýzNDRCALL.getDatac           
      C   s  |}| j | j D ]}\}}zUt| j| tƒst| j| tƒr2|  |||¡\}}| j|  |¡ ||7 }|  ||||¡}t| j| t	ƒr\|| j|  
||| ¡7 }|| j|  ||| ¡7 }||7 }W q ty… }	 zt t|	ƒ¡ t d|||||d … f ¡ ‚ d }	~	ww || S rs   )r   r   r0   r   r²   r³   r½   rÃ   rv   r¨   rÁ   rÂ   r4   r	   r:   ri   rÄ   r   r   r,   r&   —  s*   ÿ €ýzNDRCALL.fromStringr   r   r€   )r9   r‚   rƒ   r!   r   r   r   r   r    r   rd   rC   r&   r   r   r   r,   r  8  s    

!
0r  c                   @   r‡   )ÚUNKNOWNDATAr   rÛ   Nr‰   r   r   r   r,   r  ´  rŠ   r  )5Ú
__future__r   r   r
  rL   Ústructr   r   r   Úsixr   r   Úimpacketr	   Úimpacket.dcerpc.v5.enumr
   Úimpacket.uuidr   r   r   rˆ   r‹   rŒ   r   r‘   r’   r“   r”   r—   r™   rœ   r   Útyperž   r¢   r¨   rÇ   rÚ   r²   rä   r³   rí   rò   ró   rª   r3   ÚNULLr8   r  r  r  ÚNDRTLSTRUCTr  r   r   r   r,   Ú<module>   s`     G! B E2 [ osz