Annotation of mstools/samples/sdktools/image/drwatson/i386/regs.c, revision 1.1.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.