ReactOS 0.4.15-dev-7834-g00c4b3d
dllmain.c File Reference
#include <user32.h>
#include <ndk/cmfuncs.h>
#include <strsafe.h>
#include "u32cb.h"
Include dependency graph for dllmain.c:

Go to the source code of this file.

Classes

struct  _UMPDPKTHEAD
 

Macros

#define MAX_USER_MODE_DRV_BUFFER   526
 
#define KEY_LENGTH   1024
 
#define DEFINE_USER32_CALLBACK(id, value, fn)   fn,
 
#define WIN_OBJ_DIR   L"\\Windows"
 
#define SESSION_DIR   L"\\Sessions"
 

Typedefs

typedef struct _UMPDPKTHEAD UMPDPKTHEAD
 
typedef struct _UMPDPKTHEADPUMPDPKTHEAD
 

Functions

INT WINAPI GdiPrinterThunk (PUMPDPKTHEAD, PVOID, INT)
 
 WINE_DEFAULT_DEBUG_CHANNEL (user32)
 
BOOL GetDllList (VOID)
 
VOID LoadAppInitDlls (VOID)
 
VOID UnloadAppInitDlls (VOID)
 
VOID WINAPI GdiProcessSetup (VOID)
 
BOOL WINAPI ClientThreadSetupHelper (BOOL IsCallback)
 
BOOL WINAPI ClientThreadSetup (VOID)
 
BOOL Init (PUSERCONNECT UserCon)
 
VOID Cleanup (VOID)
 
BOOL WINAPI DllMain (_In_ HANDLE hDll, _In_ ULONG dwReason, _In_opt_ PVOID pReserved)
 
NTSTATUS WINAPI User32CallClientThreadSetupFromKernel (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallGetCharsetInfo (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallSetWndIconsFromKernel (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32DeliverUserAPC (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallOBMFromKernel (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallLPKFromKernel (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallUMPDFromKernel (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallImmProcessKeyFromKernel (PVOID Arguments, ULONG ArgumentLength)
 
NTSTATUS WINAPI User32CallImmLoadLayoutFromKernel (PVOID Arguments, ULONG ArgumentLength)
 

Variables

static ULONG User32TlsIndex
 
HINSTANCE User32Instance
 
PPROCESSINFO g_ppi = NULL
 
SHAREDINFO gSharedInfo = {0}
 
PSERVERINFO gpsi = NULL
 
PUSER_HANDLE_TABLE gHandleTable = NULL
 
PUSER_HANDLE_ENTRY gHandleEntries = NULL
 
BOOLEAN gfLogonProcess = FALSE
 
BOOLEAN gfServerProcess = FALSE
 
BOOLEAN gfFirstThread = TRUE
 
HICON hIconSmWindows = NULL
 
HICON hIconWindows = NULL
 
WCHAR szAppInit [KEY_LENGTH]
 
PVOID apfnDispatch [USER32_CALLBACK_COUNT]
 

Macro Definition Documentation

◆ DEFINE_USER32_CALLBACK

#define DEFINE_USER32_CALLBACK (   id,
  value,
  fn 
)    fn,

Definition at line 206 of file dllmain.c.

◆ KEY_LENGTH

#define KEY_LENGTH   1024

Definition at line 24 of file dllmain.c.

◆ MAX_USER_MODE_DRV_BUFFER

#define MAX_USER_MODE_DRV_BUFFER   526

Definition at line 5 of file dllmain.c.

◆ SESSION_DIR

#define SESSION_DIR   L"\\Sessions"

◆ WIN_OBJ_DIR

#define WIN_OBJ_DIR   L"\\Windows"

Typedef Documentation

◆ PUMPDPKTHEAD

◆ UMPDPKTHEAD

Function Documentation

◆ Cleanup()

VOID Cleanup ( VOID  )

Definition at line 443 of file dllmain.c.

444{
447 MenuCleanup();
451}
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1166
VOID FASTCALL MessageCleanup(VOID)
Definition: message.c:3292
CRITICAL_SECTION U32AccelCacheLock
Definition: accel.c:54
VOID DeleteFrameBrushes(VOID)
Definition: paint.c:71
static ULONG User32TlsIndex
Definition: dllmain.c:26
VOID UnloadAppInitDlls(VOID)
Definition: dllmain.c:174
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

◆ ClientThreadSetup()

BOOL WINAPI ClientThreadSetup ( VOID  )

Definition at line 330 of file dllmain.c.

331{
332 //
333 // This routine, in Windows, does a lot of what Init does, but in a radically
334 // different way.
335 //
336 // In Windows, because CSRSS's threads have TIF_CSRSSTHREAD set (we have this
337 // flag in ROS but not sure if we use it), the xxxClientThreadSetup callback
338 // isn't made when CSRSS first loads WINSRV.DLL (which loads USER32.DLL).
339 //
340 // However, all the other calls are made as normal, and WINSRV.DLL loads
341 // USER32.dll, the DllMain runs, and eventually the first NtUser system call is
342 // made which initializes Win32k (and initializes the thread, but as mentioned
343 // above, the thread is marked as TIF_CSRSSTHREAD).
344 //
345 // In the DllMain of User32, there is also a CsrClientConnectToServer call to
346 // server 2 (winsrv). When this is done from CSRSS, the "InServer" flag is set,
347 // so user32 will remember that it's running inside of CSRSS. Also, another
348 // flag, called "FirstThread" is manually set by DllMain.
349 //
350 // Then, WINSRV finishes loading, and CSRSRV starts the API thread/loop. This
351 // code then calls CsrConnectToUser, which calls... ClientThreadStartup. Now
352 // this routine detects that it's in the server process, which means it's CSRSS
353 // and that the callback never happened. It does some first-time-Win32k connection
354 // initialization and caches a bunch of things -- if it's the first thread. It also
355 // acquires a critical section to initialize GDI -- and then resets the first thread
356 // flag.
357 //
358 // For now, we'll do none of this, but to support Windows' CSRSRV.DLL which calls
359 // CsrConnectToUser, we'll pretend we "did something" here. Then the rest will
360 // continue as normal.
361 //
362
363 // FIXME: Disabling this call is a HACK!! See also User32CallClientThreadSetupFromKernel...
364 // return ClientThreadSetupHelper(FALSE);
365 TRACE("ClientThreadSetup is not implemented\n");
366 return TRUE;
367}
#define TRUE
Definition: types.h:120
#define TRACE(s)
Definition: solgame.cpp:4

◆ ClientThreadSetupHelper()

BOOL WINAPI ClientThreadSetupHelper ( BOOL  IsCallback)

Definition at line 221 of file dllmain.c.

222{
223 /*
224 * Normally we are called by win32k so the win32 thread pointers
225 * should be valid as they are set in win32k::InitThreadCallback.
226 */
229
230 TRACE("In ClientThreadSetup(IsCallback == %s, gfServerProcess = %s, IsFirstThread = %s)\n",
231 IsCallback ? "TRUE" : "FALSE", gfServerProcess ? "TRUE" : "FALSE", IsFirstThread ? "TRUE" : "FALSE");
232
233 if (IsFirstThread)
235
236 /* Check for already initialized thread, and bail out if so */
237 if (ClientInfo->CI_flags & CI_INITTHREAD)
238 {
239 ERR("ClientThreadSetup: Thread already initialized.\n");
240 return FALSE;
241 }
242
243 /*
244 * CSRSS couldn't use user32::DllMain CSR server-to-server call to connect
245 * to win32k. So it is delayed to a manually-call to ClientThreadSetup.
246 * Also this needs to be done only for the first thread (since the connection
247 * is per-process).
248 */
249 if (gfServerProcess && IsFirstThread)
250 {
252 USERCONNECT UserCon;
253
254 RtlZeroMemory(&UserCon, sizeof(UserCon));
255
256 /* Minimal setup of the connect info structure */
257 UserCon.ulVersion = USER_VERSION;
258 // UserCon.dwDispatchCount;
259
260 /* Connect to win32k */
262 &UserCon,
263 sizeof(UserCon));
264 if (!NT_SUCCESS(Status)) return FALSE;
265
266 /* Retrieve data */
267 g_ppi = ClientInfo->ppi; // Snapshot PI, used as pointer only!
268 gSharedInfo = UserCon.siClient;
271 /* ReactOS-Specific! */ gHandleEntries = SharedPtrToUser(gHandleTable->handles);
272
273 // ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n",
274 // gSharedInfo.psi, gSharedInfo.aheList, gSharedInfo.ulSharedDelta);
275 }
276
277 TRACE("Checkpoint (register PFN)\n");
278 if (!RegisterClientPFN())
279 {
280 ERR("RegisterClientPFN failed\n");
281 return FALSE;
282 }
283
284 /* Mark this thread as initialized */
285 ClientInfo->CI_flags |= CI_INITTHREAD;
286
287 /* Initialization that should be done once per process */
288 if (IsFirstThread)
289 {
290 TRACE("Checkpoint (Allocating TLS)\n");
291
292 /* Allocate an index for user32 thread local data */
295 return FALSE;
296
297 // HAAAAAAAAAACK!!!!!!
298 // ASSERT(gpsi);
299 if (!gpsi) ERR("AAAAAAAAAAAHHHHHHHHHHHHHH!!!!!!!! gpsi == NULL !!!!\n");
300 if (gpsi)
301 {
302 TRACE("Checkpoint (MessageInit)\n");
303
304 if (MessageInit())
305 {
306 TRACE("Checkpoint (MenuInit)\n");
307 if (MenuInit())
308 {
309 TRACE("Checkpoint initialization done OK\n");
312 return TRUE;
313 }
315 }
316
318 return FALSE;
319 }
320 }
321
322 return TRUE;
323}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define ERR(fmt,...)
Definition: debug.h:110
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
DWORD WINAPI TlsAlloc(VOID)
Definition: thread.c:1100
Status
Definition: gdiplustypes.h:25
#define CI_INITTHREAD
Definition: ntuser.h:303
#define USER_VERSION
Definition: ntuser.h:1149
#define GetWin32ClientInfo()
Definition: ntuser.h:352
NTSTATUS NTAPI NtUserProcessConnect(IN HANDLE ProcessHandle, OUT PUSERCONNECT pUserConnect, IN ULONG Size)
Definition: ntstubs.c:476
CLIENT_DATA ClientInfo
char _InterlockedExchange8(_Interlocked_operand_ char volatile *_Target, char _Value)
#define NtCurrentProcess()
Definition: nt_native.h:1657
BOOL WINAPI RegisterClientPFN(VOID)
Definition: regcontrol.c:143
PVOID aheList
Definition: ntuser.h:1131
PSERVERINFO psi
Definition: ntuser.h:1130
ULONG ulVersion
Definition: ntuser.h:1142
SHAREDINFO siClient
Definition: ntuser.h:1145
PUSER_HANDLE_ENTRY handles
Definition: ntuser.h:32
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
char * PCHAR
Definition: typedefs.h:51
BOOL FASTCALL MessageInit(VOID)
Definition: message.c:3284
static __inline PVOID SharedPtrToUser(PVOID Ptr)
Definition: user_x.h:4
VOID WINAPI GdiProcessSetup(VOID)
Definition: dllmain.c:45
BOOL MenuInit(VOID)
Definition: menu.c:359
BOOLEAN gfServerProcess
Definition: dllmain.c:35
PPROCESSINFO g_ppi
Definition: dllmain.c:29
PUSER_HANDLE_ENTRY gHandleEntries
Definition: dllmain.c:33
PUSER_HANDLE_TABLE gHandleTable
Definition: dllmain.c:32
VOID LoadAppInitDlls(VOID)
Definition: dllmain.c:141
SHAREDINFO gSharedInfo
Definition: dllmain.c:30
BOOLEAN gfFirstThread
Definition: dllmain.c:36
PSERVERINFO gpsi
Definition: dllmain.c:31
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:549

Referenced by Init().

◆ DllMain()

BOOL WINAPI DllMain ( _In_ HANDLE  hDll,
_In_ ULONG  dwReason,
_In_opt_ PVOID  pReserved 
)

Definition at line 456 of file dllmain.c.

460{
461 switch (dwReason)
462 {
464 {
465
466#define WIN_OBJ_DIR L"\\Windows"
467#define SESSION_DIR L"\\Sessions"
468
469 USERSRV_API_CONNECTINFO ConnectInfo; // USERCONNECT
470
471#if 0 // Disabling this code is a BIG HACK!!
472
474 ULONG ConnectInfoSize = sizeof(ConnectInfo);
475 WCHAR SessionDir[256];
476
477 /* Cache the PEB and Session ID */
479 ULONG SessionId = Peb->SessionId; // gSessionId
480
481 TRACE("user32::DllMain\n");
482
483 /* Don't bother us for each thread */
485
486 RtlZeroMemory(&ConnectInfo, sizeof(ConnectInfo));
487
488 /* Minimal setup of the connect info structure */
489 ConnectInfo.ulVersion = USER_VERSION;
490
491 /* Setup the Object Directory path */
492 if (!SessionId)
493 {
494 /* Use the raw path */
495 wcscpy(SessionDir, WIN_OBJ_DIR);
496 }
497 else
498 {
499 /* Use the session path */
500 swprintf(SessionDir,
501 L"%ws\\%ld%ws",
503 SessionId,
505 }
506
507 TRACE("Checkpoint (call CSR)\n");
508
509 /* Connect to the USER Server */
510 Status = CsrClientConnectToServer(SessionDir,
512 &ConnectInfo,
513 &ConnectInfoSize,
515 if (!NT_SUCCESS(Status))
516 {
517 ERR("Failed to connect to CSR (Status %lx)\n", Status);
518 return FALSE;
519 }
520
521 TRACE("Checkpoint (CSR called)\n");
522
523#endif
524
525 User32Instance = hDll;
526
527 /* Finish initialization */
528 TRACE("Checkpoint (call Init)\n");
529 if (!Init(&ConnectInfo))
530 return FALSE;
531
532 if (!gfServerProcess)
533 {
534 HINSTANCE hImm32 = NULL;
535
537 {
538 WCHAR szImmFile[MAX_PATH];
540 User32GetImmFileName(szImmFile, _countof(szImmFile));
541 hImm32 = GetModuleHandleW(szImmFile);
542 }
543
544 if (!IMM_FN(ImmRegisterClient)(&gSharedInfo, hImm32))
545 return FALSE;
546 }
547 break;
548 }
549
551 {
552 if (ghImm32)
554
555 Cleanup();
556 break;
557 }
558 }
559
560 /* Finally, initialize GDI */
561 return GdiDllInitialize(hDll, dwReason, pReserved);
562}
#define NtCurrentPeb()
Definition: FLS.c:22
DWORD dwReason
Definition: misc.cpp:154
#define NULL
Definition: types.h:112
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI ImmRegisterClient(PSHAREDINFO ptr, HINSTANCE hMod)
Definition: imm.c:57
ULONG SessionId
Definition: dllmain.c:28
PPEB Peb
Definition: dllmain.c:27
#define SESSION_DIR
Definition: dllmain.c:38
#define WIN_OBJ_DIR
Definition: dllmain.c:37
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
#define swprintf
Definition: precomp.h:40
static const WCHAR Cleanup[]
Definition: register.c:80
#define SRVINFO_IMM32
Definition: ntuser.h:949
#define L(x)
Definition: ntvdm.h:50
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
NTSTATUS NTAPI CsrClientConnectToServer(_In_ PCWSTR ObjectDirectory, _In_ ULONG ServerId, _In_ PVOID ConnectionInfo, _Inout_ PULONG ConnectionInfoSize, _Out_ PBOOLEAN ServerToServerCall)
Definition: connect.c:196
#define _countof(array)
Definition: sndvol32.h:68
ULONG SessionId
Definition: btrfs_drv.h:1919
DWORD dwSRVIFlags
Definition: ntuser.h:1051
uint32_t ULONG
Definition: typedefs.h:59
HRESULT User32GetImmFileName(_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer)
Definition: imm.c:57
BOOL WINAPI InitializeImmEntryTable(VOID)
Definition: imm.c:119
#define IMM_FN(name)
Definition: user32p.h:56
HINSTANCE ghImm32
Definition: imm.c:20
BOOL WINAPI GdiDllInitialize(_In_ HANDLE hDll, _In_ ULONG dwReason, _In_opt_ PVOID pReserved)
Definition: dllmain.c:79
HINSTANCE User32Instance
Definition: dllmain.c:27
#define USERSRV_SERVERDLL_INDEX
Definition: winmsg.h:15
#define USERSRV_API_CONNECTINFO
Definition: winmsg.h:40
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ GdiPrinterThunk()

INT WINAPI GdiPrinterThunk ( PUMPDPKTHEAD  ,
PVOID  ,
INT   
)

◆ GdiProcessSetup()

VOID WINAPI GdiProcessSetup ( VOID  )

Definition at line 45 of file dllmain.c.

46{
47 if (!gbInitialized)
48 {
51
52 /* map the gdi handle table to user space */
53 GdiHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable;
54 GdiSharedHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable;
56 CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess;
57 GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList;
58 GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer;
62 }
63}
#define GetProcessHeap()
Definition: compat.h:736
HANDLE CurrentProcessId
Definition: misc.c:35
VOID WINAPI GdiInitializeLanguagePack(_In_ DWORD InitParam)
PGDI_SHARED_HANDLE_TABLE GdiSharedHandleTable
Definition: misc.c:34
DWORD GDI_BatchLimit
Definition: misc.c:36
#define NtCurrentTeb
HANDLE hProcessHeap
Definition: kbswitch.c:37
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define DWORD
Definition: nt_native.h:44
struct _GDIHANDLECACHE * PGDIHANDLECACHE
#define GdiHandleTable
Definition: win32nt.h:37
RTL_CRITICAL_SECTION semLocal
Definition: dllmain.c:13
CRITICAL_SECTION gcsClientObjLinks
Definition: clientobj.c:10
PDEVCAPS GdiDevCaps
Definition: dllmain.c:10
static BOOL gbInitialized
Definition: dllmain.c:7
PGDIHANDLECACHE GdiHandleCache
Definition: dllmain.c:11

Referenced by ClientThreadSetupHelper(), and GdiDllInitialize().

◆ GetDllList()

BOOL GetDllList ( VOID  )

Definition at line 42 of file dllmain.c.

43{
46 BOOL bRet = FALSE;
47 BOOL bLoad;
51
52 UNICODE_STRING szKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows");
53 UNICODE_STRING szLoadName = RTL_CONSTANT_STRING(L"LoadAppInit_DLLs");
54 UNICODE_STRING szDllsName = RTL_CONSTANT_STRING(L"AppInit_DLLs");
55
58 if (NT_SUCCESS(Status))
59 {
60 dwSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD);
61 kvpInfo = HeapAlloc(GetProcessHeap(), 0, dwSize);
62 if (!kvpInfo)
63 goto end;
64
66 &szLoadName,
68 kvpInfo,
69 dwSize,
70 &dwSize);
71 if (!NT_SUCCESS(Status))
72 goto end;
73
74 RtlMoveMemory(&bLoad,
75 kvpInfo->Data,
76 kvpInfo->DataLength);
77
78 HeapFree(GetProcessHeap(), 0, kvpInfo);
79 kvpInfo = NULL;
80
81 if (bLoad)
82 {
84 &szDllsName,
86 NULL,
87 0,
88 &dwSize);
90 goto end;
91
92 kvpInfo = HeapAlloc(GetProcessHeap(), 0, dwSize);
93 if (!kvpInfo)
94 goto end;
95
97 &szDllsName,
99 kvpInfo,
100 dwSize,
101 &dwSize);
102 if (NT_SUCCESS(Status))
103 {
104 LPWSTR lpBuffer = (LPWSTR)kvpInfo->Data;
106 {
107 INT bytesToCopy, nullPos;
108
109 bytesToCopy = min(kvpInfo->DataLength, KEY_LENGTH * sizeof(WCHAR));
110
111 if (bytesToCopy != 0)
112 {
114 kvpInfo->Data,
115 bytesToCopy);
116
117 nullPos = (bytesToCopy / sizeof(WCHAR)) - 1;
118
119 /* ensure string is terminated */
120 szAppInit[nullPos] = UNICODE_NULL;
121
122 bRet = TRUE;
123 }
124 }
125 }
126 }
127 }
128
129end:
130 if (hKey)
131 NtClose(hKey);
132
133 if (kvpInfo)
134 HeapFree(GetProcessHeap(), 0, kvpInfo);
135
136 return bRet;
137}
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLuint GLuint end
Definition: gl.h:1545
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
if(dx< 0)
Definition: linetemp.h:194
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define min(a, b)
Definition: monoChain.cc:55
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: ntapi.c:336
@ KeyValuePartialInformation
Definition: nt_native.h:1182
#define KEY_READ
Definition: nt_native.h:1023
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3402
#define UNICODE_NULL
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
int32_t INT
Definition: typedefs.h:58
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
WCHAR szAppInit[KEY_LENGTH]
Definition: dllmain.c:39
#define KEY_LENGTH
Definition: dllmain.c:24
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by LoadAppInitDlls().

◆ Init()

BOOL Init ( PUSERCONNECT  UserCon)

Definition at line 370 of file dllmain.c.

371{
373
374 TRACE("user32::Init(0x%p) -->\n", UserCon);
375
377
378 /* Initialize callback table in PEB data */
379 NtCurrentPeb()->KernelCallbackTable = apfnDispatch;
380 NtCurrentPeb()->PostProcessInitRoutine = NULL;
381
382 // This is a HACK!! //
386
387 /*
388 * Retrieve data from the connect info structure if the initializing
389 * process is not CSRSS. In case it is, this will be done from inside
390 * ClientThreadSetup.
391 */
392 if (!gfServerProcess)
393 {
394 // FIXME: HACK!! We should fixup for the NtUserProcessConnect fixups
395 // because it was made in the context of CSRSS process and not ours!!
396 // So... as long as we don't fix that, we need to redo again a call
397 // to NtUserProcessConnect... How perverse is that?!
398 //
399 // HACK(2): This call is necessary since we disabled
400 // the CSR call in DllMain...
401 {
402 RtlZeroMemory(UserCon, sizeof(*UserCon));
403
404 /* Minimal setup of the connect info structure */
405 UserCon->ulVersion = USER_VERSION;
406 // UserCon->dwDispatchCount;
407
408 TRACE("HACK: Hackish NtUserProcessConnect call!!\n");
409 /* Connect to win32k */
411 UserCon,
412 sizeof(*UserCon));
413 if (!NT_SUCCESS(Status)) return FALSE;
414 }
415
416 //
417 // We continue as we should do normally...
418 //
419
420 /* Retrieve data */
421 g_ppi = GetWin32ClientInfo()->ppi; // Snapshot PI, used as pointer only!
422 gSharedInfo = UserCon->siClient;
425 /* ReactOS-Specific! */ gHandleEntries = SharedPtrToUser(gHandleTable->handles);
426 }
427
428 // FIXME: Yet another hack... This call should normally not be done here, but
429 // instead in ClientThreadSetup, and in User32CallClientThreadSetupFromKernel as well.
430 TRACE("HACK: Using Init-ClientThreadSetupHelper hack!!\n");
432 {
433 TRACE("Init-ClientThreadSetupHelper hack failed!\n");
434 return FALSE;
435 }
436
437 TRACE("<-- user32::Init()\n");
438
439 return NT_SUCCESS(Status);
440}
#define STATUS_SUCCESS
Definition: shellext.h:65
RTL_CRITICAL_SECTION gcsUserApiHook
Definition: usrapihk.c:39
PVOID apfnDispatch[USER32_CALLBACK_COUNT]
Definition: dllmain.c:208
BOOL WINAPI ClientThreadSetupHelper(BOOL IsCallback)
Definition: dllmain.c:221

◆ LoadAppInitDlls()

VOID LoadAppInitDlls ( VOID  )

Definition at line 141 of file dllmain.c.

142{
144
145 if (GetDllList())
146 {
148 LPWSTR ptr;
149 size_t i;
150
152
153 for (i = 0; i < KEY_LENGTH; ++ i)
154 {
155 if(buffer[i] == L' ' || buffer[i] == L',')
156 buffer[i] = 0;
157 }
158
159 for (i = 0; i < KEY_LENGTH; )
160 {
161 if(buffer[i] == 0)
162 ++ i;
163 else
164 {
165 ptr = buffer + i;
166 i += wcslen(ptr);
168 }
169 }
170 }
171}
#define LoadLibraryW(x)
Definition: compat.h:747
GLuint buffer
Definition: glext.h:5915
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static PVOID ptr
Definition: dispmode.c:27
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
BOOL GetDllList(VOID)
Definition: dllmain.c:42

Referenced by ClientThreadSetupHelper().

◆ UnloadAppInitDlls()

VOID UnloadAppInitDlls ( VOID  )

Definition at line 174 of file dllmain.c.

175{
176 if (szAppInit[0] != UNICODE_NULL)
177 {
180 LPWSTR ptr;
181 size_t i;
182
184
185 for (i = 0; i < KEY_LENGTH; ++ i)
186 {
187 if(buffer[i] == L' ' || buffer[i] == L',')
188 buffer[i] = 0;
189 }
190
191 for (i = 0; i < KEY_LENGTH; )
192 {
193 if(buffer[i] == 0)
194 ++ i;
195 else
196 {
197 ptr = buffer + i;
198 i += wcslen(ptr);
201 }
202 }
203 }
204}
HMODULE hModule
Definition: animate.c:44

Referenced by Cleanup().

◆ User32CallClientThreadSetupFromKernel()

NTSTATUS WINAPI User32CallClientThreadSetupFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 566 of file dllmain.c.

567{
568 TRACE("User32CallClientThreadSetupFromKernel -->\n");
569 // FIXME: Disabling this call is a HACK!! See also ClientThreadSetup...
570 // ClientThreadSetupHelper(TRUE);
571 TRACE("<-- User32CallClientThreadSetupFromKernel\n");
573}
NTSYSAPI NTSTATUS NTAPI ZwCallbackReturn(_In_ PVOID Result, _In_ ULONG ResultLength, _In_ NTSTATUS Status)

◆ User32CallGetCharsetInfo()

NTSTATUS WINAPI User32CallGetCharsetInfo ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 577 of file dllmain.c.

578{
579 BOOL Ret;
580 PGET_CHARSET_INFO pgci = (PGET_CHARSET_INFO)Arguments;
581
582 TRACE("GetCharsetInfo\n");
583
584 Ret = TranslateCharsetInfo((DWORD *)(ULONG_PTR)pgci->Locale, &pgci->Cs, TCI_SRCLOCALE);
585
586 return ZwCallbackReturn(Arguments, ArgumentLength, Ret ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
587}
CHARSETINFO Cs
Definition: callback.h:128
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
struct _GET_CHARSET_INFO * PGET_CHARSET_INFO
#define TCI_SRCLOCALE
Definition: wingdi.h:964
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)

◆ User32CallImmLoadLayoutFromKernel()

NTSTATUS WINAPI User32CallImmLoadLayoutFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 717 of file dllmain.c.

718{
719 PIMMLOADLAYOUT_CALLBACK_ARGUMENTS Common = Arguments;
721 Result.ret = IMM_FN(ImmLoadLayout)(Common->hKL, &Result.iiex);
722 return ZwCallbackReturn(&Result, sizeof(Result), STATUS_SUCCESS);
723}
BOOL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
Definition: imm.c:67
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

◆ User32CallImmProcessKeyFromKernel()

NTSTATUS WINAPI User32CallImmProcessKeyFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 704 of file dllmain.c.

705{
706 PIMMPROCESSKEY_CALLBACK_ARGUMENTS Common = Arguments;
708 Common->hKL,
709 Common->vKey,
710 Common->lParam,
711 Common->dwHotKeyID);
712
713 return ZwCallbackReturn(&Result, sizeof(DWORD), STATUS_SUCCESS);
714}
DWORD WINAPI ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
Definition: keymsg.c:715

◆ User32CallLPKFromKernel()

NTSTATUS WINAPI User32CallLPKFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 652 of file dllmain.c.

653{
654 BOOL bResult;
656
657 Argument = (PLPK_CALLBACK_ARGUMENTS)Arguments;
658
659 Argument->lpString = (LPWSTR)((ULONG_PTR)Argument->lpString + (ULONG_PTR)Argument);
660
661 bResult = ExtTextOutW(Argument->hdc,
662 Argument->x,
663 Argument->y,
664 Argument->flags,
665 (Argument->bRect) ? &Argument->rect : NULL,
666 Argument->lpString,
667 Argument->count,
668 NULL);
669
670 return ZwCallbackReturn(&bResult, sizeof(BOOL), STATUS_SUCCESS);
671}
#define ULONG_PTR
Definition: config.h:101
struct _LPK_CALLBACK_ARGUMENTS * PLPK_CALLBACK_ARGUMENTS
BOOL WINAPI ExtTextOutW(_In_ HDC hdc, _In_ int x, _In_ int y, _In_ UINT options, _In_opt_ const RECT *lprect, _In_reads_opt_(c) LPCWSTR lpString, _In_ UINT c, _In_reads_opt_(c) const INT *lpDx)

◆ User32CallOBMFromKernel()

NTSTATUS WINAPI User32CallOBMFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 620 of file dllmain.c.

621{
622 BITMAP bmp;
623 PSETOBM_CALLBACK_ARGUMENTS Common = Arguments;
624
625 GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_CLOSE)), sizeof(bmp), &bmp);
626 Common->oembmi[OBI_CLOSE].cx = bmp.bmWidth;
627 Common->oembmi[OBI_CLOSE].cy = bmp.bmHeight;
628
629 GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_MNARROW)), sizeof(bmp), &bmp);
630 Common->oembmi[OBI_MNARROW].cx = bmp.bmWidth;
631 Common->oembmi[OBI_MNARROW].cy = bmp.bmHeight;
632
633 GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_DNARROW)), sizeof(bmp), &bmp);
634 Common->oembmi[OBI_DNARROW].cx = bmp.bmWidth;
635 Common->oembmi[OBI_DNARROW].cy = bmp.bmHeight;
636
637 GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_DNARROWI)), sizeof(bmp), &bmp);
638 Common->oembmi[OBI_DNARROWI].cx = bmp.bmWidth;
639 Common->oembmi[OBI_DNARROWI].cy = bmp.bmHeight;
640
641 GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_UPARROW)), sizeof(bmp), &bmp);
642 Common->oembmi[OBI_UPARROW].cx = bmp.bmWidth;
643 Common->oembmi[OBI_UPARROW].cy = bmp.bmHeight;
644
645 GetObjectW(LoadBitmapW(0, MAKEINTRESOURCEW(OBM_UPARROWI)), sizeof(bmp), &bmp);
646 Common->oembmi[OBI_UPARROWI].cx = bmp.bmWidth;
647 Common->oembmi[OBI_UPARROWI].cy = bmp.bmHeight;
648
649 return ZwCallbackReturn(Arguments, ArgumentLength, STATUS_SUCCESS);
650}
@ OBI_UPARROWI
Definition: ntuser.h:968
@ OBI_UPARROW
Definition: ntuser.h:967
@ OBI_DNARROW
Definition: ntuser.h:969
@ OBI_CLOSE
Definition: ntuser.h:966
@ OBI_DNARROWI
Definition: ntuser.h:970
@ OBI_MNARROW
Definition: ntuser.h:971
BITMAP bmp
Definition: alphablend.c:62
Definition: bl.h:1331
struct tagOEMBITMAPINFO oembmi[93]
Definition: callback.h:153
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2163

◆ User32CallSetWndIconsFromKernel()

NTSTATUS WINAPI User32CallSetWndIconsFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 591 of file dllmain.c.

592{
593 PSETWNDICONS_CALLBACK_ARGUMENTS Common = Arguments;
594
595 if (!gpsi->hIconSmWindows)
596 {
604 hIconWindows = Common->hIconWindows;
606 }
607 ERR("hIconSmWindows %p hIconWindows %p \n",hIconSmWindows,hIconWindows);
608 return ZwCallbackReturn(Arguments, ArgumentLength, STATUS_SUCCESS);
609}
HICON hIconWindows
Definition: dllmain.c:37
HICON hIconSmWindows
Definition: dllmain.c:37
#define IDI_QUESTION
Definition: winuser.h:706
#define IMAGE_ICON
Definition: winuser.h:212
#define IDI_HAND
Definition: winuser.h:705
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2203
#define SM_CYSMICON
Definition: winuser.h:1013
#define IDI_WINLOGO
Definition: winuser.h:709
#define IDI_APPLICATION
Definition: winuser.h:704
#define IDI_ASTERISK
Definition: winuser.h:708
#define SM_CXSMICON
Definition: winuser.h:1012
#define LR_DEFAULTSIZE
Definition: winuser.h:1094
#define IDI_EXCLAMATION
Definition: winuser.h:707
int WINAPI GetSystemMetrics(_In_ int)

◆ User32CallUMPDFromKernel()

NTSTATUS WINAPI User32CallUMPDFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 673 of file dllmain.c.

674{
676 INT cbSize = 0;
678 PUMPDPKTHEAD pkt, pktOut = NULL;
679
680 pkt = (PUMPDPKTHEAD)Arguments;
681
682 if ( pkt->RetSize <= sizeof(Buffer) )
683 {
684 pktOut = (PUMPDPKTHEAD)Buffer;
685
686 if ( (GdiPrinterThunk( pkt, pktOut, pkt->RetSize ) == GDI_ERROR) )
687 {
688 pktOut = NULL;
690 }
691 else
692 {
693 cbSize = pkt->RetSize;
694 }
695 }
696 else
697 {
699 }
700 return ZwCallbackReturn( pktOut, cbSize, Status );
701}
Definition: bufpool.h:45
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
INT RetSize
Definition: dllmain.c:14
struct _UMPDPKTHEAD * PUMPDPKTHEAD
#define MAX_USER_MODE_DRV_BUFFER
Definition: dllmain.c:5
INT WINAPI GdiPrinterThunk(PUMPDPKTHEAD, PVOID, INT)
#define GDI_ERROR
Definition: wingdi.h:1309

◆ User32DeliverUserAPC()

NTSTATUS WINAPI User32DeliverUserAPC ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 613 of file dllmain.c.

614{
615 return ZwCallbackReturn(0, 0, STATUS_SUCCESS);
616}

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( user32  )

Variable Documentation

◆ apfnDispatch

Initial value:
=
{
}

Definition at line 208 of file dllmain.c.

Referenced by Init().

◆ g_ppi

PPROCESSINFO g_ppi = NULL

Definition at line 29 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), Init(), and ValidateCallProc().

◆ gfFirstThread

BOOLEAN gfFirstThread = TRUE

Definition at line 36 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), and Init().

◆ gfLogonProcess

BOOLEAN gfLogonProcess = FALSE

Definition at line 34 of file dllmain.c.

Referenced by RegisterLogonProcess().

◆ gfServerProcess

BOOLEAN gfServerProcess = FALSE

Definition at line 35 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), DllMain(), Init(), and LoadUserApiHook().

◆ gHandleEntries

PUSER_HANDLE_ENTRY gHandleEntries = NULL

Definition at line 33 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), GetUser32Handle(), and Init().

◆ gHandleTable

PUSER_HANDLE_TABLE gHandleTable = NULL

Definition at line 32 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), and Init().

◆ gpsi

PSERVERINFO gpsi = NULL

Definition at line 31 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), DllMain(), Init(), and User32CallSetWndIconsFromKernel().

◆ gSharedInfo

SHAREDINFO gSharedInfo = {0}

Definition at line 30 of file dllmain.c.

Referenced by ClientThreadSetupHelper(), DllMain(), and Init().

◆ hIconSmWindows

HICON hIconSmWindows = NULL

Definition at line 37 of file dllmain.c.

Referenced by User32CallSetWndIconsFromKernel().

◆ hIconWindows

HICON hIconWindows = NULL

Definition at line 37 of file dllmain.c.

Referenced by User32CallSetWndIconsFromKernel().

◆ szAppInit

WCHAR szAppInit[KEY_LENGTH]

Definition at line 39 of file dllmain.c.

Referenced by GetDllList(), LoadAppInitDlls(), and UnloadAppInitDlls().

◆ User32Instance

◆ User32TlsIndex

ULONG User32TlsIndex
static

Definition at line 26 of file dllmain.c.

Referenced by Cleanup(), and ClientThreadSetupHelper().