ReactOS 0.4.15-dev-6694-g4ba8af9
dllmain.c File Reference
#include <user32.h>
#include <ndk/cmfuncs.h>
#include <strsafe.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 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_MAXIMUM+1]
 

Macro Definition Documentation

◆ 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 459 of file dllmain.c.

460{
463 MenuCleanup();
467}
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 346 of file dllmain.c.

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

◆ ClientThreadSetupHelper()

BOOL WINAPI ClientThreadSetupHelper ( BOOL  IsCallback)

Definition at line 237 of file dllmain.c.

238{
239 /*
240 * Normally we are called by win32k so the win32 thread pointers
241 * should be valid as they are set in win32k::InitThreadCallback.
242 */
245
246 TRACE("In ClientThreadSetup(IsCallback == %s, gfServerProcess = %s, IsFirstThread = %s)\n",
247 IsCallback ? "TRUE" : "FALSE", gfServerProcess ? "TRUE" : "FALSE", IsFirstThread ? "TRUE" : "FALSE");
248
249 if (IsFirstThread)
251
252 /* Check for already initialized thread, and bail out if so */
253 if (ClientInfo->CI_flags & CI_INITTHREAD)
254 {
255 ERR("ClientThreadSetup: Thread already initialized.\n");
256 return FALSE;
257 }
258
259 /*
260 * CSRSS couldn't use user32::DllMain CSR server-to-server call to connect
261 * to win32k. So it is delayed to a manually-call to ClientThreadSetup.
262 * Also this needs to be done only for the first thread (since the connection
263 * is per-process).
264 */
265 if (gfServerProcess && IsFirstThread)
266 {
268 USERCONNECT UserCon;
269
270 RtlZeroMemory(&UserCon, sizeof(UserCon));
271
272 /* Minimal setup of the connect info structure */
273 UserCon.ulVersion = USER_VERSION;
274 // UserCon.dwDispatchCount;
275
276 /* Connect to win32k */
278 &UserCon,
279 sizeof(UserCon));
280 if (!NT_SUCCESS(Status)) return FALSE;
281
282 /* Retrieve data */
283 g_ppi = ClientInfo->ppi; // Snapshot PI, used as pointer only!
284 gSharedInfo = UserCon.siClient;
287 /* ReactOS-Specific! */ gHandleEntries = SharedPtrToUser(gHandleTable->handles);
288
289 // ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n",
290 // gSharedInfo.psi, gSharedInfo.aheList, gSharedInfo.ulSharedDelta);
291 }
292
293 TRACE("Checkpoint (register PFN)\n");
294 if (!RegisterClientPFN())
295 {
296 ERR("RegisterClientPFN failed\n");
297 return FALSE;
298 }
299
300 /* Mark this thread as initialized */
301 ClientInfo->CI_flags |= CI_INITTHREAD;
302
303 /* Initialization that should be done once per process */
304 if (IsFirstThread)
305 {
306 TRACE("Checkpoint (Allocating TLS)\n");
307
308 /* Allocate an index for user32 thread local data */
311 return FALSE;
312
313 // HAAAAAAAAAACK!!!!!!
314 // ASSERT(gpsi);
315 if (!gpsi) ERR("AAAAAAAAAAAHHHHHHHHHHHHHH!!!!!!!! gpsi == NULL !!!!\n");
316 if (gpsi)
317 {
318 TRACE("Checkpoint (MessageInit)\n");
319
320 if (MessageInit())
321 {
322 TRACE("Checkpoint (MenuInit)\n");
323 if (MenuInit())
324 {
325 TRACE("Checkpoint initialization done OK\n");
328 return TRUE;
329 }
331 }
332
334 return FALSE;
335 }
336 }
337
338 return TRUE;
339}
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:302
#define USER_VERSION
Definition: ntuser.h:1144
#define GetWin32ClientInfo()
Definition: ntuser.h:347
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:1126
PSERVERINFO psi
Definition: ntuser.h:1125
ULONG ulVersion
Definition: ntuser.h:1137
SHAREDINFO siClient
Definition: ntuser.h:1140
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 472 of file dllmain.c.

476{
477 switch (dwReason)
478 {
480 {
481
482#define WIN_OBJ_DIR L"\\Windows"
483#define SESSION_DIR L"\\Sessions"
484
485 USERSRV_API_CONNECTINFO ConnectInfo; // USERCONNECT
486
487#if 0 // Disabling this code is a BIG HACK!!
488
490 ULONG ConnectInfoSize = sizeof(ConnectInfo);
491 WCHAR SessionDir[256];
492
493 /* Cache the PEB and Session ID */
495 ULONG SessionId = Peb->SessionId; // gSessionId
496
497 TRACE("user32::DllMain\n");
498
499 /* Don't bother us for each thread */
501
502 RtlZeroMemory(&ConnectInfo, sizeof(ConnectInfo));
503
504 /* Minimal setup of the connect info structure */
505 ConnectInfo.ulVersion = USER_VERSION;
506
507 /* Setup the Object Directory path */
508 if (!SessionId)
509 {
510 /* Use the raw path */
511 wcscpy(SessionDir, WIN_OBJ_DIR);
512 }
513 else
514 {
515 /* Use the session path */
516 swprintf(SessionDir,
517 L"%ws\\%ld%ws",
519 SessionId,
521 }
522
523 TRACE("Checkpoint (call CSR)\n");
524
525 /* Connect to the USER Server */
526 Status = CsrClientConnectToServer(SessionDir,
528 &ConnectInfo,
529 &ConnectInfoSize,
531 if (!NT_SUCCESS(Status))
532 {
533 ERR("Failed to connect to CSR (Status %lx)\n", Status);
534 return FALSE;
535 }
536
537 TRACE("Checkpoint (CSR called)\n");
538
539#endif
540
541 User32Instance = hDll;
542
543 /* Finish initialization */
544 TRACE("Checkpoint (call Init)\n");
545 if (!Init(&ConnectInfo))
546 return FALSE;
547
548 if (!gfServerProcess)
549 {
550 HINSTANCE hImm32 = NULL;
551
553 {
554 WCHAR szImmFile[MAX_PATH];
556 User32GetImmFileName(szImmFile, _countof(szImmFile));
557 hImm32 = GetModuleHandleW(szImmFile);
558 }
559
560 if (!IMM_FN(ImmRegisterClient)(&gSharedInfo, hImm32))
561 return FALSE;
562 }
563 break;
564 }
565
567 {
568 if (ghImm32)
570
571 Cleanup();
572 break;
573 }
574 }
575
576 /* Finally, initialize GDI */
577 return GdiDllInitialize(hDll, dwReason, pReserved);
578}
#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:58
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:944
#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:1046
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:43
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define DWORD
Definition: nt_native.h:44
struct _GDIHANDLECACHE * PGDIHANDLECACHE
#define GdiHandleTable
Definition: win32nt.h:35
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 386 of file dllmain.c.

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

◆ 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 582 of file dllmain.c.

583{
584 TRACE("User32CallClientThreadSetupFromKernel -->\n");
585 // FIXME: Disabling this call is a HACK!! See also ClientThreadSetup...
586 // ClientThreadSetupHelper(TRUE);
587 TRACE("<-- User32CallClientThreadSetupFromKernel\n");
589}
NTSYSAPI NTSTATUS NTAPI ZwCallbackReturn(_In_ PVOID Result, _In_ ULONG ResultLength, _In_ NTSTATUS Status)

◆ User32CallGetCharsetInfo()

NTSTATUS WINAPI User32CallGetCharsetInfo ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 593 of file dllmain.c.

594{
595 BOOL Ret;
596 PGET_CHARSET_INFO pgci = (PGET_CHARSET_INFO)Arguments;
597
598 TRACE("GetCharsetInfo\n");
599
600 Ret = TranslateCharsetInfo((DWORD *)(ULONG_PTR)pgci->Locale, &pgci->Cs, TCI_SRCLOCALE);
601
602 return ZwCallbackReturn(Arguments, ArgumentLength, Ret ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
603}
CHARSETINFO Cs
Definition: callback.h:133
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 733 of file dllmain.c.

734{
735 PIMMLOADLAYOUT_CALLBACK_ARGUMENTS Common = Arguments;
737 Result.ret = IMM_FN(ImmLoadLayout)(Common->hKL, &Result.iiex);
738 return ZwCallbackReturn(&Result, sizeof(Result), STATUS_SUCCESS);
739}
BOOL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
Definition: imm.c:68
_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 720 of file dllmain.c.

721{
722 PIMMPROCESSKEY_CALLBACK_ARGUMENTS Common = Arguments;
724 Common->hKL,
725 Common->vKey,
726 Common->lParam,
727 Common->dwHotKeyID);
728
729 return ZwCallbackReturn(&Result, sizeof(DWORD), STATUS_SUCCESS);
730}
DWORD WINAPI ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
Definition: keymsg.c:774

◆ User32CallLPKFromKernel()

NTSTATUS WINAPI User32CallLPKFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 668 of file dllmain.c.

669{
670 BOOL bResult;
672
673 Argument = (PLPK_CALLBACK_ARGUMENTS)Arguments;
674
675 Argument->lpString = (LPWSTR)((ULONG_PTR)Argument->lpString + (ULONG_PTR)Argument);
676
677 bResult = ExtTextOutW(Argument->hdc,
678 Argument->x,
679 Argument->y,
680 Argument->flags,
681 (Argument->bRect) ? &Argument->rect : NULL,
682 Argument->lpString,
683 Argument->count,
684 NULL);
685
686 return ZwCallbackReturn(&bResult, sizeof(BOOL), STATUS_SUCCESS);
687}
#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 636 of file dllmain.c.

637{
638 BITMAP bmp;
639 PSETOBM_CALLBACK_ARGUMENTS Common = Arguments;
640
642 Common->oembmi[OBI_CLOSE].cx = bmp.bmWidth;
643 Common->oembmi[OBI_CLOSE].cy = bmp.bmHeight;
644
646 Common->oembmi[OBI_MNARROW].cx = bmp.bmWidth;
647 Common->oembmi[OBI_MNARROW].cy = bmp.bmHeight;
648
650 Common->oembmi[OBI_DNARROW].cx = bmp.bmWidth;
651 Common->oembmi[OBI_DNARROW].cy = bmp.bmHeight;
652
654 Common->oembmi[OBI_DNARROWI].cx = bmp.bmWidth;
655 Common->oembmi[OBI_DNARROWI].cy = bmp.bmHeight;
656
658 Common->oembmi[OBI_UPARROW].cx = bmp.bmWidth;
659 Common->oembmi[OBI_UPARROW].cy = bmp.bmHeight;
660
662 Common->oembmi[OBI_UPARROWI].cx = bmp.bmWidth;
663 Common->oembmi[OBI_UPARROWI].cy = bmp.bmHeight;
664
665 return ZwCallbackReturn(Arguments, ArgumentLength, STATUS_SUCCESS);
666}
@ OBI_UPARROWI
Definition: ntuser.h:963
@ OBI_UPARROW
Definition: ntuser.h:962
@ OBI_DNARROW
Definition: ntuser.h:964
@ OBI_CLOSE
Definition: ntuser.h:961
@ OBI_DNARROWI
Definition: ntuser.h:965
@ OBI_MNARROW
Definition: ntuser.h:966
BITMAP bmp
Definition: alphablend.c:62
Definition: bl.h:1331
struct tagOEMBITMAPINFO oembmi[93]
Definition: callback.h:158
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define OBM_CLOSE
Definition: winuser.h:1122
#define OBM_MNARROW
Definition: winuser.h:1107
#define OBM_DNARROWI
Definition: winuser.h:1104
#define OBM_UPARROWI
Definition: winuser.h:1105
#define OBM_UPARROW
Definition: winuser.h:1121
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2132
#define OBM_DNARROW
Definition: winuser.h:1120

◆ User32CallSetWndIconsFromKernel()

NTSTATUS WINAPI User32CallSetWndIconsFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 607 of file dllmain.c.

608{
609 PSETWNDICONS_CALLBACK_ARGUMENTS Common = Arguments;
610
611 if (!gpsi->hIconSmWindows)
612 {
620 hIconWindows = Common->hIconWindows;
622 }
623 ERR("hIconSmWindows %p hIconWindows %p \n",hIconSmWindows,hIconWindows);
624 return ZwCallbackReturn(Arguments, ArgumentLength, STATUS_SUCCESS);
625}
HICON hIconWindows
Definition: dllmain.c:37
HICON hIconSmWindows
Definition: dllmain.c:37
#define IDI_QUESTION
Definition: winuser.h:701
#define IMAGE_ICON
Definition: winuser.h:212
#define IDI_HAND
Definition: winuser.h:700
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:2172
#define SM_CYSMICON
Definition: winuser.h:1007
#define IDI_WINLOGO
Definition: winuser.h:704
#define IDI_APPLICATION
Definition: winuser.h:699
#define IDI_ASTERISK
Definition: winuser.h:703
#define SM_CXSMICON
Definition: winuser.h:1006
#define LR_DEFAULTSIZE
Definition: winuser.h:1088
#define IDI_EXCLAMATION
Definition: winuser.h:702
int WINAPI GetSystemMetrics(_In_ int)

◆ User32CallUMPDFromKernel()

NTSTATUS WINAPI User32CallUMPDFromKernel ( PVOID  Arguments,
ULONG  ArgumentLength 
)

Definition at line 689 of file dllmain.c.

690{
692 INT cbSize = 0;
694 PUMPDPKTHEAD pkt, pktOut = NULL;
695
696 pkt = (PUMPDPKTHEAD)Arguments;
697
698 if ( pkt->RetSize <= sizeof(Buffer) )
699 {
700 pktOut = (PUMPDPKTHEAD)Buffer;
701
702 if ( (GdiPrinterThunk( pkt, pktOut, pkt->RetSize ) == GDI_ERROR) )
703 {
704 pktOut = NULL;
706 }
707 else
708 {
709 cbSize = pkt->RetSize;
710 }
711 }
712 else
713 {
715 }
716 return ZwCallbackReturn( pktOut, cbSize, Status );
717}
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 629 of file dllmain.c.

630{
631 return ZwCallbackReturn(0, 0, STATUS_SUCCESS);
632}

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( user32  )

Variable Documentation

◆ apfnDispatch

PVOID apfnDispatch[USER32_CALLBACK_MAXIMUM+1]
Initial value:
=
{
}
NTSTATUS WINAPI User32CallClientLoadLibraryFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: hook.c:528
NTSTATUS WINAPI User32SetupDefaultCursors(PVOID Arguments, ULONG ArgumentLength)
Definition: cursoricon.c:48
NTSTATUS WINAPI User32CallWindowProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: message.c:2937
NTSTATUS WINAPI User32CallSendAsyncProcForKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: window.c:24
NTSTATUS WINAPI User32CallLoadMenuFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: menu.c:657
NTSTATUS WINAPI User32CallDDEGetFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dde.c:288
NTSTATUS WINAPI User32CallDDEPostFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dde.c:256
NTSTATUS WINAPI User32LoadSysMenuTemplateForKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: menu.c:647
NTSTATUS WINAPI User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: hook.c:554
NTSTATUS WINAPI User32CallEventProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: hook.c:796
NTSTATUS WINAPI User32CallCopyImageFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: cursoricon.c:1938
NTSTATUS WINAPI User32DeliverUserAPC(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:629
NTSTATUS WINAPI User32CallClientThreadSetupFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:582
NTSTATUS WINAPI User32CallSetWndIconsFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:607
NTSTATUS WINAPI User32CallImmLoadLayoutFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:733
NTSTATUS WINAPI User32CallImmProcessKeyFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:720
NTSTATUS WINAPI User32CallGetCharsetInfo(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:593
NTSTATUS WINAPI User32CallLPKFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:668
NTSTATUS WINAPI User32CallUMPDFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:689
NTSTATUS WINAPI User32CallOBMFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:636

Definition at line 206 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().