//Copyright (c) 1998 - 1999 Microsoft Corporation // tscc.cpp : Implementation of DLL Exports. // Note: Proxy/Stub Information // To build a separate proxy/stub DLL, // run nmake -f tsccps.mk in the project directory. #include "stdafx.h" #include "resource.h" #include "initguid.h" #include "tscc.h" #include "tswiz_i.c" #include "tscc_i.c" #include "srvsetex_i.c" #include "Compdata.h" LONG RecursiveDeleteKey( HKEY hKeyParent , LPTSTR lpszKeyChild ); extern const GUID GUID_ResultNode = { 0xfe8e7e84 , 0x6f63 , 0x11d2 , { 0x98, 0xa9 , 0x0 , 0x0a0 , 0xc9 , 0x25 , 0xf9 , 0x17 } }; TCHAR tchSnapKey[] = TEXT( "Software\\Microsoft\\MMC\\Snapins\\" ); TCHAR tchNameString[] = TEXT( "NameString" ); TCHAR tchNameStringIndirect[] = TEXT( "NameStringIndirect" ); TCHAR tchAbout[] = TEXT( "About" ); TCHAR tchNodeType[] = TEXT( "NodeTypes" ); TCHAR tchStandAlone[] = TEXT( "StandAlone" ); CComModule _Module; BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_Compdata, CCompdata) END_OBJECT_MAP() ///////////////////////////////////////////////////////////////////////////// // DLL Entry Point extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) { if (dwReason == DLL_PROCESS_ATTACH) { _Module.Init(ObjectMap, hInstance); DisableThreadLibraryCalls(hInstance); } else if (dwReason == DLL_PROCESS_DETACH) _Module.Term(); return TRUE; // ok } ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE STDAPI DllCanUnloadNow(void) { return (_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) { HKEY hKeyRoot , hKey; TCHAR tchGUID[ 40 ]; TCHAR tchKey[ MAX_PATH ];//TEXT( "Software\\Microsoft\\MMC\\Snapins\\" ); lstrcpy( tchKey , tchSnapKey ); StringFromGUID2( CLSID_Compdata , tchGUID , SIZE_OF_BUFFER( tchGUID ) ); lstrcat( tchKey , tchGUID ); if( RegCreateKey( HKEY_LOCAL_MACHINE , tchKey , &hKeyRoot ) != ERROR_SUCCESS ) { return GetLastError( ); } TCHAR tchBuf[ MAX_PATH ]; TCHAR tchSysDllPathName[ MAX_PATH ]; GetModuleFileName( _Module.GetResourceInstance( ) , tchSysDllPathName , sizeof( tchSysDllPathName ) / sizeof( TCHAR ) ); VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_NAMESTRING , tchBuf , SIZE_OF_BUFFER( tchBuf ) ) ); VERIFY_S( ERROR_SUCCESS , RegSetValueEx( hKeyRoot , tchNameString , NULL , REG_SZ , ( PBYTE )&tchBuf[ 0 ] , SIZE_OF_BUFFER( tchBuf ) ) ); wsprintf( tchBuf , L"@%s,-%d", tchSysDllPathName , IDS_NAMESTRING ); VERIFY_S( ERROR_SUCCESS , RegSetValueEx( hKeyRoot , tchNameStringIndirect , NULL , REG_SZ , ( PBYTE )&tchBuf[ 0 ] , SIZE_OF_BUFFER( tchBuf ) ) ); VERIFY_S( ERROR_SUCCESS , RegSetValueEx( hKeyRoot , tchAbout , NULL , REG_SZ , ( PBYTE )&tchGUID[ 0 ] , sizeof( tchGUID ) ) ); lstrcpy( tchKey , tchStandAlone ); RegCreateKey( hKeyRoot , tchKey , &hKey ); RegCloseKey( hKey ); lstrcpy( tchKey , tchNodeType ); RegCreateKey( hKeyRoot , tchKey , &hKey ); TCHAR szGUID[ 40 ]; HKEY hDummy; StringFromGUID2( GUID_ResultNode , szGUID , SIZE_OF_BUFFER( szGUID ) ); RegCreateKey( hKey , szGUID , &hDummy ); RegCloseKey( hDummy ); RegCloseKey( hKey ); RegCloseKey( hKeyRoot ); return _Module.RegisterServer(TRUE); } ///////////////////////////////////////////////////////////////////////////// // DllUnregisterServer - Removes entries from the system registry STDAPI DllUnregisterServer(void) { HKEY hKey; TCHAR tchGUID[ 40 ]; TCHAR tchKey[ MAX_PATH ]; lstrcpy( tchKey , tchSnapKey ); if( RegOpenKey( HKEY_LOCAL_MACHINE , tchKey , &hKey ) != ERROR_SUCCESS ) { return GetLastError( ) ; } StringFromGUID2( CLSID_Compdata , tchGUID , SIZE_OF_BUFFER( tchGUID ) ); RecursiveDeleteKey( hKey , tchGUID ); RegCloseKey( hKey ); _Module.UnregisterServer(); return S_OK; } //--------------------------------------------------------------------------- // Delete a key and all of its descendents. //--------------------------------------------------------------------------- LONG RecursiveDeleteKey( HKEY hKeyParent , LPTSTR lpszKeyChild ) { // Open the child. HKEY hKeyChild; LONG lRes = RegOpenKeyEx(hKeyParent, lpszKeyChild , 0 , KEY_ALL_ACCESS, &hKeyChild); if (lRes != ERROR_SUCCESS) { return lRes; } // Enumerate all of the decendents of this child. FILETIME time; TCHAR szBuffer[256]; DWORD dwSize = SIZE_OF_BUFFER( szBuffer ); while( RegEnumKeyEx( hKeyChild , 0 , szBuffer , &dwSize , NULL , NULL , NULL , &time ) == S_OK ) { // Delete the decendents of this child. lRes = RecursiveDeleteKey(hKeyChild, szBuffer); if (lRes != ERROR_SUCCESS) { RegCloseKey(hKeyChild); return lRes; } dwSize = SIZE_OF_BUFFER( szBuffer ); } // Close the child. RegCloseKey( hKeyChild ); // Delete this child. return RegDeleteKey( hKeyParent , lpszKeyChild ); } extern "C" BOOL IsWhistlerAdvanceServer() { OSVERSIONINFOEX osVersionInfo; ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX)); osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (GetVersionEx((LPOSVERSIONINFO )&osVersionInfo)) { return (osVersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE) || (osVersionInfo.wSuiteMask & VER_SUITE_DATACENTER); } else { return FALSE; } }