diff --git a/atl.vcxproj b/atl.vcxproj index be2a208..a8d6020 100644 --- a/atl.vcxproj +++ b/atl.vcxproj @@ -104,6 +104,7 @@ + diff --git a/atl.vcxproj.filters b/atl.vcxproj.filters index 37be935..98c6f2d 100644 --- a/atl.vcxproj.filters +++ b/atl.vcxproj.filters @@ -37,5 +37,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/atlcrypt.h b/atlcrypt.h index 19c3d60..5d08c36 100644 --- a/atlcrypt.h +++ b/atlcrypt.h @@ -102,7 +102,7 @@ namespace ATL // // CCertContext // - class CCertContext : public ATL::CObjectWithHandleT + class CCertContext : public ATL::CObjectWithHandleDuplT { public: virtual ~CCertContext() throw() @@ -126,6 +126,46 @@ namespace ATL { CertFreeCertificateContext(m_h); } + + virtual HANDLE InternalDuplicate(HANDLE h) const + { + return CertDuplicateCertificateContext(h); + } + }; + + + // + // CCertChainContext + // + class CCertChainContext : public ATL::CObjectWithHandleDuplT + { + public: + virtual ~CCertChainContext() throw() + { + if (m_h) + CertFreeCertificateChain(m_h); + } + + inline BOOL Create(__in_opt HCERTCHAINENGINE hChainEngine, __in PCCERT_CONTEXT pCertContext, __in_opt LPFILETIME pTime, __in_opt HCERTSTORE hAdditionalStore, __in PCERT_CHAIN_PARA pChainPara, __in DWORD dwFlags, __reserved LPVOID pvReserved) throw() + { + HANDLE h; + if (CertGetCertificateChain(hChainEngine, pCertContext, pTime, hAdditionalStore, pChainPara, dwFlags, pvReserved, &h)) { + Attach(h); + return TRUE; + } else + return FALSE; + } + + protected: + virtual void InternalFree() + { + CertFreeCertificateChain(m_h); + } + + virtual HANDLE InternalDuplicate(HANDLE h) const + { + return CertDuplicateCertificateChain(h); + } }; diff --git a/atleap.h b/atleap.h new file mode 100644 index 0000000..5951c70 --- /dev/null +++ b/atleap.h @@ -0,0 +1,46 @@ +/* + Copyright 1991-2015 Amebis + + This file is part of libatl. + + Setup is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Setup is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Setup. If not, see . +*/ + +#pragma once + +#include + + +namespace ATL +{ + namespace EAP + { + class CEAPAttribute : public EAP_ATTRIBUTE + { + public: + CEAPAttribute() + { + eaType = eatReserved; + dwLength = 0; + pValue = NULL; + } + + ~CEAPAttribute() + { + if (pValue) + delete pValue; + } + }; + } +} diff --git a/atlex.h b/atlex.h index dc29262..e9a5a60 100644 --- a/atlex.h +++ b/atlex.h @@ -20,6 +20,7 @@ #pragma once #include +#include namespace ATL @@ -37,28 +38,28 @@ namespace ATL { } - inline CObjectWithHandleT(T h) throw() : m_h(h) + inline CObjectWithHandleT(HANDLE h) throw() : m_h(h) { } - inline operator T() const throw() + inline operator HANDLE() const throw() { return m_h; } - inline T*& operator*() const + inline HANDLE*& operator*() const { ATLENSURE(m_h != NULL); return *m_h; } - inline T* operator&() throw() + inline HANDLE* operator&() throw() { ATLASSERT(m_h == NULL); return &m_h; } - inline T operator->() const throw() + inline HANDLE operator->() const throw() { ATLASSERT(m_h != NULL); return m_h; @@ -69,31 +70,31 @@ namespace ATL return m_h == NULL; } - inline bool operator<(_In_opt_ T h) const throw() + inline bool operator<(_In_opt_ HANDLE h) const throw() { return m_h < h; } - inline bool operator!=(_In_opt_ T h) const + inline bool operator!=(_In_opt_ HANDLE h) const { return !operator==(h); } - inline bool operator==(_In_opt_ T h) const throw() + inline bool operator==(_In_opt_ HANDLE h) const throw() { return m_h == h; } - inline void Attach(_In_opt_ T h) throw() + inline void Attach(_In_opt_ HANDLE h) throw() { if (m_h) InternalFree(); m_h = h; } - inline T Detach() throw() + inline HANDLE Detach() throw() { - T h = m_h; + HANDLE h = m_h; m_h = NULL; return h; } @@ -110,6 +111,160 @@ namespace ATL virtual void InternalFree() = 0; protected: - T m_h; + HANDLE m_h; }; + + + // + // CObjectWithHandleDuplT + // + template + class CObjectWithHandleDuplT : public CObjectWithHandleT + { + public: + inline HANDLE GetDuplicate() const + { + return m_h ? InternalDuplicate(m_h) : NULL; + } + + inline BOOL DuplicateAndAttach(_In_opt_ HANDLE h) throw() + { + if (m_h) + InternalFree(); + + return h ? (m_h = InternalDuplicate(h)) != NULL : (m_h = NULL, TRUE); + } + + // + // Do not allow = operators. They are semantically ambigious: + // Do they attach the class to the existing instance of object, or do they duplicate it? + // To avoid confusion, user should use Attach() and Duplicate() methods explicitly. + // + //inline const CObjectWithHandleDuplT& operator=(_In_ const HANDLE src) + //{ + // Attach(src ? InternalDuplicate(src) : NULL); + // return *this; + //} + + //inline const CObjectWithHandleDuplT& operator=(_In_ const CObjectWithHandleDuplT &src) + //{ + // Attach(src.m_h ? InternalDuplicate(src.m_h) : NULL); + // return *this; + //} + + protected: + virtual HANDLE InternalDuplicate(HANDLE h) const = 0; + }; + + + // + // CStrFormatT, CStrFormatW, CStrFormatA, CStrFormat + // + template + class CStrFormatT : public CStringT + { + public: + CStrFormatT(_In_z_ _FormatMessage_format_string_ PCXSTR pszFormat, ...) + { + ATLASSERT(AtlIsValidString(pszFormat)); + + va_list argList; + va_start(argList, pszFormat); + FormatV(pszFormat, argList); + va_end(argList); + } + + CStrFormatT(_In_ _FormatMessage_format_string_ UINT nFormatID, ...) + { + CStringT strFormat(GetManager()); + ATLENSURE(strFormat.LoadString(nFormatID)); + + va_list argList; + va_start(argList, nFormatID); + FormatV(strFormat, argList); + va_end(argList); + } + + CStrFormatT(_In_ HINSTANCE hInstance, _In_ _FormatMessage_format_string_ UINT nFormatID, ...) + { + CStringT strFormat(GetManager()); + ATLENSURE(strFormat.LoadString(hInstance, nFormatID)); + + va_list argList; + va_start(argList, nFormatID); + FormatV(strFormat, argList); + va_end(argList); + } + + CStrFormatT(_In_ HINSTANCE hInstance, _In_ WORD wLanguageID, _In_ _FormatMessage_format_string_ UINT nFormatID, ...) + { + CStringT strFormat(GetManager()); + ATLENSURE(strFormat.LoadString(hInstance, nFormatID, wLanguageID)); + + va_list argList; + va_start(argList, nFormatID); + FormatV(strFormat, argList); + va_end(argList); + } + }; + + typedef CStrFormatT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CStrFormatW; + typedef CStrFormatT< char, StrTraitATL< char, ChTraitsCRT< char > > > CStrFormatA; + typedef CStrFormatT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > > > CStrFormat; + + + // + // CStrFormatMsgT, CStrFormatMsgW, CStrFormatMsgA, CStrFormatMsg + // + template + class CStrFormatMsgT : public CStringT + { + public: + CStrFormatMsgT(_In_z_ _FormatMessage_format_string_ PCXSTR pszFormat, ...) + { + ATLASSERT(AtlIsValidString(pszFormat)); + + va_list argList; + va_start(argList, pszFormat); + FormatMessageV(pszFormat, &argList); + va_end(argList); + } + + CStrFormatMsgT(_In_ _FormatMessage_format_string_ UINT nFormatID, ...) + { + CStringT strFormat(GetManager()); + ATLENSURE(strFormat.LoadString(nFormatID)); + + va_list argList; + va_start(argList, nFormatID); + FormatMessageV(strFormat, &argList); + va_end(argList); + } + + CStrFormatMsgT(_In_ HINSTANCE hInstance, _In_ _FormatMessage_format_string_ UINT nFormatID, ...) + { + CStringT strFormat(GetManager()); + ATLENSURE(strFormat.LoadString(hInstance, nFormatID)); + + va_list argList; + va_start(argList, nFormatID); + FormatMessageV(strFormat, &argList); + va_end(argList); + } + + CStrFormatMsgT(_In_ HINSTANCE hInstance, _In_ WORD wLanguageID, _In_ _FormatMessage_format_string_ UINT nFormatID, ...) + { + CStringT strFormat(GetManager()); + ATLENSURE(strFormat.LoadString(hInstance, nFormatID, wLanguageID)); + + va_list argList; + va_start(argList, nFormatID); + FormatMessageV(strFormat, &argList); + va_end(argList); + } + }; + + typedef CStrFormatMsgT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CStrFormatMsgW; + typedef CStrFormatMsgT< char, StrTraitATL< char, ChTraitsCRT< char > > > CStrFormatMsgA; + typedef CStrFormatMsgT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > > > CStrFormatMsg; } diff --git a/atlwin.h b/atlwin.h index c213767..f4056de 100644 --- a/atlwin.h +++ b/atlwin.h @@ -19,6 +19,7 @@ #pragma once +#include "atlex.h" #include #include #include @@ -348,3 +349,75 @@ inline LSTATUS RegQueryValueExW(__in HKEY hKey, __in_opt LPCWSTR lpValueName, __ return lResult; } + + +#if _WIN32_WINNT >= _WIN32_WINNT_VISTA + +inline LSTATUS RegLoadMUIStringA(__in HKEY hKey, __in_opt LPCSTR pszValue, __out ATL::CAtlStringA &sOut, __in DWORD Flags, __in_opt LPCSTR pszDirectory) +{ + LSTATUS lResult; + DWORD dwSize; + + Flags &= ~REG_MUI_STRING_TRUNCATE; + + lResult = RegLoadMUIStringA(hKey, pszValue, NULL, 0, &dwSize, Flags, pszDirectory); + if (lResult == ERROR_MORE_DATA) { + LPSTR szBuffer = sOut.GetBuffer(dwSize - 1); + if (!szBuffer) return ERROR_OUTOFMEMORY; + sOut.ReleaseBuffer((lResult = RegLoadMUIStringA(hKey, pszValue, szBuffer, dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? dwSize - 1 : 0); + } else if (lResult == ERROR_SUCCESS) + sOut.Empty(); + + return lResult; +} + + +inline LSTATUS RegLoadMUIStringW(__in HKEY hKey, __in_opt LPCWSTR pszValue, __out ATL::CAtlStringW &sOut, __in DWORD Flags, __in_opt LPCWSTR pszDirectory) +{ + LSTATUS lResult; + DWORD dwSize; + + Flags &= ~REG_MUI_STRING_TRUNCATE; + + lResult = RegLoadMUIStringW(hKey, pszValue, NULL, 0, &dwSize, Flags, pszDirectory); + if (lResult == ERROR_MORE_DATA) { + LPWSTR szBuffer = sOut.GetBuffer(dwSize - 1); + if (!szBuffer) return ERROR_OUTOFMEMORY; + sOut.ReleaseBuffer((lResult = RegLoadMUIStringW(hKey, pszValue, szBuffer, dwSize, &dwSize, Flags, pszDirectory)) == ERROR_SUCCESS ? dwSize - 1 : 0); + } else if (lResult == ERROR_SUCCESS) + sOut.Empty(); + + return lResult; +} + +#endif + + +namespace ATL +{ + class CAtlLibrary : public CObjectWithHandleT + { + public: + virtual ~CAtlLibrary() throw() + { + if (m_h) + FreeLibrary(m_h); + } + + inline BOOL Load(__in LPCTSTR lpFileName, __reserved HANDLE hFile, __in DWORD dwFlags) throw() + { + HANDLE h = LoadLibraryEx(lpFileName, hFile, dwFlags); + if (h) { + Attach(h); + return TRUE; + } else + return FALSE; + } + + protected: + virtual void InternalFree() + { + FreeLibrary(m_h); + } + }; +}