////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1999-2000 Microsoft Corporation // // Module Name: vsswmi.cpp // // Implementation of the provider registration and entry point. // // Author: MSP Prabu (mprabu) 04-Dec-2000 // Jim Benton (jbenton) 15-Oct-2000 // ////////////////////////////////////////////////////////////////////// #include "Pch.h" #include #include "ProvFactory.h" #include "InstanceProv.h" //////////////////////////////////////////////////////////////////////// //// Standard foo for file name aliasing. This code block must be after //// all includes of VSS header files. //// #ifdef VSS_FILE_ALIAS #undef VSS_FILE_ALIAS #endif #define VSS_FILE_ALIAS "ADMVWMIP" //// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Global Data ////////////////////////////////////////////////////////////////////////////// const int g_cchRegkey = 128; // {72970BEB-81F8-46d4-B220-D743F4E49C95} DEFINE_GUID(CLSID_VSS_PROVIDER, 0x72970BEB, 0x81F8, 0x46d4, 0xB2, 0x20, 0xD7, 0x43, 0xF4, 0xE4, 0x9C, 0x95); //DECLARE_DEBUG_PRINTS_OBJECT(); // Count number of objects and number of locks. long g_cObj = 0; long g_cLock = 0; HMODULE g_hModule; FactoryData g_FactoryDataArray[] = { { &CLSID_VSS_PROVIDER, CInstanceProv::S_HrCreateThis, PVD_WBEM_PROVIDERNAME } }; ////////////////////////////////////////////////////////////////////////////// //++ // // BOOL // WINAPI // DllMain( // HANDLE hModule, // DWORD ul_reason_for_call, // LPVOID lpReserved // ) // // Description: // Main DLL entry point. // // Arguments: // hModule -- DLL module handle. // ul_reason_for_call -- // lpReserved -- // // Return Values: // TRUE // //-- ////////////////////////////////////////////////////////////////////////////// BOOL WINAPI DllMain( HANDLE hModule, DWORD dwReason, LPVOID lpReserved ) { g_hModule = static_cast< HMODULE >( hModule ); if (dwReason == DLL_PROCESS_ATTACH) { } else if (dwReason == DLL_PROCESS_DETACH) { } return TRUE; } //*** DllMain() ////////////////////////////////////////////////////////////////////////////// //++ // // STDAPI // DllCanUnloadNow( void ) // // Description: // Called periodically by Ole in order to determine if the // DLL can be freed. // // Arguments: // None. // // Return Values: // S_OK if there are no objects in use and the class factory // isn't locked. // //-- ////////////////////////////////////////////////////////////////////////////// STDAPI DllCanUnloadNow( void ) { SCODE sc; //It is OK to unload if there are no objects or locks on the // class factory. sc = ( 0L == g_cObj && 0L == g_cLock ) ? S_OK : S_FALSE; return sc; } //*** DllCanUnloadNow() ////////////////////////////////////////////////////////////////////////////// //++ // // STDAPI // DllRegisterServer( void ) // // Description: // Called during setup or by regsvr32. // // Arguments: // None. // // Return Values: // NOERROR if registration successful, error otherwise. // SELFREG_E_CLASS // //-- ////////////////////////////////////////////////////////////////////////////// STDAPI DllRegisterServer( void ) { WCHAR wszID[ g_cchGUID ]; WCHAR wszCLSID[ g_cchRegkey ]; WCHAR wszModule[ MAX_PATH ]; INT idx; WCHAR * pwszModel = L"Both"; HKEY hKey1 = NULL; HKEY hKey2 = NULL; DWORD dwRet = ERROR_SUCCESS; INT cArray = sizeof ( g_FactoryDataArray ) / sizeof ( FactoryData ); // Create the path. try { for ( idx = 0 ; idx < cArray && dwRet == ERROR_SUCCESS ; idx++ ) { LPCWSTR pwszName = g_FactoryDataArray[ idx ].m_pwszRegistryName; dwRet = StringFromGUID2( *g_FactoryDataArray[ idx ].m_pCLSID, wszID, g_cchGUID ); if (dwRet == 0) { dwRet = ERROR_INSUFFICIENT_BUFFER; break; } if (FAILED(StringCchPrintf(wszCLSID, g_cchRegkey, L"Software\\Classes\\CLSID\\%lS", wszID))) { dwRet = ERROR_INSUFFICIENT_BUFFER; break; } wszCLSID[g_cchRegkey - 1] = L'\0'; // Create entries under CLSID dwRet = RegCreateKeyW( HKEY_LOCAL_MACHINE, wszCLSID, &hKey1 ); if ( dwRet != ERROR_SUCCESS ) { break; } dwRet = RegSetValueEx( hKey1, NULL, 0, REG_SZ, (BYTE *) pwszName, sizeof( WCHAR ) * (lstrlenW( pwszName ) + 1) ); if ( dwRet != ERROR_SUCCESS ) { break; } dwRet = RegCreateKeyW( hKey1, L"InprocServer32", & hKey2 ); if ( dwRet != ERROR_SUCCESS ) { break; } GetModuleFileName( g_hModule, wszModule, MAX_PATH ); dwRet = RegSetValueEx( hKey2, NULL, 0, REG_SZ, (BYTE *) wszModule, sizeof( WCHAR ) * (lstrlen( wszModule ) + 1) ); if ( dwRet != ERROR_SUCCESS ) { break; } dwRet = RegSetValueExW( hKey2, L"ThreadingModel", 0, REG_SZ, (BYTE *) pwszModel, sizeof( WCHAR ) * (lstrlen( pwszModel ) + 1) ); if ( dwRet != ERROR_SUCCESS ) { break; } RegCloseKey( hKey1 ); hKey1 = NULL; RegCloseKey( hKey2 ); hKey2 = NULL; } // for: each entry in factory entry array } catch ( ... ) { dwRet = SELFREG_E_CLASS; } if (hKey1 != NULL) RegCloseKey( hKey1 ); if (hKey2 != NULL) RegCloseKey( hKey2 ); return dwRet; } //*** DllRegisterServer() ////////////////////////////////////////////////////////////////////////////// //++ // // STDAPI // DllUnregisterServer( void ) // // Description: // Called when it is time to remove the registry entries. // // Arguments: // None. // // Return Values: // NOERROR if registration successful, error otherwise. // SELFREG_E_CLASS // //-- ////////////////////////////////////////////////////////////////////////////// STDAPI DllUnregisterServer( void ) { WCHAR wszID[ g_cchGUID ]; WCHAR wszCLSID[ g_cchRegkey ]; HKEY hKey; INT idx; DWORD dwRet = ERROR_SUCCESS; INT cArray = sizeof ( g_FactoryDataArray ) / sizeof ( FactoryData ); for ( idx = 0 ; idx < cArray && dwRet == ERROR_SUCCESS ; idx++ ) { dwRet = StringFromGUID2( *g_FactoryDataArray[ idx ].m_pCLSID, wszID, g_cchGUID ); if (dwRet == 0) { dwRet = ERROR_INSUFFICIENT_BUFFER; break; } if (FAILED(StringCchPrintf(wszCLSID, g_cchRegkey - 1, L"Software\\Classes\\CLSID\\%lS", wszID))) { dwRet = ERROR_INSUFFICIENT_BUFFER; break; } wszCLSID[g_cchRegkey - 1] = L'\0'; // First delete the InProcServer subkey. dwRet = RegOpenKeyW( HKEY_LOCAL_MACHINE, wszCLSID, &hKey ); if ( dwRet != ERROR_SUCCESS ) { continue; } dwRet = RegDeleteKeyW( hKey, L"InProcServer32" ); RegCloseKey( hKey ); if ( dwRet != ERROR_SUCCESS ) { break; } dwRet = RegOpenKeyW( HKEY_LOCAL_MACHINE, L"Software\\Classes\\CLSID", &hKey ); if ( dwRet != ERROR_SUCCESS ) { break; } dwRet = RegDeleteKeyW( hKey,wszID ); RegCloseKey( hKey ); if ( dwRet != ERROR_SUCCESS ) { break; } } // for: each object //if ( dwRet != ERROR_SUCCESS ) //{ // dwRet = SELFREG_E_CLASS; //} return S_OK; } //*** DllUnregisterServer() ////////////////////////////////////////////////////////////////////////////// //++ // // STDAPI // DllGetClassObject( // REFCLSID rclsidIn, // REFIID riidIn, // PPVOID ppvOut // ) // // Description: // Called by Ole when some client wants a class factory. Return // one only if it is the sort of class this DLL supports. // // Arguments: // rclsidIn -- // riidIn -- // ppvOut -- // // Return Values: // NOERROR if registration successful, error otherwise. // E_OUTOFMEMORY // E_FAIL // //-- ////////////////////////////////////////////////////////////////////////////// STDAPI DllGetClassObject( REFCLSID rclsidIn, REFIID riidIn, PPVOID ppvOut ) { HRESULT hr; CProvFactory * pObj = NULL; UINT idx; UINT cDataArray = sizeof ( g_FactoryDataArray ) / sizeof ( FactoryData ); for ( idx = 0 ; idx < cDataArray ; idx++ ) { if ( IsEqualCLSID(rclsidIn, *g_FactoryDataArray[ idx ].m_pCLSID) ) { pObj= new CProvFactory( &g_FactoryDataArray[ idx ] ); if ( NULL == pObj ) { return E_OUTOFMEMORY; } hr = pObj->QueryInterface( riidIn, ppvOut ); if ( FAILED( hr ) ) { delete pObj; } return hr; } } return E_FAIL; } //*** DllGetClassObject()