Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Net / System / Net / Mail / iisPickupDirectory.cs / 1305376 / iisPickupDirectory.cs
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
using System.Collections;
using System.ComponentModel;
using System.IO;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Security.Authentication;
namespace System.Net.Mail
{
internal enum PropertyName
{
Invalid = 0,
ServerState = 1016,
PickupDirectory = 36880
};
internal enum ServerState
{
Starting = 1,
Started = 2,
Stopping = 3,
Stopped = 4,
Pausing = 5,
Paused = 6,
Continuing = 7,
}
internal enum MBErrors
{
DataNotFound = unchecked( (int)0x800CC801 ), // MD_ERROR_DATA_NOT_FOUND
InvalidVersion = unchecked( (int)0x800CC802 ), // MD_ERROR_INVALID_VERSION
DuplicateNameWarning = unchecked( (int)0x000CC804 ), // MD_WARNING_DUP_NAME
InvalidDataWarning = unchecked( (int)0x000CC805 ), // MD_WARNING_INVALID_DATA
AlreadyExists = unchecked( (int)0x800700B7 ), // RETURNCODETOHRESULT( ERROR_ALREADY_EXISTS )
InvalidParameter = unchecked( (int)0x80070057 ), // E_INVALIDARG
PathNotFound = unchecked( (int)0x80070003 ), // RETURNCODETOHRESULT( ERROR_PATH_NOT_FOUND )
PathBusy = unchecked( (int)0x80070094 ), // RETURNCODETOHRESULT( ERROR_PATH_BUSY )
InsufficientBuffer = unchecked( (int)0x8007007A ), // RETURNCODETOHRESULT( ERROR_INSUFFICIENT_BUFFER )
NoMoreItems = unchecked( (int)0x80070103 ), // RETURNCODETOHRESULT( ERROR_NO_MORE_ITEMS )
AccessDenied = unchecked( (int)0x80070005 ), // RETURNCODETOHRESULT( E_ACCCESS_DENIED )
};
[Flags]
internal enum MBKeyAccess : uint
{
Read = 1,
Write = 2
};
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
internal unsafe struct MetadataRecord
{
internal UInt32 Identifier;
internal UInt32 Attributes;
internal UInt32 UserType;
internal UInt32 DataType;
internal UInt32 DataLen;
internal IntPtr DataBuf;
internal UInt32 DataTag;
};
[StructLayout(LayoutKind.Sequential)]
internal class _METADATA_HANDLE_INFO
{
_METADATA_HANDLE_INFO()
{
dwMDPermissions = 0;
dwMDSystemChangeNumber = 0;
}
internal Int32 dwMDPermissions;
internal Int32 dwMDSystemChangeNumber;
};
#region IMSadminBase itf definitions
///
/// Summary description for Class1.
///
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport, Guid("70b51430-b6ca-11d0-b9b9-00a0c922e750")]
internal interface IMSAdminBase
{
[PreserveSig]
int AddKey(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path
);
[PreserveSig]
int DeleteKey(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path
);
void DeleteChildKeys(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path
);
[PreserveSig]
int EnumKeys(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
StringBuilder Buffer,
int EnumKeyIndex
);
void CopyKey(
IntPtr source,
[MarshalAs(UnmanagedType.LPWStr)] string SourcePath,
IntPtr dest,
[MarshalAs(UnmanagedType.LPWStr)] string DestPath,
bool OverwriteFlag,
bool CopyFlag
);
void RenameKey(
IntPtr key,
[MarshalAs(UnmanagedType.LPWStr)] string path,
[MarshalAs(UnmanagedType.LPWStr)] string newName
);
[PreserveSig]
int SetData(
IntPtr key,
[MarshalAs(UnmanagedType.LPWStr)] string path,
ref MetadataRecord data
);
[PreserveSig]
int GetData(
IntPtr key,
[MarshalAs(UnmanagedType.LPWStr)] string path,
ref MetadataRecord data,
[In, Out] ref uint RequiredDataLen
);
[PreserveSig]
int DeleteData(
IntPtr key,
[MarshalAs(UnmanagedType.LPWStr)] string path,
uint Identifier,
uint DataType
);
[PreserveSig]
int EnumData(
IntPtr key,
[MarshalAs(UnmanagedType.LPWStr)] string path,
ref MetadataRecord data,
int EnumDataIndex,
[In, Out] ref uint RequiredDataLen
);
[PreserveSig]
int GetAllData(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
UInt32 Attributes,
UInt32 UserType,
UInt32 DataType,
[In, Out] ref UInt32 NumDataEntries,
[In, Out] ref UInt32 DataSetNumber,
UInt32 BufferSize,
// [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=7)] out byte[] Buffer,
IntPtr buffer,
[In,Out] ref UInt32 RequiredBufferSize
);
void DeleteAllData(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
uint UserType,
uint DataType
);
[PreserveSig]
int CopyData(
IntPtr sourcehandle,
[MarshalAs(UnmanagedType.LPWStr)] string SourcePath,
IntPtr desthandle,
[MarshalAs(UnmanagedType.LPWStr)] string DestPath,
int Attributes,
int UserType,
int DataType,
[MarshalAs(UnmanagedType.Bool)] bool CopyFlag
);
[PreserveSig]
void GetDataPaths(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
int Identifier,
int DataType,
int BufferSize,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex=4)] out char[] Buffer,
[In, Out, MarshalAs(UnmanagedType.U4)] ref int RequiredBufferSize
);
[PreserveSig]
int OpenKey(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
[MarshalAs(UnmanagedType.U4)] MBKeyAccess AccessRequested,
int TimeOut,
[In, Out] ref IntPtr NewHandle
);
[PreserveSig]
int CloseKey(
IntPtr handle
);
void ChangePermissions(
IntPtr handle,
int TimeOut,
[MarshalAs(UnmanagedType.U4)] MBKeyAccess AccessRequested
);
void SaveData(
);
[PreserveSig]
void GetHandleInfo(
IntPtr handle,
[In, Out] ref _METADATA_HANDLE_INFO Info
);
[PreserveSig]
void GetSystemChangeNumber(
[In, Out, MarshalAs(UnmanagedType.U4)] ref uint SystemChangeNumber
);
[PreserveSig]
void GetDataSetNumber(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
[In, Out] ref uint DataSetNumber
);
[PreserveSig]
void SetLastChangeTime(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
[Out] out System.Runtime.InteropServices.ComTypes.FILETIME LastChangeTime,
bool LocalTime
);
[PreserveSig]
int GetLastChangeTime(
IntPtr handle,
[MarshalAs(UnmanagedType.LPWStr)] string Path,
[In, Out] ref System.Runtime.InteropServices.ComTypes.FILETIME LastChangeTime,
bool LocalTime
);
[PreserveSig]
int KeyExchangePhase1(
);
[PreserveSig]
int KeyExchangePhase2(
);
[PreserveSig]
int Backup(
[MarshalAs(UnmanagedType.LPWStr)] string Location,
int Version,
int Flags
);
[PreserveSig]
int Restore(
[MarshalAs(UnmanagedType.LPWStr)] string Location,
int Version,
int Flags
);
[PreserveSig]
void EnumBackups(
[Out, MarshalAs(UnmanagedType.LPWStr, SizeConst=256)] out string Location,
[Out, MarshalAs(UnmanagedType.U4)] out uint Version,
[Out] out System.Runtime.InteropServices.ComTypes.FILETIME BackupTime,
uint EnumIndex
);
[PreserveSig]
void DeleteBackup(
[MarshalAs(UnmanagedType.LPWStr)] string Location,
int Version
);
[PreserveSig]
int UnmarshalInterface(
[Out] [MarshalAs(UnmanagedType.Interface)] out IMSAdminBase interf
);
[PreserveSig]
int GetServerGuid(
);
}
[ClassInterface(ClassInterfaceType.None)]
[TypeLibType(TypeLibTypeFlags.FCanCreate)]
[ComImport, Guid("a9e69610-b80d-11d0-b9b9-00a0c922e750")]
internal class MSAdminBase
{
}
#endregion
internal enum MBDataType : byte
{
All = 0,
Dword = 1,
String = 2,
Binary = 3,
StringExpand = 4,
MultiString = 5
};
internal enum MBUserType : byte
{
Other = 0,
Asp = 101, // ASP_MD_UT_APP,
File = 2, // IIS_MD_UT_FILE,
Server = 1, // IIS_MD_UT_SERVER,
Wam = 100 // IIS_MD_UT_WAM
};
[SecurityPermission(SecurityAction.Assert, Flags = SecurityPermissionFlag.UnmanagedCode)]
internal static class IisPickupDirectory
{
const int MaxPathSize = 260;
const int InfiniteTimeout = -1;
const int MetadataMaxNameLen = 256;
[ResourceExposure(ResourceScope.Machine)]
[ResourceConsumption(ResourceScope.Machine)]
internal unsafe static string GetPickupDirectory()
{
int hr;
UInt32 reqLength=0;
Int32 serverState;
string pickupDirectory=string.Empty;
IMSAdminBase adminBase = null;
IntPtr ptrKey = IntPtr.Zero;
StringBuilder keySuffix = new StringBuilder(MetadataMaxNameLen);
uint bufferLen = MaxPathSize * 4;
byte[] buffer = new byte[bufferLen];
try {
adminBase = new MSAdminBase() as IMSAdminBase;
hr = adminBase.OpenKey(IntPtr.Zero, "LM/SmtpSvc", MBKeyAccess.Read, InfiniteTimeout, ref ptrKey);
if (hr < 0)
goto Exit;
MetadataRecord rec = new MetadataRecord();
fixed( byte* bufferPtr = buffer)
{
for (int index=0; ; index++)
{
hr = adminBase.EnumKeys(ptrKey, "", keySuffix, index);
if (hr == unchecked((int)MBErrors.NoMoreItems))
break;
if (hr < 0)
goto Exit;
rec.Identifier = (UInt32) PropertyName.ServerState;
rec.Attributes = 0;
rec.UserType = (UInt32) MBUserType.Server;
rec.DataType = (UInt32) MBDataType.Dword;
rec.DataTag = 0;
rec.DataBuf = (IntPtr) bufferPtr;
rec.DataLen = bufferLen;
hr = adminBase.GetData(ptrKey, keySuffix.ToString(), ref rec, ref reqLength);
if (hr < 0)
{
if (hr == unchecked((int)MBErrors.DataNotFound) ||
hr == unchecked((int)MBErrors.AccessDenied))
continue;
else
goto Exit;
}
serverState = Marshal.ReadInt32((IntPtr)bufferPtr);
if (serverState == (Int32) ServerState.Started)
{
rec.Identifier = (UInt32) PropertyName.PickupDirectory;
rec.Attributes = 0;
rec.UserType = (UInt32) MBUserType.Server;
rec.DataType = (UInt32) MBDataType.String;
rec.DataTag = 0;
rec.DataBuf = (IntPtr) bufferPtr;
rec.DataLen = bufferLen;
hr = adminBase.GetData(ptrKey, keySuffix.ToString(), ref rec, ref reqLength);
if (hr < 0)
goto Exit;
pickupDirectory = Marshal.PtrToStringUni((IntPtr)bufferPtr);
break;
}
}
if (hr == unchecked((int)MBErrors.NoMoreItems))
{
for (int index=0; ; index++)
{
hr = adminBase.EnumKeys(ptrKey, "", keySuffix, index);
if (hr == unchecked((int)MBErrors.NoMoreItems))
break;
if (hr < 0)
goto Exit;
rec.Identifier = (UInt32) PropertyName.PickupDirectory;
rec.Attributes = 0;
rec.UserType = (UInt32) MBUserType.Server;
rec.DataType = (UInt32) MBDataType.String;
rec.DataTag = 0;
rec.DataBuf = (IntPtr) bufferPtr;
rec.DataLen = bufferLen;
hr = adminBase.GetData(ptrKey, keySuffix.ToString(), ref rec, ref reqLength);
if (hr < 0)
{
if (hr == unchecked((int)MBErrors.DataNotFound) ||
hr == unchecked((int)MBErrors.AccessDenied))
continue;
else
goto Exit;
}
pickupDirectory = Marshal.PtrToStringUni((IntPtr)bufferPtr);
if (Directory.Exists(pickupDirectory))
break;
else
pickupDirectory = string.Empty;
}
}
}
Exit:
;
}
catch (Exception exception) {
if (exception is SecurityException ||
exception is AuthenticationException ||
exception is SmtpException)
throw;
throw new SmtpException(SR.GetString(SR.SmtpGetIisPickupDirectoryFailed));
}
finally {
if (adminBase != null)
if (ptrKey != IntPtr.Zero)
adminBase.CloseKey(ptrKey);
}
if (pickupDirectory == string.Empty)
throw new SmtpException(SR.GetString(SR.SmtpGetIisPickupDirectoryFailed));
return pickupDirectory;
}
}
}
// 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
- DesignTimeSiteMapProvider.cs
- InputProcessorProfiles.cs
- XMLDiffLoader.cs
- DLinqAssociationProvider.cs
- TextProperties.cs
- ObjectPersistData.cs
- Enum.cs
- StyleCollection.cs
- DataServiceQueryContinuation.cs
- TypeUsage.cs
- ProvidersHelper.cs
- AutomationPattern.cs
- TransferRequestHandler.cs
- OleDbError.cs
- QilScopedVisitor.cs
- ProviderException.cs
- DesignBindingPropertyDescriptor.cs
- DataGridViewCellValueEventArgs.cs
- ConfigXmlComment.cs
- Pkcs7Signer.cs
- XmlnsDictionary.cs
- ConfigXmlWhitespace.cs
- categoryentry.cs
- documentsequencetextview.cs
- ProfileSettings.cs
- ProcessingInstructionAction.cs
- RepeatBehavior.cs
- FontFamily.cs
- RuntimeConfigLKG.cs
- AttributeTable.cs
- StyleSheetRefUrlEditor.cs
- InternalMappingException.cs
- SoapSchemaImporter.cs
- StoryFragments.cs
- ModelPropertyDescriptor.cs
- CircleHotSpot.cs
- WebChannelFactory.cs
- BitStack.cs
- SchemaNamespaceManager.cs
- XmlElementCollection.cs
- DesignerActionUIStateChangeEventArgs.cs
- SqlParameterizer.cs
- HtmlTableCell.cs
- DataGridTableCollection.cs
- SeverityFilter.cs
- QuaternionRotation3D.cs
- GPPOINTF.cs
- PropertyGeneratedEventArgs.cs
- FunctionMappingTranslator.cs
- CultureInfoConverter.cs
- Native.cs
- StreamUpgradeBindingElement.cs
- RemotingAttributes.cs
- ConfigsHelper.cs
- PeerConnector.cs
- CollectionExtensions.cs
- TableLayoutPanel.cs
- RIPEMD160.cs
- ResourceExpressionBuilder.cs
- LineVisual.cs
- CustomCategoryAttribute.cs
- HitTestResult.cs
- TableDesigner.cs
- Tuple.cs
- XamlBuildTaskServices.cs
- InternalPermissions.cs
- Highlights.cs
- NotifyIcon.cs
- UITypeEditors.cs
- CharKeyFrameCollection.cs
- TraceUtils.cs
- ISAPIRuntime.cs
- MasterPage.cs
- ListControl.cs
- EnumerationRangeValidationUtil.cs
- OleDbException.cs
- EntitySetDataBindingList.cs
- XmlSchemaSimpleContentRestriction.cs
- WebConfigurationFileMap.cs
- KeyEventArgs.cs
- HashHelper.cs
- SQLMoneyStorage.cs
- XmlEnumAttribute.cs
- PasswordRecovery.cs
- _SafeNetHandles.cs
- RewritingValidator.cs
- ResourceExpression.cs
- Missing.cs
- HitTestWithGeometryDrawingContextWalker.cs
- OdbcReferenceCollection.cs
- ComPlusDiagnosticTraceRecords.cs
- XsltContext.cs
- Geometry3D.cs
- DependencyProperty.cs
- HtmlHead.cs
- CLSCompliantAttribute.cs
- FontInfo.cs
- CmsInterop.cs
- ServiceDescriptionData.cs
- ServiceModelActivity.cs