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); } }
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)); }