reactos操作系统实现(155)

从前面可以看到GDI32的初始化函数调用GdiDllInitialize函数来初始化,下面就来分析这个初始化的具体实现,代码如下:

#001 BOOL

#002 WINAPI

#003 GdiDllInitialize (

#004 HANDLE hDll,

#005 DWORD dwReason,

#006 LPVOID lpReserved)

#007 {

根据不同的调用原因进行初始化。

#008 switch (dwReason)

#009 {

当进程需要绑定到本DLL调用,就调用函数GdiProcessSetup来进行本进程的初始化动作。

#010 case DLL_PROCESS_ATTACH:

#011 GdiProcessSetup ();

#012 break;

#013

当线程需要绑定到本DLL调用

#014 case DLL_THREAD_ATTACH:

#015 NtCurrentTeb()->GdiTebBatch.Offset = 0;

#016 NtCurrentTeb()->GdiBatchCount = 0;

#017 break;

#018

#019 default:

#020 return FALSE;

#021 }

#022

判断是否需要清空对象。

#023 // Very simple,the list will fill itself as it is needed.

#024 if(!SetStockObjects)

#025 {

清空所有对象。

#026 RtlZeroMemory( &stock_objects,NB_STOCK_OBJECTS); //Assume Ros is dirty.

设置已经清空对象。

#027 SetStockObjects = TRUE;

#028 }

#029

#030 return TRUE;

#031 }

下面接着来分析函数GdiProcessSetup,这个函数主要把当前线程环境块的句柄表映射到用户空间。

#001 VOID

#002 WINAPI

#003 GdiProcessSetup (VOID)

#004 {

获取当前进程的堆空间。

#005 hProcessHeap = GetProcessHeap();

#006

映射GDI的句柄表到用户空间。

#007 /* map the gdi handle table to user space */

#008 GdiHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdisharedHandleTable;

#009 GdisharedHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdisharedHandleTable;

当前GDI设备的兼容性。

#010 GdiDevCaps = &GdisharedHandleTable->DevCaps;

当前进程的标识号。

#011 CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess;

#012 GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList;

#013 GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer;

#014}

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...