Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Data / System / Data / SqlClient / TdsParserStaticMethods.cs / 1305376 / TdsParserStaticMethods.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //----------------------------------------------------------------------------- namespace System.Data.SqlClient { using System; using System.Data.Common; using System.Data.ProviderBase; using System.Data.Sql; using System.Data.SqlTypes; using System.Diagnostics; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using System.Runtime.Versioning; internal sealed class TdsParserStaticMethods { private TdsParserStaticMethods() { /* prevent utility class from being insantiated*/ } // // Static methods // // SxS: this method accesses registry to resolve the alias. [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] static internal void AliasRegistryLookup(ref string host, ref string protocol) { if (!ADP.IsEmpty(host)) { const String folder = "SOFTWARE\\Microsoft\\MSSQLServer\\Client\\ConnectTo"; // Put a try...catch... around this so we don't abort ANY connection if we can't read the registry. string aliasLookup = (string) ADP.LocalMachineRegistryValue(folder, host); if (!ADP.IsEmpty(aliasLookup)) { /* Result will be in the form of: "DBNMPNTW,\\blained1\pipe\sql\query". or Result will be in the form of: "DBNETLIB, via:\\blained1\pipe\sql\query". supported formats: tcp - DBMSSOCN,[server|server\instance][,port] np - DBNMPNTW,[\\server\pipe\sql\query | \\server\pipe\MSSQL$instance\sql\query] where \sql\query is the pipename and can be replaced with any other pipe name via - [DBMSGNET,server,port | DBNETLIB, via:server, port] sm - DBMSLPCN,server unsupported formats: rpc - DBMSRPCN,server,[parameters] where parameters could be "username,password" bv - DBMSVINN,service@group@organization appletalk - DBMSADSN,objectname@zone spx - DBMSSPXN,[service | address,port,network] */ // We must parse into the two component pieces, then map the first protocol piece to the // appropriate value. int index = aliasLookup.IndexOf(','); // If we found the key, but there was no "," in the string, it is a bad Alias so return. if (-1 != index) { string parsedProtocol = aliasLookup.Substring(0, index).ToLower(CultureInfo.InvariantCulture); // If index+1 >= length, Alias consisted of "FOO," which is a bad alias so return. if (index+1 < aliasLookup.Length) { string parsedAliasName = aliasLookup.Substring(index+1); // Fix bug 298286 if ("dbnetlib" == parsedProtocol) { index = parsedAliasName.IndexOf(':'); if (-1 != index && index + 1 < parsedAliasName.Length) { parsedProtocol = parsedAliasName.Substring (0, index); if (SqlConnectionString.ValidProtocal (parsedProtocol)) { protocol = parsedProtocol; host = parsedAliasName.Substring(index + 1); } } } else { protocol = (string)SqlConnectionString.NetlibMapping()[parsedProtocol]; if (null != protocol) { host = parsedAliasName; } } } } } } } static internal Byte[] EncryptPassword(string password) { Byte[] bEnc = new Byte[password.Length << 1]; int s; byte bLo; byte bHi; for (int i = 0; i < password.Length; i ++) { s = (int) password[i]; bLo = (byte) (s & 0xff); bHi = (byte) ((s >> 8) & 0xff); bEnc[i<<1] = (Byte) ( (((bLo & 0x0f) << 4) | (bLo >> 4)) ^ 0xa5 ); bEnc[(i<<1)+1] = (Byte) ( (((bHi & 0x0f) << 4) | (bHi >> 4)) ^ 0xa5); } return bEnc; } [ResourceExposure(ResourceScope.None)] // SxS: we use this method for TDS login only [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] static internal int GetCurrentProcessIdForTdsLoginOnly() { return SafeNativeMethods.GetCurrentProcessId(); } [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.UnmanagedCode)] [ResourceExposure(ResourceScope.None)] // SxS: we use this method for TDS login only [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] static internal Int32 GetCurrentThreadIdForTdsLoginOnly() { #pragma warning disable 618 return AppDomain.GetCurrentThreadId(); // don't need this to be support fibres; #pragma warning restore 618 } [ResourceExposure(ResourceScope.None)] // SxS: we use MAC address for TDS login only [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] static internal byte[] GetNetworkPhysicalAddressForTdsLoginOnly() { // NIC address is stored in NetworkAddress key. However, if NetworkAddressLocal key // has a value that is not zero, then we cannot use the NetworkAddress key and must // instead generate a random one. I do not fully understand why, this is simply what // the native providers do. As for generation, I use a random number generator, which // means that different processes on the same machine will have different NIC address // values on the server. It is not ideal, but native does not have the same value for // different processes either. const string key = "NetworkAddress"; const string localKey = "NetworkAddressLocal"; const string folder = "SOFTWARE\\Description\\Microsoft\\Rpc\\UuidTemporaryData"; int result = 0; byte[] nicAddress = null; object temp = ADP.LocalMachineRegistryValue(folder, localKey); if (temp is int) { result = (int) temp; } if (result <= 0) { temp = ADP.LocalMachineRegistryValue(folder, key); if (temp is byte[]) { nicAddress = (byte[]) temp; } } if (null == nicAddress) { nicAddress = new byte[TdsEnums.MAX_NIC_SIZE]; Random random = new Random(); random.NextBytes(nicAddress); } return nicAddress; } // translates remaining time in stateObj (from user specified timeout) to timout value for SNI static internal Int32 GetTimeoutMilliseconds(long timeoutTime) { // User provided timeout t | timeout value for SNI | meaning // ------------------------+-----------------------+------------------------------ // t == long.MaxValue | -1 | infinite timeout (no timeout) // t>0 && tint.MaxValue | int.MaxValue | must not exceed int.MaxValue if (Int64.MaxValue == timeoutTime) { return -1; // infinite timeout } long msecRemaining = ADP.TimerRemainingMilliseconds(timeoutTime); if (msecRemaining < 0) { return 0; } if (msecRemaining > (long)Int32.MaxValue) { return Int32.MaxValue; } return (Int32)msecRemaining; } static internal long GetTimeoutSeconds(int timeoutSeconds) { long result; if (0 == timeoutSeconds) { result = Int64.MaxValue; // no timeout... } else { long ticksNow = ADP.TimerCurrent(); result = ticksNow + ADP.TimerFromSeconds(timeoutSeconds); } return result; } static internal bool TimeoutHasExpired(long timeoutTime) { bool result = false; if (0 != timeoutTime && Int64.MaxValue != timeoutTime) { result = ADP.TimerHasExpired(timeoutTime); } return result; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //[....] //----------------------------------------------------------------------------- namespace System.Data.SqlClient { using System; using System.Data.Common; using System.Data.ProviderBase; using System.Data.Sql; using System.Data.SqlTypes; using System.Diagnostics; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using System.Runtime.Versioning; internal sealed class TdsParserStaticMethods { private TdsParserStaticMethods() { /* prevent utility class from being insantiated*/ } // // Static methods // // SxS: this method accesses registry to resolve the alias. [ResourceExposure(ResourceScope.None)] [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] static internal void AliasRegistryLookup(ref string host, ref string protocol) { if (!ADP.IsEmpty(host)) { const String folder = "SOFTWARE\\Microsoft\\MSSQLServer\\Client\\ConnectTo"; // Put a try...catch... around this so we don't abort ANY connection if we can't read the registry. string aliasLookup = (string) ADP.LocalMachineRegistryValue(folder, host); if (!ADP.IsEmpty(aliasLookup)) { /* Result will be in the form of: "DBNMPNTW,\\blained1\pipe\sql\query". or Result will be in the form of: "DBNETLIB, via:\\blained1\pipe\sql\query". supported formats: tcp - DBMSSOCN,[server|server\instance][,port] np - DBNMPNTW,[\\server\pipe\sql\query | \\server\pipe\MSSQL$instance\sql\query] where \sql\query is the pipename and can be replaced with any other pipe name via - [DBMSGNET,server,port | DBNETLIB, via:server, port] sm - DBMSLPCN,server unsupported formats: rpc - DBMSRPCN,server,[parameters] where parameters could be "username,password" bv - DBMSVINN,service@group@organization appletalk - DBMSADSN,objectname@zone spx - DBMSSPXN,[service | address,port,network] */ // We must parse into the two component pieces, then map the first protocol piece to the // appropriate value. int index = aliasLookup.IndexOf(','); // If we found the key, but there was no "," in the string, it is a bad Alias so return. if (-1 != index) { string parsedProtocol = aliasLookup.Substring(0, index).ToLower(CultureInfo.InvariantCulture); // If index+1 >= length, Alias consisted of "FOO," which is a bad alias so return. if (index+1 < aliasLookup.Length) { string parsedAliasName = aliasLookup.Substring(index+1); // Fix bug 298286 if ("dbnetlib" == parsedProtocol) { index = parsedAliasName.IndexOf(':'); if (-1 != index && index + 1 < parsedAliasName.Length) { parsedProtocol = parsedAliasName.Substring (0, index); if (SqlConnectionString.ValidProtocal (parsedProtocol)) { protocol = parsedProtocol; host = parsedAliasName.Substring(index + 1); } } } else { protocol = (string)SqlConnectionString.NetlibMapping()[parsedProtocol]; if (null != protocol) { host = parsedAliasName; } } } } } } } static internal Byte[] EncryptPassword(string password) { Byte[] bEnc = new Byte[password.Length << 1]; int s; byte bLo; byte bHi; for (int i = 0; i < password.Length; i ++) { s = (int) password[i]; bLo = (byte) (s & 0xff); bHi = (byte) ((s >> 8) & 0xff); bEnc[i<<1] = (Byte) ( (((bLo & 0x0f) << 4) | (bLo >> 4)) ^ 0xa5 ); bEnc[(i<<1)+1] = (Byte) ( (((bHi & 0x0f) << 4) | (bHi >> 4)) ^ 0xa5); } return bEnc; } [ResourceExposure(ResourceScope.None)] // SxS: we use this method for TDS login only [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] static internal int GetCurrentProcessIdForTdsLoginOnly() { return SafeNativeMethods.GetCurrentProcessId(); } [SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.UnmanagedCode)] [ResourceExposure(ResourceScope.None)] // SxS: we use this method for TDS login only [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)] static internal Int32 GetCurrentThreadIdForTdsLoginOnly() { #pragma warning disable 618 return AppDomain.GetCurrentThreadId(); // don't need this to be support fibres; #pragma warning restore 618 } [ResourceExposure(ResourceScope.None)] // SxS: we use MAC address for TDS login only [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)] static internal byte[] GetNetworkPhysicalAddressForTdsLoginOnly() { // NIC address is stored in NetworkAddress key. However, if NetworkAddressLocal key // has a value that is not zero, then we cannot use the NetworkAddress key and must // instead generate a random one. I do not fully understand why, this is simply what // the native providers do. As for generation, I use a random number generator, which // means that different processes on the same machine will have different NIC address // values on the server. It is not ideal, but native does not have the same value for // different processes either. const string key = "NetworkAddress"; const string localKey = "NetworkAddressLocal"; const string folder = "SOFTWARE\\Description\\Microsoft\\Rpc\\UuidTemporaryData"; int result = 0; byte[] nicAddress = null; object temp = ADP.LocalMachineRegistryValue(folder, localKey); if (temp is int) { result = (int) temp; } if (result <= 0) { temp = ADP.LocalMachineRegistryValue(folder, key); if (temp is byte[]) { nicAddress = (byte[]) temp; } } if (null == nicAddress) { nicAddress = new byte[TdsEnums.MAX_NIC_SIZE]; Random random = new Random(); random.NextBytes(nicAddress); } return nicAddress; } // translates remaining time in stateObj (from user specified timeout) to timout value for SNI static internal Int32 GetTimeoutMilliseconds(long timeoutTime) { // User provided timeout t | timeout value for SNI | meaning // ------------------------+-----------------------+------------------------------ // t == long.MaxValue | -1 | infinite timeout (no timeout) // t>0 && tint.MaxValue | int.MaxValue | must not exceed int.MaxValue if (Int64.MaxValue == timeoutTime) { return -1; // infinite timeout } long msecRemaining = ADP.TimerRemainingMilliseconds(timeoutTime); if (msecRemaining < 0) { return 0; } if (msecRemaining > (long)Int32.MaxValue) { return Int32.MaxValue; } return (Int32)msecRemaining; } static internal long GetTimeoutSeconds(int timeoutSeconds) { long result; if (0 == timeoutSeconds) { result = Int64.MaxValue; // no timeout... } else { long ticksNow = ADP.TimerCurrent(); result = ticksNow + ADP.TimerFromSeconds(timeoutSeconds); } return result; } static internal bool TimeoutHasExpired(long timeoutTime) { bool result = false; if (0 != timeoutTime && Int64.MaxValue != timeoutTime) { result = ADP.TimerHasExpired(timeoutTime); } return result; } } } // 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
- HScrollProperties.cs
- SequentialActivityDesigner.cs
- PlanCompiler.cs
- GifBitmapEncoder.cs
- SystemFonts.cs
- TypeGeneratedEventArgs.cs
- DependencyObjectPropertyDescriptor.cs
- DataContract.cs
- KeyNotFoundException.cs
- NamespaceList.cs
- Form.cs
- FieldNameLookup.cs
- ObjectReferenceStack.cs
- CodeCastExpression.cs
- BindValidator.cs
- TreeNodeStyle.cs
- ChineseLunisolarCalendar.cs
- SelectionChangedEventArgs.cs
- ArgumentException.cs
- TransformConverter.cs
- CodePropertyReferenceExpression.cs
- LoadRetryAsyncResult.cs
- CommentEmitter.cs
- Facet.cs
- LocationChangedEventArgs.cs
- SystemEvents.cs
- DocumentManager.cs
- GetReadStreamResult.cs
- SqlDataSourceQueryEditorForm.cs
- SubMenuStyleCollection.cs
- FileDataSourceCache.cs
- SetStoryboardSpeedRatio.cs
- ScriptingAuthenticationServiceSection.cs
- ToolStripRendererSwitcher.cs
- DisplayInformation.cs
- SHA512Managed.cs
- AtomMaterializer.cs
- XPathDocumentNavigator.cs
- SourceFileBuildProvider.cs
- ConfigXmlWhitespace.cs
- SqlDeflator.cs
- Converter.cs
- Int32Collection.cs
- PolicyUnit.cs
- PrintPreviewControl.cs
- BooleanAnimationUsingKeyFrames.cs
- DSASignatureFormatter.cs
- DockPanel.cs
- FreezableDefaultValueFactory.cs
- XomlCompilerParameters.cs
- InvalidDocumentContentsException.cs
- XmlEncodedRawTextWriter.cs
- OAVariantLib.cs
- ADRoleFactory.cs
- StreamDocument.cs
- SystemUdpStatistics.cs
- TextFormatterContext.cs
- TextBoxRenderer.cs
- PerformanceCountersElement.cs
- HierarchicalDataBoundControl.cs
- DataAccessor.cs
- MailAddressCollection.cs
- ValidationEventArgs.cs
- DispatchWrapper.cs
- EntitySetDataBindingList.cs
- DecoderFallbackWithFailureFlag.cs
- CacheAxisQuery.cs
- TargetPerspective.cs
- XmlNotation.cs
- FullTextBreakpoint.cs
- ColorTransform.cs
- StandardOleMarshalObject.cs
- TripleDES.cs
- GPPOINTF.cs
- SimpleHandlerFactory.cs
- LocatorManager.cs
- RtfToXamlLexer.cs
- MetadataHelper.cs
- parserscommon.cs
- ListSourceHelper.cs
- UserInitiatedNavigationPermission.cs
- CompiledIdentityConstraint.cs
- TreeView.cs
- DocumentScope.cs
- EntityAdapter.cs
- Transform3D.cs
- DataRowChangeEvent.cs
- SpotLight.cs
- graph.cs
- XamlFrame.cs
- PlainXmlWriter.cs
- KeyEvent.cs
- FlagsAttribute.cs
- PersonalizationStateQuery.cs
- _NtlmClient.cs
- ICspAsymmetricAlgorithm.cs
- AuthenticateEventArgs.cs
- DataGridViewIntLinkedList.cs
- BamlLocalizationDictionary.cs
- InstanceCompleteException.cs