Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / System / Windows / Media / Imaging / PropVariant.cs / 1 / PropVariant.cs
//------------------------------------------------------------------------------
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, All Rights Reserved
//
// File: PropVariant.cs
//
//-----------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using MS.Internal;
using MS.Win32.PresentationCore;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Xml;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Windows.Media.Imaging;
using System.Windows.Media.Composition;
using System.Text;
using MS.Internal.PresentationCore;
using System.Diagnostics.CodeAnalysis;
#pragma warning disable 1634, 1691 // suppressing PreSharp warnings
//
// This class wraps a PROPVARIANT type for interop with the unmanaged metadata APIs. Only
// the capabilities used by this API are supported (so for example, there is no SAFEARRAY, IDispatch,
// general VT_UNKNOWN support, etc.)
//
// The types are mapped to C# types as follows:
//
// byte <=> VT_UI1
// sbyte <=> VT_I1
// char <=> VT_LPSTR (size 1)
// ushort <=> VT_UI2
// short <=> VT_I2
// String <=> VT_LPWSTR
// uint <=> VT_UI4
// int <=> VT_I4
// UInt64 <=> VT_UI8
// Int64 <=> VT_I8
// float <=> VT_R4
// double <=> VT_R8
// Guid <=> VT_CLSID
// bool <=> VT_BOOL
// BitmapMetadata <=> VT_UNKNOWN (IWICMetadataQueryReader)
// BitmapMetadataBlob <=> VT_BLOB
//
// For array types:
//
// byte[] <=> VT_UI1|VT_VECTOR
// sbyte[] <=> VT_I1|VT_VECTOR
// char[] <=> VT_LPSTR (size is length of array - treated as ASCII string) - read back is String, use ToCharArray().
// char[][] <=> VT_LPSTR|VT_VECTOR (array of ASCII strings)
// ushort[] <=> VT_UI2|VT_VECTOR
// short[] <=> VT_I2|VT_VECTOR
// String[] <=> VT_LPWSTR|VT_VECTOR
// uint[] <=> VT_UI4|VT_VECTOR
// int[] <=> VT_I4|VT_VECTOR
// UInt64[] <=> VT_UI8|VT_VECTOR
// Int64[] <=> VT_I8|VT_VECTOR
// float[] <=> VT_R4|VT_VECTOR
// double[] <=> VT_R8|VT_VECTOR
// Guid[] <=> VT_CLSID|VT_VECTOR
// bool[] <=> VT_BOOL|VT_VECTOR
//
namespace System.Windows.Media.Imaging
{
#region PropVariant
[StructLayout(LayoutKind.Sequential, Pack=0)]
internal struct PROPARRAY
{
internal UInt32 cElems;
internal IntPtr pElems;
}
[StructLayout(LayoutKind.Explicit, Pack=1)]
internal struct PROPVARIANT
{
[FieldOffset(0)] internal ushort varType;
[FieldOffset(2)] internal ushort wReserved1;
[FieldOffset(4)] internal ushort wReserved2;
[FieldOffset(6)] internal ushort wReserved3;
[FieldOffset(8)] internal byte bVal;
[FieldOffset(8)] internal sbyte cVal;
[FieldOffset(8)] internal ushort uiVal;
[FieldOffset(8)] internal short iVal;
[FieldOffset(8)] internal UInt32 uintVal;
[FieldOffset(8)] internal Int32 intVal;
[FieldOffset(8)] internal UInt64 ulVal;
[FieldOffset(8)] internal Int64 lVal;
[FieldOffset(8)] internal float fltVal;
[FieldOffset(8)] internal double dblVal;
[FieldOffset(8)] internal short boolVal;
[FieldOffset(8)] internal IntPtr pclsidVal; //this is for GUID ID pointer
[FieldOffset(8)] internal IntPtr pszVal; //this is for ansi string pointer
[FieldOffset(8)] internal IntPtr pwszVal; //this is for Unicode string pointer
[FieldOffset(8)] internal IntPtr punkVal; //this is for punkVal (interface pointer)
[FieldOffset(8)] internal PROPARRAY ca;
[FieldOffset(8)] internal System.Runtime.InteropServices.ComTypes.FILETIME filetime;
///
/// CopyBytes - Poor man's mem copy. Copies cbData from pbFrom to pbTo.
///
/// byte* pointing to the "to" array.
/// int - count of bytes of receiving buffer.
/// byte* pointing to the "from" array.
/// int - count of bytes to copy from buffer.
///
/// Critical - Accesses unmanaged memory for copying
///
[SecurityCritical]
private static unsafe void CopyBytes(
byte* pbTo,
int cbTo,
byte* pbFrom,
int cbFrom
)
{
if (cbFrom>cbTo)
{
throw new InvalidOperationException(SR.Get(SRID.Image_InsufficientBufferSize));
}
byte* pCurFrom = (byte*)pbFrom;
byte* pCurTo = (byte*)pbTo;
for (int i = 0; i < cbFrom; i++)
{
pCurTo[i] = pCurFrom[i];
}
}
///
/// Critical -Accesses unmanaged code
/// TreatAsSafe - inputs are verified or safe
///
[SecurityCritical, SecurityTreatAsSafe]
internal void InitVector(Array array, Type type, VarEnum varEnum)
{
Init(array, type, varEnum | VarEnum.VT_VECTOR);
}
///
/// Critical -Accesses unmanaged code and structure is overlapping in memory
/// TreatAsSafe - inputs are verified or safe
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Init(Array array, Type type, VarEnum vt)
{
varType = (ushort) vt;
ca.cElems = 0;
ca.pElems = IntPtr.Zero;
int length = array.Length;
if (length > 0)
{
long size = Marshal.SizeOf(type) * length;
IntPtr destPtr =IntPtr.Zero;
GCHandle handle = new GCHandle();
try
{
destPtr = Marshal.AllocCoTaskMem((int) size);
handle = GCHandle.Alloc(array, GCHandleType.Pinned);
unsafe
{
CopyBytes((byte *) destPtr, (int)size, (byte *)handle.AddrOfPinnedObject(), (int)size);
}
ca.cElems = (uint)length;
ca.pElems = destPtr;
destPtr = IntPtr.Zero;
}
finally
{
if (handle.IsAllocated)
{
handle.Free();
}
if (destPtr != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(destPtr);
}
}
}
}
///
/// Critical -Accesses unmanaged code and structure is overlapping in memory
/// TreatAsSafe - inputs are verified or safe
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Init(String[] value, bool fAscii)
{
varType = (ushort) (fAscii ? VarEnum.VT_LPSTR : VarEnum.VT_LPWSTR);
varType |= (ushort) VarEnum.VT_VECTOR;
ca.cElems = 0;
ca.pElems = IntPtr.Zero;
int length = value.Length;
if (length > 0)
{
IntPtr destPtr = IntPtr.Zero;
int sizeIntPtr = 0;
unsafe
{
sizeIntPtr = sizeof(IntPtr);
}
long size = sizeIntPtr * length;
int index = 0;
try
{
IntPtr pString = IntPtr.Zero;
destPtr = Marshal.AllocCoTaskMem((int)size);
for (index=0; index
/// Critical -Accesses unmanaged code and structure is overlapping in memory
/// TreatAsSafe - inputs are verified or safe
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Init(object value)
{
if (value == null)
{
varType = (ushort)VarEnum.VT_EMPTY;
}
else if (value is Array)
{
Type type = value.GetType();
if (type == typeof(sbyte[]))
{
InitVector(value as Array, typeof(sbyte), VarEnum.VT_I1);
}
else if (type == typeof(byte[]))
{
InitVector(value as Array, typeof(byte), VarEnum.VT_UI1);
}
else if (value is char[])
{
varType = (ushort) VarEnum.VT_LPSTR;
pszVal = Marshal.StringToCoTaskMemAnsi(new String(value as char[]));
}
else if (value is char[][])
{
char[][] charArray = value as char[][];
String[] strArray = new String[charArray.GetLength(0)];
for (int i=0; i
/// Critical -Accesses unmanaged code and structure is overlapping in memory
/// TreatAsSafe - there are no inputs
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Clear()
{
VarEnum vt = (VarEnum) varType;
if ((vt & VarEnum.VT_VECTOR) != 0 || vt == VarEnum.VT_BLOB)
{
if (ca.pElems != IntPtr.Zero)
{
vt = vt & ~VarEnum.VT_VECTOR;
if (vt == VarEnum.VT_UNKNOWN)
{
IntPtr punkPtr = ca.pElems;
int sizeIntPtr = 0;
unsafe
{
sizeIntPtr = sizeof(IntPtr);
}
for (uint i=0; i
/// Critical -Accesses unmanaged code and structure is overlapping in memory
/// TreatAsSafe - inputs are verified or safe
///
[SecurityCritical, SecurityTreatAsSafe]
internal object ToObject(object syncObject)
{
VarEnum vt = (VarEnum) varType;
if ((vt & VarEnum.VT_VECTOR) != 0)
{
switch (vt & (~VarEnum.VT_VECTOR))
{
case VarEnum.VT_EMPTY:
return null;
case VarEnum.VT_I1:
{
sbyte[] array = new sbyte[ca.cElems];
for (int i=0; i
/// Critical - Accesses a structure that contains overlapping data
/// TreatAsSafe - there are no inputs
///
internal bool RequiresSyncObject
{
[SecurityCritical, SecurityTreatAsSafe]
get
{
return (varType == (ushort) VarEnum.VT_UNKNOWN);
}
}
}
#endregion
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RuntimeConfigLKG.cs
- HotSpot.cs
- ToolStripSettings.cs
- StateItem.cs
- HttpListenerException.cs
- FontStretches.cs
- DataFormats.cs
- System.Data.OracleClient_BID.cs
- HyperLinkField.cs
- LessThanOrEqual.cs
- ActivityExecutionContextCollection.cs
- HandlerBase.cs
- CodeDomLoader.cs
- PointKeyFrameCollection.cs
- IndexingContentUnit.cs
- MissingSatelliteAssemblyException.cs
- PeerNameRegistration.cs
- RelatedImageListAttribute.cs
- HttpConfigurationContext.cs
- WebConfigurationManager.cs
- ProfilePropertySettings.cs
- StylusPoint.cs
- SapiRecognizer.cs
- WmfPlaceableFileHeader.cs
- XmlElement.cs
- HtmlFormParameterWriter.cs
- EnumerableCollectionView.cs
- SqlConnectionPoolGroupProviderInfo.cs
- FrugalMap.cs
- CompositeActivityCodeGenerator.cs
- ConditionalWeakTable.cs
- WebServiceEnumData.cs
- AuthorizationRule.cs
- DispatchChannelSink.cs
- BulletedList.cs
- SendMailErrorEventArgs.cs
- SafeWaitHandle.cs
- MailWriter.cs
- TailCallAnalyzer.cs
- DataBindEngine.cs
- ImageEditor.cs
- Annotation.cs
- Baml2006Reader.cs
- WindowsStatic.cs
- GridLengthConverter.cs
- SafeEventLogWriteHandle.cs
- EventLogInformation.cs
- DiscoveryClientDocuments.cs
- CodeRemoveEventStatement.cs
- HtmlTableRow.cs
- SqlDataReader.cs
- SizeLimitedCache.cs
- RelationshipEndMember.cs
- ISessionStateStore.cs
- GridLength.cs
- TemplateControlCodeDomTreeGenerator.cs
- NameValueConfigurationCollection.cs
- ContainerParagraph.cs
- RemotingConfigParser.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- ResourceKey.cs
- SequentialUshortCollection.cs
- PropertyChangingEventArgs.cs
- DefaultPrintController.cs
- HostingEnvironmentException.cs
- PolyQuadraticBezierSegment.cs
- CharAnimationBase.cs
- ObjectDataSourceStatusEventArgs.cs
- XamlTypeMapper.cs
- ControlBuilderAttribute.cs
- DocumentPageViewAutomationPeer.cs
- ObjectStateManagerMetadata.cs
- MimeReturn.cs
- UserControlBuildProvider.cs
- DelegatingTypeDescriptionProvider.cs
- ImagingCache.cs
- ToolStripProgressBar.cs
- SecurityTokenRequirement.cs
- SymbolMethod.cs
- ResXBuildProvider.cs
- Fx.cs
- SerialPort.cs
- Column.cs
- DataGridViewDataErrorEventArgs.cs
- AuthenticationModuleElementCollection.cs
- Activator.cs
- ConstrainedGroup.cs
- Label.cs
- PackWebResponse.cs
- DbConnectionInternal.cs
- FloaterParaClient.cs
- KeyTime.cs
- TypeInitializationException.cs
- DelegatingChannelListener.cs
- DbCommandTree.cs
- AsyncOperationLifetimeManager.cs
- SortQueryOperator.cs
- XpsDigitalSignature.cs
- ReadContentAsBinaryHelper.cs
- InputBindingCollection.cs