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

405 lines
7.3 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:
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