ReactOS 0.4.15-dev-8191-gbc6c731
dllmain.c
Go to the documentation of this file.
1#include <user32.h>
2#include <ndk/cmfuncs.h>
3#include <strsafe.h>
4
5#define MAX_USER_MODE_DRV_BUFFER 526
6
7//
8// UMPD Packet Header should match win32ss/include/ntumpd.h
9//
10typedef struct _UMPDPKTHEAD
11{
16 HUMPD humpd;
19
21
23
24#define KEY_LENGTH 1024
25
28
38
40
41BOOL
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}
138
139
140VOID
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}
172
173VOID
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}
205
206#define DEFINE_USER32_CALLBACK(id, value, fn) fn,
207
209{
210#include "u32cb.h"
211};
212
213#undef DEFINE_USER32_CALLBACK
214
215VOID
216WINAPI
218
219BOOL
220WINAPI
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}
324
325/*
326 * @implemented
327 */
328BOOL
329WINAPI
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}
368
369BOOL
370Init(PUSERCONNECT UserCon /*PUSERSRV_API_CONNECTINFO*/)
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}
441
442VOID
444{
447 MenuCleanup();
451}
452
453// UserClientDllInitialize
454BOOL
455WINAPI
457 _In_ HANDLE hDll,
459 _In_opt_ PVOID pReserved)
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}
563
565WINAPI
567{
568 TRACE("User32CallClientThreadSetupFromKernel -->\n");
569 // FIXME: Disabling this call is a HACK!! See also ClientThreadSetup...
570 // ClientThreadSetupHelper(TRUE);
571 TRACE("<-- User32CallClientThreadSetupFromKernel\n");
573}
574
576WINAPI
577User32CallGetCharsetInfo(PVOID Arguments, ULONG ArgumentLength)
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}
588
590WINAPI
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}
610
612WINAPI
613User32DeliverUserAPC(PVOID Arguments, ULONG ArgumentLength)
614{
615 return ZwCallbackReturn(0, 0, STATUS_SUCCESS);
616}
617
619WINAPI
620User32CallOBMFromKernel(PVOID Arguments, ULONG ArgumentLength)
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}
651
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}
672
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}
702
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}
715
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}
#define NtCurrentPeb()
Definition: FLS.c:22
unsigned char BOOLEAN
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
DWORD dwReason
Definition: misc.cpp:154
#define ERR(fmt,...)
Definition: debug.h:113
Definition: bufpool.h:45
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
Definition: dllmain.c:52
HMODULE hModule
Definition: animate.c:44
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define HeapAlloc
Definition: compat.h:733
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define LoadLibraryW(x)
Definition: compat.h:747
BOOL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
Definition: imm.c:67
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
DWORD WINAPI TlsAlloc(VOID)
Definition: thread.c:1100
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1166
#define swprintf
Definition: precomp.h:40
static const WCHAR Cleanup[]
Definition: register.c:80
#define ULONG_PTR
Definition: config.h:101
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
Status
Definition: gdiplustypes.h:25
GLuint GLuint end
Definition: gl.h:1545
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)
#define CI_INITTHREAD
Definition: ntuser.h:303
#define USER_VERSION
Definition: ntuser.h:1149
@ 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
#define SRVINFO_IMM32
Definition: ntuser.h:949
#define GetWin32ClientInfo()
Definition: ntuser.h:352
NTSTATUS NTAPI NtUserProcessConnect(IN HANDLE ProcessHandle, OUT PUSERCONNECT pUserConnect, IN ULONG Size)
Definition: ntstubs.c:476
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
CLIENT_DATA ClientInfo
char _InterlockedExchange8(_Interlocked_operand_ char volatile *_Target, char _Value)
DWORD WINAPI ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
Definition: keymsg.c:715
if(dx< 0)
Definition: linetemp.h:194
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static PVOID ptr
Definition: dispmode.c:27
BITMAP bmp
Definition: alphablend.c:62
static HICON
Definition: imagelist.c:84
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define min(a, b)
Definition: monoChain.cc:55
#define _In_
Definition: ms_sal.h:308
#define _In_opt_
Definition: ms_sal.h:309
NTSYSAPI NTSTATUS NTAPI ZwCallbackReturn(_In_ PVOID Result, _In_ ULONG ResultLength, _In_ NTSTATUS Status)
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
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
#define NtCurrentProcess()
Definition: nt_native.h:1657
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_NO_MEMORY
Definition: ntstatus.h:260
#define L(x)
Definition: ntvdm.h:50
BOOL WINAPI RegisterClientPFN(VOID)
Definition: regcontrol.c:143
_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 STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
Definition: bl.h:1331
CHARSETINFO Cs
Definition: callback.h:128
ULONG SessionId
Definition: btrfs_drv.h:1919
struct tagOEMBITMAPINFO oembmi[93]
Definition: callback.h:153
PVOID aheList
Definition: ntuser.h:1131
PSERVERINFO psi
Definition: ntuser.h:1130
INT Size
Definition: dllmain.c:12
DWORD Reserved
Definition: dllmain.c:15
INT RetSize
Definition: dllmain.c:14
INT Index
Definition: dllmain.c:13
HUMPD humpd
Definition: dllmain.c:16
ULONG ulVersion
Definition: ntuser.h:1142
SHAREDINFO siClient
Definition: ntuser.h:1145
Definition: ntuser.h:17
PUSER_HANDLE_ENTRY handles
Definition: ntuser.h:32
DWORD dwSRVIFlags
Definition: ntuser.h:1051
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
RTL_CRITICAL_SECTION gcsUserApiHook
Definition: usrapihk.c:39
VOID FASTCALL MessageCleanup(VOID)
Definition: message.c:3292
HRESULT User32GetImmFileName(_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer)
Definition: imm.c:57
BOOL FASTCALL MessageInit(VOID)
Definition: message.c:3284
BOOL WINAPI InitializeImmEntryTable(VOID)
Definition: imm.c:119
#define IMM_FN(name)
Definition: user32p.h:56
HINSTANCE ghImm32
Definition: imm.c:20
CRITICAL_SECTION U32AccelCacheLock
Definition: accel.c:54
VOID DeleteFrameBrushes(VOID)
Definition: paint.c:71
static __inline PVOID SharedPtrToUser(PVOID Ptr)
Definition: user_x.h:4
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
BOOL WINAPI GdiDllInitialize(_In_ HANDLE hDll, _In_ ULONG dwReason, _In_opt_ PVOID pReserved)
Definition: dllmain.c:79
VOID WINAPI GdiProcessSetup(VOID)
Definition: dllmain.c:45
struct _LPK_CALLBACK_ARGUMENTS * PLPK_CALLBACK_ARGUMENTS
@ USER32_CALLBACK_COUNT
Definition: callback.h:16
struct _GET_CHARSET_INFO * PGET_CHARSET_INFO
BOOL MenuInit(VOID)
Definition: menu.c:359
BOOLEAN gfServerProcess
Definition: dllmain.c:35
BOOLEAN gfLogonProcess
Definition: dllmain.c:34
struct _UMPDPKTHEAD * PUMPDPKTHEAD
PPROCESSINFO g_ppi
Definition: dllmain.c:29
static ULONG User32TlsIndex
Definition: dllmain.c:26
NTSTATUS WINAPI User32DeliverUserAPC(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:613
NTSTATUS WINAPI User32CallClientThreadSetupFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:566
PUSER_HANDLE_ENTRY gHandleEntries
Definition: dllmain.c:33
WCHAR szAppInit[KEY_LENGTH]
Definition: dllmain.c:39
PUSER_HANDLE_TABLE gHandleTable
Definition: dllmain.c:32
VOID UnloadAppInitDlls(VOID)
Definition: dllmain.c:174
#define KEY_LENGTH
Definition: dllmain.c:24
VOID LoadAppInitDlls(VOID)
Definition: dllmain.c:141
PVOID apfnDispatch[USER32_CALLBACK_COUNT]
Definition: dllmain.c:208
NTSTATUS WINAPI User32CallSetWndIconsFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:591
NTSTATUS WINAPI User32CallImmLoadLayoutFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:717
#define MAX_USER_MODE_DRV_BUFFER
Definition: dllmain.c:5
NTSTATUS WINAPI User32CallImmProcessKeyFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:704
HICON hIconWindows
Definition: dllmain.c:37
NTSTATUS WINAPI User32CallGetCharsetInfo(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:577
NTSTATUS WINAPI User32CallLPKFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:652
struct _UMPDPKTHEAD UMPDPKTHEAD
BOOL WINAPI ClientThreadSetupHelper(BOOL IsCallback)
Definition: dllmain.c:221
HINSTANCE User32Instance
Definition: dllmain.c:27
INT WINAPI GdiPrinterThunk(PUMPDPKTHEAD, PVOID, INT)
BOOL GetDllList(VOID)
Definition: dllmain.c:42
SHAREDINFO gSharedInfo
Definition: dllmain.c:30
BOOLEAN gfFirstThread
Definition: dllmain.c:36
HICON hIconSmWindows
Definition: dllmain.c:37
PSERVERINFO gpsi
Definition: dllmain.c:31
NTSTATUS WINAPI User32CallUMPDFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:673
BOOL WINAPI ClientThreadSetup(VOID)
Definition: dllmain.c:330
NTSTATUS WINAPI User32CallOBMFromKernel(PVOID Arguments, ULONG ArgumentLength)
Definition: dllmain.c:620
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:549
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WINAPI
Definition: msvc.h:6
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define TCI_SRCLOCALE
Definition: wingdi.h:964
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)
#define GDI_ERROR
Definition: wingdi.h:1309
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)
#define USERSRV_SERVERDLL_INDEX
Definition: winmsg.h:15
#define USERSRV_API_CONNECTINFO
Definition: winmsg.h:40
#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:2234
#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 MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2194
#define IDI_EXCLAMATION
Definition: winuser.h:707
int WINAPI GetSystemMetrics(_In_ int)
_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
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184