#include <windows.h>
#include <stdio.h>

int main()
{
    HANDLE hToken;
    PTOKEN_PRIVILEGES pTokenPrivileges;
    char szPrivilegeName[256];
    char szDisplayName[256];
    DWORD dwLength;
    DWORD dwLanguageId;
    DWORD i;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
        return 1;
    }

    GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwLength);

    pTokenPrivileges = (PTOKEN_PRIVILEGES)LocalAlloc(LPTR, dwLength);
    if (pTokenPrivileges == NULL) {
        CloseHandle(hToken);
        return 1;
    }

    GetTokenInformation(hToken, TokenPrivileges, pTokenPrivileges, dwLength, &dwLength);


    for (i = 0; i < pTokenPrivileges->PrivilegeCount; i++) {
        
        dwLength = sizeof(szPrivilegeName)/sizeof(szPrivilegeName[0]);

        LookupPrivilegeNameA(NULL,
            &pTokenPrivileges->Privileges[i].Luid,
            szPrivilegeName,
            &dwLength);

        dwLength = sizeof(szDisplayName)/sizeof(szPrivilegeName[0]);

        LookupPrivilegeDisplayNameA(NULL,
            szPrivilegeName,
            szDisplayName,
            &dwLength,
            &dwLanguageId);

        puts("----------------------------------------------------------------------");
        printf("PrivilegeName: %s\n", szPrivilegeName);
        printf("DisplayName: %s\n", szDisplayName);
        printf("Enable: %s\n\n", pTokenPrivileges->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED ? "True" : "False");
    }

    CloseHandle(hToken);
    LocalFree(pTokenPrivileges);

    return 0;
}
