В этом шаге мы получим все имена связанные с конкретным числом LANA.
Первое, что мы сделаем это объявим константы:
#define LANANUM 000 // Адрес LANA #define LOCALNAME "MYNET" // Моё имя #define MAX_SESSION 20 // Максимальное количество имен #define MAX_NAMES 30
Инициализируем NetBios по конкретному LANA используя команду NCBRESET:
NCB ncb; UCHAR uRetCode; memset (&ncb, 0, sizeof (ncb)); //---------- Установка параметров ncb.ncb_command = NCBRESET; ncb.ncb_lsn = 0; ncb.ncb_lana_num = LANANUM; ncb.ncb_callname[0] = MAX_SESSION; ncb.ncb_callname[2] = MAX_NAMES; //-------------- Вызов и проверка uRetCode = Netbios((NCB*) &ncb ); if ( uRetCode != 0 ) { cout << "error NCBRESET " << endl; exit(1); }
Следующим шагом надо добавить имя, только для начала его нужно сформировать учитывая правила NetBios. Сформированное имя необходимо поместить в переменную ncb_name структуры NCB:
int i_strlen; NCB ncb1; memset(&ncb1, 0, sizeof (ncb1)); //---------------Создаем имя ---------------------- i_strlen = strlen(LOCALNAME); if (i_strlen > NCBNAMSZ) i_strlen = NCBNAMSZ; memset (ncb1.ncb_name, ' ', NCBNAMSZ); memcpy (ncb1.ncb_name, LOCALNAME, i_strlen); //--------- NetBios пораметры и запуск ------- ncb1.ncb_command = NCBADDNAME; ncb1.ncb_lana_num = LANANUM; uRetCode = Netbios((NCB*) &ncb1 ); if ( uRetCode != 0 ) { cout << "error NCBADDNAME " << endl; exit(1); }
Теперь мы можем воспользоваться командой NCBASTAT для получения информации в массив ADAPTER_STATUS откуда извлекаем их используя массив NAME_BUFFER. В ncb_callname необходимо имя дистанционного приложения. Мы его сначала добавили, а потом использовали для получения статуса адаптера.
NCB ncb2; ADAPTER_STATUS *pStatus; memset (&ncb2, 0, sizeof (ncb2)); HANDLE hHeap; int cbBuffer; hHeap = GetProcessHeap(); cbBuffer = sizeof (ADAPTER_STATUS) + 255 * sizeof (NAME_BUFFER); pStatus = (ADAPTER_STATUS *) HeapAlloc (hHeap, 0, cbBuffer); //--------------- memset (ncb2.ncb_callname, ' ', NCBNAMSZ); memcpy (ncb2.ncb_callname, LOCALNAME, i_strlen); //--------------- ncb2.ncb_command = NCBASTAT; ncb2.ncb_lana_num = LANANUM; ncb2.ncb_buffer = (PUCHAR) pStatus; ncb2.ncb_length = cbBuffer; uRetCode = Netbios((NCB*) &ncb2 ); if ( uRetCode != 0 ) { cout << "error NCBASTAT " << endl; exit(1); } // ---- Все нормально NAME_BUFFER *pNames; pNames = (NAME_BUFFER *) (pStatus + 1); for (int i = 0; i < pStatus->name_count; i++) printf ("\t%.*s\n", NCBNAMSZ, pNames[i].name);
В результате работы программы на экране должно быть что-то типа этого, как ниже:
Если Вы не сможете сами, то загрузите проект. Мне пришлось всё это скомкать вместе из-за того, что nbstat я почему-то не нашел, но в следуюших шагах я постараюсь разделить этот проект на более понятные части.