2025-04-27 07:49:33 -04:00

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;
}