357 lines
12 KiB
C++
357 lines
12 KiB
C++
// filemgmt.cpp : Implementation of DLL Exports.
|
|
|
|
// To fully complete this project follow these steps
|
|
|
|
// You will need the new MIDL compiler to build this project. Additionally,
|
|
// if you are building the proxy stub DLL, you will need new headers and libs.
|
|
|
|
// 1) Add a custom build step to filemgmt.idl
|
|
// You can select all of the .IDL files by holding Ctrl and clicking on
|
|
// each of them.
|
|
//
|
|
// Description
|
|
// Running MIDL
|
|
// Build Command(s)
|
|
// midl filemgmt.idl
|
|
// Outputs
|
|
// filemgmt.tlb
|
|
// filemgmt.h
|
|
// mmcfmgm_i.c
|
|
//
|
|
// NOTE: You must use the MIDL compiler from NT 4.0,
|
|
// preferably 3.00.15 or greater
|
|
|
|
// 2) Add a custom build step to the project to register the DLL
|
|
// For this, you can select all projects at once
|
|
// Description
|
|
// Registering OLE Server...
|
|
// Build Command(s)
|
|
// regsvr32 /s /c "$(TargetPath)"
|
|
// echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
|
|
// Outputs
|
|
// $(OutDir)\regsvr32.trg
|
|
|
|
// 3) To add UNICODE support, follow these steps
|
|
// Select Build|Configurations...
|
|
// Press Add...
|
|
// Change the configuration name to Unicode Release
|
|
// Change the "Copy Settings From" combo to filemgmt - Win32 Release
|
|
// Press OK
|
|
// Press Add...
|
|
// Change the configuration name to Unicode Debug
|
|
// Change the "Copy Settings From" combo to filemgmt - Win32 Debug
|
|
// Press OK
|
|
// Press "Close"
|
|
// Select Build|Settings...
|
|
// Select the two UNICODE projects and press the C++ tab.
|
|
// Select the "General" category
|
|
// Add _UNICODE to the Preprocessor definitions
|
|
// Select the Unicode Debug project
|
|
// Press the "General" tab
|
|
// Specify DebugU for the intermediate and output directories
|
|
// Select the Unicode Release project
|
|
// Press the "General" tab
|
|
// Specify ReleaseU for the intermediate and output directories
|
|
|
|
// 4) Proxy stub DLL
|
|
// To build a separate proxy/stub DLL,
|
|
// run nmake -f ps.mak in the project directory.
|
|
|
|
#include "stdafx.h"
|
|
#include "initguid.h"
|
|
#include "filemgmt.h"
|
|
#include "cmponent.h"
|
|
#include "compdata.h"
|
|
#include "macros.h" // MFC_TRY/MFC_CATCH
|
|
#include "regkey.h" // AMC::CRegKey
|
|
#include "strings.h" // SNAPINS_KEY etc.
|
|
#include "guidhelp.h" // GuidToCString
|
|
|
|
#include <compuuid.h> // UUIDs for Computer Management
|
|
#include "about.h"
|
|
#include "snapreg.h" // RegisterSnapin
|
|
|
|
USE_HANDLE_MACROS("FILEMGMT(filemgmt.cpp)") \
|
|
|
|
const CLSID CLSID_FileServiceManagement = {0x58221C65,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}};
|
|
const CLSID CLSID_SystemServiceManagement = {0x58221C66,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}};
|
|
const CLSID CLSID_FileServiceManagementExt = {0x58221C69,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}};
|
|
const CLSID CLSID_SystemServiceManagementExt = {0x58221C6a,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}};
|
|
const CLSID CLSID_FileServiceManagementAbout = {0xDB5D1FF4,0x09D7,0x11D1,{0xBB,0x10,0x00,0xC0,0x4F,0xC9,0xA3,0xA3}};
|
|
const CLSID CLSID_SystemServiceManagementAbout ={0xDB5D1FF5,0x09D7,0x11D1,{0xBB,0x10,0x00,0xC0,0x4F,0xC9,0xA3,0xA3}};
|
|
#ifdef SNAPIN_PROTOTYPER
|
|
const CLSID CLSID_SnapinPrototyper = {0xab17ce10,0x9b30,0x11d0,{0xb6, 0xa6, 0x00, 0xaa, 0x00, 0x6e, 0xb9, 0x5b}};
|
|
#endif
|
|
|
|
CComModule _Module;
|
|
HINSTANCE g_hInstanceSave; // Instance handle of the DLL
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(CLSID_FileServiceManagement, CFileSvcMgmtSnapin)
|
|
OBJECT_ENTRY(CLSID_SystemServiceManagement, CServiceMgmtSnapin)
|
|
OBJECT_ENTRY(CLSID_FileServiceManagementExt, CFileSvcMgmtExtension)
|
|
OBJECT_ENTRY(CLSID_SystemServiceManagementExt, CServiceMgmtExtension)
|
|
OBJECT_ENTRY(CLSID_FileServiceManagementAbout, CFileSvcMgmtAbout)
|
|
OBJECT_ENTRY(CLSID_SystemServiceManagementAbout, CServiceMgmtAbout)
|
|
OBJECT_ENTRY(CLSID_SvcMgmt, CStartStopHelper)
|
|
#ifdef SNAPIN_PROTOTYPER
|
|
OBJECT_ENTRY(CLSID_SnapinPrototyper, CServiceMgmtSnapin)
|
|
#endif
|
|
END_OBJECT_MAP()
|
|
|
|
class CFileServiceMgmtApp : public CWinApp
|
|
{
|
|
public:
|
|
virtual BOOL InitInstance();
|
|
virtual int ExitInstance();
|
|
};
|
|
|
|
CFileServiceMgmtApp theApp;
|
|
|
|
BOOL CFileServiceMgmtApp::InitInstance()
|
|
{
|
|
_Module.Init(ObjectMap, m_hInstance);
|
|
SHFusionInitializeFromModuleID (m_hInstance, 2);
|
|
VERIFY( SUCCEEDED(CFileMgmtComponent::LoadStrings()) );
|
|
g_hInstanceSave = AfxGetInstanceHandle();
|
|
return CWinApp::InitInstance();
|
|
}
|
|
|
|
int CFileServiceMgmtApp::ExitInstance()
|
|
{
|
|
SHFusionUninitialize();
|
|
|
|
_Module.Term();
|
|
return CWinApp::ExitInstance();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Used to determine whether the DLL can be unloaded by OLE
|
|
|
|
STDAPI DllCanUnloadNow(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
return (AfxDllCanUnloadNow() && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Returns a class factory to create an object of the requested type
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
|
{
|
|
return _Module.GetClassObject(rclsid, riid, ppv);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllRegisterServer - Adds entries to the system registry
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
MFC_TRY;
|
|
|
|
HRESULT hr = S_OK;
|
|
// registers object, there is no typelib
|
|
hr = _Module.RegisterServer(FALSE);
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE && "_Module.RegisterServer(TRUE) failure.");
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
|
|
CString strFileMgmtCLSID, strSvcMgmtCLSID;
|
|
CString strFileMgmtExtCLSID, strSvcMgmtExtCLSID;
|
|
CString strFileMgmtAboutCLSID, strSvcMgmtAboutCLSID;
|
|
if ( FAILED(hr = GuidToCString( &strFileMgmtCLSID, CLSID_FileServiceManagement ))
|
|
|| FAILED(hr = GuidToCString( &strSvcMgmtCLSID, CLSID_SystemServiceManagement ))
|
|
|| FAILED(hr = GuidToCString( &strFileMgmtExtCLSID, CLSID_FileServiceManagementExt ))
|
|
|| FAILED(hr = GuidToCString( &strSvcMgmtExtCLSID, CLSID_SystemServiceManagementExt ))
|
|
|| FAILED(hr = GuidToCString( &strFileMgmtAboutCLSID, CLSID_FileServiceManagementAbout ))
|
|
|| FAILED(hr = GuidToCString( &strSvcMgmtAboutCLSID, CLSID_SystemServiceManagementAbout ))
|
|
)
|
|
{
|
|
ASSERT(FALSE && "GuidToCString() failure");
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
|
|
|
|
try
|
|
{
|
|
AMC::CRegKey regkeySnapins;
|
|
BOOL fFound = regkeySnapins.OpenKeyEx( HKEY_LOCAL_MACHINE, SNAPINS_KEY );
|
|
if ( !fFound )
|
|
{
|
|
ASSERT(FALSE && "DllRegisterServer() - Unable to open key from registry.");
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
|
|
static int filemgmt_types[7] =
|
|
{ FILEMGMT_ROOT,
|
|
FILEMGMT_SHARES,
|
|
FILEMGMT_SESSIONS,
|
|
FILEMGMT_RESOURCES,
|
|
FILEMGMT_SHARE,
|
|
FILEMGMT_SESSION,
|
|
FILEMGMT_RESOURCE };
|
|
hr = RegisterSnapin( regkeySnapins,
|
|
strFileMgmtCLSID,
|
|
g_aNodetypeGuids[FILEMGMT_ROOT].bstr,
|
|
IDS_REGISTER_FILEMGMT,
|
|
IDS_SNAPINABOUT_PROVIDER,
|
|
IDS_SNAPINABOUT_VERSION,
|
|
true,
|
|
strFileMgmtAboutCLSID,
|
|
filemgmt_types,
|
|
7 );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
static int svcmgmt_types[2] =
|
|
{ FILEMGMT_SERVICES,
|
|
FILEMGMT_SERVICE };
|
|
hr = RegisterSnapin( regkeySnapins,
|
|
strSvcMgmtCLSID,
|
|
g_aNodetypeGuids[FILEMGMT_SERVICES].bstr,
|
|
IDS_REGISTER_SVCMGMT,
|
|
IDS_SNAPINABOUT_PROVIDER,
|
|
IDS_SNAPINABOUT_VERSION,
|
|
true,
|
|
strSvcMgmtAboutCLSID,
|
|
svcmgmt_types,
|
|
2 );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
static int filemgmtext_types[7] =
|
|
{ FILEMGMT_ROOT,
|
|
FILEMGMT_SHARES,
|
|
FILEMGMT_SESSIONS,
|
|
FILEMGMT_RESOURCES,
|
|
FILEMGMT_SHARE,
|
|
FILEMGMT_SESSION,
|
|
FILEMGMT_RESOURCE };
|
|
hr = RegisterSnapin( regkeySnapins,
|
|
strFileMgmtExtCLSID,
|
|
NULL, // no primary nodetype
|
|
IDS_REGISTER_FILEMGMT_EXT,
|
|
IDS_SNAPINABOUT_PROVIDER,
|
|
IDS_SNAPINABOUT_VERSION,
|
|
false,
|
|
// JonN 11/11/98 changed to use same About handler
|
|
strFileMgmtAboutCLSID,
|
|
filemgmtext_types,
|
|
7 );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
static int svcmgmtext_types[2] =
|
|
{ FILEMGMT_SERVICES,
|
|
FILEMGMT_SERVICE };
|
|
hr = RegisterSnapin( regkeySnapins,
|
|
strSvcMgmtExtCLSID,
|
|
NULL, // no primary nodetype
|
|
IDS_REGISTER_SVCMGMT_EXT,
|
|
IDS_SNAPINABOUT_PROVIDER,
|
|
IDS_SNAPINABOUT_VERSION,
|
|
false,
|
|
// JonN 11/11/98 changed to use same About handler
|
|
strSvcMgmtAboutCLSID,
|
|
svcmgmtext_types,
|
|
2 );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
|
|
CString strFileExt, strSystemExt, strDefaultViewExt;
|
|
if ( !strFileExt.LoadString(IDS_REGISTER_FILEMGMT_EXT)
|
|
|| !strSystemExt.LoadString(IDS_REGISTER_SVCMGMT_EXT)
|
|
|| !strDefaultViewExt.LoadString(IDS_REGISTER_DEFAULT_VIEW_EXT)
|
|
)
|
|
{
|
|
ASSERT(FALSE);
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
AMC::CRegKey regkeyNodeTypes;
|
|
fFound = regkeyNodeTypes.OpenKeyEx( HKEY_LOCAL_MACHINE, NODE_TYPES_KEY );
|
|
if ( !fFound )
|
|
{
|
|
ASSERT(FALSE);
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
AMC::CRegKey regkeyNodeType;
|
|
for (int i = FILEMGMT_ROOT; i < FILEMGMT_NUMTYPES; i++)
|
|
{
|
|
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, g_aNodetypeGuids[i].bstr );
|
|
regkeyNodeType.CloseKey();
|
|
}
|
|
|
|
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, TEXT(struuidNodetypeSystemTools) );
|
|
{
|
|
AMC::CRegKey regkeyExtensions;
|
|
regkeyExtensions.CreateKeyEx( regkeyNodeType, g_szExtensions );
|
|
AMC::CRegKey regkeyNameSpace;
|
|
regkeyNameSpace.CreateKeyEx( regkeyExtensions, g_szNameSpace );
|
|
regkeyNameSpace.SetString( strFileMgmtExtCLSID, strFileExt );
|
|
// JonN 5/27/99 deregister as extension of System Tools
|
|
// ignore errors
|
|
(void)::RegDeleteValue(regkeyNameSpace, strSvcMgmtExtCLSID);
|
|
}
|
|
regkeyNodeType.CloseKey();
|
|
|
|
// JonN 5/27/99 register as extension of Server Apps
|
|
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, TEXT(struuidNodetypeServerApps) );
|
|
{
|
|
AMC::CRegKey regkeyExtensions;
|
|
regkeyExtensions.CreateKeyEx( regkeyNodeType, g_szExtensions );
|
|
AMC::CRegKey regkeyNameSpace;
|
|
regkeyNameSpace.CreateKeyEx( regkeyExtensions, g_szNameSpace );
|
|
(void)::RegDeleteValue(regkeyNameSpace, strFileMgmtExtCLSID);
|
|
regkeyNameSpace.SetString( strSvcMgmtExtCLSID, strSystemExt );
|
|
}
|
|
regkeyNodeType.CloseKey();
|
|
|
|
// JonN 5/16/00 register Default View Extension under Services node
|
|
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, TEXT(struuidNodetypeServices) );
|
|
{
|
|
AMC::CRegKey regkeyExtensions;
|
|
regkeyExtensions.CreateKeyEx( regkeyNodeType, g_szExtensions );
|
|
AMC::CRegKey regkeyView;
|
|
regkeyView.CreateKeyEx( regkeyExtensions, L"View" );
|
|
regkeyView.SetString( L"{B708457E-DB61-4C55-A92F-0D4B5E9B1224}",
|
|
strDefaultViewExt );
|
|
}
|
|
regkeyNodeType.CloseKey();
|
|
|
|
}
|
|
catch (COleException* e)
|
|
{
|
|
ASSERT(FALSE);
|
|
e->Delete();
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
|
|
return hr;
|
|
|
|
MFC_CATCH;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllUnregisterServer - Adds entries to the system registry
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
HRESULT hRes = S_OK;
|
|
_Module.UnregisterServer();
|
|
|
|
// CODEWORK need to unregister properly
|
|
|
|
return hRes;
|
|
}
|