Merge branch 'master' of https://github.com/Amebis/libatl
This commit is contained in:
119
atl.vcxproj
Normal file
119
atl.vcxproj
Normal file
@@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>libatl</ProjectName>
|
||||
<ProjectGuid>{5A4EADF2-3237-457A-9DA8-BB9942A91019}</ProjectGuid>
|
||||
<RootNamespace>libatl</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\include\common.props" />
|
||||
<Import Project="..\..\include\Win32.props" />
|
||||
<Import Project="..\..\include\Release.props" />
|
||||
<Import Project="..\include\lib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\include\common.props" />
|
||||
<Import Project="..\..\include\Win32.props" />
|
||||
<Import Project="..\..\include\Debug.props" />
|
||||
<Import Project="..\include\lib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\include\common.props" />
|
||||
<Import Project="..\..\include\x64.props" />
|
||||
<Import Project="..\..\include\Release.props" />
|
||||
<Import Project="..\include\lib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\include\common.props" />
|
||||
<Import Project="..\..\include\x64.props" />
|
||||
<Import Project="..\..\include\Debug.props" />
|
||||
<Import Project="..\include\lib.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile />
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile />
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile />
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile />
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="atlcrypt.h" />
|
||||
<ClInclude Include="atleap.h" />
|
||||
<ClInclude Include="atlex.h" />
|
||||
<ClInclude Include="atlmsi.h" />
|
||||
<ClInclude Include="atlsec.h" />
|
||||
<ClInclude Include="atlshlwapi.h" />
|
||||
<ClInclude Include="atlwin.h" />
|
||||
<ClInclude Include="atlwlan.h" />
|
||||
<ClInclude Include="stdafx.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
47
atl.vcxproj.filters
Normal file
47
atl.vcxproj.filters
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="stdafx.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlwin.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlmsi.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlcrypt.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlwlan.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlshlwapi.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlex.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atleap.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="atlsec.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
311
atlcrypt.h
Normal file
311
atlcrypt.h
Normal file
@@ -0,0 +1,311 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "atlex.h"
|
||||
#include <atlcoll.h>
|
||||
#include <atlstr.h>
|
||||
#include <WinCrypt.h>
|
||||
|
||||
|
||||
inline DWORD CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, ATL::CAtlStringA &sNameString)
|
||||
{
|
||||
// Query the final string length first.
|
||||
DWORD dwSize = ::CertGetNameStringA(pCertContext, dwType, dwFlags, pvTypePara, NULL, 0);
|
||||
|
||||
// Prepare the buffer to format the string data into and read it.
|
||||
LPSTR szBuffer = sNameString.GetBuffer(dwSize);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
dwSize = ::CertGetNameStringA(pCertContext, dwType, dwFlags, pvTypePara, szBuffer, dwSize);
|
||||
sNameString.ReleaseBuffer(dwSize);
|
||||
return dwSize;
|
||||
}
|
||||
|
||||
|
||||
inline DWORD CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, ATL::CAtlStringW &sNameString)
|
||||
{
|
||||
// Query the final string length first.
|
||||
DWORD dwSize = ::CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, NULL, 0);
|
||||
|
||||
// Prepare the buffer to format the string data into and read it.
|
||||
LPWSTR szBuffer = sNameString.GetBuffer(dwSize);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
dwSize = ::CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, szBuffer, dwSize);
|
||||
sNameString.ReleaseBuffer(dwSize);
|
||||
return dwSize;
|
||||
}
|
||||
|
||||
|
||||
inline BOOL CryptGetHashParam(__in HCRYPTHASH hHash, __in DWORD dwParam, __out ATL::CAtlArray<BYTE> &aData, __in DWORD dwFlags)
|
||||
{
|
||||
DWORD dwHashSize;
|
||||
|
||||
if (CryptGetHashParam(hHash, dwParam, NULL, &dwHashSize, dwFlags)) {
|
||||
if (aData.SetCount(dwHashSize)) {
|
||||
if (CryptGetHashParam(hHash, dwParam, aData.GetData(), &dwHashSize, dwFlags)) {
|
||||
return TRUE;
|
||||
} else {
|
||||
aData.SetCount(0);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
inline BOOL CryptExportKey(__in HCRYPTKEY hKey, __in HCRYPTKEY hExpKey, __in DWORD dwBlobType, __in DWORD dwFlags, __out ATL::CAtlArray<BYTE> &aData)
|
||||
{
|
||||
DWORD dwKeyBLOBSize;
|
||||
|
||||
if (CryptExportKey(hKey, hExpKey, dwBlobType, dwFlags, NULL, &dwKeyBLOBSize)) {
|
||||
if (aData.SetCount(dwKeyBLOBSize)) {
|
||||
if (CryptExportKey(hKey, hExpKey, dwBlobType, dwFlags, aData.GetData(), &dwKeyBLOBSize)) {
|
||||
return TRUE;
|
||||
} else {
|
||||
aData.SetCount(0);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
namespace ATL
|
||||
{
|
||||
namespace Crypt
|
||||
{
|
||||
//
|
||||
// CCertContext
|
||||
//
|
||||
class CCertContext : public ATL::CObjectWithHandleDuplT<PCCERT_CONTEXT>
|
||||
{
|
||||
public:
|
||||
virtual ~CCertContext() throw()
|
||||
{
|
||||
if (m_h)
|
||||
CertFreeCertificateContext(m_h);
|
||||
}
|
||||
|
||||
inline BOOL Create(_In_ DWORD dwCertEncodingType, _In_ const BYTE *pbCertEncoded, _In_ DWORD cbCertEncoded) throw()
|
||||
{
|
||||
HANDLE h = CertCreateCertificateContext(dwCertEncodingType, pbCertEncoded, cbCertEncoded);
|
||||
if (h) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void InternalFree()
|
||||
{
|
||||
CertFreeCertificateContext(m_h);
|
||||
}
|
||||
|
||||
virtual HANDLE InternalDuplicate(HANDLE h) const
|
||||
{
|
||||
return CertDuplicateCertificateContext(h);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CCertChainContext
|
||||
//
|
||||
class CCertChainContext : public ATL::CObjectWithHandleDuplT<PCCERT_CHAIN_CONTEXT>
|
||||
{
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CCertStore
|
||||
//
|
||||
class CCertStore : public ATL::CObjectWithHandleT<HCERTSTORE>
|
||||
{
|
||||
public:
|
||||
virtual ~CCertStore() throw()
|
||||
{
|
||||
if (m_h)
|
||||
CertCloseStore(m_h, 0);
|
||||
}
|
||||
|
||||
inline BOOL Create(__in LPCSTR lpszStoreProvider, __in DWORD dwEncodingType, __in_opt HCRYPTPROV_LEGACY hCryptProv, __in DWORD dwFlags, __in_opt const void *pvPara) throw()
|
||||
{
|
||||
HANDLE h = CertOpenStore(lpszStoreProvider, dwEncodingType, hCryptProv, dwFlags, pvPara);
|
||||
if (h) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void InternalFree()
|
||||
{
|
||||
CertCloseStore(m_h, 0);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CContext
|
||||
//
|
||||
class CContext : public ATL::CObjectWithHandleT<HCRYPTPROV>
|
||||
{
|
||||
public:
|
||||
virtual ~CContext() throw()
|
||||
{
|
||||
if (m_h)
|
||||
CryptReleaseContext(m_h, 0);
|
||||
}
|
||||
|
||||
inline BOOL Create(__in_opt LPCTSTR szContainer, __in_opt LPCTSTR szProvider, __in DWORD dwProvType, __in DWORD dwFlags) throw()
|
||||
{
|
||||
HANDLE h;
|
||||
if (CryptAcquireContext(&h, szContainer, szProvider, dwProvType, dwFlags)) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void InternalFree()
|
||||
{
|
||||
CryptReleaseContext(m_h, 0);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CHash
|
||||
//
|
||||
class CHash : public ATL::CObjectWithHandleT<HCRYPTHASH>
|
||||
{
|
||||
public:
|
||||
virtual ~CHash() throw()
|
||||
{
|
||||
if (m_h)
|
||||
CryptDestroyHash(m_h);
|
||||
}
|
||||
|
||||
inline BOOL Create(__in HCRYPTPROV hProv, __in ALG_ID Algid, __in HCRYPTKEY hKey, __in DWORD dwFlags) throw()
|
||||
{
|
||||
HANDLE h;
|
||||
if (CryptCreateHash(hProv, Algid, hKey, dwFlags, &h)) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void InternalFree()
|
||||
{
|
||||
CryptDestroyHash(m_h);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CKey
|
||||
//
|
||||
class CKey : public ATL::CObjectWithHandleT<HCRYPTKEY>
|
||||
{
|
||||
public:
|
||||
virtual ~CKey() throw()
|
||||
{
|
||||
if (m_h)
|
||||
CryptDestroyKey(m_h);
|
||||
}
|
||||
|
||||
inline BOOL Generate(__in HCRYPTPROV hProv, __in ALG_ID Algid, __in DWORD dwFlags) throw()
|
||||
{
|
||||
HANDLE h;
|
||||
if (CryptGenKey(hProv, Algid, dwFlags, &h)) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
inline BOOL Import(__in HCRYPTPROV hProv, __in_bcount(dwDataLen) CONST BYTE *pbData, __in DWORD dwDataLen, __in HCRYPTKEY hPubKey, __in DWORD dwFlags) throw()
|
||||
{
|
||||
HANDLE h;
|
||||
if (CryptImportKey(hProv, pbData, dwDataLen, hPubKey, dwFlags, &h)) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
inline BOOL ImportPublic(__in HCRYPTPROV hCryptProv, __in DWORD dwCertEncodingType, __in PCERT_PUBLIC_KEY_INFO pInfo) throw()
|
||||
{
|
||||
HANDLE h;
|
||||
if (CryptImportPublicKeyInfo(hCryptProv, dwCertEncodingType, pInfo, &h)) {
|
||||
Attach(h);
|
||||
return TRUE;
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void InternalFree()
|
||||
{
|
||||
CryptDestroyKey(m_h);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
46
atleap.h
Normal file
46
atleap.h
Normal file
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <eaptypes.h>
|
||||
|
||||
|
||||
namespace ATL
|
||||
{
|
||||
namespace EAP
|
||||
{
|
||||
class CEAPAttribute : public EAP_ATTRIBUTE
|
||||
{
|
||||
public:
|
||||
CEAPAttribute()
|
||||
{
|
||||
eaType = eatReserved;
|
||||
dwLength = 0;
|
||||
pValue = NULL;
|
||||
}
|
||||
|
||||
~CEAPAttribute()
|
||||
{
|
||||
if (pValue)
|
||||
delete pValue;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
324
atlex.h
Normal file
324
atlex.h
Normal file
@@ -0,0 +1,324 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <atlconv.h>
|
||||
#include <atldef.h>
|
||||
#include <atlstr.h>
|
||||
|
||||
|
||||
namespace ATL
|
||||
{
|
||||
//
|
||||
// CObjectWithHandleT
|
||||
//
|
||||
template <class T>
|
||||
class CObjectWithHandleT
|
||||
{
|
||||
public:
|
||||
typedef T HANDLE;
|
||||
|
||||
inline CObjectWithHandleT() throw() : m_h(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
inline CObjectWithHandleT(HANDLE h) throw() : m_h(h)
|
||||
{
|
||||
}
|
||||
|
||||
inline operator HANDLE() const throw()
|
||||
{
|
||||
return m_h;
|
||||
}
|
||||
|
||||
inline HANDLE*& operator*() const
|
||||
{
|
||||
ATLENSURE(m_h != NULL);
|
||||
return *m_h;
|
||||
}
|
||||
|
||||
inline HANDLE* operator&() throw()
|
||||
{
|
||||
ATLASSERT(m_h == NULL);
|
||||
return &m_h;
|
||||
}
|
||||
|
||||
inline HANDLE operator->() const throw()
|
||||
{
|
||||
ATLASSERT(m_h != NULL);
|
||||
return m_h;
|
||||
}
|
||||
|
||||
inline bool operator!() const throw()
|
||||
{
|
||||
return m_h == NULL;
|
||||
}
|
||||
|
||||
inline bool operator<(_In_opt_ HANDLE h) const throw()
|
||||
{
|
||||
return m_h < h;
|
||||
}
|
||||
|
||||
inline bool operator!=(_In_opt_ HANDLE h) const
|
||||
{
|
||||
return !operator==(h);
|
||||
}
|
||||
|
||||
inline bool operator==(_In_opt_ HANDLE h) const throw()
|
||||
{
|
||||
return m_h == h;
|
||||
}
|
||||
|
||||
inline void Attach(_In_opt_ HANDLE h) throw()
|
||||
{
|
||||
if (m_h)
|
||||
InternalFree();
|
||||
m_h = h;
|
||||
}
|
||||
|
||||
inline HANDLE Detach() throw()
|
||||
{
|
||||
HANDLE h = m_h;
|
||||
m_h = NULL;
|
||||
return h;
|
||||
}
|
||||
|
||||
inline void Free() throw()
|
||||
{
|
||||
if (m_h) {
|
||||
InternalFree();
|
||||
m_h = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void InternalFree() = 0;
|
||||
|
||||
protected:
|
||||
HANDLE m_h;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CObjectWithHandleDuplT
|
||||
//
|
||||
template <class T>
|
||||
class CObjectWithHandleDuplT : public CObjectWithHandleT<T>
|
||||
{
|
||||
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<T>& operator=(_In_ const HANDLE src)
|
||||
//{
|
||||
// Attach(src ? InternalDuplicate(src) : NULL);
|
||||
// return *this;
|
||||
//}
|
||||
|
||||
//inline const CObjectWithHandleDuplT<T>& operator=(_In_ const CObjectWithHandleDuplT<T> &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<typename BaseType, class StringTraits>
|
||||
class CStrFormatT : public CStringT<BaseType, StringTraits>
|
||||
{
|
||||
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<typename BaseType, class StringTraits>
|
||||
class CStrFormatMsgT : public CStringT<BaseType, StringTraits>
|
||||
{
|
||||
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;
|
||||
|
||||
|
||||
//
|
||||
// CParanoidHeap
|
||||
//
|
||||
template <class BaseHeap>
|
||||
class CParanoidHeap : public BaseHeap {
|
||||
public:
|
||||
virtual void Free(_In_opt_ void* p) throw()
|
||||
{
|
||||
// Sanitize then free.
|
||||
SecureZeroMemory(p, GetSize(p));
|
||||
BaseHeap::Free(p);
|
||||
}
|
||||
|
||||
_Ret_opt_bytecap_(nBytes) virtual void* Reallocate(_In_opt_ void* p, _In_ size_t nBytes) throw()
|
||||
{
|
||||
// Create a new sized copy.
|
||||
void *pNew = Allocate(nBytes);
|
||||
size_t nSizePrev = GetSize(p);
|
||||
memcpy(pNew, p, nSizePrev);
|
||||
|
||||
// Sanitize the old data then free.
|
||||
SecureZeroMemory(p, nSizePrev);
|
||||
Free(p);
|
||||
|
||||
return pNew;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// CW2AParanoidEX
|
||||
//
|
||||
template<int t_nBufferLength = 128>
|
||||
class CW2AParanoidEX : public CW2AEX<t_nBufferLength> {
|
||||
public:
|
||||
CW2AParanoidEX(_In_z_ LPCWSTR psz) throw(...) : CW2AEX<t_nBufferLength>(psz) {}
|
||||
CW2AParanoidEX(_In_z_ LPCWSTR psz, _In_ UINT nCodePage) throw(...) : CW2AEX<t_nBufferLength>(psz, nCodePage) {}
|
||||
~CW2AParanoidEX() throw()
|
||||
{
|
||||
// Sanitize before free.
|
||||
if (m_psz != m_szBuffer)
|
||||
SecureZeroMemory(m_psz, _msize(m_psz));
|
||||
else
|
||||
SecureZeroMemory(m_szBuffer, sizeof(m_szBuffer));
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// CW2AParanoid
|
||||
//
|
||||
typedef CW2AParanoidEX<> CW2AParanoid;
|
||||
}
|
241
atlmsi.h
Normal file
241
atlmsi.h
Normal file
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <atlcoll.h>
|
||||
#include <atlstr.h>
|
||||
#include <MsiQuery.h>
|
||||
|
||||
|
||||
inline UINT MsiGetPropertyA(MSIHANDLE hInstall, LPCSTR szName, ATL::CAtlStringA &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the actual string length first.
|
||||
uiResult = ::MsiGetPropertyA(hInstall, szName, "", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to read the string data into and read it.
|
||||
LPSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiGetPropertyA(hInstall, szName, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The string in database is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiGetPropertyW(MSIHANDLE hInstall, LPCWSTR szName, ATL::CAtlStringW &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the actual string length first.
|
||||
uiResult = ::MsiGetPropertyW(hInstall, szName, L"", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to read the string data into and read it.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiGetPropertyW(hInstall, szName, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The string in database is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiRecordGetStringA(MSIHANDLE hRecord, unsigned int iField, ATL::CAtlStringA &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the actual string length first.
|
||||
uiResult = ::MsiRecordGetStringA(hRecord, iField, "", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to read the string data into and read it.
|
||||
LPSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiRecordGetStringA(hRecord, iField, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The string in database is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiRecordGetStringW(MSIHANDLE hRecord, unsigned int iField, ATL::CAtlStringW &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the actual string length first.
|
||||
uiResult = ::MsiRecordGetStringW(hRecord, iField, L"", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to read the string data into and read it.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiRecordGetStringW(hRecord, iField, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The string in database is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiFormatRecordA(MSIHANDLE hInstall, MSIHANDLE hRecord, ATL::CAtlStringA &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the final string length first.
|
||||
uiResult = ::MsiFormatRecordA(hInstall, hRecord, "", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to format the string data into and read it.
|
||||
LPSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiFormatRecordA(hInstall, hRecord, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The result is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiFormatRecordW(MSIHANDLE hInstall, MSIHANDLE hRecord, ATL::CAtlStringW &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the final string length first.
|
||||
uiResult = ::MsiFormatRecordW(hInstall, hRecord, L"", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to format the string data into and read it.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiFormatRecordW(hInstall, hRecord, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The result is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiRecordReadStream(MSIHANDLE hRecord, unsigned int iField, ATL::CAtlArray<BYTE> &binData)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the actual data length first.
|
||||
uiResult = ::MsiRecordReadStream(hRecord, iField, NULL, &dwSize);
|
||||
if (uiResult == NO_ERROR) {
|
||||
if (!binData.SetCount(dwSize)) return ERROR_OUTOFMEMORY;
|
||||
return ::MsiRecordReadStream(hRecord, iField, (char*)binData.GetData(), &dwSize);
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiGetTargetPathA(MSIHANDLE hInstall, LPCSTR szFolder, ATL::CAtlStringA &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the final string length first.
|
||||
uiResult = ::MsiGetTargetPathA(hInstall, szFolder, "", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to format the string data into and read it.
|
||||
LPSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiGetTargetPathA(hInstall, szFolder, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The result is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline UINT MsiGetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, ATL::CAtlStringW &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
UINT uiResult;
|
||||
|
||||
// Query the final string length first.
|
||||
uiResult = ::MsiGetTargetPathW(hInstall, szFolder, L"", &dwSize);
|
||||
if (uiResult == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer to format the string data into and read it.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwSize++);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
uiResult = ::MsiGetTargetPathW(hInstall, szFolder, szBuffer, &dwSize);
|
||||
sValue.ReleaseBuffer(uiResult == NO_ERROR ? dwSize : 0);
|
||||
return uiResult;
|
||||
} else if (uiResult == NO_ERROR) {
|
||||
// The result is empty.
|
||||
sValue.Empty();
|
||||
return NO_ERROR;
|
||||
} else {
|
||||
// Return error code.
|
||||
return uiResult;
|
||||
}
|
||||
}
|
84
atlsec.h
Normal file
84
atlsec.h
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <Security.h>
|
||||
|
||||
|
||||
BOOLEAN GetUserNameExA(__in EXTENDED_NAME_FORMAT NameFormat, __out ATL::CAtlStringA &sName)
|
||||
{
|
||||
ULONG ulSize = 0;
|
||||
|
||||
// Query the final string length first.
|
||||
if (!::GetUserNameExA(NameFormat, NULL, &ulSize)) {
|
||||
if (::GetLastError() == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer and retry.
|
||||
LPSTR szBuffer = sName.GetBuffer(ulSize - 1);
|
||||
if (!szBuffer) {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
if (::GetUserNameExA(NameFormat, szBuffer, &ulSize)) {
|
||||
sName.ReleaseBuffer(ulSize);
|
||||
return TRUE;
|
||||
} else {
|
||||
sName.ReleaseBuffer(0);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
// Return error.
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
// The result is empty.
|
||||
sName.Empty();
|
||||
return NO_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN GetUserNameExW(__in EXTENDED_NAME_FORMAT NameFormat, __out ATL::CAtlStringW &sName)
|
||||
{
|
||||
ULONG ulSize = 0;
|
||||
|
||||
// Query the final string length first.
|
||||
if (!::GetUserNameExW(NameFormat, NULL, &ulSize)) {
|
||||
if (::GetLastError() == ERROR_MORE_DATA) {
|
||||
// Prepare the buffer and retry.
|
||||
LPWSTR szBuffer = sName.GetBuffer(ulSize - 1);
|
||||
if (!szBuffer) {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
if (::GetUserNameExW(NameFormat, szBuffer, &ulSize)) {
|
||||
sName.ReleaseBuffer(ulSize);
|
||||
return TRUE;
|
||||
} else {
|
||||
sName.ReleaseBuffer(0);
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
// Return error.
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
// The result is empty.
|
||||
sName.Empty();
|
||||
return NO_ERROR;
|
||||
}
|
||||
}
|
53
atlshlwapi.h
Normal file
53
atlshlwapi.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <atlstr.h>
|
||||
#include <Shlwapi.h>
|
||||
|
||||
|
||||
inline BOOL PathCanonicalizeA(__out ATL::CAtlStringA &sValue, __in LPCSTR pszPath)
|
||||
{
|
||||
// Prepare the buffer data and read into it.
|
||||
LPSTR szBuffer = sValue.GetBuffer(MAX_PATH);
|
||||
if (!szBuffer) {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
BOOL bResult = ::PathCanonicalizeA(szBuffer, pszPath);
|
||||
sValue.ReleaseBuffer(bResult ? (int)strnlen(szBuffer, MAX_PATH) : 0);
|
||||
sValue.FreeExtra();
|
||||
return bResult;
|
||||
}
|
||||
|
||||
|
||||
inline BOOL PathCanonicalizeW(__out ATL::CAtlStringW &sValue, __in LPCWSTR pszPath)
|
||||
{
|
||||
// Prepare the buffer data and read into it.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(MAX_PATH);
|
||||
if (!szBuffer) {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
BOOL bResult = ::PathCanonicalizeW(szBuffer, pszPath);
|
||||
sValue.ReleaseBuffer(bResult ? (int)wcsnlen(szBuffer, MAX_PATH) : 0);
|
||||
sValue.FreeExtra();
|
||||
return bResult;
|
||||
}
|
423
atlwin.h
Normal file
423
atlwin.h
Normal file
@@ -0,0 +1,423 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "atlex.h"
|
||||
#include <atlcoll.h>
|
||||
#include <atlstr.h>
|
||||
#include <Windows.h>
|
||||
|
||||
|
||||
inline DWORD GetModuleFileNameA(__in_opt HMODULE hModule, __out ATL::CAtlStringA &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
|
||||
for (;;) {
|
||||
// Increment size and allocate buffer.
|
||||
LPSTR szBuffer = sValue.GetBuffer(dwSize += 1024);
|
||||
if (!szBuffer) {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Try!
|
||||
DWORD dwResult = ::GetModuleFileNameA(hModule, szBuffer, dwSize);
|
||||
if (dwResult == 0) {
|
||||
// Error.
|
||||
sValue.ReleaseBuffer(0);
|
||||
return 0;
|
||||
} else if (dwResult < dwSize) {
|
||||
DWORD dwLength = (DWORD)strnlen(szBuffer, dwSize);
|
||||
sValue.ReleaseBuffer(dwLength++);
|
||||
if (dwLength == dwSize) {
|
||||
// Buffer was long exactly enough.
|
||||
return dwResult;
|
||||
} if (dwLength < dwSize) {
|
||||
// Buffer was long enough to get entire string, and has some extra space left.
|
||||
sValue.FreeExtra();
|
||||
return dwResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline DWORD GetModuleFileNameW(__in_opt HMODULE hModule, __out ATL::CAtlStringW &sValue)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
|
||||
for (;;) {
|
||||
// Increment size and allocate buffer.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwSize += 1024);
|
||||
if (!szBuffer) {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Try!
|
||||
DWORD dwResult = ::GetModuleFileNameW(hModule, szBuffer, dwSize);
|
||||
if (dwResult == 0) {
|
||||
// Error.
|
||||
sValue.ReleaseBuffer(0);
|
||||
return 0;
|
||||
} else if (dwResult < dwSize) {
|
||||
DWORD dwLength = (DWORD)wcsnlen(szBuffer, dwSize);
|
||||
sValue.ReleaseBuffer(dwLength++);
|
||||
if (dwLength == dwSize) {
|
||||
// Buffer was long exactly enough.
|
||||
return dwResult;
|
||||
} if (dwLength < dwSize) {
|
||||
// Buffer was long enough to get entire string, and has some extra space left.
|
||||
sValue.FreeExtra();
|
||||
return dwResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline int GetWindowTextA(__in HWND hWnd, __out ATL::CAtlStringA &sValue)
|
||||
{
|
||||
int iResult;
|
||||
|
||||
// Query the final string length first.
|
||||
iResult = ::GetWindowTextLengthA(hWnd);
|
||||
if (iResult > 0) {
|
||||
// Prepare the buffer and read the string data into it.
|
||||
LPSTR szBuffer = sValue.GetBuffer(iResult++);
|
||||
if (!szBuffer) {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return 0;
|
||||
}
|
||||
iResult = ::GetWindowTextA(hWnd, szBuffer, iResult);
|
||||
sValue.ReleaseBuffer(iResult);
|
||||
return iResult;
|
||||
} else {
|
||||
// The result is empty.
|
||||
sValue.Empty();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline int GetWindowTextW(__in HWND hWnd, __out ATL::CAtlStringW &sValue)
|
||||
{
|
||||
int iResult;
|
||||
|
||||
// Query the final string length first.
|
||||
iResult = ::GetWindowTextLengthW(hWnd);
|
||||
if (iResult > 0) {
|
||||
// Prepare the buffer and read the string data into it.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(iResult++);
|
||||
if (!szBuffer) {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return 0;
|
||||
}
|
||||
iResult = ::GetWindowTextW(hWnd, szBuffer, iResult);
|
||||
sValue.ReleaseBuffer(iResult);
|
||||
return iResult;
|
||||
} else {
|
||||
// The result is empty.
|
||||
sValue.Empty();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline BOOL GetFileVersionInfoA(__in LPCSTR lptstrFilename, __reserved DWORD dwHandle, __out ATL::CAtlArray<BYTE> &aValue)
|
||||
{
|
||||
// Get version info size.
|
||||
DWORD dwVerInfoSize = ::GetFileVersionInfoSizeA(lptstrFilename, &dwHandle);
|
||||
if (dwVerInfoSize != 0) {
|
||||
if (aValue.SetCount(dwVerInfoSize)) {
|
||||
// Read version info.
|
||||
return ::GetFileVersionInfoA(lptstrFilename, dwHandle, dwVerInfoSize, aValue.GetData());
|
||||
} else {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
inline BOOL GetFileVersionInfoW(__in LPCWSTR lptstrFilename, __reserved DWORD dwHandle, __out ATL::CAtlArray<BYTE> &aValue)
|
||||
{
|
||||
// Get version info size.
|
||||
DWORD dwVerInfoSize = ::GetFileVersionInfoSizeW(lptstrFilename, &dwHandle);
|
||||
if (dwVerInfoSize != 0) {
|
||||
if (aValue.SetCount(dwVerInfoSize)) {
|
||||
// Read version info.
|
||||
return ::GetFileVersionInfoW(lptstrFilename, dwHandle, dwVerInfoSize, aValue.GetData());
|
||||
} else {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
} else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
inline DWORD ExpandEnvironmentStringsA(__in LPCSTR lpSrc, ATL::CAtlStringA &sValue)
|
||||
{
|
||||
DWORD dwBufferSizeEst = (DWORD)strlen(lpSrc) + 0x100; // Initial estimate
|
||||
|
||||
for (;;) {
|
||||
DWORD dwBufferSize = dwBufferSizeEst;
|
||||
LPSTR szBuffer = sValue.GetBuffer(dwBufferSize);
|
||||
if (!szBuffer) {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
dwBufferSizeEst = ::ExpandEnvironmentStringsA(lpSrc, szBuffer, dwBufferSize);
|
||||
if (dwBufferSizeEst > dwBufferSize) {
|
||||
// The buffer was to small. Repeat with a bigger one.
|
||||
sValue.ReleaseBuffer(0);
|
||||
} else if (dwBufferSizeEst == 0) {
|
||||
// Error.
|
||||
sValue.ReleaseBuffer(0);
|
||||
return 0;
|
||||
} else {
|
||||
// The buffer was sufficient. Break.
|
||||
sValue.ReleaseBuffer();
|
||||
sValue.FreeExtra();
|
||||
return dwBufferSizeEst;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline DWORD ExpandEnvironmentStringsW(__in LPCWSTR lpSrc, ATL::CAtlStringW &sValue)
|
||||
{
|
||||
DWORD dwBufferSizeEst = (DWORD)wcslen(lpSrc) + 0x100; // Initial estimate
|
||||
|
||||
for (;;) {
|
||||
DWORD dwBufferSize = dwBufferSizeEst;
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwBufferSize);
|
||||
if (!szBuffer) {
|
||||
::SetLastError(ERROR_OUTOFMEMORY);
|
||||
return FALSE;
|
||||
}
|
||||
dwBufferSizeEst = ::ExpandEnvironmentStringsW(lpSrc, szBuffer, dwBufferSize);
|
||||
if (dwBufferSizeEst > dwBufferSize) {
|
||||
// The buffer was to small. Repeat with a bigger one.
|
||||
sValue.ReleaseBuffer(0);
|
||||
} else if (dwBufferSizeEst == 0) {
|
||||
// Error.
|
||||
sValue.ReleaseBuffer(0);
|
||||
return 0;
|
||||
} else {
|
||||
// The buffer was sufficient. Break.
|
||||
sValue.ReleaseBuffer();
|
||||
sValue.FreeExtra();
|
||||
return dwBufferSizeEst;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline VOID GuidToString(_In_ LPCGUID lpGuid, ATL::CAtlStringA &str)
|
||||
{
|
||||
str.Format("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
|
||||
lpGuid->Data1,
|
||||
lpGuid->Data2,
|
||||
lpGuid->Data3,
|
||||
lpGuid->Data4[0], lpGuid->Data4[1],
|
||||
lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
|
||||
}
|
||||
|
||||
|
||||
inline VOID GuidToString(_In_ LPCGUID lpGuid, ATL::CAtlStringW &str)
|
||||
{
|
||||
str.Format(L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
|
||||
lpGuid->Data1,
|
||||
lpGuid->Data2,
|
||||
lpGuid->Data3,
|
||||
lpGuid->Data4[0], lpGuid->Data4[1],
|
||||
lpGuid->Data4[2], lpGuid->Data4[3], lpGuid->Data4[4], lpGuid->Data4[5], lpGuid->Data4[6], lpGuid->Data4[7]);
|
||||
}
|
||||
|
||||
|
||||
inline LSTATUS RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCSTR pszName, _Out_ ATL::CAtlStringA &sValue)
|
||||
{
|
||||
LSTATUS lResult;
|
||||
DWORD dwSize = 0, dwType;
|
||||
|
||||
// Determine the type and size first.
|
||||
if ((lResult = ::RegQueryValueExA(hReg, pszName, NULL, &dwType, NULL, &dwSize)) == ERROR_SUCCESS) {
|
||||
if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
|
||||
// The value is REG_SZ or REG_MULTI_SZ. Read it now.
|
||||
LPSTR szTemp = sValue.GetBuffer(dwSize / sizeof(TCHAR));
|
||||
if (!szTemp) return ERROR_OUTOFMEMORY;
|
||||
if ((lResult = ::RegQueryValueExA(hReg, pszName, NULL, NULL, (LPBYTE)szTemp, &dwSize)) == ERROR_SUCCESS) {
|
||||
sValue.ReleaseBuffer();
|
||||
} else {
|
||||
// Reading of the value failed.
|
||||
sValue.ReleaseBuffer(0);
|
||||
}
|
||||
} else if (dwType == REG_EXPAND_SZ) {
|
||||
// The value is REG_EXPAND_SZ. Read it and expand environment variables.
|
||||
ATL::CTempBuffer<CHAR> sTemp(dwSize / sizeof(CHAR));
|
||||
if ((lResult = ::RegQueryValueExA(hReg, pszName, NULL, NULL, (LPBYTE)(CHAR*)sTemp, &dwSize)) == ERROR_SUCCESS)
|
||||
if (::ExpandEnvironmentStringsA((const CHAR*)sTemp, sValue) == 0)
|
||||
lResult = ::GetLastError();
|
||||
} else {
|
||||
// The value is not a string type.
|
||||
lResult = ERROR_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
return lResult;
|
||||
}
|
||||
|
||||
|
||||
inline LSTATUS RegQueryStringValue(_In_ HKEY hReg, _In_z_ LPCWSTR pszName, _Out_ ATL::CAtlStringW &sValue)
|
||||
{
|
||||
LSTATUS lResult;
|
||||
DWORD dwSize = 0, dwType;
|
||||
|
||||
// Determine the type and size first.
|
||||
if ((lResult = ::RegQueryValueExW(hReg, pszName, NULL, &dwType, NULL, &dwSize)) == ERROR_SUCCESS) {
|
||||
if (dwType == REG_SZ || dwType == REG_MULTI_SZ) {
|
||||
// The value is REG_SZ or REG_MULTI_SZ. Read it now.
|
||||
LPWSTR szTemp = sValue.GetBuffer(dwSize / sizeof(TCHAR));
|
||||
if (!szTemp) return ERROR_OUTOFMEMORY;
|
||||
if ((lResult = ::RegQueryValueExW(hReg, pszName, NULL, NULL, (LPBYTE)szTemp, &dwSize)) == ERROR_SUCCESS) {
|
||||
sValue.ReleaseBuffer();
|
||||
} else {
|
||||
// Reading of the value failed.
|
||||
sValue.ReleaseBuffer(0);
|
||||
}
|
||||
} else if (dwType == REG_EXPAND_SZ) {
|
||||
// The value is REG_EXPAND_SZ. Read it and expand environment variables.
|
||||
ATL::CTempBuffer<WCHAR> sTemp(dwSize / sizeof(WCHAR));
|
||||
if ((lResult = ::RegQueryValueExW(hReg, pszName, NULL, NULL, (LPBYTE)(WCHAR*)sTemp, &dwSize)) == ERROR_SUCCESS)
|
||||
if (::ExpandEnvironmentStringsW((const WCHAR*)sTemp, sValue) == 0)
|
||||
lResult = ::GetLastError();
|
||||
} else {
|
||||
// The value is not a string type.
|
||||
lResult = ERROR_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
return lResult;
|
||||
}
|
||||
|
||||
|
||||
inline LSTATUS RegQueryValueExA(__in HKEY hKey, __in_opt LPCSTR lpValueName, __reserved LPDWORD lpReserved, __out_opt LPDWORD lpType, __out ATL::CAtlArray<BYTE> &aData)
|
||||
{
|
||||
LSTATUS lResult;
|
||||
DWORD dwDataSize;
|
||||
|
||||
if ((lResult = RegQueryValueExA(hKey, lpValueName, lpReserved, NULL, NULL, &dwDataSize)) == ERROR_SUCCESS) {
|
||||
if (!aData.SetCount(dwDataSize)) return ERROR_OUTOFMEMORY;
|
||||
if ((lResult = RegQueryValueExA(hKey, lpValueName, lpReserved, lpType, aData.GetData(), &dwDataSize)) != ERROR_SUCCESS)
|
||||
aData.SetCount(0);
|
||||
}
|
||||
|
||||
return lResult;
|
||||
}
|
||||
|
||||
|
||||
inline LSTATUS RegQueryValueExW(__in HKEY hKey, __in_opt LPCWSTR lpValueName, __reserved LPDWORD lpReserved, __out_opt LPDWORD lpType, __out ATL::CAtlArray<BYTE> &aData)
|
||||
{
|
||||
LSTATUS lResult;
|
||||
DWORD dwDataSize;
|
||||
|
||||
if ((lResult = RegQueryValueExW(hKey, lpValueName, lpReserved, NULL, NULL, &dwDataSize)) == ERROR_SUCCESS) {
|
||||
if (!aData.SetCount(dwDataSize)) return ERROR_OUTOFMEMORY;
|
||||
if ((lResult = RegQueryValueExW(hKey, lpValueName, lpReserved, lpType, aData.GetData(), &dwDataSize)) != ERROR_SUCCESS)
|
||||
aData.SetCount(0);
|
||||
}
|
||||
|
||||
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<HMODULE>
|
||||
{
|
||||
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);
|
||||
}
|
||||
};
|
||||
}
|
54
atlwlan.h
Normal file
54
atlwlan.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <atlstr.h>
|
||||
#include <wlanapi.h>
|
||||
|
||||
|
||||
inline DWORD WlanReasonCodeToString(__in DWORD dwReasonCode, __out ATL::CAtlStringW &sValue, __reserved PVOID pReserved)
|
||||
{
|
||||
DWORD dwSize = 0;
|
||||
|
||||
for (;;) {
|
||||
// Increment size and allocate buffer.
|
||||
LPWSTR szBuffer = sValue.GetBuffer(dwSize += 1024);
|
||||
if (!szBuffer) return ERROR_OUTOFMEMORY;
|
||||
|
||||
// Try!
|
||||
DWORD dwResult = ::WlanReasonCodeToString(dwReasonCode, dwSize, szBuffer, pReserved);
|
||||
if (dwResult == NO_ERROR) {
|
||||
DWORD dwLength = (DWORD)wcsnlen(szBuffer, dwSize);
|
||||
sValue.ReleaseBuffer(dwLength++);
|
||||
if (dwLength == dwSize) {
|
||||
// Buffer was long exactly enough.
|
||||
return NO_ERROR;
|
||||
} else if (dwLength < dwSize) {
|
||||
// Buffer was long enough to get entire string, and has some extra space left.
|
||||
sValue.FreeExtra();
|
||||
return NO_ERROR;
|
||||
}
|
||||
} else {
|
||||
// Return error code.
|
||||
sValue.ReleaseBuffer(0);
|
||||
return dwResult;
|
||||
}
|
||||
}
|
||||
}
|
20
stdafx.cpp
Normal file
20
stdafx.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
33
stdafx.h
Normal file
33
stdafx.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "atlwin.h"
|
||||
|
||||
#include "atlcrypt.h"
|
||||
#include "atleap.h"
|
||||
#include "atlex.h"
|
||||
#include "atlmsi.h"
|
||||
#if defined(SECURITY_WIN32) || defined(SECURITY_KERNEL) || defined(SECURITY_MAC)
|
||||
#include "atlsec.h"
|
||||
#endif
|
||||
#include "atlshlwapi.h"
|
||||
#include "atlwin.h"
|
||||
#include "atlwlan.h"
|
Reference in New Issue
Block a user