A NDR Full/Unique pointer field encapsulation. :param EMBEDDED: This pointer is embedded. This means that it's representation will not appear after the pointer (pointer deferral applies). See [C706] 14.3.12.3 - Algorithm for Deferral of Referents
| 1701 | |
| 1702 | |
| 1703 | class NDRFullPointerField(_FieldContainer): |
| 1704 | """ |
| 1705 | A NDR Full/Unique pointer field encapsulation. |
| 1706 | |
| 1707 | :param EMBEDDED: This pointer is embedded. This means that it's representation |
| 1708 | will not appear after the pointer (pointer deferral applies). |
| 1709 | See [C706] 14.3.12.3 - Algorithm for Deferral of Referents |
| 1710 | """ |
| 1711 | |
| 1712 | EMBEDDED = False |
| 1713 | EMBEDDED_REF = False |
| 1714 | |
| 1715 | def __init__(self, fld, ref=False, fmt="I"): |
| 1716 | self.fld = fld |
| 1717 | self.ref = ref |
| 1718 | self.default = None |
| 1719 | |
| 1720 | def getfield(self, pkt, s): |
| 1721 | fmt = _e(pkt.ndrendian) + ["I", "Q"][pkt.ndr64] |
| 1722 | remain, referent_id = NDRAlign(Field("", 0, fmt=fmt), align=(4, 8)).getfield( |
| 1723 | pkt, s |
| 1724 | ) |
| 1725 | |
| 1726 | # No value |
| 1727 | if referent_id == 0 and not self.EMBEDDED_REF: |
| 1728 | return remain, None |
| 1729 | |
| 1730 | # With value |
| 1731 | if self.EMBEDDED: |
| 1732 | # deferred |
| 1733 | ptr = NDRPointer( |
| 1734 | ndr64=pkt.ndr64, ndrendian=pkt.ndrendian, referent_id=referent_id |
| 1735 | ) |
| 1736 | pkt.deferred_pointers.append((ptr, partial(self.fld.getfield, pkt))) |
| 1737 | return remain, ptr |
| 1738 | |
| 1739 | remain, val = self.fld.getfield(pkt, remain) |
| 1740 | return remain, NDRPointer( |
| 1741 | ndr64=pkt.ndr64, ndrendian=pkt.ndrendian, referent_id=referent_id, value=val |
| 1742 | ) |
| 1743 | |
| 1744 | def addfield(self, pkt, s, val): |
| 1745 | if val is not None and not isinstance(val, NDRPointer): |
| 1746 | raise ValueError( |
| 1747 | "Expected NDRPointer in %s. You are using it wrong!" % self.name |
| 1748 | ) |
| 1749 | fmt = _e(pkt.ndrendian) + ["I", "Q"][pkt.ndr64] |
| 1750 | fld = NDRAlign(Field("", 0, fmt=fmt), align=(4, 8)) |
| 1751 | |
| 1752 | # No value |
| 1753 | if val is None and not self.EMBEDDED_REF: |
| 1754 | return fld.addfield(pkt, s, 0) |
| 1755 | |
| 1756 | # With value |
| 1757 | _set_ctx_on(val.value, pkt) |
| 1758 | s = fld.addfield(pkt, s, val.referent_id) |
| 1759 | if self.EMBEDDED: |
| 1760 | # deferred |
no outgoing calls
no test coverage detected
searching dependent graphs…