Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

430 lines
16 KiB

/*****************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
PCH_Winsock.CPP
Abstract:
WBEM provider class implementation for PCH_Winsock class.
This class does not use any existing Win32 Class
Revision History:
Kalyani Narlanka (kalyanin) 04/27/99
- Created
Kalyani Narlanka (kalyanin) 05/10/99
- Added Name, Size, Version, Description, SystemStatus, MaxUDP, MAXSockets,
Change, Timestamp
*******************************************************************************/
// #includes
#include "pchealth.h"
#include "PCH_WINSOCK.h"
// #defines
// nMajorVersion represents the Major Version as seen in OSVERSIONINFO
#define nMajorVersion 4
// nMinorVersion represents the Minor Version as seen in OSVERSIONINFO
#define nMinorVersion 10
///////////////////////////////////////////////////////////////////////////////
// Begin Tracing stuff
//
#ifdef THIS_FILE
#undef THIS_FILE
#endif
static char __szTraceSourceFile[] = __FILE__;
#define THIS_FILE __szTraceSourceFile
#define TRACE_ID DCID_WINSOCK
//
// End Tracing stuff
///////////////////////////////////////////////////////////////////////////////
CPCH_WINSOCK MyPCH_WINSOCKSet (PROVIDER_NAME_PCH_WINSOCK, PCH_NAMESPACE) ;
///////////////////////////////////////////////////////////////////////////////
//....Properties of PCHWinsock Class
//
const static WCHAR* pTimeStamp = L"TimeStamp" ;
const static WCHAR* pChange = L"Change" ;
const static WCHAR* pDescription = L"Description" ;
const static WCHAR* pMaxSockets = L"MaxSockets" ;
const static WCHAR* pMaxUDP = L"MaxUDP" ;
const static WCHAR* pName = L"Name" ;
const static WCHAR* pSize = L"Size" ;
const static WCHAR* pSystemStatus = L"SystemStatus" ;
const static WCHAR* pVersion = L"Version" ;
//*****************************************************************************
//
// Function Name : CPCH_WINSOCK::EnumerateInstances
//
// Input Parameters : pMethodContext : Pointer to the MethodContext for
// communication with WinMgmt.
//
// lFlags : Long that contains the flags described
// in IWbemServices::CreateInstanceEnumAsync
// Note that the following flags are handled
// by (and filtered out by) WinMgmt:
// WBEM_FLAG_DEEP
// WBEM_FLAG_SHALLOW
// WBEM_FLAG_RETURN_IMMEDIATELY
// WBEM_FLAG_FORWARD_ONLY
// WBEM_FLAG_BIDIRECTIONAL
// Output Parameters : None
//
// Returns : WBEM_S_NO_ERROR
//
//
// Synopsis : There is a single instance of this class on the machine
// and this is returned..
// If there is no instances returns WBEM_S_NO_ERROR.
// It is not an error to have no instances.
//
//*****************************************************************************
HRESULT CPCH_WINSOCK::EnumerateInstances(MethodContext* pMethodContext,
long lFlags)
{
TraceFunctEnter("CPCH_Winsock::EnumerateInstances");
// Begin Declarations...................................................
HRESULT hRes = WBEM_S_NO_ERROR;
// PCH_WinSock Class instance
// CInstance *pPCHWinsockInstance;
// Strings
TCHAR tchBuf[MAX_PATH];
TCHAR tchTemp[MAX_PATH];
TCHAR szDirectory[MAX_PATH];
TCHAR tchWinsockDll[MAX_PATH];
LPCTSTR lpctstrWS2_32Dll = _T("ws2_32.dll");
LPCTSTR lpctstrWSock32Dll = _T("wsock32.dll");
LPCWSTR lpctstrFileSize = L"FileSize";
LPCTSTR lpctstrWSAStartup = _T("WSAStartup");
LPCTSTR lpctstrWSACleanup = _T("WSACleanup");
// WORDs
WORD wVersionRequested;
// WSAData
WSADATA wsaData;
// CComVariants
CComVariant varValue;
CComVariant varSnapshot = "Snapshot";
// ints
int nError;
// HINSTANCE
HINSTANCE hModule;
// OSVersion
OSVERSIONINFO osVersionInfo;
// SystemTime
SYSTEMTIME stUTCTime;
// Strings
CComBSTR bstrWinsockDllWithPath;
BOOL fWinsockDllFound = FALSE;
struct _stat filestat;
ULONG uiReturn;
IWbemClassObjectPtr pWinsockDllObj;
LPFN_WSASTARTUP WSAStartup;
LPFN_WSACLEANUP WSACleanup;
BOOL fCommit = FALSE;
// END Declarations
// There is only one instance of PCH_Winsock class
// Create a new instance of PCH_Winsock Class based on the passed-in MethodContext
CInstancePtr pPCHWinsockInstance(CreateNewInstance(pMethodContext), false);
// Get the date and time to update the TimeStamp Field
GetSystemTime(&stUTCTime);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TIME STAMP //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHWinsockInstance->SetDateTime(pTimeStamp, WBEMTime(stUTCTime));
if (FAILED(hRes))
{
// Could not Set the Time Stamp
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on Timestamp Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CHANGE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHWinsockInstance->SetVariant(pChange, varSnapshot);
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on Change Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// NAME //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Before callling GetVersionEx set dwOSVersionInfoSize to the foll.
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osVersionInfo) != 0)
{
if (osVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
if ((osVersionInfo.dwMajorVersion == nMajorVersion) && (osVersionInfo.dwMinorVersion >= nMinorVersion))
{
_tcscpy(tchWinsockDll, lpctstrWS2_32Dll);
}
else if (osVersionInfo.dwMajorVersion > nMajorVersion)
{
_tcscpy(tchWinsockDll, lpctstrWS2_32Dll);
}
else
{
_tcscpy(tchWinsockDll, lpctstrWSock32Dll);
}
} //end of osVersionInfo.... if
else if (osVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
_tcscpy(tchWinsockDll, lpctstrWS2_32Dll);
}
else
{
_tcscpy(tchWinsockDll, lpctstrWS2_32Dll);
}
} //end of if GetVersionEx
else
{
_tcscpy(tchWinsockDll, lpctstrWS2_32Dll);
}
// Got the right winsock DLL Name
// Load the Library
varValue = tchWinsockDll;
hModule = LoadLibrary(tchWinsockDll);
if (hModule == NULL)
{
goto END;
}
else
{
fCommit = TRUE;
}
try
{
hRes = pPCHWinsockInstance->SetVariant(pName, varValue);
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on Name Field failed.");
}
}
catch(...)
{
FreeLibrary(hModule);
throw;
}
if ((WSAStartup = (LPFN_WSASTARTUP) GetProcAddress(hModule, lpctstrWSAStartup)) == NULL)
{
FreeLibrary(hModule);
goto END;
}
if ((WSACleanup = (LPFN_WSACLEANUP) GetProcAddress(hModule, lpctstrWSACleanup)) == NULL)
{
FreeLibrary(hModule);
goto END;
}
try
{
wVersionRequested = MAKEWORD( 2, 0 );
nError = (*WSAStartup)( wVersionRequested, &wsaData );
if (nError != 0)
{
// Cannot get any winsock values
goto END;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SIZE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
fWinsockDllFound = getCompletePath(tchWinsockDll, bstrWinsockDllWithPath);
if(fWinsockDllFound)
{
// Got the complete Path , use this to get the filesize.
if(SUCCEEDED(GetCIMDataFile(bstrWinsockDllWithPath, &pWinsockDllObj)))
{
// From the CIM_DataFile Object get the size property
CopyProperty(pWinsockDllObj, lpctstrFileSize, pPCHWinsockInstance, pSize);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VERSION //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
_stprintf(tchBuf, "%d.%d", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
varValue = tchBuf;
hRes = pPCHWinsockInstance->SetVariant(pVersion, varValue);
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on Version Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DESCRIPTION // KAYANI -9++***************************---------------------------------------------------------+++
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (_tcslen(wsaData.szDescription) < sizeof(tchBuf))
{
_tcscpy(tchBuf, wsaData.szDescription);
}
else
{
_tcsncpy(tchBuf, wsaData.szDescription, sizeof(tchBuf)-1);
tchBuf[sizeof(tchBuf)] = 0;
}
varValue = tchBuf;
hRes = pPCHWinsockInstance->SetVariant(pDescription, varValue);
if(FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on Description Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SYSTEMSTATUS //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (_tcslen(wsaData.szSystemStatus) < sizeof(tchBuf))
_tcscpy(tchBuf, wsaData.szSystemStatus);
else
{
_tcsncpy(tchBuf, wsaData.szSystemStatus, sizeof(tchBuf)-1);
tchBuf[sizeof(tchBuf)] = 0;
}
varValue = tchBuf;
hRes = pPCHWinsockInstance->SetVariant(pSystemStatus, varValue);
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on SystemStatus Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MAXUDP //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (LOBYTE(wsaData.wHighVersion) >= 2)
{
varValue = 0;
}
else
{
varValue = wsaData.iMaxUdpDg;
}
hRes = pPCHWinsockInstance->SetVariant(pMaxUDP, varValue);
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on MAXUDP Field failed.");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MAXSOCKETS //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (LOBYTE(wsaData.wHighVersion) >= 2)
{
varValue = 0;
}
else
{
varValue = wsaData.iMaxSockets;
}
hRes = pPCHWinsockInstance->SetVariant(pMaxSockets, varValue);
if (FAILED(hRes))
{
// Could not Set the Change Property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on MaxSockets Field failed.");
}
if(fCommit)
{
hRes = pPCHWinsockInstance->Commit();
if (FAILED(hRes))
{
// Could not Commit
// Continue anyway
ErrorTrace(TRACE_ID, "Commit failed.");
}
}
if(0 != (*WSACleanup)())
{
// Could not Cleanup
// Continue anyway
ErrorTrace(TRACE_ID, "WSACleanup failed.");
}
FreeLibrary(hModule);
}
catch(...)
{
if(0 != (*WSACleanup)())
{
// Could not Cleanup
// Continue anyway
ErrorTrace(TRACE_ID, "WSACleanup failed.");
}
FreeLibrary(hModule);
throw;
}
END: TraceFunctLeave();
return hRes ;
}