UTILS.CPP
/*++ 
 
DCOM Permission Configuration Sample 
Copyright (c) 1996, Microsoft Corporation. All rights reserved. 
 
Module Name: 
 
    utils.cpp 
 
Abstract: 
 
    Miscellaneous utility functions 
 
Author: 
 
    Michael Nelson 
 
Environment: 
 
    Windows NT 
 
--*/ 
 
#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <tchar.h> 
#include "ntsecapi.h" 
#include "dcomperm.h" 
 
DWORD 
GetCurrentUserSID ( 
    PSID *Sid 
    ) 
{ 
    TOKEN_USER  *tokenUser; 
    HANDLE      tokenHandle; 
    DWORD       tokenSize; 
    DWORD       sidLength; 
 
    if (OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &tokenHandle)) 
    { 
        GetTokenInformation (tokenHandle, 
                             TokenUser, 
                             tokenUser, 
                             0, 
                             &tokenSize); 
 
        tokenUser = (TOKEN_USER *) malloc (tokenSize); 
 
        if (GetTokenInformation (tokenHandle, 
                                 TokenUser, 
                                 tokenUser, 
                                 tokenSize, 
                                 &tokenSize)) 
        { 
            sidLength = GetLengthSid (tokenUser->User.Sid); 
            *Sid = (PSID) malloc (sidLength); 
 
            memcpy (*Sid, tokenUser->User.Sid, sidLength); 
            CloseHandle (tokenHandle); 
        } else 
        { 
            free (tokenUser); 
            return GetLastError(); 
        } 
    } else 
    { 
        free (tokenUser); 
        return GetLastError(); 
    } 
 
    free (tokenUser); 
    return ERROR_SUCCESS; 
} 
 
DWORD 
GetPrincipalSID ( 
    LPTSTR Principal, 
    PSID *Sid 
    ) 
{ 
    DWORD        sidSize; 
    TCHAR        refDomain [256]; 
    DWORD        refDomainSize; 
    DWORD        returnValue; 
    SID_NAME_USE snu; 
 
    sidSize = 0; 
    refDomainSize = 255; 
 
    LookupAccountName (NULL, 
                       Principal, 
                       *Sid, 
                       &sidSize, 
                       refDomain, 
                       &refDomainSize, 
                       &snu); 
 
    returnValue = GetLastError(); 
    if (returnValue != ERROR_INSUFFICIENT_BUFFER) 
        return returnValue; 
 
    *Sid = (PSID) malloc (sidSize); 
    refDomainSize = 255; 
 
    if (!LookupAccountName (NULL, 
                            Principal, 
                            *Sid, 
                            &sidSize, 
                            refDomain, 
                            &refDomainSize, 
                            &snu)) 
    { 
        return GetLastError(); 
    } 
 
    return ERROR_SUCCESS; 
} 
 
LPTSTR 
SystemMessage ( 
    LPTSTR Buffer, 
    HRESULT hr 
    ) 
{ 
    LPTSTR   message; 
 
    FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                   FORMAT_MESSAGE_FROM_SYSTEM, 
                   NULL, 
                   hr, 
                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
                   (LPTSTR) &message, 
                   0, 
                   NULL); 
 
    wsprintf (Buffer, TEXT("%s(%lx)\n"), message, hr); 
     
    LocalFree (message); 
    return Buffer; 
}