2011-04-20 05:58:03 +08:00
|
|
|
"""
|
|
|
|
Work with NT Object tree manager
|
|
|
|
|
|
|
|
getType(p)
|
|
|
|
Return object type address by object address
|
|
|
|
|
|
|
|
getObjectNameInfo(p)
|
|
|
|
Return typedVar of nt!_OBJECT_HEADER_NAME_INFO or None
|
|
|
|
|
|
|
|
getObjectName(p)
|
|
|
|
Return string of object name. If can not get name - empty string
|
|
|
|
|
|
|
|
buildObjectName(p)
|
|
|
|
Return string of full object name. If can not get name - empty string
|
|
|
|
|
2011-06-09 00:29:33 +08:00
|
|
|
getListByHandleTable(tableHandles=None, objTypeAddr=0, containHeaders=True)
|
2011-04-20 05:58:03 +08:00
|
|
|
Return list of objects from table of handles
|
2011-06-09 00:29:33 +08:00
|
|
|
|
|
|
|
getListByDirectoryObject(p, objTypeAddr=0)
|
|
|
|
Return list of objects from object directory
|
|
|
|
|
|
|
|
getObjectByName(name, caseSensitive=False)
|
|
|
|
Return address of object by full name. If error (f.e. not exist) - None
|
|
|
|
|
|
|
|
"""
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
from pykd import *
|
|
|
|
|
2012-10-02 18:40:38 +08:00
|
|
|
nt = module("nt")
|
2011-04-20 05:58:03 +08:00
|
|
|
|
2013-02-14 00:28:33 +08:00
|
|
|
# optimization
|
|
|
|
OBJECT_HEADER = nt.type("_OBJECT_HEADER")
|
|
|
|
HANDLE_TABLE_ENTRY = nt.type("_HANDLE_TABLE_ENTRY")
|
|
|
|
OBJECT_DIRECTORY_ENTRY = nt.type("_OBJECT_DIRECTORY_ENTRY")
|
|
|
|
OBJECT_HEADER_NAME_INFO = nt.type("_OBJECT_HEADER_NAME_INFO")
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-12-23 19:10:08 +08:00
|
|
|
def getTypeWin7(p):
|
|
|
|
"""
|
|
|
|
Get object header by object pointer
|
|
|
|
Implementation for Win7+
|
|
|
|
"""
|
2013-02-14 00:28:33 +08:00
|
|
|
objHeader = containingRecord(p, OBJECT_HEADER, "Body")
|
2012-05-31 21:13:54 +08:00
|
|
|
tableTypeIndex = nt.ObTypeIndexTable
|
|
|
|
return ptrPtr(tableTypeIndex + (ptrSize() * objHeader.TypeIndex))
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
def getTypeLegacy(p):
|
|
|
|
"""
|
|
|
|
Get object header by object pointer
|
|
|
|
Implementation for before Win7
|
|
|
|
"""
|
2013-02-14 00:28:33 +08:00
|
|
|
objHeader = containingRecord(p, OBJECT_HEADER, "Body")
|
2011-04-20 05:58:03 +08:00
|
|
|
return objHeader.Type
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
# Select platform-specific function for getting object header
|
2011-04-20 05:58:03 +08:00
|
|
|
# Select key body type: nt!CmpKeyObjectType or nt!CmKeyObjectType
|
2012-05-31 21:13:54 +08:00
|
|
|
if (ptrWord( nt.NtBuildNumber ) >= 7600):
|
2010-12-23 19:10:08 +08:00
|
|
|
getType = getTypeWin7
|
2011-04-20 05:58:03 +08:00
|
|
|
# _kcbObjectType = expr("poi(nt!CmKeyObjectType)")
|
2010-12-23 19:10:08 +08:00
|
|
|
else:
|
|
|
|
getType = getTypeLegacy
|
2011-04-20 05:58:03 +08:00
|
|
|
# _kcbObjectType = expr("poi(nt!CmpKeyObjectType)")
|
|
|
|
|
|
|
|
|
|
|
|
def getObjectNameInfoFromHeader(p):
|
|
|
|
"""
|
|
|
|
Get object name information from field NameInfoOffset of object header
|
|
|
|
"""
|
2013-02-14 00:28:33 +08:00
|
|
|
objHeader = containingRecord(p, OBJECT_HEADER, "Body")
|
2011-04-20 05:58:03 +08:00
|
|
|
if (0 == objHeader.NameInfoOffset):
|
|
|
|
return None
|
2013-02-14 00:28:33 +08:00
|
|
|
return typedVar(OBJECT_HEADER_NAME_INFO, objHeader.getAddress() - objHeader.NameInfoOffset)
|
2011-04-20 05:58:03 +08:00
|
|
|
|
|
|
|
def getObjectNameInfoFromInfoMask(p):
|
|
|
|
"""
|
|
|
|
Get object name information from field NameInfoOffset of object header
|
|
|
|
"""
|
2013-02-14 00:28:33 +08:00
|
|
|
objHeader = containingRecord(p, OBJECT_HEADER, "Body")
|
2011-04-20 05:58:03 +08:00
|
|
|
if (0 == (objHeader.InfoMask & 2)):
|
|
|
|
return None
|
2012-05-31 21:11:27 +08:00
|
|
|
offsetNameInfo = ptrByte( nt.ObpInfoMaskToOffset + (objHeader.InfoMask & 3) )
|
2011-04-20 05:58:03 +08:00
|
|
|
if (0 == offsetNameInfo):
|
|
|
|
return None
|
2013-02-14 00:28:33 +08:00
|
|
|
return typedVar(OBJECT_HEADER_NAME_INFO, objHeader.getAddress() - offsetNameInfo)
|
2011-04-20 05:58:03 +08:00
|
|
|
|
|
|
|
|
|
|
|
# Select platform-specific function for getting name of object
|
|
|
|
getObjectNameInfo = None
|
|
|
|
try:
|
2013-02-14 00:28:33 +08:00
|
|
|
OBJECT_HEADER.NameInfoOffset
|
2011-04-20 05:58:03 +08:00
|
|
|
getObjectNameInfo = getObjectNameInfoFromHeader
|
2011-06-13 21:40:59 +08:00
|
|
|
except TypeException:
|
2011-04-20 05:58:03 +08:00
|
|
|
getObjectNameInfo = getObjectNameInfoFromInfoMask
|
|
|
|
|
|
|
|
|
|
|
|
def getObjectName(p):
|
|
|
|
"""
|
|
|
|
Get object name by name information
|
|
|
|
"""
|
|
|
|
nameInfo = getObjectNameInfo(p)
|
|
|
|
if (None == nameInfo):
|
|
|
|
return ""
|
|
|
|
return loadUnicodeString(nameInfo.Name.getAddress())
|
|
|
|
|
|
|
|
def buildObjectName(p):
|
|
|
|
"""
|
|
|
|
Get object name by name information (parent directory handled)
|
|
|
|
"""
|
|
|
|
objectFullName = ""
|
|
|
|
|
|
|
|
nameInfo = getObjectNameInfo(p)
|
|
|
|
if None == nameInfo:
|
|
|
|
return objectFullName
|
|
|
|
namePart = loadUnicodeString(nameInfo.Name.getAddress())
|
|
|
|
if namePart != "\\":
|
|
|
|
objectFullName = namePart + "\\" + objectFullName
|
|
|
|
else:
|
|
|
|
objectFullName = "\\" + objectFullName
|
|
|
|
|
|
|
|
while (0 != nameInfo.Directory):
|
|
|
|
p = nameInfo.Directory
|
|
|
|
nameInfo = getObjectNameInfo(p)
|
|
|
|
if (None == nameInfo):
|
|
|
|
return "...\\" + objectFullName
|
|
|
|
namePart = loadUnicodeString(nameInfo.Name.getAddress())
|
|
|
|
if namePart != "\\":
|
|
|
|
objectFullName = namePart + "\\" + objectFullName
|
|
|
|
else:
|
|
|
|
objectFullName = "\\" + objectFullName
|
|
|
|
|
|
|
|
return objectFullName
|
|
|
|
|
|
|
|
|
2010-12-23 19:10:08 +08:00
|
|
|
HANDLE_VALUE_INC = 4
|
|
|
|
HT_PAGE_SIZE = 4096
|
|
|
|
HT_ENTRY_SIZE = (2 * ptrSize())
|
|
|
|
HT_LOWLEVEL_COUNT = HT_PAGE_SIZE // HT_ENTRY_SIZE
|
|
|
|
HT_MIDLEVEL_COUNT = HT_PAGE_SIZE // ptrSize()
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
def getListByHandleTable(tableHandles=None, objTypeAddr=0, containHeaders=True):
|
2010-12-23 19:10:08 +08:00
|
|
|
"""
|
|
|
|
Build list of objects from target handle table
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
Parameter objTypeAddr if not 0 used for getting object of specific type,
|
2010-12-23 19:10:08 +08:00
|
|
|
otherwise get object of all types
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
Parameter containHeaders used to interpret table contents:
|
|
|
|
if containHeaders=True then table contains pointers to nt!_OBJECT_HEADER,
|
2010-12-23 19:10:08 +08:00
|
|
|
otherwise table contains pointers to objects
|
|
|
|
"""
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
def getByHandleEntry(entryHandle, containHeader):
|
2010-12-23 19:10:08 +08:00
|
|
|
"""
|
|
|
|
Query object pointer by handle entry from handle table
|
|
|
|
"""
|
2011-04-20 05:58:03 +08:00
|
|
|
if (0 == entryHandle):
|
2010-12-23 19:10:08 +08:00
|
|
|
return 0
|
|
|
|
|
2013-02-14 00:28:33 +08:00
|
|
|
HandleEntry = typedVar( HANDLE_TABLE_ENTRY, entryHandle)
|
2010-12-23 19:10:08 +08:00
|
|
|
if (0xFFFFFFFE == HandleEntry.NextFreeTableEntry):
|
|
|
|
return 0
|
|
|
|
|
|
|
|
p = ptrPtr(HandleEntry.getAddress()) & 0xFFFFFFFFFFFFFFF8
|
|
|
|
if (0 == p):
|
|
|
|
return 0
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
if (containHeader):
|
2013-02-14 00:28:33 +08:00
|
|
|
objHeader = typedVar( OBJECT_HEADER, p)
|
2011-04-20 05:58:03 +08:00
|
|
|
p = objHeader.Body.getAddress()
|
2010-12-23 19:10:08 +08:00
|
|
|
return p
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
def getListByHandleTableL0(pTableContent, nMaxHandleIndex, objTypeAddr, containHeaders):
|
2010-12-23 19:10:08 +08:00
|
|
|
"""
|
|
|
|
Build list of objects from target handle table level 0
|
|
|
|
"""
|
|
|
|
lstObjects = list()
|
|
|
|
nTableLevel0Count = nMaxHandleIndex // HANDLE_VALUE_INC
|
|
|
|
for HandleEntryIndex in range(nTableLevel0Count):
|
|
|
|
|
|
|
|
pHandleEntry = pTableContent + (HT_ENTRY_SIZE * HandleEntryIndex)
|
2011-04-20 05:58:03 +08:00
|
|
|
p = getByHandleEntry(pHandleEntry, containHeaders)
|
2010-12-23 19:10:08 +08:00
|
|
|
if (0 == p):
|
|
|
|
continue
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
if (0 == objTypeAddr):
|
2012-10-04 15:00:17 +08:00
|
|
|
lstObjects.append( ( p, HandleEntryIndex*HANDLE_VALUE_INC) )
|
2010-12-23 19:10:08 +08:00
|
|
|
else:
|
|
|
|
pCurrentType = getType(p)
|
2011-04-20 05:58:03 +08:00
|
|
|
if (addr64(objTypeAddr) == addr64(pCurrentType)):
|
2012-10-04 15:00:17 +08:00
|
|
|
lstObjects.append( ( p, HandleEntryIndex*HANDLE_VALUE_INC) )
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
return lstObjects
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
def getListByHandleTableL1(pTableContent, nMaxHandleIndex, objTypeAddr, containHeaders):
|
2010-12-23 19:10:08 +08:00
|
|
|
"""
|
|
|
|
Build list of objects from target handle table level 1
|
|
|
|
"""
|
|
|
|
lstObjects = list()
|
|
|
|
nTableLevel1Count = (nMaxHandleIndex // HANDLE_VALUE_INC) // HT_LOWLEVEL_COUNT
|
|
|
|
for Index in range(nTableLevel1Count):
|
|
|
|
pTableLevel0 = ptrPtr(pTableContent + (Index * ptrSize()))
|
2011-04-20 05:58:03 +08:00
|
|
|
lstObjects += getListByHandleTableL0(pTableLevel0, HT_LOWLEVEL_COUNT * HANDLE_VALUE_INC, objTypeAddr, containHeaders)
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
return lstObjects
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
def getListByHandleTableL2(pTableContent, nMaxHandleIndex, objTypeAddr, containHeaders):
|
2010-12-23 19:10:08 +08:00
|
|
|
"""
|
|
|
|
Build list of objects from target handle table level 2
|
|
|
|
"""
|
|
|
|
lstObjects = list()
|
|
|
|
nTableLevel2Count = ((nMaxHandleIndex // HANDLE_VALUE_INC) // HT_LOWLEVEL_COUNT) // HT_MIDLEVEL_COUNT
|
|
|
|
for Index in range(nTableLevel2Count):
|
|
|
|
pTableLevel1 = ptrPtr(pTableContent + (Index * ptrSize()))
|
2011-04-20 05:58:03 +08:00
|
|
|
lstObjects += getListByHandleTableL1(pTableLevel1, HT_MIDLEVEL_COUNT * HT_LOWLEVEL_COUNT * HANDLE_VALUE_INC, objTypeAddr, containHeaders)
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
return lstObjects
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
if (None == tableHandles):
|
2012-05-23 17:28:50 +08:00
|
|
|
currProcess = nt.typedVar("_EPROCESS", getCurrentProcess())
|
2011-04-20 05:58:03 +08:00
|
|
|
if (None == currProcess):
|
|
|
|
dprintln("Get current process failed")
|
|
|
|
return
|
|
|
|
tableHandles = currProcess.ObjectTable
|
|
|
|
|
2012-05-23 17:28:50 +08:00
|
|
|
tableHandles = nt.typedVar("_HANDLE_TABLE", tableHandles)
|
2011-04-20 05:58:03 +08:00
|
|
|
nMaxHandleIndex = tableHandles.NextHandleNeedingPool & 0xFFFFFFFF
|
|
|
|
nTableLevel = (tableHandles.TableCode & 3)
|
|
|
|
pTableContent = tableHandles.TableCode - nTableLevel
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
if (0 == nTableLevel):
|
2011-04-20 05:58:03 +08:00
|
|
|
return getListByHandleTableL0(pTableContent, nMaxHandleIndex, objTypeAddr, containHeaders)
|
2010-12-23 19:10:08 +08:00
|
|
|
elif (1 == nTableLevel):
|
2011-04-20 05:58:03 +08:00
|
|
|
return getListByHandleTableL1(pTableContent, nMaxHandleIndex, objTypeAddr, containHeaders)
|
2010-12-23 19:10:08 +08:00
|
|
|
elif (2 == nTableLevel):
|
2011-04-20 05:58:03 +08:00
|
|
|
return getListByHandleTableL2(pTableContent, nMaxHandleIndex, objTypeAddr, containHeaders)
|
2010-12-23 19:10:08 +08:00
|
|
|
|
|
|
|
dprintln("ERROR: Unknown handle table level: %u" % nTableLevel)
|
|
|
|
return list()
|
2012-10-04 15:00:17 +08:00
|
|
|
|
|
|
|
|
2010-12-24 19:38:48 +08:00
|
|
|
|
2011-06-09 00:29:33 +08:00
|
|
|
NUMBER_HASH_BUCKETS = 37
|
|
|
|
|
|
|
|
def getListByDirectoryObject(p, objTypeAddr=0):
|
|
|
|
"""
|
|
|
|
Build list of objects from object directory
|
|
|
|
|
|
|
|
Parameter objTypeAddr if not 0 used for getting object of specific type,
|
|
|
|
otherwise get object of all types
|
|
|
|
"""
|
|
|
|
|
2012-05-31 21:13:54 +08:00
|
|
|
if getType(p) != ptrPtr( nt.ObpDirectoryObjectType ):
|
2011-06-09 00:29:33 +08:00
|
|
|
return None
|
|
|
|
|
|
|
|
result = list()
|
|
|
|
|
|
|
|
for i in range(0, NUMBER_HASH_BUCKETS):
|
|
|
|
bucket = ptrPtr( p + (i * ptrSize()) )
|
|
|
|
while bucket:
|
2013-02-14 00:28:33 +08:00
|
|
|
bucketVar = typedVar( OBJECT_DIRECTORY_ENTRY, bucket)
|
2011-06-09 00:29:33 +08:00
|
|
|
if objTypeAddr and (getType(bucketVar.Object) == objTypeAddr):
|
|
|
|
result.append(bucketVar.Object)
|
|
|
|
elif (not objTypeAddr):
|
|
|
|
result.append(bucketVar.Object)
|
|
|
|
bucket = bucketVar.ChainLink
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
def getObjectByName(name, caseSensitive=False):
|
|
|
|
"""
|
|
|
|
Query address of object by full name
|
|
|
|
"""
|
|
|
|
|
|
|
|
def cmpCase(s1, s2): return s1 == s2
|
|
|
|
def cmpNoCase(s1, s2): return s1.lower() == s2.lower()
|
|
|
|
|
|
|
|
if not len(name):
|
|
|
|
return None
|
|
|
|
|
|
|
|
if name[0] != '\\':
|
|
|
|
return None
|
|
|
|
|
2012-05-31 21:13:54 +08:00
|
|
|
object = ptrPtr( nt.ObpRootDirectoryObject )
|
2011-06-09 00:29:33 +08:00
|
|
|
|
|
|
|
cmpFunc = cmpNoCase
|
|
|
|
if caseSensitive:
|
|
|
|
cmpFunc = cmpCase
|
|
|
|
|
|
|
|
while True:
|
|
|
|
name = name[1:]
|
|
|
|
if not len(name):
|
|
|
|
break
|
|
|
|
|
|
|
|
tok = name.find("\\")
|
|
|
|
if -1 != tok:
|
|
|
|
namePart = name[:tok]
|
|
|
|
name = name[tok:]
|
|
|
|
else:
|
|
|
|
namePart = name
|
|
|
|
|
|
|
|
if 0 == len(namePart):
|
|
|
|
return None
|
|
|
|
|
|
|
|
# FIXME: use name/index hash
|
|
|
|
lstObjects = getListByDirectoryObject(object)
|
|
|
|
if None == lstObjects:
|
|
|
|
return None
|
|
|
|
|
|
|
|
found = False
|
|
|
|
for p in lstObjects:
|
|
|
|
objName = getObjectName(p)
|
|
|
|
if len(objName) and cmpFunc( namePart, objName ):
|
|
|
|
object = p
|
|
|
|
found = True
|
|
|
|
break
|
|
|
|
|
|
|
|
if not found:
|
|
|
|
return None
|
|
|
|
|
|
|
|
if -1 == tok:
|
|
|
|
break
|
|
|
|
|
|
|
|
return object
|
|
|
|
|
|
|
|
|
2010-12-24 19:38:48 +08:00
|
|
|
import sys
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
# Display object kd-command
|
|
|
|
ViewObjectCommand = {
|
|
|
|
addr64( expr("poi(nt!IoFileObjectType)") ) : "!fileobj",
|
|
|
|
addr64( expr("poi(nt!PsProcessType)") ) : "!process",
|
|
|
|
addr64( expr("poi(nt!PsThreadType)") ) : "!thread",
|
|
|
|
addr64( expr("poi(nt!IoDeviceObjectType)") ) : "!devobj",
|
|
|
|
addr64( expr("poi(nt!SeTokenObjectType)") ) : "!token",
|
|
|
|
# addr64( _kcbObjectType ) : "!reg kcb",
|
|
|
|
addr64( expr("poi(nt!IoDriverObjectType)") ) : "!drvobj 7"
|
|
|
|
}
|
|
|
|
|
|
|
|
def main():
|
|
|
|
"""
|
|
|
|
Print content of object table (handle table)
|
|
|
|
|
|
|
|
Usage:
|
|
|
|
!py ntobj [table= <ADDR>] [type= <ADDR>] [headers= <BOOL>]
|
|
|
|
|
|
|
|
When (options can be specified in any order):
|
|
|
|
table= <ADDR> : table of handle address. F.e. address object table
|
|
|
|
contained in field ObjectTable structure nt!_EPROCESS
|
|
|
|
default: nt!_EPROCESS.ObjectTable of current processes
|
|
|
|
|
|
|
|
type= <ADDR> : address of object type. If specified (!= 0) then print
|
|
|
|
object of target type only.
|
|
|
|
default: 0
|
|
|
|
|
|
|
|
headers= <BOOL> : table of handles format: contain pointer to object or to
|
|
|
|
object header (nt!_OBJECT_HEADER): True or Flase
|
|
|
|
F.e. poi(nt!PspCidTable) contains objects (processes and
|
|
|
|
threads), and nt!_EPROCESS.ObjectTable contains headers
|
|
|
|
default: True
|
|
|
|
Examples:
|
|
|
|
<link cmd=\"!py ntobj\">!py ntobj</link>
|
|
|
|
Print object table of current process
|
2010-12-24 19:38:48 +08:00
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
<link cmd=\"!py ntobj type= poi(nt!IoFileObjectType)\">!py ntobj type= poi(nt!IoFileObjectType)</link>
|
|
|
|
Print object table (only _FILE_OBJECT *) of current process
|
|
|
|
|
|
|
|
<link cmd=\"!py ntobj table= poi(poi(nt!PsInitialSystemProcess)+@@C++(#FIELD_OFFSET(nt!_EPROCESS,ObjectTable)))\">!py ntobj table= poi(poi(nt!PsInitialSystemProcess)+@@C++(#FIELD_OFFSET(nt!_EPROCESS,ObjectTable)))</link>
|
|
|
|
Print object table for SYSTEM process.
|
|
|
|
|
|
|
|
<link cmd=\"!py ntobj table= poi(nt!PspCidTable) headers= False type= poi(nt!PsProcessType)\">!py ntobj table= poi(nt!PspCidTable) headers= False type= poi(nt!PsProcessType)</link>
|
|
|
|
Print all process objects from nt!PspCidTable
|
|
|
|
"""
|
2010-12-24 19:38:48 +08:00
|
|
|
|
2011-04-15 00:01:29 +08:00
|
|
|
if not isWindbgExt():
|
2010-12-24 19:38:48 +08:00
|
|
|
print "Script is launch out of WinDBG"
|
2011-04-20 05:58:03 +08:00
|
|
|
return
|
|
|
|
|
|
|
|
if not isKernelDebugging():
|
|
|
|
dprintln("This script for kernel debugging only")
|
|
|
|
return
|
2010-12-24 19:38:48 +08:00
|
|
|
|
|
|
|
argc = len(sys.argv)
|
2011-04-20 05:58:03 +08:00
|
|
|
|
|
|
|
if (2 == argc) and ("help" == sys.argv[1] or "?" == sys.argv[1]):
|
|
|
|
dprintln(main.__doc__, True)
|
|
|
|
return
|
|
|
|
|
|
|
|
if (0 == (argc % 2)):
|
|
|
|
dprintln("Invalid number of comand line arguments")
|
|
|
|
dprintln(main.__doc__, True)
|
|
|
|
return
|
|
|
|
|
|
|
|
tableHandles = None
|
|
|
|
objTypeAddr = 0
|
|
|
|
containHeaders = True
|
|
|
|
|
|
|
|
for i in range(1, argc, 2):
|
|
|
|
if ("table=" == sys.argv[i]):
|
|
|
|
tableHandles = expr(sys.argv[i + 1])
|
|
|
|
elif ("type=" == sys.argv[i]):
|
|
|
|
objTypeAddr = expr(sys.argv[i + 1])
|
|
|
|
elif ("headers=" == sys.argv[i]):
|
|
|
|
containHeaders = ("True" == sys.argv[i + 1])
|
2010-12-24 19:38:48 +08:00
|
|
|
else:
|
2011-04-20 05:58:03 +08:00
|
|
|
dprintln("Unknown option `" + sys.argv[i] + "'")
|
|
|
|
dprintln(main.__doc__, True)
|
|
|
|
return
|
|
|
|
|
2012-11-20 01:59:22 +08:00
|
|
|
ObjectHandlePairs = [ (p[0], p[1]) for p in getListByHandleTable(tableHandles, objTypeAddr, containHeaders) ]
|
2012-10-04 15:00:17 +08:00
|
|
|
|
2012-11-20 01:59:22 +08:00
|
|
|
dprintln("%u objects:" % len(ObjectHandlePairs))
|
|
|
|
for objectHandle in ObjectHandlePairs:
|
|
|
|
objectType = getType(objectHandle[0])
|
2011-04-20 05:58:03 +08:00
|
|
|
if objectType in ViewObjectCommand:
|
|
|
|
viewCommand = ViewObjectCommand[objectType]
|
|
|
|
else:
|
|
|
|
viewCommand = "!object"
|
2012-11-20 01:59:22 +08:00
|
|
|
|
|
|
|
dprint("\t<link cmd=\"" + viewCommand + " 0x%x\">" % objectHandle[0] + viewCommand + " 0x%x</link>" % objectHandle[0], True)
|
|
|
|
objectName = buildObjectName(objectHandle[0])
|
2011-04-20 05:58:03 +08:00
|
|
|
if len(objectName):
|
2012-11-20 01:59:22 +08:00
|
|
|
dprint( ", name=`" + objectName + "'" )
|
|
|
|
elif nt.typedVar("_OBJECT_TYPE", getType(objectHandle[0])).TypeInfo.QueryNameProcedure:
|
|
|
|
dprint(", <i>custom</i> name", True)
|
2011-04-20 05:58:03 +08:00
|
|
|
else:
|
2012-11-20 01:59:22 +08:00
|
|
|
dprint(" , <_unnamed_>")
|
|
|
|
|
|
|
|
dprint(", <link cmd=\"!handle 0x%x\">!handle 0x%x</link>\n" % (objectHandle[1], objectHandle[1]), True)
|
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
dprint("\ttype is `" + getObjectName(objectType) + "' (<link cmd=\"!object 0x%x\">0x%x</link>)" % (objectType, objectType), True)
|
2012-11-20 01:59:22 +08:00
|
|
|
|
2011-04-20 05:58:03 +08:00
|
|
|
dprintln( "\n" )
|
|
|
|
|
|
|
|
if (1 == argc):
|
|
|
|
dprintln("\n<link cmd=\"!py " + sys.argv[0] + " ?\" \">View help for ntobj</link>", True)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|