protected Token ReadToken(string targetName)
{
Token token = null;
IntPtr credPtr = IntPtr.Zero;
try
{
if (NativeMethods.CredRead(targetName, NativeMethods.CredentialType.Generic, 0, out credPtr))
{
NativeMethods.Credential credStruct = (NativeMethods.Credential)Marshal.PtrToStructure(credPtr, typeof(NativeMethods.Credential));
if (credStruct.CredentialBlob != null && credStruct.CredentialBlobSize > 0)
{
int size = (int)credStruct.CredentialBlobSize;
byte[] bytes = new byte[size];
Marshal.Copy(credStruct.CredentialBlob, bytes, 0, size);
TokenType type;
if (Token.GetTypeFromFriendlyName(credStruct.UserName, out type))
{
Token.Deserialize(bytes, type, out token);
}
Git.Trace.WriteLine($"token for '{targetName}' read from store.");
}
}
}
finally
{
if (credPtr != IntPtr.Zero)
{
NativeMethods.CredFree(credPtr);
}
}
return(token);
}