WindowsXP-SP1/admin/snapin/filemgmt/filemgmt.cpp
2020-09-30 16:53:49 +02:00

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;
}