Получения списка имён NETBIOS по IP-адресу

Использование Native API для получения списка имён NETBIOS по IP




Все устройства, которые программно создаются драйвером NetBt (также известным как NBT или Netbios over Tcpip), перечислены в разделе HKLM\System\CurrentControlSet\Services\NetBt\Linkage в параметре Export. Этот параметр имеет тип REG_MULTI_SZ и имена отдельных устройств в нём разделены нулевым символом, а в конце — два нулевых символа. Будем считать, что hNetBt — это открытый хэндл на любое из приведённых там устройств. Код открытия полностью аналогичен приведённому.

Для получения списка имён NETBIOS по IP-адресу необходимо выполнить следующий код (см. nb30.h).

 //ULONG ReversedRemoteAddress — IP-адрес подопытного компьютера

 #define IOCTL_NETBT_GETNAMES _TDI_CONTROL_CODE( 43, METHOD_OUT_DIRECT) //0x2100AE

 IO_STATUS_BLOCK iosb;

 struct {
   ADAPTER_STATUS status;
   NAME_BUFFER names[30];
 } outdata;

 struct {
   TDI_REQUEST Request;
   DWORD a, b, c, d;
 } indata;

 indata.Request.Handle.AddressHandle = (void *) ReversedRemoteAddress;
 indata.Request.RequestNotifyObject = (void *)1;
 indata.Request.RequestContext = (void *) 0x110012;
 indata.Request.TdiStatus = 0x2a0000;
 indata.a = 0;
 indata.b = 0;
 indata.c = 0;
 indata.d = 0;

 NTSTATUS ns = ZwDeviceIoControlFile (hNetBt, NULL, NULL, NULL, &iosb,
  IOCTL_NETBT_GETNAMES, &indata, sizeof indata, &outdata, sizeof outdata);

 if (ns == STATUS_PENDING)
 {
 //ожидание на hNetBt
 //в nbtstat.exe оно выполняется как ZwWaitForSingleObject(hNetBt, TRUE, NULL)
 }


Автор: Сергей Васкецов
Дата: 03.02.2003


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.