Annotation of mstools/samples/sdktools/image/drwatson/i386/regs.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.