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

 

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,如需转载请自行联系原作者
上一篇:时下最热的区块链,遇上最火爆的共享经济,将会擦出怎样的火花?


下一篇:C/C++中手动获取调用堆栈【转】