Ich bin Linuxuser und kann weder testen, noch kenne ich mich großartig mit WinAPI aus. Ich gehe davon aus, dass das grundsätzlich so funktioniert und CompareFunc() dein Problem ist bzw. das Sortierverhalten falsch ist.

.
CompareFunc() ist eben nur ein Vergleich zwischen zwei Werten, damit der Sortieralgorithmus weiß, was davon größer oder kleiner ist. An den eigentlichen Sortieralgorithmus kommst du wohl nicht dran (musst du auch nicht). Die CompareFunc() ist der Teil, der die Sortierung wesentlich beeinflusst.
Die einzige Möglichkeit besteht wohl darin, einzelne Werte nach ganz oben oder ganz unten zu befördern, bestünde darin, diese als "kleiner/größer als alles andere" zu behandeln.
Da fallen mir mehrere Möglichkeiten an:
1. Übergeordnete Gruppen.
Dann sähe deine CompareFunc() etwa so aus (Pseudocode! Nicht getestet. Geht um das Prinzip^^):
Code:
If (Element1.group < Element2.group) return -1 ;übergeordnetes Kriterium / Gruppe
if (Element1.group > Element2.group) return 1
if (Element1.name < Element2.name) return -1 ;untergeordnetes Kriterium
if (Element1.name > Element2.name) return 1
return 0 ;bleibt ja nur noch der Fall, dass die Elemente nach beiden Kriterien identisch sind. Man könnte hier noch eine weitere Feinabstufungen dranhängen. Identische Dateinamen im selben Pfad sind aber recht selten :o). Wenn dieses Return tatsächlich beim Durchsuchen deiner Festplatte jemals erreicht wird, würde ich mir Sorgen machen :) .
Gehören die Elemente verschiedenen Gruppen an, wird erstmal grob nach Gruppen vorsortiert (Die von Gruppe A sind zwangsläufig immer "kleiner" als die von Gruppe B).
Gehören sie derselben Gruppe an, dann wird feiner sortiert (z.B. alphabetisch, nach Datum oder as auch immer).
Jetzt kannst du die Dateinamen zunächst auf zwei Gruppen aufteilen und diese über die Compare-Funktion unterschiedlich sortieren.
(Du kannst nicht einzelne Elemente aus der Sortierung ausnehmen. Entweder du sortiertst die Liste komplett nach irgendeinem Kriterium, oder du lässt es. Was du wahrscheinlich möchtest, ist, dass bestimmte Dateien besonders hervorgehoben werden bzw. ganz oben kommen).
Um die Reihenfolge umzukehren, einfach bei allen Returns das Vorzeichen tauschen.
2: Zwei Arrays
Du verteilst das "große" Array mit allen Listeneinträgen auf zwei Arrays, sortierst nur eines und fügst sie dann wieder zusammen. Würde ich nicht machen, wenn nichts gegen Variante 1 spricht....
3. Filtern
Warum einzelne Dateinamen herauspicken? Du könntest auch einen Filter einbauen, der die unerwünschten Namen ausblendet oder ausgraut.
PS: Halte solche Compare-Funktionen so kurz und performant, wie nur irgendwie möglich!