diff --git a/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java b/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java index add60ab..b99f314 100644 --- a/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java +++ b/src/main/java/konogonka/Tools/NPDM/ACID/KernelAccessControlProvider.java @@ -3,6 +3,10 @@ package konogonka.Tools.NPDM.ACID; import konogonka.LoperConverter; import konogonka.RainbowHexDump; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.LinkedList; + /* NOTE: KAC is set of 4-byes blocks @@ -22,18 +26,26 @@ Example: 9 32-33-34-35 Possible patterns are: +Where '+' is useful data; '0' and '1' in low bytes are pattern. Octal | Decimal -00000000000000000000000000000111 | 7 <- KernelFlags -00000000000000000000000000001111 | 15 <- SyscallMask -00000000000000000000000000111111 | 63 <- MapIoOrNormalRange -00000000000000000000000001111111 | 127 <- MapNormalPage (RW) -00000000000000000000011111111111 | 2047 <- InterruptPair -00000000000000000001111111111111 | 8191 <- ApplicationType -00000000000000000011111111111111 | 16383 <- KernelReleaseVersion -00000000000000000111111111111111 | 32767 <- HandleTableSize -00000000000000001111111111111111 | 65535 <- DebugFlags +++++++++++++++++++++++++++++0111 | 7 <- KernelFlags ++++++++++++++++++++++++++++01111 | 15 <- SyscallMask ++++++++++++++++++++++++++0111111 | 63 <- MapIoOrNormalRange +++++++++++++++++++++++++01111111 | 127 <- MapNormalPage (RW) +++++++++++++++++++++011111111111 | 2+47 <- InterruptPair +++++++++++++++++++01111111111111 | 8191 <- ApplicationType ++++++++++++++++++011111111111111 | 16383 <- KernelReleaseVersion +++++++++++++++++0111111111111111 | 32767 <- HandleTableSize ++++++++++++++++01111111111111111 | 65535 <- DebugFlags Other masks could be implemented by N in future (?). +Calculation example: +Dec 1 = 00000000000000000000000000000001 +00100000000000000000000000000111 & 1 = 1 +00010000000000000000000000000011 & 1 = 1 +00001000000000000000000000000001 & 1 = 1 +00000100000000000000000000000000 & 1 = 0 + TIP: Generate int j = 0xFFFFFFFF; for (byte i = 0; i < 16; i++){ @@ -44,36 +56,80 @@ for (byte i = 0; i < 16; i++){ public class KernelAccessControlProvider { + private static final int KERNELFLAGS = 3; + private static final int SYSCALLMASK = 4; + private static final int MAPIOORNORMALRANGE = 6; + private static final int MAPNORMALPAGE_RW = 7; + private static final int INTERRUPTPAIR = 11; + private static final int APPLICATIONTYPE = 13; + private static final int KERNELRELEASEVERSION = 14; + private static final int HANDLETABLESIZE = 15; + private static final int DEBUGFLAGS = 16; + + private boolean kernelFlagsAvailable; + private int kernelFlagCpuIdHi; + private int kernelFlagCpuIdLo; + private int kernelFlagThreadPrioHi; + private int kernelFlagThreadPrioLo; + + KernelAccessControlProvider(byte[] bytes) throws Exception{ if (bytes.length < 4) throw new Exception("ACID-> KernelAccessControlProvider: too small size of the Kernel Access Control"); - final int pattrnKernFlags = 7; - final int pattrnSyscallMsk = 15; - final int pattrnMapIoNormalRange = 63; - final int pattrnRw = 127; - final int pattrnInterrPair = 2047; - final int pattrnAppType = 8191; - final int pattrnKernRelVer = 16383; - final int pattrnHandlTblSize = 32767; - final int pattrnDbgFlags = 65535; - RainbowHexDump.hexDumpUTF8(bytes); - for (int o = 0; o < bytes.length; o += 4) { - RainbowHexDump.octDumpInt(LoperConverter.getLEint(bytes, o)); + int position = 0; + // Collect all blocks + for (int i = 0; i < bytes.length / 4; i++) { + int block = LoperConverter.getLEint(bytes, position); + position += 4; + + int type = getMinBitCnt(block); + + switch (type){ + case KERNELFLAGS: + System.out.println("KERNELFLAGS\t\t"+block+" "+type); + kernelFlagsAvailable = true; + + break; + case SYSCALLMASK: + System.out.println("SYSCALLMASK\t\t"+block+" "+type); + + break; + case MAPIOORNORMALRANGE: + System.out.println("MAPIOORNORMALRANGE\t\t"+block+" "+type); + + break; + case MAPNORMALPAGE_RW: + System.out.println("MAPNORMALPAGE_RW\t\t"+block+" "+type); + + break; + case INTERRUPTPAIR: + System.out.println("INTERRUPTPAIR\t\t"+block+" "+type); + + break; + case APPLICATIONTYPE: + System.out.println("APPLICATIONTYPE\t\t"+block+" "+type); + + break; + case KERNELRELEASEVERSION: + System.out.println("KERNELRELEASEVERSION\t"+block+" "+type); + + break; + case HANDLETABLESIZE: + System.out.println("HANDLETABLESIZE\t\t"+block+" "+type); + + break; + case DEBUGFLAGS: + System.out.println("DEBUGFLAGS\t\t"+block+" "+type); + + break; + default: + System.out.println("UNKNOWN\t\t"+block+" "+type); + } + RainbowHexDump.octDumpInt(block); } System.out.println(); - RainbowHexDump.octDumpInt(pattrnKernFlags); - RainbowHexDump.octDumpInt(pattrnSyscallMsk); - RainbowHexDump.octDumpInt(pattrnMapIoNormalRange); - RainbowHexDump.octDumpInt(pattrnRw); - RainbowHexDump.octDumpInt(pattrnInterrPair); - RainbowHexDump.octDumpInt(pattrnAppType); - RainbowHexDump.octDumpInt(pattrnKernRelVer); - RainbowHexDump.octDumpInt(pattrnHandlTblSize); - RainbowHexDump.octDumpInt(pattrnDbgFlags); - - int KernelFlagsHiCpuId; // 7 31-24 int KernelFlagsLoCpuId; // 7 23-16 int KernelFlagsHiThreadPrio; // 5 15-10 @@ -87,4 +143,14 @@ public class KernelAccessControlProvider { int HandleTableSize ; int DebugFlags; } + + private int getMinBitCnt(int value){ + int minBitCnt = 0; + + while ((value & 1) != 0){ + value >>= 1; + minBitCnt++; + } + return minBitCnt; + } }