Exemple #1
0
        internal static void processDemandActive(RdpPacket data)
        {
            int num3;

            RDPClient.rdp_shareid = data.getLittleEndian32();
            int num = data.getLittleEndian16();

            data.getLittleEndian16();
            data.Position += num;
            int numCaps = data.getLittleEndian16();

            data.getLittleEndian16();
            processServerCapabilities(data, numCaps);
            sendConfirmActive();
            sendSynchronize();
            sendControl(4);
            sendControl(1);
            ISO.Secure_Receive(out num3);
            ISO.Secure_Receive(out num3);
            ISO.Secure_Receive(out num3);
            if (!RDPClient.m_bInitialised)
            {
                sendPersistKeyList();
            }
            List <Rdp.InputInfo> inputToSend = new List <Rdp.InputInfo>
            {
                new Rdp.InputInfo(0, Rdp.InputType.INPUT_EVENT_SYNC, 0, 0, 0)
            };

            IsoLayer.SendInput(inputToSend);
            sendFontList();
            ISO.Secure_Receive(out num3);
            if (RDPClient.m_bInitialised)
            {
                RDPClient.OnInitialise();
            }
            RDPClient.m_bInitialised = true;
            resetOrderState();
        }
Exemple #2
0
        internal static void mainloop()
        {
            RDPClient.m_bInitialised       = false;
            RDPClient.m_bHalt              = false;
            RDPClient.m_bExceptionReported = false;
            try
            {
                while (!RDPClient.m_bHalt)
                {
                    int       num;
                    RdpPacket data = ISO.Secure_Receive(out num);

                    switch (num)
                    {
                    case 0:
                    case 6:
                        break;

                    case 1:
                        try
                        {
                            ControlFlow.processDemandActive(data);
                        }
                        catch
                        {
                        }
                        Network.ConnectionAlive = true;
                        break;

                    case 7:
                        processData(data);
                        break;

                    case 10:
                        ControlFlow.processRedirection(data, false);
                        break;

                    case 0xff:     // 255
                        // FastPathUpdate
                        break;

                    default:
                        throw new RDFatalException("Illegal type in main process :" + num.ToString());
                    }
                    Thread.Sleep(1);
                }
            }
            catch (RDFatalException exception)
            {
                Network.Close();
                if (!RDPClient.m_bExceptionReported)
                {
                    RDPClient.m_bExceptionReported = true;
                    RDPClient.OnError(exception);
                }
            }
            catch (EndOfTransmissionException)
            {
                Network.Close();
            }
            catch (SocketAbortException)
            {
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception exception2)
            {
                if (!RDPClient.m_bExceptionReported)
                {
                    RDPClient.m_bExceptionReported = true;
                    RDPClient.OnError(exception2);
                }
            }
            finally
            {
                ISO.Disconnect();
                RDPClient.OnClosed();
            }
        }
Exemple #3
0
        private static RdpPacket getLoginInfo(string domain, string username, string password, string command, string directory, bool bAutoReconnect)
        {
            int       num    = 2 * "127.0.0.1".Length;
            int       num2   = 2 * @"C:\WINNT\System32\mstscax.dll".Length;
            int       num1   = _p;
            int       num3   = 2 * domain.Length;
            int       num4   = 2 * username.Length;
            int       num5   = 2 * password.Length;
            int       num6   = 2 * command.Length;
            int       num7   = 2 * directory.Length;
            RdpPacket packet = new RdpPacket();
            int       num8   = 0x213b;

            packet.WriteLittleEndian32(0);
            packet.WriteLittleEndian32(num8);
            packet.WriteLittleEndian16((short)num3);
            packet.WriteLittleEndian16((short)num4);
            if ((num8 & 8) != 0)
            {
                packet.WriteLittleEndian16((short)num5);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            packet.WriteLittleEndian16((short)num6);
            packet.WriteLittleEndian16((short)num7);
            if (0 < num3)
            {
                packet.WriteUnicodeString(domain);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            packet.WriteUnicodeString(username);
            if ((num8 & 8) != 0)
            {
                packet.WriteUnicodeString(password);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            if (0 < num6)
            {
                packet.WriteUnicodeString(command);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            if (0 < num7)
            {
                packet.WriteUnicodeString(directory);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
            }
            packet.WriteLittleEndian16((short)2);
            packet.WriteLittleEndian16((short)(num + 2));
            packet.WriteUnicodeString("127.0.0.1");
            packet.WriteLittleEndian16((short)(num2 + 2));
            packet.WriteUnicodeString(@"C:\WINNT\System32\mstscax.dll");
            TimeZoneInfo info = TimeZoneInfo.Local;

            packet.WriteLittleEndian32((int)info.BaseUtcOffset.TotalMinutes);
            packet.WriteUnicodeString(info.StandardName);
            packet.Position += 0x3e - (2 * info.StandardName.Length);
            if (info.SupportsDaylightSavingTime)
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((ushort)10);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)30);
                packet.WriteLittleEndian16((short)2);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32(0);
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32(0);
            }
            packet.WriteUnicodeString(info.DaylightName);
            packet.Position += 0x3e - (2 * info.DaylightName.Length);
            if (info.SupportsDaylightSavingTime)
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((ushort)3);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0x1b);
                packet.WriteLittleEndian16((short)1);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32((int)(info.BaseUtcOffset.TotalMinutes + 1.0));
            }
            else
            {
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian16((short)0);
                packet.WriteLittleEndian32(0);
            }
            packet.WriteLittleEndianU32(0);
            PerformanceFlags flags = (PerformanceFlags)0;

            if (!RDPClient.IsHostFlagSet(HostFlags.DesktopBackground))
            {
                flags |= PerformanceFlags.PERF_DISABLE_WALLPAPER;
            }
            if (RDPClient.IsHostFlagSet(HostFlags.FontSmoothing))
            {
                flags |= PerformanceFlags.PERF_ENABLE_FONT_SMOOTHING;
            }
            if (RDPClient.IsHostFlagSet(HostFlags.DesktopComposition))
            {
                flags |= PerformanceFlags.PERF_ENABLE_DESKTOP_COMPOSITION;
            }
            if (!RDPClient.IsHostFlagSet(HostFlags.ShowWindowContents))
            {
                flags |= PerformanceFlags.PERF_DISABLE_FULLWINDOWDRAG;
            }
            if (!RDPClient.IsHostFlagSet(HostFlags.MenuAnimation))
            {
                flags |= PerformanceFlags.PERF_DISABLE_MENUANIMATIONS;
            }
            if (!RDPClient.IsHostFlagSet(HostFlags.VisualStyles))
            {
                flags |= PerformanceFlags.PERF_DISABLE_THEMING;
            }
            packet.WriteLittleEndian32((int)flags);
            if (bAutoReconnect)
            {
                packet.WriteLittleEndian32(0x1c);
                packet.WriteLittleEndian32(0x1c);
                packet.WriteLittleEndian32(1);
                packet.WriteLittleEndian32(RDPClient.LogonID);
                HMACT64 hmact = new HMACT64(RDPClient.ReconnectCookie);
                hmact.update(Secure.GetClentRandom());
                byte[] buffer = hmact.digest();
                packet.Write(buffer, 0, buffer.Length);
                return(packet);
            }
            packet.WriteLittleEndian32(0);
            return(packet);
        }