///////////////////////////////////////////////////////////////////// // // CopyRight ( c ) 1999 Microsoft Corporation // // Module Name: Dnsprov.cpp // // Description: // Implementation of dll exported functions // // Author: // Henry Wang ( henrywa ) March 8, 2000 // // ////////////////////////////////////////////////////////////////////// #include "DnsWmi.h" DEFINE_GUID(CLSID_DNS_SERVER,0x62269fec, 0x7b32, 0x11d2, 0x9a, 0xb7,0x00, 0x00, 0xf8, 0x75, 0xc5, 0xd4); // { 62269fec-7b32-11d2-9ab7-0000f875c5d4 } //Count number of objects and number of locks. long g_cObj=0; long g_cLock=0; HMODULE ghModule; extern DWORD DnsWmiDebugFlag = 0; extern DWORD DnsLibDebugFlag = 0; //*************************************************************************** // // CompileMofFile // // Purpose: Automagically compile the MOF file into the WMI repository. // // Return: S_OK or error if unable to compile or file MOF. // //*************************************************************************** static SCODE CompileMofFile( VOID ) { SCODE sc = S_OK; const WCHAR szMofRelativePath[] = L"\\system32\\wbem\\dnsprov.mof"; WCHAR szMofPath[ MAX_PATH + 5 ] = L""; IMofCompiler * pMofComp = NULL; HANDLE h; WBEM_COMPILE_STATUS_INFO Info; // // Formulate path of MOF file // if ( GetSystemWindowsDirectoryW( szMofPath, MAX_PATH - wcslen( szMofRelativePath ) ) == 0 ) { sc = GetLastError(); goto Done; } lstrcatW( szMofPath, szMofRelativePath ); // // Verify that MOF file exists. // h = CreateFileW( szMofPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ( h == INVALID_HANDLE_VALUE ) { sc = ERROR_FILE_NOT_FOUND; goto Done; } CloseHandle( h ); // // Load and invoke the MOF compiler. // sc = CoCreateInstance( CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, ( LPVOID * ) &pMofComp ); if ( FAILED( sc ) ) { goto Done; } sc = pMofComp->CompileFile ( ( LPWSTR ) szMofPath, NULL, // load into namespace specified in MOF file NULL, // use default User NULL, // use default Authority NULL, // use default Password 0, // no options 0, // no class flags 0, // no instance flags &Info ); // // Cleanup and return. // Done: if ( pMofComp ) { pMofComp->Release(); } return sc; } // CompileMofFile //*************************************************************************** // BOOL WINAPI DllMain( HANDLE hModule, DWORD dwReason, LPVOID lpReserved ) { DBG_FN( "DllMain" ); #if DBG DWORD pid = GetCurrentProcessId(); if ( dwReason == DLL_PROCESS_ATTACH ) { CHAR szBase[ MAX_PATH ]; CHAR szFlagFile[ MAX_PATH + 50 ]; CHAR szLogFile[ MAX_PATH + 50 ]; // // Initialize debug logging. // GetWindowsDirectoryA( szBase, sizeof( szBase ) ); strcat( szBase, DNSWMI_DBG_LOG_DIR ); strcpy( szFlagFile, szBase ); strcat( szFlagFile, DNSWMI_DBG_FLAG_FILE_NAME ); sprintf( szLogFile, "%s" DNSWMI_DBG_LOG_FILE_BASE_NAME ".%03X.log", szBase, pid ); Dns_StartDebug( 0, szFlagFile, &DnsWmiDebugFlag, szLogFile, DNSWMI_DBG_LOG_FILE_WRAP ); // Turn off dnslib logging except for basic output controls. if ( pDnsDebugFlag ) { pDnsDebugFlag = &DnsLibDebugFlag; *pDnsDebugFlag = 0x1000000D; } IF_DEBUG( START_BREAK ) { DebugBreak(); } } #endif DNS_DEBUG( INIT, ( "%s: PID %03X reason %d returning TRUE\n", fn, pid, dwReason )); return TRUE; } // DllMain //*************************************************************************** // // DllCanUnloadNow // // Purpose: Called periodically by Ole in order to determine if the // DLL can be freed. // // Return: S_OK if there are no objects in use and the class factory // isn't locked. // //*************************************************************************** STDAPI DllCanUnloadNow(void) { DBG_FN( "DllCanUnloadNow" ) 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; DNS_DEBUG( INIT, ( "%s: returning 0x%08x\n", fn, sc )); return sc; } //*************************************************************************** // // DllRegisterServer // // Purpose: Called during setup or by regsvr32. // // Return: NOERROR if registration successful, error otherwise. //*************************************************************************** STDAPI DllRegisterServer(void) { SCODE sc = S_OK; TCHAR szID[128]; WCHAR wcID[128]; TCHAR szCLSID[128]; TCHAR szModule[MAX_PATH]; TCHAR * pName = TEXT("MS_NT_DNS_PROVIDER"); TCHAR * pModel = TEXT("Both"); HKEY hKey1, hKey2; ghModule = GetModuleHandle(TEXT("Dnsprov")); // Create the path. StringFromGUID2( CLSID_DNS_SERVER, wcID, 128); #ifndef UNICODE wcstombs(szID, wcID, 128); #else _tcscpy(szID, wcID); #endif lstrcpy( szCLSID, TEXT("Software\\classes\\CLSID\\") ); lstrcat(szCLSID, szID); // Create entries under CLSID RegCreateKey( HKEY_LOCAL_MACHINE, szCLSID, &hKey1); RegSetValueEx( hKey1, NULL, 0, REG_SZ, (BYTE *)pName, lstrlen(pName)+1 ); RegCreateKey( hKey1, TEXT("InprocServer32"), &hKey2); GetModuleFileName( ghModule, szModule, MAX_PATH); RegSetValueEx( hKey2, NULL, 0, REG_SZ, (BYTE *)szModule, lstrlen(szModule)+1); RegSetValueEx( hKey2, TEXT("ThreadingModel"), 0, REG_SZ, (BYTE *)pModel, lstrlen(pModel)+1); CloseHandle(hKey1); CloseHandle(hKey2); // // Compile the MOF file. If this fails, it would be good to // tell the admin, but I don't have an easy way to do that. // CompileMofFile(); return sc; } //*************************************************************************** // // DllUnregisterServer // // Purpose: Called when it is time to remove the registry entries. // // Return: NOERROR if registration successful, error otherwise. //*************************************************************************** STDAPI DllUnregisterServer(void) { TCHAR szID[128]; WCHAR wcID[128]; TCHAR szCLSID[128]; HKEY hKey; // Create the path using the CLSID StringFromGUID2(CLSID_DNS_SERVER, wcID, 128); #ifndef UNICODE wcstombs(szID, wcID, 128); #else _tcscpy(szID, wcID); #endif lstrcpy(szCLSID, TEXT("Software\\classes\\CLSID\\")); lstrcat(szCLSID, szID); // First delete the InProcServer subkey. DWORD dwRet = RegOpenKey( HKEY_LOCAL_MACHINE, szCLSID, &hKey); if(dwRet == NO_ERROR) { RegDeleteKey( hKey, TEXT("InProcServer32")); CloseHandle(hKey); } dwRet = RegOpenKey( HKEY_LOCAL_MACHINE, TEXT("Software\\classes\\CLSID"), &hKey); if(dwRet == NO_ERROR) { RegDeleteKey( hKey, szID); CloseHandle(hKey); } return NOERROR; } //*************************************************************************** // // DllGetClassObject // // Purpose: Called by Ole when some client wants a class factory. Return // one only if it is the sort of class this DLL supports. // //*************************************************************************** STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, PPVOID ppv) { DBG_FN( "DllGetClassObject" ) HRESULT hr; CProvFactory *pObj = NULL; if ( CLSID_DNS_SERVER != rclsid ) { hr = E_FAIL; goto Done; } pObj = new CProvFactory(); if ( NULL == pObj ) { hr = E_OUTOFMEMORY; goto Done; } hr = pObj->QueryInterface( riid, ppv ); if ( FAILED( hr ) ) { delete pObj; } Done: DNS_DEBUG( INIT, ( "%s: returning 0x%08x\n", fn, hr )); return hr; }