4 * Copyright 1995 Thomas Sandford
5 * Copyright 1997 Marcus Meissner
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "wine/windef16.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(win
);
35 /* USER signal proc flags and codes */
36 /* See UserSignalProc for comments */
37 #define USIG_FLAGS_WIN32 0x0001
38 #define USIG_FLAGS_GUI 0x0002
39 #define USIG_FLAGS_FEEDBACK 0x0004
40 #define USIG_FLAGS_FAULT 0x0008
42 #define USIG_DLL_UNLOAD_WIN16 0x0001
43 #define USIG_DLL_UNLOAD_WIN32 0x0002
44 #define USIG_FAULT_DIALOG_PUSH 0x0003
45 #define USIG_FAULT_DIALOG_POP 0x0004
46 #define USIG_DLL_UNLOAD_ORPHANS 0x0005
47 #define USIG_THREAD_INIT 0x0010
48 #define USIG_THREAD_EXIT 0x0020
49 #define USIG_PROCESS_CREATE 0x0100
50 #define USIG_PROCESS_INIT 0x0200
51 #define USIG_PROCESS_EXIT 0x0300
52 #define USIG_PROCESS_DESTROY 0x0400
53 #define USIG_PROCESS_RUNNING 0x0500
54 #define USIG_PROCESS_LOADED 0x0600
57 /***********************************************************************
58 * SignalProc32 (USER.391)
59 * UserSignalProc (USER32.@)
61 * The exact meaning of the USER signals is undocumented, but this
62 * should cover the basic idea:
64 * USIG_DLL_UNLOAD_WIN16
65 * This is sent when a 16-bit module is unloaded.
67 * USIG_DLL_UNLOAD_WIN32
68 * This is sent when a 32-bit module is unloaded.
70 * USIG_DLL_UNLOAD_ORPHANS
71 * This is sent after the last Win3.1 module is unloaded,
72 * to allow removal of orphaned menus.
74 * USIG_FAULT_DIALOG_PUSH
75 * USIG_FAULT_DIALOG_POP
76 * These are called to allow USER to prepare for displaying a
77 * fault dialog, even though the fault might have happened while
78 * inside a USER critical section.
81 * This is called from the context of a new thread, as soon as it
85 * This is called, still in its context, just before a thread is
89 * This is called, in the parent process context, after a new process
93 * This is called in the new process context, just after the main thread
94 * has started execution (after the main thread's USIG_THREAD_INIT has
98 * This is called after the executable file has been loaded into the
99 * new process context.
101 * USIG_PROCESS_RUNNING
102 * This is called immediately before the main entry point is called.
105 * This is called in the context of a process that is about to
106 * terminate (but before the last thread's USIG_THREAD_EXIT has
109 * USIG_PROCESS_DESTROY
110 * This is called after a process has terminated.
113 * The meaning of the dwFlags bits is as follows:
116 * Current process is 32-bit.
119 * Current process is a (Win32) GUI process.
121 * USIG_FLAGS_FEEDBACK
122 * Current process needs 'feedback' (determined from the STARTUPINFO
123 * flags STARTF_FORCEONFEEDBACK / STARTF_FORCEOFFFEEDBACK).
126 * The signal is being sent due to a fault.
128 WORD WINAPI
UserSignalProc( UINT uCode
, DWORD dwThreadOrProcessID
,
129 DWORD dwFlags
, HMODULE16 hModule
)
131 FIXME("(%04x, %08lx, %04lx, %04x)\n",
132 uCode
, dwThreadOrProcessID
, dwFlags
, hModule
);
133 /* FIXME: Should chain to GdiSignalProc now. */
138 /* callback to allow EnumDesktopsA to use EnumDesktopsW */
140 DESKTOPENUMPROCA lpEnumFunc
;
142 } ENUMDESKTOPS_LPARAM
;
144 /* EnumDesktopsA passes this callback function to EnumDesktopsW.
145 * It simply converts the string to ASCII and calls the callback
146 * function provided by the original caller
148 static BOOL CALLBACK
EnumDesktopProcWtoA(LPWSTR lpszDesktop
, LPARAM lParam
)
153 ENUMDESKTOPS_LPARAM
*data
= (ENUMDESKTOPS_LPARAM
*)lParam
;
155 len
= WideCharToMultiByte(CP_ACP
, 0, lpszDesktop
, -1, NULL
, 0, NULL
, NULL
);
156 if (!(buffer
= HeapAlloc( GetProcessHeap(), 0, len
))) return FALSE
;
157 WideCharToMultiByte(CP_ACP
, 0, lpszDesktop
, -1, buffer
, len
, NULL
, NULL
);
159 ret
= data
->lpEnumFunc(buffer
, data
->lParam
);
161 HeapFree(GetProcessHeap(), 0, buffer
);
165 /**********************************************************************
166 * SetLastErrorEx [USER32.@]
168 * Sets the last-error code.
173 void WINAPI
SetLastErrorEx(
174 DWORD error
, /* [in] Per-thread error code */
175 DWORD type
) /* [in] Error type */
177 TRACE("(0x%08lx, 0x%08lx)\n", error
,type
);
184 /* Fall through for now */
186 FIXME("(error=%08lx, type=%08lx): Unhandled type\n", error
,type
);
189 SetLastError( error
);
192 /******************************************************************************
193 * GetAltTabInfoA [USER32.@]
195 BOOL WINAPI
GetAltTabInfoA(HWND hwnd
, int iItem
, PALTTABINFO pati
, LPSTR pszItemText
, UINT cchItemText
)
197 FIXME("(%p, 0x%08x, %p, %p, 0x%08x)\n", hwnd
, iItem
, pati
, pszItemText
, cchItemText
);
201 /******************************************************************************
202 * GetAltTabInfoW [USER32.@]
204 BOOL WINAPI
GetAltTabInfoW(HWND hwnd
, int iItem
, PALTTABINFO pati
, LPWSTR pszItemText
, UINT cchItemText
)
206 FIXME("(%p, 0x%08x, %p, %p, 0x%08x)\n", hwnd
, iItem
, pati
, pszItemText
, cchItemText
);
210 /******************************************************************************
211 * GetProcessWindowStation [USER32.@]
213 * Returns handle of window station
216 * Docs say the return value is HWINSTA
219 * Success: Handle to window station associated with calling process
222 HWINSTA WINAPI
GetProcessWindowStation(void)
224 FIXME("(void): stub\n");
229 /******************************************************************************
230 * GetThreadDesktop [USER32.@]
232 * Returns handle to desktop
235 * dwThreadId [I] Thread identifier
238 * Success: Handle to desktop associated with specified thread
241 HDESK WINAPI
GetThreadDesktop( DWORD dwThreadId
)
243 FIXME("(%lx): stub\n",dwThreadId
);
248 /******************************************************************************
249 * SetDebugErrorLevel [USER32.@]
250 * Sets the minimum error level for generating debugging events
253 * dwLevel [I] Debugging error level
255 VOID WINAPI
SetDebugErrorLevel( DWORD dwLevel
)
257 FIXME("(%ld): stub\n", dwLevel
);
261 /******************************************************************************
262 * GetProcessDefaultLayout [USER32.@]
264 * Gets the default layout for parentless windows.
265 * Right now, just returns 0 (left-to-right).
274 BOOL WINAPI
GetProcessDefaultLayout( DWORD
*pdwDefaultLayout
)
276 if ( !pdwDefaultLayout
) {
277 SetLastError( ERROR_INVALID_PARAMETER
);
280 FIXME( "( %p ): No BiDi\n", pdwDefaultLayout
);
281 *pdwDefaultLayout
= 0;
286 /******************************************************************************
287 * SetProcessDefaultLayout [USER32.@]
289 * Sets the default layout for parentless windows.
290 * Right now, only accepts 0 (left-to-right).
299 BOOL WINAPI
SetProcessDefaultLayout( DWORD dwDefaultLayout
)
301 if ( dwDefaultLayout
== 0 )
303 FIXME( "( %08lx ): No BiDi\n", dwDefaultLayout
);
304 SetLastError( ERROR_CALL_NOT_IMPLEMENTED
);
309 /***********************************************************************
310 * CreateDesktopA (USER32.@)
312 HDESK WINAPI
CreateDesktopA( LPSTR lpszDesktop
,LPSTR lpszDevice
,LPDEVMODEA pDevmode
,
313 DWORD dwFlags
,DWORD dwDesiredAccess
,LPSECURITY_ATTRIBUTES lpsa
)
315 FIXME("(%s,%s,%p,0x%08lx,0x%08lx,%p),stub!\n", lpszDesktop
,lpszDevice
,pDevmode
,
316 dwFlags
,dwDesiredAccess
,lpsa
);
317 return (HDESK
)0xcafedead;
320 /***********************************************************************
321 * CreateDesktopW (USER32.@)
323 HDESK WINAPI
CreateDesktopW( LPWSTR lpszDesktop
,LPWSTR lpszDevice
,LPDEVMODEW pDevmode
,
324 DWORD dwFlags
,DWORD dwDesiredAccess
,LPSECURITY_ATTRIBUTES lpsa
)
326 FIXME("(%s,%s,%p,0x%08lx,0x%08lx,%p),stub!\n",
327 debugstr_w(lpszDesktop
),debugstr_w(lpszDevice
),pDevmode
,
328 dwFlags
,dwDesiredAccess
,lpsa
);
329 return (HDESK
)0xcafedead;
332 /******************************************************************************
333 * OpenDesktopA [USER32.@]
335 * Not supported on Win9x - returns NULL and calls SetLastError.
337 HDESK WINAPI
OpenDesktopA( LPCSTR lpszDesktop
, DWORD dwFlags
,
338 BOOL fInherit
, DWORD dwDesiredAccess
)
340 FIXME("(%s,%lx,%i,%lx): stub\n",debugstr_a(lpszDesktop
),dwFlags
,
341 fInherit
,dwDesiredAccess
);
343 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
347 /******************************************************************************
348 * OpenInputDesktop [USER32.@]
350 * Not supported on Win9x - returns NULL and calls SetLastError.
352 HDESK WINAPI
OpenInputDesktop( DWORD dwFlags
, BOOL fInherit
, ACCESS_MASK dwDesiredAccess
)
354 FIXME("(%lx,%i,%lx): stub\n",dwFlags
, fInherit
,dwDesiredAccess
);
355 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
359 /***********************************************************************
360 * CloseDesktop (USER32.@)
362 BOOL WINAPI
CloseDesktop(HDESK hDesk
)
364 FIXME("(%p)\n", hDesk
);
368 /******************************************************************************
369 * EnumDesktopsA [USER32.@]
371 BOOL WINAPI
EnumDesktopsA( HWINSTA hwinsta
, DESKTOPENUMPROCA lpEnumFunc
,
374 ENUMDESKTOPS_LPARAM caller_data
;
376 caller_data
.lpEnumFunc
= lpEnumFunc
;
377 caller_data
.lParam
= lParam
;
379 return EnumDesktopsW(hwinsta
, EnumDesktopProcWtoA
, (LPARAM
) &caller_data
);
382 /******************************************************************************
383 * EnumDesktopsW [USER32.@]
385 BOOL WINAPI
EnumDesktopsW( HWINSTA hwinsta
, DESKTOPENUMPROCW lpEnumFunc
,
388 FIXME("%p,%p,%lx): stub\n",hwinsta
,lpEnumFunc
,lParam
);
389 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
393 /***********************************************************************
394 * EnumDesktopWindows (USER32.@)
396 BOOL WINAPI
EnumDesktopWindows( HDESK hDesktop
, WNDENUMPROC lpfn
, LPARAM lParam
)
398 FIXME("(%p, %p, 0x%08lx), stub!\n", hDesktop
, lpfn
, lParam
);
402 /***********************************************************************
403 * CreateWindowStationW (USER32.@)
405 HWINSTA WINAPI
CreateWindowStationW( LPWSTR winstation
,DWORD res1
,DWORD desiredaccess
,
406 LPSECURITY_ATTRIBUTES lpsa
)
408 FIXME("(%s,0x%08lx,0x%08lx,%p),stub!\n",debugstr_w(winstation
), res1
,desiredaccess
,lpsa
);
409 return (HWINSTA
)0xdeadcafe;
412 /***********************************************************************
413 * CloseWindowStation (USER32.@)
415 BOOL WINAPI
CloseWindowStation(HWINSTA hWinSta
)
417 FIXME("(%p)\n", hWinSta
);
421 /***********************************************************************
422 * SetWindowStationUser (USER32.@)
424 DWORD WINAPI
SetWindowStationUser(DWORD x1
,DWORD x2
)
426 FIXME("(0x%08lx,0x%08lx),stub!\n",x1
,x2
);
430 /***********************************************************************
431 * SetProcessWindowStation (USER32.@)
433 BOOL WINAPI
SetProcessWindowStation(HWINSTA hWinSta
)
435 FIXME("(%p),stub!\n",hWinSta
);
439 /******************************************************************************
440 * EnumWindowStationsA [USER32.@]
442 BOOL WINAPI
EnumWindowStationsA( WINSTAENUMPROCA lpEnumFunc
, LPARAM lParam
)
444 FIXME("%p,%lx): stub\n",lpEnumFunc
,lParam
);
445 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
449 /******************************************************************************
450 * EnumWindowStationsW [USER32.@]
452 BOOL WINAPI
EnumWindowStationsW( WINSTAENUMPROCW lpEnumFunc
, LPARAM lParam
)
454 FIXME("%p,%lx): stub\n",lpEnumFunc
,lParam
);
455 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
459 /***********************************************************************
460 * GetUserObjectInformationA (USER32.@)
462 BOOL WINAPI
GetUserObjectInformationA( HANDLE hObj
, INT nIndex
, LPVOID pvInfo
, DWORD nLength
, LPDWORD lpnLen
)
464 FIXME("(%p %i %p %ld %p),stub!\n", hObj
, nIndex
, pvInfo
, nLength
, lpnLen
);
468 /***********************************************************************
469 * GetUserObjectInformationW (USER32.@)
471 BOOL WINAPI
GetUserObjectInformationW( HANDLE hObj
, INT nIndex
, LPVOID pvInfo
, DWORD nLength
, LPDWORD lpnLen
)
473 FIXME("(%p %i %p %ld %p),stub!\n", hObj
, nIndex
, pvInfo
, nLength
, lpnLen
);
477 /******************************************************************************
478 * SetUserObjectInformationA (USER32.@)
480 BOOL WINAPI
SetUserObjectInformationA( HANDLE hObj
, INT nIndex
,
481 LPVOID pvInfo
, DWORD nLength
)
483 FIXME("(%p,%d,%p,%lx): stub\n",hObj
,nIndex
,pvInfo
,nLength
);
487 /***********************************************************************
488 * GetUserObjectSecurity (USER32.@)
490 BOOL WINAPI
GetUserObjectSecurity(HANDLE hObj
, PSECURITY_INFORMATION pSIRequested
,
491 PSECURITY_DESCRIPTOR pSID
, DWORD nLength
, LPDWORD lpnLengthNeeded
)
493 FIXME("(%p %p %p len=%ld %p),stub!\n", hObj
, pSIRequested
, pSID
, nLength
, lpnLengthNeeded
);
497 /***********************************************************************
498 * SetUserObjectSecurity (USER32.@)
500 BOOL WINAPI
SetUserObjectSecurity( HANDLE hObj
, PSECURITY_INFORMATION pSIRequested
,
501 PSECURITY_DESCRIPTOR pSID
)
503 FIXME("(%p,%p,%p),stub!\n",hObj
,pSIRequested
,pSID
);
507 /******************************************************************************
508 * SetThreadDesktop (USER32.@)
510 BOOL WINAPI
SetThreadDesktop( HANDLE hDesktop
)
512 FIXME("(%p): stub\n",hDesktop
);
516 /***********************************************************************
517 * RegisterLogonProcess (USER32.@)
519 DWORD WINAPI
RegisterLogonProcess(HANDLE hprocess
,BOOL x
)
521 FIXME("(%p,%d),stub!\n",hprocess
,x
);
525 /***********************************************************************
526 * SetLogonNotifyWindow (USER32.@)
528 DWORD WINAPI
SetLogonNotifyWindow(HWINSTA hwinsta
,HWND hwnd
)
530 FIXME("(%p,%p),stub!\n",hwinsta
,hwnd
);
534 /***********************************************************************
535 * EnumDisplayDevicesA (USER32.@)
537 BOOL WINAPI
EnumDisplayDevicesA( LPVOID unused
, DWORD i
, LPDISPLAY_DEVICEA lpDisplayDevice
,
542 FIXME("(%p,%ld,%p,0x%08lx), stub!\n",unused
,i
,lpDisplayDevice
,dwFlags
);
543 strcpy(lpDisplayDevice
->DeviceName
,"X11");
544 strcpy(lpDisplayDevice
->DeviceString
,"X 11 Windowing System");
545 lpDisplayDevice
->StateFlags
=
546 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
|
547 DISPLAY_DEVICE_PRIMARY_DEVICE
|
548 DISPLAY_DEVICE_VGA_COMPATIBLE
;
552 /***********************************************************************
553 * EnumDisplayDevicesW (USER32.@)
555 BOOL WINAPI
EnumDisplayDevicesW( LPVOID unused
, DWORD i
, LPDISPLAY_DEVICEW lpDisplayDevice
,
560 FIXME("(%p,%ld,%p,0x%08lx), stub!\n",unused
,i
,lpDisplayDevice
,dwFlags
);
561 MultiByteToWideChar( CP_ACP
, 0, "X11", -1, lpDisplayDevice
->DeviceName
,
562 sizeof(lpDisplayDevice
->DeviceName
)/sizeof(WCHAR
) );
563 MultiByteToWideChar( CP_ACP
, 0, "X11 Windowing System", -1, lpDisplayDevice
->DeviceString
,
564 sizeof(lpDisplayDevice
->DeviceString
)/sizeof(WCHAR
) );
565 lpDisplayDevice
->StateFlags
=
566 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
|
567 DISPLAY_DEVICE_PRIMARY_DEVICE
|
568 DISPLAY_DEVICE_VGA_COMPATIBLE
;
572 /***********************************************************************
573 * RegisterSystemThread (USER32.@)
575 void WINAPI
RegisterSystemThread(DWORD flags
, DWORD reserved
)
577 FIXME("(%08lx, %08lx)\n", flags
, reserved
);
580 /***********************************************************************
581 * RegisterShellHookWindow [USER32.@]
583 BOOL WINAPI
RegisterShellHookWindow ( HWND hWnd
)
585 FIXME("(%p): stub\n", hWnd
);
590 /***********************************************************************
591 * DeregisterShellHookWindow [USER32.@]
593 HRESULT WINAPI
DeregisterShellHookWindow ( DWORD u
)
595 FIXME("0x%08lx stub\n",u
);
601 /***********************************************************************
602 * RegisterTasklist [USER32.@]
604 DWORD WINAPI
RegisterTasklist (DWORD x
)
606 FIXME("0x%08lx\n",x
);
611 /***********************************************************************
612 * RegisterDeviceNotificationA (USER32.@)
614 * See RegisterDeviceNotificationW.
616 HDEVNOTIFY WINAPI
RegisterDeviceNotificationA(HANDLE hnd
, LPVOID notifyfilter
, DWORD flags
)
618 FIXME("(hwnd=%p, filter=%p,flags=0x%08lx), STUB!\n", hnd
,notifyfilter
,flags
);
622 /***********************************************************************
623 * RegisterDeviceNotificationW (USER32.@)
625 * Registers a window with the system so that it will receive
626 * notifications about a device.
629 * hRecepient [I] Window or service status handle that
630 * will receive notifications.
631 * pNotificationFilter [I] DEV_BROADCAST_HDR followed by some
632 * type-specific data.
633 * dwFlags [I] See notes
637 * A handle to the device notification.
641 * The dwFlags parameter can be one of two values:
642 *| DEVICE_NOTIFY_WINDOW_HANDLE - hRecepient is a window handle
643 *| DEVICE_NOTIFY_SERVICE_HANDLE - hRecepient is a service status handle
645 HDEVNOTIFY WINAPI
RegisterDeviceNotificationW(HANDLE hRecepient
, LPVOID pNotificationFilter
, DWORD dwFlags
)
647 FIXME("(hwnd=%p, filter=%p,flags=0x%08lx), STUB!\n", hRecepient
,pNotificationFilter
,dwFlags
);
651 /***********************************************************************
652 * GetAppCompatFlags (USER32.@)
654 DWORD WINAPI
GetAppCompatFlags( HTASK hTask
)
661 /***********************************************************************
662 * AlignRects (USER32.@)
664 BOOL WINAPI
AlignRects(LPRECT rect
, DWORD b
, DWORD c
, DWORD d
)
666 FIXME("(%p, %ld, %ld, %ld): stub\n", rect
, b
, c
, d
);
668 FIXME("rect: [[%ld, %ld], [%ld, %ld]]\n", rect
->left
, rect
->top
, rect
->right
, rect
->bottom
);
669 /* Calls OffsetRect */
674 /***********************************************************************
675 * LoadLocalFonts (USER32.@)
677 VOID WINAPI
LoadLocalFonts(VOID
)
684 /***********************************************************************
685 * USER_489 (USER.489)
687 LONG WINAPI
stub_USER_489(void) { FIXME("stub\n"); return 0; }
689 /***********************************************************************
690 * USER_490 (USER.490)
692 LONG WINAPI
stub_USER_490(void) { FIXME("stub\n"); return 0; }
694 /***********************************************************************
695 * USER_492 (USER.492)
697 LONG WINAPI
stub_USER_492(void) { FIXME("stub\n"); return 0; }
699 /***********************************************************************
700 * USER_496 (USER.496)
702 LONG WINAPI
stub_USER_496(void) { FIXME("stub\n"); return 0; }
704 /***********************************************************************
705 * User32InitializeImmEntryTable
707 BOOL WINAPI
User32InitializeImmEntryTable(LPVOID ptr
)
709 FIXME("(%p): stub\n", ptr
);
713 /**********************************************************************
714 * WINNLSGetIMEHotkey [USER32.@]
717 UINT WINAPI
WINNLSGetIMEHotkey(HWND hUnknown1
)
719 FIXME("hUnknown1 %p: stub!\n", hUnknown1
);
720 return 0; /* unknown */
723 /**********************************************************************
724 * WINNLSEnableIME [USER32.@]
727 BOOL WINAPI
WINNLSEnableIME(HWND hUnknown1
, BOOL bUnknown2
)
729 FIXME("hUnknown1 %p bUnknown2 %d: stub!\n", hUnknown1
, bUnknown2
);
730 return TRUE
; /* success (?) */
733 /**********************************************************************
734 * WINNLSGetEnableStatus [USER32.@]
737 BOOL WINAPI
WINNLSGetEnableStatus(HWND hUnknown1
)
739 FIXME("hUnknown1 %p: stub!\n", hUnknown1
);
740 return TRUE
; /* success (?) */
743 /**********************************************************************
744 * SendIMEMessageExA [USER32.@]
747 LRESULT WINAPI
SendIMEMessageExA(HWND p1
, LPARAM p2
)
749 FIXME("(%p,%lx): stub\n", p1
, p2
);
750 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
754 /**********************************************************************
755 * SendIMEMessageExW [USER32.@]
758 LRESULT WINAPI
SendIMEMessageExW(HWND p1
, LPARAM p2
)
760 FIXME("(%p,%lx): stub\n", p1
, p2
);
761 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);