windows-nt/Source/XPSP1/NT/ds/security/gina/sunlogon/sunlogon.c
2020-09-26 16:20:57 +08:00

203 lines
4.3 KiB
C

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: sunlogon.c
//
// Contents: Intermediate startup app for sundown to keep going
//
// Classes:
//
// Functions:
//
// History: 3-03-98 RichardW Created
//
//----------------------------------------------------------------------------
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <winbasep.h>
#include <winuserp.h>
#include <userenv.h>
#include <userenvp.h>
HANDLE WindowStation ;
HANDLE DefaultDesktop ;
HANDLE WinlogonDesktop ;
BOOL
CreatePrimaryTerminal(
VOID)
{
//
// Create the window station
//
WindowStation = CreateWindowStationW(
TEXT("WinSta0"),
0,
MAXIMUM_ALLOWED,
NULL);
if ( !WindowStation ) {
DbgPrint( "Failed to create WindowStation in win32k/user\n" );
goto failCreateTerminal;
}
SetProcessWindowStation( WindowStation );
//
// Create the application desktop
//
DefaultDesktop = CreateDesktopW(
TEXT("Default"),
NULL,
NULL,
0,
MAXIMUM_ALLOWED,
NULL );
if ( !DefaultDesktop ) {
DbgPrint( "Could not create Default desktop\n" );
goto failCreateTerminal;
}
return TRUE ;
failCreateTerminal:
//
// Cleanup
//
return FALSE;
}
int
WINAPI
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
STARTUPINFO si ;
PROCESS_INFORMATION pi ;
BOOL Result ;
WCHAR InitialCommand[ MAX_PATH ];
WCHAR szComputerName[ 18 ];
DWORD dwComputerNameSize = 18 ;
DWORD dwSize ;
LUID luidNone = { 0, 0 };
NTSTATUS Status ;
HANDLE Token ;
//
// Get a copy of the computer name in *my* environment, so that we
// can look at it later.
//
if (GetComputerName (szComputerName, &dwComputerNameSize)) {
SetEnvironmentVariable(
TEXT("COMPUTERNAME"),
(LPTSTR) szComputerName);
}
//
// Set the default USERPROFILE location
//
dwSize = MAX_PATH ;
if ( GetDefaultUserProfileDirectory( InitialCommand, &dwSize ) )
{
SetEnvironmentVariable( TEXT("USERPROFILE" ), InitialCommand );
}
if (!RegisterLogonProcess(
HandleToUlong(NtCurrentTeb()->ClientId.UniqueProcess),
TRUE)) {
DbgPrint( "Failed to register with win32/user as the logon process\n" );
return 0;
}
if ( !CreatePrimaryTerminal() )
{
DbgPrint( "Failed to create terminal\n" );
return 0 ;
}
SwitchDesktop( DefaultDesktop );
SetThreadDesktop( DefaultDesktop );
//
// Whack system as current user:
//
SetWindowStationUser( WindowStation, &luidNone, NULL, 0 );
Status = NtOpenProcessToken(
NtCurrentProcess(),
MAXIMUM_ALLOWED,
&Token );
if ( NT_SUCCESS( Status ) )
{
UpdatePerUserSystemParameters( Token, UPUSP_USERLOGGEDON );
}
//
// At this stage, we're mostly set.
//
wcscpy( InitialCommand, TEXT("cmd.exe") );
do
{
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpTitle = InitialCommand ;
si.dwFlags = 0 ;
si.wShowWindow = SW_SHOW; // at least let the guy see it
si.lpDesktop = TEXT("Winsta0\\Default");
Result = CreateProcessW(
NULL,
InitialCommand,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi );
if ( !Result )
{
DbgPrint(" Failed to start initial command\n" );
return 0;
}
CloseHandle( pi.hThread );
WaitForSingleObjectEx( pi.hProcess, INFINITE, FALSE );
} while ( 1 );
}