⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pedump.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 5 页
字号:
		       char **pps)	// parameter stack
 {
  int i, n;
  char c;
  char name[128];
  char *pin, *pout, *ps;

  //printf(" %c ", **in);
  pin = *ppin;
  pout = *ppout;
  ps = *pps;
  c = *pin;
  switch (c)
    {
      // types processing
    case 'b':
      strcpy (pout, "byte");
      pout += 4;
      pin++;
      break;
    case 'c':
      strcpy (pout, "char");
      pout += 4;
      pin++;
      break;
    case 'd':
      strcpy (pout, "double");
      pout += 6;
      pin++;
      break;
    case 'f':
      strcpy (pout, "float");
      pout += 5;
      pin++;
      break;
    case 'g':
      strcpy (pout, "long double");
      pout += 11;
      pin++;
      break;
    case 'i':
      strcpy (pout, "int");
      pout += 3;
      pin++;
      break;
    case 'l':
      strcpy (pout, "long");
      pout += 4;
      pin++;
      break;
    case 's':
      strcpy (pout, "short");
      pout += 5;
      pin++;
      break;
    case 'v':
      strcpy (pout, "void");
      pout += 4;
      pin++;
      break;
      // postfix processing
    case 'M':
    case 'p':
      if (*(pin + 1) == 'p')
	{
	  *ps++ = 'p';
	  pin += 2;
	}
      else
	{
	  *ps++ = '*';
	  pin++;
	}
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    case 'q':
      *pout++ = '(';
      pin++;
      *ps++ = 'q';
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    case 'r':
      if (*(pin + 1) == 'p')
	{
	  *ps++ = 'r';
	  pin += 2;
	}
      else
	{
	  *ps++ = '&';
	  pin++;
	}
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
      // repeat processing
    case 't':
      if (isdigit (*(pin + 1)))
	{
	  n = *(pin + 1) - '0';
	  pin++;
	  pin++;
	  GetPreviousParamString (pout, name);
	  strcpy (pout, name);
	  pout += strlen (name);
	  for (i = 1; i < n; i++)
	    {
	      *pout++ = ',';
	      strcpy (pout, name);
	      pout += strlen (name);
	    }
	}
      else
	pin++;
      break;
      // prefix processing
    case 'u':
      strcpy (pout, "u");
      pout += 1;
      pin++;
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    case 'x':
      strcpy (pout, "const ");
      pout += 6;
      pin++;
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    case 'z':
      strcpy (pout, "static ");
      pout += 7;
      pin++;
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    default:
      strcpy (pout, "!1!");
      pout += 3;
      *pout++ = *pin++;
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    }
  // need to process postfix finally
  c = *(ps - 1);
  if (strchr ("tqx", c))
    {
      if (*(pin) && !strchr ("@$%", *(pin)))
	*pout++ = ',';
      *ppin = pin;
      *ppout = pout;
      *pps = ps;
      return;
    }
  switch (c)
    {
    case 'r':
      strcpy (pout, "*&");
      pout += 2;
      ps--;
      break;
    case 'p':
      strcpy (pout, "**");
      pout += 2;
      ps--;
      break;
    case '&':
      strcpy (pout, "&");
      pout += 1;
      ps--;
      break;
    case '*':
      strcpy (pout, "*");
      pout += 1;
      ps--;
      break;
    default:
      strcpy (pout, "!2!");
      pout += 3;
      ps--;
      break;
    }
  if (*(pin) && !strchr ("@$%", *(pin)))
    *pout++ = ',';
  *ppin = pin;
  *ppout = pout;
  *pps = ps;
}


//
// This function is written by sang cho
//                                                         October 11, 1997
//

/* translate parameter part of condensed name */
BOOL WINAPI
StringExpands (
		char **ppin,	// read-only source
		 char **ppout,	// translated result
		 char **pps,	// parameter stack
		 Str_P * pcstr)	// currently stored string
 {
//      int         n;
  //      char        c;
  char *pin, *pout, *ps;
  Str_P c_str;
  BOOL stringMode = TRUE;

  pin = *ppin;
  pout = *ppout;
  ps = *pps;
  c_str = *pcstr;

  if (strncmp (pin, "bctr", 4) == 0)
    {
      strncpy (pout, c_str.pos, c_str.length);
      pout += c_str.length;
      pin += 4;
    }
  else if (strncmp (pin, "bdtr", 4) == 0)
    {
      *pout++ = '~';
      strncpy (pout, c_str.pos, c_str.length);
      pout += c_str.length;
      pin += 4;
    }
  else if (*pin == 'o')
    {
      strcpy (pout, "const ");
      pout += 6;
      pin++;
      stringMode = FALSE;
    }
  else if (*pin == 'q')
    {
      *pout++ = '(';
      pin++;
      *ps++ = 'q';
      stringMode = FALSE;
    }
  else if (*pin == 't')
    {
      //if (*(ps-1) == 't') { *pout++ = ','; pin++; }       // this also got me...
      //else                                                                                          october 12  .. sang
      {
	*pout++ = '<';
	pin++;
	*ps++ = 't';
      }
      stringMode = FALSE;
    }
  else if (strncmp (pin, "xq", 2) == 0)
    {
      *pout++ = '(';
      pin += 2;
      *ps++ = 'x';
      *ps++ = 'q';
      stringMode = FALSE;
    }
  else if (strncmp (pin, "bcall", 5) == 0)
    {
      strcpy (pout, "operator ()");
      pout += 11;
      pin += 5;
    }
  else if (strncmp (pin, "bsubs", 5) == 0)
    {
      strcpy (pout, "operator []");
      pout += 11;
      pin += 5;
    }
  else if (strncmp (pin, "bnwa", 4) == 0)
    {
      strcpy (pout, "operator new[]");
      pout += 14;
      pin += 4;
    }
  else if (strncmp (pin, "bdla", 4) == 0)
    {
      strcpy (pout, "operator delete[]");
      pout += 17;
      pin += 4;
    }
  else if (strncmp (pin, "bnew", 4) == 0)
    {
      strcpy (pout, "operator new");
      pout += 12;
      pin += 4;
    }
  else if (strncmp (pin, "bdele", 5) == 0)
    {
      strcpy (pout, "operator delete");
      pout += 15;
      pin += 5;
    }
  else if (strncmp (pin, "blsh", 4) == 0)
    {
      strcpy (pout, "operator <<");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "brsh", 4) == 0)
    {
      strcpy (pout, "operator >>");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "binc", 4) == 0)
    {
      strcpy (pout, "operator ++");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "bdec", 4) == 0)
    {
      strcpy (pout, "operator --");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "badd", 4) == 0)
    {
      strcpy (pout, "operator +");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "brplu", 5) == 0)
    {
      strcpy (pout, "operator +=");
      pout += 11;
      pin += 5;
    }
  else if (strncmp (pin, "bdiv", 4) == 0)
    {
      strcpy (pout, "operator /");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "brdiv", 5) == 0)
    {
      strcpy (pout, "operator /=");
      pout += 11;
      pin += 5;
    }
  else if (strncmp (pin, "bmul", 4) == 0)
    {
      strcpy (pout, "operator *");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "brmul", 5) == 0)
    {
      strcpy (pout, "operator *=");
      pout += 11;
      pin += 5;
    }
  else if (strncmp (pin, "basg", 4) == 0)
    {
      strcpy (pout, "operator =");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "beql", 4) == 0)
    {
      strcpy (pout, "operator ==");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "bneq", 4) == 0)
    {
      strcpy (pout, "operator !=");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "bor", 3) == 0)
    {
      strcpy (pout, "operator |");
      pout += 10;
      pin += 3;
    }
  else if (strncmp (pin, "bror", 4) == 0)
    {
      strcpy (pout, "operator |=");
      pout += 11;
      pin += 4;
    }
  else if (strncmp (pin, "bcmp", 4) == 0)
    {
      strcpy (pout, "operator ~");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "bnot", 4) == 0)
    {
      strcpy (pout, "operator !");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "band", 4) == 0)
    {
      strcpy (pout, "operator &");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "brand", 5) == 0)
    {
      strcpy (pout, "operator &=");
      pout += 11;
      pin += 5;
    }
  else if (strncmp (pin, "bxor", 4) == 0)
    {
      strcpy (pout, "operator ^");
      pout += 10;
      pin += 4;
    }
  else if (strncmp (pin, "brxor", 5) == 0)
    {
      strcpy (pout, "operator ^=");
      pout += 11;
      pin += 5;
    }
  else
    {
      strcpy (pout, "!$$$!");
      pout += 5;
    }
  *ppin = pin;
  *ppout = pout;
  *pps = ps;
  return stringMode;
}				// end of '$' processing



//----------------------------------------------------------------------
// structure to store string tokens
//----------------------------------------------------------------------
//typedef struct _Str_P {
//    char    flag;               // string_flag '@' or '%' or '#'
//    char    *pos;               // starting postion of string
//    int     length;     // length of string
//      BOOL    wasString;    // if it were stringMode or not
//} Str_P;
//----------------------------------------------------------------------
//
// I think I knocked it down finally. But who knows?
//                            october 12, 1997 ... sang
//
// well I have to rewrite whole part of TranslateFunctionName..
// this time I am a little bit more experienced than 5 days ago.
// or am i??? anyway i use stacks instead of recurcive calls
// and i hope this will take care of every symptoms i have experienced..
//                                                        october 10, 1997 .... sang
// It took a lot of time for me to figure out what is all about....
// but still some prefixes like z (static)
//     -- or some types like b (byte) ,g (long double) ,s (short) --
//         -- or postfix  like M ( * )
//     -- or $or ( & ) which is pretty wierd.         .. added.. october 12
//     -- also $t business is quite tricky too. (templates)
//             there may be a lot of things undiscovered yet....
// I am not so sure my interpretation is correct or not
// If I am wrong please let me know.
//                             october 8, 1997 .... sang
//
//
// This function is written by sang cho
//                                                         October 5, 1997
//
/* translate condesed import function name */
char * WINAPI
TranslateFunctionName (
			char *psz)
{


  int i, /*j,*/ n;
  char c = 0;
  char cc;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -