Platform SDK: DLC/NetBIOS |
You can use the Netbios function to list all the NetBIOS names on a LANA. The following example uses a unique name as the name in the ncb_callname member of the NCB structure. This causes the adapter status to be treated as a remote call, which enables you to retrieve names added by other processes.
// Set LANANUM and LOCALNAME as appropriate for your system #define LANANUM 0 #define LOCALNAME "MAKEUNIQUE" #define NBCheck(x) if (NRC_GOODRET != x.ncb_retcode) { \ printf("Line %d: Got 0x%x from NetBios()\n", \ __LINE__, x.ncb_retcode); \ } void MakeNetbiosName (char *, LPCSTR); BOOL NBAddName (int, LPCSTR); BOOL NBReset (int, int, int); BOOL NBListNames (int, LPCSTR); BOOL NBAdapterStatus (int, PVOID, int, LPCSTR); void main () { if (!NBReset (LANANUM, 20, 30)) return; if (!NBAddName (LANANUM, LOCALNAME)) return; if (!NBListNames (LANANUM, LOCALNAME)) return; printf ("Succeeded.\n"); } BOOL NBReset (int nLana, int nSessions, int nNames) { NCB ncb; memset (&ncb, 0, sizeof (ncb)); ncb.ncb_command = NCBRESET; ncb.ncb_lsn = 0; // Allocate new lana_num resources ncb.ncb_lana_num = nLana; ncb.ncb_callname[0] = nSessions; // maximum sessions ncb.ncb_callname[2] = nNames; // maximum names Netbios (&ncb); NBCheck (ncb); return (NRC_GOODRET == ncb.ncb_retcode); } BOOL NBAddName (int nLana, LPCSTR szName) { NCB ncb; memset (&ncb, 0, sizeof (ncb)); ncb.ncb_command = NCBADDNAME; ncb.ncb_lana_num = nLana; MakeNetbiosName (ncb.ncb_name, szName); Netbios (&ncb); NBCheck (ncb); return (NRC_GOODRET == ncb.ncb_retcode); } // Build a name of length NCBNAMSZ, padding with spaces. void MakeNetbiosName (char *achDest, LPCSTR szSrc) { int cchSrc; cchSrc = lstrlen (szSrc); if (cchSrc > NCBNAMSZ) cchSrc = NCBNAMSZ; memset (achDest, ' ', NCBNAMSZ); memcpy (achDest, szSrc, cchSrc); } BOOL NBListNames (int nLana, LPCSTR szName) { int cbBuffer; ADAPTER_STATUS *pStatus; NAME_BUFFER *pNames; int i; HANDLE hHeap; hHeap = GetProcessHeap(); // Allocate the largest buffer that might be needed. cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER); pStatus = (ADAPTER_STATUS *) HeapAlloc (hHeap, 0, cbBuffer); if (NULL == pStatus) return FALSE; if (!NBAdapterStatus (nLana, (PVOID) pStatus, cbBuffer, szName)) { HeapFree (hHeap, 0, pStatus); return FALSE; } // The list of names follows the adapter status structure. pNames = (NAME_BUFFER *) (pStatus + 1); for (i = 0; i < pStatus->name_count; i++) printf ("\t%.*s\n", NCBNAMSZ, pNames[i].name); HeapFree (hHeap, 0, pStatus); return TRUE; } BOOL NBAdapterStatus (int nLana, PVOID pBuffer, int cbBuffer, LPCSTR szName) { NCB ncb; memset (&ncb, 0, sizeof (ncb)); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = nLana; ncb.ncb_buffer = (PUCHAR) pBuffer; ncb.ncb_length = cbBuffer; MakeNetbiosName (ncb.ncb_callname, szName); Netbios (&ncb); NBCheck (ncb); return (NRC_GOODRET == ncb.ncb_retcode); }