免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2160 | 回复: 1
打印 上一主题 下一主题

python+ctypes枚举windows设备为XML树 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-13 20:53 |只看该作者 |倒序浏览
python+ctypes枚举windows设备为XML树
  1. from ctypes import *
  2. cfg = windll.cfgmgr32


  3. RERVALS = {
  4.          0x00000000:"CR_SUCCESS",
  5.          0x00000001:"CR_DEFAULT",
  6.          0x00000002:"CR_OUT_OF_MEMORY",
  7.          0x00000003:"CR_INVALID_POINTER",
  8.          0x00000004:"CR_INVALID_FLAG",
  9.          0x00000005:"CR_INVALID_DEVNODE",
  10.          0x00000006:"CR_INVALID_RES_DES",
  11.          0x00000007:"CR_INVALID_LOG_CONF",
  12.          0x00000008:"CR_INVALID_ARBITRATOR",
  13.          0x00000009:"CR_INVALID_NODELIST",
  14.          0x0000000A:"CR_DEVNODE_HAS_REQS",
  15.          0x0000000B:"CR_INVALID_RESOURCEID",
  16.          0x0000000C:"CR_DLVXD_NOT_FOUND",   
  17.          0x0000000D:"CR_NO_SUCH_DEVNODE",
  18.          0x0000000E:"CR_NO_MORE_LOG_CONF",
  19.          0x0000000F:"CR_NO_MORE_RES_DES",
  20.          0x00000010:"CR_ALREADY_SUCH_DEVNODE",
  21.          0x00000011:"CR_INVALID_RANGE_LIST",
  22.          0x00000012:"CR_INVALID_RANGE",
  23.          0x00000013:"CR_FAILURE",
  24.          0x00000014:"CR_NO_SUCH_LOGICAL_DEV",
  25.          0x00000015:"CR_CREATE_BLOCKED",
  26.          0x00000016:"CR_NOT_SYSTEM_VM",   
  27.          0x00000017:"CR_REMOVE_VETOED",
  28.          0x00000018:"CR_APM_VETOED",
  29.          0x00000019:"CR_INVALID_LOAD_TYPE",
  30.          0x0000001A:"CR_BUFFER_SMALL",
  31.          0x0000001B:"CR_NO_ARBITRATOR",
  32.          0x0000001C:"CR_NO_REGISTRY_HANDLE",
  33.          0x0000001D:"CR_REGISTRY_ERROR",
  34.          0x0000001E:"CR_INVALID_DEVICE_ID",
  35.          0x0000001F:"CR_INVALID_DATA",
  36.          0x00000020:"CR_INVALID_API",
  37.          0x00000021:"CR_DEVLOADER_NOT_READY",
  38.          0x00000022:"CR_NEED_RESTART",
  39.          0x00000023:"CR_NO_MORE_HW_PROFILES",
  40.          0x00000024:"CR_DEVICE_NOT_THERE",
  41.          0x00000025:"CR_NO_SUCH_VALUE",
  42.          0x00000026:"CR_WRONG_TYPE",
  43.          0x00000027:"CR_INVALID_PRIORITY",
  44.          0x00000028:"CR_NOT_DISABLEABLE",
  45.          0x00000029:"CR_FREE_RESOURCES",
  46.          0x0000002A:"CR_QUERY_VETOED",
  47.          0x0000002B:"CR_CANT_SHARE_IRQ",
  48.          0x0000002C:"CR_NO_DEPENDENT",
  49.          0x0000002D:"CR_SAME_RESOURCES",
  50.          0x0000002E:"CR_NO_SUCH_REGISTRY_KEY",
  51.          0x0000002F:"CR_INVALID_MACHINENAME",   
  52.          0x00000030:"CR_REMOTE_COMM_FAILURE",   
  53.          0x00000031:"CR_MACHINE_UNAVAILABLE",   
  54.          0x00000032:"CR_NO_CM_SERVICES",   
  55.          0x00000033:"CR_ACCESS_DENIED",   
  56.          0x00000034:"CR_CALL_NOT_IMPLEMENTED",
  57.          0x00000035:"CR_INVALID_PROPERTY",
  58.          0x00000036:"CR_DEVICE_INTERFACE_ACTIVE",
  59.          0x00000037:"CR_NO_SUCH_DEVICE_INTERFACE",
  60.          0x00000038:"CR_INVALID_REFERENCE_STRING",
  61.          0x00000039:"CR_INVALID_CONFLICT_LIST",
  62.          0x0000003A:"CR_INVALID_INDEX",
  63.          0x0000003B:"CR_INVALID_STRUCTURE_SIZE",
  64.          0x0000003C:"NUM_CR_RESULTS"
  65.      }


  66. CM_DRP_DEVICEDESC = 1
  67. CM_DRP_DRIVER = 0x0000A
  68. NULL = 0


  69. def get_dev_desc(devInst):
  70.      buf = (c_wchar*1024)()
  71.      blen = c_int(1024)
  72.      cr = cfg.CM_Get_DevNode_Registry_PropertyW(devInst, CM_DRP_DEVICEDESC, NULL, buf, byref(blen), 0)
  73.      if cr == 0:
  74.          return buf.value
  75.      else:
  76.          return "ERR(%d):%s"%(devInst, RERVALS[cr])


  77. def get_dev_id(devInst):
  78.      buf = (c_wchar*1024)()
  79.      blen = c_int(1024)
  80.      cr = cfg.CM_Get_Device_IDW(devInst, buf, byref(blen), 0)
  81.      if cr == 0:
  82.          return buf.value
  83.      else:
  84.          return "ERR(%d):%s"%(devInst, RERVALS[cr])


  85. drivers = []
  86. def get_dev_driver(devInst):
  87.      global drivers
  88.      buf = (c_wchar*1024)()
  89.      blen = c_int(1024)
  90.      cr = cfg.CM_Get_DevNode_Registry_PropertyW(devInst, CM_DRP_DRIVER, NULL, buf, byref(blen), 0);
  91.      if cr == 0:
  92.          drivers.append(buf.value)
  93.          return buf.value
  94.      else:
  95.          return "ERR(%d):%s"%(devInst, RERVALS[cr])


  96. from xml.dom.minidom import *
  97. def dev_xml():
  98.      def dev_child(devInst, tree, lev, dom):
  99.          devParent = c_int(devInst)
  100.          devChild = c_int(0)
  101.          devNextChild = c_int(0)
  102.          if cfg.CM_Get_Child(byref(devChild), devParent, 0) == 0:
  103.              desc = get_dev_desc(devChild.value)
  104.              devId = get_dev_id(devChild.value)
  105.              driver = get_dev_driver(devChild.value)
  106.              node = dom.createElement("Device")
  107.              node.setAttribute("DevInst", str(devChild.value))
  108.              node.setAttribute("Desc", desc)
  109.              node.setAttribute("Lev", str(lev))
  110.              node.setAttribute("DevId", devId)
  111.              node.setAttribute("Driver", driver)
  112.              tree.appendChild(node)
  113.              dev_child(devChild.value, node, lev + 1, dom)
  114.              while cfg.CM_Get_Sibling(byref(devNextChild), devChild, 0) == 0:
  115.                  devChild.value = devNextChild.value
  116.                  desc = get_dev_desc(devChild.value)
  117.                  devId = get_dev_id(devChild.value)
  118.                  driver = get_dev_driver(devChild.value)
  119.                  node = dom.createElement("Device")
  120.                  node.setAttribute("DevInst", str(devChild.value))
  121.                  node.setAttribute("Desc", desc)
  122.                  node.setAttribute("Lev", str(lev))
  123.                  node.setAttribute("DevId", devId)
  124.                  node.setAttribute("Driver", driver)
  125.                  tree.appendChild(node)
  126.                  dev_child(devChild.value, node, lev + 1, dom)


  127.     dom = Document()
  128.      dom.appendChild(dom.createElement("DeviceTree"))
  129.      devInst = c_int(0)
  130.      devInstNext = c_int(0)
  131.      lev = 0
  132.      if 0 == cfg.CM_Locate_DevNodeW(byref(devInst), 0, 0):
  133.          desc = get_dev_desc(devInst.value)
  134.          devId = get_dev_id(devInst.value)
  135.          driver = get_dev_driver(devInst.value)
  136.          node = dom.createElement("Device")
  137.          node.setAttribute("DevInst", str(devInst.value))
  138.          node.setAttribute("Desc", desc)
  139.          node.setAttribute("Lev", str(lev))
  140.          node.setAttribute("DevId", devId)
  141.          node.setAttribute("Driver", driver)
  142.          dom.documentElement.appendChild(node)
  143.          while 0 == cfg.CM_Get_Sibling(byref(devInstNext), devInst, 0):
  144.              devInst.value = devInstNext.value
  145.              desc = get_dev_desc(devInst.value)
  146.              devId = get_dev_id(devInst.value)
  147.              driver = get_dev_driver(devInst.value)
  148.              node = dom.createElement("Device")
  149.              node.setAttribute("DevInst", str(devInst.value))
  150.              node.setAttribute("Desc", desc)
  151.              node.setAttribute("Lev", str(lev))
  152.              node.setAttribute("DevId", devId)
  153.              node.setAttribute("Driver", driver)
  154.              dom.documentElement.appendChild(node)
  155.      for child in dom.documentElement.childNodes:
  156.          k = int(child.getAttribute("DevInst"))
  157.          dev_child(k, child, lev + 1, dom)
  158.      return dom.toprettyxml()
  159. import time
  160. st = time.time()
  161. xml = dev_xml()
  162. et = time.time()
  163. print("use time:", et - st)
  164. open("D:\\DeviceTree.xml", "wb").write(xml.encode("utf8"))
  165. #print(xml)
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-21 22:06 |只看该作者
谢谢分享  希望于楼主多多交流
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP