#include "uiutils.h" BOOL ADDRESS_CHECK::LocateName( BOOL fGrant, DWORD iIndex, PNAME_HEADER* ppHd, PNAME_LIST_ENTRY* pHeader, LPDWORD piIndexInHeader ) /*++ Routine Description: Locate a name in the specified list, returns ptr to header & element in address list Arguments: fGrant - TRUE to locate in grant list, FALSE for deny list iIndex - index in list ( 0-based ) ppHd - updated with ptr to name header pHeader - updated with ptr to name list entry piIndexInHeader - updated with index in array pHeader->iName Return Value: TRUE if iIndex valid in array defined by fGrant, FALSE otherwise --*/ { LPBYTE pStore = m_Storage.GetAlloc(); PADDRESS_CHECK_LIST pList; PNAME_HEADER pHd; PNAME_LIST_ENTRY pE; UINT iL; if ( pStore ) { pList = (PADDRESS_CHECK_LIST)pStore; *ppHd = pHd = (PNAME_HEADER)MAKEPTR( pStore, fGrant ? pList->iGrantName : pList->iDenyName); pE = (PNAME_LIST_ENTRY)((LPBYTE)pHd + sizeof(NAME_HEADER)); for ( iL = 0 ; iL < pHd->cEntries ; ++iL ) { if ( iIndex < pE->cNames ) { *pHeader = pE; *piIndexInHeader = iIndex; return TRUE; } iIndex -= pE->cNames; pE = (PNAME_LIST_ENTRY)((LPBYTE)pE + sizeof(NAME_LIST_ENTRY) + pE->cNames * sizeof(SELFREFINDEX)); } } return FALSE; } //inline DWORD ADDRESS_CHECK::GetNbAddr( BOOL fGrant ) /*++ Routine Description: Get number of entries in list Arguments: fGrant - TRUE to locate in grant list, FALSE for deny list Return Value: Number of entries in list --*/ { LPBYTE pStore = m_Storage.GetAlloc(); PADDRESS_CHECK_LIST pList; PADDRESS_HEADER pHd; if ( pStore ) { pList = (PADDRESS_CHECK_LIST)pStore; pHd = (PADDRESS_HEADER)MAKEPTR( pStore, fGrant ? pList->iGrantAddr : pList->iDenyAddr); return pHd->cAddresses; } return 0; } BOOL ADDRESS_CHECK::BindCheckList( LPBYTE p, DWORD c ) /*++ Routine Description: Bind a check list ( presented as a BLOB ) to an ADDRESS_CHECK object Arguments: p - ptr to BLOB c - size of BLOB Return Value: TRUE if successful, FALSE otherwise --*/ { PADDRESS_CHECK_LIST pList; UINT l; /* if ( p == NULL ) { if ( m_Storage.Init() && m_Storage.Resize( sizeof(ADDRESS_CHECK_LIST) + sizeof(ADDRESS_HEADER) * 2 + sizeof(NAME_HEADER) * 2 ) ) { DWORD i; pList = (PADDRESS_CHECK_LIST)m_Storage.GetAlloc(); pList->iDenyAddr = i = MAKEREF( sizeof(ADDRESS_CHECK_LIST) ); i += sizeof(ADDRESS_HEADER); pList->iGrantAddr = i; i += sizeof(ADDRESS_HEADER); pList->iDenyName = i; i += sizeof(NAME_HEADER); pList->iGrantName = i; i += sizeof(NAME_HEADER); pList->cRefSize = MAKEOFFSET(i); pList->dwFlags = RDNS_FLAG_DODNS2IPCHECK; return TRUE; } else { return FALSE; } } else */ { return m_Storage.Init( p, c ); } } BOOL ADDRESS_CHECK::GetAddr( BOOL fGrant, DWORD iIndex, LPDWORD pdwFamily, LPBYTE* pMask, LPBYTE* pAddr ) /*++ Routine Description: Get an address entry Arguments: fGrant - TRUE to locate in grant list, FALSE for deny list iIndex - index in list (0-based ) pdwFamily - updated with address family ( as in sockaddr.sa_type ) pMask - updated with ptr to mask pAddr - updated with ptr to address Return Value: TRUE if iIndex valid in array defined by fGrant, FALSE otherwise --*/ { PADDRESS_LIST_ENTRY pHeader; PADDRESS_HEADER pHd; DWORD iIndexInHeader; LPBYTE pStore = m_Storage.GetAlloc(); if ( LocateAddr( fGrant, iIndex, &pHd, &pHeader, &iIndexInHeader ) ) { UINT cS = GetAddrSize( pHeader->iFamily ); *pdwFamily = pHeader->iFamily; pStore = MAKEPTR(pStore, pHeader->iFirstAddress); *pMask = pStore; *pAddr = pStore+iIndexInHeader*cS; return TRUE; } return FALSE; } BOOL ADDRESS_CHECK::GetName( BOOL fGrant, DWORD iIndex, LPSTR* ppName, LPDWORD pdwFlags ) /*++ Routine Description: Get DNS name in specified list Arguments: fGrant - TRUE to locate in grant list, FALSE for deny list iIndex - index (0-based) in specified list ppName - updated with ptr to DNS name pdwFlags - updated with DNS flags, can be NULL Return Value: TRUE if iIndex valid in specified list, otherwise FALSE --*/ { PNAME_LIST_ENTRY pHeader; PNAME_HEADER pHd; DWORD iIndexInHeader; LPBYTE pStore = m_Storage.GetAlloc(); if ( LocateName( fGrant, iIndex, &pHd, &pHeader, &iIndexInHeader ) ) { *ppName = (LPSTR)MAKEPTR(pStore, pHeader->iName[iIndexInHeader] ); if ( pdwFlags ) { *pdwFlags = pHeader->cComponents & DNSLIST_FLAGS; } return TRUE; } return FALSE; } DWORD ADDRESS_CHECK::GetNbName( BOOL fGrant ) /*++ Routine Description: Get number of entries in list Arguments: fGrant - TRUE to locate in grant list, FALSE for deny list Return Value: Number of entries in list --*/ { LPBYTE pStore = m_Storage.GetAlloc(); PADDRESS_CHECK_LIST pList; PNAME_HEADER pHd; if ( pStore ) { pList = (PADDRESS_CHECK_LIST)pStore; pHd = (PNAME_HEADER)MAKEPTR( pStore, fGrant ? pList->iGrantName : pList->iDenyName); return pHd->cNames; } return 0; } UINT ADDRESS_CHECK::GetAddrSize( DWORD dwF ) /*++ Routine Description: Returns address size in byte based on family ( sockaddr.sa_type ) Arguments: dwF - address family ( as in sockaddr.sa_type ) Return Value: Address length, in byte. 0 for unknown address families --*/ { DWORD dwS; // switch ( dwF ) // { // case AF_INET: dwS = SIZEOF_IP_ADDRESS; // break; // default: // dwS = 0; // break; // } return dwS; } BOOL ADDRESS_CHECK::LocateAddr( BOOL fGrant, DWORD iIndex, PADDRESS_HEADER* ppHd, PADDRESS_LIST_ENTRY* pHeader, LPDWORD piIndexInHeader ) /*++ Routine Description: Locate an address in the specified list, returns ptr to header & element in address list Arguments: fGrant - TRUE to locate in grant list, FALSE for deny list iIndex - index in list (0-based ) ppHd - updated with ptr to address header pHeader - updated with ptr to address list entry piIndexInHeader - updated with index in array addressed by pHeader->iFirstAddress Return Value: TRUE if iIndex valid in array defined by fGrant, FALSE otherwise --*/ { LPBYTE pStore = m_Storage.GetAlloc(); PADDRESS_CHECK_LIST pList; PADDRESS_HEADER pHd; UINT iL; if ( pStore ) { pList = (PADDRESS_CHECK_LIST)pStore; *ppHd = pHd = (PADDRESS_HEADER)MAKEPTR( pStore, fGrant ? pList->iGrantAddr : pList->iDenyAddr); for ( iL = 0 ; iL < pHd->cEntries ; ++iL ) { // adjust index by 1: 1st entry is mask if ( iIndex < (pHd->Entries[iL].cAddresses-1) ) { *pHeader = pHd->Entries+iL; *piIndexInHeader = iIndex+1; return TRUE; } iIndex -= (pHd->Entries[iL].cAddresses-1); } } return FALSE; }