Esempio n. 1
0
 public static void Close()
 {
     byte[] array = new byte[FSUIPCConnection.connections.Count];
     FSUIPCConnection.connections.Keys.CopyTo(array, 0);
     foreach (byte ClassInstance in array)
     {
         FSUIPCConnection.Close(ClassInstance);
     }
 }
Esempio n. 2
0
        public static void Open(byte ClassInstance, int RequiredFlightSimVersion)
        {
            FSUIPCConnection.DeleteGroup(FSUIPCConnection.SystemOffsetsGroup);
            bool flag = false;

            if (FSUIPCConnection.connections.ContainsKey(ClassInstance))
            {
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_OPEN, "The connection to FSUIPC is already open.");
            }
            ConnectionInfo connectionInfo = new ConnectionInfo();

            FSUIPCConnection.connections.Add(ClassInstance, connectionInfo);
            if ((int)ClassInstance == 0)
            {
                connectionInfo.hWnd = Win32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "UIPCMAIN", IntPtr.Zero);
                if (connectionInfo.hWnd == IntPtr.Zero)
                {
                    connectionInfo.hWnd = Win32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "FS98MAIN", IntPtr.Zero);
                    flag = true;
                }
            }
            else
            {
                connectionInfo.hWnd = Win32.FindWindowEx(IntPtr.Zero, IntPtr.Zero, "FS98MAIN" + ClassInstance.ToString("D2"), IntPtr.Zero);
                flag = true;
            }
            if (connectionInfo.hWnd == IntPtr.Zero)
            {
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_NOFS, "Cannot find FSUIPC or WideFS running on this machine.");
            }
            connectionInfo.messageID = Win32.RegisterWindowMessage(FSUIPCConnection.FS6IPCMessageName);
            if ((int)connectionInfo.messageID == 0)
            {
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_REGMSG, "Could not register the IPC window message");
            }
            ++FSUIPCConnection.tryCount;
            string str = FSUIPCConnection.FS6IPCMessageName + ":" + Process.GetCurrentProcess().Id.ToString("X") + ":" + FSUIPCConnection.tryCount.ToString("X");

            connectionInfo.atomFileName = Win32.GlobalAddAtom(str);
            if (connectionInfo.atomFileName == IntPtr.Zero)
            {
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_ATOM, "Could not add the Global Atom for the file mapping path.");
            }
            connectionInfo.hMap = Win32.CreateFileMapping(new IntPtr(-1), IntPtr.Zero, PageProtection.ReadWrite, 0U, FSUIPCConnection.MaximumDataSize + 256U, str);
            if (connectionInfo.hMap == IntPtr.Zero || Marshal.GetLastWin32Error() == FSUIPCConnection.ERROR_ALREADY_EXISTS)
            {
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_MAP, "Could not create file mapping.");
            }
            connectionInfo.pView = Win32.MapViewOfFile(connectionInfo.hMap, DesiredAccess.MapWrite, 0U, 0U, 0U);
            if (connectionInfo.pView == IntPtr.Zero)
            {
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_VIEW, "Could not Open file view.");
            }
            Offset <int> offset1 = new Offset <int>(FSUIPCConnection.SystemOffsetsGroup, 13060);
            Offset <int> offset2 = new Offset <int>(FSUIPCConnection.SystemOffsetsGroup, 13064);

            for (int index = 0; index < 5 && (offset1.dataValue == 0 || offset2.dataValue == 0); ++index)
            {
                FSUIPCConnection.Process(ClassInstance, FSUIPCConnection.SystemOffsetsGroup);
                Thread.Sleep(100);
            }
            if (offset1.dataValue < 429391877 || ((long)offset2.dataValue & 4294901760L) != 4208852992L)
            {
                if (flag)
                {
                    FSUIPCConnection.Close(ClassInstance);
                    throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_RUNNING, "FSUIPC is not running.");
                }
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_VERSION, "Incorrect version of FSUIPC.");
            }
            int num = offset2.dataValue & (int)ushort.MaxValue;

            FSUIPCConnection.fsVersionConnected = (FlightSim)num;
            if (RequiredFlightSimVersion != 0 && RequiredFlightSimVersion != num)
            {
                FSUIPCConnection.Close(ClassInstance);
                throw new FSUIPCException(FSUIPCError.FSUIPC_ERR_WRONGFS, "Incorrect version of Flight Sim");
            }
            FSUIPCConnection.DeleteGroup(FSUIPCConnection.SystemOffsetsGroup);
            if (!FSUIPCConnection.aiServices.ContainsKey(ClassInstance))
            {
                FSUIPCConnection.aiServices.Add(ClassInstance, new AITrafficServices(ClassInstance));
            }
            if (!FSUIPCConnection.userInput.ContainsKey(ClassInstance))
            {
                FSUIPCConnection.userInput.Add(ClassInstance, new UserInputServices(ClassInstance));
            }
            if (FSUIPCConnection.payloadServices.ContainsKey(ClassInstance))
            {
                return;
            }
            FSUIPCConnection.payloadServices.Add(ClassInstance, new PayloadServices(ClassInstance));
        }