Author: hbelusca Date: Sun Mar 10 15:37:22 2013 New Revision: 58462
URL: http://svn.reactos.org/svn/reactos?rev=58462&view=rev Log: [CONSRV] - Fix console initialization / uninitialization and resources release when initialization fails. - Remove unneeded DPRINTs.
Modified: branches/ros-csrss/dll/win32/kernel32/client/console/console.c branches/ros-csrss/win32ss/user/consrv/console.c branches/ros-csrss/win32ss/user/consrv/guiconsole.c branches/ros-csrss/win32ss/user/consrv/handle.c
Modified: branches/ros-csrss/dll/win32/kernel32/client/console/console.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/dll/win32/kernel32/cli... ============================================================================== --- branches/ros-csrss/dll/win32/kernel32/client/console/console.c [iso-8859-1] (original) +++ branches/ros-csrss/dll/win32/kernel32/client/console/console.c [iso-8859-1] Sun Mar 10 15:37:22 2013 @@ -145,6 +145,7 @@ ASSERT(ConsoleInitialized);
RtlEnterCriticalSection(&ConsoleLock); + nExitCode = 0; if ((nCode != CTRL_C_EVENT) || (NtCurrentPeb()->ProcessParameters->ConsoleFlags != 1)) { @@ -175,6 +176,7 @@ }
RtlLeaveCriticalSection(&ConsoleLock); + ExitThread(nExitCode); return STATUS_SUCCESS; }
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] Sun Mar 10 15:37:22 2013 @@ -54,7 +54,7 @@ return; }
- DPRINT1("We succeeded at creating ProcessData->CtrlDispatcher remote thread, ProcessId = %x, Process = 0x%p\n", ProcessData->Process->ClientId.UniqueProcess, ProcessData->Process); + DPRINT("We succeeded at creating ProcessData->CtrlDispatcher remote thread, ProcessId = %x, Process = 0x%p\n", ProcessData->Process->ClientId.UniqueProcess, ProcessData->Process); WaitForSingleObject(Thread, Timeout); CloseHandle(Thread); } @@ -513,13 +513,9 @@ PCONSOLE_OPENCONSOLE OpenConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.OpenConsoleRequest; PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
- DPRINT("SrvOpenConsole\n"); - OpenConsoleRequest->ConsoleHandle = INVALID_HANDLE_VALUE;
RtlEnterCriticalSection(&ProcessData->HandleTableLock); - - DPRINT1("ProcessData = 0x%p ; ProcessData->Console = 0x%p\n", ProcessData, ProcessData->Console);
if (ProcessData->Console) { @@ -529,9 +525,7 @@ PCONSOLE Console = ProcessData->Console; Object_t *Object;
- DPRINT1("SrvOpenConsole - Checkpoint 1\n"); EnterCriticalSection(&Console->Lock); - DPRINT1("SrvOpenConsole - Checkpoint 2\n");
if (OpenConsoleRequest->HandleType == HANDLE_OUTPUT) { @@ -574,8 +568,6 @@ PCONSOLE_ALLOCCONSOLE AllocConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.AllocConsoleRequest; PCSR_PROCESS CsrProcess = CsrGetClientThread()->Process; PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess); - - DPRINT("SrvAllocConsole\n");
if (ProcessData->Console != NULL) { @@ -632,7 +624,6 @@
/* Set the Ctrl Dispatcher */ ProcessData->CtrlDispatcher = AllocConsoleRequest->CtrlDispatcher; - DPRINT("CONSRV: CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
return STATUS_SUCCESS; } @@ -646,8 +637,6 @@ HANDLE ProcessId = ULongToHandle(AttachConsoleRequest->ProcessId); PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData;
- DPRINT("SrvAttachConsole\n"); - TargetProcessData = ConsoleGetPerProcessData(TargetProcess);
if (TargetProcessData->Console != NULL) @@ -674,19 +663,15 @@ return Status; }
- DPRINT("We, process (ID) %lu;%lu\n", TargetProcess->ClientId.UniqueProcess, TargetProcess->ClientId.UniqueThread); ProcessId = ULongToHandle(ProcessInfo.InheritedFromUniqueProcessId); - DPRINT("Parent process ID = %lu\n", ProcessId); }
/* Lock the source process via its PID */ Status = CsrLockProcessByClientId(ProcessId, &SourceProcess); - DPRINT1("Lock process Id %lu - Status %lu\n", ProcessId, Status); if (!NT_SUCCESS(Status)) return Status;
SourceProcessData = ConsoleGetPerProcessData(SourceProcess);
- DPRINT1("SourceProcessData->Console = 0x%p\n", SourceProcessData->Console); if (SourceProcessData->Console == NULL) { Status = STATUS_INVALID_HANDLE; @@ -733,7 +718,6 @@
/* Set the Ctrl Dispatcher */ TargetProcessData->CtrlDispatcher = AttachConsoleRequest->CtrlDispatcher; - DPRINT("CONSRV: CtrlDispatcher address: %x\n", TargetProcessData->CtrlDispatcher);
Status = STATUS_SUCCESS;
@@ -762,8 +746,6 @@ PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; Object_t* Object = NULL;
- DPRINT("SrvSetConsoleMode\n"); - Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ConsoleModeRequest->ConsoleHandle, &Object, NULL, GENERIC_WRITE, TRUE, 0); @@ -797,8 +779,6 @@ PCONSOLE_GETSETCONSOLEMODE ConsoleModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleModeRequest; Object_t* Object = NULL;
- DPRINT("SrvGetConsoleMode\n"); - Status = ConSrvGetObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ConsoleModeRequest->ConsoleHandle, &Object, NULL, GENERIC_READ, TRUE, 0); @@ -833,8 +813,6 @@ // PCSR_PROCESS Process = CsrGetClientThread()->Process; PCONSOLE Console; PWCHAR Buffer; - - DPRINT("SrvSetConsoleTitle\n");
if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&TitleRequest->Title, @@ -886,8 +864,6 @@ // PCSR_PROCESS Process = CsrGetClientThread()->Process; PCONSOLE Console; DWORD Length; - - DPRINT("SrvGetConsoleTitle\n");
if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&TitleRequest->Title, @@ -960,8 +936,6 @@ PCONSOLE_SCREEN_BUFFER Buff; PCONSOLE Console;
- DPRINT("SrvGetConsoleHardwareState\n"); - Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, &Buff, @@ -988,8 +962,6 @@ PCONSOLE_SCREEN_BUFFER Buff; PCONSOLE Console;
- DPRINT("SrvSetConsoleHardwareState\n"); - Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, &Buff, @@ -1016,8 +988,6 @@ PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest; PCONSOLE Console;
- DPRINT("SrvGetConsoleWindow\n"); - Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status;
@@ -1032,8 +1002,6 @@ NTSTATUS Status; PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest; PCONSOLE Console; - - DPRINT("SrvSetConsoleIcon\n");
Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; @@ -1103,8 +1071,6 @@ PLIST_ENTRY current_entry; ULONG nItems = 0;
- DPRINT("SrvGetConsoleProcessList\n"); - if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&GetProcessListRequest->pProcessIds, GetProcessListRequest->nMaxIds,
Modified: branches/ros-csrss/win32ss/user/consrv/guiconsole.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/gu... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/guiconsole.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/guiconsole.c [iso-8859-1] Sun Mar 10 15:37:22 2013 @@ -206,7 +206,7 @@ static NTSTATUS WINAPI GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Size); VOID FASTCALL -GuiConsoleInitScrollbar(PGUI_CONSOLE_DATA GuiData); +GuiConsoleResizeWindow(PGUI_CONSOLE_DATA GuiData);
static LRESULT @@ -482,10 +482,14 @@ SizeChanged = TRUE; }
+ GuiData->GuiInfo.AutoPosition = pConInfo->ci.u.GuiInfo.AutoPosition; + GuiData->GuiInfo.WindowOrigin = pConInfo->ci.u.GuiInfo.WindowOrigin; + if (SizeChanged) { + /* Resize the window to the user's values */ GuiData->WindowSizeLock = TRUE; - GuiConsoleInitScrollbar(GuiData); + GuiConsoleResizeWindow(GuiData); GuiData->WindowSizeLock = FALSE; }
@@ -514,15 +518,17 @@
VOID FASTCALL -GuiConsoleInitScrollbar(PGUI_CONSOLE_DATA GuiData) +GuiConsoleResizeWindow(PGUI_CONSOLE_DATA GuiData) { PCONSOLE Console = GuiData->Console; SCROLLINFO sInfo;
- DWORD Width = Console->Size.X * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); - DWORD Height = Console->Size.Y * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); - - /* set scrollbar sizes */ + DWORD Width = Console->Size.X * GuiData->CharWidth + + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); + DWORD Height = Console->Size.Y * GuiData->CharHeight + + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); + + /* Set scrollbar sizes */ sInfo.cbSize = sizeof(SCROLLINFO); sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; sInfo.nMin = 0; @@ -548,14 +554,19 @@ SetScrollInfo(GuiData->hWindow, SB_HORZ, &sInfo, TRUE); Height += GetSystemMetrics(SM_CYHSCROLL); ShowScrollBar(GuiData->hWindow, SB_HORZ, TRUE); - } else { ShowScrollBar(GuiData->hWindow, SB_HORZ, FALSE); }
- SetWindowPos(GuiData->hWindow, NULL, 0, 0, Width, Height, + /* Resize and reposition the window */ + SetWindowPos(GuiData->hWindow, + NULL, + (GuiData->GuiInfo.AutoPosition ? 0 : GuiData->GuiInfo.WindowOrigin.x), + (GuiData->GuiInfo.AutoPosition ? 0 : GuiData->GuiInfo.WindowOrigin.y), + Width, + Height, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); }
@@ -563,21 +574,21 @@ GuiConsoleHandleNcCreate(HWND hWnd, LPCREATESTRUCTW Create) { PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Create->lpCreateParams; - PCONSOLE Console = GuiData->Console; + PCONSOLE Console; HDC Dc; HFONT OldFont; TEXTMETRICW Metrics; SIZE CharSize;
+ if (NULL == GuiData) + { + DPRINT1("GuiConsoleNcCreate: No GUI data\n"); + return FALSE; + } + + Console = GuiData->Console; + GuiData->hWindow = hWnd; - - if (NULL == GuiData) - { - DPRINT1("GuiConsoleNcCreate: RtlAllocateHeap failed\n"); - return FALSE; - } - - InitializeCriticalSection(&GuiData->Lock);
GuiData->Font = CreateFontW(LOWORD(GuiData->GuiInfo.FontSize), 0, // HIWORD(GuiData->GuiInfo.FontSize), @@ -593,11 +604,12 @@ NONANTIALIASED_QUALITY, FIXED_PITCH | GuiData->GuiInfo.FontFamily /* FF_DONTCARE */, GuiData->GuiInfo.FaceName); + if (NULL == GuiData->Font) { DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); - DeleteCriticalSection(&GuiData->Lock); - RtlFreeHeap(ConSrvHeap, 0, GuiData); + GuiData->hWindow = NULL; + SetEvent(GuiData->hGuiInitEvent); return FALSE; } Dc = GetDC(GuiData->hWindow); @@ -605,8 +617,8 @@ { DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); DeleteObject(GuiData->Font); - DeleteCriticalSection(&GuiData->Lock); - RtlFreeHeap(ConSrvHeap, 0, GuiData); + GuiData->hWindow = NULL; + SetEvent(GuiData->hGuiInitEvent); return FALSE; } OldFont = SelectObject(Dc, GuiData->Font); @@ -615,8 +627,8 @@ DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); ReleaseDC(GuiData->hWindow, Dc); DeleteObject(GuiData->Font); - DeleteCriticalSection(&GuiData->Lock); - RtlFreeHeap(ConSrvHeap, 0, GuiData); + GuiData->hWindow = NULL; + SetEvent(GuiData->hGuiInitEvent); return FALSE; } if (!GetTextMetricsW(Dc, &Metrics)) @@ -625,11 +637,11 @@ SelectObject(Dc, OldFont); ReleaseDC(GuiData->hWindow, Dc); DeleteObject(GuiData->Font); - DeleteCriticalSection(&GuiData->Lock); - RtlFreeHeap(ConSrvHeap, 0, GuiData); + GuiData->hWindow = NULL; + SetEvent(GuiData->hGuiInitEvent); return FALSE; } - GuiData->CharWidth = Metrics.tmMaxCharWidth; + GuiData->CharWidth = Metrics.tmMaxCharWidth; GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading;
/* Measure real char width more precisely if possible. */ @@ -645,14 +657,14 @@ Console->ActiveBuffer->ForceCursorOff = FALSE; ////////////////////////////////////////////////////////////////////////////
- DPRINT("Console %p GuiData %p\n", Console, GuiData); SetWindowLongPtrW(GuiData->hWindow, GWLP_USERDATA, (DWORD_PTR)GuiData);
SetTimer(GuiData->hWindow, CONGUI_UPDATE_TIMER, CONGUI_UPDATE_TIME, NULL); GuiConsoleCreateSysMenu(GuiData->hWindow);
+ /* Resize the window to the user's values */ GuiData->WindowSizeLock = TRUE; - GuiConsoleInitScrollbar(GuiData); + GuiConsoleResizeWindow(GuiData); GuiData->WindowSizeLock = FALSE;
SetEvent(GuiData->hGuiInitEvent); @@ -1041,16 +1053,13 @@ }
static VOID -GuiConsoleHandleNcDestroy(PGUI_CONSOLE_DATA GuiData, HWND hWnd) -{ - PCONSOLE Console = GuiData->Console; - - KillTimer(hWnd, 1); - Console->TermIFace.Data = NULL; - DeleteCriticalSection(&GuiData->Lock); - GetSystemMenu(hWnd, TRUE); - - RtlFreeHeap(ConSrvHeap, 0, GuiData); +GuiConsoleHandleNcDestroy(PGUI_CONSOLE_DATA GuiData) +{ + KillTimer(GuiData->hWindow, CONGUI_UPDATE_TIMER); + GetSystemMenu(GuiData->hWindow, TRUE); + + SetWindowLongPtrW(GuiData->hWindow, GWLP_USERDATA, (DWORD_PTR)NULL); + GuiData->hWindow = NULL; }
static COORD @@ -1269,7 +1278,8 @@ { PCONSOLE Console = GuiData->Console;
- if ((GuiData->WindowSizeLock == FALSE) && (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED)) + if ((GuiData->WindowSizeLock == FALSE) && + (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED)) { PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer; DWORD windx, windy, charx, chary; @@ -1308,7 +1318,7 @@ Console->Size.Y = (chary <= Buff->ScreenBufferSize.Y) ? chary : Buff->ScreenBufferSize.Y; }
- GuiConsoleInitScrollbar(GuiData); + GuiConsoleResizeWindow(GuiData);
// Adjust the start of the visible area if we are attempting to show nonexistent areas if((Buff->ScreenBufferSize.X - Buff->ShowX) < Console->Size.X) Buff->ShowX = Buff->ScreenBufferSize.X - Console->Size.X; @@ -1489,7 +1499,7 @@ break;
case WM_NCDESTROY: - GuiConsoleHandleNcDestroy(GuiData, hWnd); + GuiConsoleHandleNcDestroy(GuiData); break;
case WM_PAINT: @@ -1642,18 +1652,21 @@ TranslateMessage(&Msg); DispatchMessageW(&Msg); } - DestroyWindow(GuiData->hWindow); - GuiData->hWindow = NULL; - - WindowCount = GetWindowLongW(hWnd, GWL_USERDATA); - WindowCount--; - SetWindowLongW(hWnd, GWL_USERDATA, WindowCount); - if (0 == WindowCount) + + if (GuiData->hWindow != NULL) /* && DestroyWindow(GuiData->hWindow) */ { - NotifyWnd = NULL; - DestroyWindow(hWnd); - DPRINT1("CONSRV: Going to quit the Gui Thread!!\n"); - PostQuitMessage(0); + DestroyWindow(GuiData->hWindow); + + WindowCount = GetWindowLongW(hWnd, GWL_USERDATA); + WindowCount--; + SetWindowLongW(hWnd, GWL_USERDATA, WindowCount); + if (0 == WindowCount) + { + NotifyWnd = NULL; + DestroyWindow(hWnd); + DPRINT1("CONSRV: Going to quit the Gui Thread!!\n"); + PostQuitMessage(0); + } }
return 0; @@ -1843,6 +1856,10 @@ DPRINT1("Destroy hIconSm\n"); DestroyIcon(GuiData->hIconSm); } + + Console->TermIFace.Data = NULL; + DeleteCriticalSection(&GuiData->Lock); + RtlFreeHeap(ConSrvHeap, 0, GuiData); }
static VOID WINAPI @@ -2149,6 +2166,8 @@ GuiData->Console = Console; GuiData->hWindow = NULL;
+ InitializeCriticalSection(&GuiData->Lock); + /* Set up the GUI data */ wcsncpy(GuiData->GuiInfo.FaceName, ConsoleInfo->u.GuiInfo.FaceName, LF_FACESIZE); GuiData->GuiInfo.FontFamily = ConsoleInfo->u.GuiInfo.FontFamily; @@ -2195,15 +2214,23 @@ */ GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
- /* Create the GUI console */ + /* Create the terminal window */ PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, GuiData->GuiInfo.ShowWindow, (LPARAM)GuiData);
/* Wait until initialization has finished */ WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE); - DPRINT1("Received event Console %p GuiData %p X %d Y %d\n", Console, GuiData, Console->Size.X, Console->Size.Y); CloseHandle(GuiData->hGuiInitEvent); GuiData->hGuiInitEvent = NULL;
+ /* Check whether we really succeeded in initializing the terminal window */ + if (GuiData->hWindow == NULL) + { + DPRINT1("GuiInitConsole - We failed at creating a new terminal window\n"); + // ConioCleanupConsole(Console); + GuiCleanupConsole(Console); + return STATUS_UNSUCCESSFUL; + } + return STATUS_SUCCESS; }
Modified: branches/ros-csrss/win32ss/user/consrv/handle.c URL: http://svn.reactos.org/svn/reactos/branches/ros-csrss/win32ss/user/consrv/ha... ============================================================================== --- branches/ros-csrss/win32ss/user/consrv/handle.c [iso-8859-1] (original) +++ branches/ros-csrss/win32ss/user/consrv/handle.c [iso-8859-1] Sun Mar 10 15:37:22 2013 @@ -598,14 +598,8 @@
PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData;
- DPRINT1("ConSrvNewProcess\n"); - DPRINT1("SourceProcess = 0x%p ; TargetProcess = 0x%p\n", SourceProcess, TargetProcess); - /* An empty target process is invalid */ - if (!TargetProcess) - return STATUS_INVALID_PARAMETER; - - DPRINT1("ConSrvNewProcess - OK\n"); + if (!TargetProcess) return STATUS_INVALID_PARAMETER;
TargetProcessData = ConsoleGetPerProcessData(TargetProcess);
@@ -624,8 +618,7 @@ RtlInitializeCriticalSection(&TargetProcessData->HandleTableLock);
/* Do nothing if the source process is NULL */ - if (!SourceProcess) - return STATUS_SUCCESS; + if (!SourceProcess) return STATUS_SUCCESS;
SourceProcessData = ConsoleGetPerProcessData(SourceProcess);
@@ -644,10 +637,6 @@ /* Temporary save the parent's console */ TargetProcessData->ParentConsole = SourceProcessData->Console; } - else - { - DPRINT1("ConSrvNewProcess - We don't inherit a handle table : SourceProcessData->Console = 0x%p ; TargetProcess->Flags = %lu\n", SourceProcessData->Console, TargetProcess->Flags); - }
return STATUS_SUCCESS; } @@ -665,8 +654,6 @@ NTSTATUS Status = STATUS_SUCCESS; PCONSOLE_CONNECTION_INFO ConnectInfo = (PCONSOLE_CONNECTION_INFO)ConnectionInfo; PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrProcess); - - DPRINT1("ConSrvConnect\n");
if ( ConnectionInfo == NULL || ConnectionInfoLength == NULL || @@ -743,7 +730,6 @@
/* Set the Ctrl Dispatcher */ ProcessData->CtrlDispatcher = ConnectInfo->CtrlDispatcher; - DPRINT("CONSRV: CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher);
return STATUS_SUCCESS; }