REGS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

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