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 ******************************************************************/
14 /* Not defined in any header file */
15 extern VOID WINAPI
PrivateCsrssManualGuiCheck(LONG Check
);
16 extern VOID WINAPI
PrivateCsrssInitialized();
17 extern VOID WINAPI
InitializeAppSwitchHook();
19 /* GLOBALS *******************************************************************/
21 HANDLE Win32CsrApiHeap
;
22 HINSTANCE Win32CsrDllHandle
= NULL
;
23 static CSRSS_EXPORTED_FUNCS CsrExports
;
25 static CSRSS_API_DEFINITION Win32CsrApiDefinitions
[] =
27 CSRSS_DEFINE_API(WRITE_CONSOLE
, CsrWriteConsole
),
28 CSRSS_DEFINE_API(READ_CONSOLE
, CsrReadConsole
),
29 CSRSS_DEFINE_API(ALLOC_CONSOLE
, CsrAllocConsole
),
30 CSRSS_DEFINE_API(FREE_CONSOLE
, CsrFreeConsole
),
31 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO
, CsrGetScreenBufferInfo
),
32 CSRSS_DEFINE_API(SET_CURSOR
, CsrSetCursor
),
33 CSRSS_DEFINE_API(FILL_OUTPUT
, CsrFillOutputChar
),
34 CSRSS_DEFINE_API(READ_INPUT
, CsrReadInputEvent
),
35 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR
, CsrWriteConsoleOutputChar
),
36 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CsrWriteConsoleOutputAttrib
),
37 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB
, CsrFillOutputAttrib
),
38 CSRSS_DEFINE_API(GET_CURSOR_INFO
, CsrGetCursorInfo
),
39 CSRSS_DEFINE_API(SET_CURSOR_INFO
, CsrSetCursorInfo
),
40 CSRSS_DEFINE_API(SET_ATTRIB
, CsrSetTextAttrib
),
41 CSRSS_DEFINE_API(GET_CONSOLE_MODE
, CsrGetConsoleMode
),
42 CSRSS_DEFINE_API(SET_CONSOLE_MODE
, CsrSetConsoleMode
),
43 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER
, CsrCreateScreenBuffer
),
44 CSRSS_DEFINE_API(SET_SCREEN_BUFFER
, CsrSetScreenBuffer
),
45 CSRSS_DEFINE_API(SET_TITLE
, CsrSetTitle
),
46 CSRSS_DEFINE_API(GET_TITLE
, CsrGetTitle
),
47 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT
, CsrWriteConsoleOutput
),
48 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER
, CsrFlushInputBuffer
),
49 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CsrScrollConsoleScreenBuffer
),
50 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR
, CsrReadConsoleOutputChar
),
51 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB
, CsrReadConsoleOutputAttrib
),
52 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS
, CsrGetNumberOfConsoleInputEvents
),
53 CSRSS_DEFINE_API(EXIT_REACTOS
, CsrExitReactos
),
54 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT
, CsrPeekConsoleInput
),
55 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT
, CsrReadConsoleOutput
),
56 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT
, CsrWriteConsoleInput
),
57 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE
, CsrHardwareStateProperty
),
58 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW
, CsrGetConsoleWindow
),
59 CSRSS_DEFINE_API(CREATE_DESKTOP
, CsrCreateDesktop
),
60 CSRSS_DEFINE_API(SHOW_DESKTOP
, CsrShowDesktop
),
61 CSRSS_DEFINE_API(HIDE_DESKTOP
, CsrHideDesktop
),
62 CSRSS_DEFINE_API(SET_CONSOLE_ICON
, CsrSetConsoleIcon
),
63 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW
, CsrSetLogonNotifyWindow
),
64 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS
, CsrRegisterLogonProcess
),
65 CSRSS_DEFINE_API(GET_CONSOLE_CP
, CsrGetConsoleCodePage
),
66 CSRSS_DEFINE_API(SET_CONSOLE_CP
, CsrSetConsoleCodePage
),
67 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP
, CsrGetConsoleOutputCodePage
),
68 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP
, CsrSetConsoleOutputCodePage
),
69 CSRSS_DEFINE_API(GET_PROCESS_LIST
, CsrGetProcessList
),
70 CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS
, CsrAddConsoleAlias
),
71 CSRSS_DEFINE_API(GET_CONSOLE_ALIAS
, CsrGetConsoleAlias
),
72 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES
, CsrGetAllConsoleAliases
),
73 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CsrGetAllConsoleAliasesLength
),
74 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES
, CsrGetConsoleAliasesExes
),
75 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CsrGetConsoleAliasesExesLength
),
76 CSRSS_DEFINE_API(GENERATE_CTRL_EVENT
, CsrGenerateCtrlEvent
),
80 static CSRSS_OBJECT_DEFINITION Win32CsrObjectDefinitions
[] =
82 { CONIO_CONSOLE_MAGIC
, ConioDeleteConsole
},
83 { CONIO_SCREEN_BUFFER_MAGIC
, ConioDeleteScreenBuffer
},
87 /* FUNCTIONS *****************************************************************/
94 if (DLL_PROCESS_ATTACH
== dwReason
)
96 Win32CsrDllHandle
= hDll
;
97 InitializeAppSwitchHook();
104 Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData
,
110 return (CsrExports
.CsrInsertObjectProc
)(ProcessData
, Handle
, Object
, Access
, Inheritable
);
114 Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData
,
119 return (CsrExports
.CsrGetObjectProc
)(ProcessData
, Handle
, Object
, Access
);
123 Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData
,
131 Status
= (CsrExports
.CsrGetObjectProc
)(ProcessData
, Handle
, Object
, Access
);
132 if (! NT_SUCCESS(Status
))
137 if ((*Object
)->Type
!= Type
)
139 (CsrExports
.CsrReleaseObjectByPointerProc
)(*Object
);
140 return STATUS_INVALID_HANDLE
;
143 EnterCriticalSection(&((*Object
)->Lock
));
145 return STATUS_SUCCESS
;
149 Win32CsrUnlockObject(Object_t
*Object
)
151 LeaveCriticalSection(&(Object
->Lock
));
152 (CsrExports
.CsrReleaseObjectByPointerProc
)(Object
);
156 Win32CsrReleaseObjectByPointer(Object_t
*Object
)
158 return (CsrExports
.CsrReleaseObjectByPointerProc
)(Object
);
162 Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData
,
165 return (CsrExports
.CsrReleaseObjectProc
)(ProcessData
, Object
);
169 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc
,
172 return (CsrExports
.CsrEnumProcessesProc
)(EnumProc
, Context
);
176 Win32CsrInitComplete(void)
178 PrivateCsrssInitialized();
184 Win32CsrHardError(IN PCSRSS_PROCESS_DATA ProcessData
,
185 IN PHARDERROR_MSG HardErrorMessage
)
187 UINT responce
= MB_OK
;
190 OBJECT_ATTRIBUTES ObjectAttributes
;
192 PRTL_MESSAGE_RESOURCE_ENTRY MessageResource
;
193 ULONG_PTR ParameterList
[MAXIMUM_HARDERROR_PARAMETERS
];
194 LPSTR CaptionText
, MessageBody
;
195 LPWSTR szxCaptionText
, szxMessageBody
;
196 DWORD SizeOfAllUnicodeStrings
= 0;
197 PROCESS_BASIC_INFORMATION ClientBasicInfo
;
198 UNICODE_STRING ClientFileNameU
;
199 UNICODE_STRING TempStringU
;
200 UNICODE_STRING ParameterStringU
;
201 ANSI_STRING ParamStringA
;
202 ULONG UnicodeStringParameterMask
= HardErrorMessage
->UnicodeStringParameterMask
;
203 int MessageBoxResponse
;
205 HardErrorMessage
->Response
= ResponseNotHandled
;
207 DPRINT("NumberOfParameters = %d\n", HardErrorMessage
->NumberOfParameters
);
208 DPRINT("Status = %lx\n", HardErrorMessage
->Status
);
210 // open client process
211 InitializeObjectAttributes(&ObjectAttributes
, NULL
, 0, NULL
, NULL
);
212 Status
= NtOpenProcess(&hProcess
, PROCESS_VM_READ
| PROCESS_QUERY_INFORMATION
, &ObjectAttributes
, &HardErrorMessage
->h
.ClientId
);
213 if( !NT_SUCCESS(Status
) ) {
214 DPRINT1("NtOpenProcess failed with code: %lx\n", Status
);
218 // let's get a name of the client process to display it in the caption of a message box
220 ClientFileNameU
.MaximumLength
= 0;
221 ClientFileNameU
.Length
= 0;
222 ClientFileNameU
.Buffer
= NULL
;
223 Status
= NtQueryInformationProcess(hProcess
,
224 ProcessBasicInformation
,
226 sizeof(ClientBasicInfo
),
228 if( NT_SUCCESS(Status
) ) {
229 PLIST_ENTRY ModuleListHead
;
231 PLDR_DATA_TABLE_ENTRY Module
;
233 PPEB Peb
= ClientBasicInfo
.PebBaseAddress
;
237 Status
= NtReadVirtualMemory(hProcess
, &Peb
->Ldr
, &Ldr
, sizeof(Ldr
), NULL
);
238 if( NT_SUCCESS(Status
) ) {
239 ModuleListHead
= &Ldr
->InLoadOrderModuleList
;
240 Status
= NtReadVirtualMemory(
242 &ModuleListHead
->Flink
,
248 if( NT_SUCCESS(Status
) )
250 if (Entry
!= ModuleListHead
)
252 LDR_DATA_TABLE_ENTRY ModuleData
;
253 Module
= CONTAINING_RECORD(Entry
, LDR_DATA_TABLE_ENTRY
, InLoadOrderLinks
);
255 Status
= NtReadVirtualMemory(hProcess
, Module
, &ModuleData
, sizeof(ModuleData
), NULL
);
256 if( NT_SUCCESS(Status
) ) {
259 Status
= NtReadVirtualMemory(
261 &Peb
->ImageBaseAddress
,
263 sizeof(ClientDllBase
),
266 if( NT_SUCCESS(Status
) && (ClientDllBase
== ModuleData
.DllBase
) ) {
268 ClientFileNameU
.MaximumLength
= ModuleData
.BaseDllName
.MaximumLength
;
269 ClientFileNameU
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, ClientFileNameU
.MaximumLength
);
270 Status
= NtReadVirtualMemory(
272 ModuleData
.BaseDllName
.Buffer
,
273 ClientFileNameU
.Buffer
,
274 ClientFileNameU
.MaximumLength
,
277 if( NT_SUCCESS(Status
) ) {
278 ClientFileNameU
.Length
= wcslen(ClientFileNameU
.Buffer
)*sizeof(wchar_t);
281 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
282 ClientFileNameU
.Buffer
= NULL
;
285 DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU
);
294 // read all unicode strings from client space
295 for(nParam
= 0; nParam
< HardErrorMessage
->NumberOfParameters
; nParam
++, UnicodeStringParameterMask
>>= 1)
297 if( UnicodeStringParameterMask
& 0x01 ) {
298 Status
= NtReadVirtualMemory(hProcess
,
299 (PVOID
)HardErrorMessage
->Parameters
[nParam
],
304 if( NT_SUCCESS(Status
) ) {
305 ParameterStringU
.Buffer
= (PWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, TempStringU
.MaximumLength
);
306 if( !ParameterStringU
.Buffer
) {
307 DPRINT1("Cannot allocate memory %d\n", TempStringU
.MaximumLength
);
309 if( ClientFileNameU
.Buffer
) {
310 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
315 Status
= NtReadVirtualMemory(hProcess
,
316 (PVOID
)TempStringU
.Buffer
,
317 (PVOID
)ParameterStringU
.Buffer
,
318 TempStringU
.MaximumLength
,
320 if( !NT_SUCCESS(Status
) ) {
321 DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status
);
322 RtlFreeHeap (RtlGetProcessHeap(), 0, ParameterStringU
.Buffer
);
323 if( ClientFileNameU
.Buffer
) {
324 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
329 ParameterStringU
.Length
= TempStringU
.Length
;
330 ParameterStringU
.MaximumLength
= TempStringU
.MaximumLength
;
331 DPRINT("ParameterStringU=\'%wZ\'\n", &ParameterStringU
);
332 RtlUnicodeStringToAnsiString(&ParamStringA
, &ParameterStringU
, TRUE
);
333 ParameterList
[nParam
] = (ULONG_PTR
)ParamStringA
.Buffer
;
334 SizeOfAllUnicodeStrings
+= ParamStringA
.MaximumLength
;
338 // it's not a unicode string
339 ParameterList
[nParam
] = HardErrorMessage
->Parameters
[nParam
];
345 // get text string of the error code
346 Status
= RtlFindMessage(
347 (PVOID
)GetModuleHandle(TEXT("ntdll")),
348 (ULONG_PTR
)RT_MESSAGETABLE
,
350 HardErrorMessage
->Status
,
352 if( !NT_SUCCESS(Status
) ) {
353 // WE HAVE TO DISPLAY HERE: "Unknown hard error"
354 if( ClientFileNameU
.Buffer
) {
355 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, ClientFileNameU
.MaximumLength
+64);
356 wsprintfW(szxCaptionText
, L
"%s - %hs", ClientFileNameU
.Buffer
, "Application Error");
358 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, 64);
359 wsprintfW(szxCaptionText
, L
"System - Application Error");
361 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, 38);
362 wsprintfA(MessageBody
, "Unknown hard error");
365 LPSTR NtStatusString
;
366 UNICODE_STRING MessageU
;
367 ANSI_STRING MessageA
;
368 USHORT CaptionSize
= 0;
370 if( !MessageResource
->Flags
) {
371 /* we've got an ansi string */
372 DPRINT("MessageResource->Text=%s\n", (PSTR
)MessageResource
->Text
);
373 RtlInitAnsiString(&MessageA
, MessageResource
->Text
);
376 /* we've got a unicode string */
377 DPRINT("MessageResource->Text=%S\n", (PWSTR
)MessageResource
->Text
);
378 RtlInitUnicodeString(&MessageU
, (PWSTR
)MessageResource
->Text
);
379 RtlUnicodeStringToAnsiString(&MessageA
, &MessageU
, TRUE
);
382 // check whether a caption exists
383 if( *MessageA
.Buffer
== '{' ) {
384 // get size of the caption
385 for( CaptionSize
= 0; (CaptionSize
< MessageA
.Length
) && ('}' != MessageA
.Buffer
[CaptionSize
]); CaptionSize
++);
387 CaptionText
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, CaptionSize
);
388 RtlCopyMemory(CaptionText
, MessageA
.Buffer
+1, CaptionSize
-1);
389 CaptionSize
+= 2; // "}\r\n" - 3
391 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(wchar_t)*CaptionSize
+ClientFileNameU
.MaximumLength
+128);
392 if( ClientFileNameU
.Buffer
) {
393 wsprintfW(szxCaptionText
, L
"%s - %hs", ClientFileNameU
.Buffer
, CaptionText
);
395 wsprintfW(szxCaptionText
, L
"System - %hs", CaptionText
);
397 RtlFreeHeap (RtlGetProcessHeap(), 0, CaptionText
);
400 if( ClientFileNameU
.Buffer
) {
401 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, ClientFileNameU
.MaximumLength
);
402 wsprintfW(szxCaptionText
, L
"%s", ClientFileNameU
.Buffer
);
404 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, 14); // 14 - "System\0\0"
405 wsprintfW(szxCaptionText
, L
"System");
408 DPRINT("ParameterList[0]=0x%lx\n", ParameterList
[0]);
409 if( STATUS_UNHANDLED_EXCEPTION
== HardErrorMessage
->Status
)
411 PRTL_MESSAGE_RESOURCE_ENTRY MsgResException
;
413 Status
= RtlFindMessage(
414 (PVOID
)GetModuleHandle(TEXT("ntdll")),
415 (ULONG_PTR
)RT_MESSAGETABLE
,
420 if( NT_SUCCESS(Status
) )
422 UNICODE_STRING ExcMessageU
;
423 ANSI_STRING ExcMessageA
;
424 if( !MsgResException
->Flags
) {
425 /* we've got an ansi string */
426 DPRINT("MsgResException->Text=%s\n", (PSTR
)MsgResException
->Text
);
427 RtlInitAnsiString(&ExcMessageA
, MsgResException
->Text
);
430 /* we've got a unicode string */
431 DPRINT("MsgResException->Text=%S\n", (PWSTR
)MsgResException
->Text
);
432 RtlInitUnicodeString(&ExcMessageU
, (PWSTR
)MsgResException
->Text
);
433 RtlUnicodeStringToAnsiString(&ExcMessageA
, &ExcMessageU
, TRUE
);
436 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MsgResException
->Length
+SizeOfAllUnicodeStrings
+1024); // 1024 is a magic number I think it should be enough
437 if( STATUS_ACCESS_VIOLATION
== ParameterList
[0] ) {
438 LPSTR pOperationType
;
439 if( ParameterList
[2] ) pOperationType
= "written";
440 else pOperationType
= "read";
441 wsprintfA(MessageBody
, ExcMessageA
.Buffer
, ParameterList
[1], ParameterList
[3], pOperationType
);
443 else if( STATUS_IN_PAGE_ERROR
== ParameterList
[0] ) {
444 wsprintfA(MessageBody
, ExcMessageA
.Buffer
, ParameterList
[1], ParameterList
[3], ParameterList
[2]);
448 NtStatusString
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
-CaptionSize
);
449 RtlCopyMemory(NtStatusString
, MessageA
.Buffer
+CaptionSize
, (MessageResource
->Length
-CaptionSize
)-1);
451 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
+SizeOfAllUnicodeStrings
+1024); // 1024 is a magic number I think it should be enough
453 wsprintfA(MessageBody
, NtStatusString
,
454 L
"Unknown software exception",
458 RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString
);
463 NtStatusString
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
-CaptionSize
);
464 RtlCopyMemory(NtStatusString
, MessageA
.Buffer
+CaptionSize
, (MessageResource
->Length
-CaptionSize
)-1);
466 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
+SizeOfAllUnicodeStrings
+1024); // 1024 is a magic number I think it should be enough
468 wsprintfA(MessageBody
, NtStatusString
,
474 RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString
);
476 if( MessageResource
->Flags
) {
477 /* we've got a unicode string */
478 RtlFreeAnsiString(&MessageA
);
481 if( ClientFileNameU
.Buffer
) {
482 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
485 szxMessageBody
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(wchar_t)*(strlen(MessageBody
)+1));
486 wsprintfW(szxMessageBody
, L
"%hs", MessageBody
);
487 RtlFreeHeap (RtlGetProcessHeap(), 0, MessageBody
);
489 switch ( HardErrorMessage
->ValidResponseOptions
)
491 case OptionAbortRetryIgnore
:
492 responce
= MB_ABORTRETRYIGNORE
;
500 responce
= MB_OKCANCEL
;
503 case OptionRetryCancel
:
504 responce
= MB_RETRYCANCEL
;
511 case OptionYesNoCancel
:
512 responce
= MB_YESNOCANCEL
;
515 case OptionShutdownSystem
:
520 DPRINT1("Wrong option: ValidResponseOptions = %d\n", HardErrorMessage
->ValidResponseOptions
);
525 // FIXME: We should not use MessageBox !!!!
526 DPRINT1("%S\n", szxMessageBody
);
527 MessageBoxResponse
= MessageBoxW(0, szxMessageBody
, szxCaptionText
, responce
|MB_ICONERROR
|MB_SYSTEMMODAL
|MB_SETFOREGROUND
);
529 RtlFreeHeap (RtlGetProcessHeap(), 0, szxMessageBody
);
530 RtlFreeHeap (RtlGetProcessHeap(), 0, szxCaptionText
);
532 switch( MessageBoxResponse
)
535 HardErrorMessage
->Response
= ResponseOk
;
539 HardErrorMessage
->Response
= ResponseCancel
;
543 HardErrorMessage
->Response
= ResponseYes
;
547 HardErrorMessage
->Response
= ResponseNo
;
551 HardErrorMessage
->Response
= ResponseAbort
;
555 HardErrorMessage
->Response
= ResponseIgnore
;
559 HardErrorMessage
->Response
= ResponseRetry
;
562 case 10://IDTRYAGAIN:
563 HardErrorMessage
->Response
= ResponseTryAgain
;
566 case 11://IDCONTINUE:
567 HardErrorMessage
->Response
= ResponseContinue
;
580 Win32CsrInitialization(PCSRSS_API_DEFINITION
*ApiDefinitions
,
581 PCSRSS_OBJECT_DEFINITION
*ObjectDefinitions
,
582 CSRPLUGIN_INIT_COMPLETE_PROC
*InitComplete
,
583 CSRPLUGIN_HARDERROR_PROC
*HardError
,
584 PCSRSS_EXPORTED_FUNCS Exports
,
588 CsrExports
= *Exports
;
589 Win32CsrApiHeap
= CsrssApiHeap
;
591 Status
= NtUserInitialize(0 ,NULL
, NULL
);
593 PrivateCsrssManualGuiCheck(0);
594 CsrInitConsoleSupport();
596 *ApiDefinitions
= Win32CsrApiDefinitions
;
597 *ObjectDefinitions
= Win32CsrObjectDefinitions
;
598 *InitComplete
= Win32CsrInitComplete
;
599 *HardError
= Win32CsrHardError
;