#include "util.h" WCHAR g_szwIds[MAX_PATH + 1]; WCHAR g_szwSpace[MAX_PATH + 1]; WCHAR * ids(LONG nIndex) { if( LoadString((HINSTANCE)g_hModule,nIndex,g_szwIds,MAX_PATH) ) { return g_szwIds; } else { return L""; } } WCHAR * Space( int nSpace ) { for(int i=0; i 1 && pszwSrch[nLen -1] == L'*' ) { // The search string ends with a '*'. check if the search // string is contained in the instance string // if( wcsstri(pszwInstance,pszwSrch,nLen-1) ) { // Search string is contain within the instance string // return TRUE; } } if( lstrcmpi(pszwInstance,pszwSrch) == 0 ) { // No '*'. Check if the strings are the same // return TRUE; } // Strings do not resemble each other // return FALSE; } void ToLowerStr( WCHAR *pszwText ) { while( pszwText && *pszwText ) { *pszwText = towlower(*pszwText); pszwText++; } } BOOLEAN wcsstri( IN LPCTSTR pszw, IN LPCTSTR pszwSrch, IN int nLen ) { BOOLEAN bMatch = FALSE; int i=0,j=0; if( !pszw || !pszwSrch ) { // Invalid pointers // return FALSE; } for(i=0; pszw[i]!=L'\0'; i++) { if( j == nLen ) { return bMatch; } if( pszwSrch[j] == L'\0' ) { return bMatch; } if( towlower(pszw[i]) == towlower(pszwSrch[j]) ) { j++; bMatch = TRUE; } else { j=0; bMatch = FALSE; } } return FALSE; } BOOLEAN IsVariantEmpty(_variant_t &vValue) { _bstr_t bstr; if( SUCCEEDED(GetVariant(vValue,0,bstr)) ) { return lstrcmp(bstr,L"") == 0; } return TRUE; } BOOLEAN MakeIPByteArray(LPCTSTR pszwIPAddress, BYTE bIPByte[]) { LONG nByteValue = 0; LONG nByte = 0; for(int i=0; pszwIPAddress[i]!=0; i++) { if( pszwIPAddress[i] == L'.') { if( nByteValue > 255 ) { return FALSE; } bIPByte[nByte] = nByteValue; nByteValue = 0; nByte++; } else { if( !iswdigit(pszwIPAddress[i]) ) { return FALSE; } nByteValue = nByteValue * 10 + (pszwIPAddress[i] - L'0'); } } bIPByte[nByte] = nByteValue; return (nByte != 3)?FALSE:TRUE; } /* BOOLEAN IsInvalidIPAddress(LPCTSTR pszwIPAddress) { BYTE bIPByte[4]; if( MakeIPByteArray(pszwIPAddress,bIPByte) ) { INT iZeroCount = 0; INT i255Count = 0; for(INT i=0; i<4; i++) { if( pszwIPAddress[i] == 0 ) { iZeroCount++; } if( pszwIPAddress[i] == 255 ) { i255Count++; } } if( i255Count == 4 || iZeroCount == 4 ) { return TRUE; } } return FALSE; } */ BOOLEAN IsSameSubnet( IN LPCTSTR pszwIP1, IN LPCTSTR pszwIP2, IN LPCTSTR pszwSubnetMask ) /*++ Routine Description This method determines if two IP address are in the same subnet. Arguments pszwIP1 IP Address one pszwIP2 IP Address two pszwSubnetMask Subnet mask Return Value TRUE if they are in the same subnet FALSE if they are not in the smae subnet --*/ { BYTE bIP1[4]; BYTE bIP2[4]; BYTE bSubnetMask[4]; int iRetVal; if( !MakeIPByteArray(pszwIP1,bIP1) ) { return FALSE; } if( !MakeIPByteArray(pszwIP2,bIP2) ) { return FALSE; } if( !MakeIPByteArray(pszwSubnetMask,bSubnetMask) ) { return FALSE; } // Check if IP1 and IP2 are in the same subnet // for( int i = 0; i< 4; i++) { // If (IP1 & with Subnetmas) == (IP2 & with subnet) then they are in the same subnet // if( (bIP1[i] & bSubnetMask[i]) != (bIP2[i] & bSubnetMask[i]) ) { // No the same subnet // return FALSE; } } // Same subnet // return TRUE; } BOOLEAN IsSameSubnet( IN _variant_t *vIPAddress, IN _variant_t *vSubnetMask, IN WCHAR *pszwIPAddress2 ) { DWORD i = 0; DWORD j = 0; _bstr_t bstrIP; _bstr_t bstrSubnetMask; if( !vIPAddress || !vSubnetMask || !pszwIPAddress2 ) { return FALSE; } while( S_OK == GetVariant(*vIPAddress,i,bstrIP) ) { j = 0; while( S_OK == GetVariant(*vSubnetMask,j,bstrSubnetMask) ) { if( IsSameSubnet(bstrIP, pszwIPAddress2, bstrSubnetMask) ) { return TRUE; } j++; } i++; } return FALSE; } HRESULT GetVariant( IN _variant_t &vValue, IN long nIndex, OUT _bstr_t &bstr ) /*++ Routine Description This method extracts nth piece of data from a variant, converts it into a bstring and returns the bstring. Arguments vValue Variant to extract data from nIndex The index into the variant array (for non-arrays nIndex always is 0) bstr Stores the variant as a bstr Return Value S_OK successfull else HRESULT --*/ { HRESULT hr = S_FALSE; BYTE g[100]; LPVOID pData = (LPVOID)g; WCHAR szw[MAX_PATH]; _variant_t vTmp; if( nIndex >= 25 ) { // The array is to big. We are cutting it short return E_INVALIDARG; } if( (vValue.vt & VT_ARRAY) ) { // The variant contains an array. get the nIndex element from the array // hr = SafeArrayGetElement(vValue.parray,&nIndex,pData); if( S_OK == hr ) { // Convert the extracted data into a string // switch( vValue.vt & ~VT_ARRAY ) { case VT_BSTR: bstr = (BSTR)*((BSTR *)pData); return S_OK; case VT_I2: bstr = (short)*((short *)pData); return S_OK; case VT_I4: bstr = (long)*((LONG *)pData); return S_OK; case VT_UI1: bstr = (BYTE)*((BYTE *)pData); return S_OK; case VT_NULL: return S_FALSE; case VT_EMPTY: return S_FALSE; case VT_BOOL: { if( (VARIANT_BOOL *)pData ) { bstr = ids(IDS_TRUE); } else { bstr = ids(IDS_FALSE); } } default: bstr = L""; return S_OK; } } } else { if( nIndex == 0) { // The variant is not an array. In this case nIndex always needs to be 0 // if( vValue.vt == VT_NULL || vValue.vt == VT_EMPTY) { // The variant is empty // bstr = L""; return S_FALSE; } else if( (vValue.vt == VT_EMPTY) || (vValue.vt == VT_BSTR && lstrlen(vValue.bstrVal) == 0) ) { // The variant is empty // bstr = L""; return S_FALSE; } else if( vValue.vt == VT_BOOL ) { if( vValue.boolVal ) { bstr = ids(IDS_TRUE); } else { bstr = ids(IDS_FALSE); } } else { // The variant contains valid data. Convert the data into a bstring. // vTmp = vValue; vTmp.ChangeType(VT_BSTR); bstr = vTmp.bstrVal; } return S_OK; } } return E_INVALIDARG; }