예제 #1
0
파일: Core.cs 프로젝트: WildGenie/uo-ext
        public Dll(string path, ushort dll_id)
            : this(path)
        {
            Id = dll_id;
            Console.WriteLine("UOExt: Loading {0} ({1})", Path.GetFileNameWithoutExtension(path), path);
            if (Config.Is64Bit || Config.IsUnix)
            {
                if (!File.Exists(path + ".xml"))
                {
                    throw new FileNotFoundException("Can't find {0}", path + ".xml");
                }
                XmlTextReader xml = new XmlTextReader(path + ".xml");
                xml.WhitespaceHandling = WhitespaceHandling.None;
                string name = "";
                byte packets = 0;
                while (xml.Read())
                {
                    if (xml.NodeType == XmlNodeType.Element && xml.Name == "Library")
                    {
                        uint amount = UInt32.Parse(xml.GetAttribute("Plugins"));
                        Plugins = new Plugin[amount];
                        while (xml.Read())
                        {
                            if (xml.Name == "Plugin")
                            {
                                uint id = UInt32.Parse(xml.GetAttribute("Id"));
//                                uint amount = UInt32.Parse(xml.GetAttribute("Descriptors"));
                                while (xml.Read() && xml.Name == "Descriptor")
                                {
                                    uint descr = UInt32.Parse(xml.GetAttribute("Id"));
                                    string value = xml.GetAttribute("Value");
                                    switch (descr)
                                    {
                                        case PD_NAME:
                                            name = value;
                                            break;
                                        case PD_PACKETSAMOUNT:
                                            packets = Byte.Parse(value);
                                            break;

                                    }
                                }
                                Plugins[id] = new Plugin(dll_id, (byte)id, packets, name);
                                Console.WriteLine("UOExt:  {0}) Name: '{1}', Packets: {2}", id, name, packets);
                            }
                        }
                    }
                }

            }
            else
            {
                IntPtr hModule = LoadLibrary(path);
                IntPtr ptrDllInit = GetProcAddress(hModule, "DllInit");
                IntPtr ptrDllInitDone = GetProcAddress(hModule, "DllInitDone");

                DllInit plgDllInit = (DllInit)Marshal.GetDelegateForFunctionPointer(ptrDllInit, typeof(DllInit));
                DllInitDone plgDllInitDone = (DllInitDone)Marshal.GetDelegateForFunctionPointer(ptrDllInitDone, typeof(DllInitDone));

                IntPtr plgs = plgDllInit();
                int plgs_count = Marshal.ReadInt32(plgs);
                Plugins = new Plugin[plgs_count];
                for (int i = 0; i < plgs_count; i++)
                {
                    IntPtr currentPlgInfo = new IntPtr(Marshal.ReadInt32(plgs, i * 4 + 4));
                    uint descriptors_count = (uint)(Marshal.ReadInt32(currentPlgInfo, 4));

                    byte packets = 0;
                    string name = null;
                    for (int j = 0; j < descriptors_count; j++)
                    {
                        uint key = (uint)(Marshal.ReadInt32(currentPlgInfo, j * 4 + 4));
                        uint value = (uint)(Marshal.ReadInt32(currentPlgInfo, j * 4 + 8));

                        switch (key)
                        {
                            case PD_NAME:
                                name = Marshal.PtrToStringAnsi(new IntPtr(value));
                                break;
                            case PD_PACKETSAMOUNT:
                                packets = (byte)value;
                                break;
                        }
                    }
                    Plugins[i] = new Plugin(dll_id, (byte)i, packets, name);
                    Console.WriteLine("UOExt:  {0}) Name: '{1}', Packets: {2}", i, name, packets);
                }


                plgDllInitDone();

                FreeLibrary(hModule);
            }
        }
예제 #2
0
파일: Core.cs 프로젝트: WildGenie/uo-ext
        private static Plugin[] ReadLoadingOrder()
        {
            if (!File.Exists(Config.PluginInitOrderFile)) return new Plugin[0];

            string[] info = File.ReadAllLines(Config.PluginInitOrderFile);
            int loaded = 0;
            Plugin[] order = new Plugin[info.Length];

            char[] splitter = new char[1];
            splitter[0] = ',';
            for (int i = 0; i < info.Length; i++)
            {
                string[] row = info[i].Split(splitter, 2);
                row[0] = row[0].Trim();
                row[1] = row[1].Trim();
                Dll c_dll = null;
                for (int j = 0; j < Dlls.Length; j++)
                {
                    if (Dlls[j].Name == row[0])
                    {
                        c_dll = Dlls[j];
                        break;
                    }
                }
                if (c_dll != null)
                {
                    int number;
                    bool is_number = int.TryParse(row[1], out number);
                    for (int j = 0; j < c_dll.Plugins.Length; j++)
                    {
                        if (((is_number) && (number == c_dll.Plugins[j].Id)) || ((!is_number) && (row[1] == c_dll.Plugins[j].Name)))
                        {
                            order[loaded++] = c_dll.Plugins[j];
                            break;
                        }
                    }
                }
            }
            if (loaded != order.Length)
            {
                Plugin[] tmp = new Plugin[loaded];
                Array.Copy(order, tmp, loaded);
                order = tmp;
            }
            return order;
        }