public void LoadScript(int n) { memory = pcc.Exports[Objects[n]].Data; hb1.ByteProvider = new DynamicByteProvider(memory); treeView1.Nodes.Clear(); GlobalPointer = 0x20; VirtualPointer = 0x00; foundEnd = false; while (OPCodes.isValid(memory, GlobalPointer) && !foundEnd) { treeView1.Nodes.Add(ReadToken()); } if (!OPCodes.isValid(memory, GlobalPointer) && !foundEnd) { treeView1.Nodes.Add("Unknown OPCode: 0x" + memory[GlobalPointer].ToString("X")); } treeView1.ExpandAll(); }
public TreeNode ReadToken() { if (memory[GlobalPointer] == 0x53) { foundEnd = true; } bool isNative = ((memory[GlobalPointer] & 0xF0) == 0x70); string temp = "GlPtr: 0x" + GlobalPointer.ToString("X4") + " VirtPtr: 0x" + VirtualPointer.ToString("X4") + " OPC: 0x"; int index; if (isNative) { index = ((memory[GlobalPointer] - 0x70) << 8) + memory[GlobalPointer + 1]; } else { index = memory[GlobalPointer]; } temp += index.ToString("X4"); TreeNode t = new TreeNode(temp); string pat = OPCodes.GetPattern(memory, GlobalPointer); if (!isNative) { GlobalPointer += 1; } else { GlobalPointer += 2; } VirtualPointer += 4; int pos = 0; string s = ""; while (pos < pat.Length) { if (pat[pos] != '%') { s += pat[pos]; pos++; } else { if (s != "") { t.Nodes.Add(s); } s = ""; char c = pat[pos + 1]; pos += 2; int n; float f; switch (c) { case 'o': case 'O': n = BitConverter.ToInt32(memory, GlobalPointer); if (n > 0) { n--; if (pcc.isExport(n)) { t.Nodes.Add(pcc.Exports[n].ObjectName); } } else if (n < 0) { n++; if (pcc.isImport(n)) { t.Nodes.Add(pcc.Imports[n].ObjectName); } } GlobalPointer += 4; VirtualPointer += 4; break; case '1': n = BitConverter.ToInt32(memory, GlobalPointer); if (n > 0) { n--; if (pcc.isExport(n)) { t.Nodes.Add(pcc.Exports[n].ClassName); t.Nodes.Add(pcc.Exports[n].ObjectName); } } else if (n < 0) { n++; if (pcc.isImport(n)) { t.Nodes.Add(pcc.Imports[n].ClassName); t.Nodes.Add(pcc.Imports[n].ObjectName); } } GlobalPointer += 4; VirtualPointer += 4; break; case 's': case 'S': n = BitConverter.ToInt16(memory, GlobalPointer); t.Nodes.Add(n.ToString("X4")); GlobalPointer += 2; VirtualPointer += 2; break; case 'f': case 'F': f = BitConverter.ToSingle(memory, GlobalPointer); t.Nodes.Add(f.ToString() + "f"); GlobalPointer += 4; VirtualPointer += 4; break; case 'b': case 'B': t.Nodes.Add(memory[GlobalPointer].ToString("X")); GlobalPointer += 1; VirtualPointer += 1; break; case 'i': case 'I': n = BitConverter.ToInt32(memory, GlobalPointer); t.Nodes.Add(n.ToString("X8")); GlobalPointer += 4; VirtualPointer += 4; break; case 't': case 'T': t.Nodes.Add(ReadToken()); break; case 'n': case 'N': int count = 0; while (memory[GlobalPointer] != 0x16) { if (count++ == 0) { t.Nodes.Add(ReadToken()); } else { t.Nodes.Add(","); t.Nodes.Add(ReadToken()); } } GlobalPointer += 1; VirtualPointer += 4; break; } } } if (s != "") { t.Nodes.Add(s); } return(t); }