diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h deleted file mode 100644 index 83e39fd7ff08..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#include "percpu.h" - - -class ALLOC_CACHE_HANDLER -{ -public: - - ALLOC_CACHE_HANDLER( - VOID - ); - - ~ALLOC_CACHE_HANDLER( - VOID - ); - - HRESULT - Initialize( - DWORD cbSize, - LONG nThreshold - ); - - LPVOID - Alloc( - VOID - ); - - VOID - Free( - __in LPVOID pMemory - ); - - -private: - - VOID - CleanupLookaside( - VOID - ); - - DWORD - QueryDepthForAllSLists( - VOID - ); - - LONG m_nThreshold; - DWORD m_cbSize; - - PER_CPU * m_pFreeLists; - - // - // Total heap allocations done over the lifetime. - // Note that this is not interlocked, it is just a hint for debugging. - // - volatile LONG m_nTotal; - - LONG m_nFillPattern; - -public: - - static - HRESULT - StaticInitialize( - VOID - ); - - static - VOID - StaticTerminate( - VOID - ); - - static - BOOL - IsPageheapEnabled(); - -private: - - static LONG sm_nFillPattern; - static HANDLE sm_hHeap; -}; - - -// You can use ALLOC_CACHE_HANDLER as a per-class allocator -// in your C++ classes. Add the following to your class definition: -// -// protected: -// static ALLOC_CACHE_HANDLER* sm_palloc; -// public: -// static void* operator new(size_t s) -// { -// IRTLASSERT(s == sizeof(C)); -// IRTLASSERT(sm_palloc != NULL); -// return sm_palloc->Alloc(); -// } -// static void operator delete(void* pv) -// { -// IRTLASSERT(pv != NULL); -// if (sm_palloc != NULL) -// sm_palloc->Free(pv); -// } -// -// Obviously, you must initialize sm_palloc before you can allocate -// any objects of this class. -// -// Note that if you derive a class from this base class, the derived class -// must also provide its own operator new and operator delete. If not, the -// base class's allocator will be called, but the size of the derived -// object will almost certainly be larger than that of the base object. -// Furthermore, the allocator will not be used for arrays of objects -// (override operator new[] and operator delete[]), but this is a -// harder problem since the allocator works with one fixed size. diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx deleted file mode 100644 index 871c7e8e0f78..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _BASE64_HXX_ -#define _BASE64_HXX_ - -DWORD -Base64Encode( - __in_bcount( cbDecodedBufferSize ) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt( cchEncodedStringSize ) PWSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ); - -DWORD -Base64Decode( - __in PCWSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ); - -DWORD -Base64Encode( - __in_bcount( cbDecodedBufferSize ) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt( cchEncodedStringSize ) PSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ); - -DWORD -Base64Decode( - __in PCSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ); - -#endif // _BASE64_HXX_ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h deleted file mode 100644 index 82ac441abd3f..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _DATETIME_H_ -#define _DATETIME_H_ - -BOOL -StringTimeToFileTime( - PCSTR pszTime, - ULONGLONG * pulTime -); - -#endif - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h deleted file mode 100644 index 39033973ce11..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#define DEBUG_FLAG_INFO 0x00000001 -#define DEBUG_FLAG_WARN 0x00000002 -#define DEBUG_FLAG_ERROR 0x00000004 - -// -// Predefined error level values. These are backwards from the -// windows definitions. -// - -#define DEBUG_FLAGS_INFO (DEBUG_FLAG_ERROR | DEBUG_FLAG_WARN | DEBUG_FLAG_INFO) -#define DEBUG_FLAGS_WARN (DEBUG_FLAG_ERROR | DEBUG_FLAG_WARN) -#define DEBUG_FLAGS_ERROR (DEBUG_FLAG_ERROR) -#define DEBUG_FLAGS_ANY (DEBUG_FLAG_INFO | DEBUG_FLAG_WARN | DEBUG_FLAG_ERROR) - -#define DEBUG_FLAGS_REGISTRY_LOCATION_A "DebugFlags" - -extern DWORD g_dwDebugFlags; - -static -BOOL -IfDebug( - DWORD dwFlag - ) -{ - return ( dwFlag & g_dwDebugFlags ); -} - -static -VOID -DebugPrint( - DWORD dwFlag, - LPCSTR szString - ) -{ - STBUFF strOutput; - HRESULT hr; - - if ( IfDebug( dwFlag ) ) - { - hr = strOutput.Printf( "[dipmodule.dll] %s\r\n", - szString ); - - if ( FAILED( hr ) ) - { - goto Finished; - } - - OutputDebugStringA( strOutput.QueryStr() ); - } - -Finished: - - return; -} - -static -VOID -DebugPrintf( -DWORD dwFlag, -LPCSTR szFormat, -... -) -{ - STBUFF strCooked; - STBUFF strOutput; - va_list args; - HRESULT hr; - - if ( IfDebug( dwFlag ) ) - { - va_start( args, szFormat ); - - hr = strCooked.Vsprintf( (LPSTR)szFormat, args ); - - va_end( args ); - - if ( FAILED( hr ) ) - { - goto Finished; - } - - DebugPrint( dwFlag, strCooked.QueryStr() ); - } - -Finished: - - return; -} - -static void ReadDebugFlagFromRegistryKey(const char* pszRegKey, IN DWORD dwDefault) -{ - HKEY hkey = NULL; - g_dwDebugFlags = dwDefault; - DWORD dwType; - DWORD dwBuffer; - DWORD cbBuffer = sizeof(dwBuffer); - - DWORD dwError = RegOpenKeyExA(HKEY_LOCAL_MACHINE, - pszRegKey, - 0, - KEY_READ, - &hkey); - if ( dwError == NO_ERROR && hkey != NULL) - { - dwError = RegQueryValueExA( hkey, - DEBUG_FLAGS_REGISTRY_LOCATION_A, - NULL, - &dwType, - (LPBYTE)&dwBuffer, - &cbBuffer ); - if( ( dwError == NO_ERROR ) && ( dwType == REG_DWORD ) ) - { - g_dwDebugFlags = dwBuffer; - } - RegCloseKey( hkey); - hkey = NULL; - } -} - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h deleted file mode 100644 index a86b0a135881..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef __HASHFN_H__ -#define __HASHFN_H__ - - -// Produce a scrambled, randomish number in the range 0 to RANDOM_PRIME-1. -// Applying this to the results of the other hash functions is likely to -// produce a much better distribution, especially for the identity hash -// functions such as Hash(char c), where records will tend to cluster at -// the low end of the hashtable otherwise. LKRhash applies this internally -// to all hash signatures for exactly this reason. - -inline DWORD -HashScramble(DWORD dwHash) -{ - // Here are 10 primes slightly greater than 10^9 - // 1000000007, 1000000009, 1000000021, 1000000033, 1000000087, - // 1000000093, 1000000097, 1000000103, 1000000123, 1000000181. - - // default value for "scrambling constant" - const DWORD RANDOM_CONSTANT = 314159269UL; - // large prime number, also used for scrambling - const DWORD RANDOM_PRIME = 1000000007UL; - - return (RANDOM_CONSTANT * dwHash) % RANDOM_PRIME ; -} - - -// Faster scrambling function suggested by Eric Jacobsen - -inline DWORD -HashRandomizeBits(DWORD dw) -{ - return (((dw * 1103515245 + 12345) >> 16) - | ((dw * 69069 + 1) & 0xffff0000)); -} - - -// Small prime number used as a multiplier in the supplied hash functions -const DWORD HASH_MULTIPLIER = 101; - -#undef HASH_SHIFT_MULTIPLY - -#ifdef HASH_SHIFT_MULTIPLY -# define HASH_MULTIPLY(dw) (((dw) << 7) - (dw)) -#else -# define HASH_MULTIPLY(dw) ((dw) * HASH_MULTIPLIER) -#endif - -// Fast, simple hash function that tends to give a good distribution. -// Apply HashScramble to the result if you're using this for something -// other than LKRhash. - -inline DWORD -HashString( - const char* psz, - DWORD dwHash = 0) -{ - // force compiler to use unsigned arithmetic - const unsigned char* upsz = (const unsigned char*) psz; - - for ( ; *upsz; ++upsz) - dwHash = HASH_MULTIPLY(dwHash) + *upsz; - - return dwHash; -} - -inline DWORD -HashString( - __in_ecount(cch) const char* psz, - __in DWORD cch, - __in DWORD dwHash -) -{ - // force compiler to use unsigned arithmetic - const unsigned char* upsz = (const unsigned char*) psz; - - for (DWORD Index = 0; - Index < cch; - ++Index, ++upsz) - { - dwHash = HASH_MULTIPLY(dwHash) + *upsz; - } - - return dwHash; -} - - -// Unicode version of above - -inline DWORD -HashString( - const wchar_t* pwsz, - DWORD dwHash = 0) -{ - for ( ; *pwsz; ++pwsz) - dwHash = HASH_MULTIPLY(dwHash) + *pwsz; - - return dwHash; -} - -// Based on length of the string instead of null-terminating character - -inline DWORD -HashString( - __in_ecount(cch) const wchar_t* pwsz, - __in DWORD cch, - __in DWORD dwHash -) -{ - for (DWORD Index = 0; - Index < cch; - ++Index, ++pwsz) - { - dwHash = HASH_MULTIPLY(dwHash) + *pwsz; - } - - return dwHash; -} - - -// Quick-'n'-dirty case-insensitive string hash function. -// Make sure that you follow up with _stricmp or _mbsicmp. You should -// also cache the length of strings and check those first. Caching -// an uppercase version of a string can help too. -// Again, apply HashScramble to the result if using with something other -// than LKRhash. -// Note: this is not really adequate for MBCS strings. - -inline DWORD -HashStringNoCase( - const char* psz, - DWORD dwHash = 0) -{ - const unsigned char* upsz = (const unsigned char*) psz; - - for ( ; *upsz; ++upsz) - dwHash = HASH_MULTIPLY(dwHash) - + (*upsz & 0xDF); // strip off lowercase bit - - return dwHash; -} - -inline DWORD -HashStringNoCase( - __in_ecount(cch) - const char* psz, - SIZE_T cch, - DWORD dwHash) -{ - const unsigned char* upsz = (const unsigned char*) psz; - - for (SIZE_T Index = 0; - Index < cch; - ++Index, ++upsz) - { - dwHash = HASH_MULTIPLY(dwHash) - + (*upsz & 0xDF); // strip off lowercase bit - } - return dwHash; -} - - -// Unicode version of above - -inline DWORD -HashStringNoCase( - const wchar_t* pwsz, - DWORD dwHash = 0) -{ - for ( ; *pwsz; ++pwsz) - dwHash = HASH_MULTIPLY(dwHash) + (*pwsz & 0xFFDF); - - return dwHash; -} - -// Unicode version of above with length - -inline DWORD -HashStringNoCase( - __in_ecount(cch) - const wchar_t* pwsz, - SIZE_T cch, - DWORD dwHash) -{ - for (SIZE_T Index = 0; - Index < cch; - ++Index, ++pwsz) - { - dwHash = HASH_MULTIPLY(dwHash) + (*pwsz & 0xFFDF); - } - return dwHash; -} - - -// HashBlob returns the hash of a blob of arbitrary binary data. -// -// Warning: HashBlob is generally not the right way to hash a class object. -// Consider: -// class CFoo { -// public: -// char m_ch; -// double m_d; -// char* m_psz; -// }; -// -// inline DWORD Hash(const CFoo& rFoo) -// { return HashBlob(&rFoo, sizeof(CFoo)); } -// -// This is the wrong way to hash a CFoo for two reasons: (a) there will be -// a 7-byte gap between m_ch and m_d imposed by the alignment restrictions -// of doubles, which will be filled with random data (usually non-zero for -// stack variables), and (b) it hashes the address (rather than the -// contents) of the string m_psz. Similarly, -// -// bool operator==(const CFoo& rFoo1, const CFoo& rFoo2) -// { return memcmp(&rFoo1, &rFoo2, sizeof(CFoo)) == 0; } -// -// does the wrong thing. Much better to do this: -// -// DWORD Hash(const CFoo& rFoo) -// { -// return HashString(rFoo.m_psz, -// HASH_MULTIPLIER * Hash(rFoo.m_ch) -// + Hash(rFoo.m_d)); -// } -// -// Again, apply HashScramble if using with something other than LKRhash. - -inline DWORD -HashBlob( - const void* pv, - size_t cb, - DWORD dwHash = 0) -{ - const BYTE * pb = static_cast(pv); - - while (cb-- > 0) - dwHash = HASH_MULTIPLY(dwHash) + *pb++; - - return dwHash; -} - - - -// -// Overloaded hash functions for all the major builtin types. -// Again, apply HashScramble to result if using with something other than -// LKRhash. -// - -inline DWORD Hash(const char* psz) -{ return HashString(psz); } - -inline DWORD Hash(const unsigned char* pusz) -{ return HashString(reinterpret_cast(pusz)); } - -inline DWORD Hash(const signed char* pssz) -{ return HashString(reinterpret_cast(pssz)); } - -inline DWORD Hash(const wchar_t* pwsz) -{ return HashString(pwsz); } - -inline DWORD -Hash( - const GUID* pguid, - DWORD dwHash = 0) -{ - - return * reinterpret_cast(const_cast(pguid)) + dwHash; -} - -// Identity hash functions: scalar values map to themselves -inline DWORD Hash(char c) -{ return c; } - -inline DWORD Hash(unsigned char uc) -{ return uc; } - -inline DWORD Hash(signed char sc) -{ return sc; } - -inline DWORD Hash(short sh) -{ return sh; } - -inline DWORD Hash(unsigned short ush) -{ return ush; } - -inline DWORD Hash(int i) -{ return i; } - -inline DWORD Hash(unsigned int u) -{ return u; } - -inline DWORD Hash(long l) -{ return l; } - -inline DWORD Hash(unsigned long ul) -{ return ul; } - -inline DWORD Hash(float f) -{ - // be careful of rounding errors when computing keys - union { - float f; - DWORD dw; - } u; - u.f = f; - return u.dw; -} - -inline DWORD Hash(double dbl) -{ - // be careful of rounding errors when computing keys - union { - double dbl; - DWORD dw[2]; - } u; - u.dbl = dbl; - return u.dw[0] * HASH_MULTIPLIER + u.dw[1]; -} - -#endif // __HASHFN_H__ diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h deleted file mode 100644 index a3cd2f5049fd..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h +++ /dev/null @@ -1,666 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#include -#include "rwlock.h" -#include "prime.h" - -template -class HASH_NODE -{ - template - friend class HASH_TABLE; - - HASH_NODE( - _Record * pRecord, - DWORD dwHash - ) : _pNext (NULL), - _pRecord (pRecord), - _dwHash (dwHash) - {} - - ~HASH_NODE() - { - _ASSERTE(_pRecord == NULL); - } - - private: - // Next node in the hash table look-aside - HASH_NODE<_Record> *_pNext; - - // actual record - _Record * _pRecord; - - // hash value - DWORD _dwHash; -}; - -template -class HASH_TABLE -{ -protected: - typedef BOOL - (PFN_DELETE_IF)( - _Record * pRecord, - PVOID pvContext - ); - - typedef VOID - (PFN_APPLY)( - _Record * pRecord, - PVOID pvContext - ); - -public: - HASH_TABLE( - VOID - ) - : _ppBuckets( NULL ), - _nBuckets( 0 ), - _nItems( 0 ) - { - } - - virtual - ~HASH_TABLE(); - - virtual - VOID - ReferenceRecord( - _Record * pRecord - ) = 0; - - virtual - VOID - DereferenceRecord( - _Record * pRecord - ) = 0; - - virtual - _Key - ExtractKey( - _Record * pRecord - ) = 0; - - virtual - DWORD - CalcKeyHash( - _Key key - ) = 0; - - virtual - BOOL - EqualKeys( - _Key key1, - _Key key2 - ) = 0; - - DWORD - Count( - VOID - ) const; - - bool - IsInitialized( - VOID - ) const; - - virtual - VOID - Clear(); - - HRESULT - Initialize( - DWORD nBucketSize - ); - - virtual - VOID - FindKey( - _Key key, - _Record ** ppRecord - ); - - virtual - HRESULT - InsertRecord( - _Record * pRecord - ); - - virtual - VOID - DeleteKey( - _Key key - ); - - virtual - VOID - DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext - ); - - VOID - Apply( - PFN_APPLY pfnApply, - PVOID pvContext - ); - -private: - - __success(*ppNode != NULL && return != FALSE) - BOOL - FindNodeInternal( - _Key key, - DWORD dwHash, - __deref_out - HASH_NODE<_Record> ** ppNode, - __deref_opt_out - HASH_NODE<_Record> *** pppPreviousNodeNextPointer = NULL - ); - - VOID - DeleteNode( - HASH_NODE<_Record> * pNode - ) - { - if (pNode->_pRecord != NULL) - { - DereferenceRecord(pNode->_pRecord); - pNode->_pRecord = NULL; - } - - delete pNode; - } - - VOID - RehashTableIfNeeded( - VOID - ); - - HASH_NODE<_Record> ** _ppBuckets; - DWORD _nBuckets; - DWORD _nItems; - // - // Allow to use lock object in const methods. - // - mutable - CWSDRWLock _tableLock; -}; - -template -HRESULT -HASH_TABLE<_Record,_Key>::Initialize( - DWORD nBuckets -) -{ - HRESULT hr = S_OK; - - if ( nBuckets == 0 ) - { - hr = E_INVALIDARG; - goto Failed; - } - - if (nBuckets >= MAXDWORD/sizeof(HASH_NODE<_Record> *)) - { - hr = E_INVALIDARG; - goto Failed; - } - - _ASSERTE(_ppBuckets == NULL ); - if ( _ppBuckets != NULL ) - { - hr = E_INVALIDARG; - goto Failed; - } - - hr = _tableLock.Init(); - if ( FAILED( hr ) ) - { - goto Failed; - } - - _ppBuckets = (HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(HASH_NODE<_Record> *)); - if (_ppBuckets == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Failed; - } - _nBuckets = nBuckets; - - return S_OK; - -Failed: - - if (_ppBuckets) - { - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - } - - return hr; -} - - -template -HASH_TABLE<_Record,_Key>::~HASH_TABLE() -{ - if (_ppBuckets == NULL) - { - return; - } - - _ASSERTE(_nItems == 0); - - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - _nBuckets = 0; -} - -template< class _Record, class _Key> -DWORD -HASH_TABLE<_Record,_Key>::Count() const -{ - return _nItems; -} - -template< class _Record, class _Key> -bool -HASH_TABLE<_Record,_Key>::IsInitialized( - VOID -) const -{ - return _ppBuckets != NULL; -} - - -template -VOID -HASH_TABLE<_Record,_Key>::Clear() -{ - HASH_NODE<_Record> *pCurrent; - HASH_NODE<_Record> *pNext; - - // This is here in the off cases where someone instantiates a hashtable - // and then does an automatic "clear" before its destruction WITHOUT - // ever initializing it. - if ( ! _tableLock.QueryInited() ) - { - return; - } - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pCurrent = _ppBuckets[i]; - _ppBuckets[i] = NULL; - while (pCurrent != NULL) - { - pNext = pCurrent->_pNext; - DeleteNode(pCurrent); - pCurrent = pNext; - } - } - - _nItems = 0; - _tableLock.ExclusiveRelease(); -} - -template -__success(*ppNode != NULL && return != FALSE) -BOOL -HASH_TABLE<_Record,_Key>::FindNodeInternal( - _Key key, - DWORD dwHash, - __deref_out - HASH_NODE<_Record> ** ppNode, - __deref_opt_out - HASH_NODE<_Record> *** pppPreviousNodeNextPointer -) -/*++ - Return value indicates whether the item is found - key, dwHash - key and hash for the node to find - ppNode - on successful return, the node found, on failed return, the first - node with hash value greater than the node to be found - pppPreviousNodeNextPointer - the pointer to previous node's _pNext - - This routine may be called under either read or write lock ---*/ -{ - HASH_NODE<_Record> **ppPreviousNodeNextPointer; - HASH_NODE<_Record> *pNode; - BOOL fFound = FALSE; - - ppPreviousNodeNextPointer = _ppBuckets + (dwHash % _nBuckets); - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - if (pNode->_dwHash == dwHash) - { - if (EqualKeys(key, - ExtractKey(pNode->_pRecord))) - { - fFound = TRUE; - break; - } - } - else if (pNode->_dwHash > dwHash) - { - break; - } - - ppPreviousNodeNextPointer = &(pNode->_pNext); - pNode = *ppPreviousNodeNextPointer; - } - - __analysis_assume( (pNode == NULL && fFound == FALSE) || - (pNode != NULL && fFound == TRUE ) ); - *ppNode = pNode; - if (pppPreviousNodeNextPointer != NULL) - { - *pppPreviousNodeNextPointer = ppPreviousNodeNextPointer; - } - return fFound; -} - -template -VOID -HASH_TABLE<_Record,_Key>::FindKey( - _Key key, - _Record ** ppRecord -) -{ - HASH_NODE<_Record> *pNode; - - *ppRecord = NULL; - - DWORD dwHash = CalcKeyHash(key); - - _tableLock.SharedAcquire(); - - if (FindNodeInternal(key, dwHash, &pNode) && - pNode->_pRecord != NULL) - { - ReferenceRecord(pNode->_pRecord); - *ppRecord = pNode->_pRecord; - } - - _tableLock.SharedRelease(); -} - -template -HRESULT -HASH_TABLE<_Record,_Key>::InsertRecord( - _Record * pRecord -) -/*++ - This method inserts a node for this record and also empty nodes for paths - in the hierarchy leading upto this path - - The insert is done under only a read-lock - this is possible by keeping - the hashes in a bucket in increasing order and using interlocked operations - to actually insert the item in the hash-bucket lookaside list and the parent - children list - - Returns HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) if the record already exists. - Never leak this error to the end user because "*file* already exists" may be confusing. ---*/ -{ - BOOL fLocked = FALSE; - _Key key = ExtractKey(pRecord); - DWORD dwHash = CalcKeyHash(key); - HRESULT hr = S_OK; - HASH_NODE<_Record> * pNewNode; - HASH_NODE<_Record> * pNextNode; - HASH_NODE<_Record> ** ppPreviousNodeNextPointer; - - // - // Ownership of pRecord is not transferred to pNewNode yet, so remember - // to either set it to null before deleting pNewNode or add an extra - // reference later - this is to make sure we do not do an extra ref/deref - // which users may view as getting flushed out of the hash-table - // - pNewNode = new HASH_NODE<_Record>(pRecord, dwHash); - if (pNewNode == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Finished; - } - - _tableLock.SharedAcquire(); - fLocked = TRUE; - - do - { - // - // Find the right place to add this node - // - if (FindNodeInternal(key, dwHash, &pNextNode, &ppPreviousNodeNextPointer)) - { - // - // If node already there, return error - // - pNewNode->_pRecord = NULL; - DeleteNode(pNewNode); - - // - // We should never leak this error to the end user - // because "file already exists" may be confusing. - // - hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS); - goto Finished; - } - - // - // If another node got inserted in between, we will have to retry - // - pNewNode->_pNext = pNextNode; - } while (InterlockedCompareExchangePointer((PVOID *)ppPreviousNodeNextPointer, - pNewNode, - pNextNode) != pNextNode); - // pass ownership of pRecord now - if (pRecord != NULL) - { - ReferenceRecord(pRecord); - pRecord = NULL; - } - InterlockedIncrement((LONG *)&_nItems); - -Finished: - - if (fLocked) - { - _tableLock.SharedRelease(); - } - - if (SUCCEEDED(hr)) - { - RehashTableIfNeeded(); - } - - return hr; -} - -template -VOID -HASH_TABLE<_Record,_Key>::DeleteKey( - _Key key -) -{ - HASH_NODE<_Record> *pNode; - HASH_NODE<_Record> **ppPreviousNodeNextPointer; - - DWORD dwHash = CalcKeyHash(key); - - _tableLock.ExclusiveAcquire(); - - if (FindNodeInternal(key, dwHash, &pNode, &ppPreviousNodeNextPointer)) - { - *ppPreviousNodeNextPointer = pNode->_pNext; - DeleteNode(pNode); - _nItems--; - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -HASH_TABLE<_Record,_Key>::DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext -) -{ - HASH_NODE<_Record> *pNode; - HASH_NODE<_Record> **ppPreviousNodeNextPointer; - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - ppPreviousNodeNextPointer = _ppBuckets + i; - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - // - // Non empty nodes deleted based on DeleteIf, empty nodes deleted - // if they have no children - // - if (pfnDeleteIf(pNode->_pRecord, pvContext)) - { - *ppPreviousNodeNextPointer = pNode->_pNext; - DeleteNode(pNode); - _nItems--; - } - else - { - ppPreviousNodeNextPointer = &pNode->_pNext; - } - - pNode = *ppPreviousNodeNextPointer; - } - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -HASH_TABLE<_Record,_Key>::Apply( - PFN_APPLY pfnApply, - PVOID pvContext -) -{ - HASH_NODE<_Record> *pNode; - - _tableLock.SharedAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - if (pNode->_pRecord != NULL) - { - pfnApply(pNode->_pRecord, pvContext); - } - - pNode = pNode->_pNext; - } - } - - _tableLock.SharedRelease(); -} - -template -VOID -HASH_TABLE<_Record,_Key>::RehashTableIfNeeded( - VOID -) -{ - HASH_NODE<_Record> **ppBuckets; - DWORD nBuckets; - HASH_NODE<_Record> *pNode; - HASH_NODE<_Record> *pNextNode; - HASH_NODE<_Record> **ppNextPointer; - HASH_NODE<_Record> *pNewNextNode; - DWORD nNewBuckets; - - // - // If number of items has become too many, we will double the hash table - // size (we never reduce it however) - // - if (_nItems <= PRIME::GetPrime(2*_nBuckets)) - { - return; - } - - _tableLock.ExclusiveAcquire(); - - nNewBuckets = PRIME::GetPrime(2*_nBuckets); - - if (_nItems <= nNewBuckets) - { - goto Finished; - } - - nBuckets = nNewBuckets; - if (nBuckets >= 0xffffffff/sizeof(HASH_NODE<_Record> *)) - { - goto Finished; - } - ppBuckets = (HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(HASH_NODE<_Record> *)); - if (ppBuckets == NULL) - { - goto Finished; - } - - // - // Take out nodes from the old hash table and insert in the new one, make - // sure to keep the hashes in increasing order - // - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - pNextNode = pNode->_pNext; - - ppNextPointer = ppBuckets + (pNode->_dwHash % nBuckets); - pNewNextNode = *ppNextPointer; - while (pNewNextNode != NULL && - pNewNextNode->_dwHash <= pNode->_dwHash) - { - ppNextPointer = &pNewNextNode->_pNext; - pNewNextNode = pNewNextNode->_pNext; - } - pNode->_pNext = pNewNextNode; - *ppNextPointer = pNode; - - pNode = pNextNode; - } - } - - HeapFree(GetProcessHeap(), 0, _ppBuckets); - _ppBuckets = ppBuckets; - _nBuckets = nBuckets; - ppBuckets = NULL; - -Finished: - - _tableLock.ExclusiveRelease(); -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h deleted file mode 100644 index 2ea6b77bca4b..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h +++ /dev/null @@ -1,2797 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef __HTTP_H__ -#define __HTTP_H__ - -#pragma once - -#if _WIN32_WINNT >= 0x0501 - -// -// HTTPAPI is available on -// -// a) WinXP SP2 and higher -// b) Windows 2003 and higher -// c) Vista and higher. -// - - - - -#include -#include - - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - - -// -// Flags for HttpInitialize() and HttpTerminate(). -// - -// -// HTTP_INITIALIZE_SERVER - Initializes the HTTP API layer and driver for -// applications using server APIs. -// -// HTTP_INITIALIZE_CONFIG - Initializes the HTTP API layer and driver for -// applications using HTTP configuration APIs. -// -// -// Notes - -// -// 1. These flags can be used in combination. -// -// 2. HttpTerminate() must be called for each call to HttpInitialize() made -// with each flag set when invoking HttpInitialize. For example, one -// could make two calls to HttpInitialize() setting HTTP_INITIALIZE_SERVER -// the first time and HTTP_INITIALIZE_CONFIG the second time. One call -// to HttpTerminate() with both flags set suffices to clean up both -// calls to HttpInitialize(). -// - -#define HTTP_INITIALIZE_SERVER 0x00000001 -#define HTTP_INITIALIZE_CONFIG 0x00000002 - -#if _WIN32_WINNT <= 0x0501 -#define BUILD_IIS_FOR_XP 1 -#endif - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// -// Following section defines the properties supported by the -// server side HTTP API. -// - -typedef enum _HTTP_SERVER_PROPERTY -{ - // - // Used for enabling server side authentication. - // - - HttpServerAuthenticationProperty, - - // - // Used for enabling logging. - // - - HttpServerLoggingProperty, - - // - // Used for setting QoS properties. - // - - HttpServerQosProperty, - - // - // Used for configuring timeouts. - // - - HttpServerTimeoutsProperty, - - // - // Used for limiting request queue lengths. - // - - HttpServerQueueLengthProperty, - - // - // Used for manipulating the state. - // - - HttpServerStateProperty, - - // - // Used for modifying the verbosity level of 503 type responses - // generated by server side API. - // - - HttpServer503VerbosityProperty, - - // - // Used for manipulating Url Group to Request Queue association. - // - - HttpServerBindingProperty, - - // - // Extended authentication property. - // - - HttpServerExtendedAuthenticationProperty, - - // - // Listening endpoint property. - // - - HttpServerListenEndpointProperty - - // - // Authentication channel binding property - // - -#endif -#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP - - ,HttpServerChannelBindProperty - - // - // IP Protection level policy for a Url Group. - // - - ,HttpServerProtectionLevelProperty -#endif -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - - -} HTTP_SERVER_PROPERTY, *PHTTP_SERVER_PROPERTY; - - -#define HTTP_MAX_SERVER_QUEUE_LENGTH 0x7FFFFFFF -#define HTTP_MIN_SERVER_QUEUE_LENGTH 1 - -// -// Generic property flags. Each structure defining a property info typically -// contain an element of this type. -// - -typedef struct _HTTP_PROPERTY_FLAGS -{ - ULONG Present:1; - -} HTTP_PROPERTY_FLAGS, *PHTTP_PROPERTY_FLAGS; - -// -// Enabled state. -// - -typedef enum _HTTP_ENABLED_STATE -{ - HttpEnabledStateActive, - HttpEnabledStateInactive, - -} HTTP_ENABLED_STATE, *PHTTP_ENABLED_STATE; - - -typedef struct _HTTP_STATE_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - HTTP_ENABLED_STATE State; - -} HTTP_STATE_INFO, *PHTTP_STATE_INFO; - -// -// Defines the verbosity level for a request queue which will be used -// when sending "503 - Service Unavailable" type error responses. Note that -// this setting only affects the error responses generated internally -// by HTTPAPI. -// - -typedef enum _HTTP_503_RESPONSE_VERBOSITY -{ - // - // Instead of sending a 503 response, the connection will be reset. - // This is the default behavior. - // - Http503ResponseVerbosityBasic, - - // - // Will send a 503 w/ a generic reason phrase. - // - Http503ResponseVerbosityLimited, - - // - // Will send a 503 w/ a detailed reason phrase. - // - Http503ResponseVerbosityFull - -} HTTP_503_RESPONSE_VERBOSITY, *PHTTP_503_RESPONSE_VERBOSITY; - -// -// Network QoS related. -// - -typedef enum _HTTP_QOS_SETTING_TYPE -{ - HttpQosSettingTypeBandwidth, - HttpQosSettingTypeConnectionLimit, - HttpQosSettingTypeFlowRate - -} HTTP_QOS_SETTING_TYPE, *PHTTP_QOS_SETTING_TYPE; - -typedef struct _HTTP_QOS_SETTING_INFO -{ - HTTP_QOS_SETTING_TYPE QosType; - PVOID QosSetting; -} HTTP_QOS_SETTING_INFO, *PHTTP_QOS_SETTING_INFO; - -typedef struct _HTTP_CONNECTION_LIMIT_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - ULONG MaxConnections; - -} HTTP_CONNECTION_LIMIT_INFO, *PHTTP_CONNECTION_LIMIT_INFO; - -typedef struct _HTTP_BANDWIDTH_LIMIT_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - ULONG MaxBandwidth; - -} HTTP_BANDWIDTH_LIMIT_INFO, *PHTTP_BANDWIDTH_LIMIT_INFO; - -typedef struct _HTTP_FLOWRATE_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - ULONG MaxBandwidth; - ULONG MaxPeakBandwidth; - ULONG BurstSize; - -} HTTP_FLOWRATE_INFO, *PHTTP_FLOWRATE_INFO; - -// -// Bandwidth throttling limit can not be set lower than the following -// number. The value is in bytes/sec. -// - -#define HTTP_MIN_ALLOWED_BANDWIDTH_THROTTLING_RATE ((ULONG)1024) - -// -// Distinguished value for bandwidth, connection limits and logging rollover -// size indicating "no limit". -// - -#define HTTP_LIMIT_INFINITE ((ULONG)-1) - -// -// Timeout information. -// - -// -// For manipulating global timeout settings. -// These timers run when connection does not belong to any application. -// Value zero is not allowed for driver wide timeout settings. -// - -typedef enum _HTTP_SERVICE_CONFIG_TIMEOUT_KEY -{ - IdleConnectionTimeout = 0, - HeaderWaitTimeout - -} HTTP_SERVICE_CONFIG_TIMEOUT_KEY, *PHTTP_SERVICE_CONFIG_TIMEOUT_KEY; - -typedef USHORT HTTP_SERVICE_CONFIG_TIMEOUT_PARAM, - *PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM; - -// -// To set a timeout value use the set structure. To query/delete use the key -// directly. When you query a timeout value the output buffer must be exactly -// the sizeof param. -// - -typedef struct _HTTP_SERVICE_CONFIG_TIMEOUT_SET -{ - HTTP_SERVICE_CONFIG_TIMEOUT_KEY KeyDesc; - HTTP_SERVICE_CONFIG_TIMEOUT_PARAM ParamDesc; - -} HTTP_SERVICE_CONFIG_TIMEOUT_SET, *PHTTP_SERVICE_CONFIG_TIMEOUT_SET; - -// -// For manipulating application specific timeout settings. -// These timers run when there's a request being processed on a connection -// and HTTPAPI has already associated the request with an application. -// Setting a timeout value to zero will cause HTTPAPI to revert to default. -// - -typedef struct _HTTP_TIMEOUT_LIMIT_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - - // - // Timeouts configured in seconds. - // - - USHORT EntityBody; - USHORT DrainEntityBody; - USHORT RequestQueue; - - // - // Following two timeouts are only enforced after first request on - // connection is routed to the application. These will not manipulate - // the driver wide timeouts. - // - - USHORT IdleConnection; - USHORT HeaderWait; - - // - // Timeouts configured in bytes/second. - // This timer can be turned off by setting it to MAXULONG. - // - - ULONG MinSendRate; - -} HTTP_TIMEOUT_LIMIT_INFO, *PHTTP_TIMEOUT_LIMIT_INFO; - -// -// Controls whether IP-based URLs should listen on the specific IP or wildcard. -// - -typedef struct _HTTP_LISTEN_ENDPOINT_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - - BOOLEAN EnableSharing; - -} HTTP_LISTEN_ENDPOINT_INFO, *PHTTP_LISTEN_ENDPOINT_INFO; - - -typedef struct _HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS -{ - USHORT DomainNameLength; - PWSTR DomainName; - USHORT RealmLength; - PWSTR Realm; -} HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS, - *PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS; - -typedef struct _HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS -{ - USHORT RealmLength; - PWSTR Realm; -} HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS, - *PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS; - -// -// Definitions used for setting server side authentication property. -// - -#define HTTP_AUTH_ENABLE_BASIC (0x00000001) -#define HTTP_AUTH_ENABLE_DIGEST (0x00000002) -#define HTTP_AUTH_ENABLE_NTLM (0x00000004) -#define HTTP_AUTH_ENABLE_NEGOTIATE (0x00000008) -#define HTTP_AUTH_ENABLE_KERBEROS (0x00000010) - -#define HTTP_AUTH_ENABLE_ALL \ - (HTTP_AUTH_ENABLE_BASIC |\ - HTTP_AUTH_ENABLE_DIGEST |\ - HTTP_AUTH_ENABLE_NTLM |\ - HTTP_AUTH_ENABLE_NEGOTIATE |\ - HTTP_AUTH_ENABLE_KERBEROS) - - -C_ASSERT(HTTP_AUTH_ENABLE_NEGOTIATE > HTTP_AUTH_ENABLE_NTLM); -C_ASSERT(HTTP_AUTH_ENABLE_NTLM > HTTP_AUTH_ENABLE_DIGEST); -C_ASSERT(HTTP_AUTH_ENABLE_DIGEST > HTTP_AUTH_ENABLE_BASIC); - -#define HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING (0x01) -#define HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL (0x02) - -typedef struct _HTTP_SERVER_AUTHENTICATION_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - - ULONG AuthSchemes; - - BOOLEAN ReceiveMutualAuth; - BOOLEAN ReceiveContextHandle; - BOOLEAN DisableNTLMCredentialCaching; - - UCHAR ExFlags; - - HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS DigestParams; - HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS BasicParams; - -} HTTP_SERVER_AUTHENTICATION_INFO, *PHTTP_SERVER_AUTHENTICATION_INFO; - -#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP - -// -// Definitions for setting authentication channel binding properties -// - -typedef enum _HTTP_SERVICE_BINDING_TYPE -{ - HttpServiceBindingTypeNone = 0, - HttpServiceBindingTypeW, - HttpServiceBindingTypeA - -} HTTP_SERVICE_BINDING_TYPE; - -typedef struct _HTTP_SERVICE_BINDING_BASE -{ - HTTP_SERVICE_BINDING_TYPE Type; - -} HTTP_SERVICE_BINDING_BASE, *PHTTP_SERVICE_BINDING_BASE; - -typedef struct _HTTP_SERVICE_BINDING_A -{ - HTTP_SERVICE_BINDING_BASE Base; - PCHAR Buffer; - ULONG BufferSize; - -} HTTP_SERVICE_BINDING_A, *PHTTP_SERVICE_BINDING_A; - -typedef struct _HTTP_SERVICE_BINDING_W -{ - HTTP_SERVICE_BINDING_BASE Base; - PWCHAR Buffer; - ULONG BufferSize; - -} HTTP_SERVICE_BINDING_W, *PHTTP_SERVICE_BINDING_W; - -typedef enum _HTTP_AUTHENTICATION_HARDENING_LEVELS -{ - HttpAuthenticationHardeningLegacy = 0, - HttpAuthenticationHardeningMedium, - HttpAuthenticationHardeningStrict - -} HTTP_AUTHENTICATION_HARDENING_LEVELS; - -// -// Channel binding token verification flags. -// - -#define HTTP_CHANNEL_BIND_PROXY 0x1 -#define HTTP_CHANNEL_BIND_PROXY_COHOSTING 0x20 - -// -// Service bind verification flags -// - -#define HTTP_CHANNEL_BIND_NO_SERVICE_NAME_CHECK 0x2 -#define HTTP_CHANNEL_BIND_DOTLESS_SERVICE 0x4 - -// -// Flags triggering channel bind parameters retrieval -// - -#define HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN 0x8 -#define HTTP_CHANNEL_BIND_CLIENT_SERVICE 0x10 - -// -// All valid flags (mask for internal checks) -// - -typedef struct _HTTP_CHANNEL_BIND_INFO -{ - HTTP_AUTHENTICATION_HARDENING_LEVELS Hardening; - ULONG Flags; - PHTTP_SERVICE_BINDING_BASE * ServiceNames; - ULONG NumberOfServiceNames; - -} HTTP_CHANNEL_BIND_INFO, *PHTTP_CHANNEL_BIND_INFO; - -typedef struct _HTTP_REQUEST_CHANNEL_BIND_STATUS -{ - PHTTP_SERVICE_BINDING_BASE ServiceName; - PUCHAR ChannelToken; - ULONG ChannelTokenSize; - ULONG Flags; - -} HTTP_REQUEST_CHANNEL_BIND_STATUS, *PHTTP_REQUEST_CHANNEL_BIND_STATUS; - -#endif - -// -// Definitions used for setting logging property. -// - -// -// The known log fields recognized/supported by HTTPAPI. Following fields -// are used for W3C logging. Subset of them are also used for error -// logging. -// - -#define HTTP_LOG_FIELD_DATE 0x00000001 -#define HTTP_LOG_FIELD_TIME 0x00000002 -#define HTTP_LOG_FIELD_CLIENT_IP 0x00000004 -#define HTTP_LOG_FIELD_USER_NAME 0x00000008 -#define HTTP_LOG_FIELD_SITE_NAME 0x00000010 -#define HTTP_LOG_FIELD_COMPUTER_NAME 0x00000020 -#define HTTP_LOG_FIELD_SERVER_IP 0x00000040 -#define HTTP_LOG_FIELD_METHOD 0x00000080 -#define HTTP_LOG_FIELD_URI_STEM 0x00000100 -#define HTTP_LOG_FIELD_URI_QUERY 0x00000200 -#define HTTP_LOG_FIELD_STATUS 0x00000400 -#define HTTP_LOG_FIELD_WIN32_STATUS 0x00000800 -#define HTTP_LOG_FIELD_BYTES_SENT 0x00001000 -#define HTTP_LOG_FIELD_BYTES_RECV 0x00002000 -#define HTTP_LOG_FIELD_TIME_TAKEN 0x00004000 -#define HTTP_LOG_FIELD_SERVER_PORT 0x00008000 -#define HTTP_LOG_FIELD_USER_AGENT 0x00010000 -#define HTTP_LOG_FIELD_COOKIE 0x00020000 -#define HTTP_LOG_FIELD_REFERER 0x00040000 -#define HTTP_LOG_FIELD_VERSION 0x00080000 -#define HTTP_LOG_FIELD_HOST 0x00100000 -#define HTTP_LOG_FIELD_SUB_STATUS 0x00200000 - -// -// Fields that are used only for error logging. -// - -#define HTTP_LOG_FIELD_CLIENT_PORT 0x00400000 -#define HTTP_LOG_FIELD_URI 0x00800000 -#define HTTP_LOG_FIELD_SITE_ID 0x01000000 -#define HTTP_LOG_FIELD_REASON 0x02000000 -#define HTTP_LOG_FIELD_QUEUE_NAME 0x04000000 - -// -// Defines the logging type. -// - -typedef enum _HTTP_LOGGING_TYPE -{ - HttpLoggingTypeW3C, - HttpLoggingTypeIIS, - HttpLoggingTypeNCSA, - HttpLoggingTypeRaw - ,HttpLoggingTypeMaximum - -} HTTP_LOGGING_TYPE, *PHTTP_LOGGING_TYPE; - -// -// Defines the rollover type for log files. -// - -typedef enum _HTTP_LOGGING_ROLLOVER_TYPE -{ - HttpLoggingRolloverSize, - HttpLoggingRolloverDaily, - HttpLoggingRolloverWeekly, - HttpLoggingRolloverMonthly, - HttpLoggingRolloverHourly - -} HTTP_LOGGING_ROLLOVER_TYPE, *PHTTP_LOGGING_ROLLOVER_TYPE; - -// -// Log file rollover size can not be set lower than the following -// limit. The value is in bytes. -// - -#define HTTP_MIN_ALLOWED_LOG_FILE_ROLLOVER_SIZE ((ULONG)(1 * 1024 * 1024)) - -// -// Logging option flags. When used in the logging configuration alters -// some default logging behaviour. -// -// HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER - This flag is used to change -// the log file rollover to happen by local time based. By default -// log file rollovers happen by GMT time. -// -// HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION - When set the unicode fields -// will be converted to UTF8 multibytes when writing to the log -// files. When this flag is not present, the local code page -// conversion happens. -// -// HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY - -// HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY - These two flags are used to -// to do selective logging. If neither of them are present both -// types of requests will be logged. Only one these flags can be -// set at a time. They are mutually exclusive. -// - -#define HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER (0x00000001) -#define HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION (0x00000002) -#define HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY (0x00000004) -#define HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY (0x00000008) - -// -// Configuration structure used for setting the logging property. -// - -typedef struct _HTTP_LOGGING_INFO -{ - // - // Specifies whether this property exists or not. - // - - HTTP_PROPERTY_FLAGS Flags; - - // - // Optional logging flags. - // - - ULONG LoggingFlags; - - // - // Optional informatonal software directive string for W3C type logging. Not - // used for other types of logging. If nothing is provided here HTTPAPI will - // log a default string. Any arbitrary string could be used here to identify - // the application. Length cannot be greater than MAX_PATH. Lenght is in - // bytes. - // - - PCWSTR SoftwareName; - USHORT SoftwareNameLength; - - // - // Log file directory must be a fully qualified path. - // Length must be in number of bytes. - // - - USHORT DirectoryNameLength; - PCWSTR DirectoryName; - - // - // Specifies the format for the log files. - // - - HTTP_LOGGING_TYPE Format; - - // - // Bitmask value indicates which fields to be logged - // if the log format is set to W3C. This must be the 'bitwise or' - // of the HTTP_LOG_FIELD_... values. - // - - ULONG Fields; - - // - // Following fields are reserved they must be NULL and zero.. - // - - PVOID pExtFields; - USHORT NumOfExtFields; - - // - // Reserved must be zero. - // - - USHORT MaxRecordSize; - - // - // Defines the rollover type for the log files. - // - - HTTP_LOGGING_ROLLOVER_TYPE RolloverType; - - // - // Indicates the maximum size (in bytes) after which - // the log files should be rolled over. A value of -1 - // (HTTP_LIMIT_INFINITE) indicates an unlimited size. - // This value is discarded if rollover type is not set to - // HttpLoggingRolloverSize. - // - - ULONG RolloverSize; - - // - // Specifies the security descriptor to be applied to - // the log files and the sub-directories. If null we will - // inherit the system default. This security descriptor must - // be self-relative. - // - - PSECURITY_DESCRIPTOR pSecurityDescriptor; - -} HTTP_LOGGING_INFO, *PHTTP_LOGGING_INFO; - -// -// Binding information. -// - -typedef struct _HTTP_BINDING_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - HANDLE RequestQueueHandle; - -} HTTP_BINDING_INFO, *PHTTP_BINDING_INFO; - -#endif -#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP - -// -// Defines the protection level types for UrlGroups. -// - -typedef enum _HTTP_PROTECTION_LEVEL_TYPE -{ - // - // This option will allow edge (NAT) traversed traffic, i.e. Teredo - // for the UrlGroup, unless there is an admin rule that overwrites the - // application's intend. - // - - HttpProtectionLevelUnrestricted, - - // - // This setting will ensure that edge (NAT) traversed traffic - // will not be allowed. - // - - HttpProtectionLevelEdgeRestricted, - - // - // Below type is not supported by HTTP API. - // - - HttpProtectionLevelRestricted - - -} HTTP_PROTECTION_LEVEL_TYPE, *PHTTP_PROTECTION_LEVEL_TYPE; - -// -// Controls whether the associated UrlGroup Namespace should receive -// edge traversed traffic. By default this parameter is unspecified. -// - -typedef struct _HTTP_PROTECTION_LEVEL_INFO -{ - HTTP_PROPERTY_FLAGS Flags; - HTTP_PROTECTION_LEVEL_TYPE Level; - -} HTTP_PROTECTION_LEVEL_INFO, *PHTTP_PROTECTION_LEVEL_INFO; - -#endif -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - - -// -// Definitions for request queue manipulation. -// -// These flags are used with HttpCreateRequestQueue() API. -// -// HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING - To open an existing request -// queue. The request queue name must be supplied. -// -// HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER - Creates the request queue and -// marks that the caller process is not willing to do send/receive (HTTP I/O)on -// the handle directly. -// - -#define HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING (0x00000001) -#define HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER (0x00000002) - -#endif // _WIN32_WINNT >= 0x0600 - -// -// Flags for HttpReceiveHttpRequest(). -// -// HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY - Specifies that the caller would like -// any available entity body to be copied along with the protocol headers. -// -// HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY - Specifies that the caller would like -// all of the entity bodies to be copied along with the protocol headers. -// - -#define HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY 0x00000001 -#define HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY 0x00000002 - - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// -// Flags for HttpReceiveRequestEntityBody(). -// -// HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER - Specifies that the -// caller would like the buffer to get filled up with entity bodies unless -// there are no more entity bodies to be copied. -// - -#define HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER 0x00000001 - -#endif // _WIN32_WINNT >= 0x0600 - - -// -// Flags for HttpSendHttpResponse() and HttpSendResponseEntityBody(). -// -// HTTP_SEND_RESPONSE_FLAG_DISCONNECT - Specifies that the network connection -// should be disconnected immediately after sending the response, overriding -// the HTTP protocol's persistent connection features, such as -// "Connection: keep-alive". -// -// HTTP_SEND_RESPONSE_FLAG_MORE_DATA - Specifies that additional entity body -// data will be sent by the caller. -// -// HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA - Specifies that a caller wants the -// response to complete as soon as possible at the cost of buffering partial -// or the entire response. -// -// HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING - Specifies that a caller wants to -// enable the TCP nagling algorithm for this particular send. -// -// HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES - Specifies that for a range request -// a full response content is passed and a caller wants HTTP API to process -// ranges properly. -// - -#define HTTP_SEND_RESPONSE_FLAG_DISCONNECT 0x00000001 -#define HTTP_SEND_RESPONSE_FLAG_MORE_DATA 0x00000002 -#define HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA 0x00000004 -#define HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING 0x00000008 -#define HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES 0x00000020 - - -// -// Flags for HttpFlushResponseCache(). -// -// HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE - Flushes the specified URL and all -// hierarchally-related sub-URLs from the response or fragment cache. -// - -#define HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE 0x00000001 - - -// -// Opaque identifiers for various HTTPAPI objects. -// - -typedef ULONGLONG HTTP_OPAQUE_ID, *PHTTP_OPAQUE_ID; - -typedef HTTP_OPAQUE_ID HTTP_REQUEST_ID, *PHTTP_REQUEST_ID; -typedef HTTP_OPAQUE_ID HTTP_CONNECTION_ID, *PHTTP_CONNECTION_ID; -typedef HTTP_OPAQUE_ID HTTP_RAW_CONNECTION_ID, *PHTTP_RAW_CONNECTION_ID; - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -typedef HTTP_OPAQUE_ID HTTP_URL_GROUP_ID, *PHTTP_URL_GROUP_ID; -typedef HTTP_OPAQUE_ID HTTP_SERVER_SESSION_ID, *PHTTP_SERVER_SESSION_ID; - -#endif // _WIN32_WINNT >= 0x0600 - -// -// Macros for opaque identifier manipulations. -// - -#define HTTP_NULL_ID (0ui64) -#define HTTP_IS_NULL_ID(pid) (HTTP_NULL_ID == *(pid)) -#define HTTP_SET_NULL_ID(pid) (*(pid) = HTTP_NULL_ID) - -// -// This structure defines a file byte range. -// -// If the Length field is HTTP_BYTE_RANGE_TO_EOF then the remainder of the -// file (everything after StartingOffset) is sent. -// - -#define HTTP_BYTE_RANGE_TO_EOF ((ULONGLONG)-1) - -typedef struct _HTTP_BYTE_RANGE -{ - ULARGE_INTEGER StartingOffset; - ULARGE_INTEGER Length; - -} HTTP_BYTE_RANGE, *PHTTP_BYTE_RANGE; - -// -// The type for HTTP protocol version numbers. -// - -typedef struct _HTTP_VERSION -{ - USHORT MajorVersion; - USHORT MinorVersion; - -} HTTP_VERSION, *PHTTP_VERSION; - -// -// Some useful macros for HTTP protocol version manipulation. -// - -#define HTTP_VERSION_UNKNOWN { 0, 0 } -#define HTTP_VERSION_0_9 { 0, 9 } -#define HTTP_VERSION_1_0 { 1, 0 } -#define HTTP_VERSION_1_1 { 1, 1 } - -#define HTTP_SET_VERSION(version, major, minor) \ -do { \ - (version).MajorVersion = (major); \ - (version).MinorVersion = (minor); \ -} while (0, 0) - -#define HTTP_EQUAL_VERSION(version, major, minor) \ - ((version).MajorVersion == (major) && \ - (version).MinorVersion == (minor)) - -#define HTTP_GREATER_VERSION(version, major, minor) \ - ((version).MajorVersion > (major) || \ - ((version).MajorVersion == (major) && \ - (version).MinorVersion > (minor))) - -#define HTTP_LESS_VERSION(version, major, minor) \ - ((version).MajorVersion < (major) || \ - ((version).MajorVersion == (major) && \ - (version).MinorVersion < (minor))) - -#define HTTP_NOT_EQUAL_VERSION(version, major, minor) \ - (!HTTP_EQUAL_VERSION(version, major, minor)) - -#define HTTP_GREATER_EQUAL_VERSION(version, major, minor) \ - (!HTTP_LESS_VERSION(version, major, minor)) - -#define HTTP_LESS_EQUAL_VERSION(version, major, minor) \ - (!HTTP_GREATER_VERSION(version, major, minor)) - -// -// The enum type for HTTP verbs. -// - -typedef enum _HTTP_VERB -{ - HttpVerbUnparsed, - HttpVerbUnknown, - HttpVerbInvalid, - HttpVerbOPTIONS, - HttpVerbGET, - HttpVerbHEAD, - HttpVerbPOST, - HttpVerbPUT, - HttpVerbDELETE, - HttpVerbTRACE, - HttpVerbCONNECT, - HttpVerbTRACK, // used by Microsoft Cluster Server for a non-logged trace - HttpVerbMOVE, - HttpVerbCOPY, - HttpVerbPROPFIND, - HttpVerbPROPPATCH, - HttpVerbMKCOL, - HttpVerbLOCK, - HttpVerbUNLOCK, - HttpVerbSEARCH, - - HttpVerbMaximum - -} HTTP_VERB, *PHTTP_VERB; - -// -// Symbols for all HTTP/1.1 headers and other tokens. Notice request + -// response values overlap. Make sure you know which type of header array -// you are indexing. -// -// These values are used as offsets into arrays and as token values in -// HTTP_KNOWN_HEADER arrays in HTTP_REQUEST_HEADERS and HTTP_RESPONSE_HEADERS. -// -// See RFC 2616, HTTP/1.1, for further explanation of most of these headers. -// - -typedef enum _HTTP_HEADER_ID -{ - HttpHeaderCacheControl = 0, // general-header [section 4.5] - HttpHeaderConnection = 1, // general-header [section 4.5] - HttpHeaderDate = 2, // general-header [section 4.5] - HttpHeaderKeepAlive = 3, // general-header [not in rfc] - HttpHeaderPragma = 4, // general-header [section 4.5] - HttpHeaderTrailer = 5, // general-header [section 4.5] - HttpHeaderTransferEncoding = 6, // general-header [section 4.5] - HttpHeaderUpgrade = 7, // general-header [section 4.5] - HttpHeaderVia = 8, // general-header [section 4.5] - HttpHeaderWarning = 9, // general-header [section 4.5] - - HttpHeaderAllow = 10, // entity-header [section 7.1] - HttpHeaderContentLength = 11, // entity-header [section 7.1] - HttpHeaderContentType = 12, // entity-header [section 7.1] - HttpHeaderContentEncoding = 13, // entity-header [section 7.1] - HttpHeaderContentLanguage = 14, // entity-header [section 7.1] - HttpHeaderContentLocation = 15, // entity-header [section 7.1] - HttpHeaderContentMd5 = 16, // entity-header [section 7.1] - HttpHeaderContentRange = 17, // entity-header [section 7.1] - HttpHeaderExpires = 18, // entity-header [section 7.1] - HttpHeaderLastModified = 19, // entity-header [section 7.1] - - - // Request Headers - - HttpHeaderAccept = 20, // request-header [section 5.3] - HttpHeaderAcceptCharset = 21, // request-header [section 5.3] - HttpHeaderAcceptEncoding = 22, // request-header [section 5.3] - HttpHeaderAcceptLanguage = 23, // request-header [section 5.3] - HttpHeaderAuthorization = 24, // request-header [section 5.3] - HttpHeaderCookie = 25, // request-header [not in rfc] - HttpHeaderExpect = 26, // request-header [section 5.3] - HttpHeaderFrom = 27, // request-header [section 5.3] - HttpHeaderHost = 28, // request-header [section 5.3] - HttpHeaderIfMatch = 29, // request-header [section 5.3] - - HttpHeaderIfModifiedSince = 30, // request-header [section 5.3] - HttpHeaderIfNoneMatch = 31, // request-header [section 5.3] - HttpHeaderIfRange = 32, // request-header [section 5.3] - HttpHeaderIfUnmodifiedSince = 33, // request-header [section 5.3] - HttpHeaderMaxForwards = 34, // request-header [section 5.3] - HttpHeaderProxyAuthorization = 35, // request-header [section 5.3] - HttpHeaderReferer = 36, // request-header [section 5.3] - HttpHeaderRange = 37, // request-header [section 5.3] - HttpHeaderTe = 38, // request-header [section 5.3] - HttpHeaderTranslate = 39, // request-header [webDAV, not in rfc 2518] - - HttpHeaderUserAgent = 40, // request-header [section 5.3] - - HttpHeaderRequestMaximum = 41, - - - // Response Headers - - HttpHeaderAcceptRanges = 20, // response-header [section 6.2] - HttpHeaderAge = 21, // response-header [section 6.2] - HttpHeaderEtag = 22, // response-header [section 6.2] - HttpHeaderLocation = 23, // response-header [section 6.2] - HttpHeaderProxyAuthenticate = 24, // response-header [section 6.2] - HttpHeaderRetryAfter = 25, // response-header [section 6.2] - HttpHeaderServer = 26, // response-header [section 6.2] - HttpHeaderSetCookie = 27, // response-header [not in rfc] - HttpHeaderVary = 28, // response-header [section 6.2] - HttpHeaderWwwAuthenticate = 29, // response-header [section 6.2] - - HttpHeaderResponseMaximum = 30, - - - HttpHeaderMaximum = 41 - -} HTTP_HEADER_ID, *PHTTP_HEADER_ID; - - -// -// Structure defining format of a known HTTP header. -// Name is from HTTP_HEADER_ID. -// - -typedef struct _HTTP_KNOWN_HEADER -{ - USHORT RawValueLength; // in bytes not including the NUL - PCSTR pRawValue; - -} HTTP_KNOWN_HEADER, *PHTTP_KNOWN_HEADER; - -// -// Structure defining format of an unknown header. -// - -typedef struct _HTTP_UNKNOWN_HEADER -{ - USHORT NameLength; // in bytes not including the NUL - USHORT RawValueLength; // in bytes not including the NUL - PCSTR pName; // The header name (minus the ':' character) - PCSTR pRawValue; // The header value - -} HTTP_UNKNOWN_HEADER, *PHTTP_UNKNOWN_HEADER; - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// -// Log fields data structure is used for logging a request. This structure must -// be provided along with an HttpSendHttpResponse or HttpSendResponseEntityBody -// call that concludes the send. -// - -// Base structure is for future versioning. - -typedef enum _HTTP_LOG_DATA_TYPE -{ - HttpLogDataTypeFields = 0 - -} HTTP_LOG_DATA_TYPE, *PHTTP_LOG_DATA_TYPE; - -// should we DECLSPEC_ALIGN(4 or 8) == DECLSPEC_POINTERALIGN? -typedef struct _HTTP_LOG_DATA -{ - HTTP_LOG_DATA_TYPE Type; - -} HTTP_LOG_DATA, *PHTTP_LOG_DATA; - -// Current log fields data structure for of type HttpLogDataTypeFields. - -typedef struct _HTTP_LOG_FIELDS_DATA -{ - HTTP_LOG_DATA Base; - - USHORT UserNameLength; - USHORT UriStemLength; - USHORT ClientIpLength; - USHORT ServerNameLength; - USHORT ServiceNameLength; - USHORT ServerIpLength; - USHORT MethodLength; - USHORT UriQueryLength; - USHORT HostLength; - USHORT UserAgentLength; - USHORT CookieLength; - USHORT ReferrerLength; - - PWCHAR UserName; - PWCHAR UriStem; - PCHAR ClientIp; - PCHAR ServerName; - PCHAR ServiceName; - PCHAR ServerIp; - PCHAR Method; - PCHAR UriQuery; - PCHAR Host; - PCHAR UserAgent; - PCHAR Cookie; - PCHAR Referrer; - - USHORT ServerPort; - USHORT ProtocolStatus; - - ULONG Win32Status; - - HTTP_VERB MethodNum; - - USHORT SubStatus; - -} HTTP_LOG_FIELDS_DATA, *PHTTP_LOG_FIELDS_DATA; - -#endif // _WIN32_WINNT >= 0x0600 - -// -// This enum defines a data source for a particular chunk of data. -// - -typedef enum _HTTP_DATA_CHUNK_TYPE -{ - HttpDataChunkFromMemory, - HttpDataChunkFromFileHandle, - HttpDataChunkFromFragmentCache, - HttpDataChunkFromFragmentCacheEx, - - HttpDataChunkMaximum - -} HTTP_DATA_CHUNK_TYPE, *PHTTP_DATA_CHUNK_TYPE; - - -// -// This structure describes an individual data chunk. -// - -typedef struct _HTTP_DATA_CHUNK -{ - // - // The type of this data chunk. - // - - HTTP_DATA_CHUNK_TYPE DataChunkType; - - // - // The data chunk structures, one per supported data chunk type. - // - - union - { - // - // From-memory data chunk. - // - - struct - { - PVOID pBuffer; - ULONG BufferLength; - - } FromMemory; - - // - // From-file handle data chunk. - // - - struct - { - HTTP_BYTE_RANGE ByteRange; - HANDLE FileHandle; - - } FromFileHandle; - - // - // From-fragment cache data chunk. - // - - struct - { - USHORT FragmentNameLength; // in bytes not including the NUL - PCWSTR pFragmentName; - - } FromFragmentCache; - - // - // From-fragment cache data chunk that specifies a byte range. - // - - struct - { - HTTP_BYTE_RANGE ByteRange; - PCWSTR pFragmentName; // NULL-terminated string - - } FromFragmentCacheEx; - - }; - -} HTTP_DATA_CHUNK, *PHTTP_DATA_CHUNK; - -// -// HTTP API doesn't support 16 bit applications. -// Neither WIN32 nor _WIN64 was defined. -// - -C_ASSERT(TYPE_ALIGNMENT(HTTP_DATA_CHUNK) == sizeof(ULONGLONG)); - -// -// Structure defining format of request headers. -// - -typedef struct _HTTP_REQUEST_HEADERS -{ - // - // The array of unknown HTTP headers and the number of - // entries in the array. - // - - USHORT UnknownHeaderCount; - PHTTP_UNKNOWN_HEADER pUnknownHeaders; - - // - // Trailers - we don't use these currently, reserved for a future release - // - USHORT TrailerCount; // Reserved, must be 0 - PHTTP_UNKNOWN_HEADER pTrailers; // Reserved, must be NULL - - - // - // Known headers. - // - - HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderRequestMaximum]; - -} HTTP_REQUEST_HEADERS, *PHTTP_REQUEST_HEADERS; - -// -// Structure defining format of response headers. -// - -typedef struct _HTTP_RESPONSE_HEADERS -{ - // - // The array of unknown HTTP headers and the number of - // entries in the array. - // - - USHORT UnknownHeaderCount; - PHTTP_UNKNOWN_HEADER pUnknownHeaders; - - // - // Trailers - we don't use these currently, reserved for a future release - // - USHORT TrailerCount; // Reserved, must be 0 - PHTTP_UNKNOWN_HEADER pTrailers; // Reserved, must be NULL - - // - // Known headers. - // - - HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderResponseMaximum]; - -} HTTP_RESPONSE_HEADERS, *PHTTP_RESPONSE_HEADERS; - -// -// Structure defining format of transport address. Use pLocalAddress->sa_family -// to determine whether this is an IPv4 address (AF_INET) or IPv6 (AF_INET6). -// -// pRemoteAddress->sa_family will be the same as pLocalAddress->sa_family. -// -// SOCKADDRs are always in network order, not host order. -// - -typedef struct _HTTP_TRANSPORT_ADDRESS -{ - PSOCKADDR pRemoteAddress; - PSOCKADDR pLocalAddress; - -} HTTP_TRANSPORT_ADDRESS, *PHTTP_TRANSPORT_ADDRESS; - -// -// Structure defining format of cooked URL. -// - -typedef struct _HTTP_COOKED_URL -{ - // - // Pointers overlap and point into pFullUrl. NULL if not present. - // - - USHORT FullUrlLength; // in bytes not including the NUL - USHORT HostLength; // in bytes (no NUL) - USHORT AbsPathLength; // in bytes (no NUL) - USHORT QueryStringLength; // in bytes (no NUL) - - PCWSTR pFullUrl; // points to "http://hostname:port/abs/.../path?query" - PCWSTR pHost; // points to the first char in the hostname - PCWSTR pAbsPath; // Points to the 3rd '/' char - PCWSTR pQueryString; // Points to the 1st '?' char or NULL - -} HTTP_COOKED_URL, *PHTTP_COOKED_URL; - -// -// An opaque context for URL manipulation. -// - -typedef ULONGLONG HTTP_URL_CONTEXT; - - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// -// Optional flags for URL manipulation functions. -// -// HTTP_URL_FLAG_REMOVE_ALL : When this flag is used -// when removing a Url from a url group, regardless of -// the passed URL, all of the Urls from the url group -// will be removed. -// - -#define HTTP_URL_FLAG_REMOVE_ALL 0x00000001 - - -// -// Request Authentication related. -// - -typedef enum _HTTP_AUTH_STATUS -{ - HttpAuthStatusSuccess, - HttpAuthStatusNotAuthenticated, - HttpAuthStatusFailure - -} HTTP_AUTH_STATUS, *PHTTP_AUTH_STATUS; - - -typedef enum _HTTP_REQUEST_AUTH_TYPE -{ - HttpRequestAuthTypeNone = 0, - HttpRequestAuthTypeBasic, - HttpRequestAuthTypeDigest, - HttpRequestAuthTypeNTLM, - HttpRequestAuthTypeNegotiate, - HttpRequestAuthTypeKerberos - - -} HTTP_REQUEST_AUTH_TYPE, *PHTTP_REQUEST_AUTH_TYPE; - -#endif // _WIN32_WINNT >= 0x0600 - -// -// SSL Client certificate information. -// - -typedef struct _HTTP_SSL_CLIENT_CERT_INFO -{ - ULONG CertFlags; - ULONG CertEncodedSize; - PUCHAR pCertEncoded; - HANDLE Token; - BOOLEAN CertDeniedByMapper; - -} HTTP_SSL_CLIENT_CERT_INFO, *PHTTP_SSL_CLIENT_CERT_INFO; - -#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP - -// -// Flag to retrieve secure channel binding with HttpReceiveClientCertificate -// - -#define HTTP_RECEIVE_SECURE_CHANNEL_TOKEN 0x1 - -#endif - -// -// Data computed during SSL handshake. -// - -typedef struct _HTTP_SSL_INFO -{ - USHORT ServerCertKeySize; - USHORT ConnectionKeySize; - ULONG ServerCertIssuerSize; - ULONG ServerCertSubjectSize; - - PCSTR pServerCertIssuer; - PCSTR pServerCertSubject; - - PHTTP_SSL_CLIENT_CERT_INFO pClientCertInfo; - ULONG SslClientCertNegotiated; - -} HTTP_SSL_INFO, *PHTTP_SSL_INFO; - - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// -// Generic request information type. -// - -typedef enum _HTTP_REQUEST_INFO_TYPE -{ - HttpRequestInfoTypeAuth - -#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 - ,HttpRequestInfoTypeChannelBind -#endif - - -} HTTP_REQUEST_INFO_TYPE, *PHTTP_REQUEST_INFO_TYPE; - -typedef struct _HTTP_REQUEST_INFO -{ - HTTP_REQUEST_INFO_TYPE InfoType; - ULONG InfoLength; - PVOID pInfo; - -} HTTP_REQUEST_INFO, *PHTTP_REQUEST_INFO; - -#ifndef __SECSTATUS_DEFINED__ -typedef LONG SECURITY_STATUS; -#define __SECSTATUS_DEFINED__ -#endif // __SECSTATUS_DEFINED__ - -// -// Authentication request info structure -// - -#define HTTP_REQUEST_AUTH_FLAG_TOKEN_FOR_CACHED_CRED (0x00000001) - -typedef struct _HTTP_REQUEST_AUTH_INFO -{ - HTTP_AUTH_STATUS AuthStatus; - SECURITY_STATUS SecStatus; - - ULONG Flags; - - HTTP_REQUEST_AUTH_TYPE AuthType; - - HANDLE AccessToken; - ULONG ContextAttributes; - - // - // Optional serialized context. - // - - ULONG PackedContextLength; - ULONG PackedContextType; - PVOID PackedContext; - - // - // Optional mutual authentication data and its length in bytes. - // - - ULONG MutualAuthDataLength; - PCHAR pMutualAuthData; - - // - // For SSPI based schemes the package name is returned. Length does - // not include the terminating null and it is in bytes. - // - - USHORT PackageNameLength; - PWSTR pPackageName; - -} HTTP_REQUEST_AUTH_INFO, *PHTTP_REQUEST_AUTH_INFO; - -#endif // _WIN32_WINNT >= 0x0600 - -// -// The structure of an HTTP request for downlevel OS -// - -typedef struct _HTTP_REQUEST_V1 -{ - // - // Request flags (see HTTP_REQUEST_FLAG_* definitions below). - // - - ULONG Flags; - - // - // An opaque request identifier. These values are used by the driver - // to correlate outgoing responses with incoming requests. - // - - HTTP_CONNECTION_ID ConnectionId; - HTTP_REQUEST_ID RequestId; - - // - // The context associated with the URL prefix. - // - - HTTP_URL_CONTEXT UrlContext; - - // - // The HTTP version number. - // - - HTTP_VERSION Version; - - // - // The request verb. - // - - HTTP_VERB Verb; - - // - // The length of the verb string if the Verb field is HttpVerbUnknown. - // - - USHORT UnknownVerbLength; // in bytes not including the NUL - - // - // The length of the raw (uncooked) URL - // - - USHORT RawUrlLength; // in bytes not including the NUL - - // - // Pointer to the verb string if the Verb field is HttpVerbUnknown. - // - - PCSTR pUnknownVerb; - - // - // Pointer to the raw (uncooked) URL - // - - PCSTR pRawUrl; - - // - // The canonicalized Unicode URL - // - - HTTP_COOKED_URL CookedUrl; - - // - // Local and remote transport addresses for the connection. - // - - HTTP_TRANSPORT_ADDRESS Address; - - // - // The request headers. - // - - HTTP_REQUEST_HEADERS Headers; - - // - // The total number of bytes received from network for this request. - // - - ULONGLONG BytesReceived; - - // - // pEntityChunks is an array of EntityChunkCount HTTP_DATA_CHUNKs. The - // entity body is copied only if HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY - // was passed to HttpReceiveHttpRequest(). - // - - USHORT EntityChunkCount; - PHTTP_DATA_CHUNK pEntityChunks; - - // - // SSL connection information. - // - - HTTP_RAW_CONNECTION_ID RawConnectionId; - PHTTP_SSL_INFO pSslInfo; - -} HTTP_REQUEST_V1, *PHTTP_REQUEST_V1; - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// Vista - -// -// Version 2.0 members are defined here -// N.B. One must define V2 elements in two places :( -// This is due to the fact that C++ doesn't allow anonymous -// structure declarations and one must use structure -// inheritance instead. -// - -#ifdef __cplusplus - -typedef struct _HTTP_REQUEST_V2 : _HTTP_REQUEST_V1 -{ - // - // Version 1.0 members are inherited - // Version 2.0 members are declared below - // - - // - // Additional Request Informations. - // - - USHORT RequestInfoCount; - PHTTP_REQUEST_INFO pRequestInfo; -} HTTP_REQUEST_V2, *PHTTP_REQUEST_V2; - -#else // __cplusplus - -typedef struct _HTTP_REQUEST_V2 -{ - struct _HTTP_REQUEST_V1; // Anonymous structure - - // - // Version 2.0 members are declared below - // - - // - // Additional Request Informations. - // - - USHORT RequestInfoCount; - PHTTP_REQUEST_INFO pRequestInfo; -} HTTP_REQUEST_V2, *PHTTP_REQUEST_V2; - -#endif // __cplusplus - -typedef HTTP_REQUEST_V2 HTTP_REQUEST; - -#else // _WIN32_WINNT >= 0x0600 - -typedef HTTP_REQUEST_V1 HTTP_REQUEST; - -#endif // _WIN32_WINNT >= 0x0600 - -typedef HTTP_REQUEST * PHTTP_REQUEST; - - -// -// Values for HTTP_REQUEST::Flags. Zero or more of these may be ORed together. -// -// HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS - there is more entity body -// to be read for this request. Otherwise, there is no entity body or -// all of the entity body was copied into pEntityChunks. -// HTTP_REQUEST_FLAG_IP_ROUTED - This flag indicates that the request has been -// routed based on host plus ip or ip binding.This is a hint for the application -// to include the local ip while flushing kernel cache entries build for this -// request if any. -// - -#define HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS 0x00000001 -#define HTTP_REQUEST_FLAG_IP_ROUTED 0x00000002 - - -// -// This structure describes an HTTP response. -// - -typedef struct _HTTP_RESPONSE_V1 -{ - // - // Response flags (see HTTP_RESPONSE_FLAG_* definitions below). - // - - ULONG Flags; - - // - // The raw HTTP protocol version number. - // - - HTTP_VERSION Version; - - // - // The HTTP status code (e.g., 200). - // - - USHORT StatusCode; - - // - // The HTTP reason (e.g., "OK"). This MUST not contain - // non-ASCII characters (i.e., all chars must be in range 0x20-0x7E). - // - - USHORT ReasonLength; // in bytes not including the '\0' - PCSTR pReason; - - // - // The response headers. - // - - HTTP_RESPONSE_HEADERS Headers; - - // - // pEntityChunks points to an array of EntityChunkCount HTTP_DATA_CHUNKs. - // - - USHORT EntityChunkCount; - PHTTP_DATA_CHUNK pEntityChunks; - -} HTTP_RESPONSE_V1, *PHTTP_RESPONSE_V1; - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// -// Values for HTTP_RESPONSE::Flags. -// -// HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE - Set this flag if encodings -// other than identity form are available for this resource.This flag is ignored -// if application has not asked for response to be cached. It's used as a hint -// to the Http Server API for content negotiation used when serving from the -// the kernel response cache. -// - -#define HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE 0x00000001 - - -// Vista - -typedef enum _HTTP_RESPONSE_INFO_TYPE -{ - HttpResponseInfoTypeMultipleKnownHeaders, - HttpResponseInfoTypeAuthenticationProperty, - HttpResponseInfoTypeQoSProperty - -#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP - ,HttpResponseInfoTypeChannelBind -#endif - -} HTTP_RESPONSE_INFO_TYPE, PHTTP_RESPONSE_INFO_TYPE; - -typedef struct _HTTP_RESPONSE_INFO -{ - HTTP_RESPONSE_INFO_TYPE Type; - ULONG Length; - PVOID pInfo; -} HTTP_RESPONSE_INFO, *PHTTP_RESPONSE_INFO; - -#define HTTP_RESPONSE_INFO_FLAGS_PRESERVE_ORDER 0x00000001 - -// -// This structure allows the provision of providing multiple known headers. -// - -typedef struct _HTTP_MULTIPLE_KNOWN_HEADERS -{ - // - // Known header id. - // - - HTTP_HEADER_ID HeaderId; - - ULONG Flags; - - // - // Number of headers of the same category. - // - - USHORT KnownHeaderCount; - - // - // Array of known header structures. - // - - PHTTP_KNOWN_HEADER KnownHeaders; - -} HTTP_MULTIPLE_KNOWN_HEADERS, *PHTTP_MULTIPLE_KNOWN_HEADERS; - -// -// Version 2.0 members are defined here -// N.B. One must define V2 elements in two places :( -// This is due to the fact that C++ doesn't allow anonymous -// structure declarations and one must use structure -// inheritance instead. -// - -#ifdef __cplusplus - -typedef struct _HTTP_RESPONSE_V2 : _HTTP_RESPONSE_V1 -{ - // - // Version 1.0 members are inherited - // Version 2.0 members are declared below - // - - USHORT ResponseInfoCount; - PHTTP_RESPONSE_INFO pResponseInfo; - -} HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2; - -#else // __cplusplus - -typedef struct _HTTP_RESPONSE_V2 -{ - struct _HTTP_RESPONSE_V1; - - // - // Version 2.0 members are declared below - // - - USHORT ResponseInfoCount; - PHTTP_RESPONSE_INFO pResponseInfo; -} HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2; - -#endif // __cplusplus - -typedef HTTP_RESPONSE_V2 HTTP_RESPONSE; - -#else // _WIN32_WINNT >= 0x0600 - -typedef HTTP_RESPONSE_V1 HTTP_RESPONSE; - -#endif // _WIN32_WINNT >= 0x0600 - -typedef HTTP_RESPONSE *PHTTP_RESPONSE; - -// -// Api Version. This is used to ensure compatibility between applications and -// httpapi.dll and http.sys. -// -// This must not be confused with the HTTP Protocol version. -// - -typedef struct _HTTPAPI_VERSION -{ - USHORT HttpApiMajorVersion; - USHORT HttpApiMinorVersion; - -} HTTPAPI_VERSION, *PHTTPAPI_VERSION; - - -#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP - -// Vista - -#define HTTPAPI_VERSION_2 { 2, 0 } - -#endif // _WIN32_WINNT >= 0x0600 - -#define HTTPAPI_VERSION_1 { 1, 0 } - -#define HTTPAPI_EQUAL_VERSION(version, major, minor) \ - ((version).HttpApiMajorVersion == (major) && \ - (version).HttpApiMinorVersion == (minor)) - -#define HTTPAPI_GREATER_VERSION(version, major, minor) \ - ((version).HttpApiMajorVersion > (major) || \ - ((version).HttpApiMajorVersion == (major) && \ - (version).HttpApiMinorVersion > (minor))) - -#define HTTPAPI_LESS_VERSION(version, major, minor) \ - ((version).HttpApiMajorVersion < (major) || \ - ((version).HttpApiMajorVersion == (major) && \ - (version).HttpApiMinorVersion < (minor))) - -#define HTTPAPI_VERSION_GREATER_OR_EQUAL( version, major, minor) \ - (!HTTPAPI_LESS_VERSION(version, major, minor)) - - -// -// Cache control. -// - -// -// This enum defines the available cache policies. -// - -typedef enum _HTTP_CACHE_POLICY_TYPE -{ - HttpCachePolicyNocache, - HttpCachePolicyUserInvalidates, - HttpCachePolicyTimeToLive, - - HttpCachePolicyMaximum - -} HTTP_CACHE_POLICY_TYPE, *PHTTP_CACHE_POLICY_TYPE; - - -// -// Only cache unauthorized GETs + HEADs. -// - -typedef struct _HTTP_CACHE_POLICY -{ - HTTP_CACHE_POLICY_TYPE Policy; - ULONG SecondsToLive; - -} HTTP_CACHE_POLICY, *PHTTP_CACHE_POLICY; - -// -// Enum that is used with HttpSetServiceConfiguration(), -// HttpQueryServiceConfiguration(), and HttpDeleteServiceConfiguration() APIs. -// - -typedef enum _HTTP_SERVICE_CONFIG_ID -{ - HttpServiceConfigIPListenList, // Set, Query & Delete. - HttpServiceConfigSSLCertInfo, // Set, Query & Delete. - HttpServiceConfigUrlAclInfo, // Set, Query & Delete. - HttpServiceConfigTimeout, // Set, Query & Delete. - HttpServiceConfigCache, // Set, Query & Delete. - HttpServiceConfigMax - -} HTTP_SERVICE_CONFIG_ID, *PHTTP_SERVICE_CONFIG_ID; - -// -// Generic Query enum that can be used with HttpQueryServiceConfiguration() -// - -typedef enum _HTTP_SERVICE_CONFIG_QUERY_TYPE -{ - HttpServiceConfigQueryExact, - HttpServiceConfigQueryNext, - HttpServiceConfigQueryMax - -} HTTP_SERVICE_CONFIG_QUERY_TYPE, *PHTTP_SERVICE_CONFIG_QUERY_TYPE; - -// -// This data structure is used to define a key of the SSL certificate hash -// store. -// - -typedef struct _HTTP_SERVICE_CONFIG_SSL_KEY -{ - PSOCKADDR pIpPort; -} HTTP_SERVICE_CONFIG_SSL_KEY, *PHTTP_SERVICE_CONFIG_SSL_KEY; - -// -// This defines a record for the SSL config store. -// - -typedef struct _HTTP_SERVICE_CONFIG_SSL_PARAM -{ - ULONG SslHashLength; // Length of the SSL hash (in bytes) - PVOID pSslHash; // Pointer to the SSL hash - GUID AppId; // A unique identifier that can be used to - // identify the app that has set this parameter - - PWSTR pSslCertStoreName; // Store name to read the server certificate - // from; defaults to "MY". Certificate must be - // stored in the LOCAL_MACHINE context. - - // - // The following settings are used only for client certificates - // - - // - // DefaultCertCheckMode is a bit flag with the following semantics - // 0x1 - Client certificate will not be verified for revocation - // 0x2 - Only cached certificate revocation will be used. - // 0x4 - Enable use of the DefaultRevocationFreshnessTime setting - // 0x10000 - No usage check. - - DWORD DefaultCertCheckMode; - - // - // DefaultRevocationFreshnessTime (seconds) - How often to check for - // an updated Certificate revocation list (CRL). If this value is 0 - // then the new CRL is updated only if the previous one expires - // - - DWORD DefaultRevocationFreshnessTime; - - // - // DefaultRevocationUrlRetrievalTimeout (milliseconds) - Timeout on - // attempt to retrieve certificate revocation list from the remote URL. - // - - DWORD DefaultRevocationUrlRetrievalTimeout; - - // - // pDefaultSslCtlIdentifier - Restrict the certificate issuers that you - // want to trust. Can be a subset of the certificate issuers that are - // trusted by the machine. - // - - PWSTR pDefaultSslCtlIdentifier; - - // - // Store name under LOCAL_MACHINE where Ctl identified by - // pDefaultSslCtlIdentifier is stored. - // - - PWSTR pDefaultSslCtlStoreName; - - // - // Default Flags - see HTTP_SERVICE_CONFIG_SSL_FLAG* below. - // - - DWORD DefaultFlags; - -} HTTP_SERVICE_CONFIG_SSL_PARAM, *PHTTP_SERVICE_CONFIG_SSL_PARAM; - -#define HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER 0x00000001 -#define HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT 0x00000002 -#if _WIN32_WINNT < 0x0600 -#define HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER 0x00000004 -#endif // _WIN32_WINNT < 0x0600 - -// -// This data structure is used by HttpSetServiceConfiguration() for the -// config ID HttpServiceConfigSSLCertInfo. It's used to add a new record -// to the SSL store. -// - -typedef struct _HTTP_SERVICE_CONFIG_SSL_SET -{ - HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; - HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc; -} HTTP_SERVICE_CONFIG_SSL_SET, *PHTTP_SERVICE_CONFIG_SSL_SET; - -// -// This data structure is used by HttpQueryServiceConfiguration() for the -// config ID HttpServiceConfigSSLCertInfo. It's used to query a particular -// record from the SSL store. -// -// If QueryType is HttpServiceConfigQueryExact, then one particular record of -// the type HTTP_SERVICE_CONFIG_SSL_SET is returned. If the QueryType is -// HttpServiceConfigQueryNext, then the next instance of -// HTTP_SERVICE_CONFIG_SSL_SET is returned. In such cases, the dwToken field -// represents the cursor. For the first item, dwToken has to be 0. -// For subsequent items, dwToken has to be incremented by 1, -// until ERROR_NO_MORE_ITEMS is returned. -// - -typedef struct _HTTP_SERVICE_CONFIG_SSL_QUERY -{ - HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc; - HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; - DWORD dwToken; -} HTTP_SERVICE_CONFIG_SSL_QUERY, *PHTTP_SERVICE_CONFIG_SSL_QUERY; - -// -// Set/Delete IP Listen-Only List record -// -// Used as a parameter to both HttpSetServiceConfiguration() and -// HttpDeleteServiceConfiguration() functions. -// - -typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM -{ - USHORT AddrLength; - PSOCKADDR pAddress; -} HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM, *PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM; - -// -// Query IP Listen-Only List record. -// -// Parameter to HttpQueryServiceConfiguration() for the config ID -// HttpServiceConfigIPListenList. On successful return, AddrList -// contains an array of AddrCount elements. Caller must provide a -// large enough buffer to hold all elements in one call. -// -// Caller may determine the type of each returned element by examining -// AddrList[i].ss_family. If it's AF_INET, use ((PSOCKADDR_IN) &AddrList[i]); -// otherwise, for AF_INET6, use ((PSOCKADDR_IN6) &AddrList[i]) -// to select the appropriate address type. -// - -typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY -{ - ULONG AddrCount; - SOCKADDR_STORAGE AddrList[ANYSIZE_ARRAY]; -} HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY, *PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY; - -// -// URL ACL -// -// -typedef struct _HTTP_SERVICE_CONFIG_URLACL_KEY -{ - PWSTR pUrlPrefix; - -} HTTP_SERVICE_CONFIG_URLACL_KEY, *PHTTP_SERVICE_CONFIG_URLACL_KEY; - -// -// This defines a record for the SSL config store. -// - -typedef struct _HTTP_SERVICE_CONFIG_URLACL_PARAM -{ - PWSTR pStringSecurityDescriptor; -} HTTP_SERVICE_CONFIG_URLACL_PARAM, *PHTTP_SERVICE_CONFIG_URLACL_PARAM; - - -// -// This data structure is used by HttpSetServiceConfiguration for the config ID -// HttpServiceConfigUrlAclInfo. It is used to add a new record to the URL ACL -// store. -// - -typedef struct _HTTP_SERVICE_CONFIG_URLACL_SET -{ - HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc; - HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc; -} HTTP_SERVICE_CONFIG_URLACL_SET, *PHTTP_SERVICE_CONFIG_URLACL_SET; - - -// -// This data structure is used by HttpQueryServiceConfiguration() for the -// config ID HttpServiceConfigUrlAclInfo. It's used to query a particular -// record from the URL ACL store. -// -// If QueryType is HttpServiceConfigQueryExact, then one particular record of -// the type HTTP_SERVICE_CONFIG_URLACL_SET is returned. If the QueryType is -// HttpServiceConfigQueryNext, then the next instance of -// HTTP_SERVICE_CONFIG_URLACL_SET is returned. In such cases, the dwToken field -// represents the cursor. For the first item, dwToken has to be 0. -// For subsequent items, dwToken has to be incremented by 1, -// until ERROR_NO_MORE_ITEMS is returned. -// - -typedef struct _HTTP_SERVICE_CONFIG_URLACL_QUERY -{ - HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc; - HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc; - DWORD dwToken; -} HTTP_SERVICE_CONFIG_URLACL_QUERY, *PHTTP_SERVICE_CONFIG_URLACL_QUERY; - -// -// Cache Paramemers -// - -// -// For manipulating global cache parameters. -// The parameters that can be changed or queued are per-uri cache size -// and cached range chunk size. -// - -typedef enum _HTTP_SERVICE_CONFIG_CACHE_KEY -{ - MaxCacheResponseSize = 0, - CacheRangeChunkSize -} HTTP_SERVICE_CONFIG_CACHE_KEY, *PHTTP_SERVICE_CONFIG_CACHE_KEY; - -typedef ULONG HTTP_SERVICE_CONFIG_CACHE_PARAM, - *PHTTP_SERVICE_CONFIG_CACHE_PARAM; - -// -// To set a cache parameter value use the set structure. To query use the key -// directly. When you query a parameter value the output buffer must be exactly -// the sizeof param. -// - -typedef struct { - HTTP_SERVICE_CONFIG_CACHE_KEY KeyDesc; - HTTP_SERVICE_CONFIG_CACHE_PARAM ParamDesc; -} HTTP_SERVICE_CONFIG_CACHE_SET, *PHTTP_SERVICE_CONFIG_CACHE_SET; - - -// -// Define our API linkage. -// - -#if !defined(HTTPAPI_LINKAGE) -#define HTTPAPI_LINKAGE DECLSPEC_IMPORT -#endif // !HTTPAPI_LINKAGE - -// -// Initialize/Terminate APIs. -// - - -// NOTE: MUST be called once before all other APIs - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpInitialize( - IN HTTPAPI_VERSION Version, - IN ULONG Flags, - __reserved IN OUT PVOID pReserved - ); - -// NOTE: MUST be called after final API call returns. - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpTerminate( - IN ULONG Flags, - __reserved IN OUT PVOID pReserved - ); - -// -// HTTP Request Queue manipulation APIs. -// -// This API is maintained for backward competibility for the first -// version of the HTTPAPI and should not be used. Instead the new -// HttpCreateRequestQueue() API must be used. -// -// Use CloseHandle() to release the handles returned by -// HttpCreateHttpHandle() API. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCreateHttpHandle( - OUT PHANDLE pReqQueueHandle, - __reserved IN ULONG Reserved - ); - -#if _WIN32_WINNT >= 0x0600 - -// -// Extended Request Queue manipulation APIs. -// -// Use HttpCloseRequestQueue() API to close the handles -// created by the HttpCreateRequestQueue API. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCreateRequestQueue( - IN HTTPAPI_VERSION Version, - IN PCWSTR pName OPTIONAL, - IN PSECURITY_ATTRIBUTES pSecurityAttributes OPTIONAL, - IN ULONG Flags OPTIONAL, - OUT PHANDLE pReqQueueHandle - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCloseRequestQueue( - IN HANDLE ReqQueueHandle - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSetRequestQueueProperty( - IN HANDLE Handle, - IN HTTP_SERVER_PROPERTY Property, - __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation, - IN ULONG PropertyInformationLength, - __reserved IN ULONG Reserved, - __reserved IN PVOID pReserved - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpQueryRequestQueueProperty( - IN HANDLE Handle, - IN HTTP_SERVER_PROPERTY Property, - __out_bcount_part(PropertyInformationLength, *pReturnLength) - OUT PVOID pPropertyInformation, - IN ULONG PropertyInformationLength, - __reserved IN ULONG Reserved, - __out_opt OUT PULONG pReturnLength OPTIONAL, - __reserved IN PVOID pReserved - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpShutdownRequestQueue( - IN HANDLE ReqQueueHandle - ); - -#endif // _WIN32_WINNT >= 0x0600 - -// -// SSL APIs. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpReceiveClientCertificate( - IN HANDLE ReqQueueHandle, - IN HTTP_CONNECTION_ID ConnectionId, - IN ULONG Flags, - __out_bcount_part(SslClientCertInfoSize, *pBytesReceived) - OUT PHTTP_SSL_CLIENT_CERT_INFO pSslClientCertInfo, - IN ULONG SslClientCertInfoSize, - __out_opt OUT PULONG pBytesReceived OPTIONAL, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -#if _WIN32_WINNT >= 0x0600 - -// -// Server Session APIs. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCreateServerSession( - IN HTTPAPI_VERSION Version, - OUT PHTTP_SERVER_SESSION_ID pServerSessionId, - __reserved IN ULONG Reserved - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCloseServerSession( - IN HTTP_SERVER_SESSION_ID ServerSessionId - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpQueryServerSessionProperty( - IN HTTP_SERVER_SESSION_ID ServerSessionId, - IN HTTP_SERVER_PROPERTY Property, - __out_bcount_part(PropertyInformationLength, *pReturnLength) - OUT PVOID pPropertyInformation, - IN ULONG PropertyInformationLength, - __out_opt OUT PULONG pReturnLength OPTIONAL - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSetServerSessionProperty( - IN HTTP_SERVER_SESSION_ID ServerSessionId, - IN HTTP_SERVER_PROPERTY Property, - __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation, - IN ULONG PropertyInformationLength - ); - -#endif // _WIN32_WINNT >= 0x0600 - -// -// Url Configuration APIs. Can only be used for V1 request queues. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpAddUrl( - IN HANDLE ReqQueueHandle, - IN PCWSTR pFullyQualifiedUrl, - __reserved IN PVOID pReserved - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpRemoveUrl( - IN HANDLE ReqQueueHandle, - IN PCWSTR pFullyQualifiedUrl - ); - -#if _WIN32_WINNT >= 0x0600 - -// -// Url Group APIs. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCreateUrlGroup( - IN HTTP_SERVER_SESSION_ID ServerSessionId, - OUT PHTTP_URL_GROUP_ID pUrlGroupId, - __reserved IN ULONG Reserved - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCloseUrlGroup( - IN HTTP_URL_GROUP_ID UrlGroupId - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpAddUrlToUrlGroup( - IN HTTP_URL_GROUP_ID UrlGroupId, - IN PCWSTR pFullyQualifiedUrl, - IN HTTP_URL_CONTEXT UrlContext OPTIONAL, - __reserved IN ULONG Reserved - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpRemoveUrlFromUrlGroup( - IN HTTP_URL_GROUP_ID UrlGroupId, - IN PCWSTR pFullyQualifiedUrl, - IN ULONG Flags - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSetUrlGroupProperty( - IN HTTP_URL_GROUP_ID UrlGroupId, - IN HTTP_SERVER_PROPERTY Property, - __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation, - IN ULONG PropertyInformationLength - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpQueryUrlGroupProperty( - IN HTTP_URL_GROUP_ID UrlGroupId, - IN HTTP_SERVER_PROPERTY Property, - __out_bcount_part(PropertyInformationLength, *pReturnLength) - OUT PVOID pPropertyInformation, - IN ULONG PropertyInformationLength, - __out_opt OUT PULONG pReturnLength OPTIONAL - ); - -#endif // _WIN32_WINNT >= 0x0600 - -// -// HTTP Server I/O APIs. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpReceiveHttpRequest( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN ULONG Flags, - __out_bcount_part(RequestBufferLength, *pBytesReceived) - OUT PHTTP_REQUEST pRequestBuffer, - IN ULONG RequestBufferLength, - __out_opt OUT PULONG pBytesReceived OPTIONAL, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpReceiveRequestEntityBody( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN ULONG Flags, - __out_bcount_part(BufferLength, *pBytesReceived) OUT PVOID pBuffer, - IN ULONG BufferLength, - __out_opt OUT PULONG pBytesReceived OPTIONAL, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -#if _WIN32_WINNT >= 0x0600 - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSendHttpResponse( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN ULONG Flags, - IN PHTTP_RESPONSE pHttpResponse, - IN PHTTP_CACHE_POLICY pCachePolicy OPTIONAL, - OUT PULONG pBytesSent OPTIONAL, - OUT PVOID pReserved1 OPTIONAL, // must be NULL - IN ULONG Reserved2 OPTIONAL, // must be 0 - IN LPOVERLAPPED pOverlapped OPTIONAL, - IN PHTTP_LOG_DATA pLogData OPTIONAL - ); - -#else // _WIN32_WINNT >= 0x0600 - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSendHttpResponse( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN ULONG Flags, - IN PHTTP_RESPONSE pHttpResponse, - IN PVOID pReserved1 OPTIONAL, // must be NULL - OUT PULONG pBytesSent OPTIONAL, - OUT PVOID pReserved2 OPTIONAL, // must be NULL - IN ULONG Reserved3 OPTIONAL, // must be 0 - IN LPOVERLAPPED pOverlapped OPTIONAL, - IN PVOID pReserved4 OPTIONAL // must be NULL - ); - -#endif // _WIN32_WINNT >= 0x0600 - -#if _WIN32_WINNT >= 0x0600 - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSendResponseEntityBody( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN ULONG Flags, - IN USHORT EntityChunkCount OPTIONAL, - __in_ecount_opt(EntityChunkCount) - IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL, - OUT PULONG pBytesSent OPTIONAL, - OUT PVOID pReserved1 OPTIONAL, // must be NULL - IN ULONG Reserved2 OPTIONAL, // must be 0 - IN LPOVERLAPPED pOverlapped OPTIONAL, - IN PHTTP_LOG_DATA pLogData OPTIONAL - ); - -#else // _WIN32_WINNT >= 0x0600 - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSendResponseEntityBody( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN ULONG Flags, - IN USHORT EntityChunkCount OPTIONAL, - __in_ecount_opt(EntityChunkCount) - IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL, - OUT PULONG pBytesSent OPTIONAL, - OUT PVOID pReserved1 OPTIONAL, // must be NULL - IN ULONG Reserved2 OPTIONAL, // must be 0 - IN LPOVERLAPPED pOverlapped OPTIONAL, - IN PVOID pReserved3 OPTIONAL // must be NULL - ); - -#endif // _WIN32_WINNT >= 0x0600 - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpWaitForDisconnect( - IN HANDLE ReqQueueHandle, - IN HTTP_CONNECTION_ID ConnectionId, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -#if _WIN32_WINNT >= 0x0600 - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpWaitForDisconnectEx( - IN HANDLE ReqQueueHandle, - IN HTTP_CONNECTION_ID ConnectionId, - __reserved IN ULONG Reserved OPTIONAL, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpCancelHttpRequest( - IN HANDLE ReqQueueHandle, - IN HTTP_REQUEST_ID RequestId, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpWaitForDemandStart( - IN HANDLE ReqQueueHandle, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - - -#endif // _WIN32_WINNT >= 0x0600 - -// -// Cache manipulation APIs. -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpFlushResponseCache( - IN HANDLE ReqQueueHandle, - IN PCWSTR pUrlPrefix, - IN ULONG Flags, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpAddFragmentToCache( - IN HANDLE ReqQueueHandle, - IN PCWSTR pUrlPrefix, - IN PHTTP_DATA_CHUNK pDataChunk, - IN PHTTP_CACHE_POLICY pCachePolicy, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpReadFragmentFromCache( - IN HANDLE ReqQueueHandle, - IN PCWSTR pUrlPrefix, - IN PHTTP_BYTE_RANGE pByteRange OPTIONAL, - __out_bcount_part(BufferLength, *pBytesRead) OUT PVOID pBuffer, - IN ULONG BufferLength, - OUT PULONG pBytesRead OPTIONAL, - IN LPOVERLAPPED pOverlapped OPTIONAL - ); - -// -// Server configuration APIs -// - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpSetServiceConfiguration( - __reserved IN HANDLE ServiceHandle, - IN HTTP_SERVICE_CONFIG_ID ConfigId, - __in_bcount(ConfigInformationLength) IN PVOID pConfigInformation, - IN ULONG ConfigInformationLength, - __reserved IN LPOVERLAPPED pOverlapped - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpDeleteServiceConfiguration( - __reserved IN HANDLE ServiceHandle, - IN HTTP_SERVICE_CONFIG_ID ConfigId, - __in_bcount(ConfigInformationLength) IN PVOID pConfigInformation, - IN ULONG ConfigInformationLength, - __reserved IN LPOVERLAPPED pOverlapped - ); - -HTTPAPI_LINKAGE -ULONG -WINAPI -HttpQueryServiceConfiguration( - __reserved IN HANDLE ServiceHandle, - IN HTTP_SERVICE_CONFIG_ID ConfigId, - __in_bcount_opt(InputConfigInformationLength) - IN PVOID pInputConfigInformation OPTIONAL, - IN ULONG InputConfigInformationLength OPTIONAL, - __out_bcount_part_opt(OutputConfigInformationLength, *pReturnLength) - OUT PVOID pOutputConfigInformation OPTIONAL, - IN ULONG OutputConfigInformationLength OPTIONAL, - __out_opt OUT PULONG pReturnLength OPTIONAL, - __reserved IN LPOVERLAPPED pOverlapped - ); - - -#if BUILD_IIS_FOR_XP - -// part of the httpp.h necessary to build for XP - -// -// Counter Group. -// - -// -// Counter property description. -// - -typedef struct _HTTP_PROP_DESC -{ - ULONG Size; - ULONG Offset; - BOOLEAN WPZeros; - -} HTTP_PROP_DESC, *PHTTP_PROP_DESC; - - -// -// This enum defines the available counter groups. -// - -typedef enum _HTTP_COUNTER_GROUP -{ - HttpCounterGroupSite, - HttpCounterGroupGlobal, - - HttpCounterGroupMaximum - -} HTTP_COUNTER_GROUP, *PHTTP_COUNTER_GROUP; - -// -// Structures for IOCTL_HTTP_GET_COUNTERS. -// - -typedef struct _HTTP_COUNTER_INFO -{ - HTTP_SERVER_SESSION_ID ServerSessionId; - HTTP_COUNTER_GROUP CounterGroup; - -} HTTP_COUNTER_INFO, *PHTTP_COUNTER_INFO; - -// -// This enum defines the type of global couters. -// - -typedef enum _HTTP_GLOBAL_COUNTER_ID -{ - HttpGlobalCounterCurrentUrisCached, - HttpGlobalCounterTotalUrisCached, - HttpGlobalCounterUriCacheHits, - HttpGlobalCounterUriCacheMisses, - HttpGlobalCounterUriCacheFlushes, - HttpGlobalCounterTotalFlushedUris, - - HttpGlobalCounterMaximum - -} HTTP_GLOBAL_COUNTER_ID, *PHTTP_GLOBAL_COUNTER_ID; - - -// -// Global couters. -// - -typedef struct _HTTP_GLOBAL_COUNTERS -{ - ULONG CurrentUrisCached; - ULONG TotalUrisCached; - ULONG UriCacheHits; - ULONG UriCacheMisses; - ULONG UriCacheFlushes; - ULONG TotalFlushedUris; - -} HTTP_GLOBAL_COUNTERS, *PHTTP_GLOBAL_COUNTERS; - - -// -// This enum defines the type of site counters. -// NB: HTTP_SITE_COUNTER_ID and HTTP_SITE_COUNTERS -// must be in the same order -// - -typedef enum _HTTP_SITE_COUNTER_ID -{ - HttpSiteCounterBytesSent, - HttpSiteCounterBytesReceived, - HttpSiteCounterBytesTransfered, - HttpSiteCounterCurrentConns, - HttpSiteCounterMaxConnections, - HttpSiteCounterConnAttempts, - HttpSiteCounterGetReqs, - HttpSiteCounterHeadReqs, - HttpSiteCounterAllReqs, - HttpSiteCounterMeasuredIoBandwidthUsage, - HttpSiteCounterCurrentBlockedBandwidthBytes, - HttpSiteCounterTotalBlockedBandwidthBytes, - - HttpSiteCounterMaximum - -} HTTP_SITE_COUNTER_ID, *PHTTP_SITE_COUNTER_ID; - - -// -// Site counters. -// - -typedef struct _HTTP_SITE_COUNTERS -{ - ULONG SiteId; - ULONGLONG BytesSent; - ULONGLONG BytesReceived; - ULONGLONG BytesTransfered; - ULONG CurrentConns; - ULONG MaxConnections; - ULONG ConnAttempts; - ULONG GetReqs; - ULONG HeadReqs; - ULONG AllReqs; - ULONG MeasuredIoBandwidthUsage; - ULONG CurrentBlockedBandwidthBytes; - ULONG TotalBlockedBandwidthBytes; - -} HTTP_SITE_COUNTERS, *PHTTP_SITE_COUNTERS; - -#endif - -#ifdef __cplusplus -} // extern "C" -#endif // __cplusplus - -#endif // _WIN32_WINNT >= 0x0501 - -#endif // __HTTP_H__ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h deleted file mode 100644 index 6e9437d7edef..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h +++ /dev/null @@ -1,3404 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _HTTPSERV_H_ -#define _HTTPSERV_H_ - -#if (!defined(_WIN64) && !defined(WIN32)) -#error httpserv.h is only supported on WIN32 or WIN64 platforms -#endif - -#include - -#if _WIN32_WINNT >= 0x0600 -#include "http.h" -#else -#include "http_xp.h" -#endif - -// -// Request deterministic notifications -// - -// request is beginning -#define RQ_BEGIN_REQUEST 0x00000001 -// request is being authenticated -#define RQ_AUTHENTICATE_REQUEST 0x00000002 -// request is being authorized -#define RQ_AUTHORIZE_REQUEST 0x00000004 -// satisfy request from cache -#define RQ_RESOLVE_REQUEST_CACHE 0x00000008 -// map handler for request -#define RQ_MAP_REQUEST_HANDLER 0x00000010 -// acquire request state -#define RQ_ACQUIRE_REQUEST_STATE 0x00000020 -// pre-execute handler -#define RQ_PRE_EXECUTE_REQUEST_HANDLER 0x00000040 -// execute handler -#define RQ_EXECUTE_REQUEST_HANDLER 0x00000080 -// release request state -#define RQ_RELEASE_REQUEST_STATE 0x00000100 -// update cache -#define RQ_UPDATE_REQUEST_CACHE 0x00000200 -// log request -#define RQ_LOG_REQUEST 0x00000400 -// end request -#define RQ_END_REQUEST 0x00000800 - -// -// Request non-deterministic notifications -// - -// custom notification -#define RQ_CUSTOM_NOTIFICATION 0x10000000 -// send response -#define RQ_SEND_RESPONSE 0x20000000 -// read entity -#define RQ_READ_ENTITY 0x40000000 -// map a url to a physical path -#define RQ_MAP_PATH 0x80000000 - -// -// Global notifications -// - -// stop accepting new requests -#define GL_STOP_LISTENING 0x00000002 -// cache cleanup before termination -#define GL_CACHE_CLEANUP 0x00000004 -// cache operation -#define GL_CACHE_OPERATION 0x00000010 -// health check -#define GL_HEALTH_CHECK 0x00000020 -// configuration changed -#define GL_CONFIGURATION_CHANGE 0x00000040 -// file changed -#define GL_FILE_CHANGE 0x00000080 -// before request pipeline has started -#define GL_PRE_BEGIN_REQUEST 0x00000100 -// application start -#define GL_APPLICATION_START 0x00000200 -// resolve modules for an application -#define GL_APPLICATION_RESOLVE_MODULES 0x00000400 -// application end -#define GL_APPLICATION_STOP 0x00000800 -// RSCA query -#define GL_RSCA_QUERY 0x00001000 -// trace event was raised -#define GL_TRACE_EVENT 0x00002000 -// custom notification -#define GL_CUSTOM_NOTIFICATION 0x00004000 -// thread cleanup notification -#define GL_THREAD_CLEANUP 0x00008000 -// application preload notification -#define GL_APPLICATION_PRELOAD 0x00010000 - -// -// Request notification return status -// - -typedef enum REQUEST_NOTIFICATION_STATUS -{ - RQ_NOTIFICATION_CONTINUE, // continue processing - // for notification - RQ_NOTIFICATION_PENDING, // suspend processing - // for notification - RQ_NOTIFICATION_FINISH_REQUEST // finish request - // processing -}; - -// -// Out of band return codes -// - -typedef enum GLOBAL_NOTIFICATION_STATUS -{ - GL_NOTIFICATION_CONTINUE, // continue processing - // for notification - GL_NOTIFICATION_HANDLED // finish processing for - // notification -}; - -// -// Priority class aliases -// - -#define PRIORITY_ALIAS_FIRST L"FIRST" -#define PRIORITY_ALIAS_HIGH L"HIGH" -#define PRIORITY_ALIAS_MEDIUM L"MEDIUM" -#define PRIORITY_ALIAS_LOW L"LOW" -#define PRIORITY_ALIAS_LAST L"LAST" - -// -// Cache operations -// - -typedef enum CACHE_OPERATION -{ - CACHE_OPERATION_RETRIEVE, - CACHE_OPERATION_ADD, - CACHE_OPERATION_DELETE, - CACHE_OPERATION_FLUSH_PREFIX, - CACHE_OPERATION_ENUM -}; - -// -// Module identifier -// - -typedef VOID* HTTP_MODULE_ID; - -// -// Flags for IHttpContext->CloneContext() -// - -#define CLONE_FLAG_BASICS 0x01 -#define CLONE_FLAG_HEADERS 0x02 -#define CLONE_FLAG_ENTITY 0x04 -#define CLONE_FLAG_NO_PRECONDITION 0x08 -#define CLONE_FLAG_NO_DAV 0x10 - -// -// Flags for IHttpContext->ExecuteRequest() -// - -#define EXECUTE_FLAG_NO_HEADERS 0x01 -#define EXECUTE_FLAG_IGNORE_CURRENT_INTERCEPTOR 0x02 -#define EXECUTE_FLAG_IGNORE_APPPOOL 0x04 -#define EXECUTE_FLAG_DISABLE_CUSTOM_ERROR 0x08 -#define EXECUTE_FLAG_SAME_URL 0x10 -// do not flush the child response but copy it back to the parent -#define EXECUTE_FLAG_BUFFER_RESPONSE 0x20 -// child response is still eligible for http.sys caching -#define EXECUTE_FLAG_HTTP_CACHE_ELIGIBLE 0x40 - - -// -// forward declarations -// -struct HTTP_TRACE_CONFIGURATION; -struct HTTP_TRACE_EVENT; - -class IWpfSettings; -class IHttpTraceContext; - -// -// Module-specific context descriptor -// -class __declspec(uuid("f1927f76-790e-4ccb-a72e-396bdfdae05d")) -IHttpStoredContext -{ - public: - virtual - VOID - CleanupStoredContext( - VOID - ) = 0; -}; - -// -// Context container -// -class __declspec(uuid("d7fad7c9-aa27-4ab9-bd60-e55ccba3f5dc")) -IHttpModuleContextContainer -{ - public: - virtual - IHttpStoredContext * - GetModuleContext( - IN HTTP_MODULE_ID moduleId - ) = 0; - - virtual - HRESULT - SetModuleContext( - IN IHttpStoredContext * ppStoredContext, - IN HTTP_MODULE_ID moduleId - ) = 0; -}; - -// -// Dispensed context container -// -class __declspec(uuid("2ae49359-95dd-4e48-ae20-c0cb9d0bc03a")) -IDispensedHttpModuleContextContainer : public IHttpModuleContextContainer -{ -public: - virtual - VOID - ReleaseContainer( - VOID - ) = 0; -}; - -// -// Performance counter descriptor -// -class __declspec(uuid("bdfc4c4a-12a4-4744-87d8-765eb320c59f")) -IHttpPerfCounterInfo -{ - public: - virtual - VOID - IncrementCounter( - DWORD dwCounterIndex, - DWORD dwValue = 1 - ) = 0; - - virtual - VOID - DecrementCounter( - DWORD dwCounterIndex, - DWORD dwValue = 1 - ) = 0; -}; - -// -// Application descriptor -// -class __declspec(uuid("3f75d9e6-1075-422c-ad89-93a85f2d7bdc")) -IHttpApplication -{ - public: - virtual - PCWSTR - GetApplicationPhysicalPath( - VOID - ) const = 0; - - virtual - PCWSTR - GetApplicationId( - VOID - ) const = 0; - - virtual - PCWSTR - GetAppConfigPath( - VOID - ) const = 0; - - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; -}; - -// -// URI cache entry descriptor -// -class __declspec(uuid("7e0e6167-0094-49a1-8287-ecf6dc6e73a6")) -IHttpUrlInfo -{ - public: - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; - - virtual - BOOL - IsFrequentlyHit( - VOID - ) const = 0; -}; - -// -// Script map descriptor -// -class __declspec(uuid("d7fe3d77-68bc-4d4a-851f-eec9fb68017c")) -IScriptMapInfo -{ - public: - virtual - PCWSTR - GetPath( - VOID - ) const = 0; - - virtual - PCSTR - GetAllowedVerbs( - VOID - ) const = 0; - - virtual - PCWSTR - GetModules( - OUT DWORD * pcchModules = NULL - ) const = 0; - - virtual - PCWSTR - GetScriptProcessor( - OUT DWORD * pcchScriptProcessor = NULL - ) const = 0; - - virtual - PCWSTR - GetManagedType( - OUT DWORD * pcchManagedType = NULL - ) const = 0; - - virtual - BOOL - GetAllowPathInfoForScriptMappings( - VOID - ) const = 0; - - virtual - DWORD - GetRequiredAccess( - VOID - ) const = 0; - - virtual - DWORD - GetResourceType( - VOID - ) const = 0; - - virtual - BOOL - GetIsStarScriptMap( - VOID - ) const = 0; - - virtual - DWORD - GetResponseBufferLimit( - VOID - ) const = 0; - - virtual - PCWSTR - GetName( - VOID - ) const = 0; -}; - -class __declspec(uuid("fd86e6de-fb0e-47dd-820a-e0da12be46e9")) -IHttpTokenEntry; - -// -// Metadata descriptor -// -class __declspec(uuid("48b10633-825d-495e-93b0-225380053e8e")) -IMetadataInfo -{ - public: - virtual - PCWSTR - GetMetaPath( - VOID - ) const = 0; - - virtual - PCWSTR - GetVrPath( - VOID - ) const = 0; - - virtual - IHttpTokenEntry * - GetVrToken( - VOID - ) = 0; - - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; -}; - -// -// Provides an interface to an HTTP request object. The methods on this -// class can be used to inspect and modify request data. -// -class __declspec(uuid("e8698f7e-576e-4cac-a309-67435355faef")) -IHttpRequest -{ - public: - virtual - HTTP_REQUEST * - GetRawHttpRequest( - VOID - ) = 0; - - virtual - const HTTP_REQUEST * - GetRawHttpRequest( - VOID - ) const = 0; - - virtual - PCSTR - GetHeader( - IN PCSTR pszHeaderName, - OUT USHORT * pcchHeaderValue = NULL - ) const = 0; - - virtual - PCSTR - GetHeader( - IN HTTP_HEADER_ID ulHeaderIndex, - OUT USHORT * pcchHeaderValue = NULL - ) const = 0; - - virtual - HRESULT - SetHeader( - IN PCSTR pszHeaderName, - IN PCSTR pszHeaderValue, - IN USHORT cchHeaderValue, - IN BOOL fReplace - ) = 0; - - virtual - HRESULT - SetHeader( - IN HTTP_HEADER_ID ulHeaderIndex, - IN PCSTR pszHeaderValue, - IN USHORT cchHeaderValue, - IN BOOL fReplace - ) = 0; - - virtual - HRESULT - DeleteHeader( - IN PCSTR pszHeaderName - ) = 0; - - virtual - HRESULT - DeleteHeader( - IN HTTP_HEADER_ID ulHeaderIndex - ) = 0; - - virtual - PCSTR - GetHttpMethod( - VOID - ) const = 0; - - virtual - HRESULT - SetHttpMethod( - IN PCSTR pszHttpMethod - ) = 0; - - virtual - HRESULT - SetUrl( - IN PCWSTR pszUrl, - IN DWORD cchUrl, - IN BOOL fResetQueryString - ) = 0; - - virtual - HRESULT - SetUrl( - IN PCSTR pszUrl, - IN DWORD cchUrl, - IN BOOL fResetQueryString - ) = 0; - - virtual - BOOL - GetUrlChanged( - VOID - ) const = 0; - - virtual - PCWSTR - GetForwardedUrl( - VOID - ) const = 0; - - virtual - PSOCKADDR - GetLocalAddress( - VOID - ) const = 0; - - virtual - PSOCKADDR - GetRemoteAddress( - VOID - ) const = 0; - - virtual - HRESULT - ReadEntityBody( - OUT VOID * pvBuffer, - IN DWORD cbBuffer, - IN BOOL fAsync, - OUT DWORD * pcbBytesReceived, - OUT BOOL * pfCompletionPending = NULL - ) = 0; - - virtual - HRESULT - InsertEntityBody( - IN VOID * pvBuffer, - IN DWORD cbBuffer - ) = 0; - - virtual - DWORD - GetRemainingEntityBytes( - VOID - ) = 0; - - virtual - VOID - GetHttpVersion( - OUT USHORT * pMajorVersion, - OUT USHORT * pMinorVersion - ) const = 0; - - virtual - HRESULT - GetClientCertificate( - OUT HTTP_SSL_CLIENT_CERT_INFO ** ppClientCertInfo, - OUT BOOL * pfClientCertNegotiated - ) = 0; - - virtual - HRESULT - NegotiateClientCertificate( - IN BOOL fAsync, - OUT BOOL * pfCompletionPending = NULL - ) = 0; - - virtual - DWORD - GetSiteId( - VOID - ) const = 0; - - virtual - HRESULT - GetHeaderChanges( - IN DWORD dwOldChangeNumber, - OUT DWORD * pdwNewChangeNumber, - IN OUT PCSTR knownHeaderSnapshot[HttpHeaderRequestMaximum], - IN OUT DWORD * pdwUnknownHeaderSnapshot, - IN OUT PCSTR **ppUnknownHeaderNameSnapshot, - IN OUT PCSTR **ppUnknownHeaderValueSnapshot, - __out_ecount(HttpHeaderRequestMaximum+1) - DWORD diffedKnownHeaderIndices[HttpHeaderRequestMaximum+1], - OUT DWORD * pdwDiffedUnknownHeaders, - OUT DWORD **ppDiffedUnknownHeaderIndices - ) = 0; -}; - -class __declspec(uuid("d9244ae1-51f8-4aa1-a66d-19277c33e610")) -IHttpRequest2 : public IHttpRequest -{ - public: - virtual - HRESULT - GetChannelBindingToken( - __deref_out_bcount_part(*pTokenSize, *pTokenSize) - PBYTE * ppToken, - DWORD * pTokenSize - ) = 0; -}; - -class __declspec(uuid("cb1c40ca-70f2-41a0-add2-881f5ef57388")) -IHttpCachePolicy -{ - public: - virtual - HTTP_CACHE_POLICY * - GetKernelCachePolicy( - VOID - ) = 0; - - virtual - VOID - SetKernelCacheInvalidatorSet( - VOID - ) = 0; - - virtual - HTTP_CACHE_POLICY * - GetUserCachePolicy( - VOID - ) = 0; - - virtual - HRESULT - AppendVaryByHeader( - PCSTR pszHeader - ) = 0; - - virtual - PCSTR - GetVaryByHeaders( - VOID - ) const = 0; - - virtual - HRESULT - AppendVaryByQueryString( - PCSTR pszParam - ) = 0; - - virtual - PCSTR - GetVaryByQueryStrings( - VOID - ) const = 0; - - virtual - HRESULT - SetVaryByValue( - PCSTR pszValue - ) = 0; - - virtual - PCSTR - GetVaryByValue( - VOID - ) const = 0; - - virtual - BOOL - IsUserCacheEnabled( - VOID - ) const = 0; - - virtual - VOID - DisableUserCache( - VOID - ) = 0; - - virtual - BOOL - IsCached( - VOID - ) const = 0; - - virtual - VOID - SetIsCached( - VOID - ) = 0; - - virtual - BOOL - GetKernelCacheInvalidatorSet( - VOID - ) const = 0; -}; - -class __declspec(uuid("9f4ba807-050e-4495-ae55-8870f7e9194a")) -IHttpCachePolicy2 : public IHttpCachePolicy -{ - public: - virtual - BOOL - IsForceUpdateSet( - VOID - ) const = 0; - - virtual - VOID - SetForceUpdate( - VOID - ) = 0; -}; - -// -// Response descriptor -// -class __declspec(uuid("7e1c6b38-628f-4e6c-95dc-41237eb7f95e")) -IHttpResponse -{ - public: - virtual - HTTP_RESPONSE * - GetRawHttpResponse( - VOID - ) = 0; - - virtual - const HTTP_RESPONSE * - GetRawHttpResponse( - VOID - ) const = 0; - - virtual - IHttpCachePolicy * - GetCachePolicy( - VOID - ) = 0; - - virtual - HRESULT - SetStatus( - IN USHORT statusCode, - IN PCSTR pszReason, - IN USHORT uSubStatus = 0, - IN HRESULT hrErrorToReport = S_OK, - IN IAppHostConfigException *pException = NULL, - IN BOOL fTrySkipCustomErrors = FALSE - ) = 0; - - virtual - HRESULT - SetHeader( - IN PCSTR pszHeaderName, - IN PCSTR pszHeaderValue, - IN USHORT cchHeaderValue, - IN BOOL fReplace - ) = 0; - - virtual - HRESULT - SetHeader( - IN HTTP_HEADER_ID ulHeaderIndex, - IN PCSTR pszHeaderValue, - IN USHORT cchHeaderValue, - IN BOOL fReplace - ) = 0; - - virtual - HRESULT - DeleteHeader( - IN PCSTR pszHeaderName - ) = 0; - - virtual - HRESULT - DeleteHeader( - IN HTTP_HEADER_ID ulHeaderIndex - ) = 0; - - virtual - PCSTR - GetHeader( - IN PCSTR pszHeaderName, - OUT USHORT * pcchHeaderValue = NULL - ) const = 0; - - virtual - PCSTR - GetHeader( - IN HTTP_HEADER_ID ulHeaderIndex, - OUT USHORT * pcchHeaderValue = NULL - ) const = 0; - - virtual - VOID - Clear( - VOID - ) = 0; - - virtual - VOID - ClearHeaders( - VOID - ) = 0; - - virtual - VOID - SetNeedDisconnect( - VOID - ) = 0; - - virtual - VOID - ResetConnection( - VOID - ) = 0; - - virtual - VOID - DisableKernelCache( - ULONG reason = 9 - ) = 0; - - virtual - BOOL - GetKernelCacheEnabled( - VOID - ) const = 0; - - virtual - VOID - SuppressHeaders( - VOID - ) = 0; - - virtual - BOOL - GetHeadersSuppressed( - VOID - ) const = 0; - - virtual - HRESULT - Flush( - IN BOOL fAsync, - IN BOOL fMoreData, - OUT DWORD * pcbSent, - OUT BOOL * pfCompletionExpected = NULL - ) = 0; - - virtual - HRESULT - Redirect( - IN PCSTR pszUrl, - IN BOOL fResetStatusCode = TRUE, - IN BOOL fIncludeParameters = FALSE - ) = 0; - - virtual - HRESULT - WriteEntityChunkByReference( - IN HTTP_DATA_CHUNK * pDataChunk, - IN LONG lInsertPosition = -1 - ) = 0; - - virtual - HRESULT - WriteEntityChunks( - IN HTTP_DATA_CHUNK * pDataChunks, - IN DWORD nChunks, - IN BOOL fAsync, - IN BOOL fMoreData, - OUT DWORD * pcbSent, - OUT BOOL * pfCompletionExpected = NULL - ) = 0; - - virtual - VOID - DisableBuffering( - VOID - ) = 0; - - virtual - VOID - GetStatus( - OUT USHORT * pStatusCode, - OUT USHORT * pSubStatus = NULL, - OUT PCSTR * ppszReason = NULL, - OUT USHORT * pcchReason = NULL, - OUT HRESULT * phrErrorToReport = NULL, - OUT PCWSTR * ppszModule = NULL, - OUT DWORD * pdwNotification = NULL, - OUT IAppHostConfigException ** ppException = NULL, - OUT BOOL * pfTrySkipCustomErrors = NULL - ) = 0; - - virtual - HRESULT - SetErrorDescription( - IN PCWSTR pszDescription, - IN DWORD cchDescription, - IN BOOL fHtmlEncode = TRUE - ) = 0; - - virtual - PCWSTR - GetErrorDescription( - OUT DWORD * pcchDescription = NULL - ) = 0; - - virtual - HRESULT - GetHeaderChanges( - IN DWORD dwOldChangeNumber, - OUT DWORD * pdwNewChangeNumber, - IN OUT PCSTR knownHeaderSnapshot[HttpHeaderResponseMaximum], - IN OUT DWORD * pdwUnknownHeaderSnapshot, - IN OUT PCSTR **ppUnknownHeaderNameSnapshot, - IN OUT PCSTR **ppUnknownHeaderValueSnapshot, - __out_ecount(HttpHeaderResponseMaximum+1) - DWORD diffedKnownHeaderIndices[HttpHeaderResponseMaximum+1], - OUT DWORD * pdwDiffedUnknownHeaders, - OUT DWORD **ppDiffedUnknownHeaderIndices - ) = 0; - - virtual - VOID - CloseConnection( - VOID - ) = 0; -}; - -// -// User descriptor -// -class __declspec(uuid("8059e6f8-10ce-4d61-b47e-5a1d8d9a8b67")) -IHttpUser -{ - public: - virtual - PCWSTR - GetRemoteUserName( - VOID - ) = 0; - - virtual - PCWSTR - GetUserName( - VOID - ) = 0; - - virtual - PCWSTR - GetAuthenticationType( - VOID - ) = 0; - - virtual - PCWSTR - GetPassword( - VOID - ) = 0; - - virtual - HANDLE - GetImpersonationToken( - VOID - ) = 0; - - virtual - HANDLE - GetPrimaryToken( - VOID - ) = 0; - - virtual - VOID - ReferenceUser( - VOID - ) = 0; - - virtual - VOID - DereferenceUser( - VOID - ) = 0; - - virtual - BOOL - SupportsIsInRole( - VOID - ) = 0; - - virtual - HRESULT - IsInRole( - IN PCWSTR pszRoleName, - OUT BOOL * pfInRole - ) = 0; - - virtual - PVOID - GetUserVariable( - IN PCSTR pszVariableName - ) = 0; -}; - -#define HTTP_USER_VARIABLE_SID "SID" -#define HTTP_USER_VARIABLE_CTXT_HANDLE "CtxtHandle" -#define HTTP_USER_VARIABLE_CRED_HANDLE "CredHandle" - -class __declspec(uuid("841d9a71-75f4-4626-8b97-66046ca7e45b")) -IHttpConnectionStoredContext : public IHttpStoredContext -{ - public: - virtual - VOID - NotifyDisconnect( - VOID - ) = 0; -}; - -class __declspec(uuid("f3dd2fb3-4d11-4295-b8ab-4cb667add1fe")) -IHttpConnectionModuleContextContainer : public IHttpModuleContextContainer -{ - public: - virtual - IHttpConnectionStoredContext * - GetConnectionModuleContext( - IN HTTP_MODULE_ID moduleId - ) = 0; - - virtual - HRESULT - SetConnectionModuleContext( - IN IHttpConnectionStoredContext * ppStoredContext, - IN HTTP_MODULE_ID moduleId - ) = 0; -}; - -// -// Connection descriptor -// -class __declspec(uuid("d9a5de00-3346-4599-9826-fe88565e1226")) -IHttpConnection -{ - public: - virtual - BOOL - IsConnected( - VOID - ) const = 0; - - virtual - VOID * - AllocateMemory( - DWORD cbAllocation - ) = 0; - - virtual - IHttpConnectionModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; -}; - -// -// Forward declarations -// -class __declspec(uuid("71e95595-8c74-44d9-88a9-f5112d5f5900")) -IHttpFileInfo; - -class __declspec(uuid("eb16a6ec-ba5d-436f-bf24-3ede13906450")) -IHttpSite; - -class __declspec(uuid("671e6d34-9380-4df4-b453-91129df02b24")) -ICustomNotificationProvider; - -class __declspec(uuid("6f3f657d-2fb8-43c6-a096-5064b41f0580")) -IHttpEventProvider; - -class CHttpModule; - -// -// IHttpContext extended interface versions (deprecated) -// -enum HTTP_CONTEXT_INTERFACE_VERSION -{ -}; - -// -// Context object representing the processing of an HTTP request -// -class __declspec(uuid("424c1b8c-a1ba-44d7-ac98-9f8f457701a5")) -IHttpContext -{ - public: - virtual - IHttpSite * - GetSite( - VOID - ) = 0; - - virtual - IHttpApplication * - GetApplication( - VOID - ) = 0; - - virtual - IHttpConnection * - GetConnection( - VOID - ) = 0; - - virtual - IHttpRequest * - GetRequest( - VOID - ) = 0; - - virtual - IHttpResponse * - GetResponse( - VOID - ) = 0; - - virtual - BOOL - GetResponseHeadersSent( - VOID - ) const = 0; - - virtual - IHttpUser * - GetUser( - VOID - ) const = 0; - - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; - - virtual - VOID - IndicateCompletion( - IN REQUEST_NOTIFICATION_STATUS notificationStatus - ) = 0; - - virtual - HRESULT - PostCompletion( - IN DWORD cbBytes - ) = 0; - - virtual - VOID - DisableNotifications( - IN DWORD dwNotifications, - IN DWORD dwPostNotifications - ) = 0; - - virtual - BOOL - GetNextNotification( - IN REQUEST_NOTIFICATION_STATUS status, - OUT DWORD * pdwNotification, - OUT BOOL * pfIsPostNotification, - OUT CHttpModule ** ppModuleInfo, - OUT IHttpEventProvider ** ppRequestOutput - ) = 0; - - virtual - BOOL - GetIsLastNotification( - IN REQUEST_NOTIFICATION_STATUS status - ) = 0; - - virtual - HRESULT - ExecuteRequest( - IN BOOL fAsync, - IN IHttpContext * pHttpContext, - IN DWORD dwExecuteFlags, - IN IHttpUser * pHttpUser, - OUT BOOL * pfCompletionExpected = NULL - ) = 0; - - virtual - DWORD - GetExecuteFlags( - VOID - ) const = 0; - - virtual - HRESULT - GetServerVariable( - PCSTR pszVariableName, - __deref_out_ecount(*pcchValueLength) PCWSTR * ppszValue, - __out DWORD * pcchValueLength - ) = 0; - - virtual - HRESULT - GetServerVariable( - PCSTR pszVariableName, - __deref_out_ecount(*pcchValueLength) PCSTR * ppszValue, - __out DWORD * pcchValueLength - ) = 0; - - virtual - HRESULT - SetServerVariable( - PCSTR pszVariableName, - PCWSTR pszVariableValue - ) = 0; - - virtual - VOID * - AllocateRequestMemory( - IN DWORD cbAllocation - ) = 0; - - virtual - IHttpUrlInfo * - GetUrlInfo( - VOID - ) = 0; - - virtual - IMetadataInfo * - GetMetadata( - VOID - ) = 0; - - virtual - PCWSTR - GetPhysicalPath( - OUT DWORD * pcchPhysicalPath = NULL - ) = 0; - - virtual - PCWSTR - GetScriptName( - OUT DWORD * pcchScriptName = NULL - ) const = 0; - - virtual - PCWSTR - GetScriptTranslated( - OUT DWORD * pcchScriptTranslated = NULL - ) = 0; - - virtual - IScriptMapInfo * - GetScriptMap( - VOID - ) const = 0; - - virtual - VOID - SetRequestHandled( - VOID - ) = 0; - - virtual - IHttpFileInfo * - GetFileInfo( - VOID - ) const = 0; - - virtual - HRESULT - MapPath( - PCWSTR pszUrl, - __out_bcount_opt(*pcbPhysicalPath) PWSTR pszPhysicalPath, - IN OUT DWORD * pcbPhysicalPath - ) = 0; - - virtual - HRESULT - NotifyCustomNotification( - ICustomNotificationProvider * pCustomOutput, - OUT BOOL * pfCompletionExpected - ) = 0; - - virtual - IHttpContext * - GetParentContext( - VOID - ) const = 0; - - virtual - IHttpContext * - GetRootContext( - VOID - ) const = 0; - - virtual - HRESULT - CloneContext( - IN DWORD dwCloneFlags, - OUT IHttpContext ** ppHttpContext - ) = 0; - - virtual - HRESULT - ReleaseClonedContext( - VOID - ) = 0; - - virtual - HRESULT - GetCurrentExecutionStats( - OUT DWORD * pdwNotification, - OUT DWORD * pdwNotificationStartTickCount = NULL, - OUT PCWSTR * ppszModule = NULL, - OUT DWORD * pdwModuleStartTickCount = NULL, - OUT DWORD * pdwAsyncNotification = NULL, - OUT DWORD * pdwAsyncNotificationStartTickCount = NULL - ) const = 0; - - virtual - IHttpTraceContext * - GetTraceContext( - VOID - ) const = 0; - - virtual - HRESULT - GetServerVarChanges( - IN DWORD dwOldChangeNumber, - OUT DWORD * pdwNewChangeNumber, - IN OUT DWORD * pdwVariableSnapshot, - IN OUT PCSTR ** ppVariableNameSnapshot, - IN OUT PCWSTR ** ppVariableValueSnapshot, - OUT DWORD * pdwDiffedVariables, - OUT DWORD ** ppDiffedVariableIndices - ) = 0; - - virtual - HRESULT - CancelIo( - VOID - ) = 0; - - virtual - HRESULT - MapHandler( - IN DWORD dwSiteId, - IN PCWSTR pszSiteName, - IN PCWSTR pszUrl, - IN PCSTR pszVerb, - OUT IScriptMapInfo ** ppScriptMap, - IN BOOL fIgnoreWildcardMappings = FALSE - ) = 0; - - __declspec(deprecated("This method is deprecated. Use the HttpGetExtendedInterface helper function instead.")) - virtual - HRESULT - GetExtendedInterface( - IN HTTP_CONTEXT_INTERFACE_VERSION version, - OUT PVOID * ppInterface - ) = 0; -}; - -class __declspec(uuid("9f9098d5-915c-4294-a52e-66532a232bc9")) -IHttpTraceContext -{ -public: - virtual - HRESULT - GetTraceConfiguration( - IN OUT HTTP_TRACE_CONFIGURATION * pHttpTraceConfiguration - ) = 0; - - virtual - HRESULT - SetTraceConfiguration( - IN HTTP_MODULE_ID moduleId, - IN HTTP_TRACE_CONFIGURATION * pHttpTraceConfiguration, - IN DWORD cHttpTraceConfiguration = 1 - ) = 0; - - virtual - HRESULT - RaiseTraceEvent( - IN HTTP_TRACE_EVENT * pTraceEvent - ) = 0; - - virtual - LPCGUID - GetTraceActivityId( - ) = 0; - - virtual - HRESULT - QuickTrace( - IN PCWSTR pszData1, - IN PCWSTR pszData2 = NULL, - IN HRESULT hrLastError = S_OK, - // - // 4 == TRACE_LEVEL_INFORMATION - // - IN UCHAR Level = 4 - ) = 0; -}; - -class __declspec(uuid("37776aff-852e-4eec-93a5-b85a285a95b8")) -IHttpCacheSpecificData; - -// -// Cache helpers -// -class __declspec(uuid("cdef2aad-20b3-4512-b1b1-094b3844aeb2")) -IHttpCacheKey -{ - public: - virtual - DWORD - GetHash( - VOID - ) const = 0; - - virtual - PCWSTR - GetCacheName( - VOID - ) const = 0; - - virtual - bool - GetIsEqual( - IHttpCacheKey * pCacheCompareKey - ) const = 0; - - virtual - bool - GetIsPrefix( - IHttpCacheKey * pCacheCompareKey - ) const = 0; - - virtual - VOID - Enum( - IHttpCacheSpecificData * - ) = 0; -}; - -class __declspec(uuid("37776aff-852e-4eec-93a5-b85a285a95b8")) -IHttpCacheSpecificData -{ - public: - virtual - IHttpCacheKey * - GetCacheKey( - VOID - ) const = 0; - - virtual - VOID - ReferenceCacheData( - VOID - ) = 0; - - virtual - VOID - DereferenceCacheData( - VOID - ) = 0; - - virtual - VOID - ResetTTL( - VOID - ) = 0; - - virtual - VOID - DecrementTTL( - OUT BOOL *pfTTLExpired - ) = 0; - - virtual - VOID - SetFlushed( - VOID - ) = 0; - - virtual - BOOL - GetFlushed( - VOID - ) const = 0; -}; - -// -// Site descriptor -// -class __declspec(uuid("eb16a6ec-ba5d-436f-bf24-3ede13906450")) -IHttpSite -{ - public: - virtual - DWORD - GetSiteId( - VOID - ) const = 0; - - virtual - PCWSTR - GetSiteName( - VOID - ) const = 0; - - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; - - virtual - IHttpPerfCounterInfo * - GetPerfCounterInfo( - VOID - ) = 0; -}; - -// -// File change monitor -// -// -class __declspec(uuid("985422da-b0cf-473b-ba9e-8148ceb3e240")) -IHttpFileMonitor -{ - public: - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; - - virtual - VOID - DereferenceFileMonitor( - VOID - ) = 0; -}; - -// -// File descriptor -// -// -class __declspec(uuid("71e95595-8c74-44d9-88a9-f5112d5f5900")) -IHttpFileInfo : public IHttpCacheSpecificData -{ - public: - virtual - DWORD - GetAttributes( - VOID - ) const = 0; - - virtual - VOID - GetSize( - OUT ULARGE_INTEGER * pliSize - ) const = 0; - - virtual - const BYTE * - GetFileBuffer( - VOID - ) const = 0; - - virtual - HANDLE - GetFileHandle( - VOID - ) const = 0; - - virtual - PCWSTR - GetFilePath( - VOID - ) const = 0; - - virtual - PCSTR - GetETag( - OUT USHORT * pcchETag = NULL - ) const = 0; - - virtual - VOID - GetLastModifiedTime( - OUT FILETIME * pFileTime - ) const = 0; - - virtual - PCSTR - GetLastModifiedString( - VOID - ) const = 0; - - virtual - BOOL - GetHttpCacheAllowed( - OUT DWORD * pSecondsToLive - ) const = 0; - - virtual - HRESULT - AccessCheck( - IN HANDLE hUserToken, - IN PSID pUserSid - ) = 0; - - virtual - HANDLE - GetVrToken( - VOID - ) const = 0; - - virtual - PCWSTR - GetVrPath( - VOID - ) const = 0; - - virtual - IHttpModuleContextContainer * - GetModuleContextContainer( - VOID - ) = 0; - - virtual - BOOL - CheckIfFileHasChanged( - IN HANDLE hUserToken - ) = 0; -}; - - -// -// Token-cache entry -// -class __declspec(uuid("fd86e6de-fb0e-47dd-820a-e0da12be46e9")) -IHttpTokenEntry : public IHttpCacheSpecificData -{ - public: - virtual - HANDLE - GetImpersonationToken( - VOID - ) = 0; - - virtual - HANDLE - GetPrimaryToken( - VOID - ) = 0; - - virtual - PSID - GetSid( - VOID - ) = 0; -}; - - -// -// IHttpServer extended interface versions -// -enum HTTP_SERVER_INTERFACE_VERSION -{ - HTTP_SERVER_INTERFACE_V2 -}; - - -// -// Global utility descriptor -// -class __declspec(uuid("eda2a40f-fb92-4d6d-b52b-c8c207380b4e")) -IHttpServer -{ - public: - virtual - BOOL - IsCommandLineLaunch( - VOID - ) const = 0; - - virtual - PCWSTR - GetAppPoolName( - VOID - ) const = 0; - - virtual - HRESULT - AssociateWithThreadPool( - IN HANDLE hHandle, - IN LPOVERLAPPED_COMPLETION_ROUTINE completionRoutine - ) = 0; - - virtual - VOID - IncrementThreadCount( - VOID - ) = 0; - - virtual - VOID - DecrementThreadCount( - VOID - ) = 0; - - virtual - VOID - ReportUnhealthy( - IN PCWSTR pszReasonString, - IN HRESULT hrReason - ) = 0; - - virtual - VOID - RecycleProcess( - PCWSTR pszReason - ) = 0; - - virtual - IAppHostAdminManager * - GetAdminManager( - VOID - ) const = 0; - - virtual - HRESULT - GetFileInfo( - IN PCWSTR pszPhysicalPath, - IN HANDLE hUserToken, - IN PSID pSid, - IN PCWSTR pszChangeNotificationPath, - IN HANDLE hChangeNotificationToken, - IN BOOL fCache, - OUT IHttpFileInfo ** ppFileInfo, - IN IHttpTraceContext * pHttpTraceContext = NULL - ) = 0; - - virtual - HRESULT - FlushKernelCache( - IN PCWSTR pszUrl - ) = 0; - - virtual - HRESULT - DoCacheOperation( - IN CACHE_OPERATION cacheOperation, - IN IHttpCacheKey * pCacheKey, - OUT IHttpCacheSpecificData ** ppCacheSpecificData, - IN IHttpTraceContext * pHttpTraceContext = NULL - ) = 0; - - virtual - GLOBAL_NOTIFICATION_STATUS - NotifyCustomNotification( - ICustomNotificationProvider * pCustomOutput - ) = 0; - - virtual - IHttpPerfCounterInfo * - GetPerfCounterInfo( - VOID - ) = 0; - - virtual - VOID - RecycleApplication( - PCWSTR pszAppConfigPath - ) = 0; - - virtual - VOID - NotifyConfigurationChange( - PCWSTR pszPath - ) = 0; - - virtual - VOID - NotifyFileChange( - PCWSTR pszFileName - ) = 0; - - virtual - IDispensedHttpModuleContextContainer * - DispenseContainer( - VOID - ) = 0; - - virtual - HRESULT - AddFragmentToCache( - IN HTTP_DATA_CHUNK * pDataChunk, - PCWSTR pszFragmentName - ) = 0; - - virtual - HRESULT - ReadFragmentFromCache( - PCWSTR pszFragmentName, - OUT BYTE * pvBuffer, - DWORD cbSize, - OUT DWORD * pcbCopied - ) = 0; - - virtual - HRESULT - RemoveFragmentFromCache( - PCWSTR pszFragmentName - ) = 0; - - virtual - HRESULT - GetWorkerProcessSettings( - OUT IWpfSettings ** ppWorkerProcessSettings - ) = 0; - - virtual - HRESULT - GetProtocolManagerCustomInterface( - IN PCWSTR pProtocolManagerDll, - IN PCWSTR pProtocolManagerDllInitFunction, - IN DWORD dwCustomInterfaceId, - OUT PVOID* ppCustomInterface - ) = 0; - - virtual - BOOL - SatisfiesPrecondition( - PCWSTR pszPrecondition, - BOOL * pfUnknownPrecondition = NULL - ) const = 0; - - virtual - IHttpTraceContext * - GetTraceContext( - VOID - ) const = 0; - - virtual - HRESULT - RegisterFileChangeMonitor( - PCWSTR pszPath, - HANDLE hToken, - IHttpFileMonitor ** ppFileMonitor - ) = 0; - - virtual - HRESULT - GetExtendedInterface( - IN HTTP_SERVER_INTERFACE_VERSION version, - OUT PVOID * ppInterface - ) = 0; -}; - -class __declspec(uuid("34af637e-afe8-4556-bcc1-767f8e0b4a4e")) -IHttpServer2 : public IHttpServer -{ - public: - - virtual - HRESULT - GetToken( - PCWSTR pszUserName, - PCWSTR pszPassword, - DWORD dwLogonMethod, - IHttpTokenEntry ** ppTokenEntry, - PCWSTR pszDefaultDomain = NULL, - PSOCKADDR pSockAddr = NULL, - IHttpTraceContext * pHttpTraceContext = NULL - ) = 0; - - virtual - PCWSTR - GetAppPoolConfigFile( - __out DWORD * pcchConfigFilePath = NULL - ) const = 0; - - virtual - HRESULT - GetExtendedInterface( - __in const GUID & Version1, - __in PVOID pInput, - __in const GUID & Version2, - __deref_out PVOID * ppOutput - ) = 0; -}; - -// -// Helper function to get extended HTTP interfaces. -// -// Template parameters (HttpType1 and HttpType2) -// can be deduced from the arguments to the function. -// -// Example: -// -// IHttpRequest * pHttpRequest = pHttpContext->GetRequest(); -// IHttpRequest2 * pHttpRequest2; -// HRESULT hr = HttpGetExtendedInterface(g_pHttpServer, pHttpRequest, &pHttpRequest2); -// if( SUCCEEDED(hr) ) -// { -// // Use pHttpRequest2. -// } -// -// Where pHttpContext is an IHttpContext pointer and -// g_pHttpServer is an IHttpServer pointer. -// - -template -HRESULT -HttpGetExtendedInterface( - __in IHttpServer * pHttpServer, - __in HttpType1 * pInput, - __deref_out HttpType2 ** ppOutput -) -{ - HRESULT hr; - IHttpServer2 * pHttpServer2; - hr = pHttpServer->GetExtendedInterface(HTTP_SERVER_INTERFACE_V2, - reinterpret_cast(&pHttpServer2) ); - if (SUCCEEDED(hr)) - { - hr = pHttpServer2->GetExtendedInterface(__uuidof(HttpType1), - pInput, - __uuidof(HttpType2), - reinterpret_cast(ppOutput) ); - } - return hr; -} - -// -// Notification specific output for notifications -// -class __declspec(uuid("6f3f657d-2fb8-43c6-a096-5064b41f0580")) -IHttpEventProvider -{ - public: - virtual - VOID - SetErrorStatus( - HRESULT hrError - ) = 0; -}; - -// -// Completion information for notifications -// -class __declspec(uuid("49dd20e3-d9c0-463c-8821-f3413b55cc00")) -IHttpCompletionInfo -{ - public: - virtual - DWORD - GetCompletionBytes( - VOID - ) const = 0; - - virtual - HRESULT - GetCompletionStatus( - VOID - ) const = 0; -}; - -// -// RQ_ and GL_ CUSTOM_NOTIFICATION outputs -// -class __declspec(uuid("671e6d34-9380-4df4-b453-91129df02b24")) -ICustomNotificationProvider : public IHttpEventProvider -{ - public: - virtual - PCWSTR - QueryNotificationType( - VOID - ) = 0; -}; - -// -// RQ_REQUEST_AUTHENTICATE descriptor -// -class __declspec(uuid("304d51d0-0307-45ed-83fd-dd3fc032fdfc")) -IAuthenticationProvider : public IHttpEventProvider -{ - public: - virtual - VOID - SetUser( - IN IHttpUser * pUser - ) = 0; -}; - -// -// RQ_MAP_REQUEST_HANDLER -// -class __declspec(uuid("fea3ce6b-e346-47e7-b2a6-ad265baeff2c")) -IMapHandlerProvider : public IHttpEventProvider -{ - public: - virtual - HRESULT - SetScriptName( - PCWSTR pszScriptName, - DWORD cchScriptName - ) = 0; - - virtual - VOID - SetScriptMap( - IN IScriptMapInfo * pScriptMap - ) = 0; - - virtual - VOID - SetFileInfo( - IN IHttpFileInfo * pFileInfo - ) = 0; -}; - -// -// RQ_MAP_PATH -// -class __declspec(uuid("8efdf557-a8f1-4bc9-b462-6df3b038a59a")) -IMapPathProvider : public IHttpEventProvider -{ - public: - virtual - PCWSTR - GetUrl( - ) const = 0; - - virtual - PCWSTR - GetPhysicalPath( - ) const = 0; - - virtual - HRESULT - SetPhysicalPath( - PCWSTR pszPhysicalPath, - DWORD cchPhysicalPath - ) = 0; -}; - -// -// RQ_SEND_RESPONSE -// -class __declspec(uuid("57f2e7bc-0bcf-4a9f-94a4-10e55c6e5b51")) -ISendResponseProvider : public IHttpEventProvider -{ - public: - virtual - BOOL - GetHeadersBeingSent( - VOID - ) const = 0; - - virtual - DWORD - GetFlags( - VOID - ) const = 0; - - virtual - VOID - SetFlags( - DWORD dwFlags - ) = 0; - - virtual - HTTP_LOG_DATA * - GetLogData( - VOID - ) const = 0; - - virtual - HRESULT - SetLogData( - IN HTTP_LOG_DATA *pLogData - ) = 0; - - virtual - BOOL - GetReadyToLogData( - VOID - ) const = 0; -}; - -// -// RQ_READ_ENTITY -// -class __declspec(uuid("fe6d905a-99b8-49fd-b389-cfc809562b81")) -IReadEntityProvider : public IHttpEventProvider -{ - public: - virtual - VOID - GetEntity( - OUT PVOID * ppBuffer, - OUT DWORD * pcbData, - OUT DWORD * pcbBuffer - ) = 0; - - virtual - VOID - SetEntity( - IN PVOID pBuffer, - DWORD cbData, - DWORD cbBuffer - ) = 0; -}; - -// -// GL_PRE_BEGIN_REQUEST provider -// -class __declspec(uuid("fb715d26-aff9-476a-8fc0-6b1acb3d1098")) -IPreBeginRequestProvider : public IHttpEventProvider -{ - public: - virtual - IHttpContext * - GetHttpContext( - VOID - ) = 0; -}; - -// -// GL_APPLICATION_START provider -// -class __declspec(uuid("1de2c71c-c126-4512-aed3-f4f885e14997")) -IHttpApplicationProvider : public IHttpEventProvider -{ - public: - virtual - IHttpApplication * - GetApplication( - VOID - ) = 0; -}; - -typedef IHttpApplicationProvider IHttpApplicationStartProvider; - -class __declspec(uuid("ba32d330-9ea8-4b9e-89f1-8c76a323277f")) -IHttpModuleFactory; - -// -// GL_APPLICATION_RESOLVE_MODULES provider -// -class __declspec(uuid("0617d9b9-e20f-4a9f-94f9-35403b3be01e")) -IHttpApplicationResolveModulesProvider : public IHttpApplicationProvider -{ - public: - virtual - HRESULT - RegisterModule( - IN HTTP_MODULE_ID parentModuleId, - IN IHttpModuleFactory * pModuleFactory, - IN PCWSTR pszModuleName, - IN PCWSTR pszModuleType, - IN PCWSTR pszModulePreCondition, - IN DWORD dwRequestNotifications, - IN DWORD dwPostRequestNotifications - ) = 0; - - virtual - HRESULT - SetPriorityForRequestNotification( - IN PCWSTR pszModuleName, - IN DWORD dwRequestNotification, - IN PCWSTR pszPriorityAlias - ) = 0; -}; - -// -// GL_APPLICATION_STOP provider -// -typedef IHttpApplicationProvider IHttpApplicationStopProvider; - -// -// GL_RSCA_QUERY provider -// -class __declspec(uuid("63fdc43f-934a-4ee5-bcd8-7e7b50b75605")) -IGlobalRSCAQueryProvider : public IHttpEventProvider -{ - public: - virtual - PCWSTR - GetFunctionName( - VOID - ) const = 0; - - virtual - PCWSTR - GetFunctionParameters( - VOID - ) const = 0; - - virtual - HRESULT - GetOutputBuffer( - DWORD cbBuffer, - OUT BYTE ** ppbBuffer - ) = 0; - - virtual - HRESULT - ResizeOutputBuffer( - DWORD cbNewBuffer, - DWORD cbBytesToCopy, - IN OUT BYTE ** ppbBuffer - ) = 0; - - virtual - VOID - SetResult( - DWORD cbData, - HRESULT hr - ) = 0; -}; - -// -// GL_STOP_LISTENING -// -class __declspec(uuid("41f9a601-e25d-4ac8-8a1f-635698a30ab9")) -IGlobalStopListeningProvider : public IHttpEventProvider -{ - public: - virtual - BOOL - DrainRequestsGracefully( - VOID - ) const = 0; -}; - -// -// GL_CACHE_OPERATION -// -class __declspec(uuid("58925fb9-7c5e-4684-833b-4a04e1286690")) -ICacheProvider : public IHttpEventProvider -{ - public: - virtual - CACHE_OPERATION - GetCacheOperation( - VOID - ) const = 0; - - virtual - IHttpCacheKey * - GetCacheKey( - VOID - ) const = 0; - - virtual - IHttpCacheSpecificData * - GetCacheRecord( - VOID - ) const = 0; - - virtual - VOID - SetCacheRecord( - IHttpCacheSpecificData * pCacheRecord - ) = 0; - - virtual - IHttpTraceContext * - GetTraceContext( - VOID - ) const = 0; -}; - -// -// GL_CONFIGURATION_CHANGE -// -class __declspec(uuid("3405f3b4-b3d6-4b73-b5f5-4d8a3cc642ce")) -IGlobalConfigurationChangeProvider : public IHttpEventProvider -{ - public: - virtual - PCWSTR - GetChangePath( - VOID - ) const = 0; -}; - -// -// GL_FILE_CHANGE -// -class __declspec(uuid("ece31ee5-0486-4fb0-a875-6739a2d7daf5")) -IGlobalFileChangeProvider : public IHttpEventProvider -{ -public: - virtual - PCWSTR - GetFileName( - VOID - ) const = 0; - - virtual - IHttpFileMonitor * - GetFileMonitor( - VOID - ) = 0; -}; - -// -// GL_TRACE_EVENT -// -class __declspec(uuid("7c6bb150-0310-4718-a01f-6faceb62dc1d")) -IGlobalTraceEventProvider : public IHttpEventProvider -{ - public: - virtual - HRESULT - GetTraceEvent( - OUT HTTP_TRACE_EVENT ** ppTraceEvent - ) = 0; - - virtual - BOOL - CheckSubscription( - IN HTTP_MODULE_ID ModuleId - ) = 0; - - virtual - HRESULT - GetCurrentHttpRequestContext( - OUT IHttpContext ** ppHttpContext - ) = 0; -}; - -// -// GL_THREAD_CLEANUP -// -class __declspec(uuid("6b36a149-8620-45a0-8197-00814a706e2e")) -IGlobalThreadCleanupProvider : public IHttpEventProvider -{ -public: - virtual - IHttpApplication * - GetApplication( - VOID - ) = 0; -}; - -// -// GL_APPLICATION_PRELOAD -// -class __declspec(uuid("2111f8d6-0c41-4ff7-bd45-5c04c7e91a73")) -IGlobalApplicationPreloadProvider : public IHttpEventProvider -{ -public: - virtual - HRESULT - CreateContext( - OUT IHttpContext ** ppHttpContext - ) = 0; - - virtual - HRESULT - ExecuteRequest( - IN IHttpContext * pHttpContext, - IN IHttpUser * pHttpUser - ) = 0; -}; - -class CHttpModule -{ -public: - // RQ_BEGIN_REQUEST - - virtual - REQUEST_NOTIFICATION_STATUS - OnBeginRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostBeginRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_AUTHENTICATE_REQUEST - - virtual - REQUEST_NOTIFICATION_STATUS - OnAuthenticateRequest( - IN IHttpContext * pHttpContext, - IN IAuthenticationProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostAuthenticateRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_AUTHORIZE_REQUEST - - virtual - REQUEST_NOTIFICATION_STATUS - OnAuthorizeRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostAuthorizeRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_RESOLVE_REQUEST_CACHE - - virtual - REQUEST_NOTIFICATION_STATUS - OnResolveRequestCache( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostResolveRequestCache( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_MAP_REQUEST_HANDLER - - virtual - REQUEST_NOTIFICATION_STATUS - OnMapRequestHandler( - IN IHttpContext * pHttpContext, - IN IMapHandlerProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostMapRequestHandler( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_ACQUIRE_REQUEST_STATE - - virtual - REQUEST_NOTIFICATION_STATUS - OnAcquireRequestState( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostAcquireRequestState( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_PRE_EXECUTE_REQUEST_HANDLER - - virtual - REQUEST_NOTIFICATION_STATUS - OnPreExecuteRequestHandler( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostPreExecuteRequestHandler( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_EXECUTE_REQUEST_HANDLER - - virtual - REQUEST_NOTIFICATION_STATUS - OnExecuteRequestHandler( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostExecuteRequestHandler( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_RELEASE_REQUEST_STATE - - virtual - REQUEST_NOTIFICATION_STATUS - OnReleaseRequestState( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostReleaseRequestState( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - // RQ_UPDATE_REQUEST_CACHE - - virtual - REQUEST_NOTIFICATION_STATUS - OnUpdateRequestCache( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostUpdateRequestCache( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_LOG_REQUEST - - virtual - REQUEST_NOTIFICATION_STATUS - OnLogRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostLogRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_END_REQUEST - - virtual - REQUEST_NOTIFICATION_STATUS - OnEndRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - virtual - REQUEST_NOTIFICATION_STATUS - OnPostEndRequest( - IN IHttpContext * pHttpContext, - IN IHttpEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_SEND_RESPONSE - - virtual - REQUEST_NOTIFICATION_STATUS - OnSendResponse( - IN IHttpContext * pHttpContext, - IN ISendResponseProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_MAP_PATH - - virtual - REQUEST_NOTIFICATION_STATUS - OnMapPath( - IN IHttpContext * pHttpContext, - IN IMapPathProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_READ_ENTITY - - virtual - REQUEST_NOTIFICATION_STATUS - OnReadEntity( - IN IHttpContext * pHttpContext, - IN IReadEntityProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // RQ_CUSTOM_NOTIFICATION - - virtual - REQUEST_NOTIFICATION_STATUS - OnCustomRequestNotification( - IN IHttpContext * pHttpContext, - IN ICustomNotificationProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - // Completion - - virtual - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - IN IHttpContext * pHttpContext, - IN DWORD dwNotification, - IN BOOL fPostNotification, - IN IHttpEventProvider * pProvider, - IN IHttpCompletionInfo * pCompletionInfo - ) - { - UNREFERENCED_PARAMETER( pHttpContext ); - UNREFERENCED_PARAMETER( dwNotification ); - UNREFERENCED_PARAMETER( fPostNotification ); - UNREFERENCED_PARAMETER( pProvider ); - UNREFERENCED_PARAMETER( pCompletionInfo ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CHttpModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return RQ_NOTIFICATION_CONTINUE; - } - - virtual - VOID - Dispose( - VOID - ) - { - delete this; - } - - protected: - - CHttpModule() - {} - - virtual - ~CHttpModule() - {} -}; - -class CGlobalModule -{ - public: - - // GL_STOP_LISTENING - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalStopListening( - IN IGlobalStopListeningProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_CACHE_CLEANUP - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalCacheCleanup( - VOID - ) - { - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_CACHE_OPERATION - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalCacheOperation( - IN ICacheProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_HEALTH_CHECK - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalHealthCheck( - VOID - ) - { - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_CONFIGURATION_CHANGE - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalConfigurationChange( - IN IGlobalConfigurationChangeProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_FILE_CHANGE - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalFileChange( - IN IGlobalFileChangeProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_PRE_BEGIN_REQUEST - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalPreBeginRequest( - IN IPreBeginRequestProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_APPLICATION_START - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalApplicationStart( - IN IHttpApplicationStartProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_APPLICATION_RESOLVE_MODULES - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalApplicationResolveModules( - IN IHttpApplicationResolveModulesProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_APPLICATION_STOP - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalApplicationStop( - IN IHttpApplicationStopProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_RSCA_QUERY - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalRSCAQuery( - IN IGlobalRSCAQueryProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_TRACE_EVENT - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalTraceEvent( - IN IGlobalTraceEventProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_CUSTOM_NOTIFICATION - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalCustomNotification( - IN ICustomNotificationProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - virtual - VOID - Terminate( - VOID - ) = 0; - - // GL_THREAD_CLEANUP - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalThreadCleanup( - IN IGlobalThreadCleanupProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - - // GL_APPLICATION_PRELOAD - - virtual - GLOBAL_NOTIFICATION_STATUS - OnGlobalApplicationPreload( - IN IGlobalApplicationPreloadProvider * pProvider - ) - { - UNREFERENCED_PARAMETER( pProvider ); - OutputDebugStringA( - "This module subscribed to event " - __FUNCTION__ - " but did not override the method in its CGlobalModule implementation." - " Please check the method signature to make sure it matches the corresponding method.\n"); - DebugBreak(); - - return GL_NOTIFICATION_CONTINUE; - } - -}; - -class __declspec(uuid("85c1679c-0b21-491c-afb5-c7b5c86464c4")) -IModuleAllocator -{ - public: - virtual - VOID * - AllocateMemory( - IN DWORD cbAllocation - ) = 0; -}; - -class __declspec(uuid("ba32d330-9ea8-4b9e-89f1-8c76a323277f")) -IHttpModuleFactory -{ - public: - virtual - HRESULT - GetHttpModule( - OUT CHttpModule ** ppModule, - IN IModuleAllocator * pAllocator - ) = 0; - - virtual - VOID - Terminate( - VOID - ) = 0; -}; - -// -// Register-module descriptor -// -class __declspec(uuid("07e5beb3-b798-459d-a98a-e6c485b2b3bc")) -IHttpModuleRegistrationInfo -{ - public: - virtual - PCWSTR - GetName( - VOID - ) const = 0; - - virtual - HTTP_MODULE_ID - GetId( - VOID - ) const = 0; - - virtual - HRESULT - SetRequestNotifications( - IN IHttpModuleFactory * pModuleFactory, - IN DWORD dwRequestNotifications, - IN DWORD dwPostRequestNotifications - ) = 0; - - virtual - HRESULT - SetGlobalNotifications( - IN CGlobalModule * pGlobalModule, - IN DWORD dwGlobalNotifications - ) = 0; - - virtual - HRESULT - SetPriorityForRequestNotification( - IN DWORD dwRequestNotification, - IN PCWSTR pszPriority - ) = 0; - - virtual - HRESULT - SetPriorityForGlobalNotification( - IN DWORD dwGlobalNotification, - IN PCWSTR pszPriority - ) = 0; -}; - - -// -// Register Module entry point -// - -typedef -HRESULT -(WINAPI * PFN_REGISTERMODULE)( - DWORD dwServerVersion, - IHttpModuleRegistrationInfo * pModuleInfo, - IHttpServer * pGlobalInfo -); - -#define MODULE_REGISTERMODULE "RegisterModule" - -#endif diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h deleted file mode 100644 index 4d0d5735bc30..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -template -class HYBRID_ARRAY -{ -public: - - HYBRID_ARRAY( - VOID - ) : m_pArray(m_InlineArray), - m_Capacity(ARRAYSIZE(m_InlineArray)) - { - } - - ~HYBRID_ARRAY() - { - if ( !QueryUsesInlineArray() ) - { - delete [] m_pArray; - m_pArray = NULL; - } - } - - SIZE_T - QueryCapacity( - VOID - ) const - { - // - // Number of elements available in the array. - // - return m_Capacity; - } - - TYPE * - QueryArray( - VOID - ) const - { - // - // Raw pointer to the current array. - // - return m_pArray; - } - - TYPE & - QueryItem( - __in const SIZE_T Index - ) - { - // - // Gets the array item giving the index. - // - return m_pArray[Index]; - } - - TYPE & - operator [] (const SIZE_T Index) - { - // - // Operator override for convenience. - // Please don't add other overloads like '++' '--' - // in order to keep it simple. - // - return m_pArray[Index]; - } - - const TYPE & - operator [] (const SIZE_T Index) const - { - return m_pArray[Index]; - } - - template - HRESULT - Copy( - __in TYPE const (&SourceArray)[SourceSize], - __in bool fHasTrivialAssign = false - ) - /*++ - - Routine Description: - - Copies a source array like: - - int source[] = { 1, 2, 3 }; - hr = hybridArray.Copy( source ); - - It will statically determinate the length of the source array. - - Arguments: - - SourceArray - The array to copy. - SourceSize - The number of array elements. - fHasTrivialAssign - True if safe to perform buffer copy. - - Return Value: - - HRESULT - - --*/ - { - return Copy( SourceArray, SourceSize, fHasTrivialAssign ); - } - - HRESULT - Copy( - __in_ecount(SourceSize) - const TYPE * pSourceArray, - __in const SIZE_T SourceSize, - __in bool fHasTrivialAssign = false - ) - /*++ - - Routine Description: - - Copies a source array. - - Arguments: - - pSourceArray - The array to copy. - SourceSize - The number of array elements. - fHasTrivialAssign - True if safe to perform buffer copy. - - Return Value: - - HRESULT - - --*/ - { - HRESULT hr; - - hr = EnsureCapacity( SourceSize, - FALSE, // fCopyPrevious - FALSE ); // fHasTrivialAssign - if ( FAILED( hr ) ) - { - return hr; - } - - if ( fHasTrivialAssign ) // Future Work: use std::tr1::has_trivial_assign - { - CopyMemory(m_pArray, pSourceArray, m_Capacity * sizeof(TYPE)); - } - else - { - for ( SIZE_T Index = 0; Index < SourceSize; ++Index ) - { - m_pArray[Index] = pSourceArray[Index]; - } - } - - return S_OK; - } - - HRESULT - EnsureCapacity( - __in const SIZE_T MinimumCapacity, - __in bool fCopyPrevious, - __in bool fHasTrivialAssign = false - ) - /*++ - - Routine Description: - - Copies a source array. - - Arguments: - - MinimumCapacity - The expected length of the array. - fCopyPrevious - Must be always explicit parameter. - True if copy previous array data. - fHasTrivialAssign - True if safe to perform buffer copy. - - Return Value: - - HRESULT - - --*/ - { - // - // Caller is responsible for calculating a length that won't cause - // too many reallocations in the future. - // - - if ( MinimumCapacity <= ARRAYSIZE(m_InlineArray) ) - { - return S_OK; - } - - TYPE * pNewArray; - - pNewArray = new TYPE[ MinimumCapacity ]; - if ( pNewArray == NULL ) - { - return E_OUTOFMEMORY; - } - - if ( fCopyPrevious ) - { - if ( fHasTrivialAssign ) - { - CopyMemory(pNewArray, m_pArray, m_Capacity * sizeof(TYPE)); - } - else - { - for ( SIZE_T Index = 0; Index < m_Capacity; ++Index ) - { - pNewArray[Index] = m_pArray[Index]; - } - } - } - - if ( QueryUsesInlineArray() ) - { - m_pArray = pNewArray; - } - else - { - delete [] m_pArray; - m_pArray = pNewArray; - } - - m_Capacity = MinimumCapacity; - - return S_OK; - } - -private: - - bool - QueryUsesInlineArray( - VOID - ) const - { - return m_pArray == m_InlineArray; - } - - TYPE m_InlineArray[SIZE]; - TYPE * m_pArray; - SIZE_T m_Capacity; -}; \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h deleted file mode 100644 index 04c1d1ab4626..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#ifndef _LIST_ENTRY_H -#define _LIST_ENTRY_H - -// -// Doubly-linked list manipulation routines. -// - - -#define InitializeListHead32(ListHead) (\ - (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead))) - - -FORCEINLINE -VOID -InitializeListHead( - IN PLIST_ENTRY ListHead - ) -{ - ListHead->Flink = ListHead->Blink = ListHead; -} - -FORCEINLINE -BOOLEAN -IsListEmpty( - IN const LIST_ENTRY * ListHead - ) -{ - return (BOOLEAN)(ListHead->Flink == ListHead); -} - -FORCEINLINE -BOOLEAN -RemoveEntryList( - IN PLIST_ENTRY Entry - ) -{ - PLIST_ENTRY Blink; - PLIST_ENTRY Flink; - - Flink = Entry->Flink; - Blink = Entry->Blink; - Blink->Flink = Flink; - Flink->Blink = Blink; - return (BOOLEAN)(Flink == Blink); -} - -FORCEINLINE -PLIST_ENTRY -RemoveHeadList( - IN PLIST_ENTRY ListHead - ) -{ - PLIST_ENTRY Flink; - PLIST_ENTRY Entry; - - Entry = ListHead->Flink; - Flink = Entry->Flink; - ListHead->Flink = Flink; - Flink->Blink = ListHead; - return Entry; -} - - - -FORCEINLINE -PLIST_ENTRY -RemoveTailList( - IN PLIST_ENTRY ListHead - ) -{ - PLIST_ENTRY Blink; - PLIST_ENTRY Entry; - - Entry = ListHead->Blink; - Blink = Entry->Blink; - ListHead->Blink = Blink; - Blink->Flink = ListHead; - return Entry; -} - - -FORCEINLINE -VOID -InsertTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY Entry - ) -{ - PLIST_ENTRY Blink; - - Blink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = Blink; - Blink->Flink = Entry; - ListHead->Blink = Entry; -} - - -FORCEINLINE -VOID -InsertHeadList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY Entry - ) -{ - PLIST_ENTRY Flink; - - Flink = ListHead->Flink; - Entry->Flink = Flink; - Entry->Blink = ListHead; - Flink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -AppendTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListToAppend - ) -{ - PLIST_ENTRY ListEnd = ListHead->Blink; - - ListHead->Blink->Flink = ListToAppend; - ListHead->Blink = ListToAppend->Blink; - ListToAppend->Blink->Flink = ListHead; - ListToAppend->Blink = ListEnd; -} - -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - PSINGLE_LIST_ENTRY ListHead - ) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - - return FirstEntry; -} - - -FORCEINLINE -VOID -PushEntryList( - PSINGLE_LIST_ENTRY ListHead, - PSINGLE_LIST_ENTRY Entry - ) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - - -#endif diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h deleted file mode 100644 index 56a67eb1c4f3..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _MACROS_H -#define _MACROS_H - -// -// The DIFF macro should be used around an expression involving pointer -// subtraction. The expression passed to DIFF is cast to a size_t type, -// allowing the result to be easily assigned to any 32-bit variable or -// passed to a function expecting a 32-bit argument. -// - -#define DIFF(x) ((size_t)(x)) - -// Change a hexadecimal digit to its numerical equivalent -#define TOHEX( ch ) \ - ((ch) > L'9' ? \ - (ch) >= L'a' ? \ - (ch) - L'a' + 10 : \ - (ch) - L'A' + 10 \ - : (ch) - L'0') - - -// Change a number to its Hexadecimal equivalent - -#define TODIGIT( nDigit ) \ - (CHAR)((nDigit) > 9 ? \ - (nDigit) - 10 + 'A' \ - : (nDigit) + '0') - - -inline int -SAFEIsSpace(UCHAR c) -{ - return isspace( c ); -} - -inline int -SAFEIsAlNum(UCHAR c) -{ - return isalnum( c ); -} - -inline int -SAFEIsAlpha(UCHAR c) -{ - return isalpha( c ); -} - -inline int -SAFEIsXDigit(UCHAR c) -{ - return isxdigit( c ); -} - -inline int -SAFEIsDigit(UCHAR c) -{ - return isdigit( c ); -} - -#endif // _MACROS_H diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx deleted file mode 100644 index dd891b32524f..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _MULTISZ_HXX_ -#define _MULTISZ_HXX_ - -# include - - -/*++ - class MULTISZ: - - Intention: - A light-weight multi-string class supporting encapsulated string class. - - This object is derived from BUFFER class. - It maintains following state: - - m_fValid - whether this object is valid - - used only by MULTISZ() init functions - * NYI: I need to kill this someday * - m_cchLen - string length cached when we update the string. - m_cStrings - number of strings. - - Member Functions: - There are two categories of functions: - 1) Safe Functions - which do integrity checking of state - 2) UnSafe Functions - which do not do integrity checking, but - enable writing to the data stream freely. - (someday this will be enabled as Safe versions without - problem for users) - ---*/ -class MULTISZ : public BUFFER -{ -public: - - MULTISZ() - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { Reset(); } - - // creates a stack version of the MULTISZ object - uses passed in stack buffer - // MULTISZ does not free this pbInit on its own. - MULTISZ( __in_bcount(cbInit) WCHAR * pbInit, DWORD cbInit) - : BUFFER( (BYTE *) pbInit, cbInit), - m_cchLen (0), - m_cStrings(0) - {} - - MULTISZ( const WCHAR * pchInit ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit(pchInit); } - - MULTISZ( const MULTISZ & str ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit( str.QueryStr()); } - -// BOOL IsValid(VOID) const { return ( BUFFER::IsValid()) ; } - // - // Checks and returns TRUE if this string has no valid data else FALSE - // - BOOL IsEmpty( VOID) const { return ( *QueryStr() == L'\0'); } - - BOOL Append( const WCHAR * pchInit ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - (DWORD) (::wcslen(pchInit)) * sizeof(WCHAR) - )) : - TRUE); - } - - - BOOL Append( const WCHAR * pchInit, DWORD cchLen ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - cchLen * sizeof(WCHAR))) : - TRUE); - } - - BOOL Append( STRU & str ) - { return AuxAppend( str.QueryStr(), - (str.QueryCCH()) * sizeof(WCHAR)); } - - // Resets the internal string to be NULL string. Buffer remains cached. - VOID Reset( VOID) - { DBG_ASSERT( QueryPtr() != NULL); - QueryStr()[0] = L'\0'; - QueryStr()[1] = L'\0'; - m_cchLen = 2; - m_cStrings = 0; - } - - BOOL Copy( const WCHAR * pchInit, IN DWORD cbLen ) { - if ( QueryPtr() ) { Reset(); } - return ( (pchInit != NULL) ? - AuxAppend( pchInit, cbLen, FALSE ): - TRUE); - } - - BOOL Copy( const MULTISZ & str ) - { return ( Copy(str.QueryStr(), str.QueryCB())); } - - // - // Returns the number of bytes in the string including the terminating - // NULLs - // - UINT QueryCB( VOID ) const - { return ( m_cchLen * sizeof(WCHAR)); } - - // - // Returns # of characters in the string including the terminating NULLs - // - UINT QueryCCH( VOID ) const { return (m_cchLen); } - - // - // Returns # of strings in the multisz. - // - - DWORD QueryStringCount( VOID ) const { return m_cStrings; } - - // - // Makes a copy of the stored string in given buffer - // - BOOL CopyToBuffer( __out_ecount_opt(*lpcch) WCHAR * lpszBuffer, LPDWORD lpcch) const; - - // - // Return the string buffer - // - WCHAR * QueryStrA( VOID ) const { return ( QueryStr()); } - WCHAR * QueryStr( VOID ) const { return ((WCHAR *) QueryPtr()); } - - // - // Makes a clone of the current string in the string pointer passed in. - // - BOOL - Clone( OUT MULTISZ * pstrClone) const - { - return ((pstrClone == NULL) ? - (SetLastError(ERROR_INVALID_PARAMETER), FALSE) : - (pstrClone->Copy( *this)) - ); - } // MULTISZ::Clone() - - // - // Recalculates the length of *this because we've modified the buffers - // directly - // - - VOID RecalcLen( VOID ) - { m_cchLen = MULTISZ::CalcLength( QueryStr(), &m_cStrings ); } - - // - // Calculate total character length of a MULTI_SZ, including the - // terminating NULLs. - // - - static DWORD CalcLength( const WCHAR * str, - LPDWORD pcStrings = NULL ); - - // - // Determine if the MULTISZ contains a specific string. - // - - BOOL FindString( const WCHAR * str ); - - BOOL FindString( STRU & str ) - { return FindString( str.QueryStr() ); } - - // - // Determine if the MULTISZ contains a specific string - case-insensitive - // - - BOOL FindStringNoCase( const WCHAR * str ); - - BOOL FindStringNoCase( STRU & str ) - { return FindStringNoCase( str.QueryStr() ); } - - // - // Used for scanning a multisz. - // - - const WCHAR * First( VOID ) const - { return *QueryStr() == L'\0' ? NULL : QueryStr(); } - - const WCHAR * Next( const WCHAR * Current ) const - { Current += ::wcslen( Current ) + 1; - return *Current == L'\0' ? NULL : Current; } - - BOOL - Equals( - MULTISZ* pmszRhs - ); - -private: - - DWORD m_cchLen; - DWORD m_cStrings; - VOID AuxInit( const WCHAR * pInit ); - BOOL AuxAppend( const WCHAR * pInit, - UINT cbStr, BOOL fAddSlop = TRUE ); - -}; - -// -// Quick macro for declaring a MULTISZ that will use stack memory of -// bytes. If the buffer overflows then a heap buffer will be allocated -// - -#define STACK_MULTISZ( name, size ) WCHAR __ach##name[size]; \ - MULTISZ name( __ach##name, sizeof( __ach##name )) - -HRESULT -SplitCommaDelimitedString( - PCWSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZ * pmszList -); - -#endif // !_MULTISZ_HXX_ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx deleted file mode 100644 index 44aa802563ab..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _MULTISZA_HXX_ -#define _MULTISZA_HXX_ - -# include - - -/*++ - class MULTISZ: - - Intention: - A light-weight multi-string class supporting encapsulated string class. - - This object is derived from BUFFER class. - It maintains following state: - - m_fValid - whether this object is valid - - used only by MULTISZ() init functions - * NYI: I need to kill this someday * - m_cchLen - string length cached when we update the string. - m_cStrings - number of strings. - - Member Functions: - There are two categories of functions: - 1) Safe Functions - which do integrity checking of state - 2) UnSafe Functions - which do not do integrity checking, but - enable writing to the data stream freely. - (someday this will be enabled as Safe versions without - problem for users) - ---*/ -class MULTISZA : public BUFFER -{ -public: - - MULTISZA() - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { Reset(); } - - // creates a stack version of the MULTISZA object - uses passed in stack buffer - // MULTISZA does not free this pbInit on its own. - MULTISZA( __in_bcount(cbInit) CHAR * pbInit, DWORD cbInit) - : BUFFER( (BYTE *) pbInit, cbInit), - m_cchLen (0), - m_cStrings(0) - {} - - MULTISZA( const CHAR * pchInit ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit(pchInit); } - - MULTISZA( const MULTISZA & str ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit( str.QueryStr()); } - -// BOOL IsValid(VOID) const { return ( BUFFER::IsValid()) ; } - // - // Checks and returns TRUE if this string has no valid data else FALSE - // - BOOL IsEmpty( VOID) const { return ( *QueryStr() == L'\0'); } - - BOOL Append( const CHAR * pchInit ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - (DWORD) (::strlen(pchInit)) * sizeof(CHAR) - )) : - TRUE); - } - - - BOOL Append( const CHAR * pchInit, DWORD cchLen ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - cchLen * sizeof(CHAR))) : - TRUE); - } - - BOOL Append( STRA & str ) - { return AuxAppend( str.QueryStr(), - (str.QueryCCH()) * sizeof(CHAR)); } - - // Resets the internal string to be NULL string. Buffer remains cached. - VOID Reset( VOID) - { DBG_ASSERT( QueryPtr() != NULL); - QueryStr()[0] = L'\0'; - QueryStr()[1] = L'\0'; - m_cchLen = 2; - m_cStrings = 0; - } - - BOOL Copy( const CHAR * pchInit, IN DWORD cbLen ) { - if ( QueryPtr() ) { Reset(); } - return ( (pchInit != NULL) ? - AuxAppend( pchInit, cbLen, FALSE ): - TRUE); - } - - BOOL Copy( const MULTISZA & str ) - { return ( Copy(str.QueryStr(), str.QueryCB())); } - - // - // Returns the number of bytes in the string including the terminating - // NULLs - // - UINT QueryCB( VOID ) const - { return ( m_cchLen * sizeof(CHAR)); } - - // - // Returns # of characters in the string including the terminating NULLs - // - UINT QueryCCH( VOID ) const { return (m_cchLen); } - - // - // Returns # of strings in the MULTISZA. - // - - DWORD QueryStringCount( VOID ) const { return m_cStrings; } - - // - // Makes a copy of the stored string in given buffer - // - BOOL CopyToBuffer( __out_ecount_opt(*lpcch) CHAR * lpszBuffer, LPDWORD lpcch) const; - - // - // Return the string buffer - // - CHAR * QueryStrA( VOID ) const { return ( QueryStr()); } - CHAR * QueryStr( VOID ) const { return ((CHAR *) QueryPtr()); } - - // - // Makes a clone of the current string in the string pointer passed in. - // - BOOL - Clone( OUT MULTISZA * pstrClone) const - { - return ((pstrClone == NULL) ? - (SetLastError(ERROR_INVALID_PARAMETER), FALSE) : - (pstrClone->Copy( *this)) - ); - } // MULTISZA::Clone() - - // - // Recalculates the length of *this because we've modified the buffers - // directly - // - - VOID RecalcLen( VOID ) - { m_cchLen = MULTISZA::CalcLength( QueryStr(), &m_cStrings ); } - - // - // Calculate total character length of a MULTI_SZ, including the - // terminating NULLs. - // - - static DWORD CalcLength( const CHAR * str, - LPDWORD pcStrings = NULL ); - - // - // Determine if the MULTISZA contains a specific string. - // - - BOOL FindString( const CHAR * str ); - - BOOL FindString( STRA & str ) - { return FindString( str.QueryStr() ); } - - // - // Determine if the MULTISZA contains a specific string - case-insensitive - // - - BOOL FindStringNoCase( const CHAR * str ); - - BOOL FindStringNoCase( STRA & str ) - { return FindStringNoCase( str.QueryStr() ); } - - // - // Used for scanning a MULTISZA. - // - - const CHAR * First( VOID ) const - { return *QueryStr() == L'\0' ? NULL : QueryStr(); } - - const CHAR * Next( const CHAR * Current ) const - { Current += ::strlen( Current ) + 1; - return *Current == L'\0' ? NULL : Current; } - - BOOL - Equals( - MULTISZA* pmszRhs - ); - -private: - - DWORD m_cchLen; - DWORD m_cStrings; - VOID AuxInit( const CHAR * pInit ); - BOOL AuxAppend( const CHAR * pInit, - UINT cbStr, BOOL fAddSlop = TRUE ); - -}; - -// -// Quick macro for declaring a MULTISZA that will use stack memory of -// bytes. If the buffer overflows then a heap buffer will be allocated -// - -#define STACK_MULTISZA( name, size ) CHAR __ach##name[size]; \ - MULTISZA name( __ach##name, sizeof( __ach##name )) - -HRESULT -SplitCommaDelimitedString( - PCSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZA * pmszList -); - -#endif // !_MULTISZA_HXX_ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h deleted file mode 100644 index 411c3660a401..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef __NORMALIZE_URL__H__ -#define __NORMALIZE_URL__H__ - -HRESULT -NormalizeUrl( - __inout LPSTR pszUrl -); - - -HRESULT -NormalizeUrlW( - __inout LPWSTR pszUrl -); - - - -HRESULT -UlCleanAndCopyUrl( - __in LPSTR pSource, - IN ULONG SourceLength, - OUT PULONG pBytesCopied, - __inout PWSTR pDestination, - __deref_opt_out_opt PWSTR * ppQueryString OPTIONAL -); - -HRESULT -UlInitializeParsing( - VOID -); - -HRESULT -InitializeNormalizeUrl( - VOID -); - - -#endif \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h deleted file mode 100644 index a971a8a7152b..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -template -class PER_CPU -{ -public: - - template - inline - static - HRESULT - Create( - FunctionInitializer Initializer, - __deref_out PER_CPU ** ppInstance - ); - - inline - T * - GetLocal( - VOID - ); - - template - inline - VOID - ForEach( - FunctionForEach Function - ); - - inline - VOID - Dispose( - VOID - ); - -private: - - PER_CPU( - VOID - ) - { - // - // Don't perform any operation during constructor. - // Constructor will never be called. - // - } - - ~PER_CPU( - VOID - ) - { - // - // Don't perform any operation during destructor. - // Constructor will never be called. - // - } - - template - HRESULT - Initialize( - FunctionInitializer Initializer, - DWORD NumberOfVariables, - DWORD Alignment - ); - - T * - GetObject( - DWORD Index - ); - - static - HRESULT - GetProcessorInformation( - __out DWORD * pCacheLineSize, - __out DWORD * pNumberOfProcessors - ); - - // - // Pointer to the beginning of the inlined array. - // - PVOID m_pVariables; - SIZE_T m_Alignment; - SIZE_T m_VariablesCount; -}; - -template -template -inline -// static -HRESULT -PER_CPU::Create( - FunctionInitializer Initializer, - __deref_out PER_CPU ** ppInstance -) -{ - HRESULT hr = S_OK; - DWORD CacheLineSize = 0; - DWORD ObjectCacheLineSize = 0; - DWORD NumberOfProcessors = 0; - PER_CPU * pInstance = NULL; - - hr = GetProcessorInformation(&CacheLineSize, - &NumberOfProcessors); - if (FAILED(hr)) - { - goto Finished; - } - - if (sizeof(T) > CacheLineSize) - { - // - // Round to the next multiple of the cache line size. - // - ObjectCacheLineSize = (sizeof(T) + CacheLineSize-1) & (CacheLineSize-1); - } - else - { - ObjectCacheLineSize = CacheLineSize; - } - - // - // Calculate the size of the PER_CPU object, including the array. - // The first cache line is for the member variables and the array - // starts in the next cache line. - // - SIZE_T Size = CacheLineSize + NumberOfProcessors * ObjectCacheLineSize; - - pInstance = (PER_CPU*) _aligned_malloc(Size, CacheLineSize); - if (pInstance == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - ZeroMemory(pInstance, Size); - - // - // The array start in the 2nd cache line. - // - pInstance->m_pVariables = reinterpret_cast(pInstance) + CacheLineSize; - - // - // Pass a disposer for disposing initialized items in case of failure. - // - hr = pInstance->Initialize(Initializer, - NumberOfProcessors, - ObjectCacheLineSize); - if (FAILED(hr)) - { - goto Finished; - } - - *ppInstance = pInstance; - pInstance = NULL; - -Finished: - - if (pInstance != NULL) - { - // - // Free the instance without disposing it. - // - pInstance->Dispose(); - pInstance = NULL; - } - - return hr; -} - -template -inline -T * -PER_CPU::GetLocal( - VOID -) -{ - // Use GetCurrentProcessorNumber (up to 64 logical processors) instead of - // GetCurrentProcessorNumberEx (more than 64 logical processors) because - // the number of processors are not densely packed per group. - // The idea of distributing variables per CPU is to have - // a scalability multiplier (could be NUMA node instead). - // - // Make sure the index don't go beyond the array size, if that happens, - // there won't be even distribution, but still better - // than one single variable. - // - return GetObject(GetCurrentProcessorNumber()); -} - -template -inline -T * -PER_CPU::GetObject( - DWORD Index -) -{ - return reinterpret_cast(static_cast(m_pVariables) + Index * m_Alignment); -} - -template -template -inline -VOID -PER_CPU::ForEach( - FunctionForEach Function -) -{ - for(DWORD Index = 0; Index < m_VariablesCount; ++Index) - { - T * pObject = GetObject(Index); - Function(pObject); - } -} - -template -VOID -PER_CPU::Dispose( - VOID -) -{ - _aligned_free(this); -} - -template -template -inline -HRESULT -PER_CPU::Initialize( - FunctionInitializer Initializer, - DWORD NumberOfVariables, - DWORD Alignment -) -/*++ - -Routine Description: - - Initialize each object using the initializer function. - If initialization for any object fails, it dispose the - objects that were successfully initialized. - -Arguments: - - Initializer - Function for initialize one object. - Signature: HRESULT Func(T*) - Dispose - Function for disposing initialized objects in case of failure. - Signature: void Func(T*) - NumberOfVariables - The length of the array of variables. - Alignment - Alignment to use for avoiding false sharing. - -Return: - - HRESULT - E_OUTOFMEMORY - ---*/ -{ - HRESULT hr = S_OK; - DWORD Index = 0; - - m_VariablesCount = NumberOfVariables; - m_Alignment = Alignment; - - for (; Index < m_VariablesCount; ++Index) - { - T * pObject = GetObject(Index); - Initializer(pObject); - } - - return hr; -} - -template -// static -HRESULT -PER_CPU::GetProcessorInformation( - __out DWORD * pCacheLineSize, - __out DWORD * pNumberOfProcessors -) -/*++ - -Routine Description: - - Gets the CPU cache-line size for the current system. - This information is used for avoiding CPU false sharing. - -Arguments: - - pCacheLineSize - The processor cache-line size. - pNumberOfProcessors - Maximum number of processors per group. - -Return: - - HRESULT - E_OUTOFMEMORY - ---*/ -{ - SYSTEM_INFO SystemInfo = { }; - - GetSystemInfo(&SystemInfo); - *pNumberOfProcessors = SystemInfo.dwNumberOfProcessors; - *pCacheLineSize = SYSTEM_CACHE_ALIGNMENT_SIZE; - - return S_OK; -} \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h deleted file mode 100644 index 77fcb75b8aaa..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#include -#include - -// -// Pre-calculated prime numbers (up to 10,049,369). -// -extern __declspec(selectany) const DWORD g_Primes [] = { - 3, 7, 11, 17, 23, 29, 37, 47, 59, 71, 89, 107, 131, 163, 197, 239, 293, 353, 431, 521, 631, - 761, 919, 1103, 1327, 1597, 1931, 2333, 2801, 3371, 4049, 4861, 5839, 7013, 8419, 10103, - 12143, 14591, 17519, 21023, 25229, 30293, 36353, 43627, 52361, 62851, 75431, 90523, 108631, - 130363, 156437, 187751, 225307, 270371, 324449, 389357, 467237, 560689, 672827, 807403, - 968897, 1162687, 1395263, 1674319, 2009191, 2411033, 2893249, 3471899, 4166287, 4999559, - 5999471, 7199369, 7849369, 8649369, 9249369, 10049369 -}; - -class PRIME -{ -public: - - static - DWORD - GetPrime( - DWORD dwMinimum - ) - { - // - // Try to use the precalculated numbers. - // - for ( DWORD Index = 0; Index < _countof( g_Primes ); Index++ ) - { - DWORD dwCandidate = g_Primes[Index]; - if ( dwCandidate >= dwMinimum ) - { - return dwCandidate; - } - } - - // - // Do calculation. - // - for ( DWORD dwCandidate = dwMinimum | 1; - dwCandidate < MAXDWORD; - dwCandidate += 2 ) - { - if ( IsPrime( dwCandidate ) ) - { - return dwCandidate; - } - } - return dwMinimum; - } - -private: - - static - BOOL - IsPrime( - DWORD dwCandidate - ) - { - if ((dwCandidate & 1) == 0) - { - return ( dwCandidate == 2 ); - } - - DWORD dwMax = static_cast(sqrt(static_cast(dwCandidate))); - - for ( DWORD Index = 3; Index <= dwMax; Index += 2 ) - { - if ( (dwCandidate % Index) == 0 ) - { - return FALSE; - } - } - return TRUE; - } - - PRIME() {} - ~PRIME() {} -}; \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h deleted file mode 100644 index ace85dcde271..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _REFTRACE_H_ -#define _REFTRACE_H_ - - -#if defined(__cplusplus) -extern "C" { -#endif // __cplusplus - - -#include - - -// -// This is the number of stack backtrace values captured in each -// trace log entry. This value is chosen to make the log entry -// exactly twelve dwords long, making it a bit easier to interpret -// from within the debugger without the debugger extension. -// - -#define REF_TRACE_LOG_STACK_DEPTH 9 - -// No-op value for the Context1,2,3 parameters of WriteRefTraceLogEx -//#define REF_TRACE_EMPTY_CONTEXT ((PVOID) -1) -#define REF_TRACE_EMPTY_CONTEXT NULL - - -// -// This defines the entry written to the trace log. -// - -typedef struct _REF_TRACE_LOG_ENTRY { - - LONG NewRefCount; - CONST VOID * Context; - CONST VOID * Context1; - CONST VOID * Context2; - CONST VOID * Context3; - DWORD Thread; - PVOID Stack[REF_TRACE_LOG_STACK_DEPTH]; - -} REF_TRACE_LOG_ENTRY, *PREF_TRACE_LOG_ENTRY; - - -// -// Manipulators. -// - -PTRACE_LOG -CreateRefTraceLog( - IN LONG LogSize, - IN LONG ExtraBytesInHeader - ); - -VOID -DestroyRefTraceLog( - IN PTRACE_LOG Log - ); - -LONG -__cdecl -WriteRefTraceLog( - IN PTRACE_LOG Log, - IN LONG NewRefCount, - IN CONST VOID * Context - ); - -LONG -__cdecl -WriteRefTraceLogEx( - IN PTRACE_LOG Log, - IN LONG NewRefCount, - IN CONST VOID * Context, - IN CONST VOID * Context1, - IN CONST VOID * Context2, - IN CONST VOID * Context3 - ); - - -#if defined(__cplusplus) -} // extern "C" -#endif // __cplusplus - - -#endif // _REFTRACE_H_ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h deleted file mode 100644 index 50b9b1ca1142..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#if (_WIN32_WINNT < 0x600) - -// -// XP implementation. -// -class CWSDRWLock -{ -public: - - CWSDRWLock() - : m_bInited(FALSE) - { - } - - ~CWSDRWLock() - { - if (m_bInited) - { - DeleteCriticalSection(&m_rwLock.critsec); - CloseHandle(m_rwLock.ReadersDoneEvent); - } - } - - BOOL QueryInited() const - { - return m_bInited; - } - - HRESULT Init() - { - HRESULT hr = S_OK; - - if (FALSE == m_bInited) - { - m_rwLock.fWriterWaiting = FALSE; - m_rwLock.LockCount = 0; - if ( !InitializeCriticalSectionAndSpinCount( &m_rwLock.critsec, 0 )) - { - DWORD dwError = GetLastError(); - hr = HRESULT_FROM_WIN32(dwError); - return hr; - } - - m_rwLock.ReadersDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if( NULL == m_rwLock.ReadersDoneEvent ) - { - DWORD dwError = GetLastError(); - hr = HRESULT_FROM_WIN32(dwError); - DeleteCriticalSection(&m_rwLock.critsec); - return hr; - } - m_bInited = TRUE; - } - - return hr; - } - - void SharedAcquire() - { - EnterCriticalSection(&m_rwLock.critsec); - InterlockedIncrement(&m_rwLock.LockCount); - LeaveCriticalSection(&m_rwLock.critsec); - } - - void SharedRelease() - { - ReleaseRWLock(); - } - - void ExclusiveAcquire() - { - EnterCriticalSection( &m_rwLock.critsec ); - - m_rwLock.fWriterWaiting = TRUE; - - // check if there are any readers active - if ( InterlockedExchangeAdd( &m_rwLock.LockCount, 0 ) > 0 ) - { - // - // Wait for all the readers to get done.. - // - WaitForSingleObject( m_rwLock.ReadersDoneEvent, INFINITE ); - } - m_rwLock.LockCount = -1; - } - - void ExclusiveRelease() - { - ReleaseRWLock(); - } - -private: - - BOOL m_bInited; - - typedef struct _RW_LOCK - { - BOOL fWriterWaiting; // Is a writer waiting on the lock? - LONG LockCount; - CRITICAL_SECTION critsec; - HANDLE ReadersDoneEvent; - } RW_LOCK, *PRW_LOCK; - - RW_LOCK m_rwLock; - -private: - - void ReleaseRWLock() - { - LONG Count = InterlockedDecrement( &m_rwLock.LockCount ); - - if ( 0 <= Count ) - { - // releasing a read lock - if (( m_rwLock.fWriterWaiting ) && ( 0 == Count )) - { - SetEvent( m_rwLock.ReadersDoneEvent ); - } - } - else - { - // Releasing a write lock - m_rwLock.LockCount = 0; - m_rwLock.fWriterWaiting = FALSE; - LeaveCriticalSection(&m_rwLock.critsec); - } - } -}; - -#else - -// -// Implementation for Windows Vista or greater. -// -class CWSDRWLock -{ -public: - - CWSDRWLock() - { - InitializeSRWLock(&m_rwLock); - } - - BOOL QueryInited() - { - return TRUE; - } - - - HRESULT Init() - { - // - // Method defined to keep compatibility with CWSDRWLock class for XP. - // - return S_OK; - } - - void SharedAcquire() - { - AcquireSRWLockShared(&m_rwLock); - } - - void SharedRelease() - { - ReleaseSRWLockShared(&m_rwLock); - } - - void ExclusiveAcquire() - { - AcquireSRWLockExclusive(&m_rwLock); - } - - void ExclusiveRelease() - { - ReleaseSRWLockExclusive(&m_rwLock); - } - -private: - - SRWLOCK m_rwLock; -}; - -#endif - -// -// Rename the lock class to a more clear name. -// -typedef CWSDRWLock READ_WRITE_LOCK; \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h deleted file mode 100644 index f2c798040599..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h +++ /dev/null @@ -1,730 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef __STATIC_HASH__H_ -#define __STATIC_HASH__H_ - -#define STATIC_STRING_HASH_BUCKETS 131 - -// -// SERVER_VARIABLE_HASH maps server variable string to routines to eval them -// - -struct STATIC_STRING_HASH_RECORD -{ - CHAR * _pszName; - STATIC_STRING_HASH_RECORD * _pNext; - USHORT _cchName; -}; - -struct STATIC_STRING_HASH_ITER -{ - STATIC_STRING_HASH_RECORD *_pCursor; - DWORD _dwBucket; - BOOL _fRemove; -}; - -class STATIC_STRING_HASH -{ - public: - - STATIC_STRING_HASH( - BOOL fCaseSensitive = FALSE - ) : _fCaseSensitive( fCaseSensitive ) - { - Reset(); - } - - VOID - Reset() - { - ZeroMemory( &_rgBuckets, sizeof( _rgBuckets ) ); - } - - static - PCSTR - ExtractKey( - __in const STATIC_STRING_HASH_RECORD * pRecord - ) - /*++ - - Routine Description: - - Get the key out of the record - - Arguments: - - record to fetch the key from - - Return Value: - - key - - --*/ - { - DBG_ASSERT( pRecord != NULL ); - return pRecord->_pszName; - } - - VOID - InsertRecord( - __in STATIC_STRING_HASH_RECORD * pRecord - ) - /*++ - - Routine Description: - - Insert record to hash table - - Note: remember this is static hash table - There is no synchronization on the table - Exclusive acess must be assured by caller - - Arguments: - - record to fetch the key from - - Return Value: - - VOID - - --*/ - { - DWORD dwIndex; - STATIC_STRING_HASH_RECORD* pCursor; - - DBG_ASSERT( pRecord != NULL ); - DBG_ASSERT( pRecord->_pszName != NULL ); - - if(NULL == pRecord->_pszName) - { - return; - } - - if (_fCaseSensitive) - { - dwIndex = HashString( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS; - } - else - { - dwIndex = HashStringNoCase( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS; - } - - pCursor = _rgBuckets[ dwIndex ]; - - pRecord->_pNext = pCursor; - _rgBuckets[ dwIndex ] = pRecord; - } - - STATIC_STRING_HASH_RECORD * - FindKey( - __in PCSTR pszName, - BOOL fRemove = FALSE - ) - /*++ - - Routine Description: - - Find key in the table (and remove it optionally) - - Arguments: - - key - - Return Value: - - record containing the key - - --*/ - { - DWORD dwIndex; - STATIC_STRING_HASH_RECORD* pRecord; - STATIC_STRING_HASH_RECORD* pLastRecord = NULL; - - DBG_ASSERT( pszName != NULL ); - - if (_fCaseSensitive) - { - dwIndex = HashString( pszName ) % STATIC_STRING_HASH_BUCKETS; - } - else - { - dwIndex = HashStringNoCase( pszName ) % STATIC_STRING_HASH_BUCKETS; - } - - pRecord = _rgBuckets[ dwIndex ]; - while ( pRecord != NULL ) - { - if (_fCaseSensitive) - { - if ( strcmp( pszName, pRecord->_pszName ) == 0 ) - { - break; - } - } - else if ( _stricmp( pszName, pRecord->_pszName ) == 0 ) - { - break; - } - - pLastRecord = pRecord; - pRecord = pRecord->_pNext; - } - - if (fRemove && - pRecord != NULL) - { - if (pLastRecord != NULL) - { - pLastRecord->_pNext = pRecord->_pNext; - } - else - { - _rgBuckets[dwIndex] = pRecord->_pNext; - } - } - - return pRecord; - } - - BOOL - CheckDistribution( - IN DWORD dwConflictThreshold, - IN BOOL fToDebugger - ) - /*++ - - Routine Description: - - Simple verification on conflicts within the table - - Arguments: - - dwConflictThreshold - max number of entries tolerated per bucket - fToDebbuger - spew the entries exceeding threshold into debugger - - Return Value: - - FALSE it threshold was reached (means hash funcion may not be optimal) - - --*/ - { - BOOL fThresholdReached = FALSE; - STATIC_STRING_HASH_RECORD* pRecord; - for ( DWORD dwIndex = 0; dwIndex < STATIC_STRING_HASH_BUCKETS; dwIndex++) - { - pRecord = _rgBuckets[ dwIndex ]; - DWORD countInBucket = 0; - while ( pRecord != NULL ) - { - countInBucket++; - pRecord = pRecord->_pNext; - } - // - // print out the list of multiple entries in bucket - // - if ( countInBucket > dwConflictThreshold && fToDebugger ) - { - fThresholdReached = TRUE; - - pRecord = _rgBuckets[ dwIndex ]; - while ( pRecord != NULL ) - { - pRecord = pRecord->_pNext; - } - } - } - return fThresholdReached; - } - - STATIC_STRING_HASH_RECORD * - FindFirst( - STATIC_STRING_HASH_ITER *pIterator, - BOOL fRemove = FALSE - ) - /*++ - - Routine Description: - - Begins a new hash item enumeration. - - Arguments: - - pIterator - Supplies the context for the enumeration. - - fRemove - Supplies TRUE if the items should be removed - from the hash as they are enumerated. - - Return Value: - - The first entry in the hash if successful, NULL otherwise. - - --*/ - { - pIterator->_dwBucket = 0; - pIterator->_fRemove = fRemove; - pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket); - - if (pIterator->_fRemove && pIterator->_pCursor != NULL) - { - _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext; - } - - return pIterator->_pCursor; - } - - STATIC_STRING_HASH_RECORD * - FindNext( - STATIC_STRING_HASH_ITER *pIterator - ) - /*++ - - Routine Description: - - Continues a hash item enumeration. - - Arguments: - - pIterator - Supplies the context for the enumeration. - - Return Value: - - The next entry in the hash if successful, NULL otherwise. - - --*/ - { - if (pIterator->_pCursor != NULL) - { - if (pIterator->_fRemove) - { - pIterator->_pCursor = _rgBuckets[pIterator->_dwBucket]; - } - else - { - pIterator->_pCursor = pIterator->_pCursor->_pNext; - } - - if (pIterator->_pCursor == NULL) - { - pIterator->_dwBucket++; - pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket); - } - } - - if (pIterator->_fRemove && pIterator->_pCursor != NULL) - { - _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext; - } - - return pIterator->_pCursor; - } - - protected: - - STATIC_STRING_HASH_RECORD * _rgBuckets[ STATIC_STRING_HASH_BUCKETS ]; - - private: - - BOOL _fCaseSensitive; - - STATIC_STRING_HASH_RECORD * - FindNextBucket( - DWORD *pdwStartingBucket - ) - /*++ - - Routine Description: - - Scan for the next non-empty bucket. - - Arguments: - - pdwStartingBucket - Supplies a pointer to the starting - bucket index. This value is updated with the index - of the next non-empty bucket if successful. - - Return Value: - - The first entry in the next non-empty bucket if successful, - NULL otherwise. - - --*/ - { - DWORD i; - STATIC_STRING_HASH_RECORD *pScan = NULL; - - for (i = *pdwStartingBucket ; i < STATIC_STRING_HASH_BUCKETS ; i++) - { - pScan = _rgBuckets[i]; - - if (pScan != NULL) - { - break; - } - } - - *pdwStartingBucket = i; - return pScan; - } -}; - - - - -struct STATIC_WSTRING_HASH_RECORD -{ - WCHAR * _pszName; - STATIC_WSTRING_HASH_RECORD * _pNext; - USHORT _cchName; -}; - - -struct STATIC_WSTRING_HASH_ITER -{ - STATIC_WSTRING_HASH_RECORD *_pCursor; - DWORD _dwBucket; - BOOL _fRemove; -}; - - -class STATIC_WSTRING_HASH -{ - public: - STATIC_WSTRING_HASH( - BOOL fCaseSensitive = FALSE - ) : _fCaseSensitive( fCaseSensitive ) - { - Reset(); - } - - VOID - Reset() - { - ZeroMemory( &_rgBuckets, sizeof( _rgBuckets ) ); - } - - static - PCWSTR - ExtractKey( - __in const STATIC_WSTRING_HASH_RECORD * pRecord - ) - /*++ - - Routine Description: - - Get the key out of the record - - Arguments: - - record to fetch the key from - - Return Value: - - key - - --*/ - { - DBG_ASSERT( pRecord != NULL ); - return pRecord->_pszName; - } - - VOID - InsertRecord( - __in STATIC_WSTRING_HASH_RECORD * pRecord - ) - /*++ - - Routine Description: - - Insert record to hash table - - Note: remember this is static hash table - There is no synchronization on the table - Exclusive acess must be assured by caller - - Arguments: - - record to fetch the key from - - Return Value: - - VOID - - --*/ - { - DWORD dwIndex; - STATIC_WSTRING_HASH_RECORD* pCursor; - - DBG_ASSERT( pRecord != NULL ); - DBG_ASSERT( pRecord->_pszName != NULL ); - - if (_fCaseSensitive) - { - dwIndex = HashString( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS; - } - else - { - dwIndex = HashStringNoCase( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS; - } - - pCursor = _rgBuckets[ dwIndex ]; - - pRecord->_pNext = pCursor; - _rgBuckets[ dwIndex ] = pRecord; - } - - STATIC_WSTRING_HASH_RECORD * - FindKey( - __in PCWSTR pszName, - BOOL fRemove = FALSE - ) - /*++ - - Routine Description: - - Find key in the table (and remove it optionally) - - Arguments: - - key - - Return Value: - - record containing the key - - --*/ - { - DWORD dwIndex; - STATIC_WSTRING_HASH_RECORD* pRecord; - STATIC_WSTRING_HASH_RECORD* pLastRecord = NULL; - - DBG_ASSERT( pszName != NULL ); - - if (_fCaseSensitive) - { - dwIndex = HashString( pszName ) % STATIC_STRING_HASH_BUCKETS; - } - else - { - dwIndex = HashStringNoCase( pszName ) % STATIC_STRING_HASH_BUCKETS; - } - - pRecord = _rgBuckets[ dwIndex ]; - while ( pRecord != NULL ) - { - if ( _fCaseSensitive ) - { - if ( wcscmp( pszName, pRecord->_pszName ) == 0 ) - { - break; - } - } - else if ( _wcsicmp( pszName, pRecord->_pszName ) == 0 ) - { - break; - } - - pLastRecord = pRecord; - pRecord = pRecord->_pNext; - } - - if (fRemove && - pRecord != NULL) - { - if (pLastRecord != NULL) - { - pLastRecord->_pNext = pRecord->_pNext; - } - else - { - _rgBuckets[dwIndex] = pRecord->_pNext; - } - } - - return pRecord; - } - - BOOL - CheckDistribution( - IN DWORD dwConflictThreshold, - IN BOOL fToDebugger - ) - /*++ - - Routine Description: - - Simple verification on conflicts within the table - - Arguments: - - dwConflictThreshold - max number of entries tolerated per bucket - fToDebbuger - spew the entries exceeding threshold into debugger - - Return Value: - - FALSE it threshold was reached (means hash funcion may not be optimal) - - --*/ - { - BOOL fThresholdReached = FALSE; - STATIC_WSTRING_HASH_RECORD* pRecord; - for ( DWORD dwIndex = 0; dwIndex < STATIC_STRING_HASH_BUCKETS; dwIndex++) - { - pRecord = _rgBuckets[ dwIndex ]; - DWORD countInBucket = 0; - while ( pRecord != NULL ) - { - countInBucket++; - pRecord = pRecord->_pNext; - } - // - // print out the list of multiple entries in bucket - // - if ( countInBucket > dwConflictThreshold && fToDebugger ) - { - fThresholdReached = TRUE; - - pRecord = _rgBuckets[ dwIndex ]; - while ( pRecord != NULL ) - { - pRecord = pRecord->_pNext; - } - } - } - return fThresholdReached; - } - - STATIC_WSTRING_HASH_RECORD * - FindFirst( - STATIC_WSTRING_HASH_ITER *pIterator, - BOOL fRemove = FALSE - ) - /*++ - - Routine Description: - - Begins a new hash item enumeration. - - Arguments: - - pIterator - Supplies the context for the enumeration. - - fRemove - Supplies TRUE if the items should be removed - from the hash as they are enumerated. - - Return Value: - - The first entry in the hash if successful, NULL otherwise. - - --*/ - { - pIterator->_dwBucket = 0; - pIterator->_fRemove = fRemove; - pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket); - - if (pIterator->_fRemove && pIterator->_pCursor != NULL) - { - _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext; - } - - return pIterator->_pCursor; - } - - STATIC_WSTRING_HASH_RECORD * - FindNext( - STATIC_WSTRING_HASH_ITER *pIterator - ) - /*++ - - Routine Description: - - Continues a hash item enumeration. - - Arguments: - - pIterator - Supplies the context for the enumeration. - - Return Value: - - The next entry in the hash if successful, NULL otherwise. - - --*/ - { - if (pIterator->_pCursor != NULL) - { - if (pIterator->_fRemove) - { - pIterator->_pCursor = _rgBuckets[pIterator->_dwBucket]; - } - else - { - pIterator->_pCursor = pIterator->_pCursor->_pNext; - } - - if (pIterator->_pCursor == NULL) - { - pIterator->_dwBucket++; - pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket); - } - } - - if (pIterator->_fRemove && pIterator->_pCursor != NULL) - { - _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext; - } - - return pIterator->_pCursor; - } - - protected: - - STATIC_WSTRING_HASH_RECORD * _rgBuckets[ STATIC_STRING_HASH_BUCKETS ]; - - private: - - BOOL _fCaseSensitive; - - STATIC_WSTRING_HASH_RECORD * - FindNextBucket( - DWORD *pdwStartingBucket - ) - /*++ - - Routine Description: - - Scan for the next non-empty bucket. - - Arguments: - - pdwStartingBucket - Supplies a pointer to the starting - bucket index. This value is updated with the index - of the next non-empty bucket if successful. - - Return Value: - - The first entry in the next non-empty bucket if successful, - NULL otherwise. - - --*/ - { - DWORD i; - STATIC_WSTRING_HASH_RECORD *pScan = NULL; - - for (i = *pdwStartingBucket ; i < STATIC_STRING_HASH_BUCKETS ; i++) - { - pScan = _rgBuckets[i]; - - if (pScan != NULL) - { - break; - } - } - - *pdwStartingBucket = i; - return pScan; - } -}; - - -#endif //__STATIC_HASH__H_ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h deleted file mode 100644 index 53a631b03697..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -// -// Use C++ standard 'nullptr' -// - -#ifdef NULL -#undef NULL -#endif - -#ifdef __cplusplus -#ifdef _NATIVE_NULLPTR_SUPPORTED -#define NULL nullptr -#else -#define NULL 0 -#define nullptr 0 -#endif -#else -#define NULL ((void *)0) -//#define nullptr ((void *)0) -#endif diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h deleted file mode 100644 index d38604014e25..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#include "buffer.h" -#include "macros.h" -#include - -class STRA -{ - -public: - - STRA( - VOID - ); - - STRA( - __inout_ecount(cchInit) CHAR* pbInit, - __in DWORD cchInit - ); - - BOOL - IsEmpty( - VOID - ) const; - - BOOL - Equals( - __in PCSTR pszRhs, - __in BOOL fIgnoreCase = FALSE - ) const; - - BOOL - Equals( - __in const STRA * pstrRhs, - __in BOOL fIgnoreCase = FALSE - ) const; - - BOOL - Equals( - __in const STRA & strRhs, - __in BOOL fIgnoreCase = FALSE - ) const; - - static - BOOL - Equals( - __in PCSTR pszLhs, - __in PCSTR pszRhs, - __in bool fIgnoreCase = false - ) - { - // Return FALSE if either or both strings are NULL. - if (!pszLhs || !pszRhs) return FALSE; - - if( fIgnoreCase ) - { - return ( 0 == _stricmp( pszLhs, pszRhs ) ); - } - - return ( 0 == strcmp( pszLhs, pszRhs ) ); - } - - VOID - Trim(); - - BOOL - StartsWith( - __in const STRA * pStraPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - StartsWith( - __in const STRA & straPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - StartsWith( - __in PCSTR pszPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in const STRA * pStraSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in const STRA & straSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in PCSTR pszSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - INT - IndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex = 0 - ) const; - - INT - IndexOf( - __in PCSTR pszValue, - __in DWORD dwStartIndex = 0 - ) const; - - INT - LastIndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex = 0 - ) const; - - DWORD - QueryCB( - VOID - ) const; - - DWORD - QueryCCH( - VOID - ) const; - - DWORD - QuerySizeCCH( - VOID - ) const; - - DWORD - QuerySize( - VOID - ) const; - - __nullterminated - __bcount(this->m_cchLen) - CHAR * - QueryStr( - VOID - ) const; - - VOID - Reset( - VOID - ); - - HRESULT - Resize( - __in DWORD cchSize - ); - - HRESULT - SyncWithBuffer( - VOID - ); - - HRESULT - Copy( - __in PCSTR pszCopy - ); - - HRESULT - Copy( - __in_ecount(cbLen) - PCSTR pszCopy, - __in SIZE_T cbLen - ); - - HRESULT - Copy( - __in const STRA * pstrRhs - ); - - HRESULT - Copy( - __in const STRA & strRhs - ); - - HRESULT - CopyW( - __in PCWSTR pszCopyW - ); - - HRESULT - CopyW( - __in_ecount(cchLen) - PCWSTR pszCopyW, - __in SIZE_T cchLen, - __in UINT CodePage = CP_UTF8, - __in BOOL fFailIfNoTranslation = FALSE - ) - { - _ASSERTE( cchLen <= MAXDWORD ); - - return AuxAppendW( - pszCopyW, - static_cast(cchLen), - 0, - CodePage, - fFailIfNoTranslation - ); - } - - HRESULT - CopyWTruncate( - __in PCWSTR pszCopyWTruncate - ); - - HRESULT - CopyWTruncate( - __in_ecount(cchLen) - PCWSTR pszCopyWTruncate, - __in SIZE_T cchLen - ); - - HRESULT - Append( - __in PCSTR pszAppend - ); - - HRESULT - Append( - __in_ecount(cbLen) - PCSTR pszAppend, - __in SIZE_T cbLen - ); - - HRESULT - Append( - __in const STRA * pstrRhs - ); - - HRESULT - Append( - __in const STRA & strRhs - ); - - HRESULT - AppendW( - __in PCWSTR pszAppendW - ) - { - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszAppendW, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return AppendW( pszAppendW, cchLen ); - } - - HRESULT - AppendW( - __in_ecount(cchLen) - PCWSTR pszAppendW, - __in SIZE_T cchLen, - __in UINT CodePage = CP_UTF8, - __in BOOL fFailIfNoTranslation = FALSE - ) - { - _ASSERTE( cchLen <= MAXDWORD ); - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppendW( - pszAppendW, - static_cast(cchLen), - QueryCB(), - CodePage, - fFailIfNoTranslation - ); - } - - HRESULT - AppendWTruncate( - __in PCWSTR pszAppendWTruncate - ); - - HRESULT - AppendWTruncate( - __in_ecount(cchLen) - PCWSTR pszAppendWTruncate, - __in SIZE_T cchLen - ); - - HRESULT - CopyToBuffer( - __out_bcount(*pcb) CHAR* pszBuffer, - __inout DWORD * pcb - ) const; - - HRESULT - SetLen( - __in DWORD cchLen - ); - - HRESULT - SafeSnprintf( - __in __format_string - PCSTR pszFormatString, - ... - ); - - HRESULT - SafeVsnprintf( - __in __format_string - PCSTR pszFormatString, - va_list argsList - ); - - HRESULT - Escape( - VOID - ); - - HRESULT - EscapeUtf8( - VOID - ); - - VOID - Unescape( - VOID - ); - - HRESULT - CopyWToUTF8Unescaped( - __in LPCWSTR cpchStr - ); - - HRESULT - CopyWToUTF8Unescaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch - ); - - HRESULT - CopyWToUTF8Escaped( - __in LPCWSTR cpchStr - ); - - HRESULT - CopyWToUTF8Escaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch - ); - -private: - - // - // Avoid C++ errors. This object should never go through a copy - // constructor, unintended cast or assignment. - // - STRA( const STRA &); - STRA & operator = (const STRA &); - - HRESULT - AuxAppend( - __in_ecount(cbLen) - LPCSTR pStr, - __in DWORD cbLen, - __in DWORD cbOffset - ); - - HRESULT - AuxAppendW( - __in_ecount(cchAppendW) - PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset, - __in UINT CodePage, - __in BOOL fFailIfNoTranslation - ) - { - DWORD dwFlags = 0; - - if( CP_ACP == CodePage ) - { - dwFlags = WC_NO_BEST_FIT_CHARS; - } - else if( fFailIfNoTranslation && CodePage == CP_UTF8 ) - { - // - // WC_ERR_INVALID_CHARS is only supported in Longhorn or greater. - // -#if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - dwFlags |= WC_ERR_INVALID_CHARS; -#else - UNREFERENCED_PARAMETER(fFailIfNoTranslation); -#endif - } - - return AuxAppendW( pszAppendW, - cchAppendW, - cbOffset, - CodePage, - fFailIfNoTranslation, - dwFlags ); - } - - HRESULT - AuxAppendW( - __in_ecount(cchAppendW) - PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset, - __in UINT CodePage, - __in BOOL fFailIfNoTranslation, - __in DWORD dwFlags - ); - - HRESULT - AuxAppendWTruncate( - __in_ecount(cchAppendW) - __in PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset - ); - - static - int - ConvertUnicodeToCodePage( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __inout BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen, - __in UINT uCodePage - ); - - static - HRESULT - ConvertUnicodeToMultiByte( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen - ); - - static - HRESULT - ConvertUnicodeToUTF8( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen - ); - - typedef bool (* PFN_F_SHOULD_ESCAPE)(BYTE ch); - - HRESULT - EscapeInternal( - PFN_F_SHOULD_ESCAPE pfnFShouldEscape - ); - - // - // Buffer with an inline buffer of 1, - // enough to hold null-terminating character. - // - BUFFER_T m_Buff; - DWORD m_cchLen; -}; - -inline -HRESULT -AppendToString( - ULONGLONG Number, - STRA & String -) -{ - // prefast complains Append requires input - // to be null terminated, so zero initialize - // and pass the size of the buffer minus one - // to _ui64toa_s - CHAR chNumber[32] = {0}; - if (_ui64toa_s(Number, - chNumber, - sizeof(chNumber) - sizeof(CHAR), - 10) != 0) - { - return E_INVALIDARG; - } - return String.Append(chNumber); -} - -template -CHAR* InitHelper(__out CHAR (&psz)[size]) -{ - psz[0] = '\0'; - return psz; -} - -// -// Heap operation reduction macros -// -#define STACK_STRA(name, size) CHAR __ach##name[size];\ - STRA name(InitHelper(__ach##name), sizeof(__ach##name)) - -#define INLINE_STRA(name, size) CHAR __ach##name[size];\ - STRA name; - -#define INLINE_STRA_INIT(name) name(InitHelper(__ach##name), sizeof(__ach##name)) diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h deleted file mode 100644 index b0fba23559d6..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _STTIMER_H -#define _STTIMER_H - -class STTIMER -{ -public: - - STTIMER() - : _pTimer( NULL ) - { - fInCanel = FALSE; - } - - virtual - ~STTIMER() - { - if ( _pTimer ) - { - CancelTimer(); - - CloseThreadpoolTimer( _pTimer ); - - _pTimer = NULL; - } - } - - HRESULT - InitializeTimer( - PTP_TIMER_CALLBACK pfnCallback, - VOID * pContext, - DWORD dwInitialWait = 0, - DWORD dwPeriod = 0 - ) - { - _pTimer = CreateThreadpoolTimer( pfnCallback, - pContext, - NULL ); - - if ( !_pTimer ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - if ( dwInitialWait ) - { - SetTimer( dwInitialWait, - dwPeriod ); - } - - return S_OK; - } - - VOID - SetTimer( - DWORD dwInitialWait, - DWORD dwPeriod = 0 - ) - { - FILETIME ftInitialWait; - - if ( dwInitialWait == 0 && dwPeriod == 0 ) - { - // - // Special case. We are preventing new callbacks - // from being queued. Any existing callbacks in the - // queue will still run. - // - // This effectively disables the timer. It can be - // re-enabled by setting non-zero initial wait or - // period values. - // - if (_pTimer != NULL) - { - SetThreadpoolTimer(_pTimer, NULL, 0, 0); - } - - return; - } - - InitializeRelativeFileTime( &ftInitialWait, dwInitialWait ); - - SetThreadpoolTimer( _pTimer, - &ftInitialWait, - dwPeriod, - 0 ); - } - - VOID - CancelTimer() - { - // - // Disable the timer - // - if (fInCanel) - return; - - fInCanel = TRUE; - SetTimer( 0 ); - - // - // Wait until any callbacks queued prior to disabling - // have completed. - // - if (_pTimer != NULL) - WaitForThreadpoolTimerCallbacks( _pTimer, TRUE ); - - _pTimer = NULL; - fInCanel = FALSE; - } - -private: - - VOID - InitializeRelativeFileTime( - FILETIME * pft, - DWORD dwMilliseconds - ) - { - LARGE_INTEGER li; - - // - // The pftDueTime parameter expects the time to be - // expressed as the number of 100 nanosecond intervals - // times -1. - // - // To convert from milliseconds, we'll multiply by - // -10000 - // - - li.QuadPart = (LONGLONG)dwMilliseconds * -10000; - - pft->dwHighDateTime = li.HighPart; - pft->dwLowDateTime = li.LowPart; - }; - - TP_TIMER * _pTimer; - BOOL fInCanel; -}; - -class STELAPSED -{ -public: - - STELAPSED() - : _dwInitTime( 0 ), - _dwInitTickCount( 0 ), - _dwPerfCountsPerMillisecond( 0 ), - _fUsingHighResolution( FALSE ) - { - LARGE_INTEGER li; - BOOL fResult; - - _dwInitTickCount = GetTickCount64(); - - fResult = QueryPerformanceFrequency( &li ); - - if ( !fResult ) - { - goto Finished; - } - - _dwPerfCountsPerMillisecond = li.QuadPart / 1000; - - fResult = QueryPerformanceCounter( &li ); - - if ( !fResult ) - { - goto Finished; - } - - _dwInitTime = li.QuadPart / _dwPerfCountsPerMillisecond; - - _fUsingHighResolution = TRUE; - -Finished: - - return; - } - - virtual - ~STELAPSED() - { - } - - LONGLONG - QueryElapsedTime() - { - LARGE_INTEGER li; - - if ( _fUsingHighResolution && QueryPerformanceCounter( &li ) ) - { - DWORD64 dwCurrentTime = li.QuadPart / _dwPerfCountsPerMillisecond; - - if ( dwCurrentTime < _dwInitTime ) - { - // - // It's theoretically possible that QueryPerformanceCounter - // may return slightly different values on different CPUs. - // In this case, we don't want to return an unexpected value - // so we'll return zero. This is acceptable because - // presumably such a case would only happen for a very short - // time window. - // - // It would be possible to prevent this by ensuring processor - // affinity for all calls to QueryPerformanceCounter, but that - // would be undesirable in the general case because it could - // introduce unnecessary context switches and potentially a - // CPU bottleneck. - // - // Note that this issue also applies to callers doing rapid - // calls to this function. If a caller wants to mitigate - // that, they could enforce the affinitization, or they - // could implement a similar sanity check when comparing - // returned values from this function. - // - - return 0; - } - - return dwCurrentTime - _dwInitTime; - } - - return GetTickCount64() - _dwInitTickCount; - } - - BOOL - QueryUsingHighResolution() - { - return _fUsingHighResolution; - } - -private: - - DWORD64 _dwInitTime; - DWORD64 _dwInitTickCount; - DWORD64 _dwPerfCountsPerMillisecond; - BOOL _fUsingHighResolution; -}; - -#endif // _STTIMER_H \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h deleted file mode 100644 index 1caff82ce37c..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#ifndef _TRACELOG_H_ -#define _TRACELOG_H_ - - -#if defined(__cplusplus) -extern "C" { -#endif // __cplusplus - - -typedef struct _TRACE_LOG { - - // - // Signature. - // - - LONG Signature; - - // - // The total number of entries available in the log. - // - - LONG LogSize; - - // - // The index of the next entry to use. - // - - LONG NextEntry; - - // - // The byte size of each entry. - // - - LONG EntrySize; - - // - // Pointer to the start of the circular buffer. - // - - PUCHAR LogBuffer; - - // - // The extra header bytes and actual log entries go here. - // - // BYTE ExtraHeaderBytes[ExtraBytesInHeader]; - // BYTE Entries[LogSize][EntrySize]; - // - -} TRACE_LOG, *PTRACE_LOG; - - -// -// Log header signature. -// - -#define TRACE_LOG_SIGNATURE ((DWORD)'gOlT') -#define TRACE_LOG_SIGNATURE_X ((DWORD)'golX') - - -// -// This macro maps a TRACE_LOG pointer to a pointer to the 'extra' -// data associated with the log. -// - -#define TRACE_LOG_TO_EXTRA_DATA(log) (PVOID)( (log) + 1 ) - - -// -// Manipulators. -// - -PTRACE_LOG -CreateTraceLog( - IN LONG LogSize, - IN LONG ExtraBytesInHeader, - IN LONG EntrySize - ); - -VOID -DestroyTraceLog( - IN PTRACE_LOG Log - ); - -LONG -WriteTraceLog( - IN PTRACE_LOG Log, - IN PVOID Entry - ); - -VOID -ResetTraceLog( - IN PTRACE_LOG Log - ); - - -#if defined(__cplusplus) -} // extern "C" -#endif // __cplusplus - - -#endif // _TRACELOG_H_ - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h deleted file mode 100644 index 0e825e4e209d..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h +++ /dev/null @@ -1,850 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#pragma once - -#include -#include "rwlock.h" -#include "prime.h" - -template -class TREE_HASH_NODE -{ - template - friend class TREE_HASH_TABLE; - - private: - // Next node in the hash table look-aside - TREE_HASH_NODE<_Record> *_pNext; - - // links in the tree structure - TREE_HASH_NODE * _pParentNode; - TREE_HASH_NODE * _pFirstChild; - TREE_HASH_NODE * _pNextSibling; - - // actual record - _Record * _pRecord; - - // hash value - PCWSTR _pszPath; - DWORD _dwHash; -}; - -template -class TREE_HASH_TABLE -{ -protected: - typedef BOOL - (PFN_DELETE_IF)( - _Record * pRecord, - PVOID pvContext - ); - - typedef VOID - (PFN_APPLY)( - _Record * pRecord, - PVOID pvContext - ); - -public: - TREE_HASH_TABLE( - BOOL fCaseSensitive - ) : _ppBuckets( NULL ), - _nBuckets( 0 ), - _nItems( 0 ), - _fCaseSensitive( fCaseSensitive ) - { - } - - virtual - ~TREE_HASH_TABLE(); - - virtual - VOID - ReferenceRecord( - _Record * pRecord - ) = 0; - - virtual - VOID - DereferenceRecord( - _Record * pRecord - ) = 0; - - virtual - PCWSTR - GetKey( - _Record * pRecord - ) = 0; - - DWORD - Count() - { - return _nItems; - } - - virtual - VOID - Clear(); - - HRESULT - Initialize( - DWORD nBucketSize - ); - - DWORD - CalcHash( - PCWSTR pszKey - ) - { - return _fCaseSensitive ? HashString(pszKey) : HashStringNoCase(pszKey); - } - - virtual - VOID - FindKey( - PCWSTR pszKey, - _Record ** ppRecord - ); - - virtual - HRESULT - InsertRecord( - _Record * pRecord - ); - - virtual - VOID - DeleteKey( - PCWSTR pszKey - ); - - virtual - VOID - DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext - ); - - VOID - Apply( - PFN_APPLY pfnApply, - PVOID pvContext - ); - -private: - - BOOL - FindNodeInternal( - PCWSTR pszKey, - DWORD dwHash, - TREE_HASH_NODE<_Record> ** ppNode, - TREE_HASH_NODE<_Record> *** pppPreviousNodeNextPointer = NULL - ); - - HRESULT - AddNodeInternal( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode - ); - - HRESULT - AllocateNode( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode - ); - - VOID - DeleteNode( - TREE_HASH_NODE<_Record> * pNode - ) - { - if (pNode->_pRecord != NULL) - { - DereferenceRecord(pNode->_pRecord); - pNode->_pRecord = NULL; - } - - HeapFree(GetProcessHeap(), - 0, - pNode); - } - - VOID - DeleteNodeInternal( - TREE_HASH_NODE<_Record> ** ppPreviousNodeNextPointer, - TREE_HASH_NODE<_Record> * pNode - ); - - VOID - RehashTableIfNeeded( - VOID - ); - - TREE_HASH_NODE<_Record> ** _ppBuckets; - DWORD _nBuckets; - DWORD _nItems; - BOOL _fCaseSensitive; - CWSDRWLock _tableLock; -}; - -template -HRESULT -TREE_HASH_TABLE<_Record>::AllocateNode( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode -) -{ - // - // Allocate enough extra space for pszPath - // - DWORD cchPath = (DWORD) wcslen(pszPath); - if (cchPath >= ((0xffffffff - sizeof(TREE_HASH_NODE<_Record>))/sizeof(WCHAR) - 1)) - { - return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - } - TREE_HASH_NODE<_Record> *pNode = (TREE_HASH_NODE<_Record> *)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(TREE_HASH_NODE<_Record>) + (cchPath+1)*sizeof(WCHAR)); - if (pNode == NULL) - { - return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - } - - memcpy(pNode+1, pszPath, (cchPath+1)*sizeof(WCHAR)); - pNode->_pszPath = (PCWSTR)(pNode+1); - pNode->_dwHash = dwHash; - pNode->_pNext = pNode->_pNextSibling = pNode->_pFirstChild = NULL; - pNode->_pParentNode = pParentNode; - pNode->_pRecord = pRecord; - - *ppNewNode = pNode; - return S_OK; -} - -template -HRESULT -TREE_HASH_TABLE<_Record>::Initialize( - DWORD nBuckets -) -{ - HRESULT hr = S_OK; - - if ( nBuckets == 0 ) - { - hr = E_INVALIDARG; - goto Failed; - } - - hr = _tableLock.Init(); - if ( FAILED( hr ) ) - { - goto Failed; - } - - if (nBuckets >= 0xffffffff/sizeof(TREE_HASH_NODE<_Record> *)) - { - hr = E_INVALIDARG; - goto Failed; - } - - _ppBuckets = (TREE_HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(TREE_HASH_NODE<_Record> *)); - if (_ppBuckets == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Failed; - } - _nBuckets = nBuckets; - - return S_OK; - -Failed: - - if (_ppBuckets) - { - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - } - - return hr; -} - - -template -TREE_HASH_TABLE<_Record>::~TREE_HASH_TABLE() -{ - if (_ppBuckets == NULL) - { - return; - } - - _ASSERTE(_nItems == 0); - - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - _nBuckets = 0; -} - -template -VOID -TREE_HASH_TABLE<_Record>::Clear() -{ - TREE_HASH_NODE<_Record> *pCurrent; - TREE_HASH_NODE<_Record> *pNext; - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pCurrent = _ppBuckets[i]; - _ppBuckets[i] = NULL; - while (pCurrent != NULL) - { - pNext = pCurrent->_pNext; - DeleteNode(pCurrent); - pCurrent = pNext; - } - } - - _nItems = 0; - _tableLock.ExclusiveRelease(); -} - -template -BOOL -TREE_HASH_TABLE<_Record>::FindNodeInternal( - PCWSTR pszKey, - DWORD dwHash, - TREE_HASH_NODE<_Record> ** ppNode, - TREE_HASH_NODE<_Record> *** pppPreviousNodeNextPointer -) -/*++ - Return value indicates whether the item is found - key, dwHash - key and hash for the node to find - ppNode - on successful return, the node found, on failed return, the first - node with hash value greater than the node to be found - pppPreviousNodeNextPointer - the pointer to previous node's _pNext - - This routine may be called under either read or write lock ---*/ -{ - TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer; - TREE_HASH_NODE<_Record> *pNode; - BOOL fFound = FALSE; - - ppPreviousNodeNextPointer = _ppBuckets + (dwHash % _nBuckets); - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - if (pNode->_dwHash == dwHash) - { - if (CompareStringOrdinal(pszKey, - -1, - pNode->_pszPath, - -1, - !_fCaseSensitive) == CSTR_EQUAL) - { - fFound = TRUE; - break; - } - } - else if (pNode->_dwHash > dwHash) - { - break; - } - - ppPreviousNodeNextPointer = &(pNode->_pNext); - pNode = *ppPreviousNodeNextPointer; - } - - *ppNode = pNode; - if (pppPreviousNodeNextPointer != NULL) - { - *pppPreviousNodeNextPointer = ppPreviousNodeNextPointer; - } - return fFound; -} - -template -VOID -TREE_HASH_TABLE<_Record>::FindKey( - PCWSTR pszKey, - _Record ** ppRecord -) -{ - TREE_HASH_NODE<_Record> *pNode; - - *ppRecord = NULL; - - DWORD dwHash = CalcHash(pszKey); - - _tableLock.SharedAcquire(); - - if (FindNodeInternal(pszKey, dwHash, &pNode) && - pNode->_pRecord != NULL) - { - ReferenceRecord(pNode->_pRecord); - *ppRecord = pNode->_pRecord; - } - - _tableLock.SharedRelease(); -} - -template -HRESULT -TREE_HASH_TABLE<_Record>::AddNodeInternal( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode -) -/*++ - Return value is HRESULT indicating sucess or failure - pszPath, dwHash, pRecord - path, hash value and record to be inserted - pParentNode - this will be the parent of the node being inserted - ppNewNode - on successful return, the new node created and inserted - - This function may be called under a read or write lock ---*/ -{ - TREE_HASH_NODE<_Record> *pNewNode; - TREE_HASH_NODE<_Record> *pNextNode; - TREE_HASH_NODE<_Record> **ppNextPointer; - HRESULT hr; - - // - // Ownership of pRecord is not transferred to pNewNode yet, so remember - // to either set it to null before deleting pNewNode or add an extra - // reference later - this is to make sure we do not do an extra ref/deref - // which users may view as getting flushed out of the hash-table - // - hr = AllocateNode(pszPath, - dwHash, - pRecord, - pParentNode, - &pNewNode); - if (FAILED(hr)) - { - return hr; - } - - do - { - // - // Find the right place to add this node - // - - if (FindNodeInternal(pszPath, dwHash, &pNextNode, &ppNextPointer)) - { - // - // If node already there, record may still need updating - // - if (pRecord != NULL && - InterlockedCompareExchangePointer((PVOID *)&pNextNode->_pRecord, - pRecord, - NULL) == NULL) - { - ReferenceRecord(pRecord); - hr = S_OK; - } - else - { - hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS); - } - - // ownership of pRecord has either passed to existing record or - // not to anyone at all - pNewNode->_pRecord = NULL; - DeleteNode(pNewNode); - *ppNewNode = pNextNode; - return hr; - } - - // - // If another node got inserted in betwen, we will have to retry - // - pNewNode->_pNext = pNextNode; - } while (InterlockedCompareExchangePointer((PVOID *)ppNextPointer, - pNewNode, - pNextNode) != pNextNode); - // pass ownership of pRecord now - if (pRecord != NULL) - { - ReferenceRecord(pRecord); - pRecord = NULL; - } - InterlockedIncrement((LONG *)&_nItems); - - // - // update the parent - // - if (pParentNode != NULL) - { - ppNextPointer = &pParentNode->_pFirstChild; - do - { - pNextNode = *ppNextPointer; - pNewNode->_pNextSibling = pNextNode; - } while (InterlockedCompareExchangePointer((PVOID *)ppNextPointer, - pNewNode, - pNextNode) != pNextNode); - } - - *ppNewNode = pNewNode; - return S_OK; -} - -template -HRESULT -TREE_HASH_TABLE<_Record>::InsertRecord( - _Record * pRecord -) -/*++ - This method inserts a node for this record and also empty nodes for paths - in the hierarchy leading upto this path - - The insert is done under only a read-lock - this is possible by keeping - the hashes in a bucket in increasing order and using interlocked operations - to actually insert the item in the hash-bucket lookaside list and the parent - children list - - Returns HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) if the record already exists. - Never leak this error to the end user because "*file* already exists" may be confusing. ---*/ -{ - PCWSTR pszKey = GetKey(pRecord); - STACK_STRU( strPartialPath, 256); - PWSTR pszPartialPath; - DWORD dwHash; - DWORD cchEnd; - HRESULT hr; - TREE_HASH_NODE<_Record> *pParentNode = NULL; - - hr = strPartialPath.Copy(pszKey); - if (FAILED(hr)) - { - goto Finished; - } - pszPartialPath = strPartialPath.QueryStr(); - - _tableLock.SharedAcquire(); - - // - // First find the lowest parent node present - // - for (cchEnd = strPartialPath.QueryCCH() - 1; cchEnd > 0; cchEnd--) - { - if (pszPartialPath[cchEnd] == L'/' || pszPartialPath[cchEnd] == L'\\') - { - pszPartialPath[cchEnd] = L'\0'; - - dwHash = CalcHash(pszPartialPath); - if (FindNodeInternal(pszPartialPath, dwHash, &pParentNode)) - { - pszPartialPath[cchEnd] = pszKey[cchEnd]; - break; - } - pParentNode = NULL; - } - } - - // - // Now go ahead and add the rest of the tree (including our record) - // - for (; cchEnd <= strPartialPath.QueryCCH(); cchEnd++) - { - if (pszPartialPath[cchEnd] == L'\0') - { - dwHash = CalcHash(pszPartialPath); - hr = AddNodeInternal( - pszPartialPath, - dwHash, - (cchEnd == strPartialPath.QueryCCH()) ? pRecord : NULL, - pParentNode, - &pParentNode); - if (FAILED(hr) && - hr != HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) - { - goto Finished; - } - - pszPartialPath[cchEnd] = pszKey[cchEnd]; - } - } - -Finished: - _tableLock.SharedRelease(); - - if (SUCCEEDED(hr)) - { - RehashTableIfNeeded(); - } - - return hr; -} - -template -VOID -TREE_HASH_TABLE<_Record>::DeleteNodeInternal( - TREE_HASH_NODE<_Record> ** ppNextPointer, - TREE_HASH_NODE<_Record> * pNode -) -/*++ - pNode is the node to be deleted - ppNextPointer is the pointer to the previous node's next pointer pointing - to this node - - This function should be called under write-lock ---*/ -{ - // - // First remove this node from hash table - // - *ppNextPointer = pNode->_pNext; - - // - // Now fixup parent - // - if (pNode->_pParentNode != NULL) - { - ppNextPointer = &pNode->_pParentNode->_pFirstChild; - while (*ppNextPointer != pNode) - { - ppNextPointer = &(*ppNextPointer)->_pNextSibling; - } - *ppNextPointer = pNode->_pNextSibling; - } - - // - // Now remove all children recursively - // - TREE_HASH_NODE<_Record> *pChild = pNode->_pFirstChild; - TREE_HASH_NODE<_Record> *pNextChild; - while (pChild != NULL) - { - pNextChild = pChild->_pNextSibling; - - ppNextPointer = _ppBuckets + (pChild->_dwHash % _nBuckets); - while (*ppNextPointer != pChild) - { - ppNextPointer = &(*ppNextPointer)->_pNext; - } - pChild->_pParentNode = NULL; - DeleteNodeInternal(ppNextPointer, pChild); - - pChild = pNextChild; - } - - DeleteNode(pNode); - _nItems--; -} - -template -VOID -TREE_HASH_TABLE<_Record>::DeleteKey( - PCWSTR pszKey -) -{ - TREE_HASH_NODE<_Record> *pNode; - TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer; - - DWORD dwHash = CalcHash(pszKey); - - _tableLock.ExclusiveAcquire(); - - if (FindNodeInternal(pszKey, dwHash, &pNode, &ppPreviousNodeNextPointer)) - { - DeleteNodeInternal(ppPreviousNodeNextPointer, pNode); - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -TREE_HASH_TABLE<_Record>::DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext -) -{ - TREE_HASH_NODE<_Record> *pNode; - TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer; - BOOL fDelete; - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - ppPreviousNodeNextPointer = _ppBuckets + i; - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - // - // Non empty nodes deleted based on DeleteIf, empty nodes deleted - // if they have no children - // - fDelete = FALSE; - if (pNode->_pRecord != NULL) - { - if (pfnDeleteIf(pNode->_pRecord, pvContext)) - { - fDelete = TRUE; - } - } - else if (pNode->_pFirstChild == NULL) - { - fDelete = TRUE; - } - - if (fDelete) - { - if (pNode->_pFirstChild == NULL) - { - DeleteNodeInternal(ppPreviousNodeNextPointer, pNode); - } - else - { - DereferenceRecord(pNode->_pRecord); - pNode->_pRecord = NULL; - } - } - else - { - ppPreviousNodeNextPointer = &pNode->_pNext; - } - - pNode = *ppPreviousNodeNextPointer; - } - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -TREE_HASH_TABLE<_Record>::Apply( - PFN_APPLY pfnApply, - PVOID pvContext -) -{ - TREE_HASH_NODE<_Record> *pNode; - - _tableLock.SharedAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - if (pNode->_pRecord != NULL) - { - pfnApply(pNode->_pRecord, pvContext); - } - - pNode = pNode->_pNext; - } - } - - _tableLock.SharedRelease(); -} - -template -VOID -TREE_HASH_TABLE<_Record>::RehashTableIfNeeded( - VOID -) -{ - TREE_HASH_NODE<_Record> **ppBuckets; - DWORD nBuckets; - TREE_HASH_NODE<_Record> *pNode; - TREE_HASH_NODE<_Record> *pNextNode; - TREE_HASH_NODE<_Record> **ppNextPointer; - TREE_HASH_NODE<_Record> *pNewNextNode; - DWORD nNewBuckets; - - // - // If number of items has become too many, we will double the hash table - // size (we never reduce it however) - // - if (_nItems <= PRIME::GetPrime(2*_nBuckets)) - { - return; - } - - _tableLock.ExclusiveAcquire(); - - nNewBuckets = PRIME::GetPrime(2*_nBuckets); - - if (_nItems <= nNewBuckets) - { - goto Finished; - } - - nBuckets = nNewBuckets; - if (nBuckets >= 0xffffffff/sizeof(TREE_HASH_NODE<_Record> *)) - { - goto Finished; - } - ppBuckets = (TREE_HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(TREE_HASH_NODE<_Record> *)); - if (ppBuckets == NULL) - { - goto Finished; - } - - // - // Take out nodes from the old hash table and insert in the new one, make - // sure to keep the hashes in increasing order - // - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - pNextNode = pNode->_pNext; - - ppNextPointer = ppBuckets + (pNode->_dwHash % nBuckets); - pNewNextNode = *ppNextPointer; - while (pNewNextNode != NULL && - pNewNextNode->_dwHash <= pNode->_dwHash) - { - ppNextPointer = &pNewNextNode->_pNext; - pNewNextNode = pNewNextNode->_pNext; - } - pNode->_pNext = pNewNextNode; - *ppNextPointer = pNode; - - pNode = pNextNode; - } - } - - HeapFree(GetProcessHeap(), 0, _ppBuckets); - _ppBuckets = ppBuckets; - _nBuckets = nBuckets; - ppBuckets = NULL; - -Finished: - - _tableLock.ExclusiveRelease(); -} - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj index 13c0f1d8fe76..5721139576fd 100644 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj +++ b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj @@ -65,17 +65,9 @@ - - - - - - - - - - - + + + diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx deleted file mode 100644 index 262c010a2a90..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx +++ /dev/null @@ -1,443 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -LONG ALLOC_CACHE_HANDLER::sm_nFillPattern = 0xACA50000; -HANDLE ALLOC_CACHE_HANDLER::sm_hHeap; - -// -// This class is used to implement the free list. We cast the free'd -// memory block to a FREE_LIST_HEADER*. The signature is used to guard against -// double deletion. We also fill memory with a pattern. -// -class FREE_LIST_HEADER -{ -public: - SLIST_ENTRY ListEntry; - DWORD dwSignature; - - enum - { - FREE_SIGNATURE = (('A') | ('C' << 8) | ('a' << 16) | (('$' << 24) | 0x80)), - }; -}; - -ALLOC_CACHE_HANDLER::ALLOC_CACHE_HANDLER( - VOID -) : m_nThreshold(0), - m_cbSize(0), - m_pFreeLists(NULL), - m_nTotal(0) -{ -} - -ALLOC_CACHE_HANDLER::~ALLOC_CACHE_HANDLER( - VOID -) -{ - if (m_pFreeLists != NULL) - { - CleanupLookaside(); - m_pFreeLists->Dispose(); - m_pFreeLists = NULL; - } -} - -HRESULT -ALLOC_CACHE_HANDLER::Initialize( - DWORD cbSize, - LONG nThreshold -) -{ - HRESULT hr = S_OK; - - m_nThreshold = nThreshold; - if ( m_nThreshold > 0xffff) - { - // - // This will be compared against QueryDepthSList return value (USHORT). - // - m_nThreshold = 0xffff; - } - - if ( IsPageheapEnabled() ) - { - // - // Disable acache. - // - m_nThreshold = 0; - } - - // - // Make sure the block is big enough to hold a FREE_LIST_HEADER. - // - m_cbSize = cbSize; - m_cbSize = max(m_cbSize, sizeof(FREE_LIST_HEADER)); - - // - // Round up the block size to a multiple of the size of a LONG (for - // the fill pattern in Free()). - // - m_cbSize = (m_cbSize + sizeof(LONG) - 1) & ~(sizeof(LONG) - 1); - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10 - auto Init = [] (SLIST_HEADER* pHead) - { - InitializeSListHead(pHead); - }; -#else - class Functor - { - public: - void operator()(SLIST_HEADER* pHead) - { - InitializeSListHead(pHead); - } - } Init; -#endif - - hr = PER_CPU::Create(Init, - &m_pFreeLists ); - if (FAILED(hr)) - { - goto Finished; - } - - m_nFillPattern = InterlockedIncrement(&sm_nFillPattern); - -Finished: - - return hr; -} - -// static -HRESULT -ALLOC_CACHE_HANDLER::StaticInitialize( - VOID -) -{ - // - // Since the memory allocated is fixed size, - // a heap is not really needed, allocations can be done - // using VirtualAllocEx[Numa]. For now use Windows Heap. - // - // Be aware that creating one private heap consumes more - // virtual address space for the worker process. - // - sm_hHeap = GetProcessHeap(); - return S_OK; -} - - -// static -VOID -ALLOC_CACHE_HANDLER::StaticTerminate( - VOID -) -{ - sm_hHeap = NULL; -} - -VOID -ALLOC_CACHE_HANDLER::CleanupLookaside( - VOID -) -/*++ - Description: - This function cleans up the lookaside list by removing storage space. - - Arguments: - None. - - Returns: - None ---*/ -{ - // - // Free up all the entries in the list. - // Don't use InterlockedFlushSList, in order to work - // memory must be 16 bytes aligned and currently it is 64. - // - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10 - auto Predicate = [=] (SLIST_HEADER * pListHeader) - { - PSLIST_ENTRY pl; - LONG NodesToDelete = QueryDepthSList( pListHeader ); - - pl = InterlockedPopEntrySList( pListHeader ); - while ( pl != NULL && --NodesToDelete >= 0 ) - { - InterlockedDecrement( &m_nTotal); - - ::HeapFree( sm_hHeap, 0, pl ); - - pl = InterlockedPopEntrySList(pListHeader); - } - }; -#else - class Functor - { - public: - explicit Functor(ALLOC_CACHE_HANDLER * pThis) : _pThis(pThis) - { - } - void operator()(SLIST_HEADER * pListHeader) - { - PSLIST_ENTRY pl; - LONG NodesToDelete = QueryDepthSList( pListHeader ); - - pl = InterlockedPopEntrySList( pListHeader ); - while ( pl != NULL && --NodesToDelete >= 0 ) - { - InterlockedDecrement( &_pThis->m_nTotal); - - ::HeapFree( sm_hHeap, 0, pl ); - - pl = InterlockedPopEntrySList(pListHeader); - } - } - private: - ALLOC_CACHE_HANDLER * _pThis; - } Predicate(this); -#endif - - m_pFreeLists ->ForEach(Predicate); -} - -LPVOID -ALLOC_CACHE_HANDLER::Alloc( - VOID -) -{ - LPVOID pMemory = NULL; - - if ( m_nThreshold > 0 ) - { - SLIST_HEADER * pListHeader = m_pFreeLists ->GetLocal(); - pMemory = (LPVOID) InterlockedPopEntrySList(pListHeader); // get the real object - - if (pMemory != NULL) - { - FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory; - // - // If the signature is wrong then somebody's been scribbling - // on memory that they've freed. - // - DBG_ASSERT(pfl->dwSignature == FREE_LIST_HEADER::FREE_SIGNATURE); - } - } - - if ( pMemory == NULL ) - { - // - // No free entry. Need to alloc a new object. - // - pMemory = (LPVOID) ::HeapAlloc( sm_hHeap, - 0, - m_cbSize ); - - if ( pMemory != NULL ) - { - // - // Update counters. - // - m_nTotal++; - } - } - - if ( pMemory == NULL ) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - else - { - FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory; - pfl->dwSignature = 0; // clear; just in case caller never overwrites - } - - return pMemory; -} - -VOID -ALLOC_CACHE_HANDLER::Free( - __in LPVOID pMemory -) -{ - // - // Assume that this is allocated using the Alloc() function. - // - DBG_ASSERT(NULL != pMemory); - - // - // Use a signature to check against double deletions. - // - FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory; - DBG_ASSERT(pfl->dwSignature != FREE_LIST_HEADER::FREE_SIGNATURE); - - // - // Start filling the space beyond the portion overlaid by the initial - // FREE_LIST_HEADER. Fill at most 6 DWORDS. - // - LONG* pl = (LONG*) (pfl+1); - - for (LONG cb = (LONG)min(6 * sizeof(LONG),m_cbSize) - sizeof(FREE_LIST_HEADER); - cb > 0; - cb -= sizeof(LONG)) - { - *pl++ = m_nFillPattern; - } - - // - // Now, set the signature. - // - pfl->dwSignature = FREE_LIST_HEADER::FREE_SIGNATURE; - - // - // Store the items in the alloc cache. - // - SLIST_HEADER * pListHeader = m_pFreeLists ->GetLocal(); - - if ( QueryDepthSList(pListHeader) >= m_nThreshold ) - { - // - // Threshold for free entries is exceeded. Free the object to - // process pool. - // - ::HeapFree( sm_hHeap, 0, pMemory ); - } - else - { - // - // Store the given pointer in the single linear list - // - InterlockedPushEntrySList(pListHeader, &pfl->ListEntry); - } -} - -DWORD -ALLOC_CACHE_HANDLER::QueryDepthForAllSLists( - VOID -) -/*++ - -Description: - - Aggregates the total count of elements in all lists. - -Arguments: - - None. - -Return Value: - - Total count (snapshot). - ---*/ -{ - DWORD Count = 0; - - if (m_pFreeLists != NULL) - { -#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10 - auto Predicate = [&Count] (SLIST_HEADER * pListHeader) - { - Count += QueryDepthSList(pListHeader); - }; -#else - class Functor - { - public: - explicit Functor(DWORD& Count) : _Count(Count) - { - } - void operator()(SLIST_HEADER * pListHeader) - { - _Count += QueryDepthSList(pListHeader); - } - private: - DWORD& _Count; - } Predicate(Count); -#endif - // - // [&Count] means that the method can modify local variable Count. - // - m_pFreeLists ->ForEach(Predicate); - } - - return Count; -} - -// static -BOOL -ALLOC_CACHE_HANDLER::IsPageheapEnabled( - VOID -) -{ - BOOL fRet = FALSE; - BOOL fLockedHeap = FALSE; - HMODULE hModule = NULL; - HANDLE hHeap = NULL; - PROCESS_HEAP_ENTRY heapEntry = {0}; - - // - // If verifier.dll is loaded - we are running under app verifier == pageheap is enabled - // - hModule = GetModuleHandle( L"verifier.dll" ); - if ( hModule != NULL ) - { - hModule = NULL; - fRet = TRUE; - goto Finished; - } - - // - // Create a heap for calling heapwalk - // otherwise HeapWalk turns off lookasides for a useful heap - // - hHeap = ::HeapCreate( 0, 0, 0 ); - if ( hHeap == NULL ) - { - fRet = FALSE; - goto Finished; - } - - fRet = ::HeapLock( hHeap ); - if ( !fRet ) - { - goto Finished; - } - fLockedHeap = TRUE; - - // - // If HeapWalk is unsupported -> then running page heap - // - fRet = ::HeapWalk( hHeap, &heapEntry ); - if ( !fRet ) - { - if ( GetLastError() == ERROR_INVALID_FUNCTION ) - { - fRet = TRUE; - goto Finished; - } - } - - fRet = FALSE; - -Finished: - - if ( fLockedHeap ) - { - fLockedHeap = FALSE; - DBG_REQUIRE( ::HeapUnlock( hHeap ) ); - } - - if ( hHeap ) - { - DBG_REQUIRE( ::HeapDestroy( hHeap ) ); - hHeap = NULL; - } - - return fRet; -} \ No newline at end of file diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp deleted file mode 100644 index 9685b233c8d3..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp +++ /dev/null @@ -1,1734 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -HRESULT -SetElementProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - IN CONST VARIANT * varPropValue - ) -{ - HRESULT hr = NOERROR; - - CComPtr pPropElement; - - BSTR bstrPropName = SysAllocString( szPropName ); - - if( !bstrPropName ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = pElement->GetPropertyByName( bstrPropName, - &pPropElement ); - if( FAILED(hr) ) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pPropElement->put_Value( *varPropValue ); - if( FAILED(hr) ) - { - DBGERROR_HR( hr ); - goto exit; - } - -exit: - - if( bstrPropName ) - { - SysFreeString( bstrPropName ); - bstrPropName = NULL; - } - - return hr; -} - -HRESULT -SetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - IN CONST WCHAR * szPropValue - ) -{ - HRESULT hr; - VARIANT varPropValue; - VariantInit(&varPropValue); - - hr = VariantAssign(&varPropValue, szPropValue); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = SetElementProperty(pElement, szPropName, &varPropValue); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - VariantClear(&varPropValue); - return hr; -} - -HRESULT -GetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - OUT BSTR * pbstrPropValue - ) -{ - HRESULT hr = S_OK; - BSTR bstrPropName = SysAllocString( szPropName ); - IAppHostProperty* pProperty = NULL; - - *pbstrPropValue = NULL; - - if (!bstrPropName) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = pElement->GetPropertyByName( bstrPropName, &pProperty ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pProperty->get_StringValue( pbstrPropValue ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - -exit: - - if (pProperty) - { - pProperty->Release(); - } - - if (bstrPropName) - { - SysFreeString( bstrPropName ); - } - - return hr; -} - - -HRESULT -GetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - OUT STRU * pstrPropValue - ) -{ - HRESULT hr = S_OK; - BSTR bstrPropName = SysAllocString( szPropName ); - IAppHostProperty* pProperty = NULL; - BSTR bstrPropValue = NULL; - - if (!bstrPropName) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = pElement->GetPropertyByName( bstrPropName, &pProperty ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pProperty->get_StringValue( &bstrPropValue ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pstrPropValue->Copy(bstrPropValue); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - -exit: - - if (pProperty) - { - pProperty->Release(); - } - - if (bstrPropValue) - { - SysFreeString( bstrPropValue ); - } - - if (bstrPropName) - { - SysFreeString( bstrPropName ); - } - - return hr; -} - -HRESULT -GetElementChildByName( - IN IAppHostElement * pElement, - IN LPCWSTR pszElementName, - OUT IAppHostElement ** ppChildElement -) -{ - BSTR bstrElementName = SysAllocString(pszElementName); - if (bstrElementName == NULL) - { - return E_OUTOFMEMORY; - } - HRESULT hr = pElement->GetElementByName(bstrElementName, - ppChildElement); - SysFreeString(bstrElementName); - return hr; -} - -HRESULT -GetElementBoolProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT bool * pBool -) -{ - BOOL fValue; - HRESULT hr = GetElementBoolProperty(pElement, - pszPropertyName, - &fValue); - if (SUCCEEDED(hr)) - { - *pBool = !!fValue; - } - return hr; -} - -HRESULT -GetElementBoolProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT BOOL * pBool -) -{ - HRESULT hr = S_OK; - BSTR bstrPropertyName = NULL; - IAppHostProperty * pProperty = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrPropertyName = SysAllocString( pszPropertyName ); - if ( bstrPropertyName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - // Now ask for the property and if it succeeds it is returned directly back. - hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty ); - if ( FAILED ( hr ) ) - { - goto exit; - } - - // Now let's get the property and then extract it from the Variant. - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto exit; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_BOOL ); - if ( FAILED ( hr ) ) - { - goto exit; - } - - // extract the value - *pBool = ( V_BOOL( &varValue ) == VARIANT_TRUE ); - -exit: - - VariantClear( &varValue ); - - if ( bstrPropertyName != NULL ) - { - SysFreeString( bstrPropertyName ); - bstrPropertyName = NULL; - } - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - return hr; - -} - -HRESULT -GetElementDWORDProperty( - IN IAppHostElement * pSitesCollectionEntry, - IN LPCWSTR pwszName, - OUT DWORD * pdwValue -) -{ - HRESULT hr = S_OK; - IAppHostProperty * pProperty = NULL; - BSTR bstrName = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrName = SysAllocString( pwszName ); - if ( bstrName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto error; - } - - hr = pSitesCollectionEntry->GetPropertyByName( bstrName, - &pProperty ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_UI4 ); - if ( FAILED ( hr ) ) - { - goto error; - } - - // extract the value - *pdwValue = varValue.ulVal; - -error: - - VariantClear( &varValue ); - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - if ( bstrName != NULL ) - { - SysFreeString( bstrName ); - bstrName = NULL; - } - - return hr; -} - -HRESULT -GetElementINTProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT INT * pintValue -) -{ - HRESULT hr = S_OK; - IAppHostProperty * pProperty = NULL; - BSTR bstrName = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrName = SysAllocString( pszPropertyName ); - if ( bstrName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto error; - } - - hr = pElement->GetPropertyByName( bstrName, - &pProperty ); - if ( FAILED( hr ) ) - { - goto error; - } - - hr = pProperty->get_Value( &varValue ); - if ( FAILED( hr ) ) - { - goto error; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_I4 ); - if ( FAILED( hr ) ) - { - goto error; - } - - // extract the value - *pintValue = varValue.intVal; - -error: - - VariantClear( &varValue ); - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - if ( bstrName != NULL ) - { - SysFreeString( bstrName ); - bstrName = NULL; - } - - return hr; -} - -HRESULT -GetElementLONGLONGProperty( - IN IAppHostElement * pSitesCollectionEntry, - IN LPCWSTR pwszName, - OUT LONGLONG * pllValue -) -{ - HRESULT hr = S_OK; - IAppHostProperty * pProperty = NULL; - BSTR bstrName = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrName = SysAllocString( pwszName ); - if ( bstrName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto error; - } - - hr = pSitesCollectionEntry->GetPropertyByName( bstrName, - &pProperty ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_I8 ); - if ( FAILED ( hr ) ) - { - goto error; - } - - // extract the value - *pllValue = varValue.ulVal; - -error: - - VariantClear( &varValue ); - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - if ( bstrName != NULL ) - { - SysFreeString( bstrName ); - bstrName = NULL; - } - - return hr; -} - -HRESULT -GetElementRawTimeSpanProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT ULONGLONG * pulonglong -) -{ - HRESULT hr = S_OK; - BSTR bstrPropertyName = NULL; - IAppHostProperty * pProperty = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrPropertyName = SysAllocString( pszPropertyName ); - if ( bstrPropertyName == NULL ) - { - hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); - goto Finished; - } - - // Now ask for the property and if it succeeds it is returned directly back - hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty ); - if ( FAILED ( hr ) ) - { - goto Finished; - } - - // Now let's get the property and then extract it from the Variant. - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto Finished; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_UI8 ); - if ( FAILED ( hr ) ) - { - goto Finished; - } - - // extract the value - *pulonglong = varValue.ullVal; - - -Finished: - - VariantClear( &varValue ); - - if ( bstrPropertyName != NULL ) - { - SysFreeString( bstrPropertyName ); - bstrPropertyName = NULL; - } - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - return hr; - -} // end of Config_GetRawTimeSpanProperty - -HRESULT -DeleteElementFromCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - BOOL * pfDeleted - ) -{ - HRESULT hr = NOERROR; - ULONG index; - - VARIANT varIndex; - VariantInit( &varIndex ); - - *pfDeleted = FALSE; - - hr = FindElementInCollection( - pCollection, - szKeyName, - szKeyValue, - BehaviorFlags, - &index - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (hr == S_FALSE) - { - // - // Not found. - // - - goto exit; - } - - varIndex.vt = VT_UI4; - varIndex.ulVal = index; - - hr = pCollection->DeleteElement( varIndex ); - - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - *pfDeleted = TRUE; - -exit: - - return hr; -} - -HRESULT -DeleteAllElementsFromCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - UINT * pNumDeleted - ) -{ - HRESULT hr = S_OK; - UINT numDeleted = 0; - BOOL fDeleted = TRUE; - - while (fDeleted) - { - hr = DeleteElementFromCollection( - pCollection, - szKeyName, - szKeyValue, - BehaviorFlags, - &fDeleted - ); - - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - break; - } - - if (fDeleted) - { - numDeleted++; - } - } - - *pNumDeleted = numDeleted; - return hr; -} - -BOOL -FindCompareCaseSensitive( - CONST WCHAR * szLookupValue, - CONST WCHAR * szKeyValue - ) -{ - return !wcscmp(szLookupValue, szKeyValue); -} - -BOOL -FindCompareCaseInsensitive( - CONST WCHAR * szLookupValue, - CONST WCHAR * szKeyValue - ) -{ - return !_wcsicmp(szLookupValue, szKeyValue); -} - -typedef -BOOL -(*PFN_FIND_COMPARE_PROC)( - CONST WCHAR *szLookupValue, - CONST WCHAR *szKeyValue - ); - -HRESULT -FindElementInCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - OUT ULONG * pIndex - ) -{ - HRESULT hr = NOERROR; - - CComPtr pElement; - CComPtr pKeyProperty; - - VARIANT varIndex; - VariantInit( &varIndex ); - - VARIANT varKeyValue; - VariantInit( &varKeyValue ); - - DWORD count; - DWORD i; - - BSTR bstrKeyName = NULL; - PFN_FIND_COMPARE_PROC compareProc; - - compareProc = (BehaviorFlags & FIND_ELEMENT_CASE_INSENSITIVE) - ? &FindCompareCaseInsensitive - : &FindCompareCaseSensitive; - - bstrKeyName = SysAllocString( szKeyName ); - if( !bstrKeyName ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = pCollection->get_Count( &count ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - for( i = 0; i < count; i++ ) - { - varIndex.vt = VT_UI4; - varIndex.ulVal = i; - - hr = pCollection->get_Item( varIndex, - &pElement ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto tryNext; - } - - hr = pElement->GetPropertyByName( bstrKeyName, - &pKeyProperty ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto tryNext; - } - - hr = pKeyProperty->get_Value( &varKeyValue ); - - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto tryNext; - } - - if ((compareProc)(szKeyValue, varKeyValue.bstrVal)) - { - *pIndex = i; - break; - } - -tryNext: - - pElement.Release(); - pKeyProperty.Release(); - - VariantClear( &varKeyValue ); - } - - if (i >= count) - { - hr = S_FALSE; - } - -exit: - - SysFreeString( bstrKeyName ); - VariantClear( &varKeyValue ); - - return hr; -} - -HRESULT -VariantAssign( - IN OUT VARIANT * pv, - IN CONST WCHAR * sz - ) -{ - if( !pv || !sz ) - { - return E_INVALIDARG; - } - - HRESULT hr = NOERROR; - - BSTR bstr = SysAllocString( sz ); - if( !bstr ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = VariantClear( pv ); - if( FAILED(hr) ) - { - DBGERROR_HR( hr ); - goto exit; - } - - pv->vt = VT_BSTR; - pv->bstrVal = bstr; - bstr = NULL; - -exit: - - SysFreeString( bstr ); - - return hr; -} - -HRESULT -GetLocationFromFile( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szLocationPath, - OUT IAppHostConfigLocation ** ppLocation, - OUT BOOL * pFound - ) -{ - HRESULT hr = NOERROR; - - CComPtr pLocationCollection; - CComPtr pLocation; - - BSTR bstrLocationPath = NULL; - - *ppLocation = NULL; - *pFound = FALSE; - - hr = GetLocationCollection( pAdminMgr, - szConfigPath, - &pLocationCollection ); - - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - DWORD count; - DWORD i; - VARIANT varIndex; - VariantInit( &varIndex ); - - hr = pLocationCollection->get_Count( &count ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - for( i = 0; i < count; i++ ) - { - varIndex.vt = VT_UI4; - varIndex.ulVal = i; - - hr = pLocationCollection->get_Item( varIndex, - &pLocation ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pLocation->get_Path( &bstrLocationPath ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - if( 0 == wcscmp ( szLocationPath, bstrLocationPath ) ) - { - *pFound = TRUE; - *ppLocation = pLocation.Detach(); - break; - } - - - pLocation.Release(); - - SysFreeString( bstrLocationPath ); - bstrLocationPath = NULL; - } - -exit: - - SysFreeString( bstrLocationPath ); - - return hr; -} - -HRESULT -GetSectionFromLocation( - IN IAppHostConfigLocation * pLocation, - IN CONST WCHAR * szSectionName, - OUT IAppHostElement ** ppSectionElement, - OUT BOOL * pFound - ) -{ - HRESULT hr = NOERROR; - - CComPtr pSectionElement; - - DWORD count; - DWORD i; - - VARIANT varIndex; - VariantInit( &varIndex ); - - BSTR bstrSectionName = NULL; - - *pFound = FALSE; - *ppSectionElement = NULL; - - hr = pLocation->get_Count( &count ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - for( i = 0; i < count; i++ ) - { - varIndex.vt = VT_UI4; - varIndex.ulVal = i; - - - hr = pLocation->get_Item( varIndex, - &pSectionElement ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pSectionElement->get_Name( &bstrSectionName ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - if( 0 == wcscmp ( szSectionName, bstrSectionName ) ) - { - *pFound = TRUE; - *ppSectionElement = pSectionElement.Detach(); - break; - } - - pSectionElement.Release(); - - SysFreeString( bstrSectionName ); - bstrSectionName = NULL; - } - -exit: - - SysFreeString( bstrSectionName ); - - return hr; -} - - -HRESULT -GetAdminElement( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName, - OUT IAppHostElement ** pElement -) -{ - HRESULT hr = S_OK; - BSTR bstrConfigPath = NULL; - BSTR bstrElementName = NULL; - - bstrConfigPath = SysAllocString(szConfigPath); - bstrElementName = SysAllocString(szElementName); - - if (bstrConfigPath == NULL || bstrElementName == NULL) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = pAdminMgr->GetAdminSection( bstrElementName, - bstrConfigPath, - pElement ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - if ( bstrElementName != NULL ) - { - SysFreeString(bstrElementName); - bstrElementName = NULL; - } - if ( bstrConfigPath != NULL ) - { - SysFreeString(bstrConfigPath); - bstrConfigPath = NULL; - } - - return hr; -} - - -HRESULT -ClearAdminElement( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pElement; - - hr = GetAdminElement( - pAdminMgr, - szConfigPath, - szElementName, - &pElement - ); - - if (FAILED(hr)) - { - if (hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND)) - { - hr = S_OK; - } - else - { - DBGERROR_HR(hr); - } - - goto exit; - } - - hr = pElement->Clear(); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - return hr; -} - - -HRESULT -ClearElementFromAllSites( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pSitesCollection; - CComPtr pSiteElement; - CComPtr pChildCollection; - ENUM_INDEX index; - BOOL found; - - // - // Enumerate the sites, remove the specified elements. - // - - hr = GetSitesCollection( - pAdminMgr, - szConfigPath, - &pSitesCollection - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - for (hr = FindFirstElement(pSitesCollection, &index, &pSiteElement) ; - SUCCEEDED(hr) ; - hr = FindNextElement(pSitesCollection, &index, &pSiteElement)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = pSiteElement->get_ChildElements(&pChildCollection); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (pChildCollection) - { - hr = ClearChildElementsByName( - pChildCollection, - szElementName, - &found - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - } - - pSiteElement.Release(); - } - -exit: - - return hr; - -} - - -HRESULT -ClearElementFromAllLocations( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pLocationCollection; - CComPtr pLocation; - CComPtr pChildCollection; - ENUM_INDEX index; - - // - // Enum the tags, remove the specified elements. - // - - hr = GetLocationCollection( - pAdminMgr, - szConfigPath, - &pLocationCollection - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - for (hr = FindFirstLocation(pLocationCollection, &index, &pLocation) ; - SUCCEEDED(hr) ; - hr = FindNextLocation(pLocationCollection, &index, &pLocation)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = ClearLocationElements(pLocation, szElementName); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - pLocation.Release(); - } - -exit: - - return hr; - -} - -HRESULT -ClearLocationElements( - IN IAppHostConfigLocation * pLocation, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pElement; - ENUM_INDEX index; - BOOL matched; - - for (hr = FindFirstLocationElement(pLocation, &index, &pElement) ; - SUCCEEDED(hr) ; - hr = FindNextLocationElement(pLocation, &index, &pElement)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = CompareElementName(pElement, szElementName, &matched); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (matched) - { - pElement->Clear(); - } - - pElement.Release(); - } - -exit: - - return hr; -} - -HRESULT -CompareElementName( - IN IAppHostElement * pElement, - IN CONST WCHAR * szNameToMatch, - OUT BOOL * pMatched - ) -{ - HRESULT hr; - BSTR bstrElementName = NULL; - - *pMatched = FALSE; // until proven otherwise - - hr = pElement->get_Name(&bstrElementName); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if( 0 == wcscmp ( szNameToMatch, bstrElementName ) ) - { - *pMatched = TRUE; - } - -exit: - - SysFreeString(bstrElementName); - return hr; -} - - -HRESULT -ClearChildElementsByName( - IN IAppHostChildElementCollection * pCollection, - IN CONST WCHAR * szElementName, - OUT BOOL * pFound - ) -{ - HRESULT hr; - CComPtr pElement; - ENUM_INDEX index; - BOOL matched; - - *pFound = FALSE; - - for (hr = FindFirstChildElement(pCollection, &index, &pElement) ; - SUCCEEDED(hr) ; - hr = FindNextChildElement(pCollection, &index, &pElement)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = CompareElementName(pElement, szElementName, &matched); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (matched) - { - hr = pElement->Clear(); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - *pFound = TRUE; - } - - pElement.Release(); - } - -exit: - - return hr; -} - - -HRESULT -GetSitesCollection( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - OUT IAppHostElementCollection ** pSitesCollection - ) -{ - HRESULT hr; - CComPtr pSitesElement; - BSTR bstrConfigPath; - BSTR bstrSitesSectionName; - - bstrConfigPath = SysAllocString(szConfigPath); - bstrSitesSectionName = SysAllocString(L"system.applicationHost/sites"); - *pSitesCollection = NULL; - - if (bstrConfigPath == NULL || bstrSitesSectionName == NULL) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - // - // Chase down the sites collection. - // - - hr = pAdminMgr->GetAdminSection( bstrSitesSectionName, - bstrConfigPath, - &pSitesElement ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pSitesElement->get_Collection(pSitesCollection); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - SysFreeString(bstrSitesSectionName); - SysFreeString(bstrConfigPath); - return hr; -} - - -HRESULT -GetLocationCollection( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - OUT IAppHostConfigLocationCollection ** pLocationCollection - ) -{ - HRESULT hr; - BSTR bstrConfigPath; - CComPtr pConfigMgr; - CComPtr pConfigFile; - - bstrConfigPath = SysAllocString(szConfigPath); - *pLocationCollection = NULL; - - if (bstrConfigPath == NULL) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = pAdminMgr->get_ConfigManager(&pConfigMgr); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pConfigMgr->GetConfigFile(bstrConfigPath, &pConfigFile); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pConfigFile->get_Locations(pLocationCollection); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - SysFreeString(bstrConfigPath); - return hr; -} - - -HRESULT -FindFirstElement( - IN IAppHostElementCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - hr = pCollection->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextElement(pCollection, pIndex, pElement); -} - -HRESULT -FindNextElement( - IN IAppHostElementCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - *pElement = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pCollection->get_Item(pIndex->Index, pElement); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -FindFirstChildElement( - IN IAppHostChildElementCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - hr = pCollection->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextChildElement(pCollection, pIndex, pElement); -} - -HRESULT -FindNextChildElement( - IN IAppHostChildElementCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - *pElement = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pCollection->get_Item(pIndex->Index, pElement); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -FindFirstLocation( - IN IAppHostConfigLocationCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostConfigLocation ** pLocation - ) -{ - HRESULT hr; - - hr = pCollection->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextLocation(pCollection, pIndex, pLocation); -} - -HRESULT -FindNextLocation( - IN IAppHostConfigLocationCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostConfigLocation ** pLocation - ) -{ - HRESULT hr; - - *pLocation = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pCollection->get_Item(pIndex->Index, pLocation); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -FindFirstLocationElement( - IN IAppHostConfigLocation * pLocation, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - hr = pLocation->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextLocationElement(pLocation, pIndex, pElement); -} - -HRESULT -FindNextLocationElement( - IN IAppHostConfigLocation * pLocation, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - *pElement = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pLocation->get_Item(pIndex->Index, pElement); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -GetSharedConfigEnabled( - BOOL * pfIsSharedConfig -) -/*++ - -Routine Description: - Search the configuration for the shared configuration property. - -Arguments: - - pfIsSharedConfig - true if shared configuration is enabled - -Return Value: - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - IAppHostAdminManager *pAdminManager = NULL; - - BSTR bstrSectionName = NULL; - BSTR bstrConfigPath = NULL; - - IAppHostElement * pConfigRedirSection = NULL; - - - bstrSectionName = SysAllocString( L"configurationRedirection" ); - - if ( bstrSectionName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - bstrConfigPath = SysAllocString( L"MACHINE/REDIRECTION" ); - if ( bstrConfigPath == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = CoCreateInstance( CLSID_AppHostAdminManager, - NULL, - CLSCTX_INPROC_SERVER, - IID_IAppHostAdminManager, - (VOID **)&pAdminManager ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pAdminManager->GetAdminSection( bstrSectionName, - bstrConfigPath, - &pConfigRedirSection ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = GetElementBoolProperty( pConfigRedirSection, - L"enabled", - pfIsSharedConfig ); - - if ( FAILED( hr ) ) - { - DBGERROR_HR(hr); - goto exit; - } - - pConfigRedirSection->Release(); - pConfigRedirSection = NULL; - - -exit: - - // - // dump config exception to setup log file (if available) - // - - if ( pConfigRedirSection != NULL ) - { - pConfigRedirSection->Release(); - } - - if ( pAdminManager != NULL ) - { - pAdminManager->Release(); - } - - if ( bstrConfigPath != NULL ) - { - SysFreeString( bstrConfigPath ); - } - - if ( bstrSectionName != NULL ) - { - SysFreeString( bstrSectionName ); - } - - return hr; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx deleted file mode 100644 index 26e601fac4b0..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -DWORD -Base64Encode( - __in_bcount(cbDecodedBufferSize) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt(cchEncodedStringSize) PWSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pDecodedBuffer (IN) - buffer to encode. - cbDecodedBufferSize (IN) - size of buffer to encode. - cchEncodedStringSize (IN) - size of the buffer for the encoded string. - pszEncodedString (OUT) = the encoded string. - pcchEncoded (OUT) - size in characters of the encoded string. - -Return Values: - - 0 - success. - E_OUTOFMEMORY - ---*/ -{ - static WCHAR rgchEncodeTable[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' - }; - - DWORD ib; - DWORD ich; - DWORD cchEncoded; - BYTE b0, b1, b2; - BYTE * pbDecodedBuffer = (BYTE *) pDecodedBuffer; - - // Calculate encoded string size. - cchEncoded = 1 + (cbDecodedBufferSize + 2) / 3 * 4; - - if (NULL != pcchEncoded) { - *pcchEncoded = cchEncoded; - } - - if (cchEncodedStringSize == 0 && pszEncodedString == NULL) { - return ERROR_SUCCESS; - } - - if (cchEncodedStringSize < cchEncoded) { - // Given buffer is too small to hold encoded string. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Encode data byte triplets into four-byte clusters. - ib = ich = 0; - while (ib < cbDecodedBufferSize) { - b0 = pbDecodedBuffer[ib++]; - b1 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - b2 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - - // - // The checks below for buffer overflow seems redundant to me. - // But it's the only way I can find to keep OACR quiet so it - // will have to do. - // - - pszEncodedString[ich++] = rgchEncodeTable[b0 >> 2]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b0 << 4) & 0x30) | ((b1 >> 4) & 0x0f)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b1 << 2) & 0x3c) | ((b2 >> 6) & 0x03)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[b2 & 0x3f]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - } - - // Pad the last cluster as necessary to indicate the number of data bytes - // it represents. - switch (cbDecodedBufferSize % 3) { - case 0: - break; - case 1: - pszEncodedString[ich - 2] = '='; - __fallthrough; - case 2: - pszEncodedString[ich - 1] = '='; - break; - } - - // Null-terminate the encoded string. - pszEncodedString[ich++] = '\0'; - - DBG_ASSERT(ich == cchEncoded); - - return ERROR_SUCCESS; -} - - -DWORD -Base64Decode( - __in PCWSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pszEncodedString (IN) - base64-encoded string to decode. - cbDecodeBufferSize (IN) - size in bytes of the decode buffer. - pbDecodeBuffer (OUT) - holds the decoded data. - pcbDecoded (OUT) - number of data bytes in the decoded data (if success or - STATUS_BUFFER_TOO_SMALL). - -Return Values: - - 0 - success. - E_OUTOFMEMORY - E_INVALIDARG - ---*/ -{ -#define NA (255) -#define DECODE(x) (((ULONG)(x) < sizeof(rgbDecodeTable)) ? rgbDecodeTable[x] : NA) - - static BYTE rgbDecodeTable[128] = { - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 0-15 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 16-31 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62, NA, NA, NA, 63, // 32-47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, NA, NA, NA, 0, NA, NA, // 48-63 - NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79 - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, NA, NA, NA, NA, NA, // 80-95 - NA, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111 - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NA, NA, NA, NA, NA, // 112-127 - }; - - DWORD cbDecoded; - DWORD cchEncodedSize; - DWORD ich; - DWORD ib; - BYTE b0, b1, b2, b3; - BYTE * pbDecodeBuffer = (BYTE *) pDecodeBuffer; - - cchEncodedSize = (DWORD)wcslen(pszEncodedString); - if (NULL != pcbDecoded) { - *pcbDecoded = 0; - } - - if ((0 == cchEncodedSize) || (0 != (cchEncodedSize % 4))) { - // Input string is not sized correctly to be base64. - return ERROR_INVALID_PARAMETER; - } - - // Calculate decoded buffer size. - cbDecoded = (cchEncodedSize + 3) / 4 * 3; - if (pszEncodedString[cchEncodedSize-1] == '=') { - if (pszEncodedString[cchEncodedSize-2] == '=') { - // Only one data byte is encoded in the last cluster. - cbDecoded -= 2; - } - else { - // Only two data bytes are encoded in the last cluster. - cbDecoded -= 1; - } - } - - if (NULL != pcbDecoded) { - *pcbDecoded = cbDecoded; - } - - if (cbDecodeBufferSize == 0 && pDecodeBuffer == NULL) { - return ERROR_SUCCESS; - } - - if (cbDecoded > cbDecodeBufferSize) { - // Supplied buffer is too small. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Decode each four-byte cluster into the corresponding three data bytes. - ich = ib = 0; - while (ich < cchEncodedSize) { - b0 = DECODE(pszEncodedString[ich]); ich++; - b1 = DECODE(pszEncodedString[ich]); ich++; - b2 = DECODE(pszEncodedString[ich]); ich++; - b3 = DECODE(pszEncodedString[ich]); ich++; - - if ((NA == b0) || (NA == b1) || (NA == b2) || (NA == b3)) { - // Contents of input string are not base64. - return ERROR_INVALID_PARAMETER; - } - - pbDecodeBuffer[ib++] = (b0 << 2) | (b1 >> 4); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b1 << 4) | (b2 >> 2); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b2 << 6) | b3; - } - } - } - - DBG_ASSERT(ib == cbDecoded); - - return ERROR_SUCCESS; -} - - -DWORD -Base64Encode( - __in_bcount(cbDecodedBufferSize) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt(cchEncodedStringSize) PSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pDecodedBuffer (IN) - buffer to encode. - cbDecodedBufferSize (IN) - size of buffer to encode. - cchEncodedStringSize (IN) - size of the buffer for the encoded string. - pszEncodedString (OUT) = the encoded string. - pcchEncoded (OUT) - size in characters of the encoded string. - -Return Values: - - 0 - success. - E_OUTOFMEMORY - ---*/ -{ - static CHAR rgchEncodeTable[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' - }; - - DWORD ib; - DWORD ich; - DWORD cchEncoded; - BYTE b0, b1, b2; - BYTE * pbDecodedBuffer = (BYTE *) pDecodedBuffer; - - // Calculate encoded string size. - cchEncoded = 1 + (cbDecodedBufferSize + 2) / 3 * 4; - - if (NULL != pcchEncoded) { - *pcchEncoded = cchEncoded; - } - - if (cchEncodedStringSize == 0 && pszEncodedString == NULL) { - return ERROR_SUCCESS; - } - - if (cchEncodedStringSize < cchEncoded) { - // Given buffer is too small to hold encoded string. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Encode data byte triplets into four-byte clusters. - ib = ich = 0; - while (ib < cbDecodedBufferSize) { - b0 = pbDecodedBuffer[ib++]; - b1 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - b2 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - - // - // The checks below for buffer overflow seems redundant to me. - // But it's the only way I can find to keep OACR quiet so it - // will have to do. - // - - pszEncodedString[ich++] = rgchEncodeTable[b0 >> 2]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b0 << 4) & 0x30) | ((b1 >> 4) & 0x0f)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b1 << 2) & 0x3c) | ((b2 >> 6) & 0x03)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[b2 & 0x3f]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - } - - // Pad the last cluster as necessary to indicate the number of data bytes - // it represents. - switch (cbDecodedBufferSize % 3) { - case 0: - break; - case 1: - pszEncodedString[ich - 2] = '='; - __fallthrough; - case 2: - pszEncodedString[ich - 1] = '='; - break; - } - - // Null-terminate the encoded string. - pszEncodedString[ich++] = '\0'; - - DBG_ASSERT(ich == cchEncoded); - - return ERROR_SUCCESS; -} - - -DWORD -Base64Decode( - __in PCSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pszEncodedString (IN) - base64-encoded string to decode. - cbDecodeBufferSize (IN) - size in bytes of the decode buffer. - pbDecodeBuffer (OUT) - holds the decoded data. - pcbDecoded (OUT) - number of data bytes in the decoded data (if success or - STATUS_BUFFER_TOO_SMALL). - -Return Values: - - 0 - success. - E_OUTOFMEMORY - E_INVALIDARG - ---*/ -{ -#define NA (255) -#define DECODE(x) (((ULONG)(x) < sizeof(rgbDecodeTable)) ? rgbDecodeTable[x] : NA) - - static BYTE rgbDecodeTable[128] = { - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 0-15 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 16-31 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62, NA, NA, NA, 63, // 32-47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, NA, NA, NA, 0, NA, NA, // 48-63 - NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79 - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, NA, NA, NA, NA, NA, // 80-95 - NA, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111 - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NA, NA, NA, NA, NA, // 112-127 - }; - - DWORD cbDecoded; - DWORD cchEncodedSize; - DWORD ich; - DWORD ib; - BYTE b0, b1, b2, b3; - BYTE * pbDecodeBuffer = (BYTE *) pDecodeBuffer; - - cchEncodedSize = (DWORD)strlen(pszEncodedString); - if (NULL != pcbDecoded) { - *pcbDecoded = 0; - } - - if ((0 == cchEncodedSize) || (0 != (cchEncodedSize % 4))) { - // Input string is not sized correctly to be base64. - return ERROR_INVALID_PARAMETER; - } - - // Calculate decoded buffer size. - cbDecoded = (cchEncodedSize + 3) / 4 * 3; - if (pszEncodedString[cchEncodedSize-1] == '=') { - if (pszEncodedString[cchEncodedSize-2] == '=') { - // Only one data byte is encoded in the last cluster. - cbDecoded -= 2; - } - else { - // Only two data bytes are encoded in the last cluster. - cbDecoded -= 1; - } - } - - if (NULL != pcbDecoded) { - *pcbDecoded = cbDecoded; - } - - if (cbDecodeBufferSize == 0 && pDecodeBuffer == NULL) { - return ERROR_SUCCESS; - } - - if (cbDecoded > cbDecodeBufferSize) { - // Supplied buffer is too small. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Decode each four-byte cluster into the corresponding three data bytes. - ich = ib = 0; - while (ich < cchEncodedSize) { - b0 = DECODE(pszEncodedString[ich]); ich++; - b1 = DECODE(pszEncodedString[ich]); ich++; - b2 = DECODE(pszEncodedString[ich]); ich++; - b3 = DECODE(pszEncodedString[ich]); ich++; - - if ((NA == b0) || (NA == b1) || (NA == b2) || (NA == b3)) { - // Contents of input string are not base64. - return ERROR_INVALID_PARAMETER; - } - - pbDecodeBuffer[ib++] = (b0 << 2) | (b1 >> 4); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b1 << 4) | (b2 >> 2); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b2 << 6) | b3; - } - } - } - - DBG_ASSERT(ib == cbDecoded); - - return ERROR_SUCCESS; -} - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx deleted file mode 100644 index a856b997f1b9..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -static const CHAR* s_rgchMonths[] = { - "Jan", "Feb", "Mar", "Apr", - "May", "Jun", "Jul", "Aug", - "Sep", "Oct", "Nov", "Dec" -}; - -// Custom hash table for make_month() for mapping "Apr" to 4 -static const CHAR MonthIndexTable[64] = { - -1,'A', 2, 12, -1, -1, -1, 8, // A to G - -1, -1, -1, -1, 7, -1,'N', -1, // F to O - 9, -1,'R', -1, 10, -1, 11, -1, // P to W - -1, 5, -1, -1, -1, -1, -1, -1, // X to Z - -1,'A', 2, 12, -1, -1, -1, 8, // a to g - -1, -1, -1, -1, 7, -1,'N', -1, // f to o - 9, -1,'R', -1, 10, -1, 11, -1, // p to w - -1, 5, -1, -1, -1, -1, -1, -1 // x to z -}; - -static const BYTE TensDigit[10] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 }; - -WORD -iis_2atoi( - __in_ecount(2) PCHAR s - ) -/*++ - - Converts a 2 character string to integer - - Arguments: - s String to convert - - Returns: - numeric equivalent, 0 on failure. ---*/ -{ - - DWORD tens = s[0] - '0'; - DWORD ones = s[1] - '0'; - - if ( (tens <= 9) && (ones <= 9) ) { - return((WORD)(TensDigit[tens] + ones)); - } - return(0); -} - -WORD -make_month( - __in_ecount(3) PCHAR s - ) -{ - UCHAR monthIndex; - UCHAR c; - LPCSTR monthString; - - // - // use the third character as the index - // - - c = (s[2] - 0x40) & 0x3F; - - monthIndex = MonthIndexTable[c]; - - if ( monthIndex < 13 ) { - goto verify; - } - - // - // ok, we need to look at the second character - // - - if ( monthIndex == 'N' ) { - - // - // we got an N which we need to resolve further - // - - // - // if s[1] is 'u' then Jun, if 'a' then Jan - // - - if ( MonthIndexTable[(s[1]-0x40) & 0x3f] == 'A' ) { - monthIndex = 1; - } else { - monthIndex = 6; - } - - } else if ( monthIndex == 'R' ) { - - // - // if s[1] is 'a' then March, if 'p' then April - // - - if ( MonthIndexTable[(s[1]-0x40) & 0x3f] == 'A' ) { - monthIndex = 3; - } else { - monthIndex = 4; - } - } else { - goto error_exit; - } - -verify: - - monthString = s_rgchMonths[monthIndex-1]; - - if ( (s[0] == monthString[0]) && - (s[1] == monthString[1]) && - (s[2] == monthString[2]) ) { - - return(monthIndex); - - } else if ( (toupper(s[0]) == monthString[0]) && - (tolower(s[1]) == monthString[1]) && - (tolower(s[2]) == monthString[2]) ) { - - return monthIndex; - } - -error_exit: - return(0); - -} // make_month - -BOOL -StringTimeToFileTime( - IN const CHAR * pszTime, - OUT ULONGLONG * pulTime - ) -/*++ - - Converts a string representation of a GMT time (three different - varieties) to an NT representation of a file time. - - We handle the following variations: - - Sun, 06 Nov 1994 08:49:37 GMT (RFC 822 updated by RFC 1123) - Sunday, 06-Nov-94 08:49:37 GMT (RFC 850) - Sun Nov 6 08:49:37 1994 (ANSI C's asctime() format - - Arguments: - pszTime String representation of time field - pliTime large integer containing the time in NT format. - - Returns: - TRUE on success and FALSE on failure. - - History: - - Johnl 24-Jan-1995 Modified from WWW library - ---*/ -{ - - CHAR * s; - SYSTEMTIME st; - - if (pszTime == NULL) { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - - st.wMilliseconds = 0; - - if ((s = (CHAR*) strchr(pszTime, ','))) { - - DWORD len; - - // - // Thursday, 10-Jun-93 01:29:59 GMT - // or: Thu, 10 Jan 1993 01:29:59 GMT */ - // - - s++; - - while (*s && *s==' ') s++; - len = (DWORD)strlen(s); - - if (len < 18) { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - - if ( *(s+2) == '-' ) { /* First format */ - - st.wDay = (WORD) atoi(s); - st.wMonth = (WORD) make_month(s+3); - st.wYear = (WORD) atoi(s+7); - st.wHour = (WORD) atoi(s+10); - st.wMinute = (WORD) atoi(s+13); - st.wSecond = (WORD) atoi(s+16); - - } else { /* Second format */ - - if (len < 20) { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - - st.wDay = iis_2atoi(s); - st.wMonth = make_month(s+3); - st.wYear = iis_2atoi(s+7) * 100 + iis_2atoi(s+9); - st.wHour = iis_2atoi(s+12); - st.wMinute = iis_2atoi(s+15); - st.wSecond = iis_2atoi(s+18); - - } - } else { /* Try the other format: Wed Jun 9 01:29:59 1993 GMT */ - - s = (CHAR *) pszTime; - while (*s && *s==' ') s++; - - if ((int)strlen(s) < 24) { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - - st.wDay = (WORD) atoi(s+8); - st.wMonth = (WORD) make_month(s+4); - st.wYear = (WORD) atoi(s+20); - st.wHour = (WORD) atoi(s+11); - st.wMinute = (WORD) atoi(s+14); - st.wSecond = (WORD) atoi(s+17); - } - - // - // Adjust for dates with only two digits - // - - if ( st.wYear < 1000 ) { - if ( st.wYear < 50 ) { - st.wYear += 2000; - } else { - st.wYear += 1900; - } - } - - if (!SystemTimeToFileTime(&st, (FILETIME *)pulTime)) { - return FALSE; - } - return(TRUE); -} - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx deleted file mode 100644 index 26eacdb24446..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - - -//#include -#include -//# include - -#include - -// -// Private Definitions -// - -#define MAXULONG 4294967295 -#define ISWHITE( ch ) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\r') - -// -// When appending data, this is the extra amount we request to avoid -// reallocations -// -#define STR_SLOP 128 - - -DWORD -MULTISZ::CalcLength( const WCHAR * str, - LPDWORD pcStrings ) -{ - DWORD count = 0; - DWORD total = 1; - DWORD len; - - while( *str ) { - len = (DWORD)(::wcslen( str ) + 1); - total += len; - str += len; - count++; - } - - if( pcStrings != NULL ) { - *pcStrings = count; - } - - return total; - -} // MULTISZ::CalcLength - - -BOOL -MULTISZ::FindString( const WCHAR * str ) -{ - - WCHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !::wcscmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += ::wcslen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZ::FindString - - -BOOL -MULTISZ::FindStringNoCase( const WCHAR * str ) -{ - - WCHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !_wcsicmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += wcslen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZ::FindStringNoCase - - -VOID -MULTISZ::AuxInit( const WCHAR * pInit ) -{ - BOOL fRet; - - if ( pInit ) - { - DWORD cStrings; - int cbCopy = CalcLength( pInit, &cStrings ) * sizeof(WCHAR); - fRet = Resize( cbCopy ); - - if ( fRet ) { - CopyMemory( QueryPtr(), pInit, cbCopy ); - m_cchLen = (cbCopy)/sizeof(WCHAR); - m_cStrings = cStrings; - } else { -// BUFFER::SetValid( FALSE); - } - - } else { - - Reset(); - - } - -} // MULTISZ::AuxInit() - - -/******************************************************************* - - NAME: MULTISZ::AuxAppend - - SYNOPSIS: Appends the string onto the multisz. - - ENTRY: Object to append -********************************************************************/ - -BOOL MULTISZ::AuxAppend( const WCHAR * pStr, UINT cbStr, BOOL fAddSlop ) -{ - DBG_ASSERT( pStr != NULL ); - - UINT cbThis = QueryCB(); - - DBG_ASSERT( cbThis >= 2 ); - - if( cbThis == 4 ) { - - // - // It's empty, so start at the beginning. - // - - cbThis = 0; - - } else { - - // - // It's not empty, so back up over the final terminating NULL. - // - - cbThis -= sizeof(WCHAR); - - } - - // - // Only resize when we have to. When we do resize, we tack on - // some extra space to avoid extra reallocations. - // - // Note: QuerySize returns the requested size of the string buffer, - // *not* the strlen of the buffer - // - - //AcIncrement( CacMultiszAppend); - - // - // Check for the arithmetic overflow - // - // ( 2 * sizeof( WCHAR ) ) is for the double terminator - // - ULONGLONG cb64Required = (ULONGLONG)cbThis + cbStr + 2 * sizeof(WCHAR); - if ( cb64Required > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( QuerySize() < (DWORD) cb64Required ) - { - ULONGLONG cb64AllocSize = cb64Required + (fAddSlop ? STR_SLOP : 0 ); - // - // Check for the arithmetic overflow - // - if ( cb64AllocSize > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( !Resize( (DWORD) cb64AllocSize ) ) - return FALSE; - } - - // copy the exact string and tack on the double terminator - memcpy( (BYTE *) QueryPtr() + cbThis, - pStr, - cbStr); - *(WCHAR *)((BYTE *)QueryPtr() + cbThis + cbStr) = L'\0'; - *(WCHAR *)((BYTE *)QueryPtr() + cbThis + cbStr + sizeof(WCHAR) ) = L'\0'; - - m_cchLen = CalcLength( (const WCHAR *)QueryPtr(), &m_cStrings ); - return TRUE; - -} // MULTISZ::AuxAppend() - - -#if 0 - -BOOL -MULTISZ::CopyToBuffer( WCHAR * lpszBuffer, LPDWORD lpcch) const -/*++ - Description: - Copies the string into the WCHAR buffer passed in if the buffer - is sufficient to hold the translated string. - If the buffer is small, the function returns small and sets *lpcch - to contain the required number of characters. - - Arguments: - lpszBuffer pointer to WCHAR buffer which on return contains - the UNICODE version of string on success. - lpcch pointer to DWORD containing the length of the buffer. - If *lpcch == 0 then the function returns TRUE with - the count of characters required stored in *lpcch. - Also in this case lpszBuffer is not affected. - Returns: - TRUE on success. - FALSE on failure. Use GetLastError() for further details. - - History: - MuraliK 11-30-94 ---*/ -{ - BOOL fReturn = TRUE; - - if ( lpcch == NULL) { - SetLastError( ERROR_INVALID_PARAMETER); - return ( FALSE); - } - - if ( *lpcch == 0) { - - // - // Inquiring the size of buffer alone - // - *lpcch = QueryCCH() + 1; // add one character for terminating null - } else { - - // - // Copy after conversion from ANSI to Unicode - // - int iRet; - iRet = MultiByteToWideChar( CP_ACP, - MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, - QueryStrA(), QueryCCH() + 1, - lpszBuffer, (int )*lpcch); - - if ( iRet == 0 || iRet != (int ) *lpcch) { - - // - // Error in conversion. - // - fReturn = FALSE; - } - } - - return ( fReturn); -} // MULTISZ::CopyToBuffer() -#endif - -BOOL -MULTISZ::CopyToBuffer( __out_ecount_opt(*lpcch) WCHAR * lpszBuffer, LPDWORD lpcch) const -/*++ - Description: - Copies the string into the WCHAR buffer passed in if the buffer - is sufficient to hold the translated string. - If the buffer is small, the function returns small and sets *lpcch - to contain the required number of characters. - - Arguments: - lpszBuffer pointer to WCHAR buffer which on return contains - the string on success. - lpcch pointer to DWORD containing the length of the buffer. - If *lpcch == 0 then the function returns TRUE with - the count of characters required stored in lpcch. - Also in this case lpszBuffer is not affected. - Returns: - TRUE on success. - FALSE on failure. Use GetLastError() for further details. - - History: - MuraliK 20-Nov-1996 ---*/ -{ - BOOL fReturn = TRUE; - - if ( lpcch == NULL) { - SetLastError( ERROR_INVALID_PARAMETER); - return ( FALSE); - } - - register DWORD cch = QueryCCH(); - - if ( *lpcch >= cch) { - - DBG_ASSERT( lpszBuffer); - memcpy( lpszBuffer, QueryStr(), cch * sizeof(WCHAR)); - } else { - DBG_ASSERT( *lpcch < cch); - SetLastError( ERROR_INSUFFICIENT_BUFFER); - fReturn = FALSE; - } - - *lpcch = cch; - - return ( fReturn); -} // MULTISZ::CopyToBuffer() - -BOOL -MULTISZ::Equals( - MULTISZ* pmszRhs -) -// -// Compares this to pmszRhs, returns TRUE if equal -// -{ - DBG_ASSERT( NULL != pmszRhs ); - - PCWSTR pszLhs = First( ); - PCWSTR pszRhs = pmszRhs->First( ); - - if( m_cStrings != pmszRhs->m_cStrings ) - { - return FALSE; - } - - while( NULL != pszLhs ) - { - DBG_ASSERT( NULL != pszRhs ); - - if( 0 != wcscmp( pszLhs, pszRhs ) ) - { - return FALSE; - } - - pszLhs = Next( pszLhs ); - pszRhs = pmszRhs->Next( pszRhs ); - } - - return TRUE; -} - -HRESULT -SplitCommaDelimitedString( - PCWSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZ * pmszList -) -/*++ - -Routine Description: - - Split comma delimited string into a multisz. Additional leading empty - entries after the first are discarded. - -Arguments: - - pszList - List to split up - fTrimEntries - Whether each entry should be trimmed before added to multisz - fRemoveEmptyEntries - Whether empty entires should be discarded - pmszList - Filled with MULTISZ list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - - if ( pszList == NULL || - pmszList == NULL ) - { - DBG_ASSERT( FALSE ); - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - pmszList->Reset(); - - /* - pszCurrent: start of the current entry which may be the comma that - precedes the next entry if the entry is empty - - pszNext: the comma that precedes the next entry. If - pszCurrent == pszNext, then the entry is empty - - pszEnd: just past the end of the current entry - */ - - for ( PCWSTR pszCurrent = pszList, - pszNext = wcschr( pszCurrent, L',' ) - ; - ; - pszCurrent = pszNext + 1, - pszNext = wcschr( pszCurrent, L',' ) ) - { - PCWSTR pszEnd = NULL; - - if ( pszNext != NULL ) - { - pszEnd = pszNext; - } - else - { - pszEnd = pszCurrent + wcslen( pszCurrent ); - } - - if ( fTrimEntries ) - { - while ( pszCurrent < pszEnd && ISWHITE( pszCurrent[ 0 ] ) ) - { - pszCurrent++; - } - - while ( pszEnd > pszCurrent && ISWHITE( pszEnd[ -1 ] ) ) - { - pszEnd--; - } - } - - if ( pszCurrent != pszEnd || !fRemoveEmptyEntries ) - { - if ( !pmszList->Append( pszCurrent, (DWORD) ( pszEnd - pszCurrent ) ) ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - } - - if ( pszNext == NULL ) - { - break; - } - } - -Finished: - - return hr; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx deleted file mode 100644 index e6972534bbac..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - - -//#include -#include -//# include - -#include - -// -// Private Definitions -// - -#define MAXULONG 4294967295 -#define ISWHITE( ch ) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\r') - -// -// When appending data, this is the extra amount we request to avoid -// reallocations -// -#define STR_SLOP 128 - - -DWORD -MULTISZA::CalcLength( const CHAR * str, - LPDWORD pcStrings ) -{ - DWORD count = 0; - DWORD total = 1; - DWORD len; - - while( *str ) { - len = (DWORD)(::strlen( str ) + 1); - total += len; - str += len; - count++; - } - - if( pcStrings != NULL ) { - *pcStrings = count; - } - - return total; - -} // MULTISZA::CalcLength - - -BOOL -MULTISZA::FindString( const CHAR * str ) -{ - - CHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !::strcmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += ::strlen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZA::FindString - - -BOOL -MULTISZA::FindStringNoCase( const CHAR * str ) -{ - - CHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !_stricmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += strlen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZA::FindStringNoCase - - -VOID -MULTISZA::AuxInit( const CHAR * pInit ) -{ - BOOL fRet; - - if ( pInit ) - { - DWORD cStrings; - int cbCopy = CalcLength( pInit, &cStrings ) * sizeof(CHAR); - fRet = Resize( cbCopy ); - - if ( fRet ) { - CopyMemory( QueryPtr(), pInit, cbCopy ); - m_cchLen = (cbCopy)/sizeof(CHAR); - m_cStrings = cStrings; - } else { -// BUFFER::SetValid( FALSE); - } - - } else { - - Reset(); - - } - -} // MULTISZA::AuxInit() - - -/******************************************************************* - - NAME: MULTISZA::AuxAppend - - SYNOPSIS: Appends the string onto the MULTISZA. - - ENTRY: Object to append -********************************************************************/ - -BOOL MULTISZA::AuxAppend( const CHAR * pStr, UINT cbStr, BOOL fAddSlop ) -{ - DBG_ASSERT( pStr != NULL ); - - UINT cbThis = QueryCB(); - - if( cbThis == 2 ) { - - // - // It's empty, so start at the beginning. - // - - cbThis = 0; - - } else { - - // - // It's not empty, so back up over the final terminating NULL. - // - - cbThis -= sizeof(CHAR); - - } - - // - // Only resize when we have to. When we do resize, we tack on - // some extra space to avoid extra reallocations. - // - // Note: QuerySize returns the requested size of the string buffer, - // *not* the strlen of the buffer - // - - //AcIncrement( CacMultiszAppend); - - // - // Check for the arithmetic overflow - // - // ( 2 * sizeof( CHAR ) ) is for the double terminator - // - ULONGLONG cb64Required = (ULONGLONG)cbThis + cbStr + 2 * sizeof(CHAR); - if ( cb64Required > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( QuerySize() < (DWORD) cb64Required ) - { - ULONGLONG cb64AllocSize = cb64Required + (fAddSlop ? STR_SLOP : 0 ); - // - // Check for the arithmetic overflow - // - if ( cb64AllocSize > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( !Resize( (DWORD) cb64AllocSize ) ) - return FALSE; - } - - // copy the exact string and tack on the double terminator - memcpy( (BYTE *) QueryPtr() + cbThis, - pStr, - cbStr); - *(CHAR *)((BYTE *)QueryPtr() + cbThis + cbStr) = L'\0'; - *(CHAR *)((BYTE *)QueryPtr() + cbThis + cbStr + sizeof(CHAR) ) = L'\0'; - - m_cchLen = CalcLength( (const CHAR *)QueryPtr(), &m_cStrings ); - return TRUE; - -} // MULTISZA::AuxAppend() - -BOOL -MULTISZA::CopyToBuffer( __out_ecount_opt(*lpcch) CHAR * lpszBuffer, LPDWORD lpcch) const -/*++ - Description: - Copies the string into the CHAR buffer passed in if the buffer - is sufficient to hold the translated string. - If the buffer is small, the function returns small and sets *lpcch - to contain the required number of characters. - - Arguments: - lpszBuffer pointer to CHAR buffer which on return contains - the string on success. - lpcch pointer to DWORD containing the length of the buffer. - If *lpcch == 0 then the function returns TRUE with - the count of characters required stored in lpcch. - Also in this case lpszBuffer is not affected. - Returns: - TRUE on success. - FALSE on failure. Use GetLastError() for further details. - - History: - MuraliK 20-Nov-1996 ---*/ -{ - BOOL fReturn = TRUE; - - if ( lpcch == NULL) { - SetLastError( ERROR_INVALID_PARAMETER); - return ( FALSE); - } - - register DWORD cch = QueryCCH(); - - if ( *lpcch >= cch) { - - DBG_ASSERT( lpszBuffer); - memcpy( lpszBuffer, QueryStr(), cch * sizeof(CHAR)); - } else { - DBG_ASSERT( *lpcch < cch); - SetLastError( ERROR_INSUFFICIENT_BUFFER); - fReturn = FALSE; - } - - *lpcch = cch; - - return ( fReturn); -} // MULTISZA::CopyToBuffer() - -BOOL -MULTISZA::Equals( - MULTISZA* pmszRhs -) -// -// Compares this to pmszRhs, returns TRUE if equal -// -{ - DBG_ASSERT( NULL != pmszRhs ); - - PCSTR pszLhs = First( ); - PCSTR pszRhs = pmszRhs->First( ); - - if( m_cStrings != pmszRhs->m_cStrings ) - { - return FALSE; - } - - while( NULL != pszLhs ) - { - DBG_ASSERT( NULL != pszRhs ); - - if( 0 != strcmp( pszLhs, pszRhs ) ) - { - return FALSE; - } - - pszLhs = Next( pszLhs ); - pszRhs = pmszRhs->Next( pszRhs ); - } - - return TRUE; -} - -HRESULT -SplitCommaDelimitedString( - PCSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZA * pmszList -) -/*++ - -Routine Description: - - Split comma delimited string into a MULTISZA. Additional leading empty - entries after the first are discarded. - -Arguments: - - pszList - List to split up - fTrimEntries - Whether each entry should be trimmed before added to MULTISZA - fRemoveEmptyEntries - Whether empty entires should be discarded - pmszList - Filled with MULTISZA list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - - if ( pszList == NULL || - pmszList == NULL ) - { - DBG_ASSERT( FALSE ); - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - pmszList->Reset(); - - /* - pszCurrent: start of the current entry which may be the comma that - precedes the next entry if the entry is empty - - pszNext: the comma that precedes the next entry. If - pszCurrent == pszNext, then the entry is empty - - pszEnd: just past the end of the current entry - */ - - for ( PCSTR pszCurrent = pszList, - pszNext = strchr( pszCurrent, L',' ) - ; - ; - pszCurrent = pszNext + 1, - pszNext = strchr( pszCurrent, L',' ) ) - { - PCSTR pszEnd = NULL; - - if ( pszNext != NULL ) - { - pszEnd = pszNext; - } - else - { - pszEnd = pszCurrent + strlen( pszCurrent ); - } - - if ( fTrimEntries ) - { - while ( pszCurrent < pszEnd && ISWHITE( pszCurrent[ 0 ] ) ) - { - pszCurrent++; - } - - while ( pszEnd > pszCurrent && ISWHITE( pszEnd[ -1 ] ) ) - { - pszEnd--; - } - } - - if ( pszCurrent != pszEnd || !fRemoveEmptyEntries ) - { - if ( !pmszList->Append( pszCurrent, (DWORD) ( pszEnd - pszCurrent ) ) ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - } - - if ( pszNext == NULL ) - { - break; - } - } - -Finished: - - return hr; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx deleted file mode 100644 index 48b41fdd1c84..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx +++ /dev/null @@ -1,890 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" -#include "normalize.h" -#include "stringa.h" - -BOOL g_fEnableNonUTF8; -BOOL g_fEnableDBCS; -BOOL g_fIsSystemDBCS; -static BOOL g_fFavorDBCS; - -#ifndef STACK_STRA -#define STACK_STRA(name, size) CHAR __ach##name[size]; \ - STRA name(__ach##name, sizeof(__ach##name) / sizeof(CHAR)) -#endif - -HRESULT -InitializeNormalizeUrl( - VOID -) -{ - HKEY hKey; - DWORD dwType; - DWORD dwData; - DWORD cbData; - WORD wPrimaryLangID; - - // - // Read the registry settings on how to handle URLs - // - - g_fEnableNonUTF8 = TRUE; - g_fEnableDBCS = FALSE; - g_fFavorDBCS = FALSE; - - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, - L"System\\CurrentControlSet\\Services\\http\\Parameters", - 0, - KEY_READ, - &hKey ) == ERROR_SUCCESS ) - { - cbData = sizeof( dwData ); - if ( RegQueryValueEx( hKey, - L"EnableNonUTF8", - NULL, - &dwType, - (LPBYTE) &dwData, - &cbData ) == ERROR_SUCCESS && - dwType == REG_DWORD ) - { - g_fEnableNonUTF8 = !!dwData; - } - - if ( g_fEnableNonUTF8 ) - { - cbData = sizeof( dwData ); - - if ( RegQueryValueEx( hKey, - L"EnableDBCS", - NULL, - &dwType, - (LPBYTE) &dwData, - &cbData ) == ERROR_SUCCESS && - dwType == REG_DWORD ) - { - g_fEnableDBCS = !!dwData; - } - } - else - { - g_fEnableDBCS = FALSE; - } - - if ( g_fEnableDBCS ) - { - cbData = sizeof( dwData ); - - if ( RegQueryValueEx( hKey, - L"FavorDBCS", - NULL, - &dwType, - (LPBYTE) &dwData, - &cbData ) == ERROR_SUCCESS && - dwType == REG_DWORD ) - { - g_fFavorDBCS = !!dwData; - } - } - else - { - g_fFavorDBCS = FALSE; - } - - RegCloseKey( hKey ); - } - - - wPrimaryLangID = PRIMARYLANGID( GetSystemDefaultLangID() ); - - g_fIsSystemDBCS = ( wPrimaryLangID == LANG_JAPANESE || - wPrimaryLangID == LANG_CHINESE || - wPrimaryLangID == LANG_KOREAN ); - - return NO_ERROR; -} - -// -// Private constants. -// - -#define ACTION_NOTHING 0x00000000 -#define ACTION_EMIT_CH 0x00010000 -#define ACTION_EMIT_DOT_CH 0x00020000 -#define ACTION_EMIT_DOT_DOT_CH 0x00030000 -#define ACTION_BACKUP 0x00040000 -#define ACTION_MASK 0xFFFF0000 - - -// -// Private globals. -// - -INT p_StateTable[16] = - { - // state 0 - 0 , // other - 0 , // "." - 4 , // EOS - 1 , // "\" - - // state 1 - 0 , // other - 2 , // "." - 4 , // EOS - 1 , // "\" - - // state 2 - 0 , // other - 3 , // "." - 4 , // EOS - 1 , // "\" - - // state 3 - 0 , // other - 0 , // "." - 4 , // EOS - 1 // "\" - }; - - - -INT p_ActionTable[16] = - { - // state 0 - ACTION_EMIT_CH, // other - ACTION_EMIT_CH, // "." - ACTION_EMIT_CH, // EOS - ACTION_EMIT_CH, // "\" - - // state 1 - ACTION_EMIT_CH, // other - ACTION_NOTHING, // "." - ACTION_EMIT_CH, // EOS - ACTION_NOTHING, // "\" - - // state 2 - ACTION_EMIT_DOT_CH, // other - ACTION_NOTHING, // "." - ACTION_EMIT_CH, // EOS - ACTION_NOTHING, // "\" - - // state 3 - ACTION_EMIT_DOT_DOT_CH, // other - ACTION_EMIT_DOT_DOT_CH, // "." - ACTION_BACKUP, // EOS - ACTION_BACKUP // "\" - }; - -// since max states = 4, we calculat the index by multiplying with 4. -# define IndexFromState( st) ( (st) * 4) - - -// the following table provides the index for various ISA Latin1 characters -// in the incoming URL. -// It assumes that the URL is ISO Latin1 == ASCII -INT p_rgIndexForChar[] = { - - 2, // null char - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 thru 10 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 11 thru 20 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 21 thru 30 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 31 thru 40 - 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, // 41 thru 50 46 = '.' 47 = '/' - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 51 thru 60 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 61 thru 70 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 71 thru 80 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 81 thru 90 - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, // 91 thru 100 92 = '\\' - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 101 thru 110 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 111 thru 120 - 0, 0, 0, 0, 0, 0, 0, 0 // 121 thru 128 -}; - -#define IS_UTF8_TRAILBYTE(ch) (((ch) & 0xc0) == 0x80) - - -/******************************************************************* - - NAME: IsUTF8URL - - ENTRY: pszPath - The path to sanitize. - - HISTORY: - atsusk 06-Jan-1998 Created. - -********************************************************************/ - -BOOL IsUTF8URL(__in LPSTR pszPath) -{ - CHAR ch; - - if ( g_fFavorDBCS ) - { - return ( MultiByteToWideChar( CP_ACP, - MB_ERR_INVALID_CHARS, - pszPath, - -1, - NULL, - 0) == 0); - } - - while (ch = *pszPath++) { - - if (ch & 0x80) { - wchar_t wch; - int iLen; - BOOL bDefault = FALSE; - char chTrail1; - char chTrail2; - - chTrail1 = *pszPath++; - if (chTrail1) { - chTrail2 = *pszPath; - } else { - chTrail2 = 0; - } - - if ( ((ch & 0xF0) == 0xE0) && - IS_UTF8_TRAILBYTE(chTrail1) && - IS_UTF8_TRAILBYTE(chTrail2) ) { - - // handle three byte case - // 1110xxxx 10xxxxxx 10xxxxxx - wch = (wchar_t) (((ch & 0x0f) << 12) | - ((chTrail1 & 0x3f) << 6) | - (chTrail2 & 0x3f)); - pszPath++; - - } else - if ( ((ch & 0xE0) == 0xC0) && - IS_UTF8_TRAILBYTE(chTrail1) ) { - - // handle two byte case - // 110xxxxx 10xxxxxx - - wch = (wchar_t) (((ch & 0x1f) << 6) | (chTrail1 & 0x3f)); - - } else - return FALSE; - - iLen = WideCharToMultiByte( CP_ACP, - WC_NO_BEST_FIT_CHARS, - &wch, - 1, - NULL, - 0, - NULL, - &bDefault ); - - if (bDefault == TRUE || iLen == 0 || iLen > 2) - return FALSE; - } - } - - return TRUE; -} // IsUTF8URL() - - -/******************************************************************* - - NAME: CanonURL - - SYNOPSIS: Sanitizes a path by removing bogus path elements. - - As expected, "/./" entries are simply removed, and - "/../" entries are removed along with the previous - path element. - - To maintain compatibility with URL path semantics - additional transformations are required. All backward - slashes "\\" are converted to forward slashes. Any - repeated forward slashes (such as "///") are mapped to - single backslashes. - - A state table (see the p_StateTable global at the - beginning of this file) is used to perform most of - the transformations. The table's rows are indexed - by current state, and the columns are indexed by - the current character's "class" (either slash, dot, - NULL, or other). Each entry in the table consists - of the new state tagged with an action to perform. - See the ACTION_* constants for the valid action - codes. - - ENTRY: pszPath - The path to sanitize. - fIsDBCSLocale - Indicates the server is in a - locale that uses DBCS. - - HISTORY: - KeithMo 07-Sep-1994 Created. - MuraliK 28-Apr-1995 Adopted this for symbolic paths - -********************************************************************/ -INT -CanonURL( - __inout LPSTR pszPath, - BOOL fIsDBCSLocale - ) -{ - UCHAR * pszSrc; - UCHAR * pszDest; - DWORD ch; - INT index; - BOOL fDBCS = FALSE; - DWORD cchMultiByte = 0; - - DBG_ASSERT( pszPath != NULL ); - - // - // Always look for UTF8 except when DBCS characters are detected - // - BOOL fScanForUTF8 = IsUTF8URL(pszPath); - - // If fScanForUTF8 is true, this URL is UTF8. don't recognize DBCS. - if (fIsDBCSLocale && fScanForUTF8) { - fIsDBCSLocale = FALSE; - } - - // - // Start our scan at the first character - // - - pszSrc = pszDest = (UCHAR *) pszPath; - - // - // State 0 is the initial state. - // - index = 0; // State = 0 - - // - // Loop until we enter state 4 (the final, accepting state). - // - - do { - - // - // Grab the next character from the path and compute its - // next state. While we're at it, map any forward - // slashes to backward slashes. - // - - index = IndexFromState( p_StateTable[index]); // 4 = # states - ch = (DWORD ) *pszSrc++; - - // - // If this is a DBCS trailing byte - skip it - // - - if ( !fIsDBCSLocale ) - { - index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]); - } - else - { - if ( fDBCS ) - { - // - // If this is a 0 terminator, we need to set next - // state accordingly - // - - if ( ch == 0 ) - { - index += p_rgIndexForChar[ ch ]; - } - - // - // fDBCS == TRUE means this byte was a trail byte. - // index is implicitly set to zero. - // - fDBCS = FALSE; - } - else - { - index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]); - - if ( IsDBCSLeadByte( (UCHAR)ch ) ) - { - // - // This is a lead byte, so the next is a trail. - // - fDBCS = TRUE; - } - } - } - - // - // Interesting UTF8 characters always have the top bit set - // - - if ( (ch & 0x80) && fScanForUTF8 ) - { - wchar_t wch; - UCHAR mbstr[2]; - - // - // This is a UTF8 character, convert it here. - // index is implicitly set to zero. - // - if ( cchMultiByte < 2 ) - { - char chTrail1; - char chTrail2; - - chTrail1 = *pszSrc; - if (chTrail1) { - chTrail2 = *(pszSrc+1); - } else { - chTrail2 = 0; - } - wch = 0; - - if ((ch & 0xf0) == 0xe0) - { - // handle three byte case - // 1110xxxx 10xxxxxx 10xxxxxx - - wch = (wchar_t) (((ch & 0x0f) << 12) | - ((chTrail1 & 0x3f) << 6) | - (chTrail2 & 0x3f)); - - cchMultiByte = WideCharToMultiByte( CP_ACP, - WC_NO_BEST_FIT_CHARS, - &wch, - 1, - (LPSTR) mbstr, - 2, - NULL, - NULL ); - - ch = mbstr[0]; - pszSrc += (3 - cchMultiByte); - - // WinSE 12843: Security Fix, Index should be updated for this character - index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]); - - } else if ((ch & 0xe0) == 0xc0) - { - // handle two byte case - // 110xxxxx 10xxxxxx - - wch = (wchar_t) (((ch & 0x1f) << 6) | (chTrail1 & 0x3f)); - - cchMultiByte = WideCharToMultiByte( CP_ACP, - WC_NO_BEST_FIT_CHARS, - &wch, - 1, - (LPSTR) mbstr, - 2, - NULL, - NULL ); - - ch = mbstr[0]; - pszSrc += (2 - cchMultiByte); - - // WinSE 12843: Security Fix, Index should be updated for this character - index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]); - } - - } else { - // - // get ready to emit 2nd byte of converted character - // - ch = mbstr[1]; - cchMultiByte = 0; - } - } - - - // - // Perform the action associated with the state. - // - - switch( p_ActionTable[index] ) - { - case ACTION_EMIT_DOT_DOT_CH : - *pszDest++ = '.'; - /* fall through */ - - case ACTION_EMIT_DOT_CH : - *pszDest++ = '.'; - /* fall through */ - - case ACTION_EMIT_CH : - *pszDest++ = (CHAR ) ch; - /* fall through */ - - case ACTION_NOTHING : - break; - - case ACTION_BACKUP : - if( (pszDest > ( (UCHAR *) pszPath + 1 ) ) && (*pszPath == '/')) - { - pszDest--; - DBG_ASSERT( *pszDest == '/' ); - - *pszDest = '\0'; - pszDest = (UCHAR *) strrchr( pszPath, '/') + 1; - } - - *pszDest = '\0'; - break; - - default : - DBG_ASSERT( !"Invalid action code in state table!" ); - index = IndexFromState(0) + 2; // move to invalid state - DBG_ASSERT( p_StateTable[index] == 4); - *pszDest++ = '\0'; - break; - } - - } while( p_StateTable[index] != 4 ); - - // - // point to terminating nul - // only do the check if we aren't about to go outside of the number - // of elements in the table. - // - if ( ( index < ( sizeof(p_ActionTable) / sizeof(p_ActionTable[0]) ) ) - && p_ActionTable[index] == ACTION_EMIT_CH ) - { - pszDest--; - } - - DBG_ASSERT(*pszDest == '\0' && pszDest > (UCHAR*) pszPath); - - return (INT)DIFF(pszDest - (UCHAR*)pszPath); -} // CanonURL() - - - -HRESULT -NormalizeUrl( - __inout LPSTR pszStart - ) -/*++ - -Routine Description: - - Normalize URL - -Arguments: - - strUrl - URL to be updated to a canonical URI - -Return value: - - TRUE if no error, otherwise FALSE - ---*/ -{ - CHAR * pchParams; - LPSTR pszSlash; - LPSTR pszURL; - LPSTR pszValue; - STACK_STRA( strChgUrl, MAX_PATH ); - HRESULT hr; - DWORD cchInput; - - if ( pszStart == NULL ) - { - return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - - cchInput = (DWORD)strlen( pszStart ); - - if ( *pszStart != '/' ) - { - // - // assume HTTP URL, skip protocol & host name by - // searching for 1st '/' following "//" - // - // We handle this information as a "Host:" header. - // It will be overwritten by the real header if it is - // present. - // - // We do not check for a match in this case. - // - - if ( (pszSlash = strchr( pszStart, '/' )) && pszSlash[1] == '/' ) - { - pszSlash += 2; - if ( pszURL = strchr( pszSlash, '/' ) ) - { - // - // update pointer to URL to point to the 1st slash - // following host name - // - - pszValue = pszURL; - } - else - { - // - // if no single slash following host name - // consider the URL to be empty. - // - - pszValue = pszSlash + strlen( pszSlash ); - } - - memmove( pszStart, pszValue, strlen(pszValue)+1 ); - } - - // - // if no double slash, this is not a fully qualified URL - // and we leave it alone. - // - } - - // - // Check for a question mark which indicates this URL contains some - // parameters and break the two apart if found - // - - if ( (pchParams = strchr( pszStart, '?' )) ) - { - *pchParams = '\0'; - } - - // - // Unescape wants a STR ( sigh ) - // - - hr = strChgUrl.Copy( (CHAR*)pszStart ); - - if ( FAILED( hr ) ) - { - return hr; - } - - strChgUrl.Unescape(); - - hr = StringCchCopyNA( pszStart, cchInput + 1, strChgUrl.QueryStr(), cchInput ); - if ( FAILED( hr ) ) - { - return hr; - } - - // - // Canonicalize the URL - // - - CanonURL( pszStart, g_fIsSystemDBCS ); - - return NO_ERROR; -} - - - - -HRESULT -NormalizeUrlOld( - __inout LPSTR pszUrl -) -/*++ - -Routine Description: - - NormalizeUrl wrapper (used by ISAPI filter and extension support functions) - -Parameters: - - pszUrl - On entry, the URL to be normalized - On return, the normalized URL - (size of normalized URL is always <= not normalized URL) - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = NO_ERROR; - - if ( pszUrl ) - { - STACK_BUFFER( buffUrlOutput, MAX_PATH ); - STACK_STRA( strUrlA, MAX_PATH ); - LPWSTR szQueryString; - DWORD cchData; - DWORD cbOutput; - - cchData = (DWORD)strlen( pszUrl ); - - // - // Prepare the Output string - // - - if ( !buffUrlOutput.Resize( ( cchData + 1 ) *sizeof( WCHAR ) ) ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - // - // Normalize it - // - - hr = UlCleanAndCopyUrl( - pszUrl, - cchData, - &cbOutput, - (WCHAR *) buffUrlOutput.QueryPtr(), - &szQueryString - ); - - if ( FAILED( hr ) ) - { - return hr; - } - - // - // Terminate the string at the query so that the - // query string doesn't appear in the output. IIS 5 - // truncated in this way. - // - - if ( szQueryString != NULL ) - { - ((WCHAR *) buffUrlOutput.QueryPtr())[ cbOutput - wcslen( szQueryString )] = 0; - } - - // - // Write the normalized URL over the input data - // - - hr = strUrlA.CopyW( (WCHAR *) buffUrlOutput.QueryPtr() ); - - if ( FAILED( hr ) ) - { - return hr; - } - - // - // Normalized string will never be longer than the original one - // - - DBG_ASSERT( strUrlA.QueryCCH() <= cchData ); - - hr = StringCchCopyA( pszUrl, cchData + 1, strUrlA.QueryStr() ); - if ( FAILED( hr ) ) - { - return hr; - } - - hr = NO_ERROR; - } - else - { - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - return hr; -} - - -HRESULT -NormalizeUrlW( - __inout LPWSTR pszUrl -) -/*++ - -Routine Description: - - unicode version of NormalizeUrl wrapper (used by ISAPI filter and extension support functions) - -Parameters: - - pszUrl - On entry, the URL to be normalized - On return, the normalized URL - (size of normalized URL is always <= not normalized URL) - -Return Value: - - HRESULT - ---*/ -{ - - HRESULT hr = NO_ERROR; - - if ( pszUrl ) - { - STACK_BUFFER( buffUrlOutput, MAX_PATH ); - STACK_STRA( strUrlA, MAX_PATH ); - LPWSTR szQueryString; - DWORD cchData; - DWORD cbOutput; - - cchData = (DWORD)wcslen( pszUrl ); - - hr = strUrlA.CopyWToUTF8Escaped( pszUrl ); - - if ( FAILED( hr ) ) - { - return hr; - } - - // - // Prepare Output string - // - - if ( !buffUrlOutput.Resize( ( cchData + 1 ) *sizeof( WCHAR ) ) ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - // - // Normalize it - // - - hr = UlCleanAndCopyUrl( - strUrlA.QueryStr(), - strUrlA.QueryCB(), - &cbOutput, - (WCHAR *) buffUrlOutput.QueryPtr(), - &szQueryString - ); - - if ( FAILED( hr ) ) - { - return hr; - } - - - // - // Terminate the string at the query so that the - // query string doesn't appear in the output. IIS 5 - // truncated in this way. - // - - if ( szQueryString != NULL ) - { - ((WCHAR *) buffUrlOutput.QueryPtr())[ cbOutput - wcslen( szQueryString )] = 0; - } - - // - // normalized string will never be longer than the original one - // - - DBG_ASSERT( cbOutput <= cchData * sizeof( WCHAR ) ); - - // - // Write the normalized URL over the input data - // - - hr = StringCchCopyW( pszUrl, cchData+1, (WCHAR *) buffUrlOutput.QueryPtr() ); - if ( FAILED( hr ) ) - { - return hr; - } - - hr = NO_ERROR; - } - else - { - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - return hr; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h deleted file mode 100644 index 8f578b2ad3e9..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include -#pragma warning( disable:4127 ) -#include -#include -#include - -#include "macros.h" -#include "stringu.h" -#include "stringa.h" -#include "dbgutil.h" -#include "ntassert.h" -#include "ahutil.h" -#include "acache.h" -#include "base64.hxx" diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp deleted file mode 100644 index db3ff5460e47..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp +++ /dev/null @@ -1,1767 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -STRA::STRA( - VOID -) : m_cchLen( 0 ) -{ - *( QueryStr() ) = '\0'; -} - -STRA::STRA( - __inout_ecount(cchInit) CHAR* pbInit, - __in DWORD cchInit -) : m_Buff( pbInit, cchInit * sizeof( CHAR ) ), - m_cchLen(0) -/*++ - Description: - - Used by STACK_STRA. Initially populates underlying buffer with pbInit. - - pbInit is not freed. - - Arguments: - - pbInit - initial memory to use - cchInit - count, in characters, of pbInit - - Returns: - - None. - ---*/ -{ - _ASSERTE( NULL != pbInit ); - _ASSERTE( cchInit > 0 ); - _ASSERTE( pbInit[0] == '\0' ); -} - -BOOL -STRA::IsEmpty( - VOID -) const -{ - return ( m_cchLen == 0 ); -} - -BOOL -STRA::Equals( - __in PCSTR pszRhs, - __in BOOL fIgnoreCase /*= FALSE*/ -) const -{ - _ASSERTE( NULL != pszRhs ); - - if( fIgnoreCase ) - { - return ( 0 == _stricmp( QueryStr(), pszRhs ) ); - } - - return ( 0 == strcmp( QueryStr(), pszRhs ) ); -} - -BOOL -STRA::Equals( - __in const STRA * pstrRhs, - __in BOOL fIgnoreCase /*= FALSE*/ -) const -{ - _ASSERTE( NULL != pstrRhs ); - return Equals( pstrRhs->QueryStr(), fIgnoreCase ); -} - -BOOL -STRA::Equals( - __in const STRA & strRhs, - __in BOOL fIgnoreCase /*= FALSE*/ -) const -{ - return Equals( strRhs.QueryStr(), fIgnoreCase ); -} - -DWORD -STRA::QueryCB( - VOID -) const -// -// Returns the number of bytes in the string excluding the terminating NULL -// -{ - return m_cchLen * sizeof( CHAR ); -} - -DWORD -STRA::QueryCCH( - VOID -) const -// -// Returns the number of characters in the string excluding the terminating NULL -// -{ - return m_cchLen; -} - -DWORD -STRA::QuerySizeCCH( - VOID -) const -// -// Returns size of the underlying storage buffer, in characters -// -{ - return m_Buff.QuerySize() / sizeof( CHAR ); -} - -DWORD -STRA::QuerySize( - VOID -) const -// -// Returns the size of the storage buffer in bytes -// -{ - return m_Buff.QuerySize(); -} - -__nullterminated -__bcount(this->m_cchLen) -CHAR * -STRA::QueryStr( - VOID -) const -// -// Return the string buffer -// -{ - return m_Buff.QueryPtr(); -} - -VOID -STRA::Reset( - VOID -) -// -// Resets the internal string to be NULL string. Buffer remains cached. -// -{ - _ASSERTE( QueryStr() != NULL ); - *(QueryStr()) = '\0'; - m_cchLen = 0; -} - -HRESULT -STRA::Resize( - __in DWORD cchSize -) -{ - if( !m_Buff.Resize( cchSize * sizeof( CHAR ) ) ) - { - return E_OUTOFMEMORY; - } - - return S_OK; -} - -HRESULT -STRA::SyncWithBuffer( - VOID -) -// -// Recalculate the length of the string, etc. because we've modified -// the buffer directly. -// -{ - HRESULT hr; - size_t size; - hr = StringCchLengthA( QueryStr(), - QuerySizeCCH(), - &size ); - if ( SUCCEEDED( hr ) ) - { - m_cchLen = static_cast(size); - } - return hr; -} - -HRESULT -STRA::Copy( - __in PCSTR pszCopy -) -{ - HRESULT hr; - size_t cbLen; - hr = StringCbLengthA( pszCopy, - STRSAFE_MAX_CCH, - &cbLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return Copy( pszCopy, cbLen ); -} - - -HRESULT -STRA::Copy( - __in_ecount(cchLen) - PCSTR pszCopy, - __in SIZE_T cbLen -) -// -// Copy the contents of another string to this one -// -{ - _ASSERTE( cbLen <= MAXDWORD ); - - return AuxAppend( - pszCopy, - static_cast(cbLen), - 0 - ); -} - -HRESULT -STRA::Copy( - __in const STRA * pstrRhs -) -{ - _ASSERTE( pstrRhs != NULL ); - return Copy( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRA::Copy( - __in const STRA & strRhs -) -{ - return Copy( strRhs.QueryStr(), strRhs.QueryCCH() ); -} - -HRESULT -STRA::CopyW( - __in PCWSTR pszCopyW -) -{ - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszCopyW, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return CopyW( pszCopyW, cchLen ); -} - -HRESULT -STRA::CopyWTruncate( - __in PCWSTR pszCopyWTruncate -) -{ - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszCopyWTruncate, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return CopyWTruncate( pszCopyWTruncate, cchLen ); -} - -HRESULT -STRA::CopyWTruncate( - __in_ecount(cchLen) - PCWSTR pszCopyWTruncate, - __in SIZE_T cchLen -) -// -// The "Truncate" methods do not do proper conversion. They do a (CHAR) caste -// -{ - _ASSERTE( cchLen <= MAXDWORD ); - - return AuxAppendWTruncate( - pszCopyWTruncate, - static_cast(cchLen), - 0 - ); -} - -HRESULT -STRA::Append( - __in PCSTR pszAppend -) -{ - HRESULT hr; - size_t cbLen; - hr = StringCbLengthA( pszAppend, - STRSAFE_MAX_CCH, - &cbLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return Append( pszAppend, cbLen ); -} - -HRESULT -STRA::Append( - __in_ecount(cchLen) - PCSTR pszAppend, - __in SIZE_T cbLen -) -{ - _ASSERTE( cbLen <= MAXDWORD ); - if ( cbLen == 0 ) - { - return S_OK; - } - return AuxAppend( - pszAppend, - static_cast(cbLen), - QueryCB() - ); -} - -HRESULT -STRA::Append( - __in const STRA * pstrRhs -) -{ - _ASSERTE( pstrRhs != NULL ); - return Append( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRA::Append( - __in const STRA & strRhs -) -{ - return Append( strRhs.QueryStr(), strRhs.QueryCCH() ); -} - -HRESULT -STRA::AppendWTruncate( - __in PCWSTR pszAppendWTruncate -) -{ - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszAppendWTruncate, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return AppendWTruncate( pszAppendWTruncate, cchLen ); -} - -HRESULT -STRA::AppendWTruncate( - __in_ecount(cchLen) - PCWSTR pszAppendWTruncate, - __in SIZE_T cchLen -) -// -// The "Truncate" methods do not do proper conversion. They do a (CHAR) caste -// -{ - _ASSERTE( cchLen <= MAXDWORD ); - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppendWTruncate( - pszAppendWTruncate, - static_cast(cchLen), - QueryCB() - ); -} - -HRESULT -STRA::CopyToBuffer( - __out_bcount(*pcb) CHAR* pszBuffer, - __inout DWORD * pcb -) const -// -// Makes a copy of the stored string into the given buffer -// -{ - _ASSERTE( NULL != pszBuffer ); - _ASSERTE( NULL != pcb ); - - HRESULT hr = S_OK; - DWORD cbNeeded = QueryCB() + sizeof( CHAR ); - - if( *pcb < cbNeeded ) - { - hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ); - goto Finished; - } - - memcpy( pszBuffer, QueryStr(), cbNeeded ); - -Finished: - - *pcb = cbNeeded; - - return hr; -} - -HRESULT -STRA::SetLen( - __in DWORD cchLen -) -/*++ - * -Routine Description: - - Set the length of the string and null terminate, if there - is sufficient buffer already allocated. Will not reallocate. - -Arguments: - - cchLen - The number of characters in the new string. - -Return Value: - - HRESULT - ---*/ -{ - if( cchLen >= QuerySizeCCH() ) - { - return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - - *( QueryStr() + cchLen ) = '\0'; - m_cchLen = cchLen; - - return S_OK; -} - - -HRESULT -STRA::SafeSnprintf( - __in __format_string - PCSTR pszFormatString, - ... -) -/*++ - -Routine Description: - - Writes to a STRA, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pszFormatString - printf format - ... - printf args - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - va_list argsList; - va_start( argsList, pszFormatString ); - - hr = SafeVsnprintf(pszFormatString, argsList); - - va_end( argsList ); - return hr; -} - -HRESULT -STRA::SafeVsnprintf( - __in __format_string - PCSTR pszFormatString, - va_list argsList -) -/*++ - -Routine Description: - - Writes to a STRA, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pszFormatString - printf format - argsList - printf va_list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - int cchOutput; - int cchNeeded; - - // - // Format the incoming message using vsnprintf() - // so that the overflows are captured - // - cchOutput = _vsnprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pszFormatString, - argsList - ); - - if( cchOutput == -1 ) - { - // - // Couldn't fit this in the original STRU size. - // - cchNeeded = _vscprintf( pszFormatString, argsList ); - if( cchNeeded > 64 * 1024 ) - { - // - // If we're trying to produce a string > 64k chars, then - // there is probably a problem - // - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - - // - // _vscprintf doesn't include terminating null character - // - cchNeeded++; - - hr = Resize( cchNeeded ); - if( FAILED( hr ) ) - { - goto Finished; - } - - cchOutput = _vsnprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pszFormatString, - argsList - ); - if( -1 == cchOutput ) - { - // - // This should never happen, cause we should already have correctly sized memory - // - _ASSERTE( FALSE ); - - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - } - - // - // always null terminate at the last WCHAR - // - QueryStr()[ QuerySizeCCH() - 1 ] = L'\0'; - - // - // we directly touched the buffer - therefore: - // - hr = SyncWithBuffer(); - if( FAILED( hr ) ) - { - goto Finished; - } - -Finished: - - if( FAILED( hr ) ) - { - Reset(); - } - - return hr; -} - -bool -FShouldEscapeUtf8( - BYTE ch - ) -{ - if ( ( ch >= 128 ) ) - { - return true; - } - - return false; -} - -bool -FShouldEscapeUrl( - BYTE ch - ) -{ - if ( ( ch >= 128 || - ch <= 32 || - ch == '<' || - ch == '>' || - ch == '%' || - ch == '?' || - ch == '#' ) && - !( ch == '\n' || ch == '\r' ) ) - { - return true; - } - - return false; -} - -HRESULT -STRA::Escape( - VOID -) -/*++ - -Routine Description: - - Escapes a STRA - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - return EscapeInternal( FShouldEscapeUrl ); -} - -HRESULT -STRA::EscapeUtf8( - VOID -) -/*++ - -Routine Description: - - Escapes the high-bit chars in a STRA. LWS, CR, LF & controls are untouched. - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - return EscapeInternal( FShouldEscapeUtf8 ); -} - - -HRESULT -STRA::EscapeInternal( - PFN_F_SHOULD_ESCAPE pfnFShouldEscape -) -/*++ - -Routine Description: - - Escapes a STRA according to the predicate function passed in - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - LPCSTR pch = QueryStr(); - __analysis_assume( pch != NULL ); - int i = 0; - BYTE ch; - HRESULT hr = S_OK; - BOOL fRet = FALSE; - SIZE_T NewSize = 0; - - // Set to true if any % escaping occurs - BOOL fEscapingDone = FALSE; - - // - // If there are any characters that need to be escaped we copy the entire string - // character by character into straTemp, escaping as we go, then at the end - // copy all of straTemp over. Don't modify InlineBuffer directly. - // - CHAR InlineBuffer[512]; - InlineBuffer[0] = '\0'; - STRA straTemp(InlineBuffer, sizeof(InlineBuffer)/sizeof(*InlineBuffer)); - - _ASSERTE( pch ); - - while (ch = pch[i]) - { - // - // Escape characters that are in the non-printable range - // but ignore CR and LF - // - - if ( pfnFShouldEscape( ch ) ) - { - if (FALSE == fEscapingDone) - { - // first character in the string that needed escaping - fEscapingDone = TRUE; - - // guess that the size needs to be larger than - // what we used to have times two - NewSize = QueryCCH() * 2; - if ( NewSize > MAXDWORD ) - { - hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - return hr; - } - - hr = straTemp.Resize( static_cast(NewSize) ); - - if (FAILED(hr)) - { - return hr; - } - - // Copy all of the previous buffer into buffTemp, only if it is not the first character: - - if ( i > 0) - { - hr = straTemp.Copy(QueryStr(), - i * sizeof(CHAR)); - if (FAILED(hr)) - { - return hr; - } - } - } - - // resize the temporary (if needed) with the slop of the entire buffer length - // this fixes constant reallocation if the entire string needs to be escaped - NewSize = QueryCCH() + 2 * sizeof(CHAR) + 1 * sizeof(CHAR); - if ( NewSize > MAXDWORD ) - { - hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - return hr; - } - - fRet = straTemp.m_Buff.Resize( NewSize ); - if ( !fRet ) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - return hr; - } - - // - // Create the string to append for the current character - // - - CHAR chHex[3]; - chHex[0] = '%'; - - // - // Convert the low then the high character to hex - // - - UINT nLowDigit = (UINT)(ch % 16); - chHex[2] = TODIGIT( nLowDigit ); - - ch /= 16; - - UINT nHighDigit = (UINT)(ch % 16); - - chHex[1] = TODIGIT( nHighDigit ); - - // - // Actually append the converted character to the end of the temporary - // - hr = straTemp.Append(chHex, 3); - if (FAILED(hr)) - { - return hr; - } - } - else - { - // if no escaping done, no need to copy - if (fEscapingDone) - { - // if ANY escaping done, copy current character into new buffer - straTemp.Append(&pch[i], 1); - } - } - - // inspect the next character in the string - i++; - } - - if (fEscapingDone) - { - // the escaped string is now in straTemp - hr = Copy(straTemp); - } - - return hr; - -} // EscapeInternal() - -VOID -STRA::Unescape( - VOID -) -/*++ - -Routine Description: - - Unescapes a STRA - - Supported escape sequences are: - %uxxxx unescapes Unicode character xxxx into system codepage - %xx unescapes character xx - % without following hex digits is ignored - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - CHAR *pScan; - CHAR *pDest; - CHAR *pNextScan; - WCHAR wch; - DWORD dwLen; - BOOL fChanged = FALSE; - - // - // Now take care of any escape characters - // - pDest = pScan = strchr(QueryStr(), '%'); - - while (pScan) - { - if ((pScan[1] == 'u' || pScan[1] == 'U') && - SAFEIsXDigit(pScan[2]) && - SAFEIsXDigit(pScan[3]) && - SAFEIsXDigit(pScan[4]) && - SAFEIsXDigit(pScan[5])) - { - wch = TOHEX(pScan[2]) * 4096 + TOHEX(pScan[3]) * 256 - + TOHEX(pScan[4]) * 16 + TOHEX(pScan[5]); - - dwLen = WideCharToMultiByte(CP_ACP, - WC_NO_BEST_FIT_CHARS, - &wch, - 1, - (LPSTR) pDest, - 6, - NULL, - NULL); - - pDest += dwLen; - pScan += 6; - fChanged = TRUE; - } - else if (SAFEIsXDigit(pScan[1]) && SAFEIsXDigit(pScan[2])) - { - *pDest = TOHEX(pScan[1]) * 16 + TOHEX(pScan[2]); - - pDest ++; - pScan += 3; - fChanged = TRUE; - } - else // Not an escaped char, just a '%' - { - if (fChanged) - { - *pDest = *pScan; - } - - pDest++; - pScan++; - } - - // - // Copy all the information between this and the next escaped char - // - pNextScan = strchr(pScan, '%'); - - if (fChanged) // pScan!=pDest, so we have to copy the char's - { - if (!pNextScan) // That was the last '%' in the string - { - memmove(pDest, - pScan, - QueryCCH() - DIFF(pScan - QueryStr()) + 1); - } - else - { - // There is another '%', move intermediate chars - if ((dwLen = (DWORD)DIFF(pNextScan - pScan)) != 0) - { - memmove(pDest, - pScan, - dwLen); - pDest += dwLen; - } - } - } - - pScan = pNextScan; - } - - if (fChanged) - { - m_cchLen = (DWORD)strlen(QueryStr()); // for safety recalc the length - } - - return; -} - -HRESULT -STRA::CopyWToUTF8Unescaped( - __in LPCWSTR cpchStr -) -{ - return STRA::CopyWToUTF8Unescaped(cpchStr, (DWORD) wcslen(cpchStr)); -} - -HRESULT -STRA::CopyWToUTF8Unescaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch -) -{ - HRESULT hr = S_OK; - int iRet; - - if (cch == 0) - { - Reset(); - return S_OK; - } - - iRet = ConvertUnicodeToUTF8(cpchStr, - &m_Buff, - cch); - if (-1 == iRet) - { - // could not convert - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - m_cchLen = iRet; - - _ASSERTE(strlen(m_Buff.QueryPtr()) == m_cchLen); -Finished: - return hr; -} - -HRESULT -STRA::CopyWToUTF8Escaped( - __in LPCWSTR cpchStr -) -{ - return STRA::CopyWToUTF8Escaped(cpchStr, (DWORD) wcslen(cpchStr)); -} - -HRESULT -STRA::CopyWToUTF8Escaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch -) -{ - HRESULT hr = S_OK; - - hr = CopyWToUTF8Unescaped(cpchStr, cch); - if (FAILED(hr)) - { - goto Finished; - } - - hr = Escape(); - if (FAILED(hr)) - { - goto Finished; - } - - hr = S_OK; -Finished: - return hr; -} - -HRESULT -STRA::AuxAppend( - __in_ecount(cbLen) - LPCSTR pStr, - __in DWORD cbLen, - __in DWORD cbOffset -) -{ - _ASSERTE( NULL != pStr ); - _ASSERTE( cbOffset <= QueryCB() ); - - ULONGLONG cb64NewSize = (ULONGLONG)cbOffset + cbLen + sizeof( CHAR ); - if( cb64NewSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( m_Buff.QuerySize() < cb64NewSize ) - { - if( !m_Buff.Resize( static_cast(cb64NewSize) ) ) - { - return E_OUTOFMEMORY; - } - } - - memcpy( reinterpret_cast(m_Buff.QueryPtr()) + cbOffset, pStr, cbLen ); - - m_cchLen = cbLen + cbOffset; - - *( QueryStr() + m_cchLen ) = '\0'; - - return S_OK; -} - -HRESULT -STRA::AuxAppendW( - __in_ecount(cchAppendW) - PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset, - __in UINT CodePage, - __in BOOL fFailIfNoTranslation, - __in DWORD dwFlags -) -{ - HRESULT hr = S_OK; - DWORD cbAvailable = 0; - DWORD cbRet = 0; - - // - // There are only two expect places to append - // - _ASSERTE( 0 == cbOffset || QueryCB() == cbOffset ); - - if ( cchAppendW == 0 ) - { - goto Finished; - } - - // - // start by assuming 1 char to 1 char will be enough space - // - if( !m_Buff.Resize( cbOffset + cchAppendW + sizeof( CHAR ) ) ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - cbAvailable = m_Buff.QuerySize() - cbOffset; - - cbRet = WideCharToMultiByte( - CodePage, - dwFlags, - pszAppendW, - cchAppendW, - QueryStr() + cbOffset, - cbAvailable, - NULL, - NULL - ); - if( 0 != cbRet ) - { - if(!m_Buff.Resize(cbOffset + cbRet + 1)) - { - hr = E_OUTOFMEMORY; - } - - // - // not zero --> success, so we're done - // - goto Finished; - } - - // - // We only know how to handle ERROR_INSUFFICIENT_BUFFER - // - hr = HRESULT_FROM_WIN32( GetLastError() ); - if( hr != HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ) ) - { - goto Finished; - } - - // - // Reset HResult because we need to get the number of bytes needed - // - hr = S_OK; - cbRet = WideCharToMultiByte( - CodePage, - dwFlags, - pszAppendW, - cchAppendW, - NULL, - 0, - NULL, - NULL - ); - if( 0 == cbRet ) - { - // - // no idea how we could ever reach here - // - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - - if( !m_Buff.Resize( cbOffset + cbRet + 1) ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - cbAvailable = m_Buff.QuerySize() - cbOffset; - - cbRet = WideCharToMultiByte( - CodePage, - dwFlags, - pszAppendW, - cchAppendW, - QueryStr() + cbOffset, - cbAvailable, - NULL, - NULL - ); - if( 0 == cbRet ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - -Finished: - - if( SUCCEEDED( hr ) && 0 != cbRet ) - { - m_cchLen = cbRet + cbOffset; - } - - // - // ensure we're still NULL terminated in the right spot - // (regardless of success or failure) - // - QueryStr()[m_cchLen] = '\0'; - - return hr; -} - -HRESULT -STRA::AuxAppendWTruncate( - __in_ecount(cchAppendW) - __in PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset -) -// -// Cheesey WCHAR --> CHAR conversion -// -{ - HRESULT hr = S_OK; - CHAR* pszBuffer; - - _ASSERTE( NULL != pszAppendW ); - _ASSERTE( 0 == cbOffset || cbOffset == QueryCB() ); - - if( !pszAppendW ) - { - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - ULONGLONG cbNeeded = (ULONGLONG)cbOffset + cchAppendW + sizeof( CHAR ); - if( cbNeeded > MAXDWORD ) - { - hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - goto Finished; - } - - if( !m_Buff.Resize( static_cast(cbNeeded) ) ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - // - // Copy/convert the UNICODE string over (by making two bytes into one) - // - pszBuffer = QueryStr() + cbOffset; - for( DWORD i = 0; i < cchAppendW; i++ ) - { - pszBuffer[i] = static_cast(pszAppendW[i]); - } - - m_cchLen = cchAppendW + cbOffset; - *( QueryStr() + m_cchLen ) = '\0'; - -Finished: - - return hr; -} - -// static -int -STRA::ConvertUnicodeToCodePage( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __inout BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen, - __in UINT uCodePage -) -{ - _ASSERTE(NULL != pszSrcUnicodeString); - _ASSERTE(NULL != pbufDstAnsiString); - - BOOL bTemp; - int iStrLen = 0; - DWORD dwFlags; - - if (uCodePage == CP_ACP) - { - dwFlags = WC_NO_BEST_FIT_CHARS; - } - else - { - dwFlags = 0; - } - - iStrLen = WideCharToMultiByte(uCodePage, - dwFlags, - pszSrcUnicodeString, - dwStringLen, - (LPSTR)pbufDstAnsiString->QueryPtr(), - (int)pbufDstAnsiString->QuerySize(), - NULL, - NULL); - if ((iStrLen == 0) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { - iStrLen = WideCharToMultiByte(uCodePage, - dwFlags, - pszSrcUnicodeString, - dwStringLen, - NULL, - 0, - NULL, - NULL); - if (iStrLen != 0) { - // add one just for the extra NULL - bTemp = pbufDstAnsiString->Resize(iStrLen + 1); - if (!bTemp) - { - iStrLen = 0; - } - else - { - iStrLen = WideCharToMultiByte(uCodePage, - dwFlags, - pszSrcUnicodeString, - dwStringLen, - (LPSTR)pbufDstAnsiString->QueryPtr(), - (int)pbufDstAnsiString->QuerySize(), - NULL, - NULL); - } - - } - } - - if (0 != iStrLen && - pbufDstAnsiString->Resize(iStrLen + 1)) - { - // insert a terminating NULL into buffer for the dwStringLen+1 in the case that the dwStringLen+1 was not a NULL. - ((CHAR*)pbufDstAnsiString->QueryPtr())[iStrLen] = '\0'; - } - else - { - iStrLen = -1; - } - - return iStrLen; -} - -// static -HRESULT -STRA::ConvertUnicodeToMultiByte( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen -) -{ - return ConvertUnicodeToCodePage( pszSrcUnicodeString, - pbufDstAnsiString, - dwStringLen, - CP_ACP ); -} - -// static -HRESULT -STRA::ConvertUnicodeToUTF8( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen -) -{ - return ConvertUnicodeToCodePage( pszSrcUnicodeString, - pbufDstAnsiString, - dwStringLen, - CP_UTF8 ); -} - -/*++ - -Routine Description: - - Removes leading and trailing whitespace - ---*/ - -VOID -STRA::Trim() -{ - PSTR pszString = QueryStr(); - DWORD cchNewLength = m_cchLen; - DWORD cchLeadingWhitespace = 0; - DWORD cchTempLength = 0; - - for (LONG ixString = m_cchLen - 1; ixString >= 0; ixString--) - { - if (isspace((unsigned char) pszString[ixString]) != 0) - { - pszString[ixString] = '\0'; - cchNewLength--; - } - else - { - break; - } - } - - cchTempLength = cchNewLength; - for (DWORD ixString = 0; ixString < cchTempLength; ixString++) - { - if (isspace((unsigned char) pszString[ixString]) != 0) - { - cchLeadingWhitespace++; - cchNewLength--; - } - else - { - break; - } - } - - if (cchNewLength == 0) - { - - Reset(); - } - else if (cchLeadingWhitespace > 0) - { - memmove(pszString, pszString + cchLeadingWhitespace, cchNewLength * sizeof(CHAR)); - pszString[cchNewLength] = '\0'; - } - - SyncWithBuffer(); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - pStraPrefix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::StartsWith( - __in const STRA * pStraPrefix, - __in bool fIgnoreCase) const -{ - _ASSERTE( pStraPrefix != NULL ); - return StartsWith(pStraPrefix->QueryStr(), fIgnoreCase); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - straPrefix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::StartsWith( - __in const STRA & straPrefix, - __in bool fIgnoreCase) const -{ - return StartsWith(straPrefix.QueryStr(), fIgnoreCase); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - pszPrefix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::StartsWith( - __in PCSTR pszPrefix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - BOOL fMatch = FALSE; - size_t cchPrefix = 0; - - if (pszPrefix == NULL) - { - goto Finished; - } - - hr = StringCchLengthA( pszPrefix, - STRSAFE_MAX_CCH, - &cchPrefix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchPrefix <= MAXDWORD ); - - if (cchPrefix > m_cchLen) - { - goto Finished; - } - - if( fIgnoreCase ) - { - fMatch = ( 0 == _strnicmp( QueryStr(), pszPrefix, cchPrefix ) ); - } - else - { - fMatch = ( 0 == strncmp( QueryStr(), pszPrefix, cchPrefix ) ); - } - - -Finished: - - return fMatch; -} - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - pStraSuffix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::EndsWith( - __in const STRA * pStraSuffix, - __in bool fIgnoreCase) const -{ - _ASSERTE( pStraSuffix != NULL ); - return EndsWith(pStraSuffix->QueryStr(), fIgnoreCase); -} - - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - straSuffix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::EndsWith( - __in const STRA & straSuffix, - __in bool fIgnoreCase) const -{ - return EndsWith(straSuffix.QueryStr(), fIgnoreCase); -} - - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - pszSuffix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::EndsWith( - __in PCSTR pszSuffix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - PSTR pszString = QueryStr(); - BOOL fMatch = FALSE; - size_t cchSuffix = 0; - ptrdiff_t ixOffset = 0; - - if (pszSuffix == NULL) - { - goto Finished; - } - - hr = StringCchLengthA( pszSuffix, - STRSAFE_MAX_CCH, - &cchSuffix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchSuffix <= MAXDWORD ); - - if (cchSuffix > m_cchLen) - { - goto Finished; - } - - ixOffset = m_cchLen - cchSuffix; - _ASSERTE(ixOffset >= 0 && ixOffset <= MAXDWORD); - - if( fIgnoreCase ) - { - fMatch = ( 0 == _strnicmp( pszString + ixOffset, pszSuffix, cchSuffix ) ); - } - else - { - fMatch = ( 0 == strncmp( pszString + ixOffset, pszSuffix, cchSuffix ) ); - } - -Finished: - - return fMatch; -} - - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - the initial index. - -Return Value: - - The index for the first character occurrence in the string. - - -1 if not found. - ---*/ -INT -STRA::IndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const CHAR* pChar = strchr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified substring. - -Arguments: - - pszValue - substring to find - dwStartIndex - initial index. - -Return Value: - - The index for the first character occurrence in the string. - - -1 if not found. - ---*/ -INT -STRA::IndexOf( - __in PCSTR pszValue, - __in DWORD dwStartIndex - ) const -{ - HRESULT hr = S_OK; - INT nIndex = -1; - SIZE_T cchValue = 0; - - // Validate input parameters - if( dwStartIndex >= QueryCCH() || !pszValue ) - { - goto Finished; - } - - const CHAR* pChar = strstr( QueryStr() + dwStartIndex, pszValue ); - - // Determine the index if found - if( pChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the last occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - initial index. - -Return Value: - - The index for the last character occurrence in the string. - - -1 if not found. - ---*/ -INT -STRA::LastIndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const CHAR* pChar = strrchr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp deleted file mode 100644 index 2a012666d56c..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp +++ /dev/null @@ -1,1289 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -STRU::STRU( - VOID -) : m_cchLen( 0 ) -{ - *(QueryStr()) = L'\0'; -} - -STRU::STRU( - __inout_ecount(cchInit) WCHAR* pbInit, - __in DWORD cchInit -) : m_Buff( pbInit, cchInit * sizeof( WCHAR ) ), - m_cchLen( 0 ) -/*++ - Description: - - Used by STACK_STRU. Initially populates underlying buffer with pbInit. - - pbInit is not freed. - - Arguments: - - pbInit - initial memory to use - cchInit - count, in characters, of pbInit - - Returns: - - None. - ---*/ -{ - _ASSERTE( cchInit <= (MAXDWORD / sizeof( WCHAR )) ); - _ASSERTE( NULL != pbInit ); - _ASSERTE(cchInit > 0 ); - _ASSERTE(pbInit[0] == L'\0'); -} - -BOOL -STRU::IsEmpty( - VOID -) const -{ - return ( m_cchLen == 0 ); -} - -DWORD -STRU::QueryCB( - VOID -) const -// -// Returns the number of bytes in the string excluding the terminating NULL -// -{ - return m_cchLen * sizeof( WCHAR ); -} - -DWORD -STRU::QueryCCH( - VOID -) const -// -// Returns the number of characters in the string excluding the terminating NULL -// -{ - return m_cchLen; -} - -DWORD -STRU::QuerySizeCCH( - VOID -) const -// -// Returns size of the underlying storage buffer, in characters -// -{ - return m_Buff.QuerySize() / sizeof( WCHAR ); -} - -__nullterminated -__ecount(this->m_cchLen) -WCHAR* -STRU::QueryStr( - VOID -) const -// -// Return the string buffer -// -{ - return m_Buff.QueryPtr(); -} - -VOID -STRU::Reset( - VOID -) -// -// Resets the internal string to be NULL string. Buffer remains cached. -// -{ - _ASSERTE( QueryStr() != NULL ); - *(QueryStr()) = L'\0'; - m_cchLen = 0; -} - -HRESULT -STRU::Resize( - DWORD cchSize -) -{ - SIZE_T cbSize = cchSize * sizeof( WCHAR ); - if ( cbSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - if( !m_Buff.Resize( cbSize ) ) - { - return E_OUTOFMEMORY; - } - - return S_OK; -} - -HRESULT -STRU::SyncWithBuffer( - VOID -) -// -// Recalculate the length of the string, etc. because we've modified -// the buffer directly. -// -{ - HRESULT hr; - size_t size; - hr = StringCchLengthW( QueryStr(), - QuerySizeCCH(), - &size ); - if ( SUCCEEDED( hr ) ) - { - m_cchLen = static_cast(size); - } - return hr; -} - -HRESULT -STRU::Copy( - __in PCWSTR pszCopy -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCchLengthW( pszCopy, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return Copy( pszCopy, - cbStr ); -} - -HRESULT -STRU::Copy( - __in_ecount(cchLen) - PCWSTR pszCopy, - SIZE_T cchLen -) -// -// Copy the contents of another string to this one -// -{ - return AuxAppend( pszCopy, - cchLen * sizeof(WCHAR), - 0); -} - -HRESULT -STRU::Copy( - __in const STRU * pstrRhs -) -{ - _ASSERTE( NULL != pstrRhs ); - return Copy( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRU::Copy( - __in const STRU & str -) -{ - return Copy( str.QueryStr(), str.QueryCCH() ); -} - -HRESULT -STRU::CopyAndExpandEnvironmentStrings( - __in PCWSTR pszSource -) -{ - HRESULT hr = S_OK; - DWORD cchDestReqBuff = 0; - - Reset(); - - cchDestReqBuff = ExpandEnvironmentStringsW( pszSource, - QueryStr(), - QuerySizeCCH() ); - if ( cchDestReqBuff == 0 ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - else if ( cchDestReqBuff > QuerySizeCCH() ) - { - hr = Resize( cchDestReqBuff ); - if ( FAILED( hr ) ) - { - goto Finished; - } - - cchDestReqBuff = ExpandEnvironmentStringsW( pszSource, - QueryStr(), - QuerySizeCCH() ); - - if ( cchDestReqBuff == 0 || cchDestReqBuff > QuerySizeCCH() ) - { - _ASSERTE( FALSE ); - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - } - - hr = SyncWithBuffer(); - if ( FAILED( hr ) ) - { - goto Finished; - } - -Finished: - - return hr; - -} - -HRESULT -STRU::CopyA( - __in PCSTR pszCopyA -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCbLengthA( pszCopyA, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return CopyA( pszCopyA, - cbStr ); -} - -HRESULT -STRU::CopyA( - __in_bcount(cchLen) - PCSTR pszCopyA, - SIZE_T cchLen, - UINT CodePage /*= CP_UTF8*/ -) -{ - return AuxAppendA( - pszCopyA, - cchLen, - 0, - CodePage - ); -} - -HRESULT -STRU::Append( - __in PCWSTR pszAppend -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCchLengthW( pszAppend, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return Append( pszAppend, - cbStr ); -} - -HRESULT -STRU::Append( - __in_ecount(cchLen) - PCWSTR pszAppend, - SIZE_T cchLen -) -// -// Append something to the end of the string -// -{ - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppend( pszAppend, - cchLen * sizeof(WCHAR), - QueryCB() ); -} - -HRESULT -STRU::Append( - __in const STRU * pstrRhs -) -{ - _ASSERTE( NULL != pstrRhs ); - return Append( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRU::Append( - __in const STRU & strRhs -) -{ - return Append( strRhs.QueryStr(), strRhs.QueryCCH() ); -} - -HRESULT -STRU::AppendA( - __in PCSTR pszAppendA -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCbLengthA( pszAppendA, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return AppendA( pszAppendA, - cbStr ); -} - -HRESULT -STRU::AppendA( - __in_bcount(cchLen) - PCSTR pszAppendA, - SIZE_T cchLen, - UINT CodePage /*= CP_UTF8*/ -) -{ - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppendA( - pszAppendA, - cchLen, - QueryCB(), - CodePage - ); -} - -HRESULT -STRU::CopyToBuffer( - __out_bcount(*pcb) WCHAR* pszBuffer, - PDWORD pcb -) const -// -// Makes a copy of the stored string into the given buffer -// -{ - _ASSERTE( NULL != pszBuffer ); - _ASSERTE( NULL != pcb ); - - HRESULT hr = S_OK; - DWORD cbNeeded = QueryCB() + sizeof( WCHAR ); - - if( *pcb < cbNeeded ) - { - hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ); - goto Finished; - } - - // - // BUGBUG: StringCchCopy? - // - memcpy( pszBuffer, QueryStr(), cbNeeded ); - -Finished: - - *pcb = cbNeeded; - - return hr; -} - -HRESULT -STRU::CopyToBufferA( - __out_bcount(*pcb) CHAR* pszBuffer, - __inout PDWORD pcb -) const -{ - HRESULT hr = S_OK; - STACK_STRA( straBuffer, 256 ); - hr = straBuffer.CopyW( QueryStr() ); - if ( FAILED( hr ) ) - { - goto Finished; - } - hr = straBuffer.CopyToBuffer( pszBuffer, pcb ); - if ( FAILED( hr ) ) - { - goto Finished; - } -Finished: - return hr; -} - -HRESULT -STRU::SetLen( - __in DWORD cchLen -) -/*++ - * -Routine Description: - - Set the length of the string and null terminate, if there - is sufficient buffer already allocated. Will not reallocate. - -Arguments: - - cchLen - The number of characters in the new string. - -Return Value: - - HRESULT - ---*/ -{ - if( cchLen >= QuerySizeCCH() ) - { - return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - - *( QueryStr() + cchLen ) = L'\0'; - m_cchLen = cchLen; - - return S_OK; -} - -HRESULT -STRU::SafeSnwprintf( - __in PCWSTR pwszFormatString, - ... -) -/*++ - -Routine Description: - - Writes to a STRU, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pwszFormatString - printf format - ... - printf args - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - va_list argsList; - va_start( argsList, pwszFormatString ); - - hr = SafeVsnwprintf(pwszFormatString, argsList); - - va_end( argsList ); - return hr; -} - -HRESULT -STRU::SafeVsnwprintf( - __in PCWSTR pwszFormatString, - va_list argsList -) -/*++ - -Routine Description: - - Writes to a STRU, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pwszFormatString - printf format - argsList - printf va_list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - int cchOutput; - int cchNeeded; - - // - // Format the incoming message using vsnprintf() - // so that the overflows are captured - // - cchOutput = _vsnwprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pwszFormatString, - argsList - ); - - if( cchOutput == -1 ) - { - // - // Couldn't fit this in the original STRU size. - // - cchNeeded = _vscwprintf( pwszFormatString, argsList ); - if( cchNeeded > 64 * 1024 ) - { - // - // If we're trying to produce a string > 64k chars, then - // there is probably a problem - // - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - - // - // _vscprintf doesn't include terminating null character - // - cchNeeded++; - - hr = Resize( cchNeeded ); - if( FAILED( hr ) ) - { - goto Finished; - } - - cchOutput = _vsnwprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pwszFormatString, - argsList - ); - if( -1 == cchOutput ) - { - // - // This should never happen, cause we should already have correctly sized memory - // - _ASSERTE( FALSE ); - - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - } - - // - // always null terminate at the last WCHAR - // - QueryStr()[ QuerySizeCCH() - 1 ] = L'\0'; - - // - // we directly touched the buffer - therefore: - // - hr = SyncWithBuffer(); - if ( FAILED( hr ) ) - { - goto Finished; - } - -Finished: - - if( FAILED( hr ) ) - { - Reset(); - } - - return hr; -} - -HRESULT -STRU::AuxAppend( - __in_ecount(cNumStrings) - PCWSTR const rgpszStrings[], - SIZE_T cNumStrings -) -/*++ - -Routine Description: - - Appends an array of strings of length cNumStrings - -Arguments: - - rgStrings - The array of strings to be appened - cNumStrings - The count of String - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - size_t cbStringsTotal = sizeof( WCHAR ); // Account for null-terminator - - // - // Compute total size of the string. - // Resize internal buffer - // Copy each array element one by one to backing buffer - // Update backing buffer string length - // - for ( SIZE_T i = 0; i < cNumStrings; i++ ) - { - _ASSERTE( rgpszStrings[ i ] != NULL ); - if ( NULL == rgpszStrings[ i ] ) - { - return E_INVALIDARG; - } - - size_t cbString = 0; - - hr = StringCbLengthW( rgpszStrings[ i ], - STRSAFE_MAX_CCH * sizeof( WCHAR ), - &cbString ); - if ( FAILED( hr ) ) - { - return hr; - } - - cbStringsTotal += cbString; - - if ( cbStringsTotal > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - } - - size_t cbBufSizeRequired = QueryCB() + cbStringsTotal; - if ( cbBufSizeRequired > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( m_Buff.QuerySize() < cbBufSizeRequired ) - { - if( !m_Buff.Resize( cbBufSizeRequired ) ) - { - return E_OUTOFMEMORY; - } - } - - STRSAFE_LPWSTR pszStringEnd = QueryStr() + QueryCCH(); - size_t cchRemaining = QuerySizeCCH() - QueryCCH(); - for ( SIZE_T i = 0; i < cNumStrings; i++ ) - { - hr = StringCchCopyExW( pszStringEnd, // pszDest - cchRemaining, // cchDest - rgpszStrings[ i ], // pszSrc - &pszStringEnd, // ppszDestEnd - &cchRemaining, // pcchRemaining - 0 ); // dwFlags - if ( FAILED( hr ) ) - { - _ASSERTE( FALSE ); - HRESULT hr2 = SyncWithBuffer(); - if ( FAILED( hr2 ) ) - { - return hr2; - } - return hr; - } - } - - m_cchLen = static_cast< DWORD >( cbBufSizeRequired ) / sizeof( WCHAR ) - 1; - - return S_OK; -} - -HRESULT -STRU::AuxAppend( - __in_bcount(cbStr) - const WCHAR* pStr, - SIZE_T cbStr, - DWORD cbOffset -) -/*++ - -Routine Description: - - Appends to the string starting at the (byte) offset cbOffset. - -Arguments: - - pStr - A unicode string to be appended - cbStr - Length, in bytes, of pStr - cbOffset - Offset, in bytes, at which to begin the append - -Return Value: - - HRESULT - ---*/ -{ - _ASSERTE( NULL != pStr ); - _ASSERTE( 0 == cbStr % sizeof( WCHAR ) ); - _ASSERTE( cbOffset <= QueryCB() ); - _ASSERTE( 0 == cbOffset % sizeof( WCHAR ) ); - - ULONGLONG cb64NewSize = (ULONGLONG)cbOffset + cbStr + sizeof( WCHAR ); - if( cb64NewSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( m_Buff.QuerySize() < cb64NewSize ) - { - if( !m_Buff.Resize( static_cast(cb64NewSize) ) ) - { - return E_OUTOFMEMORY; - } - } - - memcpy( reinterpret_cast(m_Buff.QueryPtr()) + cbOffset, pStr, cbStr ); - - m_cchLen = (static_cast(cbStr) + cbOffset) / sizeof(WCHAR); - - *( QueryStr() + m_cchLen ) = L'\0'; - - return S_OK; -} - -HRESULT -STRU::AuxAppendA( - __in_bcount(cbStr) - const CHAR* pStr, - SIZE_T cbStr, - DWORD cbOffset, - UINT CodePage -) -/*++ - -Routine Description: - - Convert and append an ANSI string to the string starting at - the (byte) offset cbOffset - -Arguments: - - pStr - An ANSI string to be appended - cbStr - Length, in bytes, of pStr - cbOffset - Offset, in bytes, at which to begin the append - CodePage - code page to use for conversion - -Return Value: - - HRESULT - ---*/ -{ - WCHAR* pszBuffer; - DWORD cchBuffer; - DWORD cchCharsCopied = 0; - - _ASSERTE( NULL != pStr ); - _ASSERTE( cbOffset <= QueryCB() ); - _ASSERTE( 0 == cbOffset % sizeof( WCHAR ) ); - - if ( NULL == pStr ) - { - return E_INVALIDARG; - } - - if( 0 == cbStr ) - { - return S_OK; - } - - // - // Only resize when we have to. When we do resize, we tack on - // some extra space to avoid extra reallocations. - // - if( m_Buff.QuerySize() < (ULONGLONG)cbOffset + (cbStr * sizeof( WCHAR )) + sizeof(WCHAR) ) - { - ULONGLONG cb64NewSize = (ULONGLONG)( cbOffset + cbStr * sizeof(WCHAR) + sizeof( WCHAR ) ); - - // - // Check for the arithmetic overflow - // - if( cb64NewSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( !m_Buff.Resize( static_cast(cb64NewSize) ) ) - { - return E_OUTOFMEMORY; - } - } - - pszBuffer = reinterpret_cast(reinterpret_cast(m_Buff.QueryPtr()) + cbOffset); - cchBuffer = ( m_Buff.QuerySize() - cbOffset - sizeof( WCHAR ) ) / sizeof( WCHAR ); - - cchCharsCopied = MultiByteToWideChar( - CodePage, - MB_ERR_INVALID_CHARS, - pStr, - static_cast(cbStr), - pszBuffer, - cchBuffer - ); - if( 0 == cchCharsCopied ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - // - // set the new length - // - m_cchLen = cchCharsCopied + cbOffset/sizeof(WCHAR); - - // - // Must be less than, cause still need to add NULL - // - _ASSERTE( m_cchLen < QuerySizeCCH() ); - - // - // append NULL character - // - *(QueryStr() + m_cchLen) = L'\0'; - - return S_OK; -} - - -/*++ - -Routine Description: - - Removes leading and trailing whitespace - ---*/ - -VOID -STRU::Trim() -{ - PWSTR pwszString = QueryStr(); - DWORD cchNewLength = m_cchLen; - DWORD cchLeadingWhitespace = 0; - DWORD cchTempLength = 0; - - for (LONG ixString = m_cchLen - 1; ixString >= 0; ixString--) - { - if (iswspace(pwszString[ixString]) != 0) - { - pwszString[ixString] = L'\0'; - cchNewLength--; - } - else - { - break; - } - } - - cchTempLength = cchNewLength; - for (DWORD ixString = 0; ixString < cchTempLength; ixString++) - { - if (iswspace(pwszString[ixString]) != 0) - { - cchLeadingWhitespace++; - cchNewLength--; - } - else - { - break; - } - } - - if (cchNewLength == 0) - { - - Reset(); - } - else if (cchLeadingWhitespace > 0) - { - memmove(pwszString, pwszString + cchLeadingWhitespace, cchNewLength * sizeof(WCHAR)); - pwszString[cchNewLength] = L'\0'; - } - - SyncWithBuffer(); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - pwszPrefix - wide char string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ - -BOOL -STRU::StartsWith( - __in PCWSTR pwszPrefix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - BOOL fMatch = FALSE; - size_t cchPrefix = 0; - - if (pwszPrefix == NULL) - { - goto Finished; - } - - hr = StringCchLengthW( pwszPrefix, - STRSAFE_MAX_CCH, - &cchPrefix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchPrefix <= MAXLONG ); - - if (cchPrefix > m_cchLen) - { - goto Finished; - } - - #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - - fMatch = ( CSTR_EQUAL == CompareStringOrdinal( QueryStr(), - (int)cchPrefix, - pwszPrefix, - (int)cchPrefix, - fIgnoreCase ) ); - #else - - if( fIgnoreCase ) - { - fMatch = ( 0 == _wcsnicmp( QueryStr(), pwszPrefix, cchPrefix ) ); - } - else - { - fMatch = ( 0 == wcsncmp( QueryStr(), pwszPrefix, cchPrefix ) ); - } - - #endif - -Finished: - - return fMatch; -} - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - pwszSuffix - wide char string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ - - -BOOL -STRU::EndsWith( - __in PCWSTR pwszSuffix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - PWSTR pwszString = QueryStr(); - BOOL fMatch = FALSE; - size_t cchSuffix = 0; - ptrdiff_t ixOffset = 0; - - if (pwszSuffix == NULL) - { - goto Finished; - } - - hr = StringCchLengthW( pwszSuffix, - STRSAFE_MAX_CCH, - &cchSuffix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchSuffix <= MAXLONG ); - - if (cchSuffix > m_cchLen) - { - goto Finished; - } - - ixOffset = m_cchLen - cchSuffix; - _ASSERTE(ixOffset >= 0 && ixOffset <= MAXDWORD); - - #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - - fMatch = ( CSTR_EQUAL == CompareStringOrdinal( pwszString + ixOffset, - (int)cchSuffix, - pwszSuffix, - (int)cchSuffix, - fIgnoreCase ) ); - #else - - if( fIgnoreCase ) - { - fMatch = ( 0 == _wcsnicmp( pwszString + ixOffset, pwszSuffix, cchSuffix ) ); - } - else - { - fMatch = ( 0 == wcsncmp( pwszString + ixOffset, pwszSuffix, cchSuffix ) ); - } - - #endif - -Finished: - - return fMatch; -} - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - the initial index. - -Return Value: - - The index for the first character occurrence in the string. - - -1 if not found. - ---*/ -INT -STRU::IndexOf( - __in WCHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const WCHAR* pwChar = wcschr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pwChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified substring. - -Arguments: - - pwszValue - substring to find - dwStartIndex - initial index. - -Return Value: - - The index for the first character occurrence in the string. - - -1 if not found. - ---*/ -INT -STRU::IndexOf( - __in PCWSTR pwszValue, - __in DWORD dwStartIndex - ) const -{ - HRESULT hr = S_OK; - INT nIndex = -1; - SIZE_T cchValue = 0; - - // Validate input parameters - if( dwStartIndex >= QueryCCH() || !pwszValue ) - { - goto Finished; - } - - const WCHAR* pwChar = wcsstr( QueryStr() + dwStartIndex, pwszValue ); - - // Determine the index if found - if( pwChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the last occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - initial index. - -Return Value: - - The index for the last character occurrence in the string. - - -1 if not found. - ---*/ -INT -STRU::LastIndexOf( - __in WCHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const WCHAR* pwChar = wcsrchr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pwChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - -//static -HRESULT -STRU::ExpandEnvironmentVariables( - __in PCWSTR pszString, - __out STRU * pstrExpandedString - ) -/*++ - -Routine Description: - - Expand the environment variables in a string - -Arguments: - - pszString - String with environment variables to expand - pstrExpandedString - Receives expanded string on success - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - DWORD cchNewSize = 0; - - if ( pszString == NULL || - pstrExpandedString == NULL ) - { - DBG_ASSERT( FALSE ); - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Exit; - } - - cchNewSize = ExpandEnvironmentStrings( pszString, - pstrExpandedString->QueryStr(), - pstrExpandedString->QuerySizeCCH() ); - if ( cchNewSize == 0 ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Exit; - } - - if ( cchNewSize > pstrExpandedString->QuerySizeCCH() ) - { - hr = pstrExpandedString->Resize( - ( cchNewSize + 1 ) * sizeof( WCHAR ) - ); - if ( FAILED( hr ) ) - { - goto Exit; - } - - cchNewSize = ExpandEnvironmentStrings( - pszString, - pstrExpandedString->QueryStr(), - pstrExpandedString->QuerySizeCCH() - ); - - if ( cchNewSize == 0 || - cchNewSize > pstrExpandedString->QuerySizeCCH() ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Exit; - } - } - - pstrExpandedString->SyncWithBuffer(); - - hr = S_OK; - -Exit: - - return hr; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx deleted file mode 100644 index 69b42e625009..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx +++ /dev/null @@ -1,1416 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -// -// BUGBUG: Turn off optimization on ia64 builds due to a compiler bug -// -#if (defined(_M_IA64) && (_MSC_FULL_VER == 13009286)) -#pragma optimize("",off) -#endif - -#define LF 0x0A -#define SP 0x20 -#define HT 0x09 - -#define HTTP_CHAR 0x001 -#define HTTP_UPCASE 0x002 -#define HTTP_LOCASE 0x004 -#define HTTP_ALPHA (HTTP_UPCASE | HTTP_LOCASE) -#define HTTP_DIGIT 0x008 -#define HTTP_CTL 0x010 -#define HTTP_LWS 0x020 -#define HTTP_HEX 0x040 -#define HTTP_SEPERATOR 0x080 -#define HTTP_TOKEN 0x100 - -#define URL_LEGAL 0x200 -#define URL_TOKEN (HTTP_ALPHA | HTTP_DIGIT | URL_LEGAL) - -#define IS_HTTP_UPCASE(c) (HttpChars[(UCHAR)(c)] & HTTP_UPCASE) -#define IS_HTTP_LOCASE(c) (HttpChars[(UCHAR)(c)] & HTTP_UPCASE) -#define IS_HTTP_ALPHA(c) (HttpChars[(UCHAR)(c)] & HTTP_ALPHA) -#define IS_HTTP_DIGIT(c) (HttpChars[(UCHAR)(c)] & HTTP_DIGIT) -#define IS_HTTP_HEX(c) (HttpChars[(UCHAR)(c)] & HTTP_HEX) -#define IS_HTTP_CTL(c) (HttpChars[(UCHAR)(c)] & HTTP_CTL) -#define IS_HTTP_LWS(c) (HttpChars[(UCHAR)(c)] & HTTP_LWS) -#define IS_HTTP_SEPERATOR(c) (HttpChars[(UCHAR)(c)] & HTTP_SEPERATOR) -#define IS_HTTP_TOKEN(c) (HttpChars[(UCHAR)(c)] & HTTP_TOKEN) -#define IS_URL_TOKEN(c) (HttpChars[(UCHAR)(c)] & URL_TOKEN) - -// Some stuff not defined in VS SDK -#ifndef NT_SUCCESS -#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) -#endif - -// Copied from ntstatus.h, otherwise we will have double definition for -// number of macros that are both in ntstatus.h and winnt.h -#ifndef STATUS_SUCCESS -#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth -#endif -#ifndef STATUS_OBJECT_PATH_SYNTAX_BAD -#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL) -#endif -#ifndef STATUS_OBJECT_PATH_INVALID -#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L) -#endif -// -// Constant Declarations for UTF8 Encoding -// - -#define ASCII 0x007f - -#define UTF8_2_MAX 0x07ff // max UTF8 2-byte sequence (32 * 64 =2048) -#define UTF8_1ST_OF_2 0xc0 // 110x xxxx -#define UTF8_1ST_OF_3 0xe0 // 1110 xxxx -#define UTF8_1ST_OF_4 0xf0 // 1111 xxxx -#define UTF8_TRAIL 0x80 // 10xx xxxx - -#define HIGHER_6_BIT(u) ((u) >> 12) -#define MIDDLE_6_BIT(u) (((u) & 0x0fc0) >> 6) -#define LOWER_6_BIT(u) ((u) & 0x003f) - -#define BIT7(a) ((a) & 0x80) -#define BIT6(a) ((a) & 0x40) - -#define HIGH_SURROGATE_START 0xd800 -#define HIGH_SURROGATE_END 0xdbff -#define LOW_SURROGATE_START 0xdc00 -#define LOW_SURROGATE_END 0xdfff - -#define EMIT_CHAR(ch) \ - do { \ - pDest[0] = (ch); \ - pDest += 1; \ - BytesCopied += 2; \ - } while (0) - -typedef enum _URL_TYPE -{ - UrlTypeUtf8, - UrlTypeAnsi, - UrlTypeDbcs -} URL_TYPE; - -typedef enum _URL_PART -{ - Scheme, - HostName, - AbsPath, - QueryString - -} URL_PART; - -#define IS_UTF8_TRAILBYTE(ch) (((ch) & 0xc0) == 0x80) - -// -// These are copied from RTL NLS routines. -// - -#define DBCS_TABLE_SIZE 256 -extern PUSHORT NlsLeadByteInfo; - -#define LeadByteTable (*(PUSHORT *)NlsLeadByteInfo) -#define IS_LEAD_BYTE(c) (IsDBCSLeadByte(c)) - -ULONG HttpChars[256]; -USHORT FastPopChars[256]; -USHORT DummyPopChars[256]; -WCHAR FastUpcaseChars[256]; -BOOL g_UlEnableNonUTF8; -BOOL g_UlEnableDBCS; -BOOL g_UlFavorDBCS; - -// RtlNtStatusToDosError is nowhere defined, should be used through -// native code "reflection" -typedef ULONG (RTL_NT_STATUS_TO_DOS_ERROR_PROC)(NTSTATUS); -static RTL_NT_STATUS_TO_DOS_ERROR_PROC* rtlNtStatusToDosErrorProc = NULL; -static HMODULE lib = NULL; - -HRESULT -WIN32_FROM_NTSTATUS( - __in NTSTATUS status, - __out DWORD * pResult - ) -{ - HRESULT hr = S_OK; - if (pResult == NULL) - { - hr = E_INVALIDARG; - goto Finished; - } - if (lib == NULL) - { - lib = GetModuleHandle(L"Ntdll.dll"); - if (lib == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - goto Finished; - } - } - if (rtlNtStatusToDosErrorProc == NULL) - { - rtlNtStatusToDosErrorProc = - (RTL_NT_STATUS_TO_DOS_ERROR_PROC*)GetProcAddress( - lib, "RtlNtStatusToDosError"); - if (rtlNtStatusToDosErrorProc == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - goto Finished; - } - } - *pResult = rtlNtStatusToDosErrorProc(status); - -Finished: - return hr; -} - -NTSTATUS -Unescape( - IN PUCHAR pChar, - OUT PUCHAR pOutChar - ) - -{ - UCHAR Result, Digit; - - if (pChar[0] != '%' || - SAFEIsXDigit(pChar[1]) == FALSE || - SAFEIsXDigit(pChar[2]) == FALSE) - { - return STATUS_OBJECT_PATH_SYNTAX_BAD; - } - - // - // HexToChar() inlined - // - - // uppercase #1 - // - if (SAFEIsAlpha(pChar[1])) - Digit = (UCHAR) toupper(pChar[1]); - else - Digit = pChar[1]; - - Result = ((Digit >= 'A') ? (Digit - 'A' + 0xA) : (Digit - '0')) << 4; - - // uppercase #2 - // - if (SAFEIsAlpha(pChar[2])) - Digit = (UCHAR) toupper(pChar[2]); - else - Digit = pChar[2]; - - Result |= (Digit >= 'A') ? (Digit - 'A' + 0xA) : (Digit - '0'); - - *pOutChar = Result; - - return STATUS_SUCCESS; - -} // Unescape - -// -// PopChar is used only if the string is not UTF-8, or UrlPart != QueryString, -// or the current character is '%' or its high bit is set. In all other cases, -// the FastPopChars table is used for fast conversion. -// - -__inline -NTSTATUS -PopChar( - IN URL_TYPE UrlType, - IN URL_PART UrlPart, - __in LPSTR pChar, - __out WCHAR * pUnicodeChar, - __out WCHAR * pUnicodeChar2, - OUT PULONG pCharToSkip - ) -{ - NTSTATUS Status; - WCHAR UnicodeChar = L'\0'; - WCHAR UnicodeChar2 = L'\0'; - UCHAR Char; - UCHAR Trail1; - UCHAR Trail2; - UCHAR Trail3; - ULONG CharToSkip; - - // - // validate it as a valid url character - // - - if (UrlPart != QueryString) - { - if (IS_URL_TOKEN((UCHAR)pChar[0]) == FALSE) - { - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - } - else - { - // - // Allow anything but linefeed in the query string. - // - - if (pChar[0] == LF) - { - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - - UnicodeChar = (USHORT) (UCHAR)pChar[0]; - CharToSkip = 1; - - // skip all the decoding stuff - goto slash; - } - - // - // need to unescape ? - // - // can't decode the query string. that would be lossy decodeing - // as '=' and '&' characters might be encoded, but have meaning - // to the usermode parser. - // - - if (pChar[0] == '%') - { - Status = Unescape((PUCHAR)pChar, &Char); - if (NT_SUCCESS(Status) == FALSE) - goto end; - CharToSkip = 3; - } - else - { - Char = pChar[0]; - CharToSkip = 1; - } - - if (UrlType == UrlTypeUtf8) - { - // - // convert to unicode, checking for utf8 . - // - // 3 byte runs are the largest we can have. 16 bits in UCS-2 = - // 3 bytes of (4+4,2+6,2+6) where it's code + char. - // for a total of 6+6+4 char bits = 16 bits. - // - - // - // NOTE: we'll only bother to decode utf if it was escaped - // thus the (CharToSkip == 3) - // - if ((CharToSkip == 3) && ((Char & 0xf8) == 0xf0)) - { - // 4 byte run - // - - // Unescape the next 3 trail bytes - // - - Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail1); - if (NT_SUCCESS(Status) == FALSE) - goto end; - - CharToSkip += 3; // %xx - - Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail2); - if (NT_SUCCESS(Status) == FALSE) - goto end; - - CharToSkip += 3; // %xx - - Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail3); - if (NT_SUCCESS(Status) == FALSE) - goto end; - - CharToSkip += 3; // %xx - - if (IS_UTF8_TRAILBYTE(Trail1) == FALSE || - IS_UTF8_TRAILBYTE(Trail2) == FALSE || - IS_UTF8_TRAILBYTE(Trail3) == FALSE) - { - // bad utf! - // - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - - // handle four byte case - convert to utf-16 - // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - - UnicodeChar = ((USHORT) ((Char & 0x07) << 8) | - ((Trail1 & 0x3f) << 2) | - ((Trail2 & 0x30) >> 4)) + 0xD7C0; - UnicodeChar2 = ((USHORT) ((Trail2 & 0x0f) << 6) | - (Trail3 & 0x3f)) | 0xDC00; - } - else if ((CharToSkip == 3) && ((Char & 0xf0) == 0xe0)) - { - // 3 byte run - // - - // Unescape the next 2 trail bytes - // - - Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail1); - if (NT_SUCCESS(Status) == FALSE) - goto end; - - CharToSkip += 3; // %xx - - Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail2); - if (NT_SUCCESS(Status) == FALSE) - goto end; - - CharToSkip += 3; // %xx - - if (IS_UTF8_TRAILBYTE(Trail1) == FALSE || - IS_UTF8_TRAILBYTE(Trail2) == FALSE) - { - // bad utf! - // - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - - // handle three byte case - // 1110xxxx 10xxxxxx 10xxxxxx - - UnicodeChar = (USHORT) (((Char & 0x0f) << 12) | - ((Trail1 & 0x3f) << 6) | - (Trail2 & 0x3f)); - - } - else if ((CharToSkip == 3) && ((Char & 0xe0) == 0xc0)) - { - // 2 byte run - // - - // Unescape the next 1 trail byte - // - - Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail1); - if (NT_SUCCESS(Status) == FALSE) - goto end; - - CharToSkip += 3; // %xx - - if (IS_UTF8_TRAILBYTE(Trail1) == FALSE) - { - // bad utf! - // - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - - // handle two byte case - // 110xxxxx 10xxxxxx - - UnicodeChar = (USHORT) (((Char & 0x1f) << 6) | - (Trail1 & 0x3f)); - - } - - // now this can either be unescaped high-bit (bad) - // or escaped high-bit. (also bad) - // - // thus not checking CharToSkip - // - - else if ((Char & 0x80) == 0x80) - { - // high bit set ! bad utf! - // - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - - } - // - // Normal character (again either escaped or unescaped) - // - else - { - // - // Simple conversion to unicode, it's 7-bit ascii. - // - - UnicodeChar = (USHORT)Char; - } - - } - else // UrlType != UrlTypeUtf8 - { - UCHAR AnsiChar[2]; - ULONG AnsiCharSize; - - // - // Convert ANSI character to Unicode. - // If the UrlType is UrlTypeDbcs, then we may have - // a DBCS lead/trail pair. - // - - if (UrlType == UrlTypeDbcs && IS_LEAD_BYTE(Char)) - { - UCHAR SecondByte; - - // - // This is a double-byte character. - // - - SecondByte = *(pChar+CharToSkip); - - AnsiCharSize = 2; - AnsiChar[0] = Char; - - if (SecondByte == '%') - { - Status = Unescape((PUCHAR)pChar+CharToSkip, &AnsiChar[1]); - if (!NT_SUCCESS(Status)) - { - goto end; - } - - CharToSkip += 3; // %xx - } - else - { - AnsiChar[1] = SecondByte; - CharToSkip += 1; - } - - } - else - { - // - // This is a single-byte character. - // - - AnsiCharSize = 1; - AnsiChar[0] = Char; - - } - /* - Status = RtlMultiByteToUnicodeN( - &UnicodeChar, - sizeof(WCHAR), - NULL, - (PCHAR) &AnsiChar[0], - AnsiCharSize - ); - */ - Status = MultiByteToWideChar( - CP_ACP, - 0, - (PCHAR) &AnsiChar[0], - AnsiCharSize, - &UnicodeChar, - sizeof(WCHAR) - ); - - if (!NT_SUCCESS(Status)) - { - goto end; - } - } - - -slash: - // - // turn backslashes into forward slashes - // - - if (UrlPart != QueryString && UnicodeChar == L'\\') - { - UnicodeChar = L'/'; - } - else if (UnicodeChar == UNICODE_NULL) - { - // - // we pop'd a NULL. bad! - // - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - - *pCharToSkip = CharToSkip; - *pUnicodeChar = UnicodeChar; - *pUnicodeChar2 = UnicodeChar2; - - Status = STATUS_SUCCESS; - -end: - return Status; - -} // PopChar - - -// -// Private constants. -// - -#define ACTION_NOTHING 0x00000000 -#define ACTION_EMIT_CH 0x00010000 -#define ACTION_EMIT_DOT_CH 0x00020000 -#define ACTION_EMIT_DOT_DOT_CH 0x00030000 -#define ACTION_BACKUP 0x00040000 -#define ACTION_MASK 0xFFFF0000 - -// -// Private globals -// - -// -// this table says what to do based on the current state and the current -// character -// -ULONG pActionTable[16] = -{ - // - // state 0 = fresh, seen nothing exciting yet - // - ACTION_EMIT_CH, // other = emit it state = 0 - ACTION_EMIT_CH, // "." = emit it state = 0 - ACTION_NOTHING, // EOS = normal finish state = 4 - ACTION_EMIT_CH, // "/" = we saw the "/", emit it state = 1 - - // - // state 1 = we saw a "/" ! - // - ACTION_EMIT_CH, // other = emit it, state = 0 - ACTION_NOTHING, // "." = eat it, state = 2 - ACTION_NOTHING, // EOS = normal finish state = 4 - ACTION_NOTHING, // "/" = extra slash, eat it, state = 1 - - // - // state 2 = we saw a "/" and ate a "." ! - // - ACTION_EMIT_DOT_CH, // other = emit the dot we ate. state = 0 - ACTION_NOTHING, // "." = eat it, a .. state = 3 - ACTION_NOTHING, // EOS = normal finish state = 4 - ACTION_NOTHING, // "/" = we ate a "/./", swallow it state = 1 - - // - // state 3 = we saw a "/" and ate a ".." ! - // - ACTION_EMIT_DOT_DOT_CH, // other = emit the "..". state = 0 - ACTION_EMIT_DOT_DOT_CH, // "." = 3 dots, emit the ".." state = 0 - ACTION_BACKUP, // EOS = we have a "/..\0", backup! state = 4 - ACTION_BACKUP // "/" = we have a "/../", backup! state = 1 -}; - -// -// this table says which newstate to be in given the current state and the -// character we saw -// -ULONG pNextStateTable[16] = -{ - // state 0 - 0 , // other - 0 , // "." - 4 , // EOS - 1 , // "\" - - // state 1 - 0 , // other - 2 , // "." - 4 , // EOS - 1 , // "\" - - // state 2 - 0 , // other - 3 , // "." - 4 , // EOS - 1 , // "\" - - // state 3 - 0 , // other - 0 , // "." - 4 , // EOS - 1 // "\" -}; - -// -// this says how to index into pNextStateTable given our current state. -// -// since max states = 4, we calculate the index by multiplying with 4. -// -#define IndexFromState( st) ( (st) * 4) - - -/***************************************************************************++ - -Routine Description: - - This function can be told to clean up UTF-8, ANSI, or DBCS URLs. - - Unescape - Convert backslash to forward slash - Remove double slashes (empty directiories names) - e.g. // or \\ - Handle /./ - Handle /../ - Convert to unicode - computes the case insensitive hash - -Arguments: - - -Return Value: - - NTSTATUS - Completion status. - - ---***************************************************************************/ -NTSTATUS -UlpCleanAndCopyUrlByType( - IN URL_TYPE UrlType, - IN URL_PART UrlPart, - __inout PWSTR pDestination, - __in_ecount(SourceLength) LPSTR pSource, - IN ULONG SourceLength, - OUT PULONG pBytesCopied, - __deref_opt_out_opt PWSTR * ppQueryString - ) -{ - NTSTATUS Status; - PWSTR pDest; - PUCHAR pChar; - ULONG CharToSkip; - ULONG BytesCopied; - PWSTR pQueryString; - ULONG StateIndex; - WCHAR UnicodeChar; - WCHAR UnicodeChar2 = L'\0'; - BOOLEAN MakeCanonical; - PUSHORT pFastPopChar; - - pDest = pDestination; - pQueryString = NULL; - BytesCopied = 0; - - pChar = (PUCHAR)pSource; - CharToSkip = 0; - - StateIndex = 0; - - MakeCanonical = (UrlPart == AbsPath) ? TRUE : FALSE; - - if (UrlType == UrlTypeUtf8 && UrlPart != QueryString) - { - pFastPopChar = FastPopChars; - } - else - { - pFastPopChar = DummyPopChars; - } - - while (SourceLength > 0) - { - // - // advance ! it's at the top of the loop to enable ANSI_NULL to - // come through ONCE - // - - pChar += CharToSkip; - SourceLength -= CharToSkip; - - // - // well? have we hit the end? - // - - if (SourceLength == 0) - { - UnicodeChar = UNICODE_NULL; - UnicodeChar2 = UNICODE_NULL; - } - else - { - // - // Nope. Peek briefly to see if we hit the query string - // - - if (UrlPart == AbsPath && pChar[0] == '?') - { - DBG_ASSERT(pQueryString == NULL); - - // - // remember it's location - // - - pQueryString = pDest; - - // - // let it fall through ONCE to the canonical - // in order to handle a trailing "/.." like - // "http://hostname:80/a/b/..?v=1&v2" - // - - UnicodeChar = L'?'; - UnicodeChar2 = UNICODE_NULL; - CharToSkip = 1; - - // - // now we are cleaning the query string - // - - UrlPart = QueryString; - - // - // cannot use fast path for PopChar anymore - // - - pFastPopChar = DummyPopChars; - } - else - { - USHORT NextUnicodeChar = pFastPopChar[*pChar]; - - // - // Grab the next character. Try to be fast for the - // normal character case. Otherwise call PopChar. - // - - if (NextUnicodeChar == 0) - { - Status = PopChar( - UrlType, - UrlPart, - (LPSTR)pChar, - &UnicodeChar, - &UnicodeChar2, - &CharToSkip - ); - - if (NT_SUCCESS(Status) == FALSE) - goto end; - } - else - { -#if DBG - Status = PopChar( - UrlType, - UrlPart, - (LPSTR)pChar, - &UnicodeChar, - &UnicodeChar2, - &CharToSkip - ); - - DBG_ASSERT(NT_SUCCESS(Status)); - DBG_ASSERT(UnicodeChar == NextUnicodeChar); - DBG_ASSERT(CharToSkip == 1); -#endif - UnicodeChar = NextUnicodeChar; - UnicodeChar2 = UNICODE_NULL; - CharToSkip = 1; - } - } - } - - if (MakeCanonical) - { - // - // now use the state machine to make it canonical . - // - - // - // from the old value of StateIndex, figure out our new base StateIndex - // - StateIndex = IndexFromState(pNextStateTable[StateIndex]); - - // - // did we just hit the query string? this will only happen once - // that we take this branch after hitting it, as we stop - // processing after hitting it. - // - - if (UrlPart == QueryString) - { - // - // treat this just like we hit a NULL, EOS. - // - - StateIndex += 2; - } - else - { - // - // otherwise based the new state off of the char we - // just popped. - // - - switch (UnicodeChar) - { - case UNICODE_NULL: StateIndex += 2; break; - case L'.': StateIndex += 1; break; - case L'/': StateIndex += 3; break; - default: StateIndex += 0; break; - } - } - - } - else - { - StateIndex = (UnicodeChar == UNICODE_NULL) ? 2 : 0; - } - - // - // Perform the action associated with the state. - // - - switch (pActionTable[StateIndex]) - { - case ACTION_EMIT_DOT_DOT_CH: - - EMIT_CHAR(L'.'); - - // fall through - - case ACTION_EMIT_DOT_CH: - - EMIT_CHAR(L'.'); - - // fall through - - case ACTION_EMIT_CH: - - EMIT_CHAR(UnicodeChar); - if (UnicodeChar2 != UNICODE_NULL) - { - EMIT_CHAR(UnicodeChar2); - } - - // fall through - - case ACTION_NOTHING: - break; - - case ACTION_BACKUP: - - // - // pDest currently points 1 past the last '/'. backup over it and - // find the preceding '/', set pDest to 1 past that one. - // - - // - // backup to the '/' - // - - pDest -= 1; - BytesCopied -= 2; - - DBG_ASSERT(pDest[0] == L'/'); - - // - // are we at the start of the string? that's bad, can't go back! - // - - if (pDest == pDestination) - { - DBG_ASSERT(BytesCopied == 0); - Status = STATUS_OBJECT_PATH_INVALID; - goto end; - } - - // - // back up over the '/' - // - - pDest -= 1; - BytesCopied -= 2; - - DBG_ASSERT(pDest > pDestination); - - // - // now find the previous slash - // - - while (pDest > pDestination && pDest[0] != L'/') - { - pDest -= 1; - BytesCopied -= 2; - } - - // - // we already have a slash, so don't have to store 1. - // - - DBG_ASSERT(pDest[0] == L'/'); - - // - // simply skip it, as if we had emitted it just now - // - - pDest += 1; - BytesCopied += 2; - - break; - - default: - DBG_ASSERT(!"http!UlpCleanAndCopyUrl: Invalid action code in state table!"); - Status = STATUS_OBJECT_PATH_SYNTAX_BAD; - goto end; - } - - // - // Just hit the query string ? - // - - if (MakeCanonical && UrlPart == QueryString) - { - // - // Stop canonical processing - // - - MakeCanonical = FALSE; - - // - // Need to emit the '?', it wasn't emitted above - // - - DBG_ASSERT(pActionTable[StateIndex] != ACTION_EMIT_CH); - - EMIT_CHAR(L'?'); - - } - - } - - // - // terminate the string, it hasn't been done in the loop - // - - DBG_ASSERT((pDest-1)[0] != UNICODE_NULL); - - pDest[0] = UNICODE_NULL; - *pBytesCopied = BytesCopied; - - if (ppQueryString != NULL) - { - *ppQueryString = pQueryString; - } - - Status = STATUS_SUCCESS; - - -end: - return Status; - -} // UlpCleanAndCopyUrlByType - - -/***************************************************************************++ - -Routine Description: - - - Unescape - Convert backslash to forward slash - Remove double slashes (empty directiories names) - e.g. // or \\ - Handle /./ - Handle /../ - Convert to unicode - -Arguments: - -Return Value: - - HRESULT - - ---***************************************************************************/ -HRESULT -UlCleanAndCopyUrl( - __in LPSTR pSource, - IN ULONG SourceLength, - OUT PULONG pBytesCopied, - __inout PWSTR pDestination, - __deref_opt_out_opt PWSTR * ppQueryString OPTIONAL - ) -{ - NTSTATUS Status; - URL_TYPE AnsiUrlType = g_UlEnableDBCS ? UrlTypeDbcs : UrlTypeAnsi; - - if (!g_UlEnableNonUTF8) - { - // - // Only accept UTF-8 URLs. - // - - Status = UlpCleanAndCopyUrlByType( - UrlTypeUtf8, - AbsPath, - pDestination, - pSource, - SourceLength, - pBytesCopied, - ppQueryString - ); - - } - else if (!g_UlFavorDBCS) - { - // - // The URL may be either UTF-8 or ANSI. First - // try UTF-8, and if that fails go for ANSI. - // - - Status = UlpCleanAndCopyUrlByType( - UrlTypeUtf8, - AbsPath, - pDestination, - pSource, - SourceLength, - pBytesCopied, - ppQueryString - ); - - if (!NT_SUCCESS(Status)) - { - Status = UlpCleanAndCopyUrlByType( - AnsiUrlType, - AbsPath, - pDestination, - pSource, - SourceLength, - pBytesCopied, - ppQueryString - ); - - } - - } - else - { - // - // The URL may be either ANSI or UTF-8. First - // try the ANSI interpretation, and if that fails - // go for UTF-8. - // - Status = UlpCleanAndCopyUrlByType( - AnsiUrlType, - AbsPath, - pDestination, - pSource, - SourceLength, - pBytesCopied, - ppQueryString - ); - - if (!NT_SUCCESS(Status)) - { - Status = UlpCleanAndCopyUrlByType( - UrlTypeUtf8, - AbsPath, - pDestination, - pSource, - SourceLength, - pBytesCopied, - ppQueryString - ); - - } - } - - // - // Convert NTSTATUS to HRESULT - // - - if ( Status == STATUS_SUCCESS ) - { - return S_OK; - } - else - { - DWORD dwErr = 0; - if (SUCCEEDED(WIN32_FROM_NTSTATUS( Status, &dwErr ))) - { - return HRESULT_FROM_WIN32( dwErr ); - } - else - { - return Status; - } - } -} - -HRESULT -UlInitializeParsing( - VOID -) -{ - ULONG i; - UCHAR c; - HKEY hKey; - DWORD dwType; - DWORD dwData; - DWORD cbData; - - // - // First read the HTTP registry settings on how to handle URLs - // - - g_UlEnableNonUTF8 = TRUE; - g_UlEnableDBCS = FALSE; - g_UlFavorDBCS = FALSE; - - if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, - L"System\\CurrentControlSet\\Services\\http\\Parameters", - 0, - KEY_READ, - &hKey ) == ERROR_SUCCESS ) - { - cbData = sizeof( dwData ); - - if ( RegQueryValueEx( hKey, - L"EnableNonUTF8", - NULL, - &dwType, - (LPBYTE) &dwData, - &cbData ) == ERROR_SUCCESS && - dwType == REG_DWORD ) - { - g_UlEnableNonUTF8 = !!dwData; - } - - cbData = sizeof( dwData ); - - if ( g_UlEnableNonUTF8 ) - { - if ( RegQueryValueEx( hKey, - L"EnableDBCS", - NULL, - &dwType, - (LPBYTE) &dwData, - &cbData ) == ERROR_SUCCESS && - dwType == REG_DWORD ) - { - g_UlEnableDBCS = !!dwData; - } - } - else - { - g_UlEnableDBCS = FALSE; - } - - cbData = sizeof( dwData ); - - if ( g_UlEnableDBCS ) - { - if ( RegQueryValueEx( hKey, - L"FavorDBCS", - NULL, - &dwType, - (LPBYTE) &dwData, - &cbData ) == ERROR_SUCCESS && - dwType == REG_DWORD ) - { - g_UlFavorDBCS = !!dwData; - } - } - else - { - g_UlFavorDBCS = FALSE; - } - - RegCloseKey( hKey ); - } - - - // Initialize the HttpChars array appropriately. - - for (i = 0; i < 128; i++) - { - HttpChars[i] = HTTP_CHAR; - } - - for (i = 'A'; i <= 'Z'; i++) - { - HttpChars[i] |= HTTP_UPCASE; - } - - for (i = 'a'; i <= 'z'; i++) - { - HttpChars[i] |= HTTP_LOCASE; - } - - for (i = '0'; i <= '9'; i++) - { - HttpChars[i] |= (HTTP_DIGIT | HTTP_HEX); - } - - - for (i = 0; i <= 31; i++) - { - HttpChars[i] |= HTTP_CTL; - } - - HttpChars[127] |= HTTP_CTL; - - HttpChars[SP] |= HTTP_LWS; - HttpChars[HT] |= HTTP_LWS; - - - for (i = 'A'; i <= 'F'; i++) - { - HttpChars[i] |= HTTP_HEX; - } - - for (i = 'a'; i <= 'f'; i++) - { - HttpChars[i] |= HTTP_HEX; - } - - HttpChars['('] |= HTTP_SEPERATOR; - HttpChars[')'] |= HTTP_SEPERATOR; - HttpChars['<'] |= HTTP_SEPERATOR; - HttpChars['>'] |= HTTP_SEPERATOR; - HttpChars['@'] |= HTTP_SEPERATOR; - HttpChars[','] |= HTTP_SEPERATOR; - HttpChars[';'] |= HTTP_SEPERATOR; - HttpChars[':'] |= HTTP_SEPERATOR; - HttpChars['\\'] |= HTTP_SEPERATOR; - HttpChars['"'] |= HTTP_SEPERATOR; - HttpChars['/'] |= HTTP_SEPERATOR; - HttpChars['['] |= HTTP_SEPERATOR; - HttpChars[']'] |= HTTP_SEPERATOR; - HttpChars['?'] |= HTTP_SEPERATOR; - HttpChars['='] |= HTTP_SEPERATOR; - HttpChars['{'] |= HTTP_SEPERATOR; - HttpChars['}'] |= HTTP_SEPERATOR; - HttpChars[SP] |= HTTP_SEPERATOR; - HttpChars[HT] |= HTTP_SEPERATOR; - - - // - // URL "reserved" characters (rfc2396) - // - - HttpChars[';'] |= URL_LEGAL; - HttpChars['/'] |= URL_LEGAL; - HttpChars['\\'] |= URL_LEGAL; - HttpChars['?'] |= URL_LEGAL; - HttpChars[':'] |= URL_LEGAL; - HttpChars['@'] |= URL_LEGAL; - HttpChars['&'] |= URL_LEGAL; - HttpChars['='] |= URL_LEGAL; - HttpChars['+'] |= URL_LEGAL; - HttpChars['$'] |= URL_LEGAL; - HttpChars[','] |= URL_LEGAL; - - - // - // URL escape character - // - - HttpChars['%'] |= URL_LEGAL; - - // - // URL "mark" characters (rfc2396) - // - - HttpChars['-'] |= URL_LEGAL; - HttpChars['_'] |= URL_LEGAL; - HttpChars['.'] |= URL_LEGAL; - HttpChars['!'] |= URL_LEGAL; - HttpChars['~'] |= URL_LEGAL; - HttpChars['*'] |= URL_LEGAL; - HttpChars['\''] |= URL_LEGAL; - HttpChars['('] |= URL_LEGAL; - HttpChars[')'] |= URL_LEGAL; - - - // - // RFC2396 describes these characters as `unwise' "because gateways and - // other transport agents are known to sometimes modify such characters, - // or they are used as delimiters". However, for compatibility with - // IIS 5.0 and DAV, we must allow these unwise characters in URLs. - // - - HttpChars['{'] |= URL_LEGAL; - HttpChars['}'] |= URL_LEGAL; - HttpChars['|'] |= URL_LEGAL; - HttpChars['^'] |= URL_LEGAL; - HttpChars['['] |= URL_LEGAL; - HttpChars[']'] |= URL_LEGAL; - HttpChars['`'] |= URL_LEGAL; - - // - // '#', '%', and '"' are not considered URL_LEGAL, according to the RFC. - // However, IIS 5.0 allowed them, so we should too. - // - - HttpChars['#'] |= URL_LEGAL; - HttpChars['%'] |= URL_LEGAL; - HttpChars['"'] |= URL_LEGAL; - - // - // In DBCS locales we need to explicitly accept lead bytes which - // we would normally reject. - // - - if (0) // BUGBUG - { - for (i = 0; i < DBCS_TABLE_SIZE; i++) - { - if (IS_LEAD_BYTE((BYTE)i)) - { - HttpChars[i] |= URL_LEGAL; - } - } - } - - // - // These US-ASCII characters are "excluded"; i.e. not URL_LEGAL (see RFC): - // '<' | '>' | ' ' (0x20) - // In addition, control characters (0x00-0x1F and 0x7F) and - // non US-ASCII characters (0x80-0xFF) are not URL_LEGAL. - // - - for (i = 0; i < 128; i++) - { - if (!IS_HTTP_SEPERATOR(i) && !IS_HTTP_CTL(i)) - { - HttpChars[i] |= HTTP_TOKEN; - } - } - - - // - // Fast path for PopChar - // - - RtlZeroMemory(FastPopChars, 256 * sizeof(USHORT)); - RtlZeroMemory(DummyPopChars, 256 * sizeof(USHORT)); - - for (i = 0; i < 256; i++) - { - c = (UCHAR)i; - - if (IS_URL_TOKEN(c) && c != '%' && (c & 0x80) != 0x80) - { - FastPopChars[i] = (USHORT)c; - } - } - - // - // Turn backslashes into forward slashes - // - - FastPopChars['\\'] = L'/'; - - - // - // Fast path for UpcaseUnicodeChar - // - - for (i = 0; i < 256; i++) - { - FastUpcaseChars[i] = towupper((WCHAR)i); - } - - - return S_OK; -} diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx deleted file mode 100644 index 22c31a0ed230..000000000000 --- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "precomp.h" - -HRESULT -MakePathCanonicalizationProof( - IN PCWSTR pszName, - OUT STRU * pstrPath -) -/*++ - -Routine Description: - - This functions adds a prefix - to the string, which is "\\?\UNC\" for a UNC path, and "\\?\" for - other paths. This prefix tells Windows not to parse the path. - -Arguments: - - IN pszName - The path to be converted - OUT pstrPath - Output path created - -Return Values: - - HRESULT - ---*/ -{ - HRESULT hr; - - if (pszName[0] == L'\\' && pszName[1] == L'\\') - { - // - // If the path is already canonicalized, just return - // - - if ((pszName[2] == '?' || pszName[2] == '.') && - pszName[3] == '\\') - { - hr = pstrPath->Copy(pszName); - - if (SUCCEEDED(hr)) - { - // - // If the path was in DOS form ("\\.\"), - // we need to change it to Win32 from ("\\?\") - // - - pstrPath->QueryStr()[2] = L'?'; - } - - return hr; - } - - pszName += 2; - - - if (FAILED(hr = pstrPath->Copy(L"\\\\?\\UNC\\"))) - { - return hr; - } - } - else - { - if (FAILED(hr = pstrPath->Copy(L"\\\\?\\"))) - { - return hr; - } - } - - return pstrPath->Append(pszName); -} - diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props b/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props index 23de62ca65a6..43b3f6b7e4b8 100644 --- a/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props +++ b/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props @@ -25,7 +25,10 @@ - Level3 + + + Level4 + 4018;4055;4146;4242;4244;4267;4302;4308;4509;4510;4532;4533;4610;4611;4700;4701;4703;4789;4995;4996 diff --git a/src/Servers/IIS/build/Build.Common.Settings b/src/Servers/IIS/build/Build.Common.Settings index b013ae03055b..b25ff225e740 100644 --- a/src/Servers/IIS/build/Build.Common.Settings +++ b/src/Servers/IIS/build/Build.Common.Settings @@ -44,6 +44,7 @@ stdafx.h true + Level4 4018;4055;4146;4242;4244;4267;4302;4308;4509;4510;4532;4533;4610;4611;4700;4701;4703;4789;4995;4996 MultiThreaded