//
// Purpose: 
//   Entry point function. Executes specified command from user.
//
// Parameters:
//   Command-line syntax is: svcconfig [command] [service_path]
// 
// Return value:
//   None
//
void __cdecl _tmain(int argc, TCHAR *argv[])
{
    printf("\n");
    if( argc != 3 )
    {
        printf("ERROR:\tIncorrect number of arguments\n\n");
        DisplayUsage();
        return;
    }

    StringCchCopy(szCommand, 10, argv[1]);
    StringCchCopy(szSvcName, 80, argv[2]);

    if (lstrcmpi( szCommand, TEXT("query")) == 0 )
        DoQuerySvc();
    else if (lstrcmpi( szCommand, TEXT("describe")) == 0 )
        DoUpdateSvcDesc();
    else if (lstrcmpi( szCommand, TEXT("disable")) == 0 )
        DoDisableSvc();
    else if (lstrcmpi( szCommand, TEXT("enable")) == 0 )
        DoEnableSvc();
    else if (lstrcmpi( szCommand, TEXT("delete")) == 0 )
        DoDeleteSvc();
    else 
    {
        _tprintf(TEXT("Unknown command (%s)\n\n"), szCommand);
        DisplayUsage();
    }
}
void	printServiceStartType()
{
	SC_HANDLE				scHandle			=	NULL;
	ENUM_SERVICE_STATUS		enumServiceStatus	=	{0};
	ENUM_SERVICE_STATUS*	penumServiceStatus	=	NULL;
	
	DWORD					dwBytesNeeded		=	0;
	DWORD					dwServicesReturned	=	0;
	DWORD					dwResumeHandle		=	0;
	DWORD					dwBytesAllocated	=	0;
	DWORD					dwCtr				=	0;
	BOOL					bRet				=	TRUE;

	int						iCtr				=	0;
	int						iCheckNumServices	=	0;
	int						iEventId			=	0;

	char					szTimeINIFile[MAX_PATH + 100]		=	{0};
	char					szDef[10]							=	{0};
	char					szUpTime[101]						=	{0};

	__try
	{
		__try
		{
			//Open the SCM manager
			scHandle	=	::OpenSCManager(NULL,
											SERVICES_ACTIVE_DATABASE,
											SC_MANAGER_ENUMERATE_SERVICE);
			if(NULL == scHandle)
			{
				/*LogLastError(g_szErrorLogPath,
								9999,
								NULL,
								::GetLastError(),
								0,
								NULL,
								"ERR:   Open SC Manager failed",
								NULL,
								NULL);*/
				return;
			}

			bRet	=	::EnumServicesStatus(scHandle,
												SERVICE_WIN32,      //<----Service Type
												SERVICE_STATE_ALL,  //<----Service State
												&enumServiceStatus, //<----buf storing srvnm,srvst
												sizeof(enumServiceStatus),//size of structure
												&dwBytesNeeded,        //
												&dwServicesReturned,
												&dwResumeHandle);

			if(dwBytesNeeded > 0)
			{
				dwBytesAllocated = dwBytesNeeded + sizeof(ENUM_SERVICE_STATUS);
				penumServiceStatus = new ENUM_SERVICE_STATUS[dwBytesAllocated];

				memset(penumServiceStatus,NULL,dwBytesAllocated);
			}
			else
			{
				/*LogLastError(g_szErrorLogPath,
								9999,
								NULL,
								::GetLastError(),
								0,
								NULL,
								"ERR:   Enum Service Status failed",
								NULL,
								NULL);*/
				return;
			}

			dwBytesNeeded		=	0;
			dwServicesReturned	=	0;
			dwResumeHandle		=	0;


			bRet	=	::EnumServicesStatus(scHandle,
											 SERVICE_WIN32,
											 SERVICE_STATE_ALL,
											 penumServiceStatus,
											 dwBytesAllocated,
											 &dwBytesNeeded,
											 &dwServicesReturned,
											 &dwResumeHandle);
			if(0 == bRet)
			{
				/*LogLastError(g_szErrorLogPath,
								9999,
								NULL,
								::GetLastError(),
								0,
								NULL,
								"ERR:   Enum Service Status failed",
								NULL,
								NULL);*/
				return;
			}

			::CloseServiceHandle(scHandle);
			scHandle = NULL;
			
			for(dwCtr = 0; dwCtr < dwServicesReturned; ++dwCtr)
			{
					//Retrieve sERVICE nAME
					DoQuerySvc(penumServiceStatus[dwCtr].lpServiceName);
					_tprintf(TEXT("  Service Start Type: %s\n"), penumServiceStatus[dwCtr].ServiceStatus.dwCurrentState);
			}
			
		}
		__except(EXCEPTION_EXECUTE_HANDLER)
		{


		}
	}
	__finally
	{
		if(NULL != scHandle)
		{
			::CloseServiceHandle(scHandle);
			scHandle = NULL;
		}
	}
}