405 lines
7.3 KiB
C++
405 lines
7.3 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (C) Microsoft Corporation, 1997 - 1999
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
sensapip.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Code for SensNotify* APIs which are called by external components
|
|||
|
to notify SENS of external events.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Gopal Parupudi <GopalP>
|
|||
|
|
|||
|
[Notes:]
|
|||
|
|
|||
|
optional-notes
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
GopalP 11/4/1997 Start.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#include <common.hxx>
|
|||
|
#include <rpc.h>
|
|||
|
#include <notify.h>
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Constants
|
|||
|
//
|
|||
|
#define FREE_NETCON_PROPERTIES "NcFreeNetconProperties"
|
|||
|
#define NETSHELL_DLL SENS_STRING("netshell.dll")
|
|||
|
|
|||
|
//
|
|||
|
// Define these constants to include respective portions of this
|
|||
|
// file.
|
|||
|
//
|
|||
|
// #define SENSNOTIFY_OTHER_EVENT
|
|||
|
// #define SENSNOTIFY_WINLOGON_EVENT
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Typedefs
|
|||
|
//
|
|||
|
typedef void (STDAPICALLTYPE *PFN_FREE_NETCON_PROPERTIES) (NETCON_PROPERTIES* pProps);
|
|||
|
|
|||
|
//
|
|||
|
// Globals
|
|||
|
//
|
|||
|
|
|||
|
RPC_BINDING_HANDLE ghSensNotify = NULL;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
inline RPC_STATUS
|
|||
|
DoRpcSetup(
|
|||
|
void
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Do the miscellaneous work to talk to SENS via RPC.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
RPC_STATUS status = RPC_S_OK;
|
|||
|
SENS_CHAR * BindingString = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// NOTE: This is called very early in the system startup and so, it is
|
|||
|
// guaranteed to be serialized. So, a lock is not necessary.
|
|||
|
//
|
|||
|
|
|||
|
if (ghSensNotify != NULL)
|
|||
|
{
|
|||
|
return (status);
|
|||
|
}
|
|||
|
|
|||
|
status = RpcStringBindingCompose(
|
|||
|
NULL, // NULL ObjUuid
|
|||
|
SENS_PROTSEQ,
|
|||
|
NULL, // Local machine
|
|||
|
SENS_ENDPOINT,
|
|||
|
NULL, // No Options
|
|||
|
&BindingString
|
|||
|
);
|
|||
|
|
|||
|
if (BindingString != NULL)
|
|||
|
{
|
|||
|
RPC_BINDING_HANDLE hServer = NULL;
|
|||
|
|
|||
|
status = RpcBindingFromStringBinding(BindingString, &hServer);
|
|||
|
|
|||
|
RpcStringFree(&BindingString);
|
|||
|
|
|||
|
if (status == RPC_S_OK)
|
|||
|
{
|
|||
|
RPC_SECURITY_QOS RpcSecQos;
|
|||
|
|
|||
|
RpcSecQos.Version= RPC_C_SECURITY_QOS_VERSION_1;
|
|||
|
RpcSecQos.ImpersonationType= RPC_C_IMP_LEVEL_IMPERSONATE;
|
|||
|
RpcSecQos.IdentityTracking= RPC_C_QOS_IDENTITY_DYNAMIC;
|
|||
|
RpcSecQos.Capabilities= RPC_C_QOS_CAPABILITIES_MUTUAL_AUTH;
|
|||
|
|
|||
|
status= RpcBindingSetAuthInfoEx(hServer,
|
|||
|
L"NT Authority\\System",
|
|||
|
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
|||
|
RPC_C_AUTHN_WINNT,
|
|||
|
NULL,
|
|||
|
RPC_C_AUTHZ_NONE,
|
|||
|
(RPC_SECURITY_QOS *)&RpcSecQos);
|
|||
|
|
|||
|
if (status != RPC_S_OK)
|
|||
|
{
|
|||
|
RpcBindingFree(&hServer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ghSensNotify = hServer;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return (status);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#if defined(SENSNOTIFY_WINLOGON_EVENT)
|
|||
|
|
|||
|
|
|||
|
DWORD
|
|||
|
SensNotifyWinlogonEvent(
|
|||
|
PSENS_NOTIFY_WINLOGON pEvent
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
RPC_STATUS RpcStatus;
|
|||
|
|
|||
|
RpcStatus = DoRpcSetup();
|
|||
|
if (RPC_S_OK != RpcStatus)
|
|||
|
{
|
|||
|
return RpcStatus;
|
|||
|
}
|
|||
|
|
|||
|
RpcStatus = SensApip_RPC_SensNotifyWinlogonEvent(
|
|||
|
ghSensNotify,
|
|||
|
pEvent
|
|||
|
);
|
|||
|
if (RpcStatus)
|
|||
|
{
|
|||
|
return RpcStatus;
|
|||
|
}
|
|||
|
|
|||
|
return (ERROR_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endif // SENSNOTIFY_WINLOGON_EVENT
|
|||
|
|
|||
|
#if defined(SENSNOTIFY_OTHER_EVENT)
|
|||
|
|
|||
|
|
|||
|
DWORD
|
|||
|
SensNotifyRasEvent(
|
|||
|
PSENS_NOTIFY_RAS pEvent
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Entry point for RAS to notify SENS of various RAS Events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
RPC_STATUS RpcStatus;
|
|||
|
|
|||
|
RpcStatus = DoRpcSetup();
|
|||
|
if (RPC_S_OK != RpcStatus)
|
|||
|
{
|
|||
|
return RpcStatus;
|
|||
|
}
|
|||
|
|
|||
|
RpcStatus = SensApip_RPC_SensNotifyRasEvent(
|
|||
|
ghSensNotify,
|
|||
|
pEvent
|
|||
|
);
|
|||
|
if (RpcStatus)
|
|||
|
{
|
|||
|
return RpcStatus;
|
|||
|
}
|
|||
|
|
|||
|
return (ERROR_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DWORD
|
|||
|
SensNotifyNetconEvent(
|
|||
|
PSENS_NOTIFY_NETCON pEvent
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Entry point for Network UI to notify SENS of LAN Connect/Disconnect events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pEvent - Pointer to Netcon event notification data.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
S_OK, if successful.
|
|||
|
|
|||
|
Failed hr, otherwise
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HRESULT hr;
|
|||
|
RPC_STATUS RpcStatus;
|
|||
|
SENS_NOTIFY_NETCON_P Data;
|
|||
|
NETCON_PROPERTIES *pNetconProperties;
|
|||
|
|
|||
|
hr = S_OK;
|
|||
|
pNetconProperties = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// Fill-in the data.
|
|||
|
//
|
|||
|
|
|||
|
ASSERT(pEvent && pEvent->pINetConnection);
|
|||
|
ASSERT( (pEvent->eType == SENS_NOTIFY_LAN_CONNECT)
|
|||
|
|| (pEvent->eType == SENS_NOTIFY_LAN_DISCONNECT));
|
|||
|
|
|||
|
hr = pEvent->pINetConnection->GetProperties(&pNetconProperties);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
if ( (NULL == pNetconProperties)
|
|||
|
|| (pNetconProperties->MediaType != NCM_LAN)
|
|||
|
|| ( (pNetconProperties->Status != NCS_CONNECTED)
|
|||
|
&& (pNetconProperties->Status != NCS_DISCONNECTED)))
|
|||
|
{
|
|||
|
hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
Data.eType = pEvent->eType;
|
|||
|
Data.Status = pNetconProperties->Status;
|
|||
|
Data.Type = pNetconProperties->MediaType;
|
|||
|
Data.Name = pNetconProperties->pszwName;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Send the data across.
|
|||
|
//
|
|||
|
|
|||
|
RpcStatus = DoRpcSetup();
|
|||
|
if (RPC_S_OK != RpcStatus)
|
|||
|
{
|
|||
|
hr = HRESULT_FROM_WIN32(RpcStatus);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
RpcStatus = SensApip_RPC_SensNotifyNetconEvent(
|
|||
|
ghSensNotify,
|
|||
|
&Data
|
|||
|
);
|
|||
|
if (RpcStatus)
|
|||
|
{
|
|||
|
hr = HRESULT_FROM_WIN32(RpcStatus);
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
|
|||
|
// Free NetconProperties, if necessary.
|
|||
|
if (pNetconProperties)
|
|||
|
{
|
|||
|
HMODULE hDll;
|
|||
|
PFN_FREE_NETCON_PROPERTIES pfnFreeNetconProperties;
|
|||
|
|
|||
|
hDll = LoadLibrary(NETSHELL_DLL);
|
|||
|
if (NULL == hDll)
|
|||
|
{
|
|||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|||
|
return hr;
|
|||
|
}
|
|||
|
|
|||
|
pfnFreeNetconProperties = (PFN_FREE_NETCON_PROPERTIES)
|
|||
|
GetProcAddress(
|
|||
|
hDll,
|
|||
|
FREE_NETCON_PROPERTIES
|
|||
|
);
|
|||
|
if (NULL == pfnFreeNetconProperties)
|
|||
|
{
|
|||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|||
|
FreeLibrary(hDll);
|
|||
|
return hr;
|
|||
|
}
|
|||
|
|
|||
|
(*pfnFreeNetconProperties)(pNetconProperties);
|
|||
|
|
|||
|
FreeLibrary(hDll);
|
|||
|
}
|
|||
|
|
|||
|
return (hr);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DWORD
|
|||
|
SyncMgrExecCmd(
|
|||
|
DWORD nCmdID,
|
|||
|
DWORD nCmdExecOpt
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Private function for Syncmgr to execute work on it's behalf.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
RPC_STATUS RpcStatus;
|
|||
|
|
|||
|
RpcStatus = DoRpcSetup();
|
|||
|
if (RPC_S_OK != RpcStatus)
|
|||
|
{
|
|||
|
return RpcStatus;
|
|||
|
}
|
|||
|
|
|||
|
RpcStatus = SensApip_RPC_SyncMgrExecCmd(
|
|||
|
ghSensNotify,
|
|||
|
nCmdID,
|
|||
|
nCmdExecOpt
|
|||
|
);
|
|||
|
if (RpcStatus)
|
|||
|
{
|
|||
|
return RpcStatus;
|
|||
|
}
|
|||
|
|
|||
|
return (ERROR_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endif // SENSNOTIFY_OTHER_EVENT
|