Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

87 lines
2.4 KiB

// PropShellExt.cpp : Implementation of CW3extApp and DLL registration.
#include "stdafx.h"
#include "w3ext.h"
#include "PropShellExt.h"
/////////////////////////////////////////////////////////////////////////////
//
// IShellExtInit Implementation.
STDMETHODIMP
CPropShellExt::Initialize(LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID)
{
if (pDataObj == NULL)
{
ATLASSERT(FALSE);
return (E_INVALIDARG);
}
FORMATETC f = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM m;
HRESULT hr = pDataObj->GetData(&f, &m);
if (FAILED(hr))
{
return(hr);
}
if (1 == DragQueryFile((HDROP)m.hGlobal, (UINT)(-1), NULL,0))
{
TCHAR szFileName[MAX_PATH];
DragQueryFile((HDROP)m.hGlobal, 0, szFileName, sizeof(szFileName));
SHFILEINFO shfi;
SHGetFileInfo(szFileName, 0, &shfi, sizeof(SHFILEINFO), SHGFI_ATTRIBUTES);
if ( (shfi.dwAttributes & (SFGAO_LINK | SFGAO_REMOVABLE)) == 0
&& (shfi.dwAttributes & SFGAO_FILESYSTEM) != 0
)
{
int drive_number, drive_type;
TCHAR szRoot[4];
if ( -1 != (drive_number = PathGetDriveNumber(szFileName))
&& NULL != PathBuildRoot(szRoot, drive_number)
&& DRIVE_REMOTE != (drive_type = GetDriveType(szRoot))
&& DRIVE_NO_ROOT_DIR != drive_type
)
{
StrCpy(m_szFileName, szFileName);
}
}
}
ReleaseStgMedium(&m);
return hr;
}
STDMETHODIMP
CPropShellExt::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
{
// We only add the page if the user has admin priviliges in the metabase.
// The only way to check it now is to try to write something.
// Test key is /LM/W3SVC.
CMetabasePath path(SZ_MBN_WEB);
CMetaKey key(LOCAL_KEY, path,
METADATA_PERMISSION_READ | METADATA_PERMISSION_WRITE
);
if (key.Succeeded() && SUCCEEDED(key.SetValue(MD_ISM_ACCESS_CHECK, 0x0000FFFF)))
{
m_psW3ShellExtProp.SetParentExt(this);
HPROPSHEETPAGE hpage = m_psW3ShellExtProp.Create();
ASSERT(hpage != NULL);
if (NULL != hpage)
{
AddRef();
if (!lpfnAddPage(hpage, lParam))
{
DestroyPropertySheetPage(hpage);
}
}
}
return key.QueryResult();
}
STDMETHODIMP
CPropShellExt::ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam)
{
return E_FAIL;
}