Erstellen Sie einen Config
Unterschlüssel unter dem ShellNew
Schlüssel Ihres Dateityps. Fügen Sie dann innerhalb dieses Unterschlüssels einen Zeichenfolgewert hinzu BeforeSeparator
. Die Änderung sollte sofort wirksam werden:
Um das herauszufinden, musste ich in den Explorer-Code eintauchen. shell32.dll
Enthält eine CNewMenu
Klasse, die das Menü "Neu" darstellt, und hat eine benannte Funktion _BeforeSeparator
, die bestimmt, ob der angegebene Eintrag vor dem Trennzeichen platziert werden soll. Hier ist der wichtige Teil der Demontage dieser Funktion (mit freundlicher Genehmigung von IDA ):
Erstens verwendet es, PathMatchSpecW
um zu sehen, ob der Schlüssel Name eines ist .lnk
, .library-ms
oder Folder
. Wenn dies der Fall ist (roter / linker Pfad), wird das Element garantiert über der Linie angezeigt. Wenn nicht (grüner / rechter Pfad), prüft die Funktion, ob ein bestimmtes Bit ( 10h
) in einem bestimmten Teil ( +8
) der Datenstruktur gesetzt ist.
Ich musste den Code finden, der für das Setzen dieses Bits verantwortlich ist. Es gibt eine so genannte Funktion _GetNewObjectInfoForKey
, die für das Einrichten der relevanten Datenstrukturen verantwortlich zu sein scheint. Hier ist ein Teil der Demontage fast am Anfang:
Es versucht einen aufgerufenen Unterschlüssel zu öffnen Config
und setzt bei Erfolg (roter Pfad) _GetConfigFlags
den Teil der Datenstruktur, der das Bit enthält, an dem wir interessiert sind! _GetConfigFlags
prüft auf Vorhandensein verschiedener Einträge und setzt ggf. verschiedene Bits. Hier ist der Teil, der unser Zielbit ( 10h
) setzt:
Und da sehen wir den gewünschten Eintrag Name: BeforeSeparator
.