[C#] LNK parser doet het alleen volledig bij bestanden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • topaj
  • Registratie: April 2008
  • Laatst online: 17-09 15:22
Hallo medetweakers,

Vanwege de beveiliging bij enkele klanten kan ik geen gebruik maken van WshShell en kan ik ook geen dll's "importeren".
Omdat ik snelkopplingen moet gaan parsen voor een bestandsbrowser heb ik mbv. dit deze simpele functie kunnen schrijven:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
        private int bytes2short(byte[] bytes, int off)
        {
            return bytes[off] | (bytes[off + 1] << 8);
        }

        public void parse(string path)
        {

            // http://www.stdlib.com/art6-Shortcut-File-Format-lnk.html
            // Het hele bestand in byte buffer lezen

            FileStream f = File.Open(path, FileMode.Open);
            BinaryReader fin = new BinaryReader(f);
            FileInfo info = new FileInfo(path);
            int bestandsLengte = (int)info.Length;

            byte[] link = fin.ReadBytes(bestandsLengte); // Een byte array van het hele bestand

            // krijg de flags byte
            byte flags = link[20]; // 16 + 4

            // krijg de bestandsattributen byte
            byte bestandAttr = link[24];
            byte is_map_mask = (byte)0x10;

            is_Map = (bestandAttr & is_map_mask) > 0; // True als bestandAttr etc. groter is dan 0

            // als er shell instellingen zijn, overslaan
            int shell_offset = 76;
            int shell_len = 0;
            if (flags > 0) // Als de 20e byte > 1
            {
                // de plus 2 is voor de lengte marker van de shell eigenschappen zelf
                shell_len = bytes2short(link, shell_offset) + 2;
            }

            // Hier vanaf deze positie begint de link
            int bestand_begin = 76 + shell_len;

            // verkrijg de volume en systeem waardes
            int local_sys_off = link[bestand_begin + 16] + bestand_begin;
            doel = ASCIIEncoding.ASCII.GetString(link, local_sys_off, bestandsLengte - local_sys_off);

            // doel = krijgStringTotNul(link, local_sys_off, (int)info.Length);

            f.Close();

        }


De code werkt uitstekend voor snelkoppelingen naar bestanden :)
Alleen wanneer ik bijv. een doel heb naar een map, returned de functie de parent map.
(Bijv. een snelkoppeling naar "C:\Windows\System32\" returned "C:\Windows")

Iemand die mij kan uitleggen hoe dit kan?
Mijn dank ik groot _/-\o_

(Modjes, hoe zou ik in mijn titel "mappen" naar "bestanden" kunnen veranderen? Ik was een beetje verstrooid :+ )

Groeten


Acties:
  • 0 Henk 'm!

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 03-06 16:38

Nvidiot

notepad!

Wellicht dat je de code van de LNK parser uit regripper (www.regripper.net) kunt gebruiken om te zien hoe daar lnk bestanden geparsed worden? Dit is geschreven in Perl, maar het zou te lezen moeten zijn :)

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


Acties:
  • 0 Henk 'm!

  • topaj
  • Registratie: April 2008
  • Laatst online: 17-09 15:22
Ik kan daar helaas weinig mee, ik heb ook geen lnk parser kunnen vinden.

Groeten


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
topaj schreef op zaterdag 19 februari 2011 @ 09:52:
Iemand die mij kan uitleggen hoe dit kan?
Ja, je debugger ;) (Debuggen: Hoe doe ik dat?). Je weet dat Visual Studio voorzien is van 1 van de beste (if not thé best) debuggers die er beschikbaar zijn?

Als ik door je functie stap en al eens gewoon even hover over wat variabelen (en stil sta bij de verwachtte waardes) kom ik al een heel eind.

Afbeeldingslocatie: http://tweakers.net/ext/f/QIdmlKdW7BC7FIOH0Kzh4XdW/full.png

Dus: begin eens met debuggen en begin dus met jezelf te helpen. Kom je er dan nog niet uit, post dan je bevindingen zodat we je in de juiste richting kunnen wijzen.
offtopic:
...en gebruik for Pete's sake geen "krijgStringTotNul" functies en engels/nederlands door elkaar :X Kies 1 taal (en please, let it be English) en stick with it.
topaj schreef op zaterdag 19 februari 2011 @ 09:52:
(Modjes, hoe zou ik in mijn titel "mappen" naar "bestanden" kunnen veranderen? Ik was een beetje verstrooid :+ )
Niet. Daar kun je een Topic Report (Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/icon_hand.gif) voor doen ;)

[ Voor 3% gewijzigd door RobIII op 20-02-2011 23:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij