Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/****************************** Module Header ******************************\
* Module Name: imminit.c * * Copyright (c) 1985 - 1999, Microsoft Corporation * * This module implements IMM32 initialization * * History: * 03-Jan-1996 wkwok Created \**************************************************************************/
#include "precomp.h"
#pragma hdrstop
// required for wow.obj in userrtl.lib
extern ULONG_PTR gHighestUserAddress;
BOOL ImmInitializeGlobals(HINSTANCE hmod) { SYSTEM_BASIC_INFORMATION SystemInformation;
if (hmod) { /*
* Remember IMM32.DLL's hmodule so we can grab resources from it later. */ ghInst = hmod; } if (gfInitialized) { return TRUE; } if (!NT_SUCCESS(RtlInitializeCriticalSection(&gcsImeDpi))) { RIPMSG0(RIP_WARNING, "ImmInitializeGlobals: failed to initialize critical section at startup. Just bail."); return FALSE; } if (!NT_SUCCESS(NtQuerySystemInformation(SystemBasicInformation, &SystemInformation, sizeof(SystemInformation), NULL))) { RIPMSG0(RIP_WARNING, "ImmInitializeGlobals: failed to query system information. Just bail."); return FALSE; } gHighestUserAddress = SystemInformation.MaximumUserModeAddress;
gfInitialized = TRUE;
return TRUE; }
BOOL ImmRegisterClient( IN PSHAREDINFO psiClient, HINSTANCE hmod) { gSharedInfo = *psiClient; gpsi = gSharedInfo.psi; /* Raid #97316
* Dlls loaded earlier than imm32.dll could make * user32 call which calls back imm routines. * ImmRegisterClient() is called from User32's init routine, * so we can expect to reach here early enough. * We need to initialize globals as much as possible * here. */ return ImmInitializeGlobals(hmod); }
BOOL ImmDllInitialize( IN PVOID hmod, IN DWORD Reason, IN PCONTEXT pctx OPTIONAL) { UNREFERENCED_PARAMETER(pctx);
switch ( Reason ) {
case DLL_PROCESS_ATTACH: UserAssert(!gfInitialized || hmod == ghInst);
if (!ImmInitializeGlobals(hmod)) return FALSE;
UserAssert(hmod != NULL);
// Initialize USER32.DLL in case if USER32 has not bound itself to IMM32
if (!User32InitializeImmEntryTable(IMM_MAGIC_CALLER_ID)) return FALSE; break;
case DLL_PROCESS_DETACH: if (gfInitialized) { RtlDeleteCriticalSection(&gcsImeDpi); } break;
case DLL_THREAD_DETACH: if (IS_IME_ENABLED() && NtCurrentTebShared()->Win32ThreadInfo) { DestroyInputContext( (HIMC)NtUserGetThreadState(UserThreadStateDefaultInputContext), GetKeyboardLayout(0), TRUE); } break;
default: break; }
return TRUE; }
PVOID UserRtlAllocMem( ULONG uBytes) { return LocalAlloc(LPTR, uBytes); }
VOID UserRtlFreeMem( PVOID pMem) { LocalFree(pMem); }
#if DBG
DWORD GetRipComponent( VOID) { return RIP_IMM; } #endif
|