412 lines
9.4 KiB
C++
412 lines
9.4 KiB
C++
/////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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;
|
|
}
|