Example #1
0
    def test__init__(self):
        ae = self.assertEqual

        filename0 = join("data", "lnk", "shortcut_to_local_exe.lnk")
        filename1 = join("data", "lnk", "shortcut_to_mapped_exe.lnk")

        stream0 = RawIStream(filename0)
        stream1 = RawIStream(filename1)

        sl0 = ShellLink(stream0)
        sl1 = ShellLink(stream0, 0)

        sl2 = ShellLink(stream1)
        sl3 = ShellLink(stream1, 0)

        header0 = ShellLinkHeader.from_stream(stream0, 0)
        header1 = ShellLinkHeader.from_stream(stream1, 0)
        ae(sl0.header, header0)
        ae(sl1.header, header0)
        ae(sl2.header, header1)
        ae(sl3.header, header1)

        idlist0 = ITEMIDLIST.from_stream(stream0, 78)
        ae(sl0.idlist, idlist0)
        ae(sl1.idlist, idlist0)
        ae(sl2.idlist, None)
        ae(sl3.idlist, None)

        li0 = LinkInfo.from_stream(stream0, 285)
        li1 = LinkInfo.from_stream(stream1, 76)
        ae(sl0.link_info, li0)
        ae(sl1.link_info, li0)
        ae(sl2.link_info, li1)
        ae(sl3.link_info, li1)

        sds0 = StringDataSet(
            (StringData((16, 7, "comment")),
             StringData((52, 25, "..\\..\\..\\Windows\PING.EXE")),
             StringData((32, 15, "c:\\start-in-dir")),
             StringData((30, 14, "arg1 arg2 arg3")),
             StringData((68, 33, "%SystemRoot%\\system32\\SHELL32.dll"))))

        sds1 = StringDataSet(
            (None, None, StringData(
                (40, 19, "X:\\windows\\system32")), None, None))

        ae(sl0.string_data, sds0)
        ae(sl1.string_data, sds0)
        ae(sl2.string_data, sds1)
        ae(sl3.string_data, sds1)

        edbs0 = list(ExtraDataBlockFactory.make_blocks(stream0, 549))
        edbs1 = list(ExtraDataBlockFactory.make_blocks(stream1, 217))
        ae(sl0.extra_data, edbs0)
        ae(sl1.extra_data, edbs0)
        ae(sl2.extra_data, edbs1)
        ae(sl3.extra_data, edbs1)
Example #2
0
    def test_from_stream(self):
        ae = self.assertEqual
        ain = self.assertIsNone
        ainn = self.assertIsNotNone

        data0 = bytearray()

        # link info header
        data0.extend(b"\x78\x00\x00\x00")  # link info size
        data0.extend(b"\x24\x00\x00\x00")  # link info header size
        data0.extend(b"\x13\x00\x00\x00")  # link info flags
        data0.extend(b"\x24\x00\x00\x00")  # volume id offset
        data0.extend(b"\x3C\x00\x00\x00")  # local base path offset
        data0.extend(b"\x40\x00\x00\x00")  # cnrl offset
        data0.extend(b"\x6C\x00\x00\x00")  # common path suffix offset
        data0.extend(b"\x70\x00\x00\x00")  # local base path offset unicode
        data0.extend(b"\x74\x00\x00\x00")  # comon path suffix offset unicode

        # volume id
        data0.extend(b"\x18\x00\x00\x00")  # volume id size
        data0.extend(b"\x01\x02\x03\x04")  # drive type
        data0.extend(b"\x05\x06\x07\x08")  # drive serial number
        data0.extend(b"\x14\x00\x00\x00")  # volume label offset
        data0.extend(b"\x14\x00\x00\x00")
        data0.extend(b"d\x00\x00\x00")  # data

        # local base path
        data0.extend(b"ijk\x00")

        # cnrl
        data0.extend(b"\x2C\x00\x00\x00")  # cnrl size
        data0.extend(b"\x03\x00\x00\x00")  # cnrl flags
        data0.extend(b"\x1C\x00\x00\x00")  # net name offset
        data0.extend(b"\x20\x00\x00\x00")  # device name offset
        data0.extend(b"\x64\x53\x64\x53")  # network provider type
        data0.extend(b"\x24\x00\x00\x00")  # net name offset unicode
        data0.extend(b"\x28\x00\x00\x00")  # device name offset unicode
        data0.extend(b"abc\x00")  # net name
        data0.extend(b"def\x00")  # device name
        data0.extend(b"g\x00\x00\x00")  # net name unicode
        data0.extend(b"h\x00\x00\x00")  # device name unicode

        # common path suffix
        data0.extend(b"lmn\x00")

        # local base path unicode
        data0.extend(b"o\x00\x00\x00")

        # common path suffix unicode
        data0.extend(b"p\x00\x00\x00")

        stream0 = ByteIStream(data0)
        stream1 = ByteIStream(b"".join([b"\x64\x53", data0]))

        li0 = LinkInfo.from_stream(stream0)
        li1 = LinkInfo.from_stream(stream1, 2)

        volid = VolumeID((0x18, 0x04030201, 0x08070605, 0x14, 0x14, "d"))
        cnrl = CNRL((0x2C, 1, 1, 0x1C, 0x20, 0x53645364, 0x24, 0x28, b"abc",
                     b"def", "g", "h"))

        ae(li0.size, 0x78)
        ae(li1.size, 0x78)

        ae(li0.header_size, 0x24)
        ae(li1.header_size, 0x24)

        ae(li0.vol_id_and_local_base_path, 1)
        ae(li1.vol_id_and_local_base_path, 1)

        ae(li0.cnrl_and_path_suffix, 1)
        ae(li1.cnrl_and_path_suffix, 1)

        ae(li0.vol_id_offset, 0x24)
        ae(li1.vol_id_offset, 0x24)

        ae(li0.local_base_path_offset, 0x3C)
        ae(li1.local_base_path_offset, 0x3C)

        ae(li0.cnrl_offset, 0x40)
        ae(li1.cnrl_offset, 0x40)

        ae(li0.path_suffix_offset, 0x6C)
        ae(li1.path_suffix_offset, 0x6C)

        ae(li0.local_base_path_offset_uni, 0x70)
        ae(li1.local_base_path_offset_uni, 0x70)

        ae(li0.path_suffix_offset_uni, 0x74)
        ae(li1.path_suffix_offset_uni, 0x74)

        ae(li0.vol_id, volid)
        ae(li1.vol_id, volid)

        ae(li0.cnrl, cnrl)
        ae(li1.cnrl, cnrl)
Example #3
0
    def test_from_stream(self):
        ae = self.assertEqual
        ain = self.assertIsNone
        ainn = self.assertIsNotNone

        data0 = bytearray()

        # link info header
        data0.extend(b"\x78\x00\x00\x00")  # link info size
        data0.extend(b"\x24\x00\x00\x00")  # link info header size
        data0.extend(b"\x13\x00\x00\x00")  # link info flags
        data0.extend(b"\x24\x00\x00\x00")  # volume id offset
        data0.extend(b"\x3C\x00\x00\x00")  # local base path offset
        data0.extend(b"\x40\x00\x00\x00")  # cnrl offset
        data0.extend(b"\x6C\x00\x00\x00")  # common path suffix offset
        data0.extend(b"\x70\x00\x00\x00")  # local base path offset unicode
        data0.extend(b"\x74\x00\x00\x00")  # comon path suffix offset unicode

        # volume id
        data0.extend(b"\x18\x00\x00\x00")  # volume id size
        data0.extend(b"\x01\x02\x03\x04")  # drive type
        data0.extend(b"\x05\x06\x07\x08")  # drive serial number
        data0.extend(b"\x14\x00\x00\x00")  # volume label offset
        data0.extend(b"\x14\x00\x00\x00")
        data0.extend(b"d\x00\x00\x00")  # data

        # local base path
        data0.extend(b"ijk\x00")

        # cnrl
        data0.extend(b"\x2C\x00\x00\x00")  # cnrl size
        data0.extend(b"\x03\x00\x00\x00")  # cnrl flags
        data0.extend(b"\x1C\x00\x00\x00")  # net name offset
        data0.extend(b"\x20\x00\x00\x00")  # device name offset
        data0.extend(b"\x64\x53\x64\x53")  # network provider type
        data0.extend(b"\x24\x00\x00\x00")  # net name offset unicode
        data0.extend(b"\x28\x00\x00\x00")  # device name offset unicode
        data0.extend(b"abc\x00")  # net name
        data0.extend(b"def\x00")  # device name
        data0.extend(b"g\x00\x00\x00")  # net name unicode
        data0.extend(b"h\x00\x00\x00")  # device name unicode

        # common path suffix
        data0.extend(b"lmn\x00")

        # local base path unicode
        data0.extend(b"o\x00\x00\x00")

        # common path suffix unicode
        data0.extend(b"p\x00\x00\x00")

        stream0 = ByteIStream(data0)
        stream1 = ByteIStream(b"".join([b"\x64\x53", data0]))

        li0 = LinkInfo.from_stream(stream0)
        li1 = LinkInfo.from_stream(stream1, 2)

        volid = VolumeID((0x18, 0x04030201, 0x08070605, 0x14, 0x14, "d"))
        cnrl = CNRL((
            0x2C,
            1,
            1,
            0x1C,
            0x20,
            0x53645364,
            0x24,
            0x28,
            b"abc",
            b"def",
            "g",
            "h"
        ))


        ae(li0.size, 0x78)
        ae(li1.size, 0x78)

        ae(li0.header_size, 0x24)
        ae(li1.header_size, 0x24)

        ae(li0.vol_id_and_local_base_path, 1)
        ae(li1.vol_id_and_local_base_path, 1)

        ae(li0.cnrl_and_path_suffix, 1)
        ae(li1.cnrl_and_path_suffix, 1)

        ae(li0.vol_id_offset, 0x24)
        ae(li1.vol_id_offset, 0x24)

        ae(li0.local_base_path_offset, 0x3C)
        ae(li1.local_base_path_offset, 0x3C)

        ae(li0.cnrl_offset, 0x40)
        ae(li1.cnrl_offset, 0x40)

        ae(li0.path_suffix_offset, 0x6C)
        ae(li1.path_suffix_offset, 0x6C)

        ae(li0.local_base_path_offset_uni, 0x70)
        ae(li1.local_base_path_offset_uni, 0x70)

        ae(li0.path_suffix_offset_uni, 0x74)
        ae(li1.path_suffix_offset_uni, 0x74)

        ae(li0.vol_id, volid)
        ae(li1.vol_id, volid)

        ae(li0.cnrl, cnrl)
        ae(li1.cnrl, cnrl)
Example #4
0
    def test__init__(self):
        ae = self.assertEqual

        filename0 = join("data", "lnk", "shortcut_to_local_exe.lnk")
        filename1 = join("data", "lnk", "shortcut_to_mapped_exe.lnk")

        stream0 = RawIStream(filename0)
        stream1 = RawIStream(filename1)

        sl0 = ShellLink(stream0)
        sl1 = ShellLink(stream0, 0)

        sl2 = ShellLink(stream1)
        sl3 = ShellLink(stream1, 0)

        header0 = ShellLinkHeader.from_stream(stream0, 0)
        header1 = ShellLinkHeader.from_stream(stream1, 0)
        ae(sl0.header, header0)
        ae(sl1.header, header0)
        ae(sl2.header, header1)
        ae(sl3.header, header1)

        idlist0 = ITEMIDLIST.from_stream(stream0, 78)
        ae(sl0.idlist, idlist0)
        ae(sl1.idlist, idlist0)
        ae(sl2.idlist, None)
        ae(sl3.idlist, None)

        li0 = LinkInfo.from_stream(stream0, 285)
        li1 = LinkInfo.from_stream(stream1, 76)
        ae(sl0.link_info, li0)
        ae(sl1.link_info, li0)
        ae(sl2.link_info, li1)
        ae(sl3.link_info, li1)

        sds0 = StringDataSet((
            StringData((16, 7, "comment")),
            StringData((52, 25, "..\\..\\..\\Windows\PING.EXE")),
            StringData((32, 15, "c:\\start-in-dir")),
            StringData((30, 14, "arg1 arg2 arg3")),
            StringData((68, 33, "%SystemRoot%\\system32\\SHELL32.dll"))
        ))

        sds1 = StringDataSet((
            None,
            None,
            StringData((40, 19, "X:\\windows\\system32")),
            None,
            None
        ))

        ae(sl0.string_data, sds0)
        ae(sl1.string_data, sds0)
        ae(sl2.string_data, sds1)
        ae(sl3.string_data, sds1)

        edbs0 = list(ExtraDataBlockFactory.make_blocks(stream0, 549))
        edbs1 = list(ExtraDataBlockFactory.make_blocks(stream1, 217))
        ae(sl0.extra_data, edbs0)
        ae(sl1.extra_data, edbs0)
        ae(sl2.extra_data, edbs1)
        ae(sl3.extra_data, edbs1)