| 
 | 
 
 
 楼主 |
发表于 2013-11-5 13:24:23
|
显示全部楼层
 
 
 
下面是对进程的一些了解 
#include<stdio.h> 
#include<windows.h> 
#include<Error.h> 
#include<Psapi.h>//包含进程状态的api头文件 
#include<Tlhelp32.h>//包含运行的程序的程序信息函数文件 
#define ID_BUTTON1 1 
#define buff MAX_PATH 
#define TYPE_LEVEL 0x1 
#define TYPE_VETRICAL 0x2 
DWORD buffs[1024];  
DWORD size; 
int d=0; 
struct jiegou 
{ 
        int x; 
        int y; 
}JG; 
DWORD writeprocessmemory(HANDLE hp,DWORD zhi); 
BOOL Readprocessmemory(LPSTR lp,DWORD ints,DWORD zhi); 
BOOL Compareapage(HANDLE hremoteprocess,DWORD base,DWORD ints); 
BOOL processheap(DWORD pid); 
BOOL EnablePrivilege(LPSTR lp); 
void modulefirst(LPVOID lp); 
void getEnumprocessid(); 
void Firstprocessid(LPVOID lp); 
void PrintfString(HWND hwnd,HDC hdc,LPSTR lp,int h,DWORD type); 
LRESULT CALLBACK WinProc(HWND ,UINT ,WPARAM ,LPARAM); 
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) 
{         
        HDC hdc; 
        MSG msg; 
        HWND hwnd; 
        WNDCLASSEX wc; 
        wc.style=CS_HREDRAW|CS_VREDRAW; 
        wc.cbSize=sizeof(wc); 
        wc.lpfnWndProc=WinProc; 
        wc.hInstance=hInstance; 
        wc.cbClsExtra=0; 
        wc.cbWndExtra=0; 
        wc.hIcon=NULL; 
        wc.hIconSm=NULL;  
        wc.hCursor=LoadCursor(NULL,IDC_ARROW); 
        wc.hbrBackground=(HBRUSH)GetStockObject(2); 
        wc.lpszClassName="window"; 
        wc.lpszMenuName=NULL; 
        if(!RegisterClassEx(&wc)) 
        { 
                MessageBox(NULL,"注册窗口失败","ERROR",MB_OK); 
        } 
        hdc=CreateDC("DISPLAY",NULL,NULL,NULL); 
        JG.x=GetDeviceCaps(hdc,8); 
        JG.y=GetDeviceCaps(hdc,10); 
        hwnd=CreateWindow("window","window",WS_OVERLAPPEDWINDOW,JG.x/2-200,JG.y/2-200,400,400,NULL,NULL,hInstance,NULL) ; 
        ShowWindow(hwnd,nCmdShow); 
        UpdateWindow(hwnd); 
        while(GetMessage(&msg,NULL,0,0)) 
        { 
                TranslateMessage(&msg); 
                DispatchMessage(&msg); 
        } 
        return msg.wParam; 
} 
LRESULT CALLBACK WinProc(HWND hwnd,UINT message ,WPARAM wparam,LPARAM lparam) 
{ 
 
        HDC hdc; 
        PAINTSTRUCT ps; 
        RECT rect; 
        int x,y; 
        HWND hbutton1; 
        switch(message) 
        { 
        case WM_CREATE: 
                GetClientRect(hwnd,&rect); 
                x=rect.right; 
                y=rect.bottom; 
                hbutton1=CreateWindow("button","按钮1",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,x/2-20,y-20,40,20,hwnd,(HMENU)ID_BUTTON1,((LPCREATESTRUCT)lparam)->hInstance,NULL);break; 
        case WM_PAINT: 
                hdc=BeginPaint(hwnd,&ps); 
                /*                                                                                                                        code位置                                                                                */ 
                /*                                                                                                                                ↓                                                                                        */ 
                //processheap(3048); 
                //getEnumprocessid();                                                                                                         
                //Firstprocessid("360tray.exe"); 
                //modulefirst("Psapi.dll"); 
                /*                                                                                                                                ↑                                                                                        */ 
                /*                                                                                                                        code数位置                                                                                */ 
                EndPaint(hwnd,&ps); 
                break; 
        case WM_COMMAND: 
                switch(LOWORD(wparam)) 
                { 
                case ID_BUTTON1: 
                        /*                                                                                                                        code位置                                                                                */ 
                        /*                                                                                                                                ↓                                                                                        */ 
                        Readprocessmemory("模板.exe",(DWORD)'M',(DWORD)'S'); 
 
                        /*                                                                                                                                ↑                                                                                        */ 
                        /*                                                                                                                        code数位置                                                                                */ 
                        InvalidateRect(hwnd,NULL,TRUE); 
                        break; 
                }; 
                break; 
        case 0x2: 
                PostQuitMessage(0); break; 
        } 
        return DefWindowProc(hwnd,message,wparam,lparam); 
} 
//PS API是获取进程状态信息的一系列API的合称,这些API在Psapi.h头文件中定义 Psapi.dll 
//Tool help api提供呢用于获取执行中的应用程序信息,一般情况下可以与PS API配合使用,Tool help API 由Tlhelp.h头文件定义,Kerenl32,DLL 
 
//获得所有进程的所有进程名和进程的所有模块路径 
void getEnumprocessid() 
{ 
        int x,y=0, m,k; 
        HWND hwnd; 
        HDC hdc; 
        DWORD pid[MAX_PATH],ints,me; 
        HANDLE hProcess; 
        HMODULE module[MAX_PATH]; 
        //参数1为保持进程ID的数组 
        //2为数组大小 
        //写入的数据大小 
        hwnd=FindWindow("window","window");//查找指定的窗口,得到窗口句柄,此处是查找自己的 
        hdc=GetDC(hwnd);//获得窗口句柄的DC设备 
        if(EnablePrivilege("SE_DEBUG_NAME"))//提升权限 
                MessageBox(NULL,"特权令牌失败","error",MB_OK); 
        EnumProcesses(pid,MAX_PATH,&ints);//获得系统中所有进程PID,注意参数3为写入的数据大小 
        x=ints/sizeof(DWORD);//得到写入呢多少进程ID 
loop: for(;y<x;y++) 
          { 
                  char basename[MAX_PATH]; 
                  hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pid[y]);//通过ID得到进程句柄 
                  EnumProcessModules(hProcess,module,sizeof(module),&me);//获取进程的所有模块 
                  GetModuleBaseName(hProcess,NULL,basename,MAX_PATH);//获得进程Name 
 
                  if(basename[1]==-52)//如果得到权限那么basename的参数一不可能为空,一旦为空,那么执行loop处开始 
                  { 
                          y++; 
                          goto loop; 
                  } 
                  TextOut(hdc,0,d,basename,lstrlen(basename));//打印出来 
                  d+=15;//分行 
                  m=me/sizeof(HMODULE);//得到写入呢多少进程模块 
                  for(k=0;k<m;k++) 
                  { 
                          char Name[MAX_PATH]; 
                          GetModuleFileNameEx(hProcess,module[k],Name,MAX_PATH);//得到所有模块的完整路径 
                          TextOut(hdc,0,d,Name,lstrlen(Name));//打印出来 
                          d+=15; 
                  } 
          } 
} 
//查找指定程序名查找跟指定程序进程有关的信息 
void Firstprocessid(LPVOID lp) 
{ 
        //一下函数可能要包含Tlhelp.h头文件 
        HWND hwnd; 
        HDC hdc; 
        char ch[32],str[MAX_PATH]; 
        HANDLE Snap; 
        PROCESSENTRY32 info; 
        info.dwSize=sizeof(PROCESSENTRY32); 
        Snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获得系统中进程快照 
        Process32First(Snap,&info);//获得快照中的第一个进程info 
        sprintf(ch,"找到%s",(LPSTR)lp); 
        if(lstrcmpi((LPSTR)lp,info.szExeFile)==0)//判断是否找到想要的进程 
                MessageBox(NULL,ch,"TRUE",MB_OK); 
        do 
        { 
                if(lstrcmpi((LPSTR)lp,info.szExeFile)==0) 
                { 
                        hwnd=FindWindow("window","window"); 
                        hdc=GetDC(hwnd); 
                        MessageBox(NULL,ch,"TRUE",MB_OK); 
                        //对进程信息,打印 
                        sprintf(str,"进程ID:%d 进程默认堆ID: %d 进程模块ID: %d 进程拥有线程记数:%d 父进程PID:%d 线程优先权:%d 进程名称:%s",info.th32ProcessID,info.th32DefaultHeapID,info.th32ModuleID,info.cntThreads,info.th32ParentProcessID,info.pcPriClassBase,info.szExeFile); 
                        PrintfString(hwnd,hdc,str,2,0x2|0x1); 
                } 
        } 
        while(Process32Next(Snap,&info));//查找快照中剩下的所有进程 
} 
//查找模块被什么进程调用 
void modulefirst(LPVOID lp) 
{ 
        HWND hwnd; 
        HDC hdc; 
        HANDLE hsnapmodule,hsnap;//模块快照句柄,进程快照句柄 
        char str[MAX_PATH]; 
        MODULEENTRY32 minfo; 
        PROCESSENTRY32 pinfo; 
        minfo.dwSize=sizeof(MODULEENTRY32);//设置大小 
        pinfo.dwSize=sizeof(PROCESSENTRY32); 
        sprintf(str,"找到调用%s模块文件的程序",(LPSTR)lp); 
        hwnd=FindWindow("window","window"); 
        hdc=GetDC(hwnd); 
        hsnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照 
 
        Process32First(hsnap,&pinfo);//获得快照中的第一个进程 
        do 
        { 
                hsnapmodule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo.th32ProcessID);//创建模块 快照 
                Module32First(hsnapmodule,&minfo);//得到模块快照的第一个模块 
                ///////////////////////////////////////////////////////////////////////////////////// 
                if(lstrcmpi(minfo.szModule,(LPSTR)lp)==0)//对比是否和要查找的相同 
                        MessageBox(NULL,str,"TRUE",MB_OK);//提示 
                do 
                { 
                        if(lstrcmpi(minfo.szModule,(LPSTR)lp)==0) 
                        { 
                                sprintf(str,"进程名称:%s 进程ID: %d 全局模块的使用计数:%d 进程范围内模块的使用计数: %d 基址模块: %d 模块大小:%d 模块句柄:%x 包含模块名:%s 模块路径:%s",pinfo.szExeFile,minfo.th32ProcessID,minfo.GlblcntUsage,minfo.ProccntUsage,minfo.modBaseAddr,minfo.modBaseSize,minfo.hModule,minfo.szModule,minfo.szExePath); 
                                PrintfString(hwnd,hdc,str,1,1|2); 
                        } 
                } 
                while(Module32Next(hsnapmodule,&minfo)); 
                //////////////////////////////////////////////////////////////////////////////////// 
        } 
        while(Process32Next(hsnap,&pinfo)); 
} 
//获取指定进程内存使用情况 
void zdprocessmemory(DWORD pid) 
{ 
        HWND hwnd; 
        HDC hdc; 
        LPVOID Virtualmemory; 
        HANDLE remoteproc; 
        PROCESS_MEMORY_COUNTERS pmeminfo;//保存线程的内存结构 
        remoteproc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pid);//打开远程线程 
        if(remoteproc) 
                MessageBox(NULL,"远程进程失败","error",MB_OK); 
        if(GetProcessMemoryInfo(remoteproc,&pmeminfo,sizeof(pmeminfo)))//获得指定进程的内存使用情况 
        { 
                Virtualmemory=VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_READWRITE); 
                sprintf((LPSTR)Virtualmemory,"缺页中断次数%d 使用内存高峰%d 当前使用的内存%d 使用页面缓存池高峰%d  使用页面缓存池%d 使用非页面缓存池高峰%d 使用非分页缓存池%d 使用分页文件%d 使用分页文件高峰%d",pmeminfo.PageFaultCount,pmeminfo.PeakWorkingSetSize,pmeminfo.WorkingSetSize,pmeminfo.QuotaPeakPagedPoolUsage,pmeminfo.QuotaPagedPoolUsage,pmeminfo.QuotaPeakNonPagedPoolUsage,pmeminfo.QuotaNonPagedPoolUsage,pmeminfo.PagefileUsage,pmeminfo.PeakPagefileUsage); 
                hwnd=FindWindow("window","window"); 
                hdc=GetDC(hwnd); 
                PrintfString(hwnd,hdc,(LPSTR)Virtualmemory,2,1|2); 
                VirtualFree(Virtualmemory,0,MEM_RELEASE); 
        } 
} 
//列举进程中的堆 
BOOL processheap(DWORD pid) 
{ 
        int error; 
        char Name[32]; 
        char str[MAX_PATH]; 
        HWND hwnd; 
        HDC hdc; 
        HANDLE heap,process; 
        HEAPLIST32 heapinfo={0}; 
        HEAPENTRY32 heapinf={0};//记得把堆情零 
        PROCESSENTRY32 pinfo={0}; 
         
        hwnd=FindWindow("window","window"); 
        hdc=GetDC(hwnd); 
        heap=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,pid); 
        process=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
        Process32First(process,&pinfo); 
        do 
        { 
                if(pinfo.th32ProcessID==pid) 
                { 
                                CopyMemory(Name,&(pinfo.szExeFile),lstrlen(pinfo.szExeFile)+1); 
                } 
        } 
        while(Process32Next(process,&pinfo)); 
 
        heapinfo.dwSize=sizeof(HEAPLIST32); 
        Heap32ListFirst(heap,&heapinfo); 
        do 
        {                 
                heapinf.dwSize=sizeof(HEAPENTRY32); 
                if(!Heap32First(&heapinf,heapinfo.th32ProcessID,heapinfo.th32HeapID)) 
                { 
                        MessageBox(NULL,"Heap32First()","error",MB_OK); 
                        return FALSE; 
                } 
                else 
                { 
                do{         
                        error=GetLastError(); 
                        if(heapinf.th32ProcessID==pid) 
                        { 
                        sprintf(str,"进程ID:%d 堆ID:%d 堆句柄:%x  程序名称:%s",heapinf.th32ProcessID,heapinf.th32HeapID,heapinf.hHandle,Name); 
                        PrintfString(hwnd,hdc,str,2,3); 
                        return TRUE; 
                        } 
                        heapinf.dwSize=sizeof(HEAPENTRY32); 
                } 
                while(Heap32Next(&heapinf)); 
                } 
                heapinfo.dwSize=sizeof(HEAPLIST32); 
        }while(Heap32ListNext(heap,&heapinfo)); 
        return FALSE; 
} 
         
 
//修改指定进程内存值 
BOOL Readprocessmemory(LPSTR lp,DWORD ints,DWORD zhi) 
{        char err[5]; 
        char strerr[64]; 
        int error; 
        HANDLE hprocess,hremoteprocess; 
        DWORD pid; 
        PROCESSENTRY32 pinfo={0}; 
        THREADENTRY32 tinfo={0}; 
        //////////////////// 
        DWORD GB=1024*1024*1024; 
        DWORD page; 
        DWORD base; 
        SYSTEM_INFO sinfo; 
        MEMORY_BASIC_INFORMATION mInfo; 
        SIZE_T T; 
 
        hprocess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
        pinfo.dwSize=sizeof(PROCESSENTRY32); 
        if(!Process32First(hprocess,&pinfo)) 
        { 
                itoa(GetLastError(),err,10); 
                MessageBox(NULL,err,"错误",MB_OK); 
                return FALSE; 
        } 
        do{ 
                if(lstrcmpi(lp,pinfo.szExeFile)==0) 
                { 
                        pid=pinfo.th32ProcessID; 
                } 
        }while(Process32Next(hprocess,&pinfo)); 
 
//        hthread=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid); 
/*        tinfo.dwSize=sizeof(THREADENTRY32); 
 
        if(!Thread32First(hthread,&tinfo)) 
        { 
                itoa(GetLastError(),err,10); 
                MessageBox(NULL,err,"错误",MB_OK); 
                return FALSE; 
        } 
        do{ 
                if(tinfo.th32OwnerProcessID==pid) 
                { 
                        tid=tinfo.th32ThreadID; 
                } 
 
        }while(Thread32Next(hthread,&tinfo)); 
         
*/ 
        if(EnablePrivilege("CE_DEBUG_NAME"))//提升权限 
        { 
                MessageBox(NULL,"权限提升失败","错误",MB_OK); 
        } 
 
 
        if(!(hremoteprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid))) 
        { 
                itoa(GetLastError(),err,10); 
                MessageBox(NULL,err,"错误",MB_OK); 
                return FALSE; 
        } 
/* 
        //tid=GetThreadId(hremoteprocess);此函数无法得到进程句柄 
        if(!(hremotethread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid))) 
        { 
                itoa(GetLastError(),err,10); 
                MessageBox(NULL,err,"错误",MB_OK); 
                return FALSE; 
        } 
        CloseHandle(hremotethread); 
*/         
        GetSystemInfo(&sinfo);//获得系统的信息 
        base=sinfo.dwAllocationGranularity;//得到分配粒度进程内存分配的开始 
        page=sinfo.dwPageSize;//分页大小 
         
        memset(&mInfo, 0, sizeof(MEMORY_BASIC_INFORMATION)); 
 
//        ReadProcessMemory(hremoteprocess, (LPCVOID)0x98138,buffs,1,&T); 
         
        for(;base<GB*2;base+=page)//32位系统程序和系统各用2GB 
        { 
                VirtualQueryEx(hremoteprocess, (LPCVOID)base, &mInfo, sizeof(MEMORY_BASIC_INFORMATION)); 
                if(mInfo.Protect==PAGE_READWRITE) 
                { 
                Compareapage(hremoteprocess,base,ints);//对每个分页内存进行比较 
                } 
 
        } 
 
                        if(error=writeprocessmemory(hremoteprocess,zhi)) 
                        {         
                                itoa(error,err,10); 
                                sprintf(strerr,"写入失败,错误代码:%s",err); 
                                MessageBox(NULL,strerr,"错误",MB_OK); 
                        //        TerminateProcess(hremoteprocess,0x0);//关闭远程进程 
                                return FALSE; 
                        } 
 
         
        return TRUE; 
} 
BOOL Compareapage(HANDLE hremoteprocess,DWORD base,DWORD ints) 
{         
        BYTE bByte[4096]; 
        int i; 
        DWORD *dw; 
        if(!ReadProcessMemory(hremoteprocess,(LPVOID)base,bByte,4096,NULL)) 
        {         
        //        MessageBox(NULL,"不可读","错误",MB_OK); 
                return FALSE; 
        } 
 
         
        for(i=0;i<4096-3;i++) 
        { 
                dw=(DWORD*)&bByte[i]; 
                if(*dw == ints) 
                { 
                        if(size>=1024) 
                        { 
                                return FALSE; 
                        } 
                        buffs[size++]=base+i;//将找到对应想要的值的分页地址偏移量放入数组 
                } 
 
        } 
        return TRUE; 
 
} 
//修改内存值 
DWORD writeprocessmemory(HANDLE hp,DWORD zhi) 
{ 
        SIZE_T h=0; 
        DWORD s; 
 
        for(s=0;s<=size;s++) 
        {         
                if(!WriteProcessMemory(hp,(LPVOID)buffs[s],(LPVOID)&zhi,sizeof(DWORD),&h)) 
                {         
                 
                        return GetLastError(); 
                } 
 
        } 
        return FALSE; 
} 
//文字打印函数 
void PrintfString(HWND hwnd,HDC hdc,LPSTR lp,int h,DWORD type) 
{         
        int x=0,y=0,size,m,p,height,width,row,ints; 
        RECT rect; 
        HFONT font; 
        TEXTMETRIC text; 
        SetTextColor(hdc,RGB(150,0,0)); 
        SetBkMode(hdc,1); 
        font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,  
                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,  
                ANTIALIASED_QUALITY, DEFAULT_PITCH, "新宋体");  
        SelectObject(hdc, font); 
        GetTextMetrics(hdc,&text); 
        GetClientRect(hwnd,&rect);//获得有效矩形 
        height=text.tmHeight;//获得字体高度 
        width=text.tmAveCharWidth;//字体宽度 
        size=lstrlen(lp);//字个数 
        ints=rect.right/width;//计算每行可以显示的字 
        row=size/ints;//显示的行数] 
        if(size%ints>1)//判断最后是否应为不够一行而不被显示的字 
                row++;//是,添加一行 
        switch(h) 
        { 
        case 1:TextOut(hdc,0,d,lp,lstrlen(lp));d+=20;break; 
        case 2: 
                switch(type) 
                { 
                case TYPE_VETRICAL: 
                        if(row==1)//判断是否只有一行 
                        {                //对自有一行的对X值进行设置 
 
                                y=rect.bottom/2-(height/2);//有效区域的宽度/2-字符高度/2 
                                TextOut(hdc,0,y,lp,lstrlen(lp)); 
                        } 
                        else 
                        { 
                                for(m=0,p=0;m<row&&(row-m)>1;m++,p--) 
                                {         
                                        //对一行整的进行y值调整 
                                        y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度 
 
                                        TextOut(hdc,0,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数 
 
                                } 
 
                        } 
                        if(row-m==1&&row>1) 
                        {         
                                //判断是否已经是最后一行 
                                //将最后一行进行垂直居中对齐输出 
                                y=(rect.bottom/2-(row*height/2))-(p*height); 
                                TextOut(hdc,0,y,&lp[m*ints],lstrlen(&lp[m*ints])+1); 
                        } 
                        break; 
                case TYPE_LEVEL: 
                        if(row==1)//判断是否只有一行 
                        {                 
 
                                x=rect.right/2-(lstrlen(lp)*(width/2));//有效区域的宽度/2-字符数*字符的一般宽度,得到居中x值 
                                TextOut(hdc,x,0,lp,lstrlen(lp)); 
                        } 
                        else 
                        { 
                                for(m=0,p=0;m<row&&(row-m)>1;m++,p--) 
                                {         
                                        //对一行整的进行y值调整 
                                        //        y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度 
 
                                        TextOut(hdc,x,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数 
                                        y+=height; 
 
                                } 
                                if(row-m==1&&row>1) 
                                {         
                                        //判断是否已经是最后一行 
                                        //将最后一行进行垂直居中对齐输出 
                                        x=rect.right/2-(lstrlen(&lp[m*ints])*(width/2)); 
                                        TextOut(hdc,x,y,&lp[m*ints],lstrlen(&lp[m*ints])+1); 
                                } 
                        } 
 
                        break; 
                case TYPE_LEVEL|TYPE_VETRICAL: 
 
 
                        if(row==1)//判断是否只有一行 
                        {        //对自有一行的对X值进行设置 
                                x=rect.right/2-(lstrlen(lp)*(width/2));//有效区域的宽度/2-字符数*字符的一般宽度,得到居中x值 
                                y=rect.bottom/2-(height/2);//有效区域的宽度/2-字符高度/2 
                                TextOut(hdc,x,y,lp,lstrlen(lp)); 
                        } 
                        p=row; 
                        for(m=0,p=0;m<row&&(row-m)>1;m++,p--) 
                        {         
                                //对一行整的进行y值调整 
                                y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度 
 
                                TextOut(hdc,x,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数 
 
 
                        } 
                        if(row-m==1&&row>1) 
                        {         
                                //判断是否已经是最后一行 
                                //将最后一行进行垂直,水平居中对齐输出 
                                x=rect.right/2-(lstrlen(&lp[m*ints])*(width/2)); 
                                y=(rect.bottom/2-(row*height/2))-(p*height); 
                                TextOut(hdc,x,y,&lp[m*ints],lstrlen(&lp[m*ints])+1); 
                        } 
                        DeleteObject(font); 
                        break; 
                } 
                break; 
        } 
} 
//进程权限提升函数 
BOOL EnablePrivilege(LPSTR lp)//提升进程权限 
{ 
        HANDLE hken; 
        TOKEN_PRIVILEGES ken;//令牌 
        LookupPrivilegeValue(NULL,lp,&ken.Privileges[0].Luid);//获得系统令牌信息 
        ken.PrivilegeCount=1;//特权的数组个数 
        ken.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//启用特权令牌 
        OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hken);//得到当前进程的令牌 
        AdjustTokenPrivileges(hken,FALSE,&ken,sizeof(ken),0,0);//设置令牌 
        //CloseHandle(hken); 
        return (GetLastError()==ERROR_SUCCESS) ;//返回错误信息 
} 
 |   
 
 
 
 |