예제 #1
0
    def parseDirEntry(self, bytes):
        entry = Directory.Entry()
        entry.bytes = bytes
        name = globals.getUTF8FromUTF16(bytes[0:64])
        entry.Name = name
        entry.CharBufferSize = getSignedInt(bytes[64:66])
        entry.Type = getSignedInt(bytes[66:67])
        entry.NodeColor = getSignedInt(bytes[67:68])

        entry.DirIDLeft = getSignedInt(bytes[68:72])
        entry.DirIDRight = getSignedInt(bytes[72:76])
        entry.DirIDRoot = getSignedInt(bytes[76:80])

        entry.UniqueID = bytes[80:96]
        entry.UserFlags = bytes[96:100]
        entry.TimeCreated = bytes[100:108]
        entry.TimeModified = bytes[108:116]

        entry.StreamSectorID = getSignedInt(bytes[116:120])
        entry.StreamSize = getSignedInt(bytes[120:124])
        entry.StreamLocation = StreamLocation.SAT
        if entry.Type != Directory.Type.RootStorage and \
            entry.StreamSize < self.header.minStreamSize:
            entry.StreamLocation = StreamLocation.SSAT

        if entry.Type == Directory.Type.RootStorage and entry.StreamSectorID >= 0:
            # This is an existing root storage.
            self.RootStorage = entry

        return entry
예제 #2
0
    def parseDirEntry(self, bytes):
        entry = Directory.Entry()
        entry.bytes = bytes
        name = globals.getUTF8FromUTF16(bytes[0:64])
        entry.Name = name
        entry.CharBufferSize = getSignedInt(bytes[64:66])
        entry.Type = getSignedInt(bytes[66:67])
        entry.NodeColor = getSignedInt(bytes[67:68])

        entry.DirIDLeft = getSignedInt(bytes[68:72])
        entry.DirIDRight = getSignedInt(bytes[72:76])
        entry.DirIDRoot = getSignedInt(bytes[76:80])

        entry.UniqueID = bytes[80:96]
        entry.UserFlags = bytes[96:100]
        entry.TimeCreated = bytes[100:108]
        entry.TimeModified = bytes[108:116]

        entry.StreamSectorID = getSignedInt(bytes[116:120])
        entry.StreamSize = getSignedInt(bytes[120:124])
        entry.StreamLocation = StreamLocation.SAT
        if entry.Type != Directory.Type.RootStorage and entry.StreamSize < self.header.minStreamSize:
            entry.StreamLocation = StreamLocation.SSAT

        if entry.Type == Directory.Type.RootStorage and entry.StreamSectorID >= 0:
            # This is an existing root storage.
            self.RootStorage = entry

        return entry
예제 #3
0
 def getString(self, limit=None):
     bytes = []
     count = 0
     while True:
         if (not limit is None) and count == limit:
             break
         i = self.readuInt8()
         j = self.readuInt8()
         if i != 0 or j != 0:
             bytes.append(i)
             bytes.append(j)
         else:
             break
         count += 1
     return globals.getUTF8FromUTF16("".join(map(lambda x: chr(x), bytes)))
예제 #4
0
 def getString(self, limit = None):
     bytes = []
     count = 0
     while True:
         if (not limit is None) and count == limit:
             break
         i = self.readuInt8()
         j = self.readuInt8()
         if i != 0 or j != 0:
             bytes.append(i)
             bytes.append(j)
         else:
             break
         count += 1
     return globals.getUTF8FromUTF16("".join(map(lambda x: chr(x), bytes)))
예제 #5
0
 def __getString(self, limit):
     bytes = []
     count = 0
     pos = self.pos
     while True:
         if (limit is not None) and count == limit:
             break
         i = self.getuInt8(pos=pos)
         pos += 1
         j = self.getuInt8(pos=pos)
         pos += 1
         if i != 0 or j != 0:
             bytes.append(i)
             bytes.append(j)
         else:
             break
         count += 1
     return (self.quoteAttr(globals.encodeName(globals.getUTF8FromUTF16("".join(map(lambda x: chr(x), bytes))))), pos)
예제 #6
0
 def __getString(self, limit):
     bytes = []
     count = 0
     pos = self.pos
     while True:
         if (limit is not None) and count == limit:
             break
         i = self.getuInt8(pos=pos)
         pos += 1
         j = self.getuInt8(pos=pos)
         pos += 1
         if i != 0 or j != 0:
             bytes.append(i)
             bytes.append(j)
         else:
             break
         count += 1
     return (self.quoteAttr(globals.encodeName(globals.getUTF8FromUTF16("".join(map(lambda x: chr(x), bytes))))), pos)
예제 #7
0
    def read(self):
        # CompObjHeader
        reserved = self.strm.readBytes(4)
        ver = self.strm.readUnsignedInt(4)
        reserved = self.strm.readBytes(20)
        globals.outputln("version: 0x%4.4X" % ver)

        # LengthPrefixedAnsiString
        length = self.strm.readUnsignedInt(4)
        displayName = self.strm.readBytes(length)
        if ord(displayName[-1]) != 0x00:
            # must be null-terminated.
            raise CompObjStreamError()

        globals.outputln("display name: " + displayName[:-1])

        # ClipboardFormatOrAnsiString
        marker = self.strm.readUnsignedInt(4)
        if marker == 0:
            # Don't do anything.
            pass
        elif marker == 0xFFFFFFFF or marker == 0xFFFFFFFE:
            clipFormatID = self.strm.readUnsignedInt(4)
            globals.outputln("clipboard format ID: %d" % clipFormatID)
        else:
            clipName = self.strm.readBytes(marker)
            if ord(clipName[-1]) != 0x00:
                # must be null-terminated.
                raise CompObjStreamError()
            globals.outputln("clipboard format name: %s" % clipName[:-1])

        # LengthPrefixedAnsiString
        length = self.strm.readUnsignedInt(4)
        if length == 0 or length > 0x00000028:
            # the spec says this stream is now invalid.
            raise CompObjStreamError()

        reserved = self.strm.readBytes(length)
        if ord(reserved[-1]) != 0x00:
            # must be null-terminated.
            raise CompObjStreamError()

        globals.outputln("reserved name : %s" % reserved[:-1])
        unicodeMarker = self.strm.readUnsignedInt(4)
        if unicodeMarker != 0x71B239F4:
            raise CompObjStreamError()

        # LengthPrefixedUnicodeString
        length = self.strm.readUnsignedInt(4)
        if length > 0:
            s = globals.getUTF8FromUTF16(self.strm.readBytes(length * 2))
            globals.outputln("display name (unicode): %s" % s)

        # ClipboardFormatOrAnsiString
        marker = self.strm.readUnsignedInt(4)
        if marker == 0:
            # Don't do anything.
            pass
        elif marker == 0xFFFFFFFF or marker == 0xFFFFFFFE:
            clipFormatID = self.strm.readUnsignedInt(4)
            globals.outputln("clipboard format ID: %d" % clipFormatID)
        else:
            clipName = globals.getUTF8FromUTF16(self.strm.readBytes(marker *
                                                                    2))
            if ord(clipName[-1]) != 0x00:
                # must be null-terminated.
                raise CompObjStreamError()
            globals.outputln("clipboard format name: %s" % clipName[:-1])
예제 #8
0
    def read (self):
        # CompObjHeader
        reserved = self.strm.readBytes(4)
        ver = self.strm.readUnsignedInt(4)
        reserved = self.strm.readBytes(20)
        globals.outputln("version: 0x%4.4X"%ver)

        # LengthPrefixedAnsiString
        length = self.strm.readUnsignedInt(4)
        displayName = self.strm.readBytes(length)
        if ord(displayName[-1]) != 0x00:
            # must be null-terminated.
            raise CompObjStreamError()

        globals.outputln("display name: " + displayName[:-1])

        # ClipboardFormatOrAnsiString
        marker = self.strm.readUnsignedInt(4)
        if marker == 0:
            # Don't do anything.
            pass
        elif marker == 0xFFFFFFFF or marker == 0xFFFFFFFE:
            clipFormatID = self.strm.readUnsignedInt(4)
            globals.outputln("clipboard format ID: %d"%clipFormatID)
        else:
            clipName = self.strm.readBytes(marker)
            if ord(clipName[-1]) != 0x00:
                # must be null-terminated.
                raise CompObjStreamError()
            globals.outputln("clipboard format name: %s"%clipName[:-1])

        # LengthPrefixedAnsiString
        length = self.strm.readUnsignedInt(4)
        if length == 0 or length > 0x00000028:
            # the spec says this stream is now invalid.
            raise CompObjStreamError()

        reserved = self.strm.readBytes(length)
        if ord(reserved[-1]) != 0x00:
            # must be null-terminated.
            raise CompObjStreamError()

        globals.outputln("reserved name : %s"%reserved[:-1])
        unicodeMarker = self.strm.readUnsignedInt(4)
        if unicodeMarker != 0x71B239F4:
            raise CompObjStreamError()

        # LengthPrefixedUnicodeString
        length = self.strm.readUnsignedInt(4)
        if length > 0:
            s = globals.getUTF8FromUTF16(self.strm.readBytes(length*2))
            globals.outputln("display name (unicode): %s"%s)

        # ClipboardFormatOrAnsiString
        marker = self.strm.readUnsignedInt(4)
        if marker == 0:
            # Don't do anything.
            pass
        elif marker == 0xFFFFFFFF or marker == 0xFFFFFFFE:
            clipFormatID = self.strm.readUnsignedInt(4)
            globals.outputln("clipboard format ID: %d"%clipFormatID)
        else:
            clipName = globals.getUTF8FromUTF16(self.strm.readBytes(marker*2))
            if ord(clipName[-1]) != 0x00:
                # must be null-terminated.
                raise CompObjStreamError()
            globals.outputln("clipboard format name: %s"%clipName[:-1])