Author: hbelusca Date: Thu Oct 25 21:37:52 2012 New Revision: 57619
URL: http://svn.reactos.org/svn/reactos?rev=57619&view=rev Log: [CSR/CONSRV/WINSRV] - Move some structures to better place, fix code.
Modified: branches/ros-csrss/include/reactos/subsys/csr/csrmsg.h branches/ros-csrss/include/reactos/subsys/csr/csrsrv.h branches/ros-csrss/include/reactos/subsys/csr/csrss.h branches/ros-csrss/include/reactos/subsys/win/base.h branches/ros-csrss/include/reactos/subsys/win/conmsg.h branches/ros-csrss/include/reactos/subsys/win/winmsg.h branches/ros-csrss/win32ss/user/consrv/console.c branches/ros-csrss/win32ss/user/winsrv/harderror.c branches/ros-csrss/win32ss/user/winsrv/init.c branches/ros-csrss/win32ss/user/winsrv/shutdown.c branches/ros-csrss/win32ss/user/winsrv/winsrv.h
Modified: branches/ros-csrss/include/reactos/subsys/csr/csrmsg.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/csr/csrmsg.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/csr/csrmsg.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -75,6 +75,12 @@ ULONG PriorityClass; } CSR_SET_PRIORITY_CLASS, *PCSR_SET_PRIORITY_CLASS;
+typedef struct +{ + HANDLE UniqueThread; + CLIENT_ID Cid; +} CSRSS_IDENTIFY_ALERTABLE_THREAD, *PCSRSS_IDENTIFY_ALERTABLE_THREAD; + typedef struct _CSR_CLIENT_CONNECT { ULONG ServerId; @@ -118,19 +124,13 @@
// ULONG_PTR ApiMessageData[39]; //// what to do ????
- /*** Temporary ***/ + /*** win32csr thingies to remove. ***/ #if 1 - CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest; - CSRSS_EXIT_REACTOS ExitReactosRequest; - CSRSS_CREATE_DESKTOP CreateDesktopRequest; CSRSS_SHOW_DESKTOP ShowDesktopRequest; CSRSS_HIDE_DESKTOP HideDesktopRequest; - CSRSS_SET_LOGON_NOTIFY_WINDOW SetLogonNotifyWindowRequest; - CSRSS_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest; - CSRSS_GET_PROCESS_LIST GetProcessListRequest; #endif - /*****************/ + /************************************/ } Data; }; };
Modified: branches/ros-csrss/include/reactos/subsys/csr/csrsrv.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/csr/csrsrv.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/csr/csrsrv.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -31,6 +31,7 @@ } CSR_NT_SESSION, *PCSR_NT_SESSION;
/*** old thingie, remove it later... (put it in winsrv -- console) ***/ +#include <win/conmsg.h> typedef struct _CSRSS_CON_PROCESS_DATA { HANDLE ConsoleEvent;
Modified: branches/ros-csrss/include/reactos/subsys/csr/csrss.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/csr/csrss.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/csr/csrss.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -3,58 +3,12 @@ #ifndef __INCLUDE_CSRSS_CSRSS_H #define __INCLUDE_CSRSS_CSRSS_H
-#define CSR_NATIVE 0x0000 // CSRSRV -#define CSR_CONSOLE 0x0001 // WIN32CSR -#define CSR_GUI 0x0002 // WINSRV -#define CONSOLE_INPUT_MODE_VALID (0x0f) -#define CONSOLE_OUTPUT_MODE_VALID (0x03) +// Used in ntdll/csr/connect.c +#define CSR_CSRSS_SECTION_SIZE (65536)
-#define CSR_CSRSS_SECTION_SIZE (65536) - -typedef VOID (CALLBACK *PCONTROLDISPATCHER)(DWORD); - -typedef struct -{ - USHORT nMaxIds; - PDWORD ProcessId; - ULONG nProcessIdsTotal; -} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST; - -typedef struct -{ - HANDLE UniqueThread; - CLIENT_ID Cid; -} CSRSS_IDENTIFY_ALERTABLE_THREAD, *PCSRSS_IDENTIFY_ALERTABLE_THREAD; - -typedef struct -{ - HANDLE ProcessId; -} CSRSS_REGISTER_SERVICES_PROCESS, *PCSRSS_REGISTER_SERVICES_PROCESS; - -typedef struct -{ - UINT Flags; - DWORD Reserved; -} CSRSS_EXIT_REACTOS, *PCSRSS_EXIT_REACTOS; - -typedef struct -{ - HANDLE Handle; -} CSRSS_CLOSE_HANDLE, *PCSRSS_CLOSE_HANDLE; - -typedef struct -{ - HANDLE Handle; -} CSRSS_VERIFY_HANDLE, *PCSRSS_VERIFY_HANDLE; - -typedef struct -{ - HANDLE Handle; - DWORD Access; - BOOL Inheritable; - DWORD Options; -} CSRSS_DUPLICATE_HANDLE, *PCSRSS_DUPLICATE_HANDLE; +/*** win32csr thingies to remove. ***/ +#if 1
typedef struct { @@ -73,39 +27,7 @@ HWND DesktopWindow; } CSRSS_HIDE_DESKTOP, *PCSRSS_HIDE_DESKTOP;
-typedef struct -{ - HWND LogonNotifyWindow; -} CSRSS_SET_LOGON_NOTIFY_WINDOW, *PCSRSS_SET_LOGON_NOTIFY_WINDOW; - -typedef struct -{ - HANDLE ProcessId; - BOOL Register; -} CSRSS_REGISTER_LOGON_PROCESS, *PCSRSS_REGISTER_LOGON_PROCESS; - -typedef struct -{ - HANDLE InputWaitHandle; -} CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE; - -#define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type)) - -#define REGISTER_SERVICES_PROCESS (0x1D) -#define EXIT_REACTOS (0x1E) -#define CLOSE_HANDLE (0x26) -#define VERIFY_HANDLE (0x27) -#define DUPLICATE_HANDLE (0x28) - -#define CREATE_DESKTOP (0x2B) -#define SHOW_DESKTOP (0x2C) -#define HIDE_DESKTOP (0x2D) - -#define SET_LOGON_NOTIFY_WINDOW (0x2F) -#define REGISTER_LOGON_PROCESS (0x30) -#define GET_INPUT_WAIT_HANDLE (0x35) -#define GET_PROCESS_LIST (0x36) -#define START_SCREEN_SAVER (0x37) - +#endif +/************************************/
#endif /* __INCLUDE_CSRSS_CSRSS_H */
Modified: branches/ros-csrss/include/reactos/subsys/win/base.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/win/base.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/win/base.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -14,7 +14,7 @@ typedef VOID (CALLBACK * BASE_PROCESS_CREATE_NOTIFY_ROUTINE)(PVOID);
NTSTATUS WINAPI BaseSetProcessCreateNotify (BASE_PROCESS_CREATE_NOTIFY_ROUTINE); -CSR_SERVER_DLL_INIT(ServerDllInitialization); +// CSR_SERVER_DLL_INIT(ServerDllInitialization);
typedef struct _NLS_USER_INFO {
Modified: branches/ros-csrss/include/reactos/subsys/win/conmsg.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/win/conmsg.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/win/conmsg.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -112,11 +112,23 @@ } CONSRV_API_NUMBER, *PCONSRV_API_NUMBER;
+#define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type)) #define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)) #define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)) #define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB)) #define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR)) #define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB)) + +#define CONSOLE_INPUT_MODE_VALID (0x0f) +#define CONSOLE_OUTPUT_MODE_VALID (0x03) + + +typedef struct +{ + USHORT nMaxIds; + PDWORD ProcessId; + ULONG nProcessIdsTotal; +} CSRSS_GET_PROCESS_LIST, *PCSRSS_GET_PROCESS_LIST;
typedef struct { @@ -140,6 +152,8 @@ DWORD CtrlWakeupMask; DWORD ControlKeyState; } CSRSS_READ_CONSOLE, *PCSRSS_READ_CONSOLE; + +typedef VOID (CALLBACK *PCONTROLDISPATCHER)(DWORD);
typedef struct { @@ -349,6 +363,24 @@
typedef struct { + HANDLE Handle; +} CSRSS_CLOSE_HANDLE, *PCSRSS_CLOSE_HANDLE; + +typedef struct +{ + HANDLE Handle; +} CSRSS_VERIFY_HANDLE, *PCSRSS_VERIFY_HANDLE; + +typedef struct +{ + HANDLE Handle; + DWORD Access; + BOOL Inheritable; + DWORD Options; +} CSRSS_DUPLICATE_HANDLE, *PCSRSS_DUPLICATE_HANDLE; + +typedef struct +{ DWORD Access; BOOL Inheritable; HANDLE Handle; @@ -356,6 +388,10 @@ } CSRSS_GET_INPUT_HANDLE, *PCSRSS_GET_INPUT_HANDLE, CSRSS_GET_OUTPUT_HANDLE, *PCSRSS_GET_OUTPUT_HANDLE;
+typedef struct +{ + HANDLE InputWaitHandle; +} CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE;
#define CONSOLE_HARDWARE_STATE_GET 0 #define CONSOLE_HARDWARE_STATE_SET 1 @@ -564,6 +600,7 @@ CSRSS_SET_CONSOLE_CP SetConsoleCodePage; CSRSS_GET_CONSOLE_OUTPUT_CP GetConsoleOutputCodePage; CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage; + CSRSS_GET_PROCESS_LIST GetProcessListRequest; } Data; } CONSOLE_API_MESSAGE, *PCONSOLE_API_MESSAGE;
Modified: branches/ros-csrss/include/reactos/subsys/win/winmsg.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/include/reactos/subsys... ============================================================================== --- branches/ros-csrss/include/reactos/subsys/win/winmsg.h [iso-8859-1] (original) +++ branches/ros-csrss/include/reactos/subsys/win/winmsg.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -17,6 +17,66 @@
// CSR_SERVER_DLL_INIT(UserServerDllInitialization);
+typedef enum _USERSRV_API_NUMBER +{ + UserpExitWindowsEx = USERSRV_SERVERDLL_INDEX, + // UserpEndTask, + // UserpLogon, + UserpRegisterServicesProcess, // Not present in Win7 + // UserpActivateDebugger, + // UserpGetThreadConsoleDesktop, // Not present in Win7 + // UserpDeviceEvent, + UserpRegisterLogonProcess, // Not present in Win7 + // UserpCreateSystemThreads, + // UserpRecordShutdownReason, + // UserpCancelShutdown, // Added in Vista + // UserpConsoleHandleOperation, // Added in Win7 + // UserpGetSetShutdownBlockReason, // Added in Vista + + UserpMaxApiNumber +} USERSRV_API_NUMBER, *PUSERSRV_API_NUMBER; + + +typedef struct +{ + UINT Flags; + DWORD Reserved; +} CSRSS_EXIT_REACTOS, *PCSRSS_EXIT_REACTOS; + +typedef struct +{ + HANDLE ProcessId; +} CSRSS_REGISTER_SERVICES_PROCESS, *PCSRSS_REGISTER_SERVICES_PROCESS; + +typedef struct +{ + HANDLE ProcessId; + BOOL Register; +} CSRSS_REGISTER_LOGON_PROCESS, *PCSRSS_REGISTER_LOGON_PROCESS; + +typedef struct +{ + HWND LogonNotifyWindow; +} CSRSS_SET_LOGON_NOTIFY_WINDOW, *PCSRSS_SET_LOGON_NOTIFY_WINDOW; + + +typedef struct _USER_API_MESSAGE +{ + PORT_MESSAGE Header; + + PCSR_CAPTURE_BUFFER CsrCaptureData; + CSR_API_NUMBER ApiNumber; + ULONG Status; // ReturnValue; // NTSTATUS Status + ULONG Reserved; + union + { + CSRSS_EXIT_REACTOS ExitReactosRequest; + CSRSS_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest; + CSRSS_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest; + CSRSS_SET_LOGON_NOTIFY_WINDOW SetLogonNotifyWindowRequest; + } Data; +} USER_API_MESSAGE, *PUSER_API_MESSAGE; + #endif // _WINMSG_H
/* EOF */
Modified: branches/ros-csrss/win32ss/user/consrv/console.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/co... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/console.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/console.c [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -800,6 +800,7 @@
CSR_API(SrvGetConsoleProcessList) { + PCSRSS_GET_PROCESS_LIST GetProcessListRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetProcessListRequest; PDWORD Buffer; PCSR_PROCESS ProcessData = CsrGetClientThread()->Process; PCSRSS_CONSOLE Console; @@ -810,8 +811,8 @@
DPRINT("SrvGetConsoleProcessList\n");
- Buffer = ApiMessage->Data.GetProcessListRequest.ProcessId; - if (!Win32CsrValidateBuffer(ProcessData, Buffer, ApiMessage->Data.GetProcessListRequest.nMaxIds, sizeof(DWORD))) + Buffer = GetProcessListRequest->ProcessId; + if (!Win32CsrValidateBuffer(ProcessData, Buffer, GetProcessListRequest->nMaxIds, sizeof(DWORD))) return STATUS_ACCESS_VIOLATION;
Status = ConioConsoleFromProcessData(ProcessData, &Console); @@ -825,7 +826,7 @@ current_entry = current_entry->Flink) { current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink); - if (++nItems <= ApiMessage->Data.GetProcessListRequest.nMaxIds) + if (++nItems <= GetProcessListRequest->nMaxIds) { *Buffer++ = HandleToUlong(current->ClientId.UniqueProcess); } @@ -833,7 +834,7 @@
ConioUnlockConsole(Console);
- ApiMessage->Data.GetProcessListRequest.nProcessIdsTotal = nItems; + GetProcessListRequest->nProcessIdsTotal = nItems; return STATUS_SUCCESS; }
Modified: branches/ros-csrss/win32ss/user/winsrv/harderror.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/ha... ============================================================================== --- branches/ros-csrss/win32ss/user/winsrv/harderror.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/winsrv/harderror.c [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -9,7 +9,7 @@
/* INCLUDES ******************************************************************/
-#include "w32csr.h" +#include "winsrv.h"
#define NDEBUG #include <debug.h>
Modified: branches/ros-csrss/win32ss/user/winsrv/init.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/in... ============================================================================== --- branches/ros-csrss/win32ss/user/winsrv/init.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/winsrv/init.c [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -24,22 +24,35 @@ PCSR_API_ROUTINE UserServerApiDispatchTable[UserpMaxApiNumber] = { SrvExitWindowsEx, - SrvEndTask, - SrvLogon, + // SrvEndTask, + // SrvLogon, SrvRegisterServicesProcess, // Not present in Win7 - SrvActivateDebugger, - SrvGetThreadConsoleDesktop, // Not present in Win7 - SrvDeviceEvent, + // SrvActivateDebugger, + // SrvGetThreadConsoleDesktop, // Not present in Win7 + // SrvDeviceEvent, SrvRegisterLogonProcess, // Not present in Win7 - SrvCreateSystemThreads, - SrvRecordShutdownReason, - SrvCancelShutdown, // Added in Vista - SrvConsoleHandleOperation, // Added in Win7 - SrvGetSetShutdownBlockReason, // Added in Vista + // SrvCreateSystemThreads, + // SrvRecordShutdownReason, + // SrvCancelShutdown, // Added in Vista + // SrvConsoleHandleOperation, // Added in Win7 + // SrvGetSetShutdownBlockReason, // Added in Vista };
BOOLEAN UserServerApiServerValidTable[UserpMaxApiNumber] = { + FALSE, // SrvExitWindowsEx + // FALSE, // SrvEndTask + // FALSE, // SrvLogon + FALSE, // SrvRegisterServicesProcess + // FALSE, // SrvActivateDebugger + // TRUE, // SrvGetThreadConsoleDesktop + // FALSE, // SrvDeviceEvent + FALSE, // SrvRegisterLogonProcess + // FALSE, // SrvCreateSystemThreads + // FALSE, // SrvRecordShutdownReason + // FALSE, // SrvCancelShutdown + // FALSE, // SrvConsoleHandleOperation + // FALSE, // SrvGetSetShutdownBlockReason
// FALSE }; @@ -47,18 +60,18 @@ PCHAR UserServerApiNameTable[UserpMaxApiNumber] = { "SrvExitWindowsEx", - "SrvEndTask", - "SrvLogon", + // "SrvEndTask", + // "SrvLogon", "SrvRegisterServicesProcess", - "SrvActivateDebugger", - "SrvGetThreadConsoleDesktop", - "SrvDeviceEvent", + // "SrvActivateDebugger", + // "SrvGetThreadConsoleDesktop", + // "SrvDeviceEvent", "SrvRegisterLogonProcess", - "SrvCreateSystemThreads", - "SrvRecordShutdownReason", - "SrvCancelShutdown", - "SrvConsoleHandleOperation", - "SrvGetSetShutdownBlockReason", + // "SrvCreateSystemThreads", + // "SrvRecordShutdownReason", + // "SrvCancelShutdown", + // "SrvConsoleHandleOperation", + // "SrvGetSetShutdownBlockReason",
// NULL }; @@ -301,7 +314,7 @@ * TODO: the console one */ NTSTATUS -CsrpInitVideo (VOID) +CsrpInitVideo(VOID) { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\??\DISPLAY1");
Modified: branches/ros-csrss/win32ss/user/winsrv/shutdown.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/sh... ============================================================================== --- branches/ros-csrss/win32ss/user/winsrv/shutdown.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/winsrv/shutdown.c [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -8,7 +8,7 @@
/* INCLUDES ******************************************************************/
-#include "w32csr.h" +#include "winsrv.h" #include <sddl.h>
#define NDEBUG
Modified: branches/ros-csrss/win32ss/user/winsrv/winsrv.h URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/winsrv/wi... ============================================================================== --- branches/ros-csrss/win32ss/user/winsrv/winsrv.h [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/winsrv/winsrv.h [iso-8859-1] Thu Oct 25 21:37:52 2012 @@ -6,26 +6,47 @@ * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) */
+#ifndef __WINSRV_H__ +#define __WINSRV_H__ + #pragma once
/* PSDK/NDK Headers */ -#include <stdio.h> +#define WIN32_NO_STATUS #include <windows.h> - #define NTOS_MODE_USER #include <ndk/ntndk.h>
-#include <csr/server.h> -#include <win/base.h> -#include <win/windows.h> +// #include <stdio.h>
+/* CSRSS Header */ +#include <csr/csrsrv.h> + +/* USER Headers */ +#include <win/winmsg.h> +// #include <win/base.h> +// #include <win/windows.h> + +#include "resource.h" + + +/* init.c */ +BOOL WINAPI _UserSoundSentry(VOID); + +/* harderror.c */ VOID WINAPI Win32CsrHardError(IN PCSR_THREAD ThreadData, IN PHARDERROR_MSG Message); - + + +/* shutdown.c */ +CSR_API(SrvExitWindowsEx); +CSR_API(CsrSetLogonNotifyWindow); +CSR_API(SrvRegisterLogonProcess); +// CSR_API(CsrRegisterSystemClasses); + CSR_API(SrvRegisterServicesProcess); -
/***************************** @@ -40,12 +61,10 @@ } CSRSS_OBJECT_DEFINITION, *PCSRSS_OBJECT_DEFINITION; */
-/* exitros.c */ -CSR_API(CsrExitReactos); -CSR_API(CsrSetLogonNotifyWindow); -CSR_API(CsrRegisterLogonProcess); -// CSR_API(CsrRegisterSystemClasses); +
*****************************/
+#endif // __WINSRV_H__ + /* EOF */