2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: subsys/csrss/win32csr/dllmain.c
5 * PURPOSE: Initialization
6 * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru)
9 /* INCLUDES ******************************************************************/
15 /* Not defined in any header file */
16 extern VOID WINAPI
PrivateCsrssManualGuiCheck(LONG Check
);
17 extern LIST_ENTRY DosDeviceHistory
;
18 extern RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec
;
20 /* GLOBALS *******************************************************************/
22 HANDLE Win32CsrApiHeap
;
23 HINSTANCE Win32CsrDllHandle
= NULL
;
24 static CSRSS_EXPORTED_FUNCS CsrExports
;
26 static CSRSS_API_DEFINITION Win32CsrApiDefinitions
[] =
28 CSRSS_DEFINE_API(GET_INPUT_HANDLE
, CsrGetHandle
),
29 CSRSS_DEFINE_API(GET_OUTPUT_HANDLE
, CsrGetHandle
),
30 CSRSS_DEFINE_API(CLOSE_HANDLE
, CsrCloseHandle
),
31 CSRSS_DEFINE_API(VERIFY_HANDLE
, CsrVerifyHandle
),
32 CSRSS_DEFINE_API(DUPLICATE_HANDLE
, CsrDuplicateHandle
),
33 CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE
, CsrGetInputWaitHandle
),
34 CSRSS_DEFINE_API(WRITE_CONSOLE
, CsrWriteConsole
),
35 CSRSS_DEFINE_API(READ_CONSOLE
, CsrReadConsole
),
36 CSRSS_DEFINE_API(ALLOC_CONSOLE
, CsrAllocConsole
),
37 CSRSS_DEFINE_API(FREE_CONSOLE
, CsrFreeConsole
),
38 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO
, CsrGetScreenBufferInfo
),
39 CSRSS_DEFINE_API(SET_CURSOR
, CsrSetCursor
),
40 CSRSS_DEFINE_API(FILL_OUTPUT
, CsrFillOutputChar
),
41 CSRSS_DEFINE_API(READ_INPUT
, CsrReadInputEvent
),
42 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR
, CsrWriteConsoleOutputChar
),
43 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CsrWriteConsoleOutputAttrib
),
44 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB
, CsrFillOutputAttrib
),
45 CSRSS_DEFINE_API(GET_CURSOR_INFO
, CsrGetCursorInfo
),
46 CSRSS_DEFINE_API(SET_CURSOR_INFO
, CsrSetCursorInfo
),
47 CSRSS_DEFINE_API(SET_ATTRIB
, CsrSetTextAttrib
),
48 CSRSS_DEFINE_API(GET_CONSOLE_MODE
, CsrGetConsoleMode
),
49 CSRSS_DEFINE_API(SET_CONSOLE_MODE
, CsrSetConsoleMode
),
50 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER
, CsrCreateScreenBuffer
),
51 CSRSS_DEFINE_API(SET_SCREEN_BUFFER
, CsrSetScreenBuffer
),
52 CSRSS_DEFINE_API(SET_TITLE
, CsrSetTitle
),
53 CSRSS_DEFINE_API(GET_TITLE
, CsrGetTitle
),
54 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT
, CsrWriteConsoleOutput
),
55 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER
, CsrFlushInputBuffer
),
56 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CsrScrollConsoleScreenBuffer
),
57 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR
, CsrReadConsoleOutputChar
),
58 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB
, CsrReadConsoleOutputAttrib
),
59 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS
, CsrGetNumberOfConsoleInputEvents
),
60 CSRSS_DEFINE_API(EXIT_REACTOS
, CsrExitReactos
),
61 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT
, CsrPeekConsoleInput
),
62 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT
, CsrReadConsoleOutput
),
63 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT
, CsrWriteConsoleInput
),
64 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE
, CsrHardwareStateProperty
),
65 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW
, CsrGetConsoleWindow
),
66 CSRSS_DEFINE_API(CREATE_DESKTOP
, CsrCreateDesktop
),
67 CSRSS_DEFINE_API(SHOW_DESKTOP
, CsrShowDesktop
),
68 CSRSS_DEFINE_API(HIDE_DESKTOP
, CsrHideDesktop
),
69 CSRSS_DEFINE_API(SET_CONSOLE_ICON
, CsrSetConsoleIcon
),
70 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW
, CsrSetLogonNotifyWindow
),
71 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS
, CsrRegisterLogonProcess
),
72 CSRSS_DEFINE_API(GET_CONSOLE_CP
, CsrGetConsoleCodePage
),
73 CSRSS_DEFINE_API(SET_CONSOLE_CP
, CsrSetConsoleCodePage
),
74 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP
, CsrGetConsoleOutputCodePage
),
75 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP
, CsrSetConsoleOutputCodePage
),
76 CSRSS_DEFINE_API(GET_PROCESS_LIST
, CsrGetProcessList
),
77 CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS
, CsrAddConsoleAlias
),
78 CSRSS_DEFINE_API(GET_CONSOLE_ALIAS
, CsrGetConsoleAlias
),
79 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES
, CsrGetAllConsoleAliases
),
80 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CsrGetAllConsoleAliasesLength
),
81 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES
, CsrGetConsoleAliasesExes
),
82 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CsrGetConsoleAliasesExesLength
),
83 CSRSS_DEFINE_API(GENERATE_CTRL_EVENT
, CsrGenerateCtrlEvent
),
84 CSRSS_DEFINE_API(SET_SCREEN_BUFFER_SIZE
, CsrSetScreenBufferSize
),
85 CSRSS_DEFINE_API(GET_CONSOLE_SELECTION_INFO
, CsrGetConsoleSelectionInfo
),
86 CSRSS_DEFINE_API(GET_COMMAND_HISTORY_LENGTH
, CsrGetCommandHistoryLength
),
87 CSRSS_DEFINE_API(GET_COMMAND_HISTORY
, CsrGetCommandHistory
),
88 CSRSS_DEFINE_API(EXPUNGE_COMMAND_HISTORY
, CsrExpungeCommandHistory
),
89 CSRSS_DEFINE_API(SET_HISTORY_NUMBER_COMMANDS
, CsrSetHistoryNumberCommands
),
90 CSRSS_DEFINE_API(GET_HISTORY_INFO
, CsrGetHistoryInfo
),
91 CSRSS_DEFINE_API(SET_HISTORY_INFO
, CsrSetHistoryInfo
),
92 CSRSS_DEFINE_API(GET_TEMP_FILE
, CsrGetTempFile
),
93 CSRSS_DEFINE_API(DEFINE_DOS_DEVICE
, CsrDefineDosDevice
),
97 static HHOOK hhk
= NULL
;
99 /* FUNCTIONS *****************************************************************/
108 return CallNextHookEx(hhk
, nCode
, wParam
, lParam
);
116 if (DLL_PROCESS_ATTACH
== dwReason
)
118 Win32CsrDllHandle
= hDll
;
120 // HACK HACK HACK ReactOS to BOOT! Initialization BUG ALERT! See bug 5655.
122 hhk
= SetWindowsHookEx(WH_KEYBOARD_LL
, KeyboardHookProc
, NULL
, 0);
123 // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
124 // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
125 // BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
128 if (DLL_PROCESS_DETACH
== dwReason
)
130 CsrCleanupDefineDosDevice();
135 /* Ensure that a captured buffer is safe to access */
137 Win32CsrValidateBuffer(PCSRSS_PROCESS_DATA ProcessData
, PVOID Buffer
,
138 SIZE_T NumElements
, SIZE_T ElementSize
)
140 /* Check that the following conditions are true:
141 * 1. The start of the buffer is somewhere within the process's
142 * shared memory section view.
143 * 2. The remaining space in the view is at least as large as the buffer.
144 * (NB: Please don't try to "optimize" this by using multiplication
145 * instead of division; remember that 2147483648 * 2 = 0.)
146 * 3. The buffer is DWORD-aligned.
148 ULONG_PTR Offset
= (BYTE
*)Buffer
- (BYTE
*)ProcessData
->CsrSectionViewBase
;
149 if (Offset
>= ProcessData
->CsrSectionViewSize
150 || NumElements
> (ProcessData
->CsrSectionViewSize
- Offset
) / ElementSize
151 || (Offset
& (sizeof(DWORD
) - 1)) != 0)
153 DPRINT1("Invalid buffer %p(%u*%u); section view is %p(%u)\n",
154 Buffer
, NumElements
, ElementSize
,
155 ProcessData
->CsrSectionViewBase
, ProcessData
->CsrSectionViewSize
);
162 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc
,
165 return (CsrExports
.CsrEnumProcessesProc
)(EnumProc
, Context
);
169 Win32CsrInitComplete(void)
176 PrivateCsrssManualGuiCheck(LONG Check
)
178 NtUserCallOneParam(Check
, ONEPARAM_ROUTINE_CSRSS_GUICHECK
);
182 Win32CsrInitialization(PCSRSS_API_DEFINITION
*ApiDefinitions
,
183 PCSRPLUGIN_SERVER_PROCS ServerProcs
,
184 PCSRSS_EXPORTED_FUNCS Exports
,
188 CsrExports
= *Exports
;
189 Win32CsrApiHeap
= CsrssApiHeap
;
191 Status
= NtUserInitialize(0, NULL
, NULL
);
193 PrivateCsrssManualGuiCheck(0);
194 CsrInitConsoleSupport();
196 *ApiDefinitions
= Win32CsrApiDefinitions
;
197 ServerProcs
->InitCompleteProc
= Win32CsrInitComplete
;
198 ServerProcs
->HardErrorProc
= Win32CsrHardError
;
199 ServerProcs
->ProcessInheritProc
= Win32CsrDuplicateHandleTable
;
200 ServerProcs
->ProcessDeletedProc
= Win32CsrReleaseConsole
;
202 Status
= RtlInitializeCriticalSection(&Win32CsrDefineDosDeviceCritSec
);
203 InitializeListHead(&DosDeviceHistory
);