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

}