Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / Data / System / Data / Common / SafeNativeMethods.cs / 1 / SafeNativeMethods.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
// [....]
//-----------------------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using System.Runtime.ConstrainedExecution;
namespace System.Data.Common {
[SuppressUnmanagedCodeSecurityAttribute()]
internal static class SafeNativeMethods {
[DllImport(ExternDll.Ole32, SetLastError=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern IntPtr CoTaskMemAlloc(IntPtr cb);
[DllImport(ExternDll.Ole32, SetLastError=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void CoTaskMemFree(IntPtr handle);
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Unicode, PreserveSig=true)]
static internal extern int GetUserDefaultLCID();
#if !ORACLE
[DllImport(ExternDll.Kernel32, PreserveSig=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void ZeroMemory(IntPtr dest, IntPtr length);
#endif
/*[DllImport(ExternDll.Kernel32)]
static internal extern IntPtr InterlockedCompareExchange(
IntPtr Destination, // destination address
IntPtr Exchange, // exchange value
IntPtr Comperand // value to compare
);*/
//
// Using the int versions of the Increment() and Decrement() methods is correct.
// Please check \fx\src\Data\System\Data\Odbc\OdbcHandle.cs for the memory layout.
//
//
// The following casting operations require these three methods to be unsafe. This is
// a workaround for this issue to meet the M1 exit criteria. We need to revisit this in M2.
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal unsafe IntPtr InterlockedExchangePointer(
IntPtr lpAddress,
IntPtr lpValue)
{
IntPtr previousPtr;
IntPtr actualPtr = *(IntPtr *)lpAddress.ToPointer();
do {
previousPtr = actualPtr;
actualPtr = Interlocked.CompareExchange(ref *(IntPtr *)lpAddress.ToPointer(), lpValue, previousPtr);
}
while (actualPtr != previousPtr);
return actualPtr;
}
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getcomputernameex.asp
[DllImport(ExternDll.Kernel32, CharSet = CharSet.Unicode, EntryPoint="GetComputerNameExW", SetLastError=true)]
static internal extern int GetComputerNameEx(int nameType, StringBuilder nameBuffer, ref int bufferSize);
[DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
static internal extern int GetCurrentProcessId();
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true)]
// [DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto)]
static internal extern IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPTStr), In] string moduleName/*lpctstr*/);
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true)]
// [DllImport(ExternDll.Kernel32, CharSet=CharSet.Ansi)]
static internal extern IntPtr GetProcAddress(IntPtr HModule, [MarshalAs(UnmanagedType.LPStr), In] string funcName/*lpcstr*/);
[DllImport(ExternDll.Kernel32)]
internal static extern void GetSystemTimeAsFileTime(out long lpSystemTimeAsFileTime);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern IntPtr LocalAlloc(int flags, IntPtr countOfBytes);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern IntPtr LocalFree(IntPtr handle);
[DllImport(ExternDll.Oleaut32, CharSet=CharSet.Unicode)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern IntPtr SysAllocStringLen(String src, int len); // BSTR
[DllImport(ExternDll.Oleaut32)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
internal static extern void SysFreeString(IntPtr bstr);
// only using this to clear existing error info with null
[DllImport(ExternDll.Oleaut32, CharSet=CharSet.Unicode, PreserveSig=false)]
static private extern void SetErrorInfo(Int32 dwReserved, IntPtr pIErrorInfo);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern int ReleaseSemaphore(IntPtr handle, int releaseCount, IntPtr previousCount);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern int WaitForMultipleObjectsEx(uint nCount, IntPtr lpHandles, bool bWaitAll, uint dwMilliseconds, bool bAlertable);
[DllImport(ExternDll.Kernel32/*, SetLastError=true*/)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern int WaitForSingleObjectEx(IntPtr lpHandles, uint dwMilliseconds, bool bAlertable);
[DllImport(ExternDll.Ole32, PreserveSig=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void PropVariantClear(IntPtr pObject);
[DllImport(ExternDll.Oleaut32, PreserveSig=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void VariantClear(IntPtr pObject);
sealed internal class Wrapper {
private Wrapper() { }
static internal void ClearErrorInfo() { // MDAC 68199
SafeNativeMethods.SetErrorInfo(0, ADP.PtrZero);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
// [....]
//-----------------------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using System.Runtime.ConstrainedExecution;
namespace System.Data.Common {
[SuppressUnmanagedCodeSecurityAttribute()]
internal static class SafeNativeMethods {
[DllImport(ExternDll.Ole32, SetLastError=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern IntPtr CoTaskMemAlloc(IntPtr cb);
[DllImport(ExternDll.Ole32, SetLastError=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void CoTaskMemFree(IntPtr handle);
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Unicode, PreserveSig=true)]
static internal extern int GetUserDefaultLCID();
#if !ORACLE
[DllImport(ExternDll.Kernel32, PreserveSig=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void ZeroMemory(IntPtr dest, IntPtr length);
#endif
/*[DllImport(ExternDll.Kernel32)]
static internal extern IntPtr InterlockedCompareExchange(
IntPtr Destination, // destination address
IntPtr Exchange, // exchange value
IntPtr Comperand // value to compare
);*/
//
// Using the int versions of the Increment() and Decrement() methods is correct.
// Please check \fx\src\Data\System\Data\Odbc\OdbcHandle.cs for the memory layout.
//
//
// The following casting operations require these three methods to be unsafe. This is
// a workaround for this issue to meet the M1 exit criteria. We need to revisit this in M2.
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal unsafe IntPtr InterlockedExchangePointer(
IntPtr lpAddress,
IntPtr lpValue)
{
IntPtr previousPtr;
IntPtr actualPtr = *(IntPtr *)lpAddress.ToPointer();
do {
previousPtr = actualPtr;
actualPtr = Interlocked.CompareExchange(ref *(IntPtr *)lpAddress.ToPointer(), lpValue, previousPtr);
}
while (actualPtr != previousPtr);
return actualPtr;
}
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getcomputernameex.asp
[DllImport(ExternDll.Kernel32, CharSet = CharSet.Unicode, EntryPoint="GetComputerNameExW", SetLastError=true)]
static internal extern int GetComputerNameEx(int nameType, StringBuilder nameBuffer, ref int bufferSize);
[DllImport(ExternDll.Kernel32, CharSet=System.Runtime.InteropServices.CharSet.Auto)]
static internal extern int GetCurrentProcessId();
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true)]
// [DllImport(ExternDll.Kernel32, CharSet=CharSet.Auto)]
static internal extern IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPTStr), In] string moduleName/*lpctstr*/);
[DllImport(ExternDll.Kernel32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true)]
// [DllImport(ExternDll.Kernel32, CharSet=CharSet.Ansi)]
static internal extern IntPtr GetProcAddress(IntPtr HModule, [MarshalAs(UnmanagedType.LPStr), In] string funcName/*lpcstr*/);
[DllImport(ExternDll.Kernel32)]
internal static extern void GetSystemTimeAsFileTime(out long lpSystemTimeAsFileTime);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern IntPtr LocalAlloc(int flags, IntPtr countOfBytes);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern IntPtr LocalFree(IntPtr handle);
[DllImport(ExternDll.Oleaut32, CharSet=CharSet.Unicode)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal static extern IntPtr SysAllocStringLen(String src, int len); // BSTR
[DllImport(ExternDll.Oleaut32)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
internal static extern void SysFreeString(IntPtr bstr);
// only using this to clear existing error info with null
[DllImport(ExternDll.Oleaut32, CharSet=CharSet.Unicode, PreserveSig=false)]
static private extern void SetErrorInfo(Int32 dwReserved, IntPtr pIErrorInfo);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern int ReleaseSemaphore(IntPtr handle, int releaseCount, IntPtr previousCount);
[DllImport(ExternDll.Kernel32, SetLastError=true)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern int WaitForMultipleObjectsEx(uint nCount, IntPtr lpHandles, bool bWaitAll, uint dwMilliseconds, bool bAlertable);
[DllImport(ExternDll.Kernel32/*, SetLastError=true*/)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
static internal extern int WaitForSingleObjectEx(IntPtr lpHandles, uint dwMilliseconds, bool bAlertable);
[DllImport(ExternDll.Ole32, PreserveSig=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void PropVariantClear(IntPtr pObject);
[DllImport(ExternDll.Oleaut32, PreserveSig=false)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
static internal extern void VariantClear(IntPtr pObject);
sealed internal class Wrapper {
private Wrapper() { }
static internal void ClearErrorInfo() { // MDAC 68199
SafeNativeMethods.SetErrorInfo(0, ADP.PtrZero);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SerializerWriterEventHandlers.cs
- FontResourceCache.cs
- IdleTimeoutMonitor.cs
- DataObject.cs
- GridViewItemAutomationPeer.cs
- ServiceObjectContainer.cs
- PagerSettings.cs
- DataGridViewDataErrorEventArgs.cs
- _DigestClient.cs
- UriSection.cs
- PrtCap_Public.cs
- FamilyMap.cs
- Light.cs
- UnsafePeerToPeerMethods.cs
- CallbackValidator.cs
- ItemAutomationPeer.cs
- ActivityBindForm.cs
- EventRouteFactory.cs
- SQLInt64.cs
- StaticSiteMapProvider.cs
- Pen.cs
- SatelliteContractVersionAttribute.cs
- ShapingEngine.cs
- ListViewAutomationPeer.cs
- _ChunkParse.cs
- ContentElementAutomationPeer.cs
- TableItemPatternIdentifiers.cs
- SQLDouble.cs
- DockEditor.cs
- ReflectionPermission.cs
- SamlNameIdentifierClaimResource.cs
- BitmapCache.cs
- HtmlContainerControl.cs
- InheritablePropertyChangeInfo.cs
- ReadOnlyDataSourceView.cs
- BrowserCapabilitiesCompiler.cs
- HyperLinkField.cs
- IDReferencePropertyAttribute.cs
- AssemblyCache.cs
- XmlLanguageConverter.cs
- QilInvokeLateBound.cs
- NullReferenceException.cs
- mediaeventshelper.cs
- CriticalFinalizerObject.cs
- ButtonFieldBase.cs
- SemaphoreSecurity.cs
- ImmutablePropertyDescriptorGridEntry.cs
- BoolExpr.cs
- SqlParameterCollection.cs
- ProcessStartInfo.cs
- CompilationUnit.cs
- JsonObjectDataContract.cs
- SqlFunctionAttribute.cs
- PerformanceCountersElement.cs
- XappLauncher.cs
- RemoteWebConfigurationHost.cs
- MethodBuilderInstantiation.cs
- RtfNavigator.cs
- ContextQuery.cs
- CounterSample.cs
- VersionedStreamOwner.cs
- ResourceDescriptionAttribute.cs
- GregorianCalendarHelper.cs
- TableLayoutSettings.cs
- SafeProcessHandle.cs
- Dynamic.cs
- ActivityWithResultValueSerializer.cs
- SuppressedPackageProperties.cs
- _BasicClient.cs
- HScrollBar.cs
- TwoPhaseCommit.cs
- CustomAttributeSerializer.cs
- GiveFeedbackEvent.cs
- Guid.cs
- XmlCharCheckingReader.cs
- ConnectionOrientedTransportChannelListener.cs
- WindowsSysHeader.cs
- InputReport.cs
- DataSvcMapFileSerializer.cs
- BinaryFormatterWriter.cs
- ZoneLinkButton.cs
- Hashtable.cs
- SpellerStatusTable.cs
- AxisAngleRotation3D.cs
- InfoCardArgumentException.cs
- SamlAdvice.cs
- OleDbStruct.cs
- IssuedTokenServiceCredential.cs
- xamlnodes.cs
- LinkClickEvent.cs
- CodeGotoStatement.cs
- Function.cs
- EdgeModeValidation.cs
- BamlCollectionHolder.cs
- DataRowExtensions.cs
- GPStream.cs
- COM2PropertyBuilderUITypeEditor.cs
- UserPersonalizationStateInfo.cs
- DataControlPagerLinkButton.cs
- ErrorFormatter.cs