windows-nt/Source/XPSP1/NT/net/ias/mmc/nap/textsid.cpp
2020-09-26 16:20:57 +08:00

186 lines
5 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// textsid.c
//
// SYNOPSIS
//
// This file defines functions for converting Security Indentifiers (SIDs)
// to and from a textual representation.
//
// MODIFICATION HISTORY
//
// 01/18/1998 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#define IAS_LEAN_AND_MEAN
#include "precompiled.h"
#include <ias.h>
#include <stdio.h>
#include "textsid.h"
DWORD
WINAPI
IASSidToTextW(
IN PSID pSid,
OUT PWSTR szTextualSid,
IN OUT PDWORD pdwBufferLen
)
{
PSID_IDENTIFIER_AUTHORITY psia;
DWORD dwSubAuthorities;
DWORD dwSidRev=SID_REVISION;
DWORD dwCounter;
DWORD dwSidSize;
// Ensure input parameters are valid.
if ((szTextualSid == NULL && pdwBufferLen != 0) || !IsValidSid(pSid))
{
return ERROR_INVALID_PARAMETER;
}
// obtain SidIdentifierAuthority
psia=GetSidIdentifierAuthority(pSid);
// obtain SidSubSuthority count
dwSubAuthorities=*GetSidSubAuthorityCount(pSid);
//////////
// compute buffer length
// S-SID_REVISION- + identifierauthority- + subauthorities- + NULL
//////////
dwSidSize=(15 + 12 + (12 * dwSubAuthorities) + 1);
//////////
// check provided buffer length.
// If not large enough, indicate proper size and return error.
//////////
if (*pdwBufferLen < dwSidSize)
{
*pdwBufferLen = dwSidSize;
return ERROR_INSUFFICIENT_BUFFER;
}
//////////
// prepare S-SID_REVISION-
//////////
dwSidSize=swprintf(szTextualSid, L"S-%lu-", dwSidRev );
//////////
// prepare SidIdentifierAuthority
//////////
if ( (psia->Value[0] != 0) || (psia->Value[1] != 0) )
{
dwSidSize+=swprintf(szTextualSid + lstrlenW(szTextualSid),
L"0x%02hx%02hx%02hx%02hx%02hx%02hx",
(USHORT)psia->Value[0],
(USHORT)psia->Value[1],
(USHORT)psia->Value[2],
(USHORT)psia->Value[3],
(USHORT)psia->Value[4],
(USHORT)psia->Value[5]);
}
else
{
dwSidSize+=swprintf(szTextualSid + wcslen(szTextualSid),
L"%lu",
(ULONG)(psia->Value[5] ) +
(ULONG)(psia->Value[4] << 8) +
(ULONG)(psia->Value[3] << 16) +
(ULONG)(psia->Value[2] << 24) );
}
//////////
// loop through SidSubAuthorities
//////////
for (dwCounter=0 ; dwCounter < dwSubAuthorities ; dwCounter++)
{
dwSidSize+=swprintf(szTextualSid + dwSidSize,
L"-%lu",
*GetSidSubAuthority(pSid, dwCounter));
}
return NO_ERROR;
}
DWORD
WINAPI
IASSidFromTextW(
IN PCWSTR szTextualSid,
OUT PSID *pSid
)
{
DWORDLONG rawsia;
DWORD revision;
DWORD subAuth[8];
SID_IDENTIFIER_AUTHORITY sia;
int fields;
if (szTextualSid == NULL || pSid == NULL)
{
return ERROR_INVALID_PARAMETER;
}
//////////
// Scan the input string.
//////////
fields = swscanf(szTextualSid,
L"S-%lu-%I64u-%lu-%lu-%lu-%lu-%lu-%lu-%lu-%lu",
&revision,
&rawsia,
subAuth,
subAuth + 1,
subAuth + 2,
subAuth + 3,
subAuth + 4,
subAuth + 5,
subAuth + 6,
subAuth + 7);
//////////
// We must have at least three fields (revision, identifier authority, and
// at least one sub authority), the current revision, and a 48-bit SIA.
//////////
if (fields < 3 || revision != SID_REVISION || rawsia > 0xffffffffffffI64)
{
return ERROR_INVALID_PARAMETER;
}
//////////
// Pack the SID_IDENTIFIER_AUTHORITY.
//////////
sia.Value[0] = (UCHAR)((rawsia >> 40) & 0xff);
sia.Value[1] = (UCHAR)((rawsia >> 32) & 0xff);
sia.Value[2] = (UCHAR)((rawsia >> 24) & 0xff);
sia.Value[3] = (UCHAR)((rawsia >> 16) & 0xff);
sia.Value[4] = (UCHAR)((rawsia >> 8) & 0xff);
sia.Value[5] = (UCHAR)((rawsia ) & 0xff);
//////////
// Allocate the SID. Must be freed through FreeSid().
//////////
if (!AllocateAndInitializeSid(&sia,
(BYTE)(fields - 2),
subAuth[0],
subAuth[1],
subAuth[2],
subAuth[3],
subAuth[4],
subAuth[5],
subAuth[6],
subAuth[7],
pSid))
{
return GetLastError();
}
return NO_ERROR;
}