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

📄 convertingprocess.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
字号:
#include <windows.h>
#include <winnt.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "misc.h"
#include "any_op.h"

/* hack should be in misc.h*/


CPU_INT ConvertProcess(FILE *outfp, CPU_INT FromCpuid, CPU_INT ToCpuid)
{
    CPU_INT ret=0;
   CPU_INT regbits=-1;
   CPU_INT HowManyRegInUse = 0;
   CPU_INT RegTableCount[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   CPU_INT t;
   PMYBrainAnalys pMystart = pStartMyBrainAnalys;
   PMYBrainAnalys pMyend = pMyBrainAnalys;

   PMYBrainAnalys ptmpMystart = pStartMyBrainAnalys;
   PMYBrainAnalys ptmpMyend = pMyBrainAnalys;

   if ( (FromCpuid == IMAGE_FILE_MACHINE_POWERPC) ||
        (FromCpuid == IMAGE_FILE_MACHINE_I386))
    {
        regbits = 32 / 8;
    }

    /* FIXME calc where todo first split */

   /* count how many register we got */
    ptmpMystart = pMystart;
    ptmpMyend = pMyend;
    while (ptmpMystart!=NULL)
    {
        if ((ptmpMystart->type & 2) == 2)
            RegTableCount[ptmpMystart->src]++;

        if ((ptmpMystart->type & 8) == 8)
            RegTableCount[ptmpMystart->dst]++;

        if ((ptmpMystart->type & 32) == 32)
            RegTableCount[ptmpMystart->src]++;

        if ((ptmpMystart->type & 64) == 64)
            RegTableCount[ptmpMystart->dst]++;

        if (ptmpMystart == ptmpMyend)
            ptmpMystart=NULL;
        else
            ptmpMystart = (PMYBrainAnalys) ptmpMystart->ptr_next;
    }

    for (t=0;t<=31;t++)
    {
        if (RegTableCount[t]!=0)
        {
            HowManyRegInUse++;
            RegTableCount[t]=t;
        }
    }


    /* switch to the acual converting now */
    switch (ToCpuid)
    {
        case IMAGE_FILE_MACHINE_I386:
             ret = ConvertToIA32Process( outfp, pMystart, 
                                         pMyend, regbits,
                                         HowManyRegInUse,
                                         RegTableCount);
             if (ret !=0)
             {
                 printf("should not happen contact a devloper, x86 fail\n");
                 return -1;
             }
             break;

        case IMAGE_FILE_MACHINE_POWERPC:
             ret = ConvertToPPCProcess( outfp, pMystart, 
                                        pMyend, regbits,
                                        HowManyRegInUse,
                                        RegTableCount);
             if (ret !=0)
             {
                 printf("should not happen contact a devloper, x86 fail\n");
                 return -1;
             }
             break;

        default:
            printf("should not happen contact a devloper, unknown fail\n");
            return -1;
    }

    return ret;
}

⌨️ 快捷键说明

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