| /* |
| * Misc. USER functions |
| * |
| * Copyright 1993 Robert J. Amstadt |
| * 1996 Alex Korobka |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include "wine/winbase16.h" |
| #include "windef.h" |
| #include "wingdi.h" |
| #include "winuser.h" |
| #include "wine/winuser16.h" |
| #include "user.h" |
| #include "win.h" |
| #include "controls.h" |
| #include "cursoricon.h" |
| #include "message.h" |
| #include "local.h" |
| #include "module.h" |
| #include "winternl.h" |
| #include "wine/debug.h" |
| |
| WINE_DECLARE_DEBUG_CHANNEL(hook); |
| WINE_DECLARE_DEBUG_CHANNEL(local); |
| WINE_DECLARE_DEBUG_CHANNEL(system); |
| WINE_DECLARE_DEBUG_CHANNEL(win); |
| WINE_DECLARE_DEBUG_CHANNEL(win32); |
| |
| SYSLEVEL USER_SysLevel = { CRITICAL_SECTION_INIT("USER_SysLevel"), 2 }; |
| |
| |
| /*********************************************************************** |
| * GetFreeSystemResources (USER.284) |
| */ |
| WORD WINAPI GetFreeSystemResources16( WORD resType ) |
| { |
| HINSTANCE16 gdi_inst; |
| WORD gdi_heap; |
| int userPercent, gdiPercent; |
| |
| if ((gdi_inst = LoadLibrary16( "GDI" )) < 32) return 0; |
| gdi_heap = gdi_inst | 7; |
| |
| switch(resType) |
| { |
| case GFSR_USERRESOURCES: |
| userPercent = (int)LOCAL_CountFree( USER_HeapSel ) * 100 / |
| LOCAL_HeapSize( USER_HeapSel ); |
| gdiPercent = 100; |
| break; |
| |
| case GFSR_GDIRESOURCES: |
| gdiPercent = (int)LOCAL_CountFree( gdi_inst ) * 100 / |
| LOCAL_HeapSize( gdi_inst ); |
| userPercent = 100; |
| break; |
| |
| case GFSR_SYSTEMRESOURCES: |
| userPercent = (int)LOCAL_CountFree( USER_HeapSel ) * 100 / |
| LOCAL_HeapSize( USER_HeapSel ); |
| gdiPercent = (int)LOCAL_CountFree( gdi_inst ) * 100 / |
| LOCAL_HeapSize( gdi_inst ); |
| break; |
| |
| default: |
| userPercent = gdiPercent = 0; |
| break; |
| } |
| FreeLibrary16( gdi_inst ); |
| TRACE_(local)("<- userPercent %d, gdiPercent %d\n", userPercent, gdiPercent); |
| return (WORD)min( userPercent, gdiPercent ); |
| } |
| |
| |
| /********************************************************************** |
| * InitApp (USER.5) |
| */ |
| INT16 WINAPI InitApp16( HINSTANCE16 hInstance ) |
| { |
| /* Create task message queue */ |
| if ( !InitThreadInput16( 0, 0 ) ) return 0; |
| |
| return 1; |
| } |
| |
| |
| /*********************************************************************** |
| * USER_Lock |
| */ |
| void USER_Lock(void) |
| { |
| _EnterSysLevel( &USER_SysLevel ); |
| } |
| |
| |
| /*********************************************************************** |
| * USER_Unlock |
| */ |
| void USER_Unlock(void) |
| { |
| _LeaveSysLevel( &USER_SysLevel ); |
| } |
| |
| |
| /*********************************************************************** |
| * USER_CheckNotLock |
| * |
| * Make sure that we don't hold the user lock. |
| */ |
| void USER_CheckNotLock(void) |
| { |
| _CheckNotSysLevel( &USER_SysLevel ); |
| } |
| |
| |
| /********************************************************************** |
| * USER_ModuleUnload |
| */ |
| static void USER_ModuleUnload( HMODULE16 hModule ) |
| { |
| /* HOOK_FreeModuleHooks( hModule ); */ |
| CLASS_FreeModuleClasses( hModule ); |
| CURSORICON_FreeModuleIcons( hModule ); |
| } |
| |
| /*********************************************************************** |
| * SignalProc (USER.314) |
| */ |
| void WINAPI USER_SignalProc( HANDLE16 hTaskOrModule, UINT16 uCode, |
| UINT16 uExitFn, HINSTANCE16 hInstance, |
| HQUEUE16 hQueue ) |
| { |
| FIXME_(win)("Win 3.1 USER signal %04x\n", uCode ); |
| } |
| |
| /*********************************************************************** |
| * FinalUserInit (USER.400) |
| */ |
| void WINAPI FinalUserInit16( void ) |
| { |
| /* FIXME: Should chain to FinalGdiInit now. */ |
| } |
| |
| /*********************************************************************** |
| * SignalProc32 (USER.391) |
| * UserSignalProc (USER32.@) |
| * |
| * For comments about the meaning of uCode and dwFlags |
| * see PROCESS_CallUserSignalProc. |
| * |
| */ |
| WORD WINAPI UserSignalProc( UINT uCode, DWORD dwThreadOrProcessID, |
| DWORD dwFlags, HMODULE16 hModule ) |
| { |
| /* FIXME: Proper reaction to most signals still missing. */ |
| |
| switch ( uCode ) |
| { |
| case USIG_DLL_UNLOAD_WIN16: |
| case USIG_DLL_UNLOAD_WIN32: |
| USER_ModuleUnload( hModule ); |
| break; |
| |
| case USIG_DLL_UNLOAD_ORPHANS: |
| case USIG_FAULT_DIALOG_PUSH: |
| case USIG_FAULT_DIALOG_POP: |
| case USIG_THREAD_INIT: |
| case USIG_THREAD_EXIT: |
| case USIG_PROCESS_CREATE: |
| case USIG_PROCESS_INIT: |
| case USIG_PROCESS_LOADED: |
| case USIG_PROCESS_RUNNING: |
| case USIG_PROCESS_EXIT: |
| case USIG_PROCESS_DESTROY: |
| break; |
| |
| default: |
| FIXME_(win)("(%04x, %08lx, %04lx, %04x)\n", |
| uCode, dwThreadOrProcessID, dwFlags, hModule ); |
| break; |
| } |
| |
| /* FIXME: Should chain to GdiSignalProc now. */ |
| |
| return 0; |
| } |
| |
| /*********************************************************************** |
| * ExitWindows (USER.7) |
| */ |
| BOOL16 WINAPI ExitWindows16( DWORD dwReturnCode, UINT16 wReserved ) |
| { |
| return ExitWindowsEx( EWX_LOGOFF, 0xffffffff ); |
| } |
| |
| |
| /*********************************************************************** |
| * ExitWindowsExec (USER.246) |
| */ |
| BOOL16 WINAPI ExitWindowsExec16( LPCSTR lpszExe, LPCSTR lpszParams ) |
| { |
| TRACE_(system)("Should run the following in DOS-mode: \"%s %s\"\n", |
| lpszExe, lpszParams); |
| return ExitWindowsEx( EWX_LOGOFF, 0xffffffff ); |
| } |
| |
| |
| /*********************************************************************** |
| * ExitWindowsEx (USER32.@) |
| */ |
| BOOL WINAPI ExitWindowsEx( UINT flags, DWORD reserved ) |
| { |
| int i; |
| BOOL result; |
| HWND *list, *phwnd; |
| |
| /* We have to build a list of all windows first, as in EnumWindows */ |
| |
| if (!(list = WIN_ListChildren( GetDesktopWindow() ))) return FALSE; |
| |
| /* Send a WM_QUERYENDSESSION message to every window */ |
| |
| for (i = 0; list[i]; i++) |
| { |
| /* Make sure that the window still exists */ |
| if (!IsWindow( list[i] )) continue; |
| if (!SendMessageW( list[i], WM_QUERYENDSESSION, 0, 0 )) break; |
| } |
| result = !list[i]; |
| |
| /* Now notify all windows that got a WM_QUERYENDSESSION of the result */ |
| |
| for (phwnd = list; i > 0; i--, phwnd++) |
| { |
| if (!IsWindow( *phwnd )) continue; |
| SendMessageW( *phwnd, WM_ENDSESSION, result, 0 ); |
| } |
| HeapFree( GetProcessHeap(), 0, list ); |
| |
| if (result) ExitKernel16(); |
| return FALSE; |
| } |
| |
| /*********************************************************************** |
| * ChangeDisplaySettingsA (USER32.@) |
| */ |
| LONG WINAPI ChangeDisplaySettingsA( LPDEVMODEA devmode, DWORD flags ) |
| { |
| return ChangeDisplaySettingsExA(NULL,devmode,NULL,flags,NULL); |
| } |
| |
| /*********************************************************************** |
| * ChangeDisplaySettingsW (USER32.@) |
| */ |
| LONG WINAPI ChangeDisplaySettingsW( LPDEVMODEW devmode, DWORD flags ) |
| { |
| return ChangeDisplaySettingsExW(NULL,devmode,NULL,flags,NULL); |
| } |
| |
| /*********************************************************************** |
| * ChangeDisplaySettings (USER.620) |
| */ |
| LONG WINAPI ChangeDisplaySettings16( LPDEVMODEA devmode, DWORD flags ) |
| { |
| return ChangeDisplaySettingsA(devmode, flags); |
| } |
| |
| /*********************************************************************** |
| * ChangeDisplaySettingsExA (USER32.@) |
| */ |
| LONG WINAPI ChangeDisplaySettingsExA( |
| LPCSTR devname, LPDEVMODEA devmode, HWND hwnd, DWORD flags, |
| LPVOID lparam |
| ) { |
| DEVMODEW devmodeW; |
| LONG ret; |
| UNICODE_STRING nameW; |
| |
| if (devname) RtlCreateUnicodeStringFromAsciiz(&nameW, devname); |
| else nameW.Buffer = NULL; |
| |
| if (devmode) |
| { |
| devmodeW.dmBitsPerPel = devmode->dmBitsPerPel; |
| devmodeW.dmPelsHeight = devmode->dmPelsHeight; |
| devmodeW.dmPelsWidth = devmode->dmPelsWidth; |
| devmodeW.dmDisplayFlags = devmode->dmDisplayFlags; |
| devmodeW.dmDisplayFrequency = devmode->dmDisplayFrequency; |
| devmodeW.dmFields = devmode->dmFields; |
| ret = ChangeDisplaySettingsExW(nameW.Buffer, &devmodeW, hwnd, flags, lparam); |
| } |
| else |
| { |
| ret = ChangeDisplaySettingsExW(nameW.Buffer, NULL, hwnd, flags, lparam); |
| } |
| |
| if (devname) RtlFreeUnicodeString(&nameW); |
| return ret; |
| } |
| |
| /*********************************************************************** |
| * ChangeDisplaySettingsExW (USER32.@) |
| */ |
| LONG WINAPI ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, HWND hwnd, |
| DWORD flags, LPVOID lparam ) |
| { |
| /* Pass the request on to the driver */ |
| if (!USER_Driver.pChangeDisplaySettingsExW) return DISP_CHANGE_FAILED; |
| return USER_Driver.pChangeDisplaySettingsExW( devname, devmode, hwnd, flags, lparam ); |
| } |
| |
| /*********************************************************************** |
| * EnumDisplaySettingsW (USER32.@) |
| * |
| * RETURNS |
| * TRUE if nth setting exists found (described in the LPDEVMODEW struct) |
| * FALSE if we do not have the nth setting |
| */ |
| BOOL WINAPI EnumDisplaySettingsW( |
| LPCWSTR name, /* [in] huh? */ |
| DWORD n, /* [in] nth entry in display settings list*/ |
| LPDEVMODEW devmode /* [out] devmode for that setting */ |
| ) { |
| return EnumDisplaySettingsExW(name, n, devmode, 0); |
| } |
| |
| /*********************************************************************** |
| * EnumDisplaySettingsA (USER32.@) |
| */ |
| BOOL WINAPI EnumDisplaySettingsA(LPCSTR name,DWORD n,LPDEVMODEA devmode) |
| { |
| return EnumDisplaySettingsExA(name, n, devmode, 0); |
| } |
| |
| /*********************************************************************** |
| * EnumDisplaySettings (USER.621) |
| */ |
| BOOL16 WINAPI EnumDisplaySettings16( |
| LPCSTR name, /* [in] huh? */ |
| DWORD n, /* [in] nth entry in display settings list*/ |
| LPDEVMODEA devmode /* [out] devmode for that setting */ |
| ) { |
| return (BOOL16)EnumDisplaySettingsA(name, n, devmode); |
| } |
| |
| /*********************************************************************** |
| * EnumDisplaySettingsExA (USER32.@) |
| */ |
| BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum, |
| LPDEVMODEA lpDevMode, DWORD dwFlags) |
| { |
| DEVMODEW devmodeW; |
| BOOL ret; |
| UNICODE_STRING nameW; |
| |
| if (lpszDeviceName) RtlCreateUnicodeStringFromAsciiz(&nameW, lpszDeviceName); |
| else nameW.Buffer = NULL; |
| |
| ret = EnumDisplaySettingsExW(nameW.Buffer,iModeNum,&devmodeW,dwFlags); |
| if (ret) |
| { |
| lpDevMode->dmBitsPerPel = devmodeW.dmBitsPerPel; |
| lpDevMode->dmPelsHeight = devmodeW.dmPelsHeight; |
| lpDevMode->dmPelsWidth = devmodeW.dmPelsWidth; |
| lpDevMode->dmDisplayFlags = devmodeW.dmDisplayFlags; |
| lpDevMode->dmDisplayFrequency = devmodeW.dmDisplayFrequency; |
| lpDevMode->dmFields = devmodeW.dmFields; |
| } |
| if (lpszDeviceName) RtlFreeUnicodeString(&nameW); |
| return ret; |
| } |
| |
| /*********************************************************************** |
| * EnumDisplaySettingsExW (USER32.@) |
| */ |
| BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum, |
| LPDEVMODEW lpDevMode, DWORD dwFlags) |
| { |
| /* Pass the request on to the driver */ |
| if (!USER_Driver.pEnumDisplaySettingsExW) return FALSE; |
| return USER_Driver.pEnumDisplaySettingsExW(lpszDeviceName, iModeNum, lpDevMode, dwFlags); |
| } |
| |
| /*********************************************************************** |
| * EnumDisplayDevicesA (USER32.@) |
| */ |
| BOOL WINAPI EnumDisplayDevicesA( |
| LPVOID unused,DWORD i,LPDISPLAY_DEVICEA lpDisplayDevice,DWORD dwFlags |
| ) { |
| if (i) |
| return FALSE; |
| FIXME_(system)("(%p,%ld,%p,0x%08lx), stub!\n",unused,i,lpDisplayDevice,dwFlags); |
| strcpy(lpDisplayDevice->DeviceName,"X11"); |
| strcpy(lpDisplayDevice->DeviceString,"X 11 Windowing System"); |
| lpDisplayDevice->StateFlags = |
| DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | |
| DISPLAY_DEVICE_PRIMARY_DEVICE | |
| DISPLAY_DEVICE_VGA_COMPATIBLE; |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * EnumDisplayDevicesW (USER32.@) |
| */ |
| BOOL WINAPI EnumDisplayDevicesW( |
| LPVOID unused,DWORD i,LPDISPLAY_DEVICEW lpDisplayDevice,DWORD dwFlags |
| ) { |
| if (i) |
| return FALSE; |
| FIXME_(system)("(%p,%ld,%p,0x%08lx), stub!\n",unused,i,lpDisplayDevice,dwFlags); |
| MultiByteToWideChar( CP_ACP, 0, "X11", -1, lpDisplayDevice->DeviceName, |
| sizeof(lpDisplayDevice->DeviceName)/sizeof(WCHAR) ); |
| MultiByteToWideChar( CP_ACP, 0, "X11 Windowing System", -1, lpDisplayDevice->DeviceString, |
| sizeof(lpDisplayDevice->DeviceString)/sizeof(WCHAR) ); |
| lpDisplayDevice->StateFlags = |
| DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | |
| DISPLAY_DEVICE_PRIMARY_DEVICE | |
| DISPLAY_DEVICE_VGA_COMPATIBLE; |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * SetEventHook (USER.321) |
| * |
| * Used by Turbo Debugger for Windows |
| */ |
| FARPROC16 WINAPI SetEventHook16(FARPROC16 lpfnEventHook) |
| { |
| FIXME_(hook)("(lpfnEventHook=%08x): stub\n", (UINT)lpfnEventHook); |
| return NULL; |
| } |
| |
| /*********************************************************************** |
| * UserSeeUserDo (USER.216) |
| */ |
| DWORD WINAPI UserSeeUserDo16(WORD wReqType, WORD wParam1, WORD wParam2, WORD wParam3) |
| { |
| switch (wReqType) |
| { |
| case USUD_LOCALALLOC: |
| return LOCAL_Alloc(USER_HeapSel, wParam1, wParam3); |
| case USUD_LOCALFREE: |
| return LOCAL_Free(USER_HeapSel, wParam1); |
| case USUD_LOCALCOMPACT: |
| return LOCAL_Compact(USER_HeapSel, wParam3, 0); |
| case USUD_LOCALHEAP: |
| return USER_HeapSel; |
| case USUD_FIRSTCLASS: |
| FIXME_(local)("return a pointer to the first window class.\n"); |
| return (DWORD)-1; |
| default: |
| WARN_(local)("wReqType %04x (unknown)", wReqType); |
| return (DWORD)-1; |
| } |
| } |
| |
| /*********************************************************************** |
| * GetSystemDebugState (USER.231) |
| */ |
| WORD WINAPI GetSystemDebugState16(void) |
| { |
| return 0; /* FIXME */ |
| } |
| |
| /*********************************************************************** |
| * RegisterLogonProcess (USER32.@) |
| */ |
| DWORD WINAPI RegisterLogonProcess(HANDLE hprocess,BOOL x) { |
| FIXME_(win32)("(%p,%d),stub!\n",hprocess,x); |
| return 1; |
| } |
| |
| /*********************************************************************** |
| * CreateWindowStationW (USER32.@) |
| */ |
| HWINSTA WINAPI CreateWindowStationW( |
| LPWSTR winstation,DWORD res1,DWORD desiredaccess, |
| LPSECURITY_ATTRIBUTES lpsa |
| ) { |
| FIXME_(win32)("(%s,0x%08lx,0x%08lx,%p),stub!\n",debugstr_w(winstation), |
| res1,desiredaccess,lpsa |
| ); |
| return (HWINSTA)0xdeadcafe; |
| } |
| |
| /*********************************************************************** |
| * SetProcessWindowStation (USER32.@) |
| */ |
| BOOL WINAPI SetProcessWindowStation(HWINSTA hWinSta) { |
| FIXME_(win32)("(%p),stub!\n",hWinSta); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * SetUserObjectSecurity (USER32.@) |
| */ |
| BOOL WINAPI SetUserObjectSecurity( |
| HANDLE hObj, |
| PSECURITY_INFORMATION pSIRequested, |
| PSECURITY_DESCRIPTOR pSID |
| ) { |
| FIXME_(win32)("(%p,%p,%p),stub!\n",hObj,pSIRequested,pSID); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * CreateDesktopA (USER32.@) |
| */ |
| HDESK WINAPI CreateDesktopA( |
| LPSTR lpszDesktop,LPSTR lpszDevice,LPDEVMODEA pDevmode, |
| DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa |
| ) { |
| FIXME_(win32)("(%s,%s,%p,0x%08lx,0x%08lx,%p),stub!\n", |
| lpszDesktop,lpszDevice,pDevmode, |
| dwFlags,dwDesiredAccess,lpsa |
| ); |
| return (HDESK)0xcafedead; |
| } |
| |
| /*********************************************************************** |
| * CreateDesktopW (USER32.@) |
| */ |
| HDESK WINAPI CreateDesktopW( |
| LPWSTR lpszDesktop,LPWSTR lpszDevice,LPDEVMODEW pDevmode, |
| DWORD dwFlags,DWORD dwDesiredAccess,LPSECURITY_ATTRIBUTES lpsa |
| ) { |
| FIXME_(win32)("(%s,%s,%p,0x%08lx,0x%08lx,%p),stub!\n", |
| debugstr_w(lpszDesktop),debugstr_w(lpszDevice),pDevmode, |
| dwFlags,dwDesiredAccess,lpsa |
| ); |
| return (HDESK)0xcafedead; |
| } |
| |
| /*********************************************************************** |
| * EnumDesktopWindows (USER32.@) |
| */ |
| BOOL WINAPI EnumDesktopWindows( HDESK hDesktop, WNDENUMPROC lpfn, LPARAM lParam ) { |
| FIXME_(win32)("(%p, %p, 0x%08lx), stub!\n", hDesktop, lpfn, lParam ); |
| return TRUE; |
| } |
| |
| |
| /*********************************************************************** |
| * CloseWindowStation (USER32.@) |
| */ |
| BOOL WINAPI CloseWindowStation(HWINSTA hWinSta) |
| { |
| FIXME_(win32)("(%p)\n", hWinSta); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * CloseDesktop (USER32.@) |
| */ |
| BOOL WINAPI CloseDesktop(HDESK hDesk) |
| { |
| FIXME_(win32)("(%p)\n", hDesk); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * SetWindowStationUser (USER32.@) |
| */ |
| DWORD WINAPI SetWindowStationUser(DWORD x1,DWORD x2) { |
| FIXME_(win32)("(0x%08lx,0x%08lx),stub!\n",x1,x2); |
| return 1; |
| } |
| |
| /*********************************************************************** |
| * SetLogonNotifyWindow (USER32.@) |
| */ |
| DWORD WINAPI SetLogonNotifyWindow(HWINSTA hwinsta,HWND hwnd) { |
| FIXME_(win32)("(%p,%p),stub!\n",hwinsta,hwnd); |
| return 1; |
| } |
| |
| /*********************************************************************** |
| * LoadLocalFonts (USER32.@) |
| */ |
| VOID WINAPI LoadLocalFonts(VOID) { |
| /* are loaded. */ |
| return; |
| } |
| /*********************************************************************** |
| * GetUserObjectInformationA (USER32.@) |
| */ |
| BOOL WINAPI GetUserObjectInformationA( HANDLE hObj, INT nIndex, LPVOID pvInfo, DWORD nLength, LPDWORD lpnLen ) |
| { FIXME_(win32)("(%p %i %p %ld %p),stub!\n", hObj, nIndex, pvInfo, nLength, lpnLen ); |
| return TRUE; |
| } |
| /*********************************************************************** |
| * GetUserObjectInformationW (USER32.@) |
| */ |
| BOOL WINAPI GetUserObjectInformationW( HANDLE hObj, INT nIndex, LPVOID pvInfo, DWORD nLength, LPDWORD lpnLen ) |
| { FIXME_(win32)("(%p %i %p %ld %p),stub!\n", hObj, nIndex, pvInfo, nLength, lpnLen ); |
| return TRUE; |
| } |
| /*********************************************************************** |
| * GetUserObjectSecurity (USER32.@) |
| */ |
| BOOL WINAPI GetUserObjectSecurity(HANDLE hObj, PSECURITY_INFORMATION pSIRequested, |
| PSECURITY_DESCRIPTOR pSID, DWORD nLength, LPDWORD lpnLengthNeeded) |
| { FIXME_(win32)("(%p %p %p len=%ld %p),stub!\n", hObj, pSIRequested, pSID, nLength, lpnLengthNeeded); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * SetSystemCursor (USER32.@) |
| */ |
| BOOL WINAPI SetSystemCursor(HCURSOR hcur, DWORD id) |
| { FIXME_(win32)("(%p,%08lx),stub!\n", hcur, id); |
| return TRUE; |
| } |
| |
| /*********************************************************************** |
| * RegisterSystemThread (USER32.@) |
| */ |
| void WINAPI RegisterSystemThread(DWORD flags, DWORD reserved) |
| { |
| FIXME_(win32)("(%08lx, %08lx)\n", flags, reserved); |
| } |
| |
| /*********************************************************************** |
| * RegisterDeviceNotificationA (USER32.@) |
| */ |
| HDEVNOTIFY WINAPI RegisterDeviceNotificationA( |
| HANDLE hnd, LPVOID notifyfilter, DWORD flags |
| ) { |
| FIXME_(win32)("(hwnd=%p, filter=%p,flags=0x%08lx), STUB!\n", hnd,notifyfilter,flags ); |
| return 0; |
| } |