Commit 7ea44b1d authored by jan.koester's avatar jan.koester
Browse files

test

parent 4e1b55c3
Loading
Loading
Loading
Loading
Loading
+29 −10
Changes for src/rpc/netlogon.cpp: 29 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -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 */
@@ -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};