Article ID: 124960
Article Last Modified on 7/1/2004
/* The following makefile may be used to build this sample:
!include <ntwin32.mak>
PROJ = test.exe
DEPS = test.obj
LIBS_EXT = netapi32.lib
.c.obj:
$(cc) /YX $(cdebug) $(cflags) $(cvars) $<
$(PROJ) : $(DEPS)
$(link) @<<
$**
-out:$@
$(conlibs)
$(conlflags)
$(ldebug)
$(LIBS_EXT)
<<
*/
#include <windows.h>
#include <stdio.h>
#include <string.h>
/*
* LANANUM and LOCALNAME should be set 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 *achDest, LPCSTR szSrc);
BOOL NBAddName (int nLana, LPCSTR szName);
BOOL NBReset (int nLana, int nSessions, int nNames);
BOOL NBListNames (int nLana, LPCSTR szName);
BOOL NBAdapterStatus (int nLana, PVOID pBuffer, int cbBuffer,
LPCSTR szName);
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; /* max sessions */
ncb.ncb_callname[2] = nNames; /* max 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);
}
/*
* MakeNetbiosName - Builds a name padded with spaces up to
* the length of a NetBIOS name (NCBNAMSZ).
*/
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;
// Allocate the largest buffer we might need
cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER);
pStatus = (ADAPTER_STATUS *) HeapAlloc (GetProcessHeap (), 0,
cbBuffer);
if (NULL == pStatus)
return FALSE;
if (!NBAdapterStatus (nLana, (PVOID) pStatus, cbBuffer, szName))
{
HeapFree (GetProcessHeap (), 0, pStatus);
return FALSE;
}
// The list of names immediately 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 (GetProcessHeap (), 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);
}
Keywords: kbapi kbnetbios kbnetwork KB124960