Создайте Config
подраздел под ShellNew
ключом вашего типа файла. Затем внутри этого подраздела добавьте строковое значение с именем BeforeSeparator
. Изменение должно вступить в силу немедленно:
Чтобы понять это, мне пришлось погрузиться в код проводника. shell32.dll
содержит CNewMenu
класс, который представляет меню New и имеет функцию с именем, _BeforeSeparator
которая определяет, должна ли данная запись быть помещена перед разделителем. Вот важная часть разборки этой функции (любезно предоставлено IDA ):
Сначала он использует, PathMatchSpecW
чтобы увидеть, если имя ключа является одним из .lnk
, .library-ms
или Folder
. Если это (красный / левый путь), элемент гарантированно появится над линией. Если нет (зеленый / правый путь), функция проверяет, установлен ли определенный бит ( 10h
) в определенной части ( +8
) структуры данных.
Мне нужно было найти код, отвечающий за установку этого бита. _GetNewObjectInfoForKey
Похоже, есть функция, которая отвечает за настройку соответствующих структур данных. Вот часть его разборки, почти в самом начале:
Он пытается открыть вызываемый подраздел Config
и, в случае успеха (красный путь), использует _GetConfigFlags
функцию, чтобы установить часть структуры данных, содержащую интересующий нас бит! _GetConfigFlags
проходит проверку на наличие различных записей и, при необходимости, устанавливает различные биты. Вот часть, которая устанавливает наш целевой бит ( 10h
):
И там мы видим желаемое имя входа: BeforeSeparator
.