예제 #1
0
        private void UpdateFramebuffer(RfbScreenInfoPtr server)
        {
            Stopwatch s = new Stopwatch();

            s.Start();
            var fb = this.fbSource.Capture();

            if (fb.Width != server.Width || fb.Height != server.Height)
            {
                // TODO: This should only be necessary if the current framebuffer is not large enough.
                var oldFramebufferHandle = this.currentFramebufferHandle;
                var oldFramebuffer       = this.currentFramebuffer;

                this.currentFramebuffer       = this.memoryPool.Rent(fb.Width * fb.Height * 4);
                this.currentFramebufferHandle = this.currentFramebuffer.Memory.Pin();

                if (fb.PixelFormat != VncPixelFormat.RGB32)
                {
                    this.logger.LogWarning($"The pixel format {fb.PixelFormat} is not supported");
                }

                fb.GetBuffer().CopyTo(this.currentFramebuffer.Memory);

                NativeMethods.rfbNewFramebuffer(server, this.currentFramebufferHandle.Pointer, fb.Width, fb.Height, fb.PixelFormat.BlueBits, 3, fb.PixelFormat.BytesPerPixel);

                oldFramebufferHandle.Dispose();
                oldFramebuffer.Dispose();
            }
            else
            {
                fb.GetBuffer().CopyTo(this.currentFramebuffer.Memory);
                NativeMethods.rfbMarkRectAsModified(server, 0, 0, fb.Width, fb.Height);
            }
        }
        public void LayoutTest()
        {
            using (RfbScreenInfoPtr server = NativeMethods.rfbGetScreen(400, 300, 8, 3, 4))
            {
                Assert.Equal(0, server.ScaledScreenRefCount);
                Assert.Equal(400, server.Width);
                Assert.Equal(4 * 400, server.PaddedWidthInBytes);
                Assert.Equal(300, server.Height);
                Assert.Equal(32, server.Depth);
                Assert.Equal(32, server.BitsPerPixel);

                Assert.Equal(0, server.SizeInBytes);
                Assert.Equal(0x000000u, server.BlackPixel);
                Assert.Equal(0x000000u, server.WhitePixel);

                Assert.Equal(IntPtr.Zero, server.ScreenData);

                var pixelFormat = server.ServerFormat;
                Assert.Equal(32, pixelFormat.BitsPerPixel);
                Assert.Equal(32, pixelFormat.Depth);
                Assert.Equal(0, pixelFormat.BigEndian);
                Assert.Equal(1, pixelFormat.TrueColour);
                Assert.Equal(255, pixelFormat.RedMax);
                Assert.Equal(255, pixelFormat.GreenMax);
                Assert.Equal(255, pixelFormat.BlueMax);
                Assert.Equal(0, pixelFormat.RedShift);
                Assert.Equal(8, pixelFormat.GreenShift);
                Assert.Equal(16, pixelFormat.BlueShift);

                Assert.Equal("LibVNCServer", server.DesktopName);
                Assert.Equal(Environment.MachineName, server.ThisHost);
                Assert.False(server.AutoPort);
                Assert.Equal(5900, server.Port);

                Assert.Equal(RfbSocketState.RFB_SOCKET_INIT, server.SocketState);

                Assert.Equal(3, server.ProtocolMajorVersion);
                Assert.Equal(8, server.ProtocolMinorVersion);

                Assert.Equal(IntPtr.Zero, server.DisplayHook);
                Assert.Equal(IntPtr.Zero, server.Framebuffer);
                Assert.Equal(IntPtr.Zero, server.GetFileTransferPermission);
                Assert.Equal(IntPtr.Zero, server.GetKeyboardLedStateHook);
                Assert.NotEqual(IntPtr.Zero, server.KbdAddEvent);       // rfbDefaultKbdAddEvent
                Assert.NotEqual(IntPtr.Zero, server.KbdReleaseAllKeys); // rfbDoNothingWithClient
                Assert.NotEqual(IntPtr.Zero, server.NewClientHook);     // rfbDefaultNewClientHook
                Assert.NotEqual(IntPtr.Zero, server.PtrAddEvent);       // rfbDefaultPtrAddEvent
                Assert.Equal(IntPtr.Zero, server.ScreenData);
                Assert.Equal(IntPtr.Zero, server.SetServerInput);
                Assert.Equal(IntPtr.Zero, server.SetTextChat);

                Assert.False(server.IsClosed);
                Assert.False(server.IsInvalid);
            }
        }
예제 #3
0
        /// <inheritdoc/>
        public void Dispose()
        {
            if (this.mainLoop != null)
            {
                this.isRunning = false;
                this.mainLoop.Join();
                this.mainLoop = null;
            }

            if (this.server != null)
            {
                this.server.Dispose();
                this.server = null;
            }
        }
예제 #4
0
        /// <inheritdoc/>
        public void Start(IPEndPoint endPoint)
        {
            if (endPoint == null || endPoint.AddressFamily != AddressFamily.InterNetwork)
            {
                throw new ArgumentOutOfRangeException(nameof(endPoint));
            }

            var fb = this.fbSource.Capture();

            this.server = NativeMethods.rfbGetScreen(fb.Width, fb.Height, fb.PixelFormat.BlueBits, 3, fb.PixelFormat.BytesPerPixel);

            var serverFormat = this.server.ServerFormat;

            serverFormat.RedShift   = 16;
            serverFormat.GreenShift = 8;
            serverFormat.BlueShift  = 0;

            this.server.ServerFormat = serverFormat;

            this.server.ListenInterface = MemoryMarshal.Read <int>(endPoint.Address.GetAddressBytes());
            this.server.AutoPort        = false;
            this.server.Port            = endPoint.Port;

            this.currentFramebuffer       = this.memoryPool.Rent(fb.Width * fb.Height * 4);
            this.currentFramebufferHandle = this.currentFramebuffer.Memory.Pin();

            fb.GetBuffer().CopyTo(this.currentFramebuffer.Memory);

            this.server.Framebuffer    = new IntPtr(this.currentFramebufferHandle.Pointer);
            this.server.KbdAddEvent    = this.rfbKbdAddEventHookPtr;
            this.server.PtrAddEvent    = this.rfbPtrAddEventProcPtr;
            this.server.NewClientHook  = this.newClientHookPtr;
            this.server.AuthPasswdData = new IntPtr(-1);
            this.server.PasswordCheck  = this.rfbPasswordCheckProcPtr;

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                NativeMethods.rfbInitServerWithoutPthreadsButWithZRLE(this.server);
            }
            else
            {
                NativeMethods.rfbInitServerWithPthreadsAndZRLE(this.server);
            }

            this.mainLoop = new Thread(new ThreadStart(this.MainLoop));
            this.mainLoop.Start();
        }
        public void GetFieldOffsetsTest_OSX64()
        {
            var offsets = RfbScreenInfoPtr.GetFieldOffsets(OSPlatform.OSX, is64Bit: true);

            Assert.Equal(0, offsets[(int)RfbScreenInfoPtrField.ScaledScreenNext]);
            Assert.Equal(8, offsets[(int)RfbScreenInfoPtrField.ScaledScreenRefCount]);
            Assert.Equal(12, offsets[(int)RfbScreenInfoPtrField.Width]);
            Assert.Equal(16, offsets[(int)RfbScreenInfoPtrField.PaddedWidthInBytes]);
            Assert.Equal(20, offsets[(int)RfbScreenInfoPtrField.Height]);
            Assert.Equal(24, offsets[(int)RfbScreenInfoPtrField.Depth]);
            Assert.Equal(28, offsets[(int)RfbScreenInfoPtrField.BitsPerPixel]);
            Assert.Equal(32, offsets[(int)RfbScreenInfoPtrField.SizeInBytes]);
            Assert.Equal(36, offsets[(int)RfbScreenInfoPtrField.BlackPixel]);
            Assert.Equal(40, offsets[(int)RfbScreenInfoPtrField.WhitePixel]);
            Assert.Equal(48, offsets[(int)RfbScreenInfoPtrField.ScreenData]);
            Assert.Equal(56, offsets[(int)RfbScreenInfoPtrField.ServerFormat]);
            Assert.Equal(72, offsets[(int)RfbScreenInfoPtrField.ColourMap]);
            Assert.Equal(88, offsets[(int)RfbScreenInfoPtrField.DesktopName]);
            Assert.Equal(96, offsets[(int)RfbScreenInfoPtrField.ThisHost]);
            Assert.Equal(351, offsets[(int)RfbScreenInfoPtrField.AutoPort]);
            Assert.Equal(352, offsets[(int)RfbScreenInfoPtrField.Port]);
            Assert.Equal(356, offsets[(int)RfbScreenInfoPtrField.ListenSock]);
            Assert.Equal(360, offsets[(int)RfbScreenInfoPtrField.MaxSock]);
            Assert.Equal(364, offsets[(int)RfbScreenInfoPtrField.MaxFd]);
            Assert.Equal(368, offsets[(int)RfbScreenInfoPtrField.AllFds]);
            Assert.Equal(496, offsets[(int)RfbScreenInfoPtrField.SocketState]);
            Assert.Equal(500, offsets[(int)RfbScreenInfoPtrField.InetdSock]);
            Assert.Equal(504, offsets[(int)RfbScreenInfoPtrField.InetdInitDone]);
            Assert.Equal(508, offsets[(int)RfbScreenInfoPtrField.UdpPort]);
            Assert.Equal(512, offsets[(int)RfbScreenInfoPtrField.UdpSock]);
            Assert.Equal(520, offsets[(int)RfbScreenInfoPtrField.UdpClient]);
            Assert.Equal(528, offsets[(int)RfbScreenInfoPtrField.UdpSockConnected]);
            Assert.Equal(532, offsets[(int)RfbScreenInfoPtrField.UdpRemoteAddr]);
            Assert.Equal(548, offsets[(int)RfbScreenInfoPtrField.MaxClientWait]);
            Assert.Equal(552, offsets[(int)RfbScreenInfoPtrField.HttpInitDone]);
            Assert.Equal(553, offsets[(int)RfbScreenInfoPtrField.HttpEnableProxyConnect]);
            Assert.Equal(556, offsets[(int)RfbScreenInfoPtrField.HttpPort]);
            Assert.Equal(560, offsets[(int)RfbScreenInfoPtrField.HttpDir]);
            Assert.Equal(568, offsets[(int)RfbScreenInfoPtrField.HttpListenSock]);
            Assert.Equal(572, offsets[(int)RfbScreenInfoPtrField.HttpSock]);
            Assert.Equal(576, offsets[(int)RfbScreenInfoPtrField.PasswordCheck]);
            Assert.Equal(584, offsets[(int)RfbScreenInfoPtrField.AuthPasswdData]);
            Assert.Equal(592, offsets[(int)RfbScreenInfoPtrField.AuthPasswdFirstViewOnly]);
            Assert.Equal(600, offsets[(int)RfbScreenInfoPtrField.DeferUpdateTime]);
            Assert.Equal(604, offsets[(int)RfbScreenInfoPtrField.AlwaysShared]);
            Assert.Equal(605, offsets[(int)RfbScreenInfoPtrField.NeverShared]);
            Assert.Equal(606, offsets[(int)RfbScreenInfoPtrField.DontDisconnect]);
            Assert.Equal(608, offsets[(int)RfbScreenInfoPtrField.ClientHead]);
            Assert.Equal(616, offsets[(int)RfbScreenInfoPtrField.PointerClient]);
            Assert.Equal(624, offsets[(int)RfbScreenInfoPtrField.CursorX]);
            Assert.Equal(628, offsets[(int)RfbScreenInfoPtrField.CursorY]);
            Assert.Equal(632, offsets[(int)RfbScreenInfoPtrField.UnderCursorBufferLen]);
            Assert.Equal(640, offsets[(int)RfbScreenInfoPtrField.UnderCursorBuffer]);
            Assert.Equal(648, offsets[(int)RfbScreenInfoPtrField.DontConvertRichCursorToXCursor]);
            Assert.Equal(656, offsets[(int)RfbScreenInfoPtrField.Cursor]);
            Assert.Equal(664, offsets[(int)RfbScreenInfoPtrField.FrameBuffer]);
            Assert.Equal(672, offsets[(int)RfbScreenInfoPtrField.KbdAddEvent]);
            Assert.Equal(680, offsets[(int)RfbScreenInfoPtrField.KbdReleaseAllKeys]);
            Assert.Equal(688, offsets[(int)RfbScreenInfoPtrField.PtrAddEvent]);
            Assert.Equal(696, offsets[(int)RfbScreenInfoPtrField.SetXCutText]);
            Assert.Equal(704, offsets[(int)RfbScreenInfoPtrField.GetCursorPtr]);
            Assert.Equal(712, offsets[(int)RfbScreenInfoPtrField.SetTranslateFunction]);
            Assert.Equal(720, offsets[(int)RfbScreenInfoPtrField.SetSingleWindow]);
            Assert.Equal(728, offsets[(int)RfbScreenInfoPtrField.SetServerInput]);
            Assert.Equal(736, offsets[(int)RfbScreenInfoPtrField.GetFileTransferPermission]);
            Assert.Equal(744, offsets[(int)RfbScreenInfoPtrField.SetTextChat]);
            Assert.Equal(752, offsets[(int)RfbScreenInfoPtrField.NewClientHook]);
            Assert.Equal(760, offsets[(int)RfbScreenInfoPtrField.DisplayHook]);
            Assert.Equal(768, offsets[(int)RfbScreenInfoPtrField.GetKeyboardLedStateHook]);
            Assert.Equal(776, offsets[(int)RfbScreenInfoPtrField.CursorMutex]);
            Assert.Equal(840, offsets[(int)RfbScreenInfoPtrField.BackgroundLoop]);
            Assert.Equal(841, offsets[(int)RfbScreenInfoPtrField.IgnoreSIGPIPE]);
            Assert.Equal(844, offsets[(int)RfbScreenInfoPtrField.ProgressiveSliceHeight]);
            Assert.Equal(848, offsets[(int)RfbScreenInfoPtrField.ListenInterface]);
            Assert.Equal(852, offsets[(int)RfbScreenInfoPtrField.DeferPtrUpdateTime]);
            Assert.Equal(856, offsets[(int)RfbScreenInfoPtrField.HandleEventsEagerly]);
            Assert.Equal(864, offsets[(int)RfbScreenInfoPtrField.VersionString]);
            Assert.Equal(872, offsets[(int)RfbScreenInfoPtrField.ProtocolMajorVersion]);
            Assert.Equal(876, offsets[(int)RfbScreenInfoPtrField.ProtocolMinorVersion]);
            Assert.Equal(880, offsets[(int)RfbScreenInfoPtrField.PermitFileTransfer]);
            Assert.Equal(888, offsets[(int)RfbScreenInfoPtrField.DisplayFinishedHook]);
            Assert.Equal(896, offsets[(int)RfbScreenInfoPtrField.XvpHooka]);
            Assert.Equal(904, offsets[(int)RfbScreenInfoPtrField.Sslkeyfile]);
            Assert.Equal(912, offsets[(int)RfbScreenInfoPtrField.Sslcertfile]);
            Assert.Equal(920, offsets[(int)RfbScreenInfoPtrField.Ipv6port]);
            Assert.Equal(928, offsets[(int)RfbScreenInfoPtrField.Listen6Interface]);
            Assert.Equal(936, offsets[(int)RfbScreenInfoPtrField.Listen6Sock]);
            Assert.Equal(940, offsets[(int)RfbScreenInfoPtrField.Http6Port]);
            Assert.Equal(944, offsets[(int)RfbScreenInfoPtrField.HttpListen6Sock]);
            Assert.Equal(952, offsets[(int)RfbScreenInfoPtrField.SetDesktopSizeHook]);
            Assert.Equal(960, offsets[(int)RfbScreenInfoPtrField.NumberOfExtDesktopScreensHook]);
            Assert.Equal(968, offsets[(int)RfbScreenInfoPtrField.GetExtDesktopScreenHook]);
            Assert.Equal(976, offsets[(int)RfbScreenInfoPtrField.FdQuota]);
        }
        public void GetFieldOffsetsTest_Win32_Pthread()
        {
            var offsets = RfbScreenInfoPtr.GetFieldOffsets(
                OSPlatform.Windows,
                is64Bit: false,
                new NativeCapabilities()
            {
                HaveLibJpeg      = false,
                HaveLibPng       = false,
                HaveLibZ         = false,
                HaveLibPthread   = true,
                HaveWin32Threads = false,
            });

            Assert.Equal(0, offsets[(int)RfbScreenInfoPtrField.ScaledScreenNext]);
            Assert.Equal(4, offsets[(int)RfbScreenInfoPtrField.ScaledScreenRefCount]);
            Assert.Equal(8, offsets[(int)RfbScreenInfoPtrField.Width]);
            Assert.Equal(12, offsets[(int)RfbScreenInfoPtrField.PaddedWidthInBytes]);
            Assert.Equal(16, offsets[(int)RfbScreenInfoPtrField.Height]);
            Assert.Equal(20, offsets[(int)RfbScreenInfoPtrField.Depth]);
            Assert.Equal(24, offsets[(int)RfbScreenInfoPtrField.BitsPerPixel]);
            Assert.Equal(28, offsets[(int)RfbScreenInfoPtrField.SizeInBytes]);
            Assert.Equal(32, offsets[(int)RfbScreenInfoPtrField.BlackPixel]);
            Assert.Equal(36, offsets[(int)RfbScreenInfoPtrField.WhitePixel]);
            Assert.Equal(40, offsets[(int)RfbScreenInfoPtrField.ScreenData]);
            Assert.Equal(44, offsets[(int)RfbScreenInfoPtrField.ServerFormat]);
            Assert.Equal(60, offsets[(int)RfbScreenInfoPtrField.ColourMap]);
            Assert.Equal(72, offsets[(int)RfbScreenInfoPtrField.DesktopName]);
            Assert.Equal(76, offsets[(int)RfbScreenInfoPtrField.ThisHost]);
            Assert.Equal(331, offsets[(int)RfbScreenInfoPtrField.AutoPort]);
            Assert.Equal(332, offsets[(int)RfbScreenInfoPtrField.Port]);
            Assert.Equal(336, offsets[(int)RfbScreenInfoPtrField.ListenSock]);
            Assert.Equal(340, offsets[(int)RfbScreenInfoPtrField.MaxSock]);
            Assert.Equal(344, offsets[(int)RfbScreenInfoPtrField.MaxFd]);
            Assert.Equal(348, offsets[(int)RfbScreenInfoPtrField.AllFds]);
            Assert.Equal(608, offsets[(int)RfbScreenInfoPtrField.SocketState]);
            Assert.Equal(612, offsets[(int)RfbScreenInfoPtrField.InetdSock]);
            Assert.Equal(616, offsets[(int)RfbScreenInfoPtrField.InetdInitDone]);
            Assert.Equal(620, offsets[(int)RfbScreenInfoPtrField.UdpPort]);
            Assert.Equal(624, offsets[(int)RfbScreenInfoPtrField.UdpSock]);
            Assert.Equal(628, offsets[(int)RfbScreenInfoPtrField.UdpClient]);
            Assert.Equal(632, offsets[(int)RfbScreenInfoPtrField.UdpSockConnected]);
            Assert.Equal(636, offsets[(int)RfbScreenInfoPtrField.UdpRemoteAddr]);
            Assert.Equal(652, offsets[(int)RfbScreenInfoPtrField.MaxClientWait]);
            Assert.Equal(656, offsets[(int)RfbScreenInfoPtrField.HttpInitDone]);
            Assert.Equal(657, offsets[(int)RfbScreenInfoPtrField.HttpEnableProxyConnect]);
            Assert.Equal(660, offsets[(int)RfbScreenInfoPtrField.HttpPort]);
            Assert.Equal(664, offsets[(int)RfbScreenInfoPtrField.HttpDir]);
            Assert.Equal(668, offsets[(int)RfbScreenInfoPtrField.HttpListenSock]);
            Assert.Equal(672, offsets[(int)RfbScreenInfoPtrField.HttpSock]);
            Assert.Equal(676, offsets[(int)RfbScreenInfoPtrField.PasswordCheck]);
            Assert.Equal(680, offsets[(int)RfbScreenInfoPtrField.AuthPasswdData]);
            Assert.Equal(684, offsets[(int)RfbScreenInfoPtrField.AuthPasswdFirstViewOnly]);
            Assert.Equal(692, offsets[(int)RfbScreenInfoPtrField.DeferUpdateTime]);
            Assert.Equal(696, offsets[(int)RfbScreenInfoPtrField.AlwaysShared]);
            Assert.Equal(697, offsets[(int)RfbScreenInfoPtrField.NeverShared]);
            Assert.Equal(698, offsets[(int)RfbScreenInfoPtrField.DontDisconnect]);
            Assert.Equal(700, offsets[(int)RfbScreenInfoPtrField.ClientHead]);
            Assert.Equal(704, offsets[(int)RfbScreenInfoPtrField.PointerClient]);
            Assert.Equal(708, offsets[(int)RfbScreenInfoPtrField.CursorX]);
            Assert.Equal(712, offsets[(int)RfbScreenInfoPtrField.CursorY]);
            Assert.Equal(716, offsets[(int)RfbScreenInfoPtrField.UnderCursorBufferLen]);
            Assert.Equal(720, offsets[(int)RfbScreenInfoPtrField.UnderCursorBuffer]);
            Assert.Equal(724, offsets[(int)RfbScreenInfoPtrField.DontConvertRichCursorToXCursor]);
            Assert.Equal(728, offsets[(int)RfbScreenInfoPtrField.Cursor]);
            Assert.Equal(732, offsets[(int)RfbScreenInfoPtrField.FrameBuffer]);
            Assert.Equal(736, offsets[(int)RfbScreenInfoPtrField.KbdAddEvent]);
            Assert.Equal(740, offsets[(int)RfbScreenInfoPtrField.KbdReleaseAllKeys]);
            Assert.Equal(744, offsets[(int)RfbScreenInfoPtrField.PtrAddEvent]);
            Assert.Equal(748, offsets[(int)RfbScreenInfoPtrField.SetXCutText]);
            Assert.Equal(752, offsets[(int)RfbScreenInfoPtrField.GetCursorPtr]);
            Assert.Equal(756, offsets[(int)RfbScreenInfoPtrField.SetTranslateFunction]);
            Assert.Equal(760, offsets[(int)RfbScreenInfoPtrField.SetSingleWindow]);
            Assert.Equal(764, offsets[(int)RfbScreenInfoPtrField.SetServerInput]);
            Assert.Equal(768, offsets[(int)RfbScreenInfoPtrField.GetFileTransferPermission]);
            Assert.Equal(772, offsets[(int)RfbScreenInfoPtrField.SetTextChat]);
            Assert.Equal(776, offsets[(int)RfbScreenInfoPtrField.NewClientHook]);
            Assert.Equal(780, offsets[(int)RfbScreenInfoPtrField.DisplayHook]);
            Assert.Equal(784, offsets[(int)RfbScreenInfoPtrField.GetKeyboardLedStateHook]);
            Assert.Equal(788, offsets[(int)RfbScreenInfoPtrField.CursorMutex]);
            Assert.Equal(792, offsets[(int)RfbScreenInfoPtrField.BackgroundLoop]);
            Assert.Equal(793, offsets[(int)RfbScreenInfoPtrField.IgnoreSIGPIPE]);
            Assert.Equal(796, offsets[(int)RfbScreenInfoPtrField.ProgressiveSliceHeight]);
            Assert.Equal(800, offsets[(int)RfbScreenInfoPtrField.ListenInterface]);
            Assert.Equal(804, offsets[(int)RfbScreenInfoPtrField.DeferPtrUpdateTime]);
            Assert.Equal(808, offsets[(int)RfbScreenInfoPtrField.HandleEventsEagerly]);
            Assert.Equal(812, offsets[(int)RfbScreenInfoPtrField.VersionString]);
            Assert.Equal(816, offsets[(int)RfbScreenInfoPtrField.ProtocolMajorVersion]);
            Assert.Equal(820, offsets[(int)RfbScreenInfoPtrField.ProtocolMinorVersion]);
            Assert.Equal(824, offsets[(int)RfbScreenInfoPtrField.PermitFileTransfer]);
            Assert.Equal(828, offsets[(int)RfbScreenInfoPtrField.DisplayFinishedHook]);
            Assert.Equal(832, offsets[(int)RfbScreenInfoPtrField.XvpHooka]);
            Assert.Equal(836, offsets[(int)RfbScreenInfoPtrField.Sslkeyfile]);
            Assert.Equal(840, offsets[(int)RfbScreenInfoPtrField.Sslcertfile]);
            Assert.Equal(844, offsets[(int)RfbScreenInfoPtrField.Ipv6port]);
            Assert.Equal(848, offsets[(int)RfbScreenInfoPtrField.Listen6Interface]);
            Assert.Equal(852, offsets[(int)RfbScreenInfoPtrField.Listen6Sock]);
            Assert.Equal(856, offsets[(int)RfbScreenInfoPtrField.Http6Port]);
            Assert.Equal(860, offsets[(int)RfbScreenInfoPtrField.HttpListen6Sock]);
            Assert.Equal(864, offsets[(int)RfbScreenInfoPtrField.SetDesktopSizeHook]);
            Assert.Equal(868, offsets[(int)RfbScreenInfoPtrField.NumberOfExtDesktopScreensHook]);
            Assert.Equal(872, offsets[(int)RfbScreenInfoPtrField.GetExtDesktopScreenHook]);
            Assert.Equal(876, offsets[(int)RfbScreenInfoPtrField.FdQuota]);
        }
        public void GetFieldOffsetstest_Win64()
        {
            var offsets = RfbScreenInfoPtr.GetFieldOffsets(
                OSPlatform.Windows,
                is64Bit: true,
                new NativeCapabilities()
            {
                HaveLibPthread   = false,
                HaveWin32Threads = true,
            });

            Assert.Equal(0, offsets[(int)RfbScreenInfoPtrField.ScaledScreenNext]);
            Assert.Equal(8, offsets[(int)RfbScreenInfoPtrField.ScaledScreenRefCount]);
            Assert.Equal(12, offsets[(int)RfbScreenInfoPtrField.Width]);
            Assert.Equal(16, offsets[(int)RfbScreenInfoPtrField.PaddedWidthInBytes]);
            Assert.Equal(20, offsets[(int)RfbScreenInfoPtrField.Height]);
            Assert.Equal(24, offsets[(int)RfbScreenInfoPtrField.Depth]);
            Assert.Equal(28, offsets[(int)RfbScreenInfoPtrField.BitsPerPixel]);
            Assert.Equal(32, offsets[(int)RfbScreenInfoPtrField.SizeInBytes]);
            Assert.Equal(36, offsets[(int)RfbScreenInfoPtrField.BlackPixel]);
            Assert.Equal(40, offsets[(int)RfbScreenInfoPtrField.WhitePixel]);
            Assert.Equal(48, offsets[(int)RfbScreenInfoPtrField.ScreenData]);
            Assert.Equal(56, offsets[(int)RfbScreenInfoPtrField.ServerFormat]);
            Assert.Equal(72, offsets[(int)RfbScreenInfoPtrField.ColourMap]);
            Assert.Equal(88, offsets[(int)RfbScreenInfoPtrField.DesktopName]);
            Assert.Equal(96, offsets[(int)RfbScreenInfoPtrField.ThisHost]);
            Assert.Equal(351, offsets[(int)RfbScreenInfoPtrField.AutoPort]);
            Assert.Equal(352, offsets[(int)RfbScreenInfoPtrField.Port]);
            Assert.Equal(360, offsets[(int)RfbScreenInfoPtrField.ListenSock]);
            Assert.Equal(368, offsets[(int)RfbScreenInfoPtrField.MaxSock]);
            Assert.Equal(372, offsets[(int)RfbScreenInfoPtrField.MaxFd]);
            Assert.Equal(376, offsets[(int)RfbScreenInfoPtrField.AllFds]);
            Assert.Equal(896, offsets[(int)RfbScreenInfoPtrField.SocketState]);
            Assert.Equal(904, offsets[(int)RfbScreenInfoPtrField.InetdSock]);
            Assert.Equal(912, offsets[(int)RfbScreenInfoPtrField.InetdInitDone]);
            Assert.Equal(916, offsets[(int)RfbScreenInfoPtrField.UdpPort]);
            Assert.Equal(920, offsets[(int)RfbScreenInfoPtrField.UdpSock]);
            Assert.Equal(928, offsets[(int)RfbScreenInfoPtrField.UdpClient]);
            Assert.Equal(936, offsets[(int)RfbScreenInfoPtrField.UdpSockConnected]);
            Assert.Equal(940, offsets[(int)RfbScreenInfoPtrField.UdpRemoteAddr]);
            Assert.Equal(956, offsets[(int)RfbScreenInfoPtrField.MaxClientWait]);
            Assert.Equal(960, offsets[(int)RfbScreenInfoPtrField.HttpInitDone]);
            Assert.Equal(961, offsets[(int)RfbScreenInfoPtrField.HttpEnableProxyConnect]);
            Assert.Equal(964, offsets[(int)RfbScreenInfoPtrField.HttpPort]);
            Assert.Equal(968, offsets[(int)RfbScreenInfoPtrField.HttpDir]);
            Assert.Equal(976, offsets[(int)RfbScreenInfoPtrField.HttpListenSock]);
            Assert.Equal(984, offsets[(int)RfbScreenInfoPtrField.HttpSock]);
            Assert.Equal(992, offsets[(int)RfbScreenInfoPtrField.PasswordCheck]);
            Assert.Equal(1000, offsets[(int)RfbScreenInfoPtrField.AuthPasswdData]);
            Assert.Equal(1008, offsets[(int)RfbScreenInfoPtrField.AuthPasswdFirstViewOnly]);
            Assert.Equal(1016, offsets[(int)RfbScreenInfoPtrField.DeferUpdateTime]);
            Assert.Equal(1020, offsets[(int)RfbScreenInfoPtrField.AlwaysShared]);
            Assert.Equal(1021, offsets[(int)RfbScreenInfoPtrField.NeverShared]);
            Assert.Equal(1022, offsets[(int)RfbScreenInfoPtrField.DontDisconnect]);
            Assert.Equal(1024, offsets[(int)RfbScreenInfoPtrField.ClientHead]);
            Assert.Equal(1032, offsets[(int)RfbScreenInfoPtrField.PointerClient]);
            Assert.Equal(1040, offsets[(int)RfbScreenInfoPtrField.CursorX]);
            Assert.Equal(1044, offsets[(int)RfbScreenInfoPtrField.CursorY]);
            Assert.Equal(1048, offsets[(int)RfbScreenInfoPtrField.UnderCursorBufferLen]);
            Assert.Equal(1056, offsets[(int)RfbScreenInfoPtrField.UnderCursorBuffer]);
            Assert.Equal(1064, offsets[(int)RfbScreenInfoPtrField.DontConvertRichCursorToXCursor]);
            Assert.Equal(1072, offsets[(int)RfbScreenInfoPtrField.Cursor]);
            Assert.Equal(1080, offsets[(int)RfbScreenInfoPtrField.FrameBuffer]);
            Assert.Equal(1088, offsets[(int)RfbScreenInfoPtrField.KbdAddEvent]);
            Assert.Equal(1096, offsets[(int)RfbScreenInfoPtrField.KbdReleaseAllKeys]);
            Assert.Equal(1104, offsets[(int)RfbScreenInfoPtrField.PtrAddEvent]);
            Assert.Equal(1112, offsets[(int)RfbScreenInfoPtrField.SetXCutText]);
            Assert.Equal(1120, offsets[(int)RfbScreenInfoPtrField.GetCursorPtr]);
            Assert.Equal(1128, offsets[(int)RfbScreenInfoPtrField.SetTranslateFunction]);
            Assert.Equal(1136, offsets[(int)RfbScreenInfoPtrField.SetSingleWindow]);
            Assert.Equal(1144, offsets[(int)RfbScreenInfoPtrField.SetServerInput]);
            Assert.Equal(1152, offsets[(int)RfbScreenInfoPtrField.GetFileTransferPermission]);
            Assert.Equal(1160, offsets[(int)RfbScreenInfoPtrField.SetTextChat]);
            Assert.Equal(1168, offsets[(int)RfbScreenInfoPtrField.NewClientHook]);
            Assert.Equal(1176, offsets[(int)RfbScreenInfoPtrField.DisplayHook]);
            Assert.Equal(1184, offsets[(int)RfbScreenInfoPtrField.GetKeyboardLedStateHook]);
            Assert.Equal(1192, offsets[(int)RfbScreenInfoPtrField.CursorMutex]);
            Assert.Equal(1232, offsets[(int)RfbScreenInfoPtrField.BackgroundLoop]);
            Assert.Equal(1233, offsets[(int)RfbScreenInfoPtrField.IgnoreSIGPIPE]);
            Assert.Equal(1236, offsets[(int)RfbScreenInfoPtrField.ProgressiveSliceHeight]);
            Assert.Equal(1240, offsets[(int)RfbScreenInfoPtrField.ListenInterface]);
            Assert.Equal(1244, offsets[(int)RfbScreenInfoPtrField.DeferPtrUpdateTime]);
            Assert.Equal(1248, offsets[(int)RfbScreenInfoPtrField.HandleEventsEagerly]);
            Assert.Equal(1256, offsets[(int)RfbScreenInfoPtrField.VersionString]);
            Assert.Equal(1264, offsets[(int)RfbScreenInfoPtrField.ProtocolMajorVersion]);
            Assert.Equal(1268, offsets[(int)RfbScreenInfoPtrField.ProtocolMinorVersion]);
            Assert.Equal(1272, offsets[(int)RfbScreenInfoPtrField.PermitFileTransfer]);
            Assert.Equal(1280, offsets[(int)RfbScreenInfoPtrField.DisplayFinishedHook]);
            Assert.Equal(1288, offsets[(int)RfbScreenInfoPtrField.XvpHooka]);
            Assert.Equal(1296, offsets[(int)RfbScreenInfoPtrField.Sslkeyfile]);
            Assert.Equal(1304, offsets[(int)RfbScreenInfoPtrField.Sslcertfile]);
            Assert.Equal(1312, offsets[(int)RfbScreenInfoPtrField.Ipv6port]);
            Assert.Equal(1320, offsets[(int)RfbScreenInfoPtrField.Listen6Interface]);
            Assert.Equal(1328, offsets[(int)RfbScreenInfoPtrField.Listen6Sock]);
            Assert.Equal(1336, offsets[(int)RfbScreenInfoPtrField.Http6Port]);
            Assert.Equal(1344, offsets[(int)RfbScreenInfoPtrField.HttpListen6Sock]);
            Assert.Equal(1352, offsets[(int)RfbScreenInfoPtrField.SetDesktopSizeHook]);
            Assert.Equal(1360, offsets[(int)RfbScreenInfoPtrField.NumberOfExtDesktopScreensHook]);
            Assert.Equal(1368, offsets[(int)RfbScreenInfoPtrField.GetExtDesktopScreenHook]);
            Assert.Equal(1376, offsets[(int)RfbScreenInfoPtrField.FdQuota]);
        }