static VOID TUIDisplaySASNotice( IN OUT PGINA_CONTEXT pgContext) { TRACE("TUIDisplaySASNotice()\n"); UNREFERENCED_PARAMETER(pgContext); DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE); DisplayResourceText(IDS_PRESSCTRLALTDELETE, TRUE); }
static INT TUILockedSAS( IN OUT PGINA_CONTEXT pgContext) { HANDLE hToken; WCHAR UserName[256]; WCHAR Password[256]; TRACE("TUILockedSAS()\n"); UNREFERENCED_PARAMETER(pgContext); if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE)) return WLX_SAS_ACTION_UNLOCK_WKSTA; /* Ask the user for credentials */ if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE)) return WLX_SAS_ACTION_NONE; if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE)) return WLX_SAS_ACTION_NONE; if (!LogonUserW(UserName, NULL, Password, LOGON32_LOGON_UNLOCK, LOGON32_PROVIDER_DEFAULT, &hToken)) { TRACE("LogonUserW() failed\n"); return WLX_SAS_ACTION_NONE; } CloseHandle(hToken); return WLX_SAS_ACTION_UNLOCK_WKSTA; }
static INT TUILockedSAS( IN OUT PGINA_CONTEXT pgContext) { HANDLE hToken; WCHAR UserName[256]; WCHAR Password[256]; NTSTATUS SubStatus; NTSTATUS Status; TRACE("TUILockedSAS()\n"); UNREFERENCED_PARAMETER(pgContext); if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE)) return WLX_SAS_ACTION_UNLOCK_WKSTA; /* Ask the user for credentials */ if (!ReadString(IDS_ASKFORUSER, UserName, _countof(UserName), TRUE)) return WLX_SAS_ACTION_NONE; if (!ReadString(IDS_ASKFORPASSWORD, Password, _countof(Password), FALSE)) return WLX_SAS_ACTION_NONE; Status = ConnectToLsa(pgContext); if (!NT_SUCCESS(Status)) { WARN("ConnectToLsa() failed\n"); return WLX_SAS_ACTION_NONE; } Status = MyLogonUser(pgContext->LsaHandle, pgContext->AuthenticationPackage, UserName, NULL, Password, &hToken, &SubStatus); if (!NT_SUCCESS(Status)) { WARN("MyLogonUser() failed\n"); return WLX_SAS_ACTION_NONE; } CloseHandle(hToken); return WLX_SAS_ACTION_UNLOCK_WKSTA; }
static BOOL ReadString( IN UINT uIdResourcePrompt, IN OUT PWSTR Buffer, IN DWORD BufferLength, IN BOOL ShowString) { DWORD count, i; WCHAR charToDisplay[] = { 0, UNICODE_NULL }; if (!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0)) return FALSE; if (!FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE))) return FALSE; if (!DisplayResourceText(uIdResourcePrompt, FALSE)) return FALSE; i = 0; for (;;) { WCHAR readChar; if (!ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &readChar, 1, &count, NULL)) return FALSE; if (readChar == '\r' || readChar == '\n') { /* End of string */ charToDisplay[0] = L'\n'; WriteConsoleW( GetStdHandle(STD_OUTPUT_HANDLE), charToDisplay, wcslen(charToDisplay), &count, NULL); break; } if (ShowString) { /* Display the char */ charToDisplay[0] = readChar; WriteConsoleW( GetStdHandle(STD_OUTPUT_HANDLE), charToDisplay, wcslen(charToDisplay), &count, NULL); } Buffer[i++] = readChar; /* FIXME: buffer overflow if the user writes too many chars! */ UNREFERENCED_PARAMETER(BufferLength); /* FIXME: handle backspace */ } Buffer[i] = UNICODE_NULL; if (!ShowString) { /* Still display the \n */ static LPCWSTR newLine = L"\n"; DWORD result; WriteConsoleW( GetStdHandle(STD_OUTPUT_HANDLE), newLine, wcslen(newLine), &result, NULL); } return TRUE; }