why does Querying Network Location Awareness (NLA) from windows 11 returns unmanaged network

Namburi Nagaraju (nnagaraj) 0 Reputation points
2023-05-07T16:24:46.86+00:00

why does Querying Network Location Awareness (NLA) in windows 11 machine returns NLA_UN_MANAGED __NETWROK?

When i run same piece of code on win 10 machine in the same domain it returns as NLA__MANAGED __NETWROK?

#include <winsock2.h>

#include <mswsock.h>

#include <stdio.h>


#pragma comment(lib, "ws2_32.lib")

int main(int argc, char** argv)

{

    WSADATA        wsd;

    int                    Ret;

    char                buff[16384];

    int                   Err;

    DWORD        BufferSize;

    WSAQUERYSET* qs = NULL;

    GUID           NLANameSpaceGUID = NLA_SERVICE_CLASS_GUID;

    HANDLE         hNLA;

    WSAEVENT       Event;

    PNLA_BLOB                     pNLA;

    DWORD BytesReturned;

    WSACOMPLETION WSAComplete;

    WSAOVERLAPPED WSAOverlap;

    DWORD     Offset = 0;



    // Load Winsock

    if ((WSAStartup(MAKEWORD(2, 2), &wsd)) != 0)

    {

        printf("WSAStartup() failed with error code %d\n", WSAGetLastError());

        return -1;

    }

    else

        printf("WSAStartup() should be OK!\n");



    // Initialize the WSAQUERYSET structure for the query

    qs = (WSAQUERYSET*)buff;

    memset(qs, 0, sizeof(*qs));

    // Required values

    qs->dwSize = sizeof(WSAQUERYSET);

    qs->dwNameSpace = NS_NLA;

    qs->lpServiceClassId = &NLANameSpaceGUID;

    // Optional values

    qs->dwNumberOfProtocols = 0;

    qs->lpszServiceInstanceName = NULL;

    qs->lpVersion = NULL;

    qs->lpNSProviderId = NULL;

    qs->lpszContext = NULL;

    qs->lpafpProtocols = NULL;

    qs->lpszQueryString = NULL;

    qs->lpBlob = NULL;



    if (WSALookupServiceBegin(qs, LUP_RETURN_ALL | LUP_DEEP, &hNLA) == SOCKET_ERROR)

    {

        printf("WSALookupServiceBegin() failed with error %d\n", WSAGetLastError());

        return -1;

    }

    else

        printf("WSALookupServiceBegin() should be OK!\n");



    if ((Event = WSACreateEvent()) == WSA_INVALID_EVENT)

    {

        printf("WSACreateEvent() failed with error code %d\n", WSAGetLastError());

        return -1;

    }

    else

        printf("WSACreateEvent() should be fine!\n");



    while (1)

    {

        printf("Querying for Networks...\n");

        while (1)

        {

            memset(qs, 0, sizeof(*qs));

            BufferSize = sizeof(buff);



            if (WSALookupServiceNext(hNLA, LUP_RETURN_ALL, &BufferSize, qs) == SOCKET_ERROR)

            {

                Err = WSAGetLastError();

                if (Err == WSA_E_NO_MORE)

                {

                    // There is no more data. Stop asking

                    printf("No more data, exit...\n");

                    break;

                }

                printf("WSALookupServiceNext failed with error %d\n", WSAGetLastError());

                WSALookupServiceEnd(hNLA);

                return -1;

            }

            printf("\nNetwork Name: %s\n", qs->lpszServiceInstanceName);

            printf("Comment (if any): %s\n", qs->lpszComment);



            if (qs->lpBlob != NULL)

            {

                // Cycle through BLOB data list

                do

                {

                    pNLA = (PNLA_BLOB) & (qs->lpBlob->pBlobData[Offset]);

                    switch (pNLA->header.type)

                    {

                    case NLA_RAW_DATA:

                        printf("\tNLA Data Type: NLA_RAW_DATA\n");

                        break;

                    case NLA_INTERFACE:

                        printf("\tNLA Data Type: NLA_INTERFACE\n");

                        printf("\t\tType: %d\n", pNLA->data.interfaceData.dwType);

                        printf("\t\tSpeed: %d\n", pNLA->data.interfaceData.dwSpeed);

                        printf("\t\tAdapter Name: %s\n", pNLA->data.interfaceData.adapterName);

                        break;

                    case NLA_802_1X_LOCATION:

                        printf("\tNLA Data Type: NLA_802_1X_LOCATION\n");

                        printf("\t\tInformation: %s\n", pNLA->data.locationData.information);

                        break;

                    case NLA_CONNECTIVITY:

                        printf("\tNLA Data Type: NLA_CONNECTIVITY\n");

                        switch (pNLA->data.connectivity.type)

                        {

                        case NLA_NETWORK_AD_HOC:

                            printf("\t\tNetwork Type: AD HOC\n");

                            break;

                        case NLA_NETWORK_MANAGED:

                            printf("\t\tNetwork Type: Managed\n");

                            break;

                        case NLA_NETWORK_UNMANAGED:

                            printf("\t\tNetwork Type: Unmanaged\n");

                            break;

                        case NLA_NETWORK_UNKNOWN:

                            printf("\t\tNetwork Type: Unknown\n");

                        }

                        switch (pNLA->data.connectivity.internet)

                        {

                        case NLA_INTERNET_NO:

                            printf("\t\tInternet connectivity: No\n");

                            break;

                        case NLA_INTERNET_YES:

                            printf("\t\tInternet connectivity: Yes\n");

                            break;

                        case NLA_INTERNET_UNKNOWN:

                            printf("\t\tInternet connectivity: Unknown\n");

                            break;

                        }

                        break;

                    case NLA_ICS:

                        printf("\tNLA Data Type: NLA_ICS\n");

                        printf("\t\tSpeed: %d\n", pNLA->data.ICS.remote.speed);

                        printf("\t\tType: %d\n", pNLA->data.ICS.remote.type);

                        printf("\t\tState: %d\n", pNLA->data.ICS.remote.state);

                        printf("\t\tMachine Name: %S\n", pNLA->data.ICS.remote.machineName);

                        printf("\t\tShared Adapter Name: %S\n", pNLA->data.ICS.remote.sharedAdapterName);

                        break;

                    default:

                        printf("\tNLA Data Type: Unknown to this program\n");

                        break;

                    }

                    Offset = pNLA->header.nextOffset;

                }

                while (Offset != 0);

            }

        }

        printf("\nFinished query, Now wait for change notification...\n");



        WSAOverlap.hEvent = Event;

        WSAComplete.Type = NSP_NOTIFY_EVENT;

        WSAComplete.Parameters.Event.lpOverlapped = &WSAOverlap;



        if (WSANSPIoctl(hNLA, SIO_NSP_NOTIFY_CHANGE, NULL, 0, NULL, 0,

            &BytesReturned, &WSAComplete) == SOCKET_ERROR)

        {

            Ret = WSAGetLastError();

            if (Ret != WSA_IO_PENDING)

            {

                printf("WSANSPIoctrl() failed with error code %d\n", Ret);

                return -1;

            }

        }

        else

            printf("WSANSPIoctl() should be OK!\n");

        if (WSAWaitForMultipleEvents(1, &Event, TRUE, WSA_INFINITE, FALSE) == WSA_WAIT_FAILED)

        {

            printf("WSAWaitForMultipleEvents() failed with error code %d\n", WSAGetLastError());

            return -1;

        }

        else

            printf("WSAWaitForMultipleEvents() is OK!\n");



        if (WSAResetEvent(Event) == TRUE)

            printf("WSAResetEvent() is OK!\n");

        else

            printf("WSAResetEvent() failed with error code %d\n", WSAGetLastError());

    }



    if (WSALookupServiceEnd(hNLA) == 0)

        printf("WSALookupServiceEnd() is OK!\n");

    else

        printf("WSALookupServiceEnd() failed with error code %d\n", WSAGetLastError());

    if (WSACleanup() == 0)

        printf("WSACleanup() is OK!\n");

    else

        printf("WSACleanup() failed with error code %d\n", WSAGetLastError());

}
Windows 10
Windows 10
A Microsoft operating system that runs on personal computers and tablets.
10,617 questions
Windows Network
Windows Network
Windows: A family of Microsoft operating systems that run across personal computers, tablets, laptops, phones, internet of things devices, self-contained mixed reality headsets, large collaboration screens, and other devices.Network: A group of devices that communicate either wirelessly or via a physical connection.
648 questions
Windows 11
Windows 11
A Microsoft operating system designed for productivity, creativity, and ease of use.
8,163 questions
0 comments No comments
{count} votes

1 answer

Sort by: Most helpful
  1. Anonymous
    2023-12-25T06:49:36.4366667+00:00

    Hello,

    Thank you for posting in Q&A forum.

    The observation difference of NLA might be due to differences in the configuration or network settings between the Win10 machine and the Win11 machine.

    NLA is responsible for identifying the network location and type, and the result can be affected by various factors, including network configurations, domain policies, and network connection properties.

    Here are some factors to check:

    1. Check your network Profile difference:
    2. Check if they are applied with same Group Policy:
    3. Check if there's any security/antivirus software affecting the NLA performance. You can also try to boot two machines in "Clean Boot" state to further exclude this factor.
    4. Check firewall settings and "Network Discovery and Sharing":

    Hope this answer help you well.

    0 comments No comments