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