[FORMATTING] Standardize win32csr to 4-space indents. Based on a patch by Adam Kachwa...
[reactos.git] / reactos / subsystems / win32 / csrss / win32csr / dllmain.c
index 2b3c6b7..7d8b7e2 100644 (file)
@@ -23,7 +23,13 @@ HINSTANCE Win32CsrDllHandle = NULL;
 static CSRSS_EXPORTED_FUNCS CsrExports;
 
 static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
-  {
+{
+    CSRSS_DEFINE_API(GET_INPUT_HANDLE,             CsrGetHandle),
+    CSRSS_DEFINE_API(GET_OUTPUT_HANDLE,            CsrGetHandle),
+    CSRSS_DEFINE_API(CLOSE_HANDLE,                 CsrCloseHandle),
+    CSRSS_DEFINE_API(VERIFY_HANDLE,                CsrVerifyHandle),
+    CSRSS_DEFINE_API(DUPLICATE_HANDLE,             CsrDuplicateHandle),
+    CSRSS_DEFINE_API(GET_INPUT_WAIT_HANDLE,        CsrGetInputWaitHandle),
     CSRSS_DEFINE_API(WRITE_CONSOLE,                CsrWriteConsole),
     CSRSS_DEFINE_API(READ_CONSOLE,                 CsrReadConsole),
     CSRSS_DEFINE_API(ALLOC_CONSOLE,                CsrAllocConsole),
@@ -74,531 +80,64 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
     CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES,        CsrGetConsoleAliasesExes),
     CSRSS_DEFINE_API(GET_CONSOLE_ALIASES_EXES_LENGTH, CsrGetConsoleAliasesExesLength),
     CSRSS_DEFINE_API(GENERATE_CTRL_EVENT,          CsrGenerateCtrlEvent),
+    CSRSS_DEFINE_API(SET_SCREEN_BUFFER_SIZE,       CsrSetScreenBufferSize),
+    CSRSS_DEFINE_API(GET_CONSOLE_SELECTION_INFO,   CsrGetConsoleSelectionInfo),
     { 0, 0, NULL }
-  };
-
-static CSRSS_OBJECT_DEFINITION Win32CsrObjectDefinitions[] =
-  {
-    { CONIO_CONSOLE_MAGIC,       ConioDeleteConsole },
-    { CONIO_SCREEN_BUFFER_MAGIC, ConioDeleteScreenBuffer },
-    { 0,                         NULL }
-  };
+};
 
 /* FUNCTIONS *****************************************************************/
 
 BOOL WINAPI
 DllMain(HANDLE hDll,
-       DWORD dwReason,
-       LPVOID lpReserved)
-{
-  if (DLL_PROCESS_ATTACH == dwReason)
-    {
-      Win32CsrDllHandle = hDll;
-      InitializeAppSwitchHook();
-    }
-
-  return TRUE;
-}
-
-NTSTATUS FASTCALL
-Win32CsrInsertObject(PCSRSS_PROCESS_DATA ProcessData,
-                      PHANDLE Handle,
-                      Object_t *Object,
-                      DWORD Access,
-                      BOOL Inheritable)
-{
-  return (CsrExports.CsrInsertObjectProc)(ProcessData, Handle, Object, Access, Inheritable);
-}
-
-NTSTATUS FASTCALL
-Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
-                 HANDLE Handle,
-                 Object_t **Object,
-                 DWORD Access)
+        DWORD dwReason,
+        LPVOID lpReserved)
 {
-  return (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access);
-}
-
-NTSTATUS FASTCALL
-Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData,
-                   HANDLE Handle,
-                   Object_t **Object,
-                   DWORD Access,
-                   LONG Type)
-{
-  NTSTATUS Status;
-
-  Status = (CsrExports.CsrGetObjectProc)(ProcessData, Handle, Object, Access);
-  if (! NT_SUCCESS(Status))
+    if (DLL_PROCESS_ATTACH == dwReason)
     {
-      return Status;
+        Win32CsrDllHandle = hDll;
+        InitializeAppSwitchHook();
     }
 
-  if ((*Object)->Type != Type)
-    {
-      (CsrExports.CsrReleaseObjectByPointerProc)(*Object);
-      return STATUS_INVALID_HANDLE;
-    }
-
-  EnterCriticalSection(&((*Object)->Lock));
-
-  return STATUS_SUCCESS;
-}
-
-VOID FASTCALL
-Win32CsrUnlockObject(Object_t *Object)
-{
-  LeaveCriticalSection(&(Object->Lock));
-  (CsrExports.CsrReleaseObjectByPointerProc)(Object);
-}
-
-NTSTATUS FASTCALL
-Win32CsrReleaseObjectByPointer(Object_t *Object)
-{
-  return (CsrExports.CsrReleaseObjectByPointerProc)(Object);
-}
-
-NTSTATUS FASTCALL
-Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
-                      HANDLE Object)
-{
-  return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
+    return TRUE;
 }
 
 NTSTATUS FASTCALL
 Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
                       PVOID Context)
 {
-  return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context);
+    return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context);
 }
 
 static BOOL WINAPI
 Win32CsrInitComplete(void)
 {
-  PrivateCsrssInitialized();
-
-  return TRUE;
-}
-
-static BOOL WINAPI
-Win32CsrHardError(IN PCSRSS_PROCESS_DATA ProcessData,
-                  IN PHARDERROR_MSG HardErrorMessage)
-{
-    UINT responce = MB_OK;
-    NTSTATUS Status;
-    HANDLE hProcess;
-    OBJECT_ATTRIBUTES ObjectAttributes;
-    ULONG nParam = 0;
-    PRTL_MESSAGE_RESOURCE_ENTRY MessageResource;
-    ULONG_PTR ParameterList[MAXIMUM_HARDERROR_PARAMETERS];
-    LPSTR CaptionText, MessageBody;
-    LPWSTR szxCaptionText, szxMessageBody;
-    DWORD SizeOfAllUnicodeStrings = 0;
-    PROCESS_BASIC_INFORMATION ClientBasicInfo;
-    UNICODE_STRING ClientFileNameU;
-    UNICODE_STRING TempStringU;
-    UNICODE_STRING ParameterStringU;
-    ANSI_STRING ParamStringA;
-    ULONG UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask;
-    int MessageBoxResponse;
-
-    HardErrorMessage->Response = ResponseNotHandled;
-
-    DPRINT("NumberOfParameters = %d\n", HardErrorMessage->NumberOfParameters);
-    DPRINT("Status = %lx\n", HardErrorMessage->Status);
-
-    // open client process
-    InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
-    Status = NtOpenProcess(&hProcess, PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, &ObjectAttributes, &HardErrorMessage->h.ClientId);
-    if( !NT_SUCCESS(Status) ) {
-        DPRINT1("NtOpenProcess failed with code: %lx\n", Status);
-        return FALSE;
-    }
-
-    // let's get a name of the client process to display it in the caption of a message box
-
-    ClientFileNameU.MaximumLength = 0;
-    ClientFileNameU.Length = 0;
-    ClientFileNameU.Buffer = NULL;
-    Status = NtQueryInformationProcess(hProcess, 
-        ProcessBasicInformation, 
-        &ClientBasicInfo, 
-        sizeof(ClientBasicInfo), 
-        NULL);
-    if( NT_SUCCESS(Status) ) {
-        PLIST_ENTRY ModuleListHead;
-        PLIST_ENTRY Entry;
-        PLDR_DATA_TABLE_ENTRY Module;
-        PPEB_LDR_DATA Ldr;
-        PPEB Peb = ClientBasicInfo.PebBaseAddress;
-
-        if( Peb )
-        {
-            Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL);
-            if( NT_SUCCESS(Status) ) {
-                ModuleListHead = &Ldr->InLoadOrderModuleList;
-                Status = NtReadVirtualMemory(
-                    hProcess,
-                    &ModuleListHead->Flink,
-                    &Entry,
-                    sizeof(Entry),
-                    NULL
-                    );
-
-                if( NT_SUCCESS(Status) )
-                {
-                    if (Entry != ModuleListHead)
-                    {
-                        LDR_DATA_TABLE_ENTRY ModuleData;
-                        Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
-
-                        Status = NtReadVirtualMemory(hProcess, Module, &ModuleData, sizeof(ModuleData), NULL);
-                        if( NT_SUCCESS(Status) ) {
-                            PVOID ClientDllBase;
-
-                            Status = NtReadVirtualMemory(
-                                hProcess,
-                                &Peb->ImageBaseAddress,
-                                &ClientDllBase,
-                                sizeof(ClientDllBase),
-                                NULL
-                                );
-                            if( NT_SUCCESS(Status) && (ClientDllBase == ModuleData.DllBase) ) {
-
-                                ClientFileNameU.MaximumLength = ModuleData.BaseDllName.MaximumLength;
-                                ClientFileNameU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength);
-                                Status = NtReadVirtualMemory(
-                                    hProcess,
-                                    ModuleData.BaseDllName.Buffer,
-                                    ClientFileNameU.Buffer,
-                                    ClientFileNameU.MaximumLength,
-                                    NULL
-                                    );
-                                if( NT_SUCCESS(Status) ) {
-                                    ClientFileNameU.Length = wcslen(ClientFileNameU.Buffer)*sizeof(wchar_t);
-                                }
-                                else {
-                                    RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer);
-                                    ClientFileNameU.Buffer = NULL;
-                                }
-
-                                DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    // read all unicode strings from client space
-    for(nParam = 0; nParam < HardErrorMessage->NumberOfParameters; nParam++, UnicodeStringParameterMask >>= 1)
-    {
-        if( UnicodeStringParameterMask & 0x01 ) {
-            Status = NtReadVirtualMemory(hProcess,
-                (PVOID)HardErrorMessage->Parameters[nParam],
-                (PVOID)&TempStringU, 
-                sizeof(TempStringU),
-                NULL);
-
-            if( NT_SUCCESS(Status) ) {
-                ParameterStringU.Buffer = (PWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, TempStringU.MaximumLength);
-                if( !ParameterStringU.Buffer ) {
-                    DPRINT1("Cannot allocate memory %d\n", TempStringU.MaximumLength);
-                    NtClose(hProcess);
-                    if( ClientFileNameU.Buffer ) {
-                        RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer);
-                    }
-                    return FALSE;
-                }
-
-                Status = NtReadVirtualMemory(hProcess,
-                    (PVOID)TempStringU.Buffer,
-                    (PVOID)ParameterStringU.Buffer,
-                    TempStringU.MaximumLength,
-                    NULL);
-                if( !NT_SUCCESS(Status) ) {
-                    DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status);
-                    RtlFreeHeap (RtlGetProcessHeap(), 0, ParameterStringU.Buffer);
-                    if( ClientFileNameU.Buffer ) {
-                        RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer);
-                    }
-                    NtClose(hProcess);
-                    return FALSE;
-                }
-                ParameterStringU.Length = TempStringU.Length;
-                ParameterStringU.MaximumLength = TempStringU.MaximumLength;
-                DPRINT("ParameterStringU=\'%wZ\'\n", &ParameterStringU);
-                RtlUnicodeStringToAnsiString(&ParamStringA, &ParameterStringU, TRUE);
-                ParameterList[nParam] = (ULONG_PTR)ParamStringA.Buffer;
-                SizeOfAllUnicodeStrings += ParamStringA.MaximumLength;
-            }
-        }
-        else {
-            // it's not a unicode string
-            ParameterList[nParam] = HardErrorMessage->Parameters[nParam];
-        }
-    }
-
-    NtClose(hProcess);
-
-    // get text string of the error code
-    Status = RtlFindMessage(
-        (PVOID)GetModuleHandle(TEXT("ntdll")),
-        (ULONG_PTR)RT_MESSAGETABLE,
-        LANG_NEUTRAL,
-        HardErrorMessage->Status,
-        &MessageResource );
-    if( !NT_SUCCESS(Status) ) {
-        // WE HAVE TO DISPLAY HERE: "Unknown hard error"
-        if( ClientFileNameU.Buffer ) {
-            szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength+64);
-            wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, "Application Error");
-        } else {
-            szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 64);
-            wsprintfW(szxCaptionText, L"System - Application Error");
-        }
-        MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 38);
-        wsprintfA(MessageBody, "Unknown hard error");
-    }
-    else {
-        LPSTR NtStatusString;
-        UNICODE_STRING MessageU;
-        ANSI_STRING MessageA;
-        USHORT CaptionSize = 0;
-
-        if( !MessageResource->Flags ) {
-            /* we've got an ansi string */
-            DPRINT("MessageResource->Text=%s\n", (PSTR)MessageResource->Text);
-            RtlInitAnsiString(&MessageA, MessageResource->Text);
-        }
-        else {
-            /* we've got a unicode string */
-            DPRINT("MessageResource->Text=%S\n", (PWSTR)MessageResource->Text);
-            RtlInitUnicodeString(&MessageU, (PWSTR)MessageResource->Text);
-            RtlUnicodeStringToAnsiString(&MessageA, &MessageU, TRUE);
-        }
-
-        // check whether a caption exists
-        if( *MessageA.Buffer == '{' ) {
-            // get size of the caption
-            for( CaptionSize = 0; (CaptionSize < MessageA.Length) && ('}' != MessageA.Buffer[CaptionSize]); CaptionSize++);
-
-            CaptionText = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CaptionSize);
-            RtlCopyMemory(CaptionText, MessageA.Buffer+1, CaptionSize-1);
-            CaptionSize += 2; // "}\r\n" - 3
-
-            szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*CaptionSize+ClientFileNameU.MaximumLength+128);
-            if( ClientFileNameU.Buffer ) {
-                wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, CaptionText);
-            } else {
-                wsprintfW(szxCaptionText, L"System - %hs", CaptionText);
-            }
-            RtlFreeHeap (RtlGetProcessHeap(), 0, CaptionText);
-        }
-        else {
-            if( ClientFileNameU.Buffer ) {
-                szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength);
-                wsprintfW(szxCaptionText, L"%s", ClientFileNameU.Buffer);
-            } else {
-                szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 14); // 14 - "System\0\0"
-                wsprintfW(szxCaptionText, L"System");
-            }
-        }
-        DPRINT("ParameterList[0]=0x%lx\n", ParameterList[0]);
-        if( STATUS_UNHANDLED_EXCEPTION == HardErrorMessage->Status )
-        {
-            PRTL_MESSAGE_RESOURCE_ENTRY MsgResException;
-            MessageBody = NULL;
-            Status = RtlFindMessage(
-                (PVOID)GetModuleHandle(TEXT("ntdll")),
-                (ULONG_PTR)RT_MESSAGETABLE,
-                LANG_NEUTRAL,
-                ParameterList[0],
-                &MsgResException);
-
-            if( NT_SUCCESS(Status) )
-            {
-                UNICODE_STRING ExcMessageU;
-                ANSI_STRING ExcMessageA;
-                if( !MsgResException->Flags ) {
-                    /* we've got an ansi string */
-                    DPRINT("MsgResException->Text=%s\n", (PSTR)MsgResException->Text);
-                    RtlInitAnsiString(&ExcMessageA, MsgResException->Text);
-                }
-                else {
-                    /* we've got a unicode string */
-                    DPRINT("MsgResException->Text=%S\n", (PWSTR)MsgResException->Text);
-                    RtlInitUnicodeString(&ExcMessageU, (PWSTR)MsgResException->Text);
-                    RtlUnicodeStringToAnsiString(&ExcMessageA, &ExcMessageU, TRUE);
-                }
-
-                MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MsgResException->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough
-                if( STATUS_ACCESS_VIOLATION == ParameterList[0] ) {
-                    LPSTR pOperationType;
-                    if( ParameterList[2] ) pOperationType = "written";
-                    else pOperationType = "read";
-                    wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], pOperationType);
-                }
-                else if( STATUS_IN_PAGE_ERROR == ParameterList[0] ) {
-                    wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], ParameterList[2]);
-                }
-            }
-            if( !MessageBody ) {
-                NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize);
-                RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1);
-
-                MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough
-
-                wsprintfA(MessageBody, NtStatusString, 
-                    L"Unknown software exception",
-                    ParameterList[0],
-                    ParameterList[1]);
-
-                RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString);
-            }
-        }
-        else
-        {
-            NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize);
-            RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1);
-
-            MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough
-
-            wsprintfA(MessageBody, NtStatusString, 
-                ParameterList[0],
-                ParameterList[1],
-                ParameterList[2],
-                ParameterList[3]);
-
-            RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString);
-        }
-        if( MessageResource->Flags ) {
-            /* we've got a unicode string */
-            RtlFreeAnsiString(&MessageA);
-        }
-    }
-    if( ClientFileNameU.Buffer ) {
-        RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer);
-    }
-
-    szxMessageBody = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*(strlen(MessageBody)+1));
-    wsprintfW(szxMessageBody, L"%hs", MessageBody);
-    RtlFreeHeap (RtlGetProcessHeap(), 0, MessageBody);
-
-    switch ( HardErrorMessage->ValidResponseOptions )
-    {
-    case OptionAbortRetryIgnore:
-        responce = MB_ABORTRETRYIGNORE;
-        break;
-
-    case OptionOk:
-        responce = MB_OK;
-        break;
-
-    case OptionOkCancel:
-        responce = MB_OKCANCEL;
-        break;
-
-    case OptionRetryCancel:
-        responce = MB_RETRYCANCEL;
-        break;
-
-    case OptionYesNo:
-        responce = MB_YESNO;
-        break;
-
-    case OptionYesNoCancel:
-        responce = MB_YESNOCANCEL;
-        break;
-
-    case OptionShutdownSystem:
-        // XZ??
-        break;
-
-    default:
-        DPRINT1("Wrong option: ValidResponseOptions = %d\n", HardErrorMessage->ValidResponseOptions);
-        ASSERT(FALSE);
-        break;
-    }
-
-    // FIXME: We should not use MessageBox !!!!
-    DPRINT1("%S\n", szxMessageBody);
-    MessageBoxResponse = MessageBoxW(0, szxMessageBody, szxCaptionText, responce|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);
-
-    RtlFreeHeap (RtlGetProcessHeap(), 0, szxMessageBody);
-    RtlFreeHeap (RtlGetProcessHeap(), 0, szxCaptionText);
-
-    switch( MessageBoxResponse )
-    {
-    case IDOK:
-        HardErrorMessage->Response = ResponseOk;
-        break;
-
-    case IDCANCEL:
-        HardErrorMessage->Response = ResponseCancel;
-        break;
-
-    case IDYES:
-        HardErrorMessage->Response = ResponseYes;
-        break;
-
-    case IDNO:
-        HardErrorMessage->Response = ResponseNo;
-        break;
-
-    case IDABORT:
-        HardErrorMessage->Response = ResponseAbort;
-        break;
-
-    case IDIGNORE:
-        HardErrorMessage->Response = ResponseIgnore;
-        break;
-
-    case IDRETRY:
-        HardErrorMessage->Response = ResponseRetry;
-        break;
-
-    case 10://IDTRYAGAIN:
-        HardErrorMessage->Response = ResponseTryAgain;
-        break;
-
-    case 11://IDCONTINUE:
-        HardErrorMessage->Response = ResponseContinue;
-        break;
-
-    default:
-        ASSERT(FALSE);
-        break;
-    }
+    PrivateCsrssInitialized();
 
     return TRUE;
 }
 
-
 BOOL WINAPI
 Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
-                       PCSRSS_OBJECT_DEFINITION *ObjectDefinitions,
-                       CSRPLUGIN_INIT_COMPLETE_PROC *InitComplete,
-                       CSRPLUGIN_HARDERROR_PROC *HardError,
+                       PCSRPLUGIN_SERVER_PROCS ServerProcs,
                        PCSRSS_EXPORTED_FUNCS Exports,
                        HANDLE CsrssApiHeap)
 {
-  NTSTATUS Status;
-  CsrExports = *Exports;
-  Win32CsrApiHeap = CsrssApiHeap;
+    NTSTATUS Status;
+    CsrExports = *Exports;
+    Win32CsrApiHeap = CsrssApiHeap;
 
-  Status = NtUserInitialize(0 ,NULL, NULL);
+    Status = NtUserInitialize(0, NULL, NULL);
 
-  PrivateCsrssManualGuiCheck(0);
-  CsrInitConsoleSupport();
+    PrivateCsrssManualGuiCheck(0);
+    CsrInitConsoleSupport();
 
-  *ApiDefinitions = Win32CsrApiDefinitions;
-  *ObjectDefinitions = Win32CsrObjectDefinitions;
-  *InitComplete = Win32CsrInitComplete;
-  *HardError = Win32CsrHardError;
+    *ApiDefinitions = Win32CsrApiDefinitions;
+    ServerProcs->InitCompleteProc = Win32CsrInitComplete;
+    ServerProcs->HardErrorProc = Win32CsrHardError;
+    ServerProcs->ProcessInheritProc = Win32CsrDuplicateHandleTable;
+    ServerProcs->ProcessDeletedProc = Win32CsrReleaseConsole;
 
-  return TRUE;
+    return TRUE;
 }
 
 /* EOF */