|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1993 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: regs.c ! 8: ! 9: Abstract: ! 10: ! 11: This file provides access to the machine's register set. ! 12: ! 13: Author: ! 14: ! 15: Wesley Witt (wesw) 1-May-1993 (ported from ntsd) ! 16: ! 17: Environment: ! 18: ! 19: User Mode ! 20: ! 21: --*/ ! 22: ! 23: #include <windows.h> ! 24: #include <stdlib.h> ! 25: #include <stdio.h> ! 26: #include <string.h> ! 27: ! 28: #include "drwatson.h" ! 29: #include "proto.h" ! 30: #include "regs.h" ! 31: ! 32: ! 33: ! 34: PUCHAR RegNameFromIndex (ULONG index); ! 35: ULONG GetDregValue (PDEBUGPACKET dp, ULONG index); ! 36: void OutputOneReg (PDEBUGPACKET dp, ULONG regnum); ! 37: void OutputAllRegs(PDEBUGPACKET dp); ! 38: ULONG GetRegString (PUCHAR pszString); ! 39: ULONG GetRegFlagValue (PDEBUGPACKET dp, ULONG regnum); ! 40: ULONG GetRegValue (PDEBUGPACKET dp, ULONG regnum); ! 41: ! 42: ! 43: ! 44: ! 45: ! 46: ! 47: char szGsReg[] = "gs"; ! 48: char szFsReg[] = "fs"; ! 49: char szEsReg[] = "es"; ! 50: char szDsReg[] = "ds"; ! 51: char szEdiReg[] = "edi"; ! 52: char szEsiReg[] = "esi"; ! 53: char szEbxReg[] = "ebx"; ! 54: char szEdxReg[] = "edx"; ! 55: char szEcxReg[] = "ecx"; ! 56: char szEaxReg[] = "eax"; ! 57: char szEbpReg[] = "ebp"; ! 58: char szEipReg[] = "eip"; ! 59: char szCsReg[] = "cs"; ! 60: char szEflReg[] = "efl"; ! 61: char szEspReg[] = "esp"; ! 62: char szSsReg[] = "ss"; ! 63: char szDiReg[] = "di"; ! 64: char szSiReg[] = "si"; ! 65: char szBxReg[] = "bx"; ! 66: char szDxReg[] = "dx"; ! 67: char szCxReg[] = "cx"; ! 68: char szAxReg[] = "ax"; ! 69: char szBpReg[] = "bp"; ! 70: char szIpReg[] = "ip"; ! 71: char szFlReg[] = "fl"; ! 72: char szSpReg[] = "sp"; ! 73: char szBlReg[] = "bl"; ! 74: char szDlReg[] = "dl"; ! 75: char szClReg[] = "cl"; ! 76: char szAlReg[] = "al"; ! 77: char szBhReg[] = "bh"; ! 78: char szDhReg[] = "dh"; ! 79: char szChReg[] = "ch"; ! 80: char szAhReg[] = "ah"; ! 81: char szIoplFlag[] = "iopl"; ! 82: char szFlagOf[] = "of"; ! 83: char szFlagDf[] = "df"; ! 84: char szFlagIf[] = "if"; ! 85: char szFlagTf[] = "tf"; ! 86: char szFlagSf[] = "sf"; ! 87: char szFlagZf[] = "zf"; ! 88: char szFlagAf[] = "af"; ! 89: char szFlagPf[] = "pf"; ! 90: char szFlagCf[] = "cf"; ! 91: char szFlagVip[] = "vip"; ! 92: char szFlagVif[] = "vif"; ! 93: ! 94: struct Reg { ! 95: char *psz; ! 96: ULONG value; ! 97: }; ! 98: ! 99: struct SubReg { ! 100: ULONG regindex; ! 101: ULONG shift; ! 102: ULONG mask; ! 103: }; ! 104: ! 105: struct Reg regname[] = { ! 106: { szGsReg, REGGS }, ! 107: { szFsReg, REGFS }, ! 108: { szEsReg, REGES }, ! 109: { szDsReg, REGDS }, ! 110: { szEdiReg, REGEDI }, ! 111: { szEsiReg, REGESI }, ! 112: { szEbxReg, REGEBX }, ! 113: { szEdxReg, REGEDX }, ! 114: { szEcxReg, REGECX }, ! 115: { szEaxReg, REGEAX }, ! 116: { szEbpReg, REGEBP }, ! 117: { szEipReg, REGEIP }, ! 118: { szCsReg, REGCS }, ! 119: { szEflReg, REGEFL }, ! 120: { szEspReg, REGESP }, ! 121: { szSsReg, REGSS }, ! 122: { szDiReg, REGDI }, ! 123: { szSiReg, REGSI }, ! 124: { szBxReg, REGBX }, ! 125: { szDxReg, REGDX }, ! 126: { szCxReg, REGCX }, ! 127: { szAxReg, REGAX }, ! 128: { szBpReg, REGBP }, ! 129: { szIpReg, REGIP }, ! 130: { szFlReg, REGFL }, ! 131: { szSpReg, REGSP }, ! 132: { szBlReg, REGBL }, ! 133: { szDlReg, REGDL }, ! 134: { szClReg, REGCL }, ! 135: { szAlReg, REGAL }, ! 136: { szBhReg, REGBH }, ! 137: { szDhReg, REGDH }, ! 138: { szChReg, REGCH }, ! 139: { szAhReg, REGAH }, ! 140: { szIoplFlag, FLAGIOPL }, ! 141: { szFlagOf, FLAGOF }, ! 142: { szFlagDf, FLAGDF }, ! 143: { szFlagIf, FLAGIF }, ! 144: { szFlagTf, FLAGTF }, ! 145: { szFlagSf, FLAGSF }, ! 146: { szFlagZf, FLAGZF }, ! 147: { szFlagAf, FLAGAF }, ! 148: { szFlagPf, FLAGPF }, ! 149: { szFlagCf, FLAGCF }, ! 150: { szFlagVip, FLAGVIP }, ! 151: { szFlagVif, FLAGVIF }, ! 152: }; ! 153: ! 154: #define REGNAMESIZE (sizeof(regname) / sizeof(struct Reg)) ! 155: ! 156: struct SubReg subregname[] = { ! 157: { REGEDI, 0, 0xffff }, // DI register ! 158: { REGESI, 0, 0xffff }, // SI register ! 159: { REGEBX, 0, 0xffff }, // BX register ! 160: { REGEDX, 0, 0xffff }, // DX register ! 161: { REGECX, 0, 0xffff }, // CX register ! 162: { REGEAX, 0, 0xffff }, // AX register ! 163: { REGEBP, 0, 0xffff }, // BP register ! 164: { REGEIP, 0, 0xffff }, // IP register ! 165: { REGEFL, 0, 0xffff }, // FL register ! 166: { REGESP, 0, 0xffff }, // SP register ! 167: { REGEBX, 0, 0xff }, // BL register ! 168: { REGEDX, 0, 0xff }, // DL register ! 169: { REGECX, 0, 0xff }, // CL register ! 170: { REGEAX, 0, 0xff }, // AL register ! 171: { REGEBX, 8, 0xff }, // BH register ! 172: { REGEDX, 8, 0xff }, // DH register ! 173: { REGECX, 8, 0xff }, // CH register ! 174: { REGEAX, 8, 0xff }, // AH register ! 175: { REGEFL, 12, 3 }, // IOPL level value ! 176: { REGEFL, 11, 1 }, // OF (overflow flag) ! 177: { REGEFL, 10, 1 }, // DF (direction flag) ! 178: { REGEFL, 9, 1 }, // IF (interrupt enable flag) ! 179: { REGEFL, 8, 1 }, // TF (trace flag) ! 180: { REGEFL, 7, 1 }, // SF (sign flag) ! 181: { REGEFL, 6, 1 }, // ZF (zero flag) ! 182: { REGEFL, 4, 1 }, // AF (aux carry flag) ! 183: { REGEFL, 2, 1 }, // PF (parity flag) ! 184: { REGEFL, 0, 1 }, // CF (carry flag) ! 185: { REGEFL, 20, 1 }, // VIP (virtual interrupt pending) ! 186: { REGEFL, 19, 1 } // VIF (virtual interrupt flag) ! 187: }; ! 188: ! 189: ULONG ! 190: GetRegFlagValue (PDEBUGPACKET dp, ULONG regnum) ! 191: { ! 192: ULONG value; ! 193: ! 194: if (regnum < FLAGBASE) ! 195: value = GetRegValue(dp, regnum); ! 196: else { ! 197: regnum -= FLAGBASE; ! 198: value = GetRegValue(dp, subregname[regnum].regindex); ! 199: value = (value >> subregname[regnum].shift) & subregname[regnum].mask; ! 200: } ! 201: return value; ! 202: } ! 203: ! 204: ULONG ! 205: GetRegValue (PDEBUGPACKET dp, ULONG regnum) ! 206: { ! 207: switch (regnum) { ! 208: case REGGS: ! 209: return dp->tctx->context.SegGs; ! 210: case REGFS: ! 211: return dp->tctx->context.SegFs; ! 212: case REGES: ! 213: return dp->tctx->context.SegEs; ! 214: case REGDS: ! 215: return dp->tctx->context.SegDs; ! 216: case REGEDI: ! 217: return dp->tctx->context.Edi; ! 218: case REGESI: ! 219: return dp->tctx->context.Esi; ! 220: case REGSI: ! 221: return(dp->tctx->context.Esi & 0xffff); ! 222: case REGDI: ! 223: return(dp->tctx->context.Edi & 0xffff); ! 224: case REGEBX: ! 225: return dp->tctx->context.Ebx; ! 226: case REGEDX: ! 227: return dp->tctx->context.Edx; ! 228: case REGECX: ! 229: return dp->tctx->context.Ecx; ! 230: case REGEAX: ! 231: return dp->tctx->context.Eax; ! 232: case REGEBP: ! 233: return dp->tctx->context.Ebp; ! 234: case REGEIP: ! 235: return dp->tctx->context.Eip; ! 236: case REGCS: ! 237: return dp->tctx->context.SegCs; ! 238: case REGEFL: ! 239: return dp->tctx->context.EFlags; ! 240: case REGESP: ! 241: return dp->tctx->context.Esp; ! 242: case REGSS: ! 243: return dp->tctx->context.SegSs; ! 244: case PREGEA: ! 245: return 0; ! 246: case PREGEXP: ! 247: return 0; ! 248: case PREGRA: { ! 249: struct { ! 250: ULONG oldBP; ! 251: ULONG retAddr; ! 252: } stackRead; ! 253: ReadProcessMemory( dp->hProcess, ! 254: (LPVOID)dp->tctx->context.Ebp, ! 255: (LPVOID)&stackRead, ! 256: sizeof(stackRead), ! 257: NULL ! 258: ); ! 259: return stackRead.retAddr; ! 260: } ! 261: case PREGP: ! 262: return 0; ! 263: case REGDR0: ! 264: return dp->tctx->context.Dr0; ! 265: case REGDR1: ! 266: return dp->tctx->context.Dr1; ! 267: case REGDR2: ! 268: return dp->tctx->context.Dr2; ! 269: case REGDR3: ! 270: return dp->tctx->context.Dr3; ! 271: case REGDR6: ! 272: return dp->tctx->context.Dr6; ! 273: case REGDR7: ! 274: return dp->tctx->context.Dr7; ! 275: default: ! 276: return 0; ! 277: } ! 278: } ! 279: ! 280: ULONG ! 281: GetRegString (PUCHAR pszString) ! 282: { ! 283: ULONG count; ! 284: ! 285: for (count = 0; count < REGNAMESIZE; count++) ! 286: if (!strcmp(pszString, regname[count].psz)) ! 287: return regname[count].value; ! 288: return (ULONG)-1; ! 289: } ! 290: ! 291: void ! 292: OutputAllRegs( PDEBUGPACKET dp ) ! 293: { ! 294: lprintfs("eax=%08lx ebx=%08lx ecx=%08lx edx=%08lx esi=%08lx edi=%08lx\r\n", ! 295: GetRegValue(dp,REGEAX), ! 296: GetRegValue(dp,REGEBX), ! 297: GetRegValue(dp,REGECX), ! 298: GetRegValue(dp,REGEDX), ! 299: GetRegValue(dp,REGESI), ! 300: GetRegValue(dp,REGEDI)); ! 301: ! 302: lprintfs("eip=%08lx esp=%08lx ebp=%08lx iopl=%1lx " ! 303: "%s %s %s %s %s %s %s %s %s %s\r\n", ! 304: GetRegValue(dp,REGEIP), ! 305: GetRegValue(dp,REGESP), ! 306: GetRegValue(dp,REGEBP), ! 307: GetRegFlagValue(dp,FLAGIOPL), ! 308: GetRegFlagValue(dp,FLAGVIP) ? "vip" : " ", ! 309: GetRegFlagValue(dp,FLAGVIF) ? "vif" : " ", ! 310: GetRegFlagValue(dp,FLAGOF) ? "ov" : "nv", ! 311: GetRegFlagValue(dp,FLAGDF) ? "dn" : "up", ! 312: GetRegFlagValue(dp,FLAGIF) ? "ei" : "di", ! 313: GetRegFlagValue(dp,FLAGSF) ? "ng" : "pl", ! 314: GetRegFlagValue(dp,FLAGZF) ? "zr" : "nz", ! 315: GetRegFlagValue(dp,FLAGAF) ? "ac" : "na", ! 316: GetRegFlagValue(dp,FLAGPF) ? "po" : "pe", ! 317: GetRegFlagValue(dp,FLAGCF) ? "cy" : "nc"); ! 318: lprintfs("cs=%04lx ss=%04lx ds=%04lx es=%04lx fs=%04lx gs=%04lx" ! 319: " efl=%08lx\r\n", ! 320: GetRegValue(dp,REGCS), ! 321: GetRegValue(dp,REGSS), ! 322: GetRegValue(dp,REGDS), ! 323: GetRegValue(dp,REGES), ! 324: GetRegValue(dp,REGFS), ! 325: GetRegValue(dp,REGGS), ! 326: GetRegFlagValue(dp,REGEFL)); ! 327: lprintfs("\r\n\r\n"); ! 328: } ! 329: ! 330: void ! 331: OutputOneReg (PDEBUGPACKET dp, ULONG regnum) ! 332: { ! 333: ULONG value; ! 334: ! 335: value = GetRegFlagValue(dp,regnum); ! 336: if (regnum < FLAGBASE) ! 337: lprintfs("%08lx\r\n", value); ! 338: else ! 339: lprintfs("%lx\r\n", value); ! 340: } ! 341: ! 342: ULONG ! 343: GetDregValue (PDEBUGPACKET dp, ULONG index) ! 344: { ! 345: if (index < 4) ! 346: index += REGDR0; ! 347: else ! 348: index += REGDR6 - 6; ! 349: return GetRegValue(dp,index); ! 350: } ! 351: ! 352: PUCHAR ! 353: RegNameFromIndex (ULONG index) ! 354: { ! 355: ULONG count; ! 356: ! 357: for (count = 0; count < REGNAMESIZE; count++) ! 358: if (regname[count].value == index) ! 359: return regname[count].psz; ! 360: return NULL; ! 361: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.