Loading src/rpc/netlogon.cpp +29 −10 Changes for src/rpc/netlogon.cpp: 29 added lines, 10 removed lines. Original line number Diff line number Diff line Loading @@ -410,18 +410,37 @@ DispatchResult netlogonDispatch(uint16_t opnum, const std::vector<uint8_t> &stub }); DomainInfo di = primaryDomain(); p.u32(1); /* union discriminant */ p.ref(true); /* NETLOGON_DOMAIN_INFO* */ /* PrimaryDomain: NETLOGON_ONE_DOMAIN_INFO */ /* NETLOGON_ONE_DOMAIN_INFO; in the trust list with a TrustExtension * (an RPC_UNICODE_STRING carrying flags/parent/type/attributes) */ auto oneDomain = [&](bool trust) { p.unistrHeader(di.netbios); p.unistrHeader(di.dnsName); p.unistrHeader(di.forest); p.bytes(di.guid, 16); p.ref(true); /* DomainSid */ for (int i = 0; i < 4; ++i) { p.u16(0); p.u16(0); p.u32(0); } /* TrustExtension, Dummy2..4 */ if (trust) { p.u16(16); p.u16(16); p.ref(true); } else { p.u16(0); p.u16(0); p.u32(0); } for (int i = 0; i < 3; ++i) { p.u16(0); p.u16(0); p.u32(0); } /* Dummy2..4 */ for (int i = 0; i < 4; ++i) p.u32(0); /* DummyLong1..4 */ p.u32(0); /* TrustedDomainCount */ p.ref(false); /* TrustedDomains */ }; auto oneDomainDeferred = [&](bool trust) { p.unistrBuffer(di.netbios); p.unistrBuffer(di.dnsName); p.unistrBuffer(di.forest); p.sid(di.sid); if (trust) { p.u32(8); p.u32(0); p.u32(8); /* u16[8]: max, offset, actual */ p.u32(0x1d); /* IN_FOREST|TREEROOT|PRIMARY|NATIVE */ p.u32(0); /* ParentIndex */ p.u32(2); /* TrustType = UPLEVEL */ p.u32(0); /* TrustAttributes */ } }; p.u32(1); /* union discriminant */ p.ref(true); /* NETLOGON_DOMAIN_INFO* */ oneDomain(false); /* PrimaryDomain */ p.u32(1); /* TrustedDomainCount: ourselves, as a DC lists it */ p.ref(true); /* TrustedDomains */ p.u32(0); p.ref(false); /* LsaPolicy */ p.unistrHeader(dnsInDs); /* DnsHostNameInDs */ for (int i = 0; i < 3; ++i) { p.u16(0); p.u16(0); p.u32(0); } /* Dummy2..4 */ Loading @@ -429,10 +448,10 @@ DispatchResult netlogonDispatch(uint16_t opnum, const std::vector<uint8_t> &stub p.u32(encTypes); /* SupportedEncTypes */ p.u32(0); p.u32(0); /* deferred */ p.unistrBuffer(di.netbios); p.unistrBuffer(di.dnsName); p.unistrBuffer(di.forest); p.sid(di.sid); oneDomainDeferred(false); p.u32(1); /* TrustedDomains conformant count */ oneDomain(true); oneDomainDeferred(true); p.unistrBuffer(dnsInDs); p.u32(ST_OK); return DispatchResult{ST_OK, false, 0, p.buf}; Loading Loading
src/rpc/netlogon.cpp +29 −10 Changes for src/rpc/netlogon.cpp: 29 added lines, 10 removed lines. Original line number Diff line number Diff line Loading @@ -410,18 +410,37 @@ DispatchResult netlogonDispatch(uint16_t opnum, const std::vector<uint8_t> &stub }); DomainInfo di = primaryDomain(); p.u32(1); /* union discriminant */ p.ref(true); /* NETLOGON_DOMAIN_INFO* */ /* PrimaryDomain: NETLOGON_ONE_DOMAIN_INFO */ /* NETLOGON_ONE_DOMAIN_INFO; in the trust list with a TrustExtension * (an RPC_UNICODE_STRING carrying flags/parent/type/attributes) */ auto oneDomain = [&](bool trust) { p.unistrHeader(di.netbios); p.unistrHeader(di.dnsName); p.unistrHeader(di.forest); p.bytes(di.guid, 16); p.ref(true); /* DomainSid */ for (int i = 0; i < 4; ++i) { p.u16(0); p.u16(0); p.u32(0); } /* TrustExtension, Dummy2..4 */ if (trust) { p.u16(16); p.u16(16); p.ref(true); } else { p.u16(0); p.u16(0); p.u32(0); } for (int i = 0; i < 3; ++i) { p.u16(0); p.u16(0); p.u32(0); } /* Dummy2..4 */ for (int i = 0; i < 4; ++i) p.u32(0); /* DummyLong1..4 */ p.u32(0); /* TrustedDomainCount */ p.ref(false); /* TrustedDomains */ }; auto oneDomainDeferred = [&](bool trust) { p.unistrBuffer(di.netbios); p.unistrBuffer(di.dnsName); p.unistrBuffer(di.forest); p.sid(di.sid); if (trust) { p.u32(8); p.u32(0); p.u32(8); /* u16[8]: max, offset, actual */ p.u32(0x1d); /* IN_FOREST|TREEROOT|PRIMARY|NATIVE */ p.u32(0); /* ParentIndex */ p.u32(2); /* TrustType = UPLEVEL */ p.u32(0); /* TrustAttributes */ } }; p.u32(1); /* union discriminant */ p.ref(true); /* NETLOGON_DOMAIN_INFO* */ oneDomain(false); /* PrimaryDomain */ p.u32(1); /* TrustedDomainCount: ourselves, as a DC lists it */ p.ref(true); /* TrustedDomains */ p.u32(0); p.ref(false); /* LsaPolicy */ p.unistrHeader(dnsInDs); /* DnsHostNameInDs */ for (int i = 0; i < 3; ++i) { p.u16(0); p.u16(0); p.u32(0); } /* Dummy2..4 */ Loading @@ -429,10 +448,10 @@ DispatchResult netlogonDispatch(uint16_t opnum, const std::vector<uint8_t> &stub p.u32(encTypes); /* SupportedEncTypes */ p.u32(0); p.u32(0); /* deferred */ p.unistrBuffer(di.netbios); p.unistrBuffer(di.dnsName); p.unistrBuffer(di.forest); p.sid(di.sid); oneDomainDeferred(false); p.u32(1); /* TrustedDomains conformant count */ oneDomain(true); oneDomainDeferred(true); p.unistrBuffer(dnsInDs); p.u32(ST_OK); return DispatchResult{ST_OK, false, 0, p.buf}; Loading