153 lines
4.0 KiB
C++
153 lines
4.0 KiB
C++
// TO BUILD A MODULE FROM THE SKELETON, see README.TXT
|
|
// ===================================================
|
|
// MAIN.CPP
|
|
// Module executable entry point
|
|
// ===================================================
|
|
// Project History:
|
|
//
|
|
// Date Name Change
|
|
// -------- --------- ---------
|
|
// 9/17/98 a-jaker Created
|
|
// 10/23/98 a-jayher Edited
|
|
// 12/14/98 marioh Edited [AppWizard additions]
|
|
//====================================================
|
|
|
|
#define _WIN32_DCOM
|
|
|
|
#include "module.h"
|
|
#include "classfac.h"
|
|
|
|
HANDLE g_hEvent;
|
|
|
|
// Used to register a COM API
|
|
void RegisterServer(char *szFileName, GUID guid, char * pDesc, char * pModel, char * pProgID);
|
|
|
|
|
|
|
|
int APIENTRY WinMain(IN HINSTANCE hInstance,
|
|
IN HINSTANCE hPrevInstance,
|
|
IN LPSTR szCmdLine,
|
|
IN int nCmdShow)
|
|
{
|
|
DWORD dwObject=0;
|
|
HRESULT hr;
|
|
|
|
// Register CLSID here if called with /REGSERVER
|
|
//==============================================
|
|
|
|
if(!lstrcmpi(TEXT("REGSERVER"),szCmdLine+1))
|
|
{
|
|
char szBuffer[MAX_PATH];
|
|
GetModuleFileName(NULL,szBuffer,MAX_PATH);
|
|
|
|
//All modules need to have the substring "WBEM TEST MODULE" in their description
|
|
RegisterServer(szBuffer, CLSID_CimModule, "WMI Generic Framework Module - WBEM TEST MODULE", "Both", NULL);
|
|
exit(0);
|
|
}
|
|
|
|
CClassFactory *pFactory=new CClassFactory();
|
|
g_hEvent = CreateEvent(0, FALSE, FALSE, 0);
|
|
|
|
hr=CoInitializeEx(0, COINIT_MULTITHREADED);
|
|
|
|
if (hr==S_OK)
|
|
{
|
|
// Initialize DCOM Security Here (change flags as needed)
|
|
//=======================================================
|
|
|
|
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
|
|
RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, 0);
|
|
|
|
if (hr==S_OK)
|
|
{
|
|
|
|
hr=CoRegisterClassObject(CLSID_CimModule,
|
|
(IUnknown *) pFactory,
|
|
CLSCTX_LOCAL_SERVER,
|
|
REGCLS_MULTIPLEUSE,
|
|
&dwObject);
|
|
}
|
|
}
|
|
|
|
|
|
if (hr != S_OK)
|
|
exit(hr);
|
|
|
|
|
|
CoResumeClassObjects();
|
|
|
|
//Wait here until all objects have been released
|
|
//==============================================
|
|
|
|
WaitForSingleObject(g_hEvent,INFINITE);
|
|
|
|
CoRevokeClassObject(dwObject);
|
|
CloseHandle(g_hEvent);
|
|
CoUninitialize();
|
|
return 0;
|
|
|
|
}
|
|
|
|
void RegisterServer(char *szFileName, GUID guid, char * pDesc, char * pModel,
|
|
char * pProgID)
|
|
{
|
|
char szID[128];
|
|
WCHAR wcID[128];
|
|
char szCLSID[128];
|
|
HKEY hKey1 = NULL, hKey2 = NULL;
|
|
|
|
// Create the path.
|
|
if(0 ==StringFromGUID2(guid, wcID, 128))
|
|
return;
|
|
|
|
wcstombs(szID, wcID, 128);
|
|
lstrcpy(szCLSID, TEXT("CLSID\\"));
|
|
lstrcat(szCLSID, szID);
|
|
|
|
// Create entries under CLSID
|
|
if(ERROR_SUCCESS != RegCreateKey(HKEY_CLASSES_ROOT, szCLSID, &hKey1))
|
|
return;
|
|
|
|
RegSetValueEx(hKey1, NULL, 0, REG_SZ, (BYTE *)pDesc, lstrlen(pDesc)+1);
|
|
|
|
if (strstr(_strlwr(szFileName),".exe"))
|
|
{
|
|
if(ERROR_SUCCESS != RegCreateKey(hKey1,"LocalServer32",&hKey2))
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if(ERROR_SUCCESS != RegCreateKey(hKey1,"InProcServer32",&hKey2))
|
|
return;
|
|
}
|
|
|
|
RegSetValueEx(hKey2, NULL, 0, REG_SZ, (BYTE *)szFileName,
|
|
lstrlen(szFileName)+1);
|
|
|
|
RegSetValueEx(hKey2, "ThreadingModel", 0, REG_SZ,
|
|
(BYTE *)pModel, lstrlen(pModel)+1);
|
|
|
|
RegCloseKey(hKey1);
|
|
RegCloseKey(hKey2);
|
|
|
|
// If there is a progid, then add it too
|
|
if(pProgID)
|
|
{
|
|
if(ERROR_SUCCESS == RegCreateKey(HKEY_CLASSES_ROOT, pProgID, &hKey1))
|
|
{
|
|
|
|
RegSetValueEx(hKey1, NULL, 0, REG_SZ, (BYTE *)pDesc , lstrlen(pDesc)+1);
|
|
if(ERROR_SUCCESS == RegCreateKey(hKey1,"CLSID",&hKey2))
|
|
{
|
|
RegSetValueEx(hKey2, NULL, 0, REG_SZ, (BYTE *)szID,
|
|
lstrlen(szID)+1);
|
|
RegCloseKey(hKey2);
|
|
hKey2 = NULL;
|
|
}
|
|
RegCloseKey(hKey1);
|
|
}
|
|
|
|
}
|
|
return;
|
|
}
|