windows-nt/Source/XPSP1/NT/com/mobile/sens/conn/senslogn/onestop.cxx
2020-09-26 16:20:57 +08:00

272 lines
6.8 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (C) Microsoft Corporation, 1997 - 1999
Module Name:
onestop.hxx
Abstract:
This file contains the common functions that are helpful in notifying
OneStop of logon/logoff events.
Author:
Gopal Parupudi <GopalP>
Notes:
a. This is being used in senslogn.dll on NT5.
b. It is also being used in sens.dll on NT4 and Win9x.
Revision History:
GopalP 4/29/1998 Start.
--*/
#include <mobsyncp.h>
#include "onestop.hxx"
HRESULT
SensNotifyOneStop(
HANDLE hToken,
TCHAR *pCommandLine,
BOOL bSync
)
{
TCHAR szCommandLine[256];
DWORD dwLastError;
STARTUPINFO si;
PROCESS_INFORMATION ProcessInformation;
dwLastError = 0;
// CreateProcess* APIs require an editable buffer for command-line parameter
ASSERT(_tcslen(pCommandLine) < 255);
_tcscpy(szCommandLine, pCommandLine);
// Fill in the STARTUPINFO structure.
memset(&si, 0x0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpTitle = NULL;
si.lpDesktop = NULL;
si.dwX = 0x0;
si.dwY = 0x0;
si.dwXSize = 0x0;
si.dwYSize = 0x0;
si.dwFlags = 0x0;
si.wShowWindow = SW_SHOW;
si.lpReserved2 = NULL;
si.cbReserved2 = 0;
LogMessage((SENSLOGN "[%d] Launching OneStop...\n", GetTickCount()));
#if !defined(SENS_CHICAGO)
if (CreateProcessAsUser(
hToken, // Handle to the Token of the logged-on user
#else // SENS_CHICAGO
if (CreateProcess(
#endif // SENS_CHICAGO
NULL, // Name of the executable module
szCommandLine, // Command-line string
NULL, // Security attributes
NULL, // Thread security attributes
FALSE, // Don't inherit handles
0, // Creation flags
NULL, // New environment block
NULL, // Current directory name
&si, // Startup info
&ProcessInformation // Process information
))
{
//
// Wait until the process terminates
//
if (bSync)
{
LogMessage((SENSLOGN "[%d] Waiting for OneStop to return...\n", GetTickCount()));
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
LogMessage((SENSLOGN "[%d] OneStop returned successfully.\n", GetTickCount()));
}
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
return S_OK;
}
else
{
dwLastError = GetLastError();
SensPrintToDebugger(SENS_DBG, (SENSLOGN "SensNotifyOneStop() - CreateProcessXXX() "
"failed with 0x%x\n", dwLastError));
return HRESULT_FROM_WIN32(dwLastError);
}
LogMessage((SENSLOGN "[%d] Successfully notified OneStop.\n", GetTickCount()));
return S_OK;
}
BOOL
IsAutoSyncEnabled(
HANDLE hToken,
DWORD dwMask
)
{
HKEY hKeyAutoSync;
LONG lResult;
BOOL bEnabled;
BOOL bImpersonated;
DWORD dwType;
DWORD dwAutoSyncFlags;
DWORD cbData;
LPBYTE lpbData;
hKeyAutoSync = NULL;
lResult = 0;
bEnabled = FALSE;
bImpersonated = FALSE;
dwType = 0x0;
dwAutoSyncFlags = 0x0;
cbData = 0x0;
lpbData = NULL;
//
// Impersonate the Logged on user so that we can access the user-specific
// registry entries.
//
#if !defined(SENS_CHICAGO)
bImpersonated = ImpersonateLoggedOnUser(hToken);
if (bImpersonated == FALSE)
{
LogMessage((SENSLOGN "ImpersonateLoggedOnUser(token = 0x%x) failed - "
"0x%x\n", hToken, GetLastError()));
}
else
{
LogMessage((SENSLOGN "ImpersonateLoggedUser() succeeded!\n"));
}
#endif // SENS_CHICAGO
//
// Open AutoSync sub-key for this user.
//
lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // Handle of the open Key
AUTOSYNC_KEY, // Name of the sub-key
0, // Reserved (MBZ)
KEY_QUERY_VALUE, // Security access mask
&hKeyAutoSync // Address of the handle of new key
);
if (lResult != ERROR_SUCCESS)
{
SensPrintToDebugger(SENS_DBG, (SENSLOGN "RegOpenKeyEx(AUTOSYNC) failed with 0x%x\n", lResult));
goto Cleanup;
}
//
// Query the Flags value
//
lpbData = (LPBYTE) &dwAutoSyncFlags;
cbData = sizeof(DWORD);
lResult = RegQueryValueEx(
hKeyAutoSync, // Handle of the sub-key
AUTOSYNC_FLAGS, // Name of the Value
NULL, // Reserved (MBZ)
&dwType, // Address of the type of the Value
lpbData, // Address of the data of the Value
&cbData // Address of size of data of the Value
);
if (lResult != ERROR_SUCCESS)
{
LogMessage((SENSLOGN "RegQueryValueEx(AUTOSYNC_FLAGS) failed with 0x%x\n", lResult));
goto Cleanup;
}
ASSERT(dwType == REG_DWORD);
//
// Check to see if the Mask bit is set
//
if (dwMask == AUTOSYNC_ON_STARTSHELL)
{
if ( (dwAutoSyncFlags & AUTOSYNC_LAN_LOGON)
|| (dwAutoSyncFlags & AUTOSYNC_WAN_LOGON))
{
LogMessage((SENSLOGN "AutoSync is enabled for StartShell\n"));
bEnabled = TRUE;
goto Cleanup;
}
else
{
LogMessage((SENSLOGN "AutoSync is NOT enabled for Logon\n"));
}
}
else
if (dwMask == AUTOSYNC_ON_LOGOFF)
{
if ( (dwAutoSyncFlags & AUTOSYNC_LAN_LOGOFF)
|| (dwAutoSyncFlags & AUTOSYNC_WAN_LOGOFF))
{
LogMessage((SENSLOGN "AutoSync is enabled for Logoff\n"));
bEnabled = TRUE;
goto Cleanup;
}
else
{
LogMessage((SENSLOGN "AutoSync is NOT enabled for Logoff\n"));
}
}
else
if (dwMask == AUTOSYNC_ON_SCHEDULE)
{
if (dwAutoSyncFlags != NULL)
{
LogMessage((SENSLOGN "AutoSync is enabled for Schedule\n"));
bEnabled = TRUE;
goto Cleanup;
}
else
{
LogMessage((SENSLOGN "AutoSync is NOT enabled for Schedule\n"));
}
}
//
// Autosync is not enabled.
//
Cleanup:
//
// Cleanup
//
if (hKeyAutoSync)
{
RegCloseKey(hKeyAutoSync);
}
#if !defined(SENS_CHICAGO)
// Stop Impersonating
if (bImpersonated)
{
RevertToSelf();
}
#endif // SENS_CHICAGO
return bEnabled;
}