Ejemplo n.º 1
0
    def from_stream(cls, stream, offset=None):
        """Creates a :class:`DirEntry` object from a stream.

        :type stream: :class:`lf.dec.IStream`
        :param stream: A stream that contains the directory entry.

        :type offset: ``int``
        :param offset: The start of the directory entry in :attr:`stream`.

        :rtype: :class:`DirEntry`
        :returns: The corresponding :class:`DirEntry` object.

        """
        if offset is not None:
            stream.seek(offset, SEEK_SET)
        # end if

        values = dir_entry.from_buffer_copy(stream.read(128))

        name = bytes(values.name)
        if values.name_size <= 64:
            name = name[:values.name_size]
        # end if

        new_name = name.decode("utf_16_le", "ignore")
        if new_name:
            name = new_name.split("\x00", 1)[0]
        # end if

        clsid = CLSIDToUUID.from_ctype(values.clsid)

        btime = values.btime
        try:
            btime = FILETIMETodatetime.from_ctype(btime)
        except (ValueError, TypeError):
            btime = (btime.hi << 32) | btime.lo
        # end try

        mtime = values.mtime
        try:
            mtime = FILETIMETodatetime.from_ctype(mtime)
        except (ValueError, TypeError):
            mtime = (mtime.hi << 32) | mtime.lo
        # end try

        return DirEntry((
            name, values.name_size, values.type, values.color, values.left_sid,
            values.right_sid, values.child_sid, clsid, values.state, btime,
            mtime, values.stream_sect_offset, values.stream_size
        ))
Ejemplo n.º 2
0
    def from_stream(cls, stream, offset=None):
        """Creates a :class:`DirEntry` object from a stream.

        :type stream: :class:`lf.dec.IStream`
        :param stream: A stream that contains the directory entry.

        :type offset: ``int``
        :param offset: The start of the directory entry in :attr:`stream`.

        :rtype: :class:`DirEntry`
        :returns: The corresponding :class:`DirEntry` object.

        """
        if offset is not None:
            stream.seek(offset, SEEK_SET)
        # end if

        values = dir_entry.from_buffer_copy(stream.read(128))

        name = bytes(values.name)
        if values.name_size <= 64:
            name = name[:values.name_size]
        # end if

        new_name = name.decode("utf_16_le", "ignore")
        if new_name:
            name = new_name.split("\x00", 1)[0]
        # end if

        clsid = CLSIDToUUID.from_ctype(values.clsid)

        btime = values.btime
        try:
            btime = FILETIMETodatetime.from_ctype(btime)
        except (ValueError, TypeError):
            btime = (btime.hi << 32) | btime.lo
        # end try

        mtime = values.mtime
        try:
            mtime = FILETIMETodatetime.from_ctype(mtime)
        except (ValueError, TypeError):
            mtime = (mtime.hi << 32) | mtime.lo
        # end try

        return DirEntry((name, values.name_size, values.type, values.color,
                         values.left_sid, values.right_sid, values.child_sid,
                         clsid, values.state, btime, mtime,
                         values.stream_sect_offset, values.stream_size))
Ejemplo n.º 3
0
    def test_from_ctype(self):
        ae = self.assertEqual
        ar = self.assertRaises

        data = b"\x00\x0E\x15\x91\xC4\x95\xC2\x01"
        data_bad = b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"

        filetime = filetime_le.from_buffer_copy(data)
        filetime = FILETIMETodatetime.from_ctype(filetime)

        ae(filetime, datetime(2002, 11, 27, 3, 25, 0))

        filetime = filetime_le.from_buffer_copy(data_bad)
        ar(ValueError, FILETIMETodatetime.from_ctype, filetime)
Ejemplo n.º 4
0
    def test_from_ctype(self):
        ae = self.assertEqual
        ar = self.assertRaises

        data = b"\x00\x0E\x15\x91\xC4\x95\xC2\x01"
        data_bad = b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"

        filetime = filetime_le.from_buffer_copy(data)
        filetime = FILETIMETodatetime.from_ctype(filetime)

        ae(filetime, datetime(2002, 11, 27, 3, 25, 0))

        filetime = filetime_le.from_buffer_copy(data_bad)
        ar(ValueError, FILETIMETodatetime.from_ctype, filetime)
Ejemplo n.º 5
0
    def from_ctype(cls, ctype):
        """ Creates a :class:`INFO2Item` object from a ctype.

        :type ctype: :class:`~lf.win.shell.recyclebin.ctypes.info2_item`
        :param ctype: An info2_item object.

        :rtype: :class:`INFO2Item`
        :returns: The corresponding :class:`INFO2Item` object.

        """
        if ctype.name_asc[0] == 0:
            exists = False
            start = 1
        else:
            exists = True
            start = 0
        # end if

        name_asc = bytes(ctype.name_asc)
        null_term = name_asc.find(b"\x00", start)
        if null_term != -1:
            name_asc = name_asc[:null_term]
        # end if

        name_uni = bytes(ctype.name_uni)
        new_name_uni = _utf16_le_decoder(name_uni, "ignore")[0]
        if new_name_uni:
            name_uni = new_name_uni.split("\x00", 1)[0]
        else:
            name_uni = name_uni.split(b"\x00", 1)[0]
        # end if

        try:
            dtime = FILETIMETodatetime.from_ctype(ctype.dtime)
        except ValueError:
            dtime = (ctype.dtime.hi << 32) | ctype.dtime.lo
        # end try

        return cls((
            name_asc, ctype.id, ctype.drive_num, dtime, ctype.file_size,
            name_uni, exists
        ))
Ejemplo n.º 6
0
    def from_stream(cls, stream, offset=None):
        """Creates a :class:`CatalogEntry` object from a stream.

        :type stream: :class:`~lf.dec.IStream`
        :param stream: A stream that contains the structure.

        :type offset: ``int``
        :param offset: The start of the structure in :attr:`stream`.

        :rtype: :class:`CatalogEntry`
        :returns: The corresponding :class:`CatalogEntry` object.

        """
        if offset is not None:
            stream.seek(offset, SEEK_SET)
        else:
            offset = stream.tell()
        # end if

        entry = catalog_entry_header.from_buffer_copy(stream.read(16))
        if entry.size > 16:
            file_name = stream.read(entry.size - 16)

            new_file_name = _utf16_le_decoder(file_name, "ignore")[0]
            if new_file_name:
                file_name = new_file_name.split("\x00", 1)[0]
            # end if
        else:
            file_name = None
        # end if

        try:
            mtime = FILETIMETodatetime.from_ctype(entry.mtime)
        except (TypeError, ValueError):
            mtime = (entry.mtime.hi << 32) | entry.mtime.lo
        # end try

        stream_name = "{0}".format(entry.id)
        stream_name = stream_name[::-1]

        return cls((entry.size, entry.id, mtime, file_name, stream_name))
Ejemplo n.º 7
0
    def from_stream(cls, stream, offset=None):
        """Creates a :class:`CatalogEntry` object from a stream.

        :type stream: :class:`~lf.dec.IStream`
        :param stream: A stream that contains the structure.

        :type offset: ``int``
        :param offset: The start of the structure in :attr:`stream`.

        :rtype: :class:`CatalogEntry`
        :returns: The corresponding :class:`CatalogEntry` object.

        """
        if offset is not None:
            stream.seek(offset, SEEK_SET)
        else:
            offset = stream.tell()
        # end if

        entry = catalog_entry_header.from_buffer_copy(stream.read(16))
        if entry.size > 16:
            file_name = stream.read(entry.size - 16)

            new_file_name = _utf16_le_decoder(file_name, "ignore")[0]
            if new_file_name:
                file_name = new_file_name.split("\x00", 1)[0]
            # end if
        else:
            file_name = None
        # end if

        try:
            mtime = FILETIMETodatetime.from_ctype(entry.mtime)
        except (TypeError, ValueError):
            mtime = (entry.mtime.hi << 32) | entry.mtime.lo
        # end try

        stream_name = "{0}".format(entry.id)
        stream_name = stream_name[::-1]

        return cls((entry.size, entry.id, mtime, file_name, stream_name))
Ejemplo n.º 8
0
    def from_ctype(cls, ctype):
        """ Creates a :class:`INFO2Item` object from a ctype.

        :type ctype: :class:`~lf.win.shell.recyclebin.ctypes.info2_item`
        :param ctype: An info2_item object.

        :rtype: :class:`INFO2Item`
        :returns: The corresponding :class:`INFO2Item` object.

        """
        if ctype.name_asc[0] == 0:
            exists = False
            start = 1
        else:
            exists = True
            start = 0
        # end if

        name_asc = bytes(ctype.name_asc)
        null_term = name_asc.find(b"\x00", start)
        if null_term != -1:
            name_asc = name_asc[:null_term]
        # end if

        name_uni = bytes(ctype.name_uni)
        new_name_uni = _utf16_le_decoder(name_uni, "ignore")[0]
        if new_name_uni:
            name_uni = new_name_uni.split("\x00", 1)[0]
        else:
            name_uni = name_uni.split(b"\x00", 1)[0]
        # end if

        try:
            dtime = FILETIMETodatetime.from_ctype(ctype.dtime)
        except ValueError:
            dtime = (ctype.dtime.hi << 32) | ctype.dtime.lo
        # end try

        return cls((name_asc, ctype.id, ctype.drive_num, dtime,
                    ctype.file_size, name_uni, exists))