From 88b88793674625bcd8fb1e4e3d9ab4c47e98c26d Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 20 Jun 2005 18:21:07 +0000 Subject: [PATCH] Compile user32 with NDK, clean up its headers, and separate it from the intenral win32k stuff svn path=/trunk/; revision=16157 --- reactos/include/win32k/brush.h | 33 ------ reactos/include/win32k/caret.h | 23 ++++ reactos/include/win32k/cursoricon.h | 3 - reactos/include/win32k/ntuser.h | 2 + reactos/include/win32k/paint.h | 31 +++++ reactos/lib/user32/include/draw.h | 1 + reactos/lib/user32/include/user32.h | 162 ++++---------------------- reactos/lib/user32/include/user32p.h | 128 ++++++++++++++++++++ reactos/lib/user32/misc/dllmain.c | 3 +- reactos/lib/user32/windows/dialog.c | 4 +- reactos/subsys/win32k/include/caret.h | 11 -- reactos/subsys/win32k/w32k.h | 1 + 12 files changed, 210 insertions(+), 192 deletions(-) create mode 100644 reactos/include/win32k/caret.h create mode 100644 reactos/lib/user32/include/user32p.h diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h index c0961b253de..116f410a1a2 100644 --- a/reactos/include/win32k/brush.h +++ b/reactos/include/win32k/brush.h @@ -74,13 +74,6 @@ typedef struct #define BRUSHOBJ_UnlockBrush(pBrush) GDIOBJ_UnlockObjByPtr(pBrush) BOOL INTERNAL_CALL BRUSH_Cleanup(PVOID ObjectBody); -#ifdef __USE_W32API -typedef struct _PATRECT { - RECT r; - HBRUSH hBrush; -} PATRECT, * PPATRECT; -#endif - HBRUSH STDCALL NtGdiCreateBrushIndirect( CONST LOGBRUSH *LogBrush); @@ -109,32 +102,6 @@ BOOL STDCALL NtGdiFixBrushOrgEx( VOID); -BOOL STDCALL -NtGdiPatBlt( - HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP); - -BOOL STDCALL -NtGdiPolyPatBlt( - HDC hDC, - DWORD dwRop, - PPATRECT pRects, - INT cRects, - ULONG Reserved); - -BOOL STDCALL -NtGdiPatBlt( - HDC hDC, - INT XLeft, - INT YLeft, - INT Width, - INT Height, - DWORD ROP); - BOOL STDCALL NtGdiSetBrushOrgEx( HDC hDC, diff --git a/reactos/include/win32k/caret.h b/reactos/include/win32k/caret.h new file mode 100644 index 00000000000..d0613ee0506 --- /dev/null +++ b/reactos/include/win32k/caret.h @@ -0,0 +1,23 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: include/win32k/caret.h + * PURPOSE: GDI32/Win32k Caret interface + * PROGRAMMER: + * + */ + +#ifndef WIN32K_CARET_H_INCLUDED +#define WIN32K_CARET_H_INCLUDED + +typedef struct _THRDCARETINFO +{ + HWND hWnd; + HBITMAP Bitmap; + POINT Pos; + SIZE Size; + BYTE Visible; + BYTE Showing; +} THRDCARETINFO, *PTHRDCARETINFO; + +#endif /* WIN32K_FONT_H_INCLUDED */ diff --git a/reactos/include/win32k/cursoricon.h b/reactos/include/win32k/cursoricon.h index 5a5101b1c2c..eb05867be38 100644 --- a/reactos/include/win32k/cursoricon.h +++ b/reactos/include/win32k/cursoricon.h @@ -2,9 +2,6 @@ #ifndef __WIN32K_CURSORICON_H #define __WIN32K_CURSORICON_H -#include -#include - #include /* Structures for reading icon/cursor files and resources */ diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 878d6a6521d..6fdfc69455e 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -1,7 +1,9 @@ #ifndef __WIN32K_NTUSER_H #define __WIN32K_NTUSER_H +#ifndef _NTNDK_ #include +#endif #define WM_SYSTIMER 280 diff --git a/reactos/include/win32k/paint.h b/reactos/include/win32k/paint.h index 5d8e16d2a43..dec0ca0e8be 100644 --- a/reactos/include/win32k/paint.h +++ b/reactos/include/win32k/paint.h @@ -1,6 +1,37 @@ #ifndef __WIN32K_PAINT_H #define __WIN32K_PAINT_H +typedef struct _PATRECT { + RECT r; + HBRUSH hBrush; +} PATRECT, * PPATRECT; + +BOOL STDCALL +NtGdiPatBlt( + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP); + +BOOL STDCALL +NtGdiPolyPatBlt( + HDC hDC, + DWORD dwRop, + PPATRECT pRects, + INT cRects, + ULONG Reserved); + +BOOL STDCALL +NtGdiPatBlt( + HDC hDC, + INT XLeft, + INT YLeft, + INT Width, + INT Height, + DWORD ROP); + BOOL STDCALL NtGdiGdiFlush (VOID); DWORD STDCALL NtGdiGdiGetBatchLimit (VOID); DWORD STDCALL NtGdiGdiSetBatchLimit (DWORD Limit); diff --git a/reactos/lib/user32/include/draw.h b/reactos/lib/user32/include/draw.h index 9bbed868be7..037e5c6aa2d 100644 --- a/reactos/lib/user32/include/draw.h +++ b/reactos/lib/user32/include/draw.h @@ -1 +1,2 @@ HPEN STDCALL GetSysColorPen (int nIndex); +void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); diff --git a/reactos/lib/user32/include/user32.h b/reactos/lib/user32/include/user32.h index 8770624cbea..9163731fbe3 100644 --- a/reactos/lib/user32/include/user32.h +++ b/reactos/lib/user32/include/user32.h @@ -1,156 +1,34 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS user32.dll - * FILE: include/user32.h - * PURPOSE: Global user32 definitions + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS System Libraries + * FILE: lib/user32/include/user32.h + * PURPOSE: Win32 User Library + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) */ +/* INCLUDES ******************************************************************/ + #ifndef USER32_H #define USER32_H -#include -#include -#include +/* SDK/NDK Headers */ #include #include #define NTOS_MODE_USER -#include -#include +#include + +/* External Win32K Headers */ +#include +#include #include -#include "accel.h" -#include "cursor.h" -#ifndef __WINE__ -#include "debug.h" -#endif -#include "draw.h" -#include "menu.h" -#include "message.h" -#include "regcontrol.h" -#include "resource.h" -#include "scroll.h" -#include "strpool.h" -#include "window.h" -#include "winpos.h" -#include "winsta.h" +#include +#include +#include -extern HINSTANCE User32Instance; +/* Internal User32 Headers */ +#include "user32p.h" -typedef struct _USER32_THREAD_DATA -{ - MSG LastMessage; - HKL KeyboardLayoutHandle; -} USER32_THREAD_DATA, *PUSER32_THREAD_DATA; - -PUSER32_THREAD_DATA User32GetThreadData(); - -/* a copy of this structure is in subsys/win32k/include/caret.h */ -typedef struct _THRDCARETINFO -{ - HWND hWnd; - HBITMAP Bitmap; - POINT Pos; - SIZE Size; - BYTE Visible; - BYTE Showing; -} THRDCARETINFO, *PTHRDCARETINFO; - -void InitStockObjects(void); -VOID CreateFrameBrushes(VOID); -VOID DeleteFrameBrushes(VOID); -void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo); - -#define NtUserMsqSetWakeMask(dwWaitMask) \ - (HANDLE)NtUserCallOneParam(dwWaitMask, ONEPARAM_ROUTINE_MSQSETWAKEMASK) - -#define NtUserMsqClearWakeMask() \ - NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK) - -LONG WINAPI RegCloseKey(HKEY); -LONG WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY); -LONG WINAPI RegQueryValueExW(HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); - -#ifdef __USE_W32API -NTSTATUS STDCALL ZwCallbackReturn(PVOID Result, - ULONG ResultLength, - NTSTATUS Status); -#endif - -#define NtUserAnyPopup() \ - (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP) - -#define NtUserValidateRgn(hWnd, hRgn) \ - (BOOL)NtUserCallTwoParam((DWORD)hWnd, (DWORD)hRgn, TWOPARAM_ROUTINE_VALIDATERGN) - -#define NtUserSetWindowContextHelpId(hWnd, dwContextHelpId) \ - (BOOL)NtUserCallTwoParam((DWORD)hwnd, dwContextHelpId, TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID) - -#define NtUserSetCaretPos(X, Y) \ - (BOOL)NtUserCallTwoParam((DWORD)X, (DWORD)Y, TWOPARAM_ROUTINE_SETCARETPOS) - -#define NtUserSetGUIThreadHandle(field, hwnd) \ - (BOOL)NtUserCallTwoParam((DWORD)field, (DWORD)hwnd, TWOPARAM_ROUTINE_SETGUITHRDHANDLE) - -#define NtUserSetMenuItemRect(menu, mir) \ - (BOOL)NtUserCallTwoParam((DWORD)menu, (DWORD)mir, TWOPARAM_ROUTINE_SETMENUITEMRECT) - -#define NtUserSetMenuBarHeight(menu, height) \ - (BOOL)NtUserCallTwoParam((DWORD)menu, (DWORD)height, TWOPARAM_ROUTINE_SETMENUBARHEIGHT) - -#define NtUserGetWindowInfo(hwnd, pwi) \ - (BOOL)NtUserCallTwoParam((DWORD)hwnd, (DWORD)pwi, TWOPARAM_ROUTINE_GETWINDOWINFO) - -#define NtUserRegisterLogonProcess(hproc, x) \ - (BOOL)NtUserCallTwoParam((DWORD)hproc, (DWORD)x, TWOPARAM_ROUTINE_REGISTERLOGONPROC) - -#define NtUserGetSysColorBrushes(HBrushes, count) \ - (BOOL)NtUserCallTwoParam((DWORD)(HBrushes), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES) - -#define NtUserGetSysColorPens(HPens, count) \ - (BOOL)NtUserCallTwoParam((DWORD)(HPens), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORPENS) - -#define NtUserGetSysColors(ColorRefs, count) \ - (BOOL)NtUserCallTwoParam((DWORD)(ColorRefs), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORS) - -#define NtUserSetSysColors(ColorRefs, count) \ - (BOOL)NtUserCallTwoParam((DWORD)(ColorRefs), (DWORD)(count), TWOPARAM_ROUTINE_SETSYSCOLORS) - -#define NtUserSetCaretBlinkTime(uMSeconds) \ - (BOOL)NtUserCallOneParam((DWORD)uMSeconds, ONEPARAM_ROUTINE_SETCARETBLINKTIME) - -#define NtUserEnumClipboardFormats(format) \ - (UINT)NtUserCallOneParam(format, ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS) - -#define NtUserWindowFromDC(hDC) \ - (HWND)NtUserCallOneParam((DWORD)hDC, ONEPARAM_ROUTINE_WINDOWFROMDC) - -#define NtUserSwitchCaretShowing(CaretInfo) \ - (BOOL)NtUserCallOneParam((DWORD)CaretInfo, ONEPARAM_ROUTINE_SWITCHCARETSHOWING) - -#define NtUserSwapMouseButton(fSwap) \ - (BOOL)NtUserCallOneParam((DWORD)fSwap, ONEPARAM_ROUTINE_SWAPMOUSEBUTTON) - -#define NtUserGetMenu(hWnd) \ - (HMENU)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_GETMENU) - -#define NtUserSetMessageExtraInfo(lParam) \ - (LPARAM)NtUserCallOneParam((DWORD)lParam, ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO) - -#define NtUserIsWindowUnicode(hWnd) \ - (BOOL)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_ISWINDOWUNICODE) - -#define NtUserGetWindowContextHelpId(hwnd) \ - NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID) - -#define NtUserGetWindowInstance(hwnd) \ - (HINSTANCE)NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWINDOWINSTANCE) - -#define NtUserGetCursorPos(lpPoint) \ - (BOOL)NtUserCallOneParam((DWORD)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION) - -#define NtUserIsWindowInDestroy(hWnd) \ - (BOOL)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_ISWINDOWINDESTROY) - -#define NtUserEnableProcessWindowGhosting(bEnable) \ - NtUserCallOneParam((DWORD)bEnable, ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING) +/* FIXME: FILIP */ +HGDIOBJ STDCALL NtGdiSelectObject(HDC hDC, HGDIOBJ hGDIObj); #endif /* USER32_H */ diff --git a/reactos/lib/user32/include/user32p.h b/reactos/lib/user32/include/user32p.h new file mode 100644 index 00000000000..1901d661575 --- /dev/null +++ b/reactos/lib/user32/include/user32p.h @@ -0,0 +1,128 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS System Libraries + * FILE: lib/user32/include/user32p.h + * PURPOSE: Win32 User Library Private Headers + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + +/* INCLUDES ******************************************************************/ + +#ifndef USER32_PRIVATE_H +#define USER32_PRIVATE_H + +/* Private User32 Headers */ +#include "accel.h" +#include "cursor.h" +#ifndef __WINE__ +#include "debug.h" +#endif +#include "draw.h" +#include "menu.h" +#include "message.h" +#include "regcontrol.h" +#include "resource.h" +#include "scroll.h" +#include "strpool.h" +#include "window.h" +#include "winpos.h" +#include "winsta.h" + +/* One/Two Param Functions */ +#define NtUserMsqSetWakeMask(dwWaitMask) \ + (HANDLE)NtUserCallOneParam(dwWaitMask, ONEPARAM_ROUTINE_MSQSETWAKEMASK) + +#define NtUserMsqClearWakeMask() \ + NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK) + +#define NtUserAnyPopup() \ + (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP) + +#define NtUserValidateRgn(hWnd, hRgn) \ + (BOOL)NtUserCallTwoParam((DWORD)hWnd, (DWORD)hRgn, TWOPARAM_ROUTINE_VALIDATERGN) + +#define NtUserSetWindowContextHelpId(hWnd, dwContextHelpId) \ + (BOOL)NtUserCallTwoParam((DWORD)hwnd, dwContextHelpId, TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID) + +#define NtUserSetCaretPos(X, Y) \ + (BOOL)NtUserCallTwoParam((DWORD)X, (DWORD)Y, TWOPARAM_ROUTINE_SETCARETPOS) + +#define NtUserSetGUIThreadHandle(field, hwnd) \ + (BOOL)NtUserCallTwoParam((DWORD)field, (DWORD)hwnd, TWOPARAM_ROUTINE_SETGUITHRDHANDLE) + +#define NtUserSetMenuItemRect(menu, mir) \ + (BOOL)NtUserCallTwoParam((DWORD)menu, (DWORD)mir, TWOPARAM_ROUTINE_SETMENUITEMRECT) + +#define NtUserSetMenuBarHeight(menu, height) \ + (BOOL)NtUserCallTwoParam((DWORD)menu, (DWORD)height, TWOPARAM_ROUTINE_SETMENUBARHEIGHT) + +#define NtUserGetWindowInfo(hwnd, pwi) \ + (BOOL)NtUserCallTwoParam((DWORD)hwnd, (DWORD)pwi, TWOPARAM_ROUTINE_GETWINDOWINFO) + +#define NtUserRegisterLogonProcess(hproc, x) \ + (BOOL)NtUserCallTwoParam((DWORD)hproc, (DWORD)x, TWOPARAM_ROUTINE_REGISTERLOGONPROC) + +#define NtUserGetSysColorBrushes(HBrushes, count) \ + (BOOL)NtUserCallTwoParam((DWORD)(HBrushes), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES) + +#define NtUserGetSysColorPens(HPens, count) \ + (BOOL)NtUserCallTwoParam((DWORD)(HPens), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORPENS) + +#define NtUserGetSysColors(ColorRefs, count) \ + (BOOL)NtUserCallTwoParam((DWORD)(ColorRefs), (DWORD)(count), TWOPARAM_ROUTINE_GETSYSCOLORS) + +#define NtUserSetSysColors(ColorRefs, count) \ + (BOOL)NtUserCallTwoParam((DWORD)(ColorRefs), (DWORD)(count), TWOPARAM_ROUTINE_SETSYSCOLORS) + +#define NtUserSetCaretBlinkTime(uMSeconds) \ + (BOOL)NtUserCallOneParam((DWORD)uMSeconds, ONEPARAM_ROUTINE_SETCARETBLINKTIME) + +#define NtUserEnumClipboardFormats(format) \ + (UINT)NtUserCallOneParam(format, ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS) + +#define NtUserWindowFromDC(hDC) \ + (HWND)NtUserCallOneParam((DWORD)hDC, ONEPARAM_ROUTINE_WINDOWFROMDC) + +#define NtUserSwitchCaretShowing(CaretInfo) \ + (BOOL)NtUserCallOneParam((DWORD)CaretInfo, ONEPARAM_ROUTINE_SWITCHCARETSHOWING) + +#define NtUserSwapMouseButton(fSwap) \ + (BOOL)NtUserCallOneParam((DWORD)fSwap, ONEPARAM_ROUTINE_SWAPMOUSEBUTTON) + +#define NtUserGetMenu(hWnd) \ + (HMENU)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_GETMENU) + +#define NtUserSetMessageExtraInfo(lParam) \ + (LPARAM)NtUserCallOneParam((DWORD)lParam, ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO) + +#define NtUserIsWindowUnicode(hWnd) \ + (BOOL)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_ISWINDOWUNICODE) + +#define NtUserGetWindowContextHelpId(hwnd) \ + NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID) + +#define NtUserGetWindowInstance(hwnd) \ + (HINSTANCE)NtUserCallOneParam((DWORD)hwnd, ONEPARAM_ROUTINE_GETWINDOWINSTANCE) + +#define NtUserGetCursorPos(lpPoint) \ + (BOOL)NtUserCallOneParam((DWORD)lpPoint, ONEPARAM_ROUTINE_GETCURSORPOSITION) + +#define NtUserIsWindowInDestroy(hWnd) \ + (BOOL)NtUserCallOneParam((DWORD)hWnd, ONEPARAM_ROUTINE_ISWINDOWINDESTROY) + +#define NtUserEnableProcessWindowGhosting(bEnable) \ + NtUserCallOneParam((DWORD)bEnable, ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING) + +/* Internal Thread Data */ +extern HINSTANCE User32Instance; + +typedef struct _USER32_THREAD_DATA +{ + MSG LastMessage; + HKL KeyboardLayoutHandle; +} USER32_THREAD_DATA, *PUSER32_THREAD_DATA; + +PUSER32_THREAD_DATA User32GetThreadData(); + +#endif +/* EOF */ diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index 2270a942378..8b782a4431b 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -2,6 +2,8 @@ /* FIXME: Belongs to some header. */ WINBOOL STDCALL GdiDllInitialize(HANDLE, DWORD, LPVOID); +void InitStockObjects(void); +VOID DeleteFrameBrushes(VOID); #ifdef DBG @@ -13,7 +15,6 @@ DWORD DebugTraceLevel = MIN_TRACE; extern CRITICAL_SECTION gcsMPH; static ULONG User32TlsIndex; HINSTANCE User32Instance; - HWINSTA ProcessWindowStation; PUSER32_THREAD_DATA diff --git a/reactos/lib/user32/windows/dialog.c b/reactos/lib/user32/windows/dialog.c index 770fd72c0e0..f29f8714405 100644 --- a/reactos/lib/user32/windows/dialog.c +++ b/reactos/lib/user32/windows/dialog.c @@ -1891,7 +1891,7 @@ GetDlgItemInt( if (!endptr || (endptr == str)) /* Conversion was unsuccessful */ return 0; /* FIXME: errno? */ - if (((result == LONG_MIN) || (result == LONG_MAX))/* && (errno == ERANGE) */) + if (((result == 0) || (result == 0xFFFFFFFF))/* && (errno == ERANGE) */) return 0; } else @@ -1900,7 +1900,7 @@ GetDlgItemInt( if (!endptr || (endptr == str)) /* Conversion was unsuccessful */ return 0; /* FIXME: errno? */ - if ((result == LONG_MAX)/* && (errno == ERANGE) */) return 0; + if ((result == 0xFFFFFFFF)/* && (errno == ERANGE) */) return 0; } if (lpTranslated) *lpTranslated = TRUE; return (UINT)result; diff --git a/reactos/subsys/win32k/include/caret.h b/reactos/subsys/win32k/include/caret.h index c9a83d8e11c..a05e014cf86 100644 --- a/reactos/subsys/win32k/include/caret.h +++ b/reactos/subsys/win32k/include/caret.h @@ -6,17 +6,6 @@ #define IDCARETTIMER (0xffff) -/* a copy of this structure is in lib/user32/include/user32.h */ -typedef struct _THRDCARETINFO -{ - HWND hWnd; - HBITMAP Bitmap; - POINT Pos; - SIZE Size; - BYTE Visible; - BYTE Showing; -} THRDCARETINFO, *PTHRDCARETINFO; - BOOL FASTCALL IntDestroyCaret(PW32THREAD Win32Thread); diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h index eab7a6b9776..5edff6a90f5 100644 --- a/reactos/subsys/win32k/w32k.h +++ b/reactos/subsys/win32k/w32k.h @@ -17,6 +17,7 @@ #include #include +#include #include #include