reactos操作系统实现(157)
上面介绍了USER32的入口函数,在那里调用Init函数进行初始化,这里就来分析这个函数的代码,看看它怎么样进行初始化,如下: #001 BOOL #002 Init(VOID) #003 {
这里设置内核的回调函数。 #004 /* Set up the kernel callbacks. */ #005 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_WINDOWPROC] = #006 (PVOID)User32CallWindowProcFromKernel; #007 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_SENDASYNCPROC] = #008 (PVOID)User32CallSendAsyncProcForKernel; #009 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADSYSMENUTEMPLATE] = #010 (PVOID)User32LoadSysMenuTemplateForKernel; #011 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_LOADDEFAULTCURSORS] = #012 (PVOID)User32SetupDefaultCursors; #013 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_HOOKPROC] = #014 (PVOID)User32CallHookProcFromKernel; #015 NtCurrentPeb()->KernelCallbackTable[USER32_CALLBACK_EVENTPROC] = #016 (PVOID)User32CallEventProcFromKernel; #017
获取当前进程,并设置进程信息,然后返回当前进程的信息。 #018 g_pi = GetW32ProcessInfo();
共享用户进程信息给内核使用。 #019 g_kpi = SharedPtrToKernel(g_pi); #020 g_psi = SharedPtrToUser(g_pi->psi); #021 gHandleTable = SharedPtrToUser(g_pi->UserHandleTable); #022 gHandleEntries = SharedPtrToUser(gHandleTable->handles); #023
分配用户线程相关的数据空间。 #024 /* Allocate an index for user32 thread local data. */ #025 User32TlsIndex = TlsAlloc(); #026 if (User32TlsIndex != TLS_OUT_OF_INDEXES) #027 {
初始化消息使用临界区。 #028 if (MessageInit()) #029 {
初始化每个应用程序的系统菜单。 #030 if (MenuInit()) #031 { #032 InitializeCriticalSection(&U32AccelCacheLock);
初始化GDI32图形库。 #033 GdiDllInitialize(NULL,DLL_PROCESS_ATTACH,NULL); #034 InitStockObjects();
加载应用程序所有要加载的动态连接库。 #035 LoadAppInitDlls(); #036 #037 return TRUE; #038 }
清空消息的临界区。 #039 MessageCleanup(); #040 }
删除本线程使用的空间。 #041 TlsFree(User32TlsIndex); #042 } #043 #044 return FALSE; #045} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |