Example #1
0
        /// <summary>
        /// Read method for filesystem
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes read</returns>
        private static unsafe uint readImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            IDCookie            cookie  = (IDCookie)node.Cookie;
            VboxDevRequestTypes request = (VboxDevRequestTypes)cookie.ID;

            switch (request)
            {
            case VboxDevRequestTypes.VMMDevReq_GetSessionId:
                if (size != 8)
                {
                    return(0);
                }

                ulong sessionID = VboxDev.GetSessionID();

                Byte.ToBytes((long)sessionID, buffer);

                return(8);

            case VboxDevRequestTypes.VMMDevReq_GetHostTime:
                if (size != 8)
                {
                    return(0);
                }

                ulong time = VboxDev.GetHostTime();

                Byte.ToBytes((long)time, buffer);

                return(8);
            }

            return(0);
        }
Example #2
0
        /// <summary>
        /// Read method for filesystem
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes read</returns>
        private static unsafe uint readImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            // Only support sizes in magnitudes of 512
            if (size % 512 != 0)
            {
                return(0);
            }

            IDCookie cookie = (IDCookie)node.Cookie;

            byte *bufferPtr = (byte *)Util.ObjectToVoidPtr(buffer);

            int  sizeRead  = 0;
            uint offsetInt = 0;
            uint offsetSec = 0;

            while (offsetInt < size)
            {
                int read = ReadSector(cookie.ID, offset + offsetSec, 1, Util.PtrToArray(bufferPtr + offsetInt));

                if (read == 0)
                {
                    return((uint)sizeRead);
                }

                sizeRead += read;

                offsetInt += 512;
                offsetSec++;
            }

            return((uint)sizeRead);
        }
Example #3
0
        /// <summary>
        /// Read
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes written</returns>
        private static unsafe uint infoReadImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            // Check if the task still exists
            IDCookie cookie = (IDCookie)node.Cookie;
            Task     task   = Tasking.GetTaskByPID(cookie.ID);

            if (task == null)
            {
                return(0);
            }

            ProcFSInfo info = new ProcFSInfo();

            info.Uptime      = task.Uptime;
            info.Priority    = (int)task.Priority;
            info.ThreadCount = task.ThreadCount;
            info.Pid         = task.PID;

            // Copy name and cmdline
            String.CopyTo(info.Name, task.Name, 64);
            String.CopyTo(info.CMDLine, task.CMDLine, 256);

            if (size > sizeof(ProcFSInfo))
            {
                size = (uint)sizeof(ProcFSInfo);
            }

            Memory.Memcpy(Util.ObjectToVoidPtr(buffer), &info, (int)size);

            return(size);
        }
Example #4
0
        /// <summary>
        /// FS finddir
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="name">The name to look for</param>
        /// <returns>The node</returns>
        private static unsafe Node findDirImpl(Node node, string name)
        {
            IDCookie cookie = (IDCookie)node.Cookie;
            OPT      opt    = (OPT)cookie.ID;

            if (opt == OPT.LIST)
            {
                if (name.Equals("bind"))
                {
                    return(byID(OPT.BIND));
                }
                else if (name.Equals("connect"))
                {
                    return(byID(OPT.SOCK));
                }
            }
            else if (opt == OPT.SOCK)
            {
                return(TCPSocketDevice.ConnectNode(name));
            }
            else if (opt == OPT.BIND)
            {
                return(TCPSocketDevice.BindNode(name));
            }

            return(null);
        }
Example #5
0
        /// <summary>
        /// Find dir function
        /// </summary>
        /// <param name="node"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        private static unsafe Node findDirImpl(Node node, string name)
        {
            VboxDevRequestTypes function = VboxDevRequestTypes.VMMDevReq_InvalidRequest;

            if (name.Equals("sessionid"))
            {
                function = VboxDevRequestTypes.VMMDevReq_GetSessionId;
            }
            else if (name.Equals("powerstate"))
            {
                function = VboxDevRequestTypes.VMMDevReq_SetPowerStatus;
            }
            else if (name.Equals("hosttime"))
            {
                function = VboxDevRequestTypes.VMMDevReq_GetHostTime;
            }

            if (function == VboxDevRequestTypes.VMMDevReq_InvalidRequest)
            {
                return(null);
            }

            Node outNode = new Node();

            outNode.Read  = readImpl;
            outNode.Write = writeImpl;
            outNode.Flags = NodeFlags.FILE;

            IDCookie cookie = new IDCookie((int)function);

            outNode.Cookie = cookie;

            return(outNode);
        }
Example #6
0
        /// <summary>
        /// Gets the size of the available data
        /// </summary>
        /// <param name="node">The pipe node</param>
        /// <returns>The size</returns>
        private static uint getSizeImpl(Node node)
        {
            IDCookie cookie = (IDCookie)node.Cookie;

            if (comports[cookie.ID].Buffer == null)
            {
                return(0);
            }

            return(comports[cookie.ID].Buffer.AvailableBytes);
        }
Example #7
0
        /// <summary>
        /// Read method for filesystem
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes read</returns>
        private static uint readImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            IDCookie cookie = (IDCookie)node.Cookie;

            if (comports[cookie.ID].Address == 0)
            {
                return(0);
            }

            return(comports[cookie.ID].Buffer.Read(buffer, (ushort)size));
        }
Example #8
0
        /// <summary>
        /// Creates a node
        /// </summary>
        /// <param name="opt">The option</param>
        /// <returns>The node</returns>
        private static unsafe Node byID(OPT opt)
        {
            Node node = new Node();
            node.Flags = NodeFlags.DIRECTORY;
            node.FindDir = findDirImpl;

            IDCookie cookie = new IDCookie((int)opt);
            node.Cookie = cookie;

            return node;
        }
Example #9
0
        /// <summary>
        /// Initializes UDP filesystem in NetFS
        /// </summary>
        public static unsafe void Init()
        {
            Node node = new Node();
            node.FindDir = findDirImpl;
            node.ReadDir = readDirImpl;
            node.Flags = NodeFlags.DIRECTORY;
            
            IDCookie cookie = new IDCookie((int)OPT.LIST);
            node.Cookie = cookie;

            RootPoint dev = new RootPoint("udp", node);
            VFS.MountPointNetFS.AddEntry(dev);
        }
Example #10
0
        /// <summary>
        /// Creates a node by its ID
        /// </summary>
        /// <param name="pt">The option</param>
        /// <returns>The node</returns>
        private static unsafe Node byID(InfoOPT opt)
        {
            Node node = new Node();

            node.Read = readImpl;
            node.Size = 4;

            IDCookie cookie = new IDCookie((int)opt);

            node.Cookie = cookie;

            return(node);
        }
Example #11
0
        /// <summary>
        /// FS readdir
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="index">The index</param>
        /// <returns>The directory entry</returns>
        private static unsafe DirEntry *procReadDirImpl(Node node, uint index)
        {
            // Check if task still exists
            IDCookie cookie = (IDCookie)node.Cookie;
            Task     task   = Tasking.GetTaskByPID(cookie.ID);

            if (task == null)
            {
                return(null);
            }

            DirEntry *entry = (DirEntry *)Heap.Alloc(sizeof(DirEntry));
            string    name  = null;

            // Index zero is the info file
            if (index == 0)
            {
                name = "info";
            }
            else
            {
                int    j       = 0;
                Thread current = task.FirstThread;
                while (j < index - 1 && current.NextThread != task.FirstThread)
                {
                    current = current.NextThread;
                    j++;
                }

                // Last thread entry reached but index is still not reached? Stop.
                if (j < index - 1 && current.NextThread == task.FirstThread)
                {
                    return(null);
                }

                name = current.TID.ToString();
            }

            String.CopyTo(entry->Name, name);

            // A new string is only created here when index != 0
            if (index != 0)
            {
                Heap.Free(name);
            }

            return(entry);
        }
Example #12
0
        /// <summary>
        /// FS readdir
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="index">The index</param>
        /// <returns>The directory entry</returns>
        private static unsafe DirEntry* readDirImpl(Node node, uint index)
        {
            IDCookie cookie = (IDCookie)node.Cookie;
            OPT opt = (OPT)cookie.ID;

            // Do list ;)
            if (opt == OPT.LIST)
            {
                if (index == 0)
                    return makeByName("bind");
                else if (index == 1)
                    return makeByName("connect");
            }

            return null;
        }
Example #13
0
        /// <summary>
        /// Initializes ATA
        /// </summary>
        public static unsafe void Init()
        {
            PciDevice pciDev = findIDEDevice();

            if (pciDev == null)
            {
                Console.WriteLine("[ATA] No ATA devices found");
                return;
            }

            ATA_PRIMARY_IO   = (ushort)((pciDev.BAR0.Address == 0x00 || pciDev.BAR0.Address == 0x01) ? 0x1F0 : pciDev.BAR0.Address);
            ATA_SECONDARY_IO = (ushort)((pciDev.BAR2.Address == 0x00 || pciDev.BAR2.Address == 0x01) ? 0x170 : pciDev.BAR2.Address);

            Devices = new IDE_Device[4];
            probe();

            // TODO: disk 2 says it exists but it not, this will cause a hang
            for (int i = 0; i < 1; i++)
            {
                if (!Devices[i].Exists)
                {
                    continue;
                }


                char *name = (char *)Heap.Alloc(5);
                name[0] = 'H';
                name[1] = 'D';
                name[2] = 'I';
                name[3] = (char)('0' + i);
                name[4] = '\0';
                string nameStr = Util.CharPtrToString(name);

                Node node = new Node();
                node.Read  = readImpl;
                node.Write = writeImpl;

                IDCookie cookie = new IDCookie(i);
                node.Cookie = cookie;

                Disk.InitalizeNode(node, nameStr);

                RootPoint dev = new RootPoint(nameStr, node);
                VFS.MountPointDevFS.AddEntry(dev);
            }
        }
Example #14
0
        /// <summary>
        /// Write method for filesystem
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes written</returns>
        private static uint writeImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            IDCookie cookie = (IDCookie)node.Cookie;

            uint i = 0;

            if (comports[cookie.ID].Address == 0)
            {
                return(0);
            }

            while (i < size)
            {
                write(buffer[i], comports[cookie.ID].Address);

                i++;
            }

            return(i);
        }
Example #15
0
        /// <summary>
        /// FS finddir
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="name">The name to look for</param>
        /// <returns>The node</returns>
        private static unsafe Node findDirImpl(Node node, string name)
        {
            IDCookie cookie = (IDCookie)node.Cookie;
            OPT opt = (OPT)cookie.ID;
            
            if (opt == OPT.LIST)
            {
                if (name.Equals("bind"))
                    return byID(OPT.BIND);
                else if (name.Equals("connect"))
                    return byID(OPT.SOCK);
            }
            else if (opt == OPT.SOCK)
            {
                return UDPSocketDevice.Open(name);
            }
            else if (opt == OPT.BIND)
            {
                return UDPBindSocketDevice.Open(name);
            }

            return null;
        }
Example #16
0
        /// <summary>
        /// Write method for filesystem
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes written</returns>
        private static unsafe uint writeImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            IDCookie            cookie  = (IDCookie)node.Cookie;
            VboxDevRequestTypes request = (VboxDevRequestTypes)cookie.ID;

            switch (request)
            {
            case VboxDevRequestTypes.VMMDevReq_SetPowerStatus:
                if (size < 4)
                {
                    return(0);
                }

                int state = Byte.ToInt(buffer);
                VboxDevPowerState stateConverted = (VboxDevPowerState)state;

                VboxDev.ChangePowerState(stateConverted);

                return(4);
            }

            return(0);
        }
Example #17
0
        /// <summary>
        /// FS finddir
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="name">The name to look for</param>
        /// <returns>The node</returns>
        private static unsafe Node procFindDirImpl(Node node, string name)
        {
            // File is a command: info
            if (name.Equals("info"))
            {
                Node infoNode = new Node();
                infoNode.Flags  = NodeFlags.FILE;
                infoNode.Cookie = node.Cookie; // TODO: clone this?
                infoNode.Size   = (uint)sizeof(ProcFSInfo);
                infoNode.Read   = infoReadImpl;
                return(infoNode);
            }

            // Check if task still exists
            IDCookie cookie = (IDCookie)node.Cookie;

            if (Tasking.GetTaskByPID(cookie.ID) == null)
            {
                return(null);
            }

            // File is a thread ID
            int tid = int.Parse(name);

            if (tid < 0)
            {
                return(null);
            }

            Node threadNode = new Node();

            threadNode.Flags  = NodeFlags.FILE;
            threadNode.Cookie = new IDCookie(tid);

            return(threadNode);
        }
Example #18
0
        /// <summary>
        /// Read method for filesystem
        /// </summary>
        /// <param name="node">The node</param>
        /// <param name="offset">The offset</param>
        /// <param name="size">The size</param>
        /// <param name="buffer">The buffer</param>
        /// <returns>The amount of bytes read</returns>
        private static unsafe uint readImpl(Node node, uint offset, uint size, byte[] buffer)
        {
            byte *sourceBuffer = null;

            IDCookie cookie = (IDCookie)node.Cookie;
            InfoOPT  opt    = (InfoOPT)cookie.ID;

            switch (opt)
            {
            case InfoOPT.IP:
                sourceBuffer = Network.Settings->IP;
                break;

            case InfoOPT.SUBNET:
                sourceBuffer = Network.Settings->Subnet;
                break;

            case InfoOPT.GATEWAY:
                sourceBuffer = Network.Settings->Gateway;
                break;

            case InfoOPT.NS1:
                sourceBuffer = Network.Settings->DNS1;
                break;

            case InfoOPT.NS2:
                sourceBuffer = Network.Settings->DNS2;
                break;
            }

            int read = Math.Min((int)size, 4);

            Memory.Memcpy(Util.ObjectToVoidPtr(buffer), sourceBuffer, read);

            return((uint)read);
        }