Beispiel #1
0
        public void SafePSIDArrayCtorTest()
        {
            var           sids    = new[] { SafePSID.Current, SafePSID.Everyone };
            SafePSIDArray safeArr = null;

            Assert.That(() => safeArr = new SafePSIDArray((SafePSID[])null), Throws.ArgumentNullException);
            Assert.That(() => safeArr = new SafePSIDArray(new SafePSID[0]), Throws.Nothing);
            Assert.That(safeArr.Count, Is.Zero);
            Assert.That(() => safeArr = new SafePSIDArray(sids), Throws.Nothing);
            Assert.That(safeArr.Count, Is.EqualTo(sids.Length));
            Assert.That(() => safeArr = new SafePSIDArray(Array.ConvertAll(sids, s => (PSID)s)), Throws.Nothing);
            Assert.That(safeArr.Count, Is.EqualTo(sids.Length));
            Assert.That(EqualSid(safeArr[0], SafePSID.Current), Is.True);
            Assert.That(EqualSid(safeArr[1], SafePSID.Everyone), Is.True);
            Assert.That(() => safeArr[2], Throws.Exception);
            Assert.That(safeArr, Is.EquivalentTo(sids));
        }
Beispiel #2
0
        public void SafePSIDArrayCtorTest2()
        {
            // Build in-memory SID array
            var sids = new[] { SafePSID.Current, SafePSID.Everyone };

            SafePSIDArray safeArr = null;

            Assert.That(() => safeArr = new SafePSIDArray(IntPtr.Zero, 0), Throws.Nothing);
            Assert.That(safeArr.Count, Is.Zero);

            // Unowned
            var ptr = Build();

            Assert.That(() => safeArr = new SafePSIDArray(ptr, sids.Length, false), Throws.Nothing);
            Assert.That(safeArr.Count, Is.EqualTo(sids.Length));
            foreach (var psid in ptr.ToIEnum <IntPtr>(sids.Length))
            {
                Kernel32.LocalFree(psid);
            }
            Kernel32.LocalFree(ptr);
            safeArr.Dispose();

            // Owned
            ptr = Build();
            Assert.That(() => safeArr = new SafePSIDArray(ptr, sids.Length, true), Throws.Nothing);
            Assert.That(safeArr.Count, Is.EqualTo(sids.Length));
            safeArr.Dispose();

            IntPtr Build()
            {
                var len = sids.Length * IntPtr.Size + sids.Sum(p => p.Length);
                var mem = Kernel32.LocalAlloc(Kernel32.LMEM.LPTR, sids.Length * IntPtr.Size);

                for (var i = 0; i < sids.Length; i++)
                {
                    var sid  = sids[i];
                    var psid = Kernel32.LocalAlloc(Kernel32.LMEM.LPTR, sid.Length);
                    Marshal.Copy(sid.GetBinaryForm(), 0, (IntPtr)psid, sid.Length);
                    Marshal.WriteIntPtr((IntPtr)mem, i * IntPtr.Size, (IntPtr)psid);
                }
                return((IntPtr)mem);
            }
        }