Moved user lock to user.c. Added USER_CheckNotLock function.
[wine] / windows / user.c
1 /*
2  * Misc. USER functions
3  *
4  * Copyright 1993 Robert J. Amstadt
5  *           1996 Alex Korobka 
6  */
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include "wine/winbase16.h"
11 #include "windef.h"
12 #include "wingdi.h"
13 #include "winuser.h"
14 #include "heap.h"
15 #include "user.h"
16 #include "win.h"
17 #include "controls.h"
18 #include "cursoricon.h"
19 #include "hook.h"
20 #include "message.h"
21 #include "miscemu.h"
22 #include "sysmetrics.h"
23 #include "callback.h"
24 #include "local.h"
25 #include "module.h"
26 #include "debugtools.h"
27
28 DECLARE_DEBUG_CHANNEL(hook);
29 DECLARE_DEBUG_CHANNEL(local);
30 DECLARE_DEBUG_CHANNEL(system);
31 DECLARE_DEBUG_CHANNEL(win);
32 DECLARE_DEBUG_CHANNEL(win32);
33
34 SYSLEVEL USER_SysLevel = { CRITICAL_SECTION_INIT("USER_SysLevel"), 2 };
35
36
37 /***********************************************************************
38  *              GetFreeSystemResources (USER.284)
39  */
40 WORD WINAPI GetFreeSystemResources16( WORD resType )
41 {
42     HINSTANCE16 gdi_inst;
43     WORD gdi_heap;
44     int userPercent, gdiPercent;
45
46     if ((gdi_inst = LoadLibrary16( "GDI" )) < 32) return 0;
47     gdi_heap = gdi_inst | 7;
48
49     switch(resType)
50     {
51     case GFSR_USERRESOURCES:
52         userPercent = (int)LOCAL_CountFree( USER_HeapSel ) * 100 /
53                                LOCAL_HeapSize( USER_HeapSel );
54         gdiPercent  = 100;
55         break;
56
57     case GFSR_GDIRESOURCES:
58         gdiPercent  = (int)LOCAL_CountFree( gdi_inst ) * 100 /
59                                LOCAL_HeapSize( gdi_inst );
60         userPercent = 100;
61         break;
62
63     case GFSR_SYSTEMRESOURCES:
64         userPercent = (int)LOCAL_CountFree( USER_HeapSel ) * 100 /
65                                LOCAL_HeapSize( USER_HeapSel );
66         gdiPercent  = (int)LOCAL_CountFree( gdi_inst ) * 100 /
67                                LOCAL_HeapSize( gdi_inst );
68         break;
69
70     default:
71         userPercent = gdiPercent = 0;
72         break;
73     }
74     FreeLibrary16( gdi_inst );
75     return (WORD)min( userPercent, gdiPercent );
76 }
77
78
79 /**********************************************************************
80  *              InitApp (USER.5)
81  */
82 INT16 WINAPI InitApp16( HINSTANCE16 hInstance )
83 {
84     /* Hack: restore the divide-by-zero handler */
85     /* FIXME: should set a USER-specific handler that displays a msg box */
86     INT_SetPMHandler( 0, INT_GetPMHandler( 0xff ) );
87
88     /* Create task message queue */
89     if ( !InitThreadInput16( 0, 0 ) ) return 0;
90
91     return 1;
92 }
93
94
95 /***********************************************************************
96  *           USER_Lock
97  */
98 void USER_Lock(void)
99 {
100     _EnterSysLevel( &USER_SysLevel );
101 }
102
103
104 /***********************************************************************
105  *           USER_Unlock
106  */
107 void USER_Unlock(void)
108 {
109     _LeaveSysLevel( &USER_SysLevel );
110 }
111
112
113 /***********************************************************************
114  *           USER_CheckNotLock
115  *
116  * Make sure that we don't hold the user lock.
117  */
118 void USER_CheckNotLock(void)
119 {
120     _CheckNotSysLevel( &USER_SysLevel );
121 }
122
123
124 /**********************************************************************
125  *           USER_ModuleUnload
126  */
127 static void USER_ModuleUnload( HMODULE16 hModule )
128 {
129     HOOK_FreeModuleHooks( hModule );
130     CLASS_FreeModuleClasses( hModule );
131     CURSORICON_FreeModuleIcons( hModule );
132 }
133
134 /***********************************************************************
135  *              SignalProc (USER.314)
136  */
137 void WINAPI USER_SignalProc( HANDLE16 hTaskOrModule, UINT16 uCode,
138                              UINT16 uExitFn, HINSTANCE16 hInstance,
139                              HQUEUE16 hQueue )
140 {
141     FIXME_(win)("Win 3.1 USER signal %04x\n", uCode );
142 }
143
144 /***********************************************************************
145  *              FinalUserInit (USER.400)
146  */
147 void WINAPI FinalUserInit16( void )
148 {
149     /* FIXME: Should chain to FinalGdiInit now. */
150 }
151
152 /***********************************************************************
153  *              SignalProc32 (USER.391)
154  *              UserSignalProc (USER32.@)
155  *
156  * For comments about the meaning of uCode and dwFlags 
157  * see PROCESS_CallUserSignalProc.
158  *
159  */
160 WORD WINAPI UserSignalProc( UINT uCode, DWORD dwThreadOrProcessID,
161                             DWORD dwFlags, HMODULE16 hModule )
162 {
163     /* FIXME: Proper reaction to most signals still missing. */
164
165     switch ( uCode )
166     {
167     case USIG_DLL_UNLOAD_WIN16:
168     case USIG_DLL_UNLOAD_WIN32:
169         USER_ModuleUnload( hModule );
170         break;
171
172     case USIG_DLL_UNLOAD_ORPHANS:
173     case USIG_FAULT_DIALOG_PUSH:
174     case USIG_FAULT_DIALOG_POP:
175     case USIG_THREAD_INIT:
176     case USIG_THREAD_EXIT:
177     case USIG_PROCESS_CREATE:
178     case USIG_PROCESS_INIT:
179     case USIG_PROCESS_LOADED:
180     case USIG_PROCESS_RUNNING:
181     case USIG_PROCESS_EXIT:
182     case USIG_PROCESS_DESTROY:
183       break;
184
185     default:
186         FIXME_(win)("(%04x, %08lx, %04lx, %04x)\n",
187                     uCode, dwThreadOrProcessID, dwFlags, hModule );
188         break;
189     }
190
191     /* FIXME: Should chain to GdiSignalProc now. */
192
193     return 0;
194 }
195
196 /***********************************************************************
197  *              ExitWindows (USER.7)
198  */
199 BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved )
200 {
201     return ExitWindowsEx( EWX_LOGOFF, 0xffffffff );
202 }
203
204
205 /***********************************************************************
206  *              ExitWindowsExec (USER.246)
207  */
208 BOOL16 WINAPI ExitWindowsExec16( LPCSTR lpszExe, LPCSTR lpszParams )
209 {
210     TRACE_(system)("Should run the following in DOS-mode: \"%s %s\"\n",
211         lpszExe, lpszParams);
212     return ExitWindowsEx( EWX_LOGOFF, 0xffffffff );
213 }
214
215
216 /***********************************************************************
217  *              ExitWindowsEx (USER32.@)
218  */
219 BOOL WINAPI ExitWindowsEx( UINT flags, DWORD reserved )
220 {
221     int i;
222     BOOL result;
223     WND **list, **ppWnd;
224         
225     /* We have to build a list of all windows first, as in EnumWindows */
226
227     if (!(list = WIN_BuildWinArray( WIN_GetDesktop(), 0, NULL )))
228     {
229         WIN_ReleaseDesktop();
230         return FALSE;
231     }
232
233     /* Send a WM_QUERYENDSESSION message to every window */
234
235     for (ppWnd = list, i = 0; *ppWnd; ppWnd++, i++)
236     {
237         /* Make sure that the window still exists */
238         if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
239         if (!SendMessageW( (*ppWnd)->hwndSelf, WM_QUERYENDSESSION, 0, 0 ))
240             break;
241     }
242     result = !(*ppWnd);
243
244     /* Now notify all windows that got a WM_QUERYENDSESSION of the result */
245
246     for (ppWnd = list; i > 0; i--, ppWnd++)
247     {
248         if (!IsWindow( (*ppWnd)->hwndSelf )) continue;
249         SendMessageW( (*ppWnd)->hwndSelf, WM_ENDSESSION, result, 0 );
250     }
251     WIN_ReleaseWinArray(list);
252
253     if (result) ExitKernel16();
254     WIN_ReleaseDesktop();
255     return FALSE;
256 }
257
258 static void _dump_CDS_flags(DWORD flags) {
259 #define X(x) if (flags & CDS_##x) MESSAGE(""#x ",");
260         X(UPDATEREGISTRY);X(TEST);X(FULLSCREEN);X(GLOBAL);
261         X(SET_PRIMARY);X(RESET);X(SETRECT);X(NORESET);
262 #undef X
263 }
264
265 /***********************************************************************
266  *              ChangeDisplaySettingsA (USER32.@)
267  */
268 LONG WINAPI ChangeDisplaySettingsA( LPDEVMODEA devmode, DWORD flags )
269 {
270   FIXME_(system)("(%p,0x%08lx), stub\n",devmode,flags);
271   MESSAGE("\tflags=");_dump_CDS_flags(flags);MESSAGE("\n");
272   if (devmode==NULL)
273     FIXME_(system)("   devmode=NULL (return to default mode)\n");
274   else if ( (devmode->dmBitsPerPel != GetSystemMetrics(SM_WINE_BPP)) 
275             || (devmode->dmPelsHeight != GetSystemMetrics(SM_CYSCREEN))
276             || (devmode->dmPelsWidth != GetSystemMetrics(SM_CXSCREEN)) )
277
278   {
279
280     if (devmode->dmFields & DM_BITSPERPEL)
281       FIXME_(system)("   bpp=%ld\n",devmode->dmBitsPerPel);
282     if (devmode->dmFields & DM_PELSWIDTH)
283       FIXME_(system)("   width=%ld\n",devmode->dmPelsWidth);
284     if (devmode->dmFields & DM_PELSHEIGHT)
285       FIXME_(system)("   height=%ld\n",devmode->dmPelsHeight);
286     FIXME_(system)(" (Putting X in this mode beforehand might help)\n"); 
287     /* we don't, but the program ... does not need to know */
288     return DISP_CHANGE_SUCCESSFUL; 
289   }
290   return DISP_CHANGE_SUCCESSFUL;
291 }
292
293 /***********************************************************************
294  *              ChangeDisplaySettings (USER.620)
295  */
296 LONG WINAPI ChangeDisplaySettings16( LPDEVMODEA devmode, DWORD flags )
297 {
298         TRACE_(system)("(%p,0x%08lx), stub\n",devmode,flags);
299         return ChangeDisplaySettingsA(devmode, flags);
300 }
301
302 /***********************************************************************
303  *              ChangeDisplaySettingsExA (USER32.@)
304  */
305 LONG WINAPI ChangeDisplaySettingsExA( 
306         LPCSTR devname, LPDEVMODEA devmode, HWND hwnd, DWORD flags,
307         LPARAM lparam
308 ) {
309   FIXME_(system)("(%s,%p,0x%04x,0x%08lx,0x%08lx), stub\n",devname,devmode,hwnd,flags,lparam);
310   MESSAGE("\tflags=");_dump_CDS_flags(flags);MESSAGE("\n");
311   if (devmode==NULL)
312     FIXME_(system)("   devmode=NULL (return to default mode)\n");
313   else if ( (devmode->dmBitsPerPel != GetSystemMetrics(SM_WINE_BPP))
314             || (devmode->dmPelsHeight != GetSystemMetrics(SM_CYSCREEN))
315             || (devmode->dmPelsWidth != GetSystemMetrics(SM_CXSCREEN)) )
316
317   {
318
319     if (devmode->dmFields & DM_BITSPERPEL)
320       FIXME_(system)("   bpp=%ld\n",devmode->dmBitsPerPel);
321     if (devmode->dmFields & DM_PELSWIDTH)
322       FIXME_(system)("   width=%ld\n",devmode->dmPelsWidth);
323     if (devmode->dmFields & DM_PELSHEIGHT)
324       FIXME_(system)("   height=%ld\n",devmode->dmPelsHeight);
325     FIXME_(system)(" (Putting X in this mode beforehand might help)\n"); 
326     /* we don't, but the program ... does not need to know */
327     return DISP_CHANGE_SUCCESSFUL; 
328   }
329   return DISP_CHANGE_SUCCESSFUL;
330 }
331
332 /***********************************************************************
333  *              EnumDisplaySettingsA (USER32.@)
334  * FIXME: Currently uses static list of modes.
335  *
336  * RETURNS
337  *      TRUE if nth setting exists found (described in the LPDEVMODEA struct)
338  *      FALSE if we do not have the nth setting
339  */
340 BOOL WINAPI EnumDisplaySettingsA(
341         LPCSTR name,            /* [in] huh? */
342         DWORD n,                /* [in] nth entry in display settings list*/
343         LPDEVMODEA devmode      /* [out] devmode for that setting */
344 ) {
345 #define NRMODES 5
346 #define NRDEPTHS 4
347         struct {
348                 int w,h;
349         } modes[NRMODES]={{512,384},{640,400},{640,480},{800,600},{1024,768}};
350         int depths[4] = {8,16,24,32};
351
352         TRACE_(system)("(%s,%ld,%p)\n",name,n,devmode);
353         devmode->dmDisplayFlags = 0;
354         devmode->dmDisplayFrequency = 85;
355         if (n==0 || n == (DWORD)-1 || n == (DWORD)-2) {
356                 devmode->dmBitsPerPel = GetSystemMetrics(SM_WINE_BPP);
357                 devmode->dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
358                 devmode->dmPelsWidth  = GetSystemMetrics(SM_CXSCREEN);
359                 return TRUE;
360         }
361         if ((n-1)<NRMODES*NRDEPTHS) {
362                 devmode->dmBitsPerPel   = depths[(n-1)/NRMODES];
363                 devmode->dmPelsHeight   = modes[(n-1)%NRMODES].h;
364                 devmode->dmPelsWidth    = modes[(n-1)%NRMODES].w;
365                 return TRUE;
366         }
367         return FALSE;
368 }
369
370 /***********************************************************************
371  *              EnumDisplaySettingsW (USER32.@)
372  */
373 BOOL WINAPI EnumDisplaySettingsW(LPCWSTR name,DWORD n,LPDEVMODEW devmode) {
374         LPSTR nameA = HEAP_strdupWtoA(GetProcessHeap(),0,name);
375         DEVMODEA        devmodeA; 
376         BOOL ret = EnumDisplaySettingsA(nameA,n,&devmodeA); 
377
378         if (ret) {
379                 devmode->dmBitsPerPel            = devmodeA.dmBitsPerPel;
380                 devmode->dmPelsHeight            = devmodeA.dmPelsHeight;
381                 devmode->dmPelsWidth             = devmodeA.dmPelsWidth;
382                 devmode->dmDisplayFlags     = devmodeA.dmDisplayFlags;
383                 devmode->dmDisplayFrequency = devmodeA.dmDisplayFrequency;
384                 /* FIXME: convert rest too, if they are ever returned */
385         }
386         HeapFree(GetProcessHeap(),0,nameA);
387         return ret;
388 }
389
390 /***********************************************************************
391  *              EnumDisplaySettings (USER.621)
392  */
393 BOOL16 WINAPI EnumDisplaySettings16(
394         LPCSTR name,            /* [in] huh? */
395         DWORD n,                /* [in] nth entry in display settings list*/
396         LPDEVMODEA devmode      /* [out] devmode for that setting */
397 ) {
398         TRACE_(system)("(%s, %ld, %p)\n", name, n, devmode);
399         return (BOOL16)EnumDisplaySettingsA(name, n, devmode);
400 }
401
402 /***********************************************************************
403  *              EnumDisplaySettingsExA (USER32.@)
404  */
405 BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum,
406                                    LPDEVMODEA lpDevMode, DWORD dwFlags) 
407 {
408         TRACE_(system)("(%s,%lu,%p,%08lx): stub\n",
409                        debugstr_a(lpszDeviceName), iModeNum, lpDevMode, dwFlags);
410
411         return EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode);
412 }
413
414 /***********************************************************************
415  *              EnumDisplaySettingsExW (USER32.@)
416  */
417 BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum,
418                                    LPDEVMODEW lpDevMode, DWORD dwFlags) 
419 {
420         TRACE_(system)("(%s,%lu,%p,%08lx): stub\n",
421                         debugstr_w(lpszDeviceName), iModeNum, lpDevMode, dwFlags);
422
423         return EnumDisplaySettingsW(lpszDeviceName, iModeNum, lpDevMode);
424 }
425
426 /***********************************************************************
427  *              EnumDisplayDevicesA (USER32.@)
428  */
429 BOOL WINAPI EnumDisplayDevicesA(
430         LPVOID unused,DWORD i,LPDISPLAY_DEVICEA lpDisplayDevice,DWORD dwFlags
431 ) {
432         if (i)
433                 return FALSE;
434         FIXME_(system)("(%p,%ld,%p,0x%08lx), stub!\n",unused,i,lpDisplayDevice,dwFlags);
435         strcpy(lpDisplayDevice->DeviceName,"X11");
436         strcpy(lpDisplayDevice->DeviceString,"X 11 Windowing System");
437         lpDisplayDevice->StateFlags =
438                         DISPLAY_DEVICE_ATTACHED_TO_DESKTOP      |
439                         DISPLAY_DEVICE_PRIMARY_DEVICE           |
440                         DISPLAY_DEVICE_VGA_COMPATIBLE;
441         return TRUE;
442 }
443
444 /***********************************************************************
445  *              EnumDisplayDevicesW (USER32.@)
446  */
447 BOOL WINAPI EnumDisplayDevicesW(
448         LPVOID unused,DWORD i,LPDISPLAY_DEVICEW lpDisplayDevice,DWORD dwFlags
449 ) {
450         if (i)
451                 return FALSE;
452         FIXME_(system)("(%p,%ld,%p,0x%08lx), stub!\n",unused,i,lpDisplayDevice,dwFlags);
453         MultiByteToWideChar( CP_ACP, 0, "X11", -1, lpDisplayDevice->DeviceName,
454                              sizeof(lpDisplayDevice->DeviceName)/sizeof(WCHAR) );
455         MultiByteToWideChar( CP_ACP, 0, "X11 Windowing System", -1, lpDisplayDevice->DeviceString,
456                              sizeof(lpDisplayDevice->DeviceString)/sizeof(WCHAR) );
457         lpDisplayDevice->StateFlags =
458                         DISPLAY_DEVICE_ATTACHED_TO_DESKTOP      |
459                         DISPLAY_DEVICE_PRIMARY_DEVICE           |
460                         DISPLAY_DEVICE_VGA_COMPATIBLE;
461         return TRUE;
462 }
463
464 /***********************************************************************
465  *              SetEventHook (USER.321)
466  *
467  *      Used by Turbo Debugger for Windows
468  */
469 FARPROC16 WINAPI SetEventHook16(FARPROC16 lpfnEventHook)
470 {
471         FIXME_(hook)("(lpfnEventHook=%08x): stub\n", (UINT)lpfnEventHook);
472         return NULL;
473 }
474
475 /***********************************************************************
476  *              UserSeeUserDo (USER.216)
477  */
478 DWORD WINAPI UserSeeUserDo16(WORD wReqType, WORD wParam1, WORD wParam2, WORD wParam3)
479 {
480     switch (wReqType)
481     {
482     case USUD_LOCALALLOC:
483         return LOCAL_Alloc(USER_HeapSel, wParam1, wParam3);
484     case USUD_LOCALFREE:
485         return LOCAL_Free(USER_HeapSel, wParam1);
486     case USUD_LOCALCOMPACT:
487         return LOCAL_Compact(USER_HeapSel, wParam3, 0);
488     case USUD_LOCALHEAP:
489         return USER_HeapSel;
490     case USUD_FIRSTCLASS:
491         FIXME_(local)("return a pointer to the first window class.\n"); 
492         return (DWORD)-1;
493     default:
494         WARN_(local)("wReqType %04x (unknown)", wReqType);
495         return (DWORD)-1;
496     }
497 }
498
499 /***********************************************************************
500  *              GetSystemDebugState (USER.231)
501  */
502 WORD WINAPI GetSystemDebugState16(void)
503 {
504     return 0;  /* FIXME */
505 }
506
507 /***********************************************************************
508  *              RegisterLogonProcess (USER32.@)
509  */
510 DWORD WINAPI RegisterLogonProcess(HANDLE hprocess,BOOL x) {
511         FIXME_(win32)("(%d,%d),stub!\n",hprocess,x);
512         return 1;
513 }
514
515 /***********************************************************************
516  *              CreateWindowStationW (USER32.@)
517  */
518 HWINSTA WINAPI CreateWindowStationW(
519         LPWSTR winstation,DWORD res1,DWORD desiredaccess,
520         LPSECURITY_ATTRIBUTES lpsa
521 ) {
522         FIXME_(win32)("(%s,0x%08lx,0x%08lx,%p),stub!\n",debugstr_w(winstation),
523                 res1,desiredaccess,lpsa
524         );
525         return (HWINSTA)0xdeadcafe;
526 }
527
528 /***********************************************************************
529  *              SetProcessWindowStation (USER32.@)
530  */
531 BOOL WINAPI SetProcessWindowStation(HWINSTA hWinSta) {
532         FIXME_(win32)("(%d),stub!\n",hWinSta);
533         return TRUE;
534 }
535
536 /***********************************************************************
537  *              SetUserObjectSecurity (USER32.@)
538  */
539 BOOL WINAPI SetUserObjectSecurity(
540         HANDLE hObj,
541         PSECURITY_INFORMATION pSIRequested,
542         PSECURITY_DESCRIPTOR pSID
543 ) {
544         FIXME_(win32)("(0x%08x,%p,%p),stub!\n",hObj,pSIRequested,pSID);
545         return TRUE;
546 }
547
548 /***********************************************************************
549  *              CreateDesktopA (USER32.@)
550  */
551 HDESK WINAPI CreateDesktopA(
552         LPSTR lpszDesktop,LPSTR lpszDevice,LPDEVMODEA pDevmode,
553         DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa
554 ) {
555         FIXME_(win32)("(%s,%s,%p,0x%08lx,0x%08lx,%p),stub!\n",
556                 lpszDesktop,lpszDevice,pDevmode,
557                 dwFlags,dwDesiredAccess,lpsa
558         );
559         return (HDESK)0xcafedead;
560 }
561
562 /***********************************************************************
563  *              CreateDesktopW (USER32.@)
564  */
565 HDESK WINAPI CreateDesktopW(
566         LPWSTR lpszDesktop,LPWSTR lpszDevice,LPDEVMODEW pDevmode,
567         DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa
568 ) {
569         FIXME_(win32)("(%s,%s,%p,0x%08lx,0x%08lx,%p),stub!\n",
570                 debugstr_w(lpszDesktop),debugstr_w(lpszDevice),pDevmode,
571                 dwFlags,dwDesiredAccess,lpsa
572         );
573         return (HDESK)0xcafedead;
574 }
575
576 /***********************************************************************
577  *              EnumDesktopWindows (USER32.@)
578  */
579 BOOL WINAPI EnumDesktopWindows( HDESK hDesktop, WNDENUMPROC lpfn, LPARAM lParam ) {
580   FIXME_(win32)("(0x%08x, %p, 0x%08lx), stub!\n", hDesktop, lpfn, lParam );
581   return TRUE;
582 }
583
584
585 /***********************************************************************
586  *              CloseWindowStation (USER32.@)
587  */
588 BOOL WINAPI CloseWindowStation(HWINSTA hWinSta)
589 {
590     FIXME_(win32)("(0x%08x)\n", hWinSta);
591     return TRUE;
592 }
593
594 /***********************************************************************
595  *              CloseDesktop (USER32.@)
596  */
597 BOOL WINAPI CloseDesktop(HDESK hDesk)
598 {
599     FIXME_(win32)("(0x%08x)\n", hDesk);
600     return TRUE;
601 }
602
603 /***********************************************************************
604  *              SetWindowStationUser (USER32.@)
605  */
606 DWORD WINAPI SetWindowStationUser(DWORD x1,DWORD x2) {
607         FIXME_(win32)("(0x%08lx,0x%08lx),stub!\n",x1,x2);
608         return 1;
609 }
610
611 /***********************************************************************
612  *              SetLogonNotifyWindow (USER32.@)
613  */
614 DWORD WINAPI SetLogonNotifyWindow(HWINSTA hwinsta,HWND hwnd) {
615         FIXME_(win32)("(0x%x,%04x),stub!\n",hwinsta,hwnd);
616         return 1;
617 }
618
619 /***********************************************************************
620  *              LoadLocalFonts (USER32.@)
621  */
622 VOID WINAPI LoadLocalFonts(VOID) {
623         /* are loaded. */
624         return;
625 }
626 /***********************************************************************
627  *              GetUserObjectInformationA (USER32.@)
628  */
629 BOOL WINAPI GetUserObjectInformationA( HANDLE hObj, INT nIndex, LPVOID pvInfo, DWORD nLength, LPDWORD lpnLen )
630 {       FIXME_(win32)("(0x%x %i %p %ld %p),stub!\n", hObj, nIndex, pvInfo, nLength, lpnLen );
631         return TRUE;
632 }
633 /***********************************************************************
634  *              GetUserObjectInformationW (USER32.@)
635  */
636 BOOL WINAPI GetUserObjectInformationW( HANDLE hObj, INT nIndex, LPVOID pvInfo, DWORD nLength, LPDWORD lpnLen )
637 {       FIXME_(win32)("(0x%x %i %p %ld %p),stub!\n", hObj, nIndex, pvInfo, nLength, lpnLen );
638         return TRUE;
639 }
640 /***********************************************************************
641  *              GetUserObjectSecurity (USER32.@)
642  */
643 BOOL WINAPI GetUserObjectSecurity(HANDLE hObj, PSECURITY_INFORMATION pSIRequested,
644         PSECURITY_DESCRIPTOR pSID, DWORD nLength, LPDWORD lpnLengthNeeded)
645 {       FIXME_(win32)("(0x%x %p %p len=%ld %p),stub!\n",  hObj, pSIRequested, pSID, nLength, lpnLengthNeeded);
646         return TRUE;
647 }
648
649 /***********************************************************************
650  *              SetSystemCursor (USER32.@)
651  */
652 BOOL WINAPI SetSystemCursor(HCURSOR hcur, DWORD id)
653 {       FIXME_(win32)("(%08x,%08lx),stub!\n",  hcur, id);
654         return TRUE;
655 }
656
657 /***********************************************************************
658  *              RegisterSystemThread (USER32.@)
659  */
660 void WINAPI RegisterSystemThread(DWORD flags, DWORD reserved)
661 {
662         FIXME_(win32)("(%08lx, %08lx)\n", flags, reserved);
663 }
664
665 /***********************************************************************
666  *              RegisterDeviceNotificationA (USER32.@)
667  */
668 HDEVNOTIFY WINAPI RegisterDeviceNotificationA(
669         HANDLE hnd, LPVOID notifyfilter, DWORD flags
670 ) {
671         FIXME_(win32)("(hwnd=%08x, filter=%p,flags=0x%08lx), STUB!\n",
672                 hnd,notifyfilter,flags
673         );
674         return 0;
675 }