#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