118 lines
3.1 KiB
C
118 lines
3.1 KiB
C
|
#include "precomp.h"
|
||
|
#include "nlasvc.h"
|
||
|
#include "nlanotif.h"
|
||
|
|
||
|
CRITICAL_SECTION gNLA_LPC_CS;
|
||
|
HANDLE ghNLA_LPC_Port = NULL;
|
||
|
|
||
|
HANDLE
|
||
|
NLAConnectLPC()
|
||
|
{
|
||
|
// Connect via LPC to the Winsock Mobility system service.
|
||
|
HANDLE h = NULL;
|
||
|
SECURITY_QUALITY_OF_SERVICE DynamicQoS =
|
||
|
{
|
||
|
sizeof(SECURITY_QUALITY_OF_SERVICE),
|
||
|
SecurityAnonymous,
|
||
|
SECURITY_DYNAMIC_TRACKING,
|
||
|
FALSE
|
||
|
};
|
||
|
WSM_LPC_DATA data;
|
||
|
ULONG dataLength = sizeof(data);
|
||
|
UNICODE_STRING portName;
|
||
|
DWORD retCode;
|
||
|
|
||
|
DhcpPrint((DEBUG_TRACK, "Entering NLAConnectLPC.\n"));
|
||
|
|
||
|
RtlZeroMemory(&data, sizeof(data));
|
||
|
data.signature = WSM_SIGNATURE;
|
||
|
data.connect.version.major = WSM_VERSION_MAJOR;
|
||
|
data.connect.version.minor = WSM_VERSION_MINOR;
|
||
|
|
||
|
RtlInitUnicodeString(&portName, WSM_PRIVATE_PORT_NAME);
|
||
|
|
||
|
retCode = NtConnectPort(
|
||
|
&h,
|
||
|
&portName,
|
||
|
&DynamicQoS,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
&data, &dataLength);
|
||
|
|
||
|
if ( retCode != STATUS_SUCCESS)
|
||
|
{
|
||
|
DhcpPrint((DEBUG_TRACK, "NtConnectPort failed with errCode 0x%08x.\n", retCode));
|
||
|
|
||
|
if (h != NULL)
|
||
|
{
|
||
|
CloseHandle(h);
|
||
|
h = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DhcpPrint((DEBUG_TRACK, "Exiting NLAConnectLPC.\n"));
|
||
|
|
||
|
return (h);
|
||
|
|
||
|
} // NLAConnectLPC
|
||
|
|
||
|
void
|
||
|
NLANotifyDHCPChange()
|
||
|
{
|
||
|
WSM_LPC_MESSAGE message;
|
||
|
DWORD retCode;
|
||
|
|
||
|
DhcpPrint((DEBUG_TRACK, "Entering NLANotifyDHCPChange.\n"));
|
||
|
|
||
|
EnterCriticalSection(&gNLA_LPC_CS);
|
||
|
|
||
|
// Connect to the NLA service if necessary.
|
||
|
if (ghNLA_LPC_Port == NULL)
|
||
|
{
|
||
|
if ((ghNLA_LPC_Port = NLAConnectLPC()) == NULL)
|
||
|
{
|
||
|
LeaveCriticalSection(&gNLA_LPC_CS);
|
||
|
|
||
|
DhcpPrint((DEBUG_TRACK, "Exiting NLANotifyDHCPChange as 1st call to NLAConnectLPC() failed.\n"));
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Send change notification to the NLA service.
|
||
|
RtlZeroMemory(&message, sizeof(message));
|
||
|
message.portMsg.u1.s1.TotalLength = sizeof(message);
|
||
|
message.portMsg.u1.s1.DataLength = sizeof(message.data);
|
||
|
message.data.signature = WSM_SIGNATURE;
|
||
|
message.data.request.type = DHCP_NOTIFY_CHANGE; //WSM_LPC_REQUEST::DHCP_NOTIFY_CHANGE;
|
||
|
|
||
|
retCode = NtRequestPort(ghNLA_LPC_Port, (PPORT_MESSAGE)&message);
|
||
|
if (retCode != STATUS_SUCCESS)
|
||
|
{
|
||
|
DhcpPrint((DEBUG_TRACK, "NLANotifyDHCPChange: NtRequestPort failed with errCode 0x%08x.\n", retCode));
|
||
|
|
||
|
// It's possible the service was stopped and restarted.
|
||
|
// Ditch the old LPC connection.
|
||
|
CloseHandle(ghNLA_LPC_Port);
|
||
|
|
||
|
// Create a new LPC connection.
|
||
|
if ((ghNLA_LPC_Port = NLAConnectLPC()) == NULL)
|
||
|
{
|
||
|
LeaveCriticalSection(&gNLA_LPC_CS);
|
||
|
|
||
|
DhcpPrint((DEBUG_TRACK, "Exiting NLANotifyDHCPChange as 2nd call to NLAConnectLPC() failed.\n"));
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Try the notification one last time.
|
||
|
NtRequestPort(ghNLA_LPC_Port, (PPORT_MESSAGE)&message);
|
||
|
}
|
||
|
|
||
|
LeaveCriticalSection(&gNLA_LPC_CS);
|
||
|
|
||
|
DhcpPrint((DEBUG_TRACK, "Exiting NLANotifyDHCPChange.\n"));
|
||
|
|
||
|
} // NLANotifyDHCPChange
|