1549 lines
45 KiB
C++
1549 lines
45 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (C) Microsoft Corporation, 1997 - 1999
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
event.cxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
SENS code related to firing Events using LCE mechanism.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Gopal Parupudi <GopalP>
|
|||
|
|
|||
|
[Notes:]
|
|||
|
|
|||
|
optional-notes
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
GopalP 10/31/1997 Start.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include <precomp.hxx>
|
|||
|
#define STRSAFE_NO_DEPRECATE
|
|||
|
#include <strsafe.h>
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Some useful Macros
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
Helper Macro for firing Winlogon events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FIRE_WINLOGON_EVENT(_EVENT_NAME_, _EVENT_TYPE_) \
|
|||
|
{ \
|
|||
|
PSENSEVENT_WINLOGON pData = (PSENSEVENT_WINLOGON)EventData; \
|
|||
|
WCHAR buffer[256*2+1+1]; \
|
|||
|
\
|
|||
|
wcscpy(buffer, SENS_BSTR("")); \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| WINLOGON Event\n"))); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Type - %s\n"), _EVENT_NAME_)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Size - %d\n"), pData->Info.Size)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Flags - 0x%x\n"), pData->Info.Flags)); \
|
|||
|
SensPrintW(SENS_INFO, (SENS_BSTR("\t| UserName - %s\n"), \
|
|||
|
pData->Info.UserName ? pData->Info.UserName : SENS_BSTR(""))); \
|
|||
|
SensPrintW(SENS_INFO, (SENS_BSTR("\t| Domain - %s\n"), \
|
|||
|
pData->Info.Domain ? pData->Info.Domain : SENS_BSTR(""))); \
|
|||
|
SensPrintW(SENS_INFO, (SENS_BSTR("\t| WinStation - %s\n"), \
|
|||
|
pData->Info.WindowStation ? pData->Info.WindowStation : SENS_BSTR(""))); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| hToken - 0x%x\n"), pData->Info.hToken)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| hDesktop - 0x%x\n"), pData->Info.hDesktop)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| dwSessionId - 0x%x\n"), pData->Info.dwSessionId)); \
|
|||
|
\
|
|||
|
if (pData->Info.Domain != NULL) \
|
|||
|
{ \
|
|||
|
StringCbCopy(buffer, sizeof(buffer), pData->Info.Domain); \
|
|||
|
StringCbCat(buffer, sizeof(buffer), SENS_BSTR("\\")); \
|
|||
|
} \
|
|||
|
if (pData->Info.UserName != NULL) \
|
|||
|
{ \
|
|||
|
StringCbCat(buffer, sizeof(buffer), pData->Info.UserName); \
|
|||
|
} \
|
|||
|
SensPrintW(SENS_INFO, (SENS_BSTR("\t| UserName passed is - %s\n"), buffer)); \
|
|||
|
hr = SensFireWinlogonEventHelper(buffer, pData->Info.dwSessionId, _EVENT_TYPE_); \
|
|||
|
\
|
|||
|
break; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
Helper Macro for firing PnP events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. This is not an actual event exposed by SENS.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FIRE_PNP_EVENT(_EVENT_NAME_) \
|
|||
|
{ \
|
|||
|
PSENSEVENT_PNP pData = (PSENSEVENT_PNP)EventData; \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| PNP Event\n"))); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Type - DEVICE %s\n"), _EVENT_NAME_)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Size - %d\n"), pData->Size)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| DevType - %d\n"), pData->DevType)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Resource - 0x%x\n"), pData->Resource)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Flags - 0x%x\n"), pData->Flags)); \
|
|||
|
\
|
|||
|
break; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
Helper Macro for firing Power events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FIRE_POWER_EVENT(_EVENT_NAME_, _EVENT_TYPE_) \
|
|||
|
{ \
|
|||
|
PSENSEVENT_POWER pData = (PSENSEVENT_POWER)EventData; \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| POWER MANAGEMENT Event\n"))); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Type - %s\n"), _EVENT_NAME_)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ACLineStatus - %d\n"), \
|
|||
|
pData->PowerStatus.ACLineStatus)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| BatteryFlag - %d\n"), \
|
|||
|
pData->PowerStatus.BatteryFlag)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| BatteryLifePercent - %d\n"), \
|
|||
|
pData->PowerStatus.BatteryLifePercent)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| BatteryLifeTime - 0x%x secs\n"), \
|
|||
|
pData->PowerStatus.BatteryLifeTime)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| BatteryFullLifeTime - 0x%x secs\n"), \
|
|||
|
pData->PowerStatus.BatteryFullLifeTime)); \
|
|||
|
hr = SensFirePowerEventHelper(pData->PowerStatus, _EVENT_TYPE_); \
|
|||
|
break; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
Helper Macro for firing RAS events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. This is not an actual event exposed by SENS. It may, however, generate
|
|||
|
a WAN Connectivity event.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FIRE_RAS_EVENT(_EVENT_NAME_) \
|
|||
|
{ \
|
|||
|
\
|
|||
|
PSENSEVENT_RAS pData = (PSENSEVENT_RAS)EventData; \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| RAS Event\n"))); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Type - %s\n"), _EVENT_NAME_)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Connection Handle - 0x%x\n"), pData->hConnection)); \
|
|||
|
break; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
Helper Macro for firing LAN events.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. This is not an actual event exposed by SENS. It may, however, generate
|
|||
|
a LAN Connectivity event.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FIRE_LAN_EVENT(_EVENT_NAME_) \
|
|||
|
\
|
|||
|
{ \
|
|||
|
PSENSEVENT_LAN pData = (PSENSEVENT_LAN)EventData; \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| LAN Event\n"))); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Type - %s\n"), _EVENT_NAME_)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Connection Name - %s\n"), pData->Name)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Status - 0x%x\n"), pData->Status)); \
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Type - 0x%x\n"), pData->Type)); \
|
|||
|
break; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
This macro is called when we allocate the EventData so that it can be
|
|||
|
queued to a worker thread. ALLOCATE_END() should be called to signal the
|
|||
|
end of the allocation.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. pData, pTempData and pReturnData are fixed names for the variable.
|
|||
|
They should not be changed without updating the code that uses
|
|||
|
this macro.
|
|||
|
|
|||
|
--*/
|
|||
|
#define ALLOCATE_BEGIN(_EVENT_STRUCT_) \
|
|||
|
\
|
|||
|
_EVENT_STRUCT_ *pData, *pTempData; \
|
|||
|
\
|
|||
|
/* Allocate the Data structure */ \
|
|||
|
pTempData = (_EVENT_STRUCT_ *) EventData; \
|
|||
|
pData = (_EVENT_STRUCT_ *) new char[sizeof(_EVENT_STRUCT_)]; \
|
|||
|
if (NULL == pData) \
|
|||
|
{ \
|
|||
|
goto Cleanup; \
|
|||
|
} \
|
|||
|
\
|
|||
|
memcpy(pData, EventData, sizeof(_EVENT_STRUCT_));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
This macro is called when we allocate the strings in the EventData before
|
|||
|
queueing to a worker thread. FREE_STRING_MEMBER() should be called to free
|
|||
|
the string before the EventData itself is freed.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. pData, pTempData and pReturnData are fixed names for the variable.
|
|||
|
They should not be changed without updating the code that uses
|
|||
|
this macro.
|
|||
|
|
|||
|
--*/
|
|||
|
#define ALLOCATE_STRING_MEMBER(_DEST_, _SOURCE_) \
|
|||
|
\
|
|||
|
if (NULL != _SOURCE_) \
|
|||
|
{ \
|
|||
|
/* Allocate the string */ \
|
|||
|
_DEST_ = new WCHAR[(wcslen(_SOURCE_)+1)]; \
|
|||
|
if (NULL == _DEST_) \
|
|||
|
{ \
|
|||
|
delete pData; \
|
|||
|
goto Cleanup; \
|
|||
|
} \
|
|||
|
wcscpy(_DEST_, _SOURCE_); \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
This macro is called when we finish allocating the EventData so that
|
|||
|
it can be queued to a worker thread. It should be always called after
|
|||
|
ALLOCATE_BEGIN() macro.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. pData, pTempData and pReturnData are fixed names for the variable.
|
|||
|
They should not be changed without updating the code that uses
|
|||
|
this macro.
|
|||
|
|
|||
|
--*/
|
|||
|
#define ALLOCATE_END() \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("******** Allocated a DS (0x%x)\n"), pData)); \
|
|||
|
pReturnData = pData; \
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
This macro is called to begin the deallocation of the EventData. This
|
|||
|
should always match with a call to ALLOCATE_BEGIN() macro.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. pData, pTempData and pReturnData are fixed names for the variable.
|
|||
|
They should not be changed without updating the code that uses
|
|||
|
this macro.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FREE_BEGIN(_EVENT_STRUCT_) \
|
|||
|
\
|
|||
|
_EVENT_STRUCT_ *pData; \
|
|||
|
\
|
|||
|
pData = (_EVENT_STRUCT_ *) EventData;
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
This macro is called to free the string member of an EventData. This
|
|||
|
should always match with a call to ALLOCATE_STRING_MEMBER() macro.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. pData, pTempData and pReturnData are fixed names for the variable.
|
|||
|
They should not be changed without updating the code that uses
|
|||
|
this macro.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FREE_STRING_MEMBER(_STRING_) \
|
|||
|
\
|
|||
|
if (NULL != _STRING_) \
|
|||
|
{ \
|
|||
|
/* Free the string */ \
|
|||
|
delete _STRING_; \
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Macro Description:
|
|||
|
|
|||
|
This macro is called to end the deallocation of EventData. This
|
|||
|
should always match with a call to FREE_BEGIN() macro.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
See signature.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
a. pData, pTempData and pReturnData are fixed names for the variable.
|
|||
|
They should not be changed without updating the code that uses
|
|||
|
this macro.
|
|||
|
|
|||
|
--*/
|
|||
|
#define FREE_END() \
|
|||
|
\
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("********** Freed a DS (0x%x)\n"), pData)); \
|
|||
|
delete pData; \
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
EvaluateConnectivity(
|
|||
|
IN CONNECTIVITY_TYPE Type
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This code queues up a job (for evaluating Network connectivity) to
|
|||
|
a worker thread.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Type - Indicates the type of connectivity to be evaluated.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
BOOL bRetVal;
|
|||
|
LPTHREAD_START_ROUTINE lpfnEvaluate;
|
|||
|
|
|||
|
switch (Type)
|
|||
|
{
|
|||
|
case TYPE_WAN:
|
|||
|
lpfnEvaluate = (LPTHREAD_START_ROUTINE) EvaluateWanConnectivity;
|
|||
|
break;
|
|||
|
|
|||
|
case TYPE_DELAY_LAN:
|
|||
|
lpfnEvaluate = (LPTHREAD_START_ROUTINE) EvaluateLanConnectivityDelayed;
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
case TYPE_LAN:
|
|||
|
lpfnEvaluate = (LPTHREAD_START_ROUTINE) EvaluateLanConnectivity;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
bRetVal = SensQueueUserWorkItem(
|
|||
|
(LPTHREAD_START_ROUTINE) lpfnEvaluate,
|
|||
|
NULL,
|
|||
|
SENS_LONG_ITEM // Flags
|
|||
|
);
|
|||
|
if (FALSE == bRetVal)
|
|||
|
{
|
|||
|
SensPrintA(SENS_ERR, ("EvaluateConnectivity(): SensQueueUserWorkItem() failed with %d.\n",
|
|||
|
GetLastError()));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
SensFireEvent(
|
|||
|
IN PVOID EventData
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This code queues up a job (for firing a SENS event) to a worker thread.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
EventData - Data relating to the event.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
BOOL bRetVal;
|
|||
|
PVOID pAllocatedData;
|
|||
|
|
|||
|
pAllocatedData = AllocateEventData(EventData);
|
|||
|
if (NULL == pAllocatedData)
|
|||
|
{
|
|||
|
SensPrintA(SENS_ERR, ("SensFireEvent(): Failed to allocate Event Data!\n"));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
bRetVal = SensQueueUserWorkItem(
|
|||
|
(LPTHREAD_START_ROUTINE) SensFireEventHelper,
|
|||
|
pAllocatedData, // Event Data
|
|||
|
SENS_LONG_ITEM // Flags
|
|||
|
);
|
|||
|
if (FALSE == bRetVal)
|
|||
|
{
|
|||
|
SensPrintA(SENS_ERR, ("SensFireEvent(): SensQueueUserWorkItem() failed with %d.\n",
|
|||
|
GetLastError()));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SensPrintA(SENS_INFO, ("SensFireEvent(): SensQueueUserWorkItem() succeeded.\n"));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
DWORD WINAPI
|
|||
|
SensFireEventHelper(
|
|||
|
IN PVOID EventData
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This code sets up the necessary stuff for firing a SENS event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
EventData - Data relating to the event.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
S_OK, if successful
|
|||
|
|
|||
|
hr, otherwise
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
SENS_EVENT_TYPE eType;
|
|||
|
HRESULT hr;
|
|||
|
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|-------------------------------------------------------|\n")));
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| E V E N T F I R E D |\n")));
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|-------------------------------------------------------|\n")));
|
|||
|
|
|||
|
hr = S_OK;
|
|||
|
eType = *(SENS_EVENT_TYPE *)EventData;
|
|||
|
|
|||
|
switch (eType)
|
|||
|
{
|
|||
|
case SENS_EVENT_NETALIVE:
|
|||
|
{
|
|||
|
PSENSEVENT_NETALIVE pData = (PSENSEVENT_NETALIVE)EventData;
|
|||
|
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| %s%sNetwork Connectivity is %sPRESENT.\n\t|\n"),
|
|||
|
(pData->QocInfo.dwFlags & CONNECTION_WAN) ? SENS_STRING("WAN ") : SENS_STRING(""),
|
|||
|
(pData->QocInfo.dwFlags & CONNECTION_LAN) ? SENS_STRING("LAN ") : SENS_STRING(""),
|
|||
|
pData->bAlive ? SENS_STRING("") : SENS_STRING("NOT "))
|
|||
|
);
|
|||
|
|
|||
|
hr = SensFireNetEventHelper(pData);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_REACH:
|
|||
|
{
|
|||
|
PSENSEVENT_REACH pData = (PSENSEVENT_REACH)EventData;
|
|||
|
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Destination is %sREACHABLE.\n"), pData->bReachable ? "" : "NOT "));
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t|\n\t| Name : %s\n"), pData->Destination));
|
|||
|
if (pData->bReachable == TRUE)
|
|||
|
{
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| dwFlags : 0x%x \n"), pData->QocInfo.dwFlags));
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| InSpeed : %d bits/sec.\n"), pData->QocInfo.dwInSpeed));
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| OutSpeed : %d bits/sec.\n"), pData->QocInfo.dwOutSpeed));
|
|||
|
}
|
|||
|
|
|||
|
hr = SensFireReachabilityEventHelper(pData);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_PNP_DEVICE_ARRIVED:
|
|||
|
FIRE_PNP_EVENT(SENS_STRING("ARRIVED"));
|
|||
|
|
|||
|
case SENS_EVENT_PNP_DEVICE_REMOVED:
|
|||
|
FIRE_PNP_EVENT(SENS_STRING("REMOVED"));
|
|||
|
|
|||
|
case SENS_EVENT_POWER_ON_ACPOWER:
|
|||
|
FIRE_POWER_EVENT(SENS_STRING("ON AC POWER"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_POWER_ON_BATTERYPOWER:
|
|||
|
FIRE_POWER_EVENT(SENS_STRING("ON BATTERY POWER"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_POWER_BATTERY_LOW:
|
|||
|
FIRE_POWER_EVENT(SENS_STRING("BATTERY IS LOW"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_POWER_STATUS_CHANGE:
|
|||
|
FIRE_POWER_EVENT(SENS_STRING("POWER STATUS CHANGED"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_LOGON:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("LOGON"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_LOGOFF:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("LOGOFF"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_STARTSHELL:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("STARTSHELL"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_POSTSHELL:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("POSTSHELL"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_SESSION_DISCONNECT:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("SESSION DISCONNECT"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_SESSION_RECONNECT:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("SESSION RECONNECT"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_STARTSCREENSAVER:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("STARTSCREENSAVER"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_STOPSCREENSAVER:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("STOPSCREENSAVER"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_LOCK:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("DISPLAY LOCK"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_UNLOCK:
|
|||
|
FIRE_WINLOGON_EVENT(SENS_STRING("DISPLAY UNLOCK"), eType);
|
|||
|
|
|||
|
case SENS_EVENT_RAS_STARTED:
|
|||
|
FIRE_RAS_EVENT(SENS_STRING("RAS STARTED"));
|
|||
|
|
|||
|
case SENS_EVENT_RAS_STOPPED:
|
|||
|
FIRE_RAS_EVENT(SENS_STRING("RAS STOPPED"));
|
|||
|
|
|||
|
case SENS_EVENT_RAS_CONNECT:
|
|||
|
FIRE_RAS_EVENT(SENS_STRING("RAS CONNECT"));
|
|||
|
|
|||
|
case SENS_EVENT_RAS_DISCONNECT:
|
|||
|
FIRE_RAS_EVENT(SENS_STRING("RAS DISCONNECT"));
|
|||
|
|
|||
|
case SENS_EVENT_RAS_DISCONNECT_PENDING:
|
|||
|
FIRE_RAS_EVENT(SENS_STRING("RAS DISCONNECT PENDING"));
|
|||
|
|
|||
|
case SENS_EVENT_LAN_CONNECT:
|
|||
|
FIRE_LAN_EVENT(SENS_STRING("LAN CONNECT"));
|
|||
|
|
|||
|
case SENS_EVENT_LAN_DISCONNECT:
|
|||
|
FIRE_LAN_EVENT(SENS_STRING("LAN DISCONNECT"));
|
|||
|
|
|||
|
default:
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| A bogus event - %d !\n"), eType));
|
|||
|
hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Free the allocated Event data structure.
|
|||
|
//
|
|||
|
FreeEventData(EventData);
|
|||
|
|
|||
|
return ((DWORD) hr);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
PVOID
|
|||
|
AllocateEventData(
|
|||
|
PVOID EventData
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Allocated the EventData depending on the type of the event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
EventData - Data relating to the event.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
SENS_EVENT_TYPE eType;
|
|||
|
PVOID pReturnData;
|
|||
|
|
|||
|
pReturnData = NULL;
|
|||
|
if (NULL == EventData)
|
|||
|
{
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
eType = *(SENS_EVENT_TYPE *)EventData;
|
|||
|
|
|||
|
switch (eType)
|
|||
|
{
|
|||
|
case SENS_EVENT_NETALIVE:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_NETALIVE);
|
|||
|
|
|||
|
ALLOCATE_STRING_MEMBER(pData->strConnection, pTempData->strConnection);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_REACH:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_REACH);
|
|||
|
|
|||
|
ALLOCATE_STRING_MEMBER(pData->Destination, pTempData->Destination);
|
|||
|
ALLOCATE_STRING_MEMBER(pData->strConnection, pTempData->strConnection);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_PNP_DEVICE_ARRIVED:
|
|||
|
case SENS_EVENT_PNP_DEVICE_REMOVED:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_PNP);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
case SENS_EVENT_POWER_ON_ACPOWER:
|
|||
|
case SENS_EVENT_POWER_ON_BATTERYPOWER:
|
|||
|
case SENS_EVENT_POWER_BATTERY_LOW:
|
|||
|
case SENS_EVENT_POWER_STATUS_CHANGE:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_POWER);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_LOGON:
|
|||
|
case SENS_EVENT_LOGOFF:
|
|||
|
case SENS_EVENT_STARTSHELL:
|
|||
|
case SENS_EVENT_POSTSHELL:
|
|||
|
case SENS_EVENT_SESSION_DISCONNECT:
|
|||
|
case SENS_EVENT_SESSION_RECONNECT:
|
|||
|
case SENS_EVENT_STARTSCREENSAVER:
|
|||
|
case SENS_EVENT_STOPSCREENSAVER:
|
|||
|
case SENS_EVENT_LOCK:
|
|||
|
case SENS_EVENT_UNLOCK:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_WINLOGON);
|
|||
|
|
|||
|
ALLOCATE_STRING_MEMBER(pData->Info.UserName, pTempData->Info.UserName);
|
|||
|
ALLOCATE_STRING_MEMBER(pData->Info.Domain, pTempData->Info.Domain);
|
|||
|
ALLOCATE_STRING_MEMBER(pData->Info.WindowStation, pTempData->Info.WindowStation);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_RAS_STARTED:
|
|||
|
case SENS_EVENT_RAS_STOPPED:
|
|||
|
case SENS_EVENT_RAS_CONNECT:
|
|||
|
case SENS_EVENT_RAS_DISCONNECT:
|
|||
|
case SENS_EVENT_RAS_DISCONNECT_PENDING:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_RAS);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_LAN_CONNECT:
|
|||
|
case SENS_EVENT_LAN_DISCONNECT:
|
|||
|
{
|
|||
|
ALLOCATE_BEGIN(SENSEVENT_LAN);
|
|||
|
|
|||
|
ALLOCATE_STRING_MEMBER(pData->Name, pTempData->Name);
|
|||
|
|
|||
|
ALLOCATE_END();
|
|||
|
}
|
|||
|
|
|||
|
default:
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| A bogus event - %d !\n"), eType));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
return pReturnData;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
FreeEventData(
|
|||
|
PVOID EventData
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Frees the EventData depending on the type of the event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
EventData - Data relating to the event.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
SENS_EVENT_TYPE eType;
|
|||
|
|
|||
|
if (NULL == EventData)
|
|||
|
{
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
eType = *(SENS_EVENT_TYPE *)EventData;
|
|||
|
|
|||
|
switch (eType)
|
|||
|
{
|
|||
|
case SENS_EVENT_NETALIVE:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_NETALIVE);
|
|||
|
|
|||
|
FREE_STRING_MEMBER(pData->strConnection);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_REACH:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_REACH);
|
|||
|
|
|||
|
FREE_STRING_MEMBER(pData->Destination);
|
|||
|
FREE_STRING_MEMBER(pData->strConnection);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_PNP_DEVICE_ARRIVED:
|
|||
|
case SENS_EVENT_PNP_DEVICE_REMOVED:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_PNP);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
case SENS_EVENT_POWER_ON_ACPOWER:
|
|||
|
case SENS_EVENT_POWER_ON_BATTERYPOWER:
|
|||
|
case SENS_EVENT_POWER_BATTERY_LOW:
|
|||
|
case SENS_EVENT_POWER_STATUS_CHANGE:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_POWER);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_LOGON:
|
|||
|
case SENS_EVENT_LOGOFF:
|
|||
|
case SENS_EVENT_STARTSHELL:
|
|||
|
case SENS_EVENT_POSTSHELL:
|
|||
|
case SENS_EVENT_SESSION_DISCONNECT:
|
|||
|
case SENS_EVENT_SESSION_RECONNECT:
|
|||
|
case SENS_EVENT_STARTSCREENSAVER:
|
|||
|
case SENS_EVENT_STOPSCREENSAVER:
|
|||
|
case SENS_EVENT_LOCK:
|
|||
|
case SENS_EVENT_UNLOCK:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_WINLOGON);
|
|||
|
|
|||
|
FREE_STRING_MEMBER(pData->Info.UserName);
|
|||
|
FREE_STRING_MEMBER(pData->Info.Domain);
|
|||
|
FREE_STRING_MEMBER(pData->Info.WindowStation);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_RAS_STARTED:
|
|||
|
case SENS_EVENT_RAS_STOPPED:
|
|||
|
case SENS_EVENT_RAS_CONNECT:
|
|||
|
case SENS_EVENT_RAS_DISCONNECT:
|
|||
|
case SENS_EVENT_RAS_DISCONNECT_PENDING:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_RAS);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
case SENS_EVENT_LAN_CONNECT:
|
|||
|
case SENS_EVENT_LAN_DISCONNECT:
|
|||
|
{
|
|||
|
FREE_BEGIN(SENSEVENT_LAN);
|
|||
|
|
|||
|
FREE_STRING_MEMBER(pData->Name);
|
|||
|
|
|||
|
FREE_END();
|
|||
|
}
|
|||
|
|
|||
|
default:
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| A bogus structure to free - %d !\n"), eType));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
HRESULT
|
|||
|
SensFireNetEventHelper(
|
|||
|
PSENSEVENT_NETALIVE pData
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Helps fire the SENS Network Alive event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pData - Net alive event data.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
S_OK, if successful.
|
|||
|
|
|||
|
Failure hr, otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HRESULT hr;
|
|||
|
BSTR bstrConnectionName;
|
|||
|
BSTR bstrMethodName;
|
|||
|
ISensNetwork *pISensNetwork;
|
|||
|
IEventControl *pIEventControl;
|
|||
|
SENS_QOCINFO SensQocInfo;
|
|||
|
CImpISensNetworkFilter NetEventsFilter; // Already AddRef'ed
|
|||
|
|
|||
|
hr = S_OK;
|
|||
|
bstrConnectionName = NULL;
|
|||
|
bstrMethodName = NULL;
|
|||
|
pISensNetwork = NULL;
|
|||
|
pIEventControl = NULL;
|
|||
|
|
|||
|
hr = CoCreateInstance(
|
|||
|
SENSGUID_EVENTCLASS_NETWORK,
|
|||
|
NULL,
|
|||
|
CLSCTX_SERVER,
|
|||
|
IID_ISensNetwork,
|
|||
|
(LPVOID *) &pISensNetwork
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get ISensNetwork object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created ISensNetwork Object\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Setup Publisher filtering
|
|||
|
//
|
|||
|
hr = pISensNetwork->QueryInterface(
|
|||
|
IID_IEventControl,
|
|||
|
(LPVOID *) &pIEventControl
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get IEventControl object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created IEventControl Object\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Disallow inproc activation (we're local system, and we
|
|||
|
// don't like foreign components in our security context,
|
|||
|
// potentially crashing us).
|
|||
|
//
|
|||
|
pIEventControl->put_AllowInprocActivation(FALSE);
|
|||
|
|
|||
|
AllocateBstrFromString(bstrConnectionName, pData->strConnection);
|
|||
|
|
|||
|
if (pData->bAlive)
|
|||
|
{
|
|||
|
// Connect events
|
|||
|
AllocateBstrFromString(bstrMethodName, CONNECTION_MADE_NOQOC_METHOD);
|
|||
|
hr = NetEventsFilter.Initialize(bstrMethodName, pIEventControl);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't initialize PublisherFilters for Net Connect Event - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
hr = pIEventControl->SetPublisherFilter(
|
|||
|
bstrMethodName,
|
|||
|
&NetEventsFilter
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't set PublisherFilters for Net Connect Event - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Fire the necessary ISensNetwork events
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// ConnectionMadeNoQOCInfo event
|
|||
|
//
|
|||
|
hr = pISensNetwork->ConnectionMadeNoQOCInfo(
|
|||
|
bstrConnectionName,
|
|||
|
pData->QocInfo.dwFlags
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire ConnectionMadeQOCInfo - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ConnectionMadeNoQOCInfo() returned 0x%x\n"), hr));
|
|||
|
|
|||
|
//
|
|||
|
// ConnectionMade event
|
|||
|
//
|
|||
|
FreeBstr(bstrMethodName);
|
|||
|
AllocateBstrFromString(bstrMethodName, CONNECTION_MADE_METHOD);
|
|||
|
hr = NetEventsFilter.Initialize(bstrMethodName, pIEventControl);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| initialize't set PublisherFilters for NetEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
hr = pIEventControl->SetPublisherFilter(
|
|||
|
bstrMethodName,
|
|||
|
&NetEventsFilter
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't set PublisherFilters for NetEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
memcpy(&SensQocInfo, &pData->QocInfo, sizeof(SENS_QOCINFO));
|
|||
|
hr = pISensNetwork->ConnectionMade(
|
|||
|
bstrConnectionName,
|
|||
|
pData->QocInfo.dwFlags,
|
|||
|
&SensQocInfo
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire ConnectionMade - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ConnectionMade() returned 0x%x\n"), hr));
|
|||
|
}
|
|||
|
else // bAlive == FALSE
|
|||
|
{
|
|||
|
// Disconnect event
|
|||
|
AllocateBstrFromString(bstrMethodName, CONNECTION_LOST_METHOD);
|
|||
|
hr = NetEventsFilter.Initialize(bstrMethodName, pIEventControl);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't initialize PublisherFilters for Net Disconnect Event - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
hr = pIEventControl->SetPublisherFilter(
|
|||
|
bstrMethodName,
|
|||
|
&NetEventsFilter
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't set PublisherFilters for Net Disconnect Event - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Fire the necessary ISensNetwork events
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// ConnectionMadeNoQOCInfo event
|
|||
|
//
|
|||
|
hr = pISensNetwork->ConnectionLost(
|
|||
|
bstrConnectionName,
|
|||
|
pData->QocInfo.dwFlags
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire ConnectionLost - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ConnectionLost() returned 0x%x\n"), hr));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
if (pIEventControl)
|
|||
|
{
|
|||
|
pIEventControl->Release();
|
|||
|
}
|
|||
|
if (pISensNetwork)
|
|||
|
{
|
|||
|
pISensNetwork->Release();
|
|||
|
}
|
|||
|
|
|||
|
FreeBstr(bstrMethodName);
|
|||
|
FreeBstr(bstrConnectionName);
|
|||
|
|
|||
|
return hr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
HRESULT
|
|||
|
SensFireReachabilityEventHelper(
|
|||
|
PSENSEVENT_REACH pData
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Helps fire the SENS Reachability event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
pData - Reachability event Data.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
S_OK, if successful.
|
|||
|
|
|||
|
Failure hr, otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HRESULT hr;
|
|||
|
BSTR bstrConnectionName;
|
|||
|
BSTR bstrMethodName;
|
|||
|
BSTR bstrDestinationName;
|
|||
|
ISensNetwork *pISensNetwork;
|
|||
|
IEventControl *pIEventControl;
|
|||
|
SENS_QOCINFO SensQocInfo;
|
|||
|
CImpISensNetworkFilter NetEventsFilter; // Already AddRef'ed
|
|||
|
|
|||
|
hr = S_OK;
|
|||
|
bstrMethodName = NULL;
|
|||
|
bstrConnectionName = NULL;
|
|||
|
bstrDestinationName = NULL;
|
|||
|
pISensNetwork = NULL;
|
|||
|
pIEventControl = NULL;
|
|||
|
|
|||
|
hr = CoCreateInstance(
|
|||
|
SENSGUID_EVENTCLASS_NETWORK,
|
|||
|
NULL,
|
|||
|
CLSCTX_SERVER,
|
|||
|
IID_ISensNetwork,
|
|||
|
(LPVOID *) &pISensNetwork
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get ISensNetwork object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created ISensNetwork Object\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Setup Publisher filtering
|
|||
|
//
|
|||
|
hr = pISensNetwork->QueryInterface(
|
|||
|
IID_IEventControl,
|
|||
|
(LPVOID *) &pIEventControl
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get IEventControl object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created IEventControl Object\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Disallow inproc activation (we're local system, and we
|
|||
|
// don't like foreign components in our security context,
|
|||
|
// potentially crashing us).
|
|||
|
//
|
|||
|
pIEventControl->put_AllowInprocActivation(FALSE);
|
|||
|
|
|||
|
AllocateBstrFromString(bstrMethodName, DESTINATION_REACHABLE_NOQOC_METHOD);
|
|||
|
hr = NetEventsFilter.Initialize(bstrMethodName, pIEventControl);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| initialize't set PublisherFilters for ReachabilityEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
hr = pIEventControl->SetPublisherFilter(
|
|||
|
bstrMethodName,
|
|||
|
&NetEventsFilter
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't set PublisherFilters for ReachabilityEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Fire the Reachability events
|
|||
|
//
|
|||
|
AllocateBstrFromString(bstrConnectionName, pData->strConnection);
|
|||
|
AllocateBstrFromString(bstrDestinationName, pData->Destination);
|
|||
|
|
|||
|
//
|
|||
|
// DestinationReachableNoQOCInfo event
|
|||
|
//
|
|||
|
hr = pISensNetwork->DestinationReachableNoQOCInfo(
|
|||
|
bstrDestinationName,
|
|||
|
bstrConnectionName,
|
|||
|
pData->QocInfo.dwFlags
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire DestinationReachableNoQOCInfo - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| DestinationReachableNoQOCInfo() returned 0x%x\n"), hr));
|
|||
|
|
|||
|
//
|
|||
|
// DestinationReachable event
|
|||
|
//
|
|||
|
FreeBstr(bstrMethodName);
|
|||
|
AllocateBstrFromString(bstrMethodName, DESTINATION_REACHABLE_METHOD);
|
|||
|
hr = NetEventsFilter.Initialize(bstrMethodName, pIEventControl);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| initialize't set PublisherFilters for ReachabilityEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
hr = pIEventControl->SetPublisherFilter(
|
|||
|
bstrMethodName,
|
|||
|
&NetEventsFilter
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't set PublisherFilters for ReachabilityEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
|
|||
|
memcpy(&SensQocInfo, &pData->QocInfo, sizeof(SENS_QOCINFO));
|
|||
|
hr = pISensNetwork->DestinationReachable(
|
|||
|
bstrDestinationName,
|
|||
|
bstrConnectionName,
|
|||
|
pData->QocInfo.dwFlags,
|
|||
|
&SensQocInfo
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire DestinationReachable - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| DestinationReachable() returned 0x%x\n"), hr));
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
if (pIEventControl)
|
|||
|
{
|
|||
|
pIEventControl->Release();
|
|||
|
}
|
|||
|
if (pISensNetwork)
|
|||
|
{
|
|||
|
pISensNetwork->Release();
|
|||
|
}
|
|||
|
|
|||
|
FreeBstr(bstrMethodName);
|
|||
|
FreeBstr(bstrConnectionName);
|
|||
|
FreeBstr(bstrDestinationName);
|
|||
|
|
|||
|
return hr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
HRESULT
|
|||
|
SensFireWinlogonEventHelper(
|
|||
|
LPWSTR strArg,
|
|||
|
DWORD dwSessionId,
|
|||
|
SENS_EVENT_TYPE eType
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Helps fire the SENS Winlogon event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
strArg - DomainName\UserName
|
|||
|
|
|||
|
dwSessionId - Session Id of the session on which this event was fired.
|
|||
|
|
|||
|
eType - Type of Winlogon event.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
S_OK, if successful.
|
|||
|
|
|||
|
Failure hr, otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HRESULT hr;
|
|||
|
HRESULT hr2;
|
|||
|
BOOL bLogon2;
|
|||
|
BSTR bstrUserName;
|
|||
|
ISensLogon *pISensLogon;
|
|||
|
ISensLogon2 *pISensLogon2;
|
|||
|
|
|||
|
hr = S_OK;
|
|||
|
hr2 = S_OK;
|
|||
|
bstrUserName = NULL;
|
|||
|
pISensLogon = NULL;
|
|||
|
pISensLogon2 = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// Get the ISensLogon Object
|
|||
|
//
|
|||
|
hr = CoCreateInstance(
|
|||
|
SENSGUID_EVENTCLASS_LOGON,
|
|||
|
NULL,
|
|||
|
CLSCTX_SERVER,
|
|||
|
IID_ISensLogon,
|
|||
|
(LPVOID *) &pISensLogon
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get ISensLogon object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created ISensLogon Object\n")));
|
|||
|
|
|||
|
//
|
|||
|
// Get the ISensLogon2 Object
|
|||
|
//
|
|||
|
hr2 = CoCreateInstance(
|
|||
|
SENSGUID_EVENTCLASS_LOGON2,
|
|||
|
NULL,
|
|||
|
CLSCTX_SERVER,
|
|||
|
IID_ISensLogon2,
|
|||
|
(LPVOID *) &pISensLogon2
|
|||
|
);
|
|||
|
if (FAILED(hr2))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get ISensLogon2 object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr2));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created ISensLogon2 Object\n")));
|
|||
|
|
|||
|
AllocateBstrFromString(bstrUserName, strArg);
|
|||
|
|
|||
|
switch (eType)
|
|||
|
{
|
|||
|
case SENS_EVENT_LOGON:
|
|||
|
hr = pISensLogon->Logon(bstrUserName);
|
|||
|
hr2 = pISensLogon2->Logon(bstrUserName, dwSessionId);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_LOGOFF:
|
|||
|
hr = pISensLogon->Logoff(bstrUserName);
|
|||
|
hr2 = pISensLogon2->Logoff(bstrUserName, dwSessionId);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_STARTSHELL:
|
|||
|
hr = pISensLogon->StartShell(bstrUserName);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_POSTSHELL:
|
|||
|
hr2 = pISensLogon2->PostShell(bstrUserName, dwSessionId);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_SESSION_DISCONNECT:
|
|||
|
hr2 = pISensLogon2->SessionDisconnect(bstrUserName, dwSessionId);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_SESSION_RECONNECT:
|
|||
|
hr2 = pISensLogon2->SessionReconnect(bstrUserName, dwSessionId);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_LOCK:
|
|||
|
hr = pISensLogon->DisplayLock(bstrUserName);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_UNLOCK:
|
|||
|
hr = pISensLogon->DisplayUnlock(bstrUserName);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_STARTSCREENSAVER:
|
|||
|
hr = pISensLogon->StartScreenSaver(bstrUserName);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_STOPSCREENSAVER:
|
|||
|
hr = pISensLogon->StopScreenSaver(bstrUserName);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
SensPrint(SENS_WARN, (SENS_STRING("\t| Bad Winlogon Event - %d\n"), eType));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Check for failures
|
|||
|
//
|
|||
|
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire ISensLogon->WinlogonEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ISensLogon->WinlogonEvent() returned 0x%x\n"), hr));
|
|||
|
}
|
|||
|
|
|||
|
if (FAILED(hr2))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire ISensLogon2->WinlogonEvent(%d) - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), dwSessionId, hr2));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ISensLogon2->WinlogonEvent(%d) returned 0x%x\n"), dwSessionId, hr));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
if (pISensLogon)
|
|||
|
{
|
|||
|
pISensLogon->Release();
|
|||
|
}
|
|||
|
|
|||
|
if (pISensLogon2)
|
|||
|
{
|
|||
|
pISensLogon2->Release();
|
|||
|
}
|
|||
|
|
|||
|
FreeBstr(bstrUserName);
|
|||
|
|
|||
|
return hr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
HRESULT
|
|||
|
SensFirePowerEventHelper(
|
|||
|
SYSTEM_POWER_STATUS PowerStatus,
|
|||
|
SENS_EVENT_TYPE eType
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Helps fire the SENS Power event.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
PowerStatus - Power Status event structure
|
|||
|
|
|||
|
eType - Type of the Power event.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
S_OK, if successful.
|
|||
|
|
|||
|
Failure hr, otherwise.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HRESULT hr;
|
|||
|
ISensOnNow *pISensOnNow;
|
|||
|
|
|||
|
hr = S_OK;
|
|||
|
pISensOnNow = NULL;
|
|||
|
|
|||
|
//
|
|||
|
// Get the ISensOnNow Object
|
|||
|
//
|
|||
|
hr = CoCreateInstance(
|
|||
|
SENSGUID_EVENTCLASS_ONNOW,
|
|||
|
NULL,
|
|||
|
CLSCTX_SERVER,
|
|||
|
IID_ISensOnNow,
|
|||
|
(LPVOID *) &pISensOnNow
|
|||
|
);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't get ISensOnNow object - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| Successfully created ISensOnNow Object\n")));
|
|||
|
|
|||
|
switch (eType)
|
|||
|
{
|
|||
|
case SENS_EVENT_POWER_ON_ACPOWER:
|
|||
|
hr = pISensOnNow->OnACPower();
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_POWER_ON_BATTERYPOWER:
|
|||
|
hr = pISensOnNow->OnBatteryPower(PowerStatus.BatteryLifePercent);
|
|||
|
break;
|
|||
|
|
|||
|
case SENS_EVENT_POWER_BATTERY_LOW:
|
|||
|
hr = pISensOnNow->BatteryLow(PowerStatus.BatteryLifePercent);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
SensPrint(SENS_WARN, (SENS_STRING("\t| Bad Power Event - %d\n"), eType));
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
SensPrint(SENS_ERR, (SENS_STRING("\t| Couldn't fire ISensOnNow->PowerEvent - ")
|
|||
|
SENS_STRING("hr = 0x%x\n"), hr));
|
|||
|
//SensPrintToDebugger(SENS_DEB, ("\t| Couldn't fire ISensOnNow->PowerEvent - "
|
|||
|
// "hr = 0x%x\n", hr));
|
|||
|
goto Cleanup;
|
|||
|
}
|
|||
|
SensPrint(SENS_INFO, (SENS_STRING("\t| ISensOnNow->PowerEvent() returned 0x%x\n"), hr));
|
|||
|
//SensPrintToDebugger(SENS_DEB, ("\t| ISensOnNow->PowerEvent() returned 0x%x\n", hr));
|
|||
|
|
|||
|
Cleanup:
|
|||
|
//
|
|||
|
// Cleanup
|
|||
|
//
|
|||
|
if (pISensOnNow)
|
|||
|
{
|
|||
|
pISensOnNow->Release();
|
|||
|
}
|
|||
|
|
|||
|
return hr;
|
|||
|
}
|