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 ******************************************************************/
16 /* Not defined in any header file */
17 extern VOID STDCALL
PrivateCsrssManualGuiCheck(LONG Check
);
18 extern VOID STDCALL
PrivateCsrssInitialized();
19 extern VOID STDCALL
InitializeAppSwitchHook();
21 /* GLOBALS *******************************************************************/
23 HANDLE Win32CsrApiHeap
;
24 HINSTANCE Win32CsrDllHandle
= NULL
;
25 static CSRSS_EXPORTED_FUNCS CsrExports
;
27 static CSRSS_API_DEFINITION Win32CsrApiDefinitions
[] =
29 CSRSS_DEFINE_API(WRITE_CONSOLE
, CsrWriteConsole
),
30 CSRSS_DEFINE_API(READ_CONSOLE
, CsrReadConsole
),
31 CSRSS_DEFINE_API(ALLOC_CONSOLE
, CsrAllocConsole
),
32 CSRSS_DEFINE_API(FREE_CONSOLE
, CsrFreeConsole
),
33 CSRSS_DEFINE_API(SCREEN_BUFFER_INFO
, CsrGetScreenBufferInfo
),
34 CSRSS_DEFINE_API(SET_CURSOR
, CsrSetCursor
),
35 CSRSS_DEFINE_API(FILL_OUTPUT
, CsrFillOutputChar
),
36 CSRSS_DEFINE_API(READ_INPUT
, CsrReadInputEvent
),
37 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_CHAR
, CsrWriteConsoleOutputChar
),
38 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT_ATTRIB
, CsrWriteConsoleOutputAttrib
),
39 CSRSS_DEFINE_API(FILL_OUTPUT_ATTRIB
, CsrFillOutputAttrib
),
40 CSRSS_DEFINE_API(GET_CURSOR_INFO
, CsrGetCursorInfo
),
41 CSRSS_DEFINE_API(SET_CURSOR_INFO
, CsrSetCursorInfo
),
42 CSRSS_DEFINE_API(SET_ATTRIB
, CsrSetTextAttrib
),
43 CSRSS_DEFINE_API(GET_CONSOLE_MODE
, CsrGetConsoleMode
),
44 CSRSS_DEFINE_API(SET_CONSOLE_MODE
, CsrSetConsoleMode
),
45 CSRSS_DEFINE_API(CREATE_SCREEN_BUFFER
, CsrCreateScreenBuffer
),
46 CSRSS_DEFINE_API(SET_SCREEN_BUFFER
, CsrSetScreenBuffer
),
47 CSRSS_DEFINE_API(SET_TITLE
, CsrSetTitle
),
48 CSRSS_DEFINE_API(GET_TITLE
, CsrGetTitle
),
49 CSRSS_DEFINE_API(WRITE_CONSOLE_OUTPUT
, CsrWriteConsoleOutput
),
50 CSRSS_DEFINE_API(FLUSH_INPUT_BUFFER
, CsrFlushInputBuffer
),
51 CSRSS_DEFINE_API(SCROLL_CONSOLE_SCREEN_BUFFER
, CsrScrollConsoleScreenBuffer
),
52 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_CHAR
, CsrReadConsoleOutputChar
),
53 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT_ATTRIB
, CsrReadConsoleOutputAttrib
),
54 CSRSS_DEFINE_API(GET_NUM_INPUT_EVENTS
, CsrGetNumberOfConsoleInputEvents
),
55 CSRSS_DEFINE_API(EXIT_REACTOS
, CsrExitReactos
),
56 CSRSS_DEFINE_API(PEEK_CONSOLE_INPUT
, CsrPeekConsoleInput
),
57 CSRSS_DEFINE_API(READ_CONSOLE_OUTPUT
, CsrReadConsoleOutput
),
58 CSRSS_DEFINE_API(WRITE_CONSOLE_INPUT
, CsrWriteConsoleInput
),
59 CSRSS_DEFINE_API(SETGET_CONSOLE_HW_STATE
, CsrHardwareStateProperty
),
60 CSRSS_DEFINE_API(GET_CONSOLE_WINDOW
, CsrGetConsoleWindow
),
61 CSRSS_DEFINE_API(CREATE_DESKTOP
, CsrCreateDesktop
),
62 CSRSS_DEFINE_API(SHOW_DESKTOP
, CsrShowDesktop
),
63 CSRSS_DEFINE_API(HIDE_DESKTOP
, CsrHideDesktop
),
64 CSRSS_DEFINE_API(SET_CONSOLE_ICON
, CsrSetConsoleIcon
),
65 CSRSS_DEFINE_API(SET_LOGON_NOTIFY_WINDOW
, CsrSetLogonNotifyWindow
),
66 CSRSS_DEFINE_API(REGISTER_LOGON_PROCESS
, CsrRegisterLogonProcess
),
67 CSRSS_DEFINE_API(GET_CONSOLE_CP
, CsrGetConsoleCodePage
),
68 CSRSS_DEFINE_API(SET_CONSOLE_CP
, CsrSetConsoleCodePage
),
69 CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP
, CsrGetConsoleOutputCodePage
),
70 CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP
, CsrSetConsoleOutputCodePage
),
71 CSRSS_DEFINE_API(GET_PROCESS_LIST
, CsrGetProcessList
),
72 CSRSS_DEFINE_API(ADD_CONSOLE_ALIAS
, CsrAddConsoleAlias
),
73 CSRSS_DEFINE_API(GET_CONSOLE_ALIAS
, CsrGetConsoleAlias
),
74 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES
, CsrGetAllConsoleAliases
),
75 CSRSS_DEFINE_API(GET_ALL_CONSOLE_ALIASES_LENGTH
, CsrGetAllConsoleAliasesLength
),
76 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES
, CsrGetConsoleAliasesExes
),
77 CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH
, CsrGetConsoleAliasesExesLength
),
78 CSRSS_DEFINE_API(GENERATE_CTRL_EVENT
, CsrGenerateCtrlEvent
),
82 static CSRSS_OBJECT_DEFINITION Win32CsrObjectDefinitions
[] =
84 { CONIO_CONSOLE_MAGIC
, ConioDeleteConsole
},
85 { CONIO_SCREEN_BUFFER_MAGIC
, ConioDeleteScreenBuffer
},
89 /* FUNCTIONS *****************************************************************/
96 if (DLL_PROCESS_ATTACH
== dwReason
)
98 Win32CsrDllHandle
= hDll
;
99 InitializeAppSwitchHook();
106 Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData
,
112 return (CsrExports
.CsrInsertObjectProc
)(ProcessData
, Handle
, Object
, Access
, Inheritable
);
116 Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData
,
121 return (CsrExports
.CsrGetObjectProc
)(ProcessData
, Handle
, Object
, Access
);
125 Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData
,
133 Status
= (CsrExports
.CsrGetObjectProc
)(ProcessData
, Handle
, Object
, Access
);
134 if (! NT_SUCCESS(Status
))
139 if ((*Object
)->Type
!= Type
)
141 (CsrExports
.CsrReleaseObjectByPointerProc
)(*Object
);
142 return STATUS_INVALID_HANDLE
;
145 EnterCriticalSection(&((*Object
)->Lock
));
147 return STATUS_SUCCESS
;
151 Win32CsrUnlockObject(Object_t
*Object
)
153 LeaveCriticalSection(&(Object
->Lock
));
154 (CsrExports
.CsrReleaseObjectByPointerProc
)(Object
);
158 Win32CsrReleaseObjectByPointer(Object_t
*Object
)
160 return (CsrExports
.CsrReleaseObjectByPointerProc
)(Object
);
164 Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData
,
167 return (CsrExports
.CsrReleaseObjectProc
)(ProcessData
, Object
);
171 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc
,
174 return (CsrExports
.CsrEnumProcessesProc
)(EnumProc
, Context
);
178 Win32CsrInitComplete(void)
180 PrivateCsrssInitialized();
186 Win32CsrHardError(IN PCSRSS_PROCESS_DATA ProcessData
,
187 IN PHARDERROR_MSG HardErrorMessage
)
189 UINT responce
= MB_OK
;
192 OBJECT_ATTRIBUTES ObjectAttributes
;
194 PRTL_MESSAGE_RESOURCE_ENTRY MessageResource
;
195 ULONG ParameterList
[MAXIMUM_HARDERROR_PARAMETERS
];
196 LPSTR CaptionText
, MessageBody
;
197 LPWSTR szxCaptionText
, szxMessageBody
;
198 DWORD SizeOfAllUnicodeStrings
= 0;
199 PROCESS_BASIC_INFORMATION ClientBasicInfo
;
200 UNICODE_STRING ClientFileNameU
;
201 UNICODE_STRING TempStringU
;
202 UNICODE_STRING ParameterStringU
;
203 ANSI_STRING ParamStringA
;
204 ULONG UnicodeStringParameterMask
= HardErrorMessage
->UnicodeStringParameterMask
;
205 int MessageBoxResponse
;
207 HardErrorMessage
->Response
= ResponseNotHandled
;
209 DPRINT("NumberOfParameters = %d\n", HardErrorMessage
->NumberOfParameters
);
210 DPRINT("Status = %lx\n", HardErrorMessage
->Status
);
212 // open client process
213 InitializeObjectAttributes(&ObjectAttributes
, NULL
, 0, NULL
, NULL
);
214 Status
= NtOpenProcess(&hProcess
, PROCESS_VM_READ
| PROCESS_QUERY_INFORMATION
, &ObjectAttributes
, &HardErrorMessage
->h
.ClientId
);
215 if( !NT_SUCCESS(Status
) ) {
216 DPRINT1("NtOpenProcess failed with code: %lx\n", Status
);
220 // let's get a name of the client process to display it in the caption of a message box
222 ClientFileNameU
.MaximumLength
= 0;
223 ClientFileNameU
.Length
= 0;
224 ClientFileNameU
.Buffer
= NULL
;
225 Status
= NtQueryInformationProcess(hProcess
,
226 ProcessBasicInformation
,
228 sizeof(ClientBasicInfo
),
230 if( NT_SUCCESS(Status
) ) {
231 PLIST_ENTRY ModuleListHead
;
233 PLDR_DATA_TABLE_ENTRY Module
;
235 PPEB Peb
= ClientBasicInfo
.PebBaseAddress
;
239 Status
= NtReadVirtualMemory(hProcess
, &Peb
->Ldr
, &Ldr
, sizeof(Ldr
), NULL
);
240 if( NT_SUCCESS(Status
) ) {
241 ModuleListHead
= &Ldr
->InLoadOrderModuleList
;
242 Status
= NtReadVirtualMemory(
244 &ModuleListHead
->Flink
,
250 if( NT_SUCCESS(Status
) )
252 if (Entry
!= ModuleListHead
)
254 LDR_DATA_TABLE_ENTRY ModuleData
;
255 Module
= CONTAINING_RECORD(Entry
, LDR_DATA_TABLE_ENTRY
, InLoadOrderLinks
);
257 Status
= NtReadVirtualMemory(hProcess
, Module
, &ModuleData
, sizeof(ModuleData
), NULL
);
258 if( NT_SUCCESS(Status
) ) {
261 Status
= NtReadVirtualMemory(
263 &Peb
->ImageBaseAddress
,
265 sizeof(ClientDllBase
),
268 if( NT_SUCCESS(Status
) && (ClientDllBase
== ModuleData
.DllBase
) ) {
270 ClientFileNameU
.MaximumLength
= ModuleData
.BaseDllName
.MaximumLength
;
271 ClientFileNameU
.Buffer
= RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, ClientFileNameU
.MaximumLength
);
272 Status
= NtReadVirtualMemory(
274 ModuleData
.BaseDllName
.Buffer
,
275 ClientFileNameU
.Buffer
,
276 ClientFileNameU
.MaximumLength
,
279 if( NT_SUCCESS(Status
) ) {
280 ClientFileNameU
.Length
= wcslen(ClientFileNameU
.Buffer
)*sizeof(wchar_t);
283 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
284 ClientFileNameU
.Buffer
= NULL
;
287 DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU
);
296 // read all unicode strings from client space
297 for(nParam
= 0; nParam
< HardErrorMessage
->NumberOfParameters
; nParam
++, UnicodeStringParameterMask
>>= 1)
299 if( UnicodeStringParameterMask
& 0x01 ) {
300 Status
= NtReadVirtualMemory(hProcess
,
301 (PVOID
)HardErrorMessage
->Parameters
[nParam
],
306 if( NT_SUCCESS(Status
) ) {
307 ParameterStringU
.Buffer
= (PWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, TempStringU
.MaximumLength
);
308 if( !ParameterStringU
.Buffer
) {
309 DPRINT1("Cannot allocate memory %d\n", TempStringU
.MaximumLength
);
311 if( ClientFileNameU
.Buffer
) {
312 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
317 Status
= NtReadVirtualMemory(hProcess
,
318 (PVOID
)TempStringU
.Buffer
,
319 (PVOID
)ParameterStringU
.Buffer
,
320 TempStringU
.MaximumLength
,
322 if( !NT_SUCCESS(Status
) ) {
323 DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status
);
324 RtlFreeHeap (RtlGetProcessHeap(), 0, ParameterStringU
.Buffer
);
325 if( ClientFileNameU
.Buffer
) {
326 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
331 ParameterStringU
.Length
= TempStringU
.Length
;
332 ParameterStringU
.MaximumLength
= TempStringU
.MaximumLength
;
333 DPRINT("ParameterStringU=\'%wZ\'\n", &ParameterStringU
);
334 RtlUnicodeStringToAnsiString(&ParamStringA
, &ParameterStringU
, TRUE
);
335 ParameterList
[nParam
] = (ULONG
)ParamStringA
.Buffer
;
336 SizeOfAllUnicodeStrings
+= ParamStringA
.MaximumLength
;
340 // it's not a unicode string
341 ParameterList
[nParam
] = HardErrorMessage
->Parameters
[nParam
];
347 // get text string of the error code
348 Status
= RtlFindMessage(
349 (PVOID
)GetModuleHandle(TEXT("ntdll")),
350 (ULONG
)RT_MESSAGETABLE
,
352 HardErrorMessage
->Status
,
354 if( !NT_SUCCESS(Status
) ) {
355 // WE HAVE TO DISPLAY HERE: "Unknown hard error"
356 if( ClientFileNameU
.Buffer
) {
357 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, ClientFileNameU
.MaximumLength
+64);
358 wsprintfW(szxCaptionText
, L
"%s - %hs", ClientFileNameU
.Buffer
, "Application Error");
360 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, 64);
361 wsprintfW(szxCaptionText
, L
"System - Application Error");
363 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, 38);
364 wsprintfA(MessageBody
, "Unknown hard error");
367 LPSTR NtStatusString
;
368 UNICODE_STRING MessageU
;
369 ANSI_STRING MessageA
;
370 USHORT CaptionSize
= 0;
372 if( !MessageResource
->Flags
) {
373 /* we've got an ansi string */
374 DPRINT("MessageResource->Text=%s\n", (PSTR
)MessageResource
->Text
);
375 RtlInitAnsiString(&MessageA
, MessageResource
->Text
);
378 /* we've got a unicode string */
379 DPRINT("MessageResource->Text=%S\n", (PWSTR
)MessageResource
->Text
);
380 RtlInitUnicodeString(&MessageU
, (PWSTR
)MessageResource
->Text
);
381 RtlUnicodeStringToAnsiString(&MessageA
, &MessageU
, TRUE
);
384 // check whether a caption exists
385 if( *MessageA
.Buffer
== '{' ) {
386 // get size of the caption
387 for( CaptionSize
= 0; (CaptionSize
< MessageA
.Length
) && ('}' != MessageA
.Buffer
[CaptionSize
]); CaptionSize
++);
389 CaptionText
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, CaptionSize
);
390 RtlCopyMemory(CaptionText
, MessageA
.Buffer
+1, CaptionSize
-1);
391 CaptionSize
+= 3; // "}\r\n" - 3
393 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(wchar_t)*CaptionSize
+ClientFileNameU
.MaximumLength
+128);
394 if( ClientFileNameU
.Buffer
) {
395 wsprintfW(szxCaptionText
, L
"%s - %hs", ClientFileNameU
.Buffer
, CaptionText
);
397 wsprintfW(szxCaptionText
, L
"System - %hs", CaptionText
);
399 RtlFreeHeap (RtlGetProcessHeap(), 0, CaptionText
);
402 if( ClientFileNameU
.Buffer
) {
403 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, ClientFileNameU
.MaximumLength
);
404 wsprintfW(szxCaptionText
, L
"%s", ClientFileNameU
.Buffer
);
406 szxCaptionText
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, 14); // 14 - "System\0\0"
407 wsprintfW(szxCaptionText
, L
"System");
410 DPRINT("ParameterList[0]=0x%lx\n", ParameterList
[0]);
411 if( STATUS_UNHANDLED_EXCEPTION
== HardErrorMessage
->Status
)
413 PRTL_MESSAGE_RESOURCE_ENTRY MsgResException
;
415 Status
= RtlFindMessage(
416 (PVOID
)GetModuleHandle(TEXT("ntdll")),
417 (ULONG
)RT_MESSAGETABLE
,
422 if( NT_SUCCESS(Status
) )
424 UNICODE_STRING ExcMessageU
;
425 ANSI_STRING ExcMessageA
;
426 if( !MsgResException
->Flags
) {
427 /* we've got an ansi string */
428 DPRINT("MsgResException->Text=%s\n", (PSTR
)MsgResException
->Text
);
429 RtlInitAnsiString(&ExcMessageA
, MsgResException
->Text
);
432 /* we've got a unicode string */
433 DPRINT("MsgResException->Text=%S\n", (PWSTR
)MsgResException
->Text
);
434 RtlInitUnicodeString(&ExcMessageU
, (PWSTR
)MsgResException
->Text
);
435 RtlUnicodeStringToAnsiString(&ExcMessageA
, &ExcMessageU
, TRUE
);
438 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MsgResException
->Length
+SizeOfAllUnicodeStrings
+1024); // 1024 is a magic number I think it should be enough
439 if( STATUS_ACCESS_VIOLATION
== ParameterList
[0] ) {
440 LPSTR pOperationType
;
441 if( ParameterList
[2] ) pOperationType
= "written";
442 else pOperationType
= "read";
443 wsprintfA(MessageBody
, ExcMessageA
.Buffer
, ParameterList
[1], ParameterList
[3], pOperationType
);
445 else if( STATUS_IN_PAGE_ERROR
== ParameterList
[0] ) {
446 wsprintfA(MessageBody
, ExcMessageA
.Buffer
, ParameterList
[1], ParameterList
[3], ParameterList
[2]);
450 NtStatusString
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
-CaptionSize
);
451 RtlCopyMemory(NtStatusString
, MessageA
.Buffer
+CaptionSize
, (MessageResource
->Length
-CaptionSize
)-1);
453 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
+SizeOfAllUnicodeStrings
+1024); // 1024 is a magic number I think it should be enough
455 wsprintfA(MessageBody
, NtStatusString
,
456 L
"Unknown software exception",
460 RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString
);
465 NtStatusString
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
-CaptionSize
);
466 RtlCopyMemory(NtStatusString
, MessageA
.Buffer
+CaptionSize
, (MessageResource
->Length
-CaptionSize
)-1);
468 MessageBody
= (LPSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, MessageResource
->Length
+SizeOfAllUnicodeStrings
+1024); // 1024 is a magic number I think it should be enough
470 wsprintfA(MessageBody
, NtStatusString
,
476 RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString
);
478 if( MessageResource
->Flags
) {
479 /* we've got a unicode string */
480 RtlFreeAnsiString(&MessageA
);
483 if( ClientFileNameU
.Buffer
) {
484 RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU
.Buffer
);
487 szxMessageBody
= (LPWSTR
)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(wchar_t)*(strlen(MessageBody
)+1));
488 wsprintfW(szxMessageBody
, L
"%hs", MessageBody
);
489 RtlFreeHeap (RtlGetProcessHeap(), 0, MessageBody
);
491 switch ( HardErrorMessage
->ValidResponseOptions
)
493 case OptionAbortRetryIgnore
:
494 responce
= MB_ABORTRETRYIGNORE
;
502 responce
= MB_OKCANCEL
;
505 case OptionRetryCancel
:
506 responce
= MB_RETRYCANCEL
;
513 case OptionYesNoCancel
:
514 responce
= MB_YESNOCANCEL
;
517 case OptionShutdownSystem
:
522 DPRINT1("Wrong option: ValidResponseOptions = %d\n", HardErrorMessage
->ValidResponseOptions
);
527 // FIXME: We should not use MessageBox !!!!
528 DPRINT1("%S\n", szxMessageBody
);
529 MessageBoxResponse
= MessageBoxW(0, szxMessageBody
, szxCaptionText
, responce
|MB_ICONERROR
|MB_SYSTEMMODAL
|MB_SETFOREGROUND
);
531 RtlFreeHeap (RtlGetProcessHeap(), 0, szxMessageBody
);
532 RtlFreeHeap (RtlGetProcessHeap(), 0, szxCaptionText
);
534 switch( MessageBoxResponse
)
537 HardErrorMessage
->Response
= ResponseOk
;
541 HardErrorMessage
->Response
= ResponseCancel
;
545 HardErrorMessage
->Response
= ResponseYes
;
549 HardErrorMessage
->Response
= ResponseNo
;
553 HardErrorMessage
->Response
= ResponseAbort
;
557 HardErrorMessage
->Response
= ResponseIgnore
;
561 HardErrorMessage
->Response
= ResponseRetry
;
564 case 10://IDTRYAGAIN:
565 HardErrorMessage
->Response
= ResponseTryAgain
;
568 case 11://IDCONTINUE:
569 HardErrorMessage
->Response
= ResponseContinue
;
582 Win32CsrInitialization(PCSRSS_API_DEFINITION
*ApiDefinitions
,
583 PCSRSS_OBJECT_DEFINITION
*ObjectDefinitions
,
584 CSRPLUGIN_INIT_COMPLETE_PROC
*InitComplete
,
585 CSRPLUGIN_HARDERROR_PROC
*HardError
,
586 PCSRSS_EXPORTED_FUNCS Exports
,
590 CsrExports
= *Exports
;
591 Win32CsrApiHeap
= CsrssApiHeap
;
593 Status
= NtUserInitialize(0 ,NULL
, NULL
);
595 PrivateCsrssManualGuiCheck(0);
596 CsrInitConsoleSupport();
598 *ApiDefinitions
= Win32CsrApiDefinitions
;
599 *ObjectDefinitions
= Win32CsrObjectDefinitions
;
600 *InitComplete
= Win32CsrInitComplete
;
601 *HardError
= Win32CsrHardError
;