/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: Native User stubs * FILE: subsys/win32k/ntuser/stubs.c * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net) * REVISION HISTORY: * 04-06-2001 CSH Created */ #include #define NDEBUG #include DWORD APIENTRY NtUserAssociateInputContext( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserAttachThreadInput( IN DWORD idAttach, IN DWORD idAttachTo, IN BOOL fAttach) { NTSTATUS Status; PETHREAD Thread, ThreadTo; PTHREADINFO pti, ptiTo; BOOL Ret = FALSE; UserEnterExclusive(); Status = PsLookupThreadByThreadId((HANDLE)idAttach, &Thread); if (!NT_SUCCESS(Status)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); goto Exit; } Status = PsLookupThreadByThreadId((HANDLE)idAttachTo, &ThreadTo); if (!NT_SUCCESS(Status)) { SetLastWin32Error(ERROR_INVALID_PARAMETER); ObDereferenceObject(Thread); goto Exit; } pti = PsGetThreadWin32Thread(Thread); ptiTo = PsGetThreadWin32Thread(ThreadTo); ObDereferenceObject(Thread); ObDereferenceObject(ThreadTo); Ret = UserAttachThreadInput( pti, ptiTo, fAttach); Exit: UserLeave(); return Ret; } // // Works like BitBlt, http://msdn.microsoft.com/en-us/library/ms532278(VS.85).aspx // BOOL APIENTRY NtUserBitBltSysBmp( HDC hdc, INT nXDest, INT nYDest, INT nWidth, INT nHeight, INT nXSrc, INT nYSrc, DWORD dwRop ) { BOOL Ret = FALSE; UserEnterExclusive(); Ret = NtGdiBitBlt( hdc, nXDest, nYDest, nWidth, nHeight, hSystemBM, nXSrc, nYSrc, dwRop, 0, 0); UserLeave(); return Ret; } DWORD APIENTRY NtUserBuildHimcList( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserConvertMemHandle( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserCreateLocalMemHandle( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserDdeGetQualityOfService( IN HWND hwndClient, IN HWND hWndServer, OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserDdeInitialize( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserDdeSetQualityOfService( IN HWND hwndClient, IN PSECURITY_QUALITY_OF_SERVICE pqosNew, OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserDragObject( HWND hwnd1, HWND hwnd2, UINT u1, DWORD dw1, HCURSOR hc1 ) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserDrawAnimatedRects( HWND hwnd, INT idAni, RECT *lprcFrom, RECT *lprcTo) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserEnumDisplayDevices ( PUNICODE_STRING lpDevice, /* device name */ DWORD iDevNum, /* display device */ PDISPLAY_DEVICEW lpDisplayDevice, /* device information */ DWORD dwFlags ) /* reserved */ { DPRINT1("NtUserEnumDisplayDevices() is UNIMPLEMENTED!\n"); if (lpDevice->Length == 0 && iDevNum > 0) { /* Only one display device present */ return FALSE; } else if (lpDevice->Length != 0) { /* Can't enumerate monitors :( */ return FALSE; } if (lpDisplayDevice->cb < sizeof(DISPLAY_DEVICE)) return FALSE; wcscpy(lpDisplayDevice->DeviceName, L"\\\\.\\DISPLAY1"); wcscpy(lpDisplayDevice->DeviceString, L""); lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP | DISPLAY_DEVICE_MODESPRUNED | DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_VGA_COMPATIBLE; lpDisplayDevice->DeviceID[0] = L'0'; lpDisplayDevice->DeviceKey[0] = L'0'; return TRUE; } DWORD APIENTRY NtUserEvent( DWORD Unknown0) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserExcludeUpdateRgn( HDC hDC, HWND hWnd) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserGetAltTabInfo( HWND hwnd, INT iItem, PALTTABINFO pati, LPWSTR pszItemText, UINT cchItemText, BOOL Ansi) { UNIMPLEMENTED return 0; } HBRUSH APIENTRY NtUserGetControlBrush( HWND hwnd, HDC hdc, UINT ctlType) { UNIMPLEMENTED return 0; } /* * Called from PaintRect, works almost like wine PaintRect16 but returns hBrush. */ HBRUSH APIENTRY NtUserGetControlColor( HWND hwndParent, HWND hwnd, HDC hdc, UINT CtlMsg) // Wine PaintRect: WM_CTLCOLORMSGBOX + hbrush { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserGetImeHotKey( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserGetMouseMovePointsEx( UINT cbSize, LPMOUSEMOVEPOINT lppt, LPMOUSEMOVEPOINT lpptBuf, int nBufPoints, DWORD resolution) { UserEnterExclusive(); if ((cbSize != sizeof(MOUSEMOVEPOINT)) || (nBufPoints < 0) || (nBufPoints > 64)) { UserLeave(); SetLastWin32Error(ERROR_INVALID_PARAMETER); return -1; } _SEH2_TRY { ProbeForRead(lppt, cbSize, 1); ProbeForWrite(lpptBuf, cbSize, 1); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { SetLastNtError(_SEH2_GetExceptionCode()); SetLastWin32Error(ERROR_NOACCESS); } _SEH2_END; /* Call a subfunction of GetMouseMovePointsEx! switch(resolution) { case GMMP_USE_DISPLAY_POINTS: case GMMP_USE_HIGH_RESOLUTION_POINTS: break; default: SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND); return GMMP_ERR_POINT_NOT_FOUND; } */ UNIMPLEMENTED UserLeave(); return -1; } BOOL APIENTRY NtUserImpersonateDdeClientWindow( HWND hWndClient, HWND hWndServer) { UNIMPLEMENTED return 0; } NTSTATUS APIENTRY NtUserInitializeClientPfnArrays( PPFNCLIENT pfnClientA, PPFNCLIENT pfnClientW, PPFNCLIENTWORKER pfnClientWorker, HINSTANCE hmodUser) { NTSTATUS Status = STATUS_SUCCESS; DPRINT("Enter NtUserInitializeClientPfnArrays User32 0x%x\n",hmodUser); if (ClientPfnInit) return Status; UserEnterExclusive(); _SEH2_TRY { ProbeForRead( pfnClientA, sizeof(PFNCLIENT), 1); ProbeForRead( pfnClientW, sizeof(PFNCLIENT), 1); ProbeForRead( pfnClientWorker, sizeof(PFNCLIENTWORKER), 1); RtlCopyMemory(&gpsi->apfnClientA, pfnClientA, sizeof(PFNCLIENT)); RtlCopyMemory(&gpsi->apfnClientW, pfnClientW, sizeof(PFNCLIENT)); RtlCopyMemory(&gpsi->apfnClientWorker, pfnClientWorker, sizeof(PFNCLIENTWORKER)); //// FIXME! HAX! Temporary until server side is finished. //// Copy the client side procs for now. RtlCopyMemory(&gpsi->aStoCidPfn, pfnClientW, sizeof(gpsi->aStoCidPfn)); hModClient = hmodUser; ClientPfnInit = TRUE; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { Status =_SEH2_GetExceptionCode(); } _SEH2_END if (!NT_SUCCESS(Status)) { DPRINT1("Failed reading Client Pfns from user space.\n"); SetLastNtError(Status); } UserLeave(); return Status; } DWORD APIENTRY NtUserInitTask( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4, DWORD Unknown5, DWORD Unknown6, DWORD Unknown7, DWORD Unknown8, DWORD Unknown9, DWORD Unknown10, DWORD Unknown11) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserLockWorkStation(VOID) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserMNDragLeave(VOID) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserMNDragOver( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserModifyUserStartupInfoFlags( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserNotifyIMEStatus( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserQueryUserCounters( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserRegisterTasklist( DWORD Unknown0) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserSetConsoleReserveKeys( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserSetDbgTag( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserSetImeHotKey( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserSetRipFlags( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserSetSysColors( int cElements, IN CONST INT *lpaElements, IN CONST COLORREF *lpaRgbValues, FLONG Flags) { DWORD Ret = FALSE; NTSTATUS Status = STATUS_SUCCESS; UserEnterExclusive(); _SEH2_TRY { ProbeForRead(lpaElements, sizeof(INT), 1); ProbeForRead(lpaRgbValues, sizeof(INT), 1); // Developers: We are thread locked and calling gdi. Ret = IntSetSysColors(cElements, (INT*)lpaElements, (COLORREF*)lpaRgbValues); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { Status = _SEH2_GetExceptionCode(); } _SEH2_END; if (!NT_SUCCESS(Status)) { SetLastNtError(Status); Ret = FALSE; } if (Ret) { UserPostMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0); } UserLeave(); return Ret; } DWORD APIENTRY NtUserSetThreadState( DWORD Unknown0, DWORD Unknown1) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserTrackMouseEvent( LPTRACKMOUSEEVENT lpEventTrack) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserUpdateInputContext( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserUpdateInstance( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2) { UNIMPLEMENTED return 0; } BOOL APIENTRY NtUserUserHandleGrantAccess( IN HANDLE hUserHandle, IN HANDLE hJob, IN BOOL bGrant) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserWaitForMsgAndEvent( DWORD Unknown0) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserWin32PoolAllocationStats( DWORD Unknown0, DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4, DWORD Unknown5) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserYieldTask(VOID) { UNIMPLEMENTED return 0; } DWORD APIENTRY NtUserCheckImeHotKey( DWORD dwUnknown1, DWORD dwUnknown2) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserConsoleControl( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserCreateInputContext( DWORD dwUnknown1) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserDestroyInputContext( DWORD dwUnknown1) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserDisableThreadIme( DWORD dwUnknown1) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetAppImeLevel( DWORD dwUnknown1) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetAtomName( ATOM nAtom, LPWSTR lpBuffer) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetImeInfoEx( DWORD dwUnknown1, DWORD dwUnknown2) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetRawInputBuffer( PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetRawInputData( HRAWINPUT hRawInput, UINT uiCommand, LPVOID pData, PUINT pcbSize, UINT cbSizeHeader) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetRawInputDeviceInfo( HANDLE hDevice, UINT uiCommand, LPVOID pData, PUINT pcbSize ) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetRawInputDeviceList( PRAWINPUTDEVICELIST pRawInputDeviceList, PUINT puiNumDevices, UINT cbSize) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserGetRegisteredRawInputDevices( PRAWINPUTDEVICE pRawInputDevices, PUINT puiNumDevices, UINT cbSize) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserHardErrorControl( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserMinMaximize( HWND hWnd, UINT cmd, // Wine SW_ commands BOOL Hide) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserNotifyProcessCreate( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4) { UNIMPLEMENTED; return 0; } BOOL APIENTRY NtUserPrintWindow( HWND hwnd, HDC hdcBlt, UINT nFlags) { UNIMPLEMENTED; return 0; } NTSTATUS APIENTRY NtUserProcessConnect( HANDLE Process, PUSERCONNECT pUserConnect, DWORD Size) { NTSTATUS Status = STATUS_SUCCESS; DPRINT("NtUserProcessConnect\n"); if (pUserConnect && ( Size == sizeof(USERCONNECT) )) { PPROCESSINFO W32Process; UserEnterShared(); GetW32ThreadInfo(); W32Process = PsGetCurrentProcessWin32Process(); _SEH2_TRY { pUserConnect->siClient.psi = gpsi; pUserConnect->siClient.aheList = gHandleTable; pUserConnect->siClient.ulSharedDelta = (ULONG_PTR)W32Process->HeapMappings.KernelMapping - (ULONG_PTR)W32Process->HeapMappings.UserMapping; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { Status = _SEH2_GetExceptionCode(); } _SEH2_END if (!NT_SUCCESS(Status)) { SetLastNtError(Status); } UserLeave(); return Status; } return STATUS_UNSUCCESSFUL; } DWORD APIENTRY NtUserQueryInformationThread( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4, DWORD dwUnknown5) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserQueryInputContext( DWORD dwUnknown1, DWORD dwUnknown2) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserRealInternalGetMessage( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4, DWORD dwUnknown5, DWORD dwUnknown6) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserRealWaitMessageEx( DWORD dwUnknown1, DWORD dwUnknown2) { UNIMPLEMENTED; return 0; } BOOL APIENTRY NtUserRegisterUserApiHook( PUNICODE_STRING m_dllname1, PUNICODE_STRING m_funname1, DWORD dwUnknown3, DWORD dwUnknown4) { UserEnterExclusive(); UNIMPLEMENTED; UserLeave(); return 0; } BOOL APIENTRY NtUserRegisterRawInputDevices( IN PCRAWINPUTDEVICE pRawInputDevices, IN UINT uiNumDevices, IN UINT cbSize) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserResolveDesktop( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserSetAppImeLevel( DWORD dwUnknown1, DWORD dwUnknown2) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserSetImeInfoEx( DWORD dwUnknown1) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserSetInformationProcess( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4) { UNIMPLEMENTED; return 0; } NTSTATUS APIENTRY NtUserSetInformationThread(IN HANDLE ThreadHandle, IN USERTHREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength) { if (ThreadInformationClass == UserThreadInitiateShutdown) { DPRINT1("Shutdown initiated\n"); } else if (ThreadInformationClass == UserThreadEndShutdown) { DPRINT1("Shutdown ended\n"); } else { UNIMPLEMENTED; } return STATUS_SUCCESS; } DWORD APIENTRY NtUserSetThreadLayoutHandles( DWORD dwUnknown1, DWORD dwUnknown2) { UNIMPLEMENTED; return 0; } BOOL APIENTRY NtUserSoundSentry(VOID) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserTestForInteractiveUser( DWORD dwUnknown1) { UNIMPLEMENTED; return 0; } /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */ DWORD APIENTRY NtUserCalcMenuBar( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4, DWORD dwUnknown5) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserPaintMenuBar( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4, DWORD dwUnknown5, DWORD dwUnknown6) { UNIMPLEMENTED; return 0; } BOOL APIENTRY NtUserUnregisterUserApiHook(VOID) { UNIMPLEMENTED; return 0; } BOOL APIENTRY NtUserGetLayeredWindowAttributes( HWND hwnd, COLORREF *pcrKey, BYTE *pbAlpha, DWORD *pdwFlags) { UNIMPLEMENTED; return 0; } BOOL APIENTRY NtUserValidateTimerCallback( HWND hWnd, WPARAM wParam, LPARAM lParam) { BOOL Ret = FALSE; PWINDOW_OBJECT Window = NULL; UserEnterShared(); if (hWnd) { Window = UserGetWindowObject(hWnd); if (!Window || !Window->Wnd) goto Exit; } Ret = ValidateTimerCallback(PsGetCurrentThreadWin32Thread(), Window, wParam, lParam); Exit: UserLeave(); return Ret; } DWORD APIENTRY NtUserRemoteConnect( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserRemoteRedrawRectangle( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3, DWORD dwUnknown4) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserRemoteRedrawScreen(VOID) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserRemoteStopScreenUpdates(VOID) { UNIMPLEMENTED; return 0; } DWORD APIENTRY NtUserCtxDisplayIOCtl( DWORD dwUnknown1, DWORD dwUnknown2, DWORD dwUnknown3) { UNIMPLEMENTED; return 0; } /* EOF */