o
    j                    @   s  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 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 d0d1 d1e'Z*G d2d3 d3e'Z+G d4d5 d5e*Z,G d6d7 d7e+Z-G d8d9 d9e&Z.G d:d; d;e&Z/G d<d= d=eZ0e0 Z1G d>d? d?e.Z2G d@dA dAe2Z3G dBdC dCe2Z4G dDdE dEe&Z5e5Z6G dFdG dGeZ7dS )H    )division)print_functionN)packunpackcalcsize)with_metaclassPY3)logger)hexdump)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 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* 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/aiosmb/dcerpc/v5/ndr.pyr   =   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rt| j| tdu r| | }|| jd| j|< d| j| jv r|| j| jd< qN|| |< qNd S d S | jdu rt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-   r2   Z   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)
r1   r4   r   r   
NDRPOINTERr   r3   __name__LOGerrorr)   keyvaluer   r   r-   __setitem__|   s(   

 zNDR.__setitem__c                 C   s8   t | j| trd| j| jv r| j| d S | j| S Nr.   )r1   r   r   r)   r>   r   r   r-   __getitem__   s   
zNDR.__getitem__c                 C   s   |   S N)getDatar)   r   r   r-   __str__      zNDR.__str__c                 C   s   t |  S rD   )r$   rE   rF   r   r   r-   __len__   s   zNDR.__len__c                 C   s   t |S rD   )r$   )r)   r*   r   r   r-   
getDataLen   rH   zNDR.getDataLenc                 C       t | r| }t|trdS dS NTF)inspectisclass
issubclassr   fieldmyClassr   r   r-   r#      
   

z	NDR.isNDRr   c                 C   s,  |d u r| j j}d| }td|  | j| j | j D ]x}|d }|| jv rt| j| trE| j| j	d||f |d d td|  qt| j| t
rt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})r3   r:   printr   r   r"   r   r1   r   dumpRawr/   	enumerate)r)   msgrV   indrQ   inumjr   r   r-   rY      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 )
NrT    %sendz
%s%-31sr   r   rU    %r)
r3   r:   rX   r   r   r"   r   r1   r   dump)r)   r[   rV   r\   r+   	fieldTyper   r   r-   re      s   
(zNDR.dumpc                 C      | j S rD   )r!   rF   r   r   r-   getAlignment      zNDR.getAlignmentc                 C   sH   zt | dd }W n   d}Y |dkr |||  | }|S d}|S )Nr   r   )r   r%   )rf   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$   r5   r;   r<   strr3   )r)   rj   r*   r+   r,   rl   reser   r   r-   rE      s"   
zNDR.getDatac           	      C   s   |}| j | j D ]N\}}z(| ||}|dkr!||7 }||d  }| ||||}||d  }||7 }W q tyV } ztt| td|||d d f   d }~ww || S )Nr   $Error unpacking field '%s | %s | %r'   )r   r   rm   r   r5   r;   r<   rq   	r)   r*   rj   soFar0r+   r,   rl   sizers   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   rE   )
r1   r   r   rE   r%   r$   r   r&   r5   r    )r)   r+   r,   rj   r*   twor   r   r-   r     s&   



zNDR.packc                 C   s   |  ||}|d | }t| j| tr| j| ||S |d}t|dkr2| ||d ||S |dkrTt|trD| j| ||S | |}|d | | j|< |S t||d | j|< |S )Nr   r   r   r   )	calcUnPackSizer1   r   r   r'   r%   r$   r   rJ   )r)   r+   r,   r*   rj   rx   rz   dataLenr   r   r-   r   =  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   )r1   rq   r$   r%   calcPackSizer   r)   r,   r*   rz   r   r   r-   r}   U  s   
zNDR.calcPackSizec                 C   sz   t |tdu rt|S |d}t|dkr| |d |S |d}t|dkr-t|S |d d dkr9t|S t|S )NFr   r   r   *r   r   )r1   rq   r$   r%   r{   r   r~   r   r   r-   r{   e  s   

zNDR.calcUnPackSizeNFNr   r   )r:   
__module____qualname____doc__r"   r   r   r   r   r!   itemr   r   r2   r@   rC   rG   rI   rJ   staticmethodr#   rY   re   rh   rm   rE   r'   r   r   r}   r{   r   r   r   r-   r   0   s<    
"







r   c                   @      e Zd ZdZdZdS )NDRSMALLr   ))r.   zb=0Nr:   r   r   r!   r   r   r   r   r-   r   {      r   c                   @   r   )	NDRUSMALLr   ))r.   zB=0Nr   r   r   r   r-   r     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`   rT   rb   r.   r   z TRUEz FALSEr3   r:   rX   r)   r[   rV   r   r   r-   re     s   zNDRBOOLEAN.dumpr   )r:   r   r   re   r   r   r   r-   r     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 rD   )	enumItemsr?   )r)   attrr   r   r-   __getattr__  s   zEnumType.__getattr__N)r:   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r:   r   r   r   r   r   r-   r         r   c                 C   s&   t |tr|j| d< d S t| ||S rA   )r1   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`   rT   rb   z %sr.   )r3   r:   rX   r   r   namer   r   r   r-   re     s
   "zNDRENUM.dumpr   )r:   r   r   r!   r   r   r   r   r   r@   re   r   r   r   r-   r     s    r   c                   @   sl   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 Z
dddZdddZdd ZdS )NDRCONSTRUCTEDTYPEc                 C   rK   rL   )rM   rN   rO   r9   rP   r   r   r-   	isPointer  rS   zNDRCONSTRUCTEDTYPE.isPointerc                 C   rK   rL   )rM   rN   rO   NDRUNIONrP   r   r   r-   isUnion  rS   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   r1   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 ]\}}zt| 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"   r1   NDRUniConformantArrayNDRUniConformantVaryingArrayr   rE   r   getArrayMaximumSizerm   r   r   r$   r   r5   r;   r<   rq   r3   )r)   rj   r*   rw   r+   r,   arrayItemSizearrayPackStrpad0arrayPaddingrl   rs   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   )r1   rq   r$   r%   r#   r   r}   r   )r)   r,   r*   rz   answereachr   r   r   r-   r}   B  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   T  s   (z&NDRCONSTRUCTEDTYPE.getArrayMaximumSizec           	      C   s   | j rd}d}nd}d}|||  | }|dkr"||7 }||d  }t| j| tr6t||d | d }n<t| j| trct||d | d }|| j| jd< t|||d d  d | d }nt|||d  d | d }||| fS )Nr   r   r   r   r   r   r   )r   r1   r   r   r   r   )	r)   r+   r*   rj   r   arrayUnPackStrr   	arraySizemaximumCountr   r   r-   r   Z  s"   $zNDRCONSTRUCTEDTYPE.getArraySizec                 C   s~   |}| j | j D ]2\}}t| j| tr:| j| ||}||d  }||7 }| j| ||}||7 }||d  }q|| S rD   )r   r   r1   r   r   fromStringReferentsfromStringReferent)r)   r*   rj   rw   r+   r,   rx   r   r   r-   r   x  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 ]\}}zt| j| ts0t| j| trU| |||\}}||7 }||d  }| j| | | j| ||}n| 	||}	|	dkri||	7 }||	d  }| 
||||}t| j| tr|| j| ||d  || 7 }|| j| ||d  || 7 }||d  }||7 }W q ty }
 ztt|
 td|||d d f   d }
~
ww || S )Nr"   Tr   r   rt   ru   )r    r   r"   r1   r   r   r   setArraySizer'   rm   r   r   r   r   r5   r;   r<   rq   )r)   r*   rj   rw   r+   r,   r   advanceStreamrx   rl   rs   r   r   r-   r     s>   
 ""z%NDRCONSTRUCTEDTYPE.fromStringReferentc                 C   sB   t |tdu rt|S |d}t|dkrt|S t| ||S )NFr   r   )r1   rq   r$   r%   r   r{   r~   r   r   r-   r{     s   
z!NDRCONSTRUCTEDTYPE.calcUnPackSizeNr   )r:   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 )NrT   r`   rb   r.   z
%s[z    ra   r   rU   ,z%s %r,rW   rd   )	r3   r:   rX   r1   r/   rZ   r   r   re   )r)   r[   rV   r\   r^   r_   r   r   r-   re     s   

zNDRArray.dumpc                 C   s
   || _ d S rD   r   )r)   rx   r   r   r-   r     s   
zNDRArray.setArraySizec                 C   rg   rD   r   rF   r   r   r-   r     ri   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   r2   r   )r)   r6   r   r   r   r-   r2     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#   rh   r}   )r)   r!   tmpAlignr   r   r-   rh     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$   r5   r;   r<   rq   r3   	r)   rj   r*   rw   r+   r,   rl   rr   rs   r   r   r-   rE     s&   zNDRArray.getDatac           
      C   s  | d}t|dkrd}| | 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st| 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   r1   intbytesr   rE   r   r   r   r   r   r   )
r)   r+   r,   rj   rz   r   r   	dataClassr   rl   r   r   r-   r     s@   



zNDRArray.packc           	      C   s   |}| j | j D ]U\}}z/| |du r(| ||}|dkr(||7 }||d  }| ||||}||d  }||7 }W q ty] } ztt| td|||d d f   d }~ww || S )NFr   rt   ru   )	r   r   r#   rm   r   r5   r;   r<   rq   rv   r   r   r-   r'   .  s$   zNDRArray.fromStringc                 C   s  | d}g }d}|}t|dkrt| 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rg||7 }|d u r|t|
 }|t|
||| d  n|| jd}|||d  || }|| ||| 7 }|	d8 }	|}|	r|t|k sV|d urt| tr||d  }g }|D ]+}|||| }||7 }||d  }|||| }||7 }||d  }|| q|}~| j	d= || j	|< || | S t| ||||S )Nr   r   r   r   r   r   r   )r%   r$   r1   r   r   r   r#   r   r   r   rm   r   appendr   r'   r   r   r   )r)   r+   r,   r*   rj   rz   r   
soFarItemsrw   numItemsr   dataClassOrCodensofarrl   itemnrx   answer2r   r   r-   r   D  sb   






zNDRArray.unpackr   r   )r:   r   r   re   r   r   r2   rh   rE   r   r'   r   r   r   r   r-   r     s    
	


+r   c                   @   s   e Zd ZdZdS )NDRUniFixedArray)r.   r   N)r:   r   r   r   r   r   r   r-   r     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        zNDRUniConformantArray.__init__c                 C      d | j d< t| ||S )Nr   r   r   r@   r=   r   r   r-   r@        
z!NDRUniConformantArray.__setitem__r   )r:   r   r   r   r   r   r   r@   r   r   r   r-   r     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)r:   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-   rE     s$   z$NDRUniConformantVaryingArray.getDatar   r   )
r:   r   r   r   r   r   r   r   r@   rE   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   r1   r/   joinr   rE   )r)   rj   r   r   r-   rE     s
   zNDRVaryingString.getDatac                 C   s$   t | |}| d d d | d< |S )Nr.   r   )r   r'   )r)   r*   rj   retr   r   r-   r'     s   zNDRVaryingString.fromStringNr   )r:   r   r   rE   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st| 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   r1   r   r   r   r   rh   rE   r9   r   r   r$   r5   r;   r<   rq   r3   )r)   rj   r*   r   rw   lastItemr   r   r   rk   rl   r+   r,   rr   pointerDatars   r   r   r-   rE     sX    

 
zNDRSTRUCT.getDatac                 C   s  |}| j | j d d }t| j| tst| j| trz| jr"d}nd}|||  | }|dkr:||7 }||d  }||7 }t| trc|d | }| |||d  || \}}	|||d d   }n| |||\}}	||d  }| j| 	| | 
 }
|
dkr|
||
  |
 }|dkr||7 }||d  }| j | j D ]:\}}z| ||||}||d  }||7 }W q ty } ztt| td|||d d f   d }~ww || S )Nr   r   r   r   r   rt   ru   )r   r   r1   r   r   r   r   r9   r   r   rh   r   r5   r;   r<   rq   )r)   r*   rj   rw   r   r   r   r   r   r   rk   rl   r+   r,   rx   rs   r   r   r-   r'   h  sH    
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"   r1   r   r   rh   r}   )r)   r!   r+   r,   r   r   r   r-   rh     s   zNDRSTRUCT.getAlignmentNr   )r:   r   r   rE   r'   rh   r   r   r   r-   r      s    

gHr   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   r5   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      )rh   r   rm   r   r$   r5   r;   r<   rq   r3   r   r    r   )r)   rj   r*   rw   rk   rl   r+   r,   rr   rs   r!   r   r   r-   rE     sf   


zNDRUNION.getDatac                 C   s  |}|   }|dkr|||  | }nd}|dkr#||7 }||d  }t|dkr| jd d jd d dd }t||d t| d }|| jv r^| j| f| _| jd | j	| j
d n/d| jv r| jd d u rnd| _n| jd f| _| jd | j	| j
d d| jd	 d
< ntd| | jD ]N\}}	z(| |	|}|dkr||7 }||d  }| ||	||}
||
d  }||
7 }W q ty } ztt| td||	|d d f   d }~ww | j	rd}n
t| drd}nd}|||  | }|dkr||d  }||7 }| jdkr|| S | jD ]Q\}}	z*| |	|}|dkr-||7 }||d  }| ||	||}
||
d  }||
7 }W q tyd } ztt| td||	|d d f   d }~ww || S )Nr   r   r   r   r   r   r   r   r   r.   r   rt   ru   r   r   )rh   r$   r   r   r%   r   r   r   r   r   r   r   r5   rm   r;   r<   rq   r    )r)   r*   rj   rw   rk   rl   tagtyper   r+   r,   rx   rs   r!   r   r   r-   r'   ^  s~   "





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   r1   r   r   rh   r}   r   values)r)   r!   r   r+   r,   r   r   r   r-   rh     s$   zNDRUNION.getAlignmentNFFr   )r:   r   r   r   r   r   r   r   r   r@   rE   r'   rh   r   r   r   r-   r     s    
#

CXr   c                   @   s&   e Zd ZdZdZdZdZd	ddZdS )
r4   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`   ra   rT   rb    NULLr   r   r   r   r-   re     s
   zNDRPOINTERNULL.dumpr   )r:   r   r   r!   r   r   r   re   r   r   r   r-   r4     s    r4   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 )r9   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 rA   )r   r1   r   rC   rB   r   r   r-   rC     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   rE   )r)   rj   r*   rl   r   r   r-   rE     s   

zNDRPOINTER.getDatac                 C   s   |  | jd d |}|dkr||7 }||d  }| jdu r!d}nd}t||d t| d dkrHd| d< d| jd< | jdu rD|d	 S |d
 S t| ||}|| S )Nr   r   Tr   r   r   r   r.   r   r   )rm   r   r   r   r   r   r   r'   )r)   r*   rj   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`   ra   rT   rb   r.   rU   r   r   r  rd   )r3   r:   rX   r1   r   r   re   r   r   r   r-   re   B  s   zNDRPOINTER.dumpc                 C   s   | j du rdS dS )NTr   r   )r   rF   r   r   r-   rh   P  s   
zNDRPOINTER.getAlignmentr  r   r   )r:   r   r   r!   r   r   r   r"   r   r@   rC   rE   r'   re   rh   r   r   r   r-   r9     s    




r9   c                   @   s   e Zd ZdeffZdS )PNDRUniConformantVaryingArrayr.   N)r:   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 rD   )r9   r   r	  r   r   r-   r   e  s   zPNDRUniConformantArray.__init__r  )r:   r   r   r   r"   r   r   r   r   r-   r  a  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   r  s6   





zNDRCALL.__init__r   c                 C   s   t | || td d S )Nz

)r   re   rX   r   r   r   r-   re     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   r1   r   r   r   r   r   r   r$   r   r   r   r5   r;   r<   rq   r3   )
r)   rj   r*   rw   r+   r,   rl   rr   r   rs   r   r   r-   rE     sH   
zNDRCALL.getDatac           
      C   s8  |}| j | j D ]\}}zit| j| tst| j| tr8| |||\}}| j| | ||7 }||d  }| ||||}t| j| t	rj|| j| 
||d  || 7 }|| j| ||d  || 7 }||d  }||7 }W q ty }	 ztt|	 td|||d d f   d }	~	ww || S )Nrt   ru   )r   r   r1   r   r   r   r   r   r   r   r   r   r5   r;   r<   rq   )
r)   r*   rj   rw   r+   r,   r   r   rx   rs   r   r   r-   r'     s.   ""zNDRCALL.fromStringr   r   r   )r:   r   r   r"   r   r   r   r   r!   r   re   rE   r'   r   r   r   r-   r  h  s    

!
0r  c                   @   r   )UNKNOWNDATAr   r   Nr   r   r   r   r-   r    r   r  )8
__future__r   r   r  rM   structr   r   r   sixr   r   aiosmbr	   r;   aiosmb.commons.utils.hexdumpr
   aiosmb.dcerpc.v5.enumr   aiosmb.dcerpc.v5.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   r4   NULLr9   r  r  r  NDRTLSTRUCTr  r   r   r   r-   <module>   sd     M! M M2 T  u|