Glückwunsch für diesen Akt. Ich will deine Freude nicht schmälern, aber den Code hättest du sicher auch mit etwas Suche und Geduld hier in irgendeiner Form gefunden. Trotzdem ist die daraus gewonnene Erkenntnis und Erfahrung unersetzlich und wird dir bei ähnlichen Problemen helfen.
Wenn du eine Anwendung mit Manifest, aber ohne Admintoken in CreateProcessAsUser starten willst, wird CPAU fehlschlagen und die Fehlermeldung ERROR_ELEVATION_REQUIRED (740) über GetLastError zurückmelden. Dann muss man ShellExecute (nicht im Dienst, sondern über extra Prozess!) verwenden.
Jedes Tokenn besitzt ein Feld LinkedToken, das ein weiteres Token enthält. Wenn
UAC aktiv ist, dann bekommt man darüber das Admintoken. Das Admintoken hat auch so ein Feld und man bekommt darüber das eingeschränkte Token. Es ist also ein Ringschluss. Nun ist es aber dennoch möglich auch als normaler Benutzer das Admintoken über dieses Feld zu laden, jedoch verweigert CPAU und ImpersonateLoggedOnUser die Nutzung. Mehr Info siehe dazu in der Hilfe zur letztgenannten Funktion.
Enums haben tatsächlich keine exakte Größe, wenn man allgemein spricht. Man kann aber Compilern normalerweise irgendwie mitteilen, wie groß mindestens ein Enum sein soll, z.B. in Delphi mit $MINENUMSIZE (oder ähnlich). MS C++ Compiler kann es auch und das Windows
SDK nutzt es auch. Am sichersten kannst du es sehen, indem du den Datentyp in C mit sizeof auf dessen Größe prüfst.