diff --git a/PInvoke/Shell32/ShObjIdl.IStorageProviderXX.cs b/PInvoke/Shell32/ShObjIdl.IStorageProviderXX.cs
new file mode 100644
index 00000000..c858c35b
--- /dev/null
+++ b/PInvoke/Shell32/ShObjIdl.IStorageProviderXX.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Vanara.PInvoke
+{
+ public static partial class Shell32
+ {
+ /// Undocumented.
+ [ComImport, Guid("5efb46d7-47C0-4b68-acda-ded47c90ec91"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), CoClass(typeof(StorageProviderBanners))]
+ public interface IStorageProviderBanners
+ {
+ /// [Undocumented] Sets the banner.
+ /// The provider identity.
+ /// The subscription identifier.
+ /// The content identifier.
+ /// Returns S_OK if successful, or an error code otherwise.
+ HRESULT SetBanner([MarshalAs(UnmanagedType.LPWStr)] string providerIdentity,
+ [MarshalAs(UnmanagedType.LPWStr)] string subscriptionId, [MarshalAs(UnmanagedType.LPWStr)] string contentId);
+
+ /// [Undocumented] Clears the banner.
+ /// The provider identity.
+ /// The subscription identifier.
+ /// Returns S_OK if successful, or an error code otherwise.
+ HRESULT ClearBanner([MarshalAs(UnmanagedType.LPWStr)] string providerIdentity,
+ [MarshalAs(UnmanagedType.LPWStr)] string subscriptionId);
+
+ /// [Undocumented] Clears all banners.
+ /// The provider identity.
+ /// Returns S_OK if successful, or an error code otherwise.
+ HRESULT ClearAllBanners([MarshalAs(UnmanagedType.LPWStr)] string providerIdentity);
+
+ /// [Undocumented] Gets the banner.
+ /// The provider identity.
+ /// The subscription identifier.
+ /// The content identifier.
+ /// Returns S_OK if successful, or an error code otherwise.
+ HRESULT GetBanner([MarshalAs(UnmanagedType.LPWStr)] string providerIdentity,
+ [MarshalAs(UnmanagedType.LPWStr)] string subscriptionId, [MarshalAs(UnmanagedType.LPWStr)] out string contentId);
+ }
+
+ ///
+ /// Exposes a method that determines whether the Shell will be allowed to move, copy, delete, or rename a folder in a cloud
+ /// provider's sync root.
+ ///
+ // https://docs.microsoft.com/en-us/windows/win32/shell/nn-shobjidl-istorageprovidercopyhook
+ [PInvokeData("shobjidl.h")]
+ [ComImport, Guid("7bf992a9-af7a-4dba-b2e5-4d080b1ecbc6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IStorageProviderCopyHook
+ {
+ ///
+ /// Determines whether the Shell will be allowed to move, copy, delete, or rename a folder in a cloud provider's sync root.
+ ///
+ ///
+ /// A handle to the window that the copy hook handler should use as the parent for any user interface elements the handler may
+ /// need to display. If FOF_SILENT is specified in operation, the method should ignore this parameter.
+ ///
+ ///
+ /// The operation to perform. This parameter can be one of the values listed under the member.
+ ///
+ ///
+ ///
+ /// The flags that control the operation. This parameter can be one or more of the values listed under the the member.
+ ///
+ /// For printer copy hooks, this value is one of the following values defined in shellapi.h.
+ ///
+ ///
+ /// Value
+ /// Description
+ ///
+ /// -
+ /// PO_DELETE
+ /// A printer is being deleted. The srcFile parameter points to the full path to the specified printer.
+ ///
+ /// -
+ /// PO_RENAME
+ ///
+ /// A printer is being renamed. The srcFile parameter points to the printer's new name. The destFile parameter points to the old name.
+ ///
+ ///
+ /// -
+ /// PO_PORTCHANGE
+ /// Not supported. Do not use.
+ ///
+ /// -
+ /// PO_REN_PORT
+ /// Not supported. Do not use.
+ ///
+ ///
+ ///
+ /// A pointer to a string that contains the name of the source folder.
+ ///
+ /// [in]
+ ///
+ ///
+ /// The attributes of the source folder. This parameter can be a combination of any of the file attribute flags
+ /// (FILE_ATTRIBUTE_*) defined in the header files. See File Attribute Constants.
+ ///
+ ///
+ ///
+ ///
+ /// [in]
+ ///
+ /// A pointer to a string that contains the name of the destination folder.
+ ///
+ ///
+ ///
+ /// [in]
+ ///
+ ///
+ /// The attributes of the destination folder. This parameter can be a combination of any of the file attribute flags
+ /// (FILE_ATTRIBUTE_*) defined in the header files. See File Attribute Constants.
+ ///
+ ///
+ ///
+ ///
+ /// [out]
+ ///
+ /// The integer value that indicates whether the Shell should perform the operation. One of the following:
+ ///
+ ///
+ /// Returns S_OK if successful, or an error code otherwise.
+ ///
+ ///
+ /// The Shell calls the cloud provider's copy hook handler for every folder under the registered sync root. To register a copy
+ /// hook handler for cloud folders, set the CopyHook value under the
+ /// HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Explorer/SyncRootManager/{SyncRootId} key to the CLSID
+ /// of the copy hook object.
+ ///
+ ///
+ /// When the CopyCallback method is called, the Shell initializes the IStorageProviderCopyHook interface directly without
+ /// using an IShellExtInit interface first.
+ ///
+ ///
+ // https://docs.microsoft.com/en-us/windows/win32/shell/nf-shobjidl-istorageprovidercopyhook-copycallback
+ [PreserveSig]
+ HRESULT CopyCallback([Optional] HWND hwnd, ShellFileOperation operation, FILEOP_FLAGS flags, [MarshalAs(UnmanagedType.LPWStr)] string srcFile,
+ FileFlagsAndAttributes srcAttribs, [Optional, MarshalAs(UnmanagedType.LPWStr)] string destFile, FileFlagsAndAttributes destAttribs,
+ out User32.MB_RESULT result);
+ }
+
+ /// CLSID_StorageProviderBanners
+ [ComImport, Guid("7CCDF9F4-E576-455A-8BC7-F6EC68D6F063"), ClassInterface(ClassInterfaceType.None)]
+ public class StorageProviderBanners { }
+ }
+}
\ No newline at end of file