2 HANDLE hFile.
3 PSECURITY_ATTRIBUTES psa,
4 DWORD flProtect,
5 DWORD dwMaximumSizeHigh,
6 DWORD dwMaximuniSizeLow,
7 PCTSTR pszNarne);
2 sa.nLength = sizeof(sa); //Used for versioning
3 sa.lpSecuntyDescriptor = pSD, //Address of an initialized SD
4 sa.bInheritHandle = FALSE; //Discussed later
5 HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
6 &sa, PAGE_REAOWRITE, 0, 1024, "MyFileMapping");
表3-1 进程的句柄结构
索引 | 内核对象内存块的指针 | 访问屏蔽(标志位的D W O R D ) | 标志(标志位的D W O R D ) |
1 | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? |
2 | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? | 0 x ? ? ? ? ? ? ? ? |
... | ... | ... | ... |
创建内核对象
进程初次初始化时,句柄表是空的。进程中的线程调用创建内核对象的函数时,内核就为相应的内核对象分配一个内存块,并初始化。内核对进程的句柄表进行扫描,找到一个空项,用对象的数据结构的内存地址进行初始化。下面是一些创建内核对象的函数:
2 PSECURITY_ATTRIBUTES psa,
3 DWORD dwStackSize,
4 PTHREAD_START_ROUTINE pfnStartAddr,
5 PVOID pvParam,
6 DWORD dwCreationFlags,
7 PDWORD pdwfhreadId);
8
9 HANDEE CreateFile(
10 PCTSTR pszFileName,
11 DWORD dwDesiredAccebS,
12 DWORD dwShareMode,
13 PSECURITY_ATTRIBUTES psa,
14 DWORD dwCreationDistribution,
15 DWORD dwFlagsAndAttnbutes,
16 HANDEE hTemplateFile);
不论通过何种方式创建内核对象,都通过调用CloseHandle方法来结束对内核对象的操作。
BOOL CloseHandle(HANDLE hobj);
为什么结束进程能释放所有占用的资源?进程在运行时有可能出现内存泄漏。在进程终止运行时,系统会自动扫描进程的句柄表。若表中拥有任何无效项目(进程终止前没关闭的对象),系统将关闭这些对象的句柄。对象的计数器被置0,内核便会撤销这些对象。
跨进程边界共享内核对象
很多时候,不同进程的线程需要共享内核对象。如邮箱和指定的管道使应用程序能在联网的计算机上不同的进程之间发送数据块。
对象句柄的兼容性:只有当进程之间是父子关系时,才能使用对象句柄的继承性。在这种情况下,父进程可以使用一个或多个内核对象句柄,并且该父进程可以决定生成一个子进程,为子进程赋予对父进程的内核对象的访问权。
实现过程:1.父进程创建内核对象,并指明对象的句柄是可继承的句柄,注意内核对象本身不具备继承性。
2.使用对象句柄继承性时要执行的下一个步骤是让父进程生成子进程。这要使用CreateProcess函数来完成:
2 PCTSTR pszApplicationName,
3 PTSTR pszCommandLine,
4 PSECURITY_ATTRIBUTES psaProcess,
5 PSECURITY_ATTRIBUTES psaThread,
6 BOOL bInheritHandles, //TRUE表可继承,FALSE表不可继承
7 DWORD fdwCreale,
8 PVOIO pvEnvironment,
9 PCTSTR pszCurDir,
10 PSTARTUPINFO psiStartInfo,
11 PPROCESS_INFORMATION ppiProcInfo);
命名对象:共享跨越进程边界的内核对象的另一种方法。大部分内核对象可以被命名。若要按名字共享对象,则必须为对象赋予同一个名字。如下面的创建命名内核对象的代码:
2 PSLCURITY_ATTRIBUTES psa,
3 BOOL bInitialOwner,
4 PCTSTR pszName);
5
6HANDLE CreateEvent(
7 PSECURITY_ATTRIBUTES psa,
8 BOOL bManualReset,
9 BOOL bInitialState,
10 PCTSTR pszName);