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;
|
||
}
|