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

简介:

 

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月前
|
测试技术
LabVIEW ​​单​进程​共享​变量​与​​全局​变量
LabVIEW ​​单​进程​共享​变量​与​​全局​变量
89 1
|
3月前
|
Python
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
|
4月前
|
计算机视觉 Python
Python 多进程以及进程共享参数
这段时间在做一款游戏的挂机软件,我发现进入游戏后的逻辑和判断人物死亡的逻辑需要同时进行(因为不知道什么时候就暴毙了),以前我习惯用线程来进行同步,但是我发现由于我的代码中的逻辑比较复杂,且有多个嵌套的无限循环会导致线程阻塞,所以我决定用进程的方式来实现同步运行。
|
4月前
|
开发框架 安全 .NET
技术好文共享:进程和线程的区别
技术好文共享:进程和线程的区别
25 0
|
5月前
|
Linux 开发者
【亮剑】Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件
【4月更文挑战第30天】本文介绍了Linux系统中的四种文件锁定机制:flock、fcntl、lockfile和flockfile,用于多进程环境下协调共享资源访问,防止数据损坏和竞争条件。flock适合脚本,fcntl提供底层灵活性,lockfile用于管理锁定文件,flockfile则结合两者功能。选择锁定策略时需考虑应用场景,如脚本可选flock,复杂需求则用fcntl。理解并正确使用这些工具对保证系统稳定性和数据一致性至关重要。
263 1
|
5月前
|
安全 Python
Python多进程编程中的资源共享与同步问题探讨
Python多进程编程中的资源共享与同步问题探讨
|
11月前
|
存储 API Windows
4.1 Windows驱动开发:内核中进程与句柄互转
在内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。在Windows内核中,`EProcess`结构表示一个进程,而HANDLE是一个句柄。为了实现进程与句柄之间的转换,我们需要使用一些内核函数。对于进程PID和句柄的互相转换,可以使用函数如`OpenProcess`和`GetProcessId`。OpenProcess函数接受一个PID作为参数,并返回一个句柄。GetProcessId函数接受一个句柄作为参数,并返回该进程的PID。
85 1
4.1 Windows驱动开发:内核中进程与句柄互转
|
5月前
|
应用服务中间件 nginx
Nginx源码阅读:nginx_shmtx共享互斥锁(进程锁)
Nginx源码阅读:nginx_shmtx共享互斥锁(进程锁)
106 0
|
C# 开发者
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
主要类 1.NamedPipeClientStream 2.NamedPipeServerStream 解释:命名管道是一种进程间通信的方式,它允许不同进程之间在同一台机器上进行通信
811 2
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
|
11月前
|
Linux 定位技术 虚拟化
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
35 0