进程间共享内核对象句柄[继承方式]

简介:

 

Pnig0s p.s:将主进程的内核对象句柄通过CreateProcess的lpCmdLine参数传递给子进程,当然之前还要自定义一个SECURITY_ATTRIBUTES结构传递给创建内核对象的函数来将内核对象句柄设置为可继承的,然后在CreateProcess中将bInheritHandle置为TRUE使子进程可以将主进程的所有可继承的内核对象句柄复制到自己的内核对象句柄表中,从而实现不同进程间的内核对象的共享。小实践,网上代码资料比较少,贴出来方便大家吧

主进程:

 
     
  1. #include <Windows.h>  
  2. #include <stdio.h>  
  3.  
  4. #define MAX_BUFFER_SIZE 4096  
  5. int main(int argc,char * argv[]){  
  6.     HANDLE hFile;  
  7.     LPVOID lpFileBuffer;  
  8.     DWORD dwBytesInFile;  
  9.     int iResult;  
  10.     SECURITY_ATTRIBUTES sa;  
  11.     STARTUPINFO si;  
  12.     PROCESS_INFORMATION pi;  
  13.  
  14.     ZeroMemory(&si,sizeof(si));  
  15.     si.cb = sizeof(si);  
  16.     ZeroMemory(&pi,sizeof(pi));  
  17.  
  18.     sa.nLength = sizeof(SECURITY_ATTRIBUTES);  
  19.     sa.bInheritHandle = TRUE;  
  20.     sa.lpSecurityDescriptor = NULL;  
  21.  
  22.     hFile = CreateFile("robots.txt",GENERIC_READ,FILE_SHARE_READ,&sa,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
  23.     if(hFile == INVALID_HANDLE_VALUE){  
  24.         printf("Create file handle failed.(%d)\n",GetLastError());  
  25.         CloseHandle(hFile);  
  26.         return 1;  
  27.     }  
  28.     lpFileBuffer = HeapAlloc(GetProcessHeap(),0,MAX_BUFFER_SIZE);  
  29.     while(1){  
  30.         iResult = ReadFile(hFile,lpFileBuffer,MAX_BUFFER_SIZE,&dwBytesInFile,NULL);  
  31.         if(!iResult){  
  32.             printf("Read file failed.(%d)\n",GetLastError());  
  33.             CloseHandle(hFile);  
  34.             return 1;  
  35.         }  
  36.         if(dwBytesInFile > MAX_BUFFER_SIZE){  
  37.             HeapReAlloc(GetProcessHeap(),0,lpFileBuffer,dwBytesInFile);  
  38.             ZeroMemory(lpFileBuffer,dwBytesInFile);  
  39.         }else{  
  40.             break;  
  41.         }  
  42.     }  
  43.     printf("Parent process id:%d\n",GetCurrentProcessId());  
  44.     printf("[Parent]The value of the handle is %u\n",hFile);  
  45.     printf("[Parent]The index of the handle in table is:%u\n",((DWORD)hFile/4));  
  46.     printf("[Parent]The content of the robots.txt:\n%s\n\n\n",lpFileBuffer);  
  47.     //最好将要传递给子进程参数命令行的值存放在缓存中  
  48.     LPSTR lpCommandLine; //定义一个字符串指针以存放内核对象句柄  
  49.     lpCommandLine = (LPSTR)HeapAlloc(GetProcessHeap(),0,1024); //为字符串指针分配内存  
  50.     ltoa((DWORD)hFile,lpCommandLine,10); //将HANDLE句柄转换为字符串类型储存  
  51.     if(!CreateProcess("ChildProcess.exe",lpCommandLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)){  
  52.         printf("Create child process failed.(%d)\n",GetLastError());  
  53.         return 1;  
  54.     }  
  55.     printf("Child process created.\n\n\n");  
  56.     CloseHandle(hFile);  
  57.     WaitForSingleObject(pi.hProcess,INFINITE);  
  58.     CloseHandle(pi.hProcess);  
  59.     CloseHandle(pi.hThread);  
  60.     system("pause");  
  61.     return 0;  

子进程:

 
     
  1. #include <Windows.h>  
  2. #include <stdio.h>  
  3.  
  4. #define MAX_BUFFER_SIZE 1024  
  5.  
  6. int main(int argc,char * argv[]){  
  7.     int iResult;  
  8.     LPSTR lpFileBuffer;  
  9.     DWORD dwBytesHasRead;  
  10.     LPSTR commandLine = GetCommandLine();  
  11.     HANDLE hChildFile = (HANDLE)atol(commandLine);  
  12.     lpFileBuffer = (LPSTR)HeapAlloc(GetProcessHeap(),0,MAX_BUFFER_SIZE);  
  13.  
  14.     SetFilePointer(hChildFile,NULL,NULL,FILE_BEGIN);  
  15.     iResult = ReadFile(hChildFile,lpFileBuffer,MAX_BUFFER_SIZE,&dwBytesHasRead,NULL);  
  16.     if(!iResult){  
  17.         printf("Read file failed.(%d)\n",GetLastError());  
  18.         CloseHandle(hChildFile);  
  19.         return 1;  
  20.     }  
  21.     printf("Child process id:%d\n",GetCurrentProcessId());  
  22.     printf("[Child]The value of the handle is %u\n",(DWORD)hChildFile);  
  23.     printf("[Child]The index of the handle in table is:%u\n",((DWORD)hChildFile/4));  
  24.     printf("[Child]The content of the robots.txt:\n%s\n\n\n",lpFileBuffer);  
  25.     CloseHandle(hChildFile);  
  26.     return 0;  

运行结果:
















本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/685867 ,如需转载请自行联系原作者
相关文章
|
5月前
|
存储 API Windows
4.1 Windows驱动开发:内核中进程与句柄互转
在内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。在Windows内核中,`EProcess`结构表示一个进程,而HANDLE是一个句柄。为了实现进程与句柄之间的转换,我们需要使用一些内核函数。对于进程PID和句柄的互相转换,可以使用函数如`OpenProcess`和`GetProcessId`。OpenProcess函数接受一个PID作为参数,并返回一个句柄。GetProcessId函数接受一个句柄作为参数,并返回该进程的PID。
48 1
4.1 Windows驱动开发:内核中进程与句柄互转
|
10月前
|
存储 API Windows
驱动开发:内核中进程与句柄互转
在内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。在Windows内核中,`EProcess`结构表示一个进程,而HANDLE是一个句柄。为了实现进程与句柄之间的转换,我们需要使用一些内核函数。对于进程PID和句柄的互相转换,可以使用函数如`OpenProcess`和`GetProcessId`。OpenProcess函数接受一个PID作为参数,并返回一个句柄。GetProcessId函数接受一个句柄作为参数,并返回该进程的PID。
323 0
|
C# C++
获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄
原文:获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄 有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性。迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄。
3059 0
|
30天前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
67 0
|
1天前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
1天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
|
1天前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析
|
1天前
|
存储 Linux Shell
【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?
【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?
|
2天前
|
存储 安全 Linux
Linux的学习之路:9、冯诺依曼与进程(1)
Linux的学习之路:9、冯诺依曼与进程(1)
17 0
|
8天前
|
监控 Linux
linux监控指定进程
请注意,以上步骤提供了一种基本的方式来监控指定进程。根据你的需求,你可以选择使用不同的工具和参数来获取更详细的进程信息。
14 0

相关实验场景

更多