home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Shareware / Comunicatii / jyte / jyte.exe / netbios.py < prev    next >
Text File  |  2002-01-08  |  7KB  |  286 lines

  1. import win32wnet
  2. import struct
  3. import string
  4.  
  5. # Constants generated by h2py from nb30.h
  6. NCBNAMSZ = 16
  7. MAX_LANA = 254
  8. NAME_FLAGS_MASK = 0x87
  9. GROUP_NAME = 0x80
  10. UNIQUE_NAME = 0x00
  11. REGISTERING = 0x00
  12. REGISTERED = 0x04
  13. DEREGISTERED = 0x05
  14. DUPLICATE = 0x06
  15. DUPLICATE_DEREG = 0x07
  16. LISTEN_OUTSTANDING = 0x01
  17. CALL_PENDING = 0x02
  18. SESSION_ESTABLISHED = 0x03
  19. HANGUP_PENDING = 0x04
  20. HANGUP_COMPLETE = 0x05
  21. SESSION_ABORTED = 0x06
  22. ALL_TRANSPORTS = "M\0\0\0"
  23. MS_NBF = "MNBF"
  24. NCBCALL = 0x10
  25. NCBLISTEN = 0x11
  26. NCBHANGUP = 0x12
  27. NCBSEND = 0x14
  28. NCBRECV = 0x15
  29. NCBRECVANY = 0x16
  30. NCBCHAINSEND = 0x17
  31. NCBDGSEND = 0x20
  32. NCBDGRECV = 0x21
  33. NCBDGSENDBC = 0x22
  34. NCBDGRECVBC = 0x23
  35. NCBADDNAME = 0x30
  36. NCBDELNAME = 0x31
  37. NCBRESET = 0x32
  38. NCBASTAT = 0x33
  39. NCBSSTAT = 0x34
  40. NCBCANCEL = 0x35
  41. NCBADDGRNAME = 0x36
  42. NCBENUM = 0x37
  43. NCBUNLINK = 0x70
  44. NCBSENDNA = 0x71
  45. NCBCHAINSENDNA = 0x72
  46. NCBLANSTALERT = 0x73
  47. NCBACTION = 0x77
  48. NCBFINDNAME = 0x78
  49. NCBTRACE = 0x79
  50. ASYNCH = 0x80
  51. NRC_GOODRET = 0x00
  52. NRC_BUFLEN = 0x01
  53. NRC_ILLCMD = 0x03
  54. NRC_CMDTMO = 0x05
  55. NRC_INCOMP = 0x06
  56. NRC_BADDR = 0x07
  57. NRC_SNUMOUT = 0x08
  58. NRC_NORES = 0x09
  59. NRC_SCLOSED = 0x0a
  60. NRC_CMDCAN = 0x0b
  61. NRC_DUPNAME = 0x0d
  62. NRC_NAMTFUL = 0x0e
  63. NRC_ACTSES = 0x0f
  64. NRC_LOCTFUL = 0x11
  65. NRC_REMTFUL = 0x12
  66. NRC_ILLNN = 0x13
  67. NRC_NOCALL = 0x14
  68. NRC_NOWILD = 0x15
  69. NRC_INUSE = 0x16
  70. NRC_NAMERR = 0x17
  71. NRC_SABORT = 0x18
  72. NRC_NAMCONF = 0x19
  73. NRC_IFBUSY = 0x21
  74. NRC_TOOMANY = 0x22
  75. NRC_BRIDGE = 0x23
  76. NRC_CANOCCR = 0x24
  77. NRC_CANCEL = 0x26
  78. NRC_DUPENV = 0x30
  79. NRC_ENVNOTDEF = 0x34
  80. NRC_OSRESNOTAV = 0x35
  81. NRC_MAXAPPS = 0x36
  82. NRC_NOSAPS = 0x37
  83. NRC_NORESOURCES = 0x38
  84. NRC_INVADDRESS = 0x39
  85. NRC_INVDDID = 0x3B
  86. NRC_LOCKFAIL = 0x3C
  87. NRC_OPENERR = 0x3f
  88. NRC_SYSTEM = 0x40
  89. NRC_PENDING = 0xff
  90.  
  91.  
  92. UCHAR = "B"
  93. WORD = "H"
  94. DWORD = "I"
  95. USHORT = "H"
  96. ULONG = "I"
  97.  
  98. ADAPTER_STATUS_ITEMS = [
  99.     ("6s",        "adapter_address"),
  100.     (UCHAR,   "rev_major"),
  101.     (UCHAR,   "reserved0"),
  102.     (UCHAR,   "adapter_type"),
  103.     (UCHAR,   "rev_minor"),
  104.     (WORD,    "duration"),
  105.     (WORD,    "frmr_recv"),
  106.     (WORD,    "frmr_xmit"),
  107.  
  108.     (WORD,    "iframe_recv_err"),
  109.  
  110.     (WORD,    "xmit_aborts"),
  111.     (DWORD,   "xmit_success"),
  112.     (DWORD,   "recv_success"),
  113.  
  114.     (WORD,    "iframe_xmit_err"),
  115.  
  116.     (WORD,    "recv_buff_unavail"),
  117.     (WORD,    "t1_timeouts"),
  118.     (WORD,    "ti_timeouts"),
  119.     (DWORD,   "reserved1"),
  120.     (WORD,    "free_ncbs"),
  121.     (WORD,    "max_cfg_ncbs"),
  122.     (WORD,    "max_ncbs"),
  123.     (WORD,    "xmit_buf_unavail"),
  124.     (WORD,    "max_dgram_size"),
  125.     (WORD,    "pending_sess"),
  126.     (WORD,    "max_cfg_sess"),
  127.     (WORD,    "max_sess"),
  128.     (WORD,    "max_sess_pkt_size"),
  129.     (WORD,    "name_count"),
  130. ]
  131.  
  132. NAME_BUFFER_ITEMS = [
  133.     (str(NCBNAMSZ) + "s", "name"),
  134.     (UCHAR,   "name_num"),
  135.     (UCHAR,   "name_flags"),
  136. ]
  137.  
  138. SESSION_HEADER_ITEMS = [
  139.     (UCHAR,   "sess_name"),
  140.     (UCHAR,   "num_sess"),
  141.     (UCHAR,   "rcv_dg_outstanding"),
  142.     (UCHAR,   "rcv_any_outstanding"),
  143. ]
  144.  
  145. SESSION_BUFFER_ITEMS = [
  146.     (UCHAR,   "lsn"),
  147.     (UCHAR,   "state"),
  148.     (str(NCBNAMSZ)+"s",   "local_name"),
  149.     (str(NCBNAMSZ)+"s",   "remote_name"),
  150.     (UCHAR,   "rcvs_outstanding"),
  151.     (UCHAR,   "sends_outstanding"),
  152. ]
  153.  
  154. LANA_ENUM_ITEMS = [
  155.     ("B",   "length"),         # Number of valid entries in lana[]
  156.     (str(MAX_LANA+1) + "s", "lana"),
  157. ]
  158.  
  159. FIND_NAME_HEADER_ITEMS = [
  160.     (WORD,    "node_count"),
  161.     (UCHAR,   "reserved"),
  162.     (UCHAR,   "unique_group"),
  163. ]
  164.  
  165. FIND_NAME_BUFFER_ITEMS = [
  166.     (UCHAR,   "length"),
  167.     (UCHAR,   "access_control"),
  168.     (UCHAR,   "frame_control"),
  169.     ("6s"   "destination_addr"),
  170.     ("6s", "source_addr"), 
  171.     ("18s", "routing_info"),
  172. ]
  173.  
  174. ACTION_HEADER_ITEMS = [
  175.     (ULONG,   "transport_id"),
  176.     (USHORT,  "action_code"),
  177.     (USHORT,  "reserved"),
  178. ]
  179.     
  180. del UCHAR, WORD, DWORD, USHORT, ULONG
  181.  
  182. NCB = win32wnet.NCB
  183. def Netbios(ncb):
  184.     ob = ncb.Buffer
  185.     is_ours = hasattr(ob, "_pack")
  186.     if is_ours:
  187.         ob._pack()
  188.     try:
  189.         return win32wnet.Netbios(ncb)
  190.     finally:
  191.         if is_ours:
  192.             ob._unpack()
  193.         
  194. class NCBStruct:
  195.     def __init__(self, items):
  196.         self._format = string.join(map(lambda item: item[0], items), "")
  197.         self._items = items
  198.         self._buffer_ = win32wnet.NCBBuffer(struct.calcsize(self._format))
  199.  
  200.         for format, name in self._items:
  201.             if len(format)==1:
  202.                 if format == 'c':
  203.                     val = '\0'
  204.                 else:
  205.                     val = 0
  206.             else:
  207.                 l = int(format[:-1])
  208.                 val = '\0' * l
  209.             self.__dict__[name] = val
  210.  
  211.     def _pack(self):
  212.         vals = []
  213.         for format, name in self._items:
  214.             try:
  215.                 vals.append(self.__dict__[name])
  216.             except KeyError:
  217.                 vals.append(None)
  218.         
  219.         self._buffer_[:] = apply( struct.pack, (self._format,) + tuple(vals) )
  220.  
  221.     def _unpack(self):
  222.         items = struct.unpack(self._format, self._buffer_)
  223.         assert len(items)==len(self._items), "unexpected number of items to unpack!"
  224.         for (format, name), val in map(None, self._items, items):
  225.             self.__dict__[name] = val
  226.  
  227.     def __setattr__(self, attr, val):
  228.         if not self.__dict__.has_key(attr) and attr[0]!='_':
  229.             for format, attr_name in self._items:
  230.                 if attr==attr_name:
  231.                     break
  232.             else:
  233.                 raise AttributeError, attr
  234.         self.__dict__[attr] = val
  235.  
  236. def ADAPTER_STATUS():
  237.     return NCBStruct(ADAPTER_STATUS_ITEMS)
  238.  
  239. def NAME_BUFFER():
  240.     return NCBStruct(NAME_BUFFER_ITEMS)
  241.  
  242. def SESSION_HEADER():
  243.     return NCBStruct(SESSION_HEADER_ITEMS)
  244.  
  245. def SESSION_BUFFER():
  246.     return NCBStruct(SESSION_BUFFER_ITEMS)
  247.  
  248. def LANA_ENUM():
  249.     return NCBStruct(LANA_ENUM_ITEMS)
  250.  
  251. def FIND_NAME_HEADER():
  252.     return NCBStruct(FIND_NAME_HEADER_ITEMS)
  253.  
  254. def FIND_NAME_BUFFER():
  255.     return NCBStruct(FIND_NAME_BUFFER_ITEMS)
  256.  
  257. def ACTION_HEADER():
  258.     return NCBStruct(ACTION_HEADER_ITEMS)
  259.  
  260. if __name__=='__main__':
  261.     # code ported from "HOWTO: Get the MAC Address for an Ethernet Adapter"
  262.     # MS KB ID: Q118623 
  263.     ncb = NCB()
  264.     ncb.Command = NCBENUM
  265.     la_enum = LANA_ENUM()
  266.     ncb.Buffer = la_enum
  267.     rc = Netbios(ncb)
  268.     if rc != 0: raise RuntimeError, "Unexpected result %d" % (rc,)
  269.     for i in range(la_enum.length):
  270.         ncb.Reset()
  271.         ncb.Command = NCBRESET
  272.         ncb.Lana_num = ord(la_enum.lana[i])
  273.         rc = Netbios(ncb)
  274.         if rc != 0: raise RuntimeError, "Unexpected result %d" % (rc,)
  275.         ncb.Reset()
  276.         ncb.Command = NCBASTAT
  277.         ncb.Lana_num = ord(la_enum.lana[i])
  278.         ncb.Callname = "*               "
  279.         adapter = ADAPTER_STATUS()
  280.         ncb.Buffer = adapter
  281.         Netbios(ncb)
  282.         print "Adapter address:",
  283.         for ch in adapter.adapter_address:
  284.             print "%02x" % (ord(ch),) ,
  285.         print
  286.