singrdk/base/Libraries/Singularity.V1/Security/PrincipalHandle.cs

84 lines
2.9 KiB
C#
Raw Normal View History

2008-03-05 09:52:00 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity - Singularity ABI
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: PrincipalHandle.cs
//
// Note:
//
using System;
using System.Runtime.CompilerServices;
namespace Microsoft.Singularity.V1.Security
{
public struct PrincipalHandle
{
public readonly long val;
2008-11-17 18:29:00 -05:00
private const int DefaultPrincipalSize = 200;
private const int DefaultAclIndirectSize = 512;
2008-03-05 09:52:00 -05:00
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern PrincipalHandle SelfPrincipalHandle();
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe int GetPrincipalNameImpl(PrincipalHandle handle,
/*[out]*/ char *outName, int outNameLength);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe int ExpandAclIndirectionImpl(
/*[in]*/ char *name, int nameLength,
/*[out]*/ char *outText, int outTextLength);
public static unsafe string GetPrincipalName(PrincipalHandle handle)
{
int size = DefaultPrincipalSize;
for (;;) {
char[] name = new char[size];
fixed (char *namePtr = &name[0]) {
int len = GetPrincipalNameImpl(handle, namePtr, size);
if (len >= 0)
return String.StringCTOR(name, 0, len);
size = -len;
}
}
}
public static unsafe string ExpandAclIndirection(string name)
{
if (name == null)
return null;
int size = DefaultAclIndirectSize;
// convert string to char* and length
char [] strChar = new char[name.Length];
name.CopyTo(0, strChar, 0, name.Length);
fixed (char *inname = &strChar[0]) {
for (;;) {
char[] result = new char[size];
fixed (char *resultPtr = &result[0]) {
int len = ExpandAclIndirectionImpl(inname, name.Length, resultPtr, size);
if (len == 0)
return null;
if (len > 0)
return String.StringCTOR(result, 0, len);
size = -len;
}
}
}
}
}
}