You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
532 lines
13 KiB
532 lines
13 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
assemblyreference.cpp
|
|
|
|
Abstract:
|
|
|
|
Class the contains all the attributes of an assembly reference.
|
|
|
|
Author:
|
|
|
|
Michael J. Grier (MGrier) 10-May-2000
|
|
|
|
Revision History:
|
|
xiaoyuw 09/2000 revise the code using Assembly Identity
|
|
A couple of APIs in this class are kind of out of date, such as GetXXX, SetXXX, XXXSpecified : they
|
|
are not called at all.
|
|
--*/
|
|
|
|
#include "stdinc.h"
|
|
#include <windows.h>
|
|
#include "sxsapi.h"
|
|
#include "sxsp.h"
|
|
#include "assemblyreference.h"
|
|
#include "sxsid.h"
|
|
#include "sxsidp.h"
|
|
#include "fusionparser.h"
|
|
#include "fusionheap.h"
|
|
#include "sxsexceptionhandling.h"
|
|
|
|
VOID
|
|
CAssemblyReference::Construct()
|
|
{
|
|
m_pAssemblyIdentity = NULL;
|
|
}
|
|
|
|
VOID
|
|
CAssemblyReference::Destroy()
|
|
{
|
|
CSxsPreserveLastError ple;
|
|
::SxsDestroyAssemblyIdentity(m_pAssemblyIdentity);
|
|
m_pAssemblyIdentity = NULL;
|
|
ple.Restore();
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::Initialize()
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity == NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxsCreateAssemblyIdentity(0, ASSEMBLY_IDENTITY_TYPE_REFERENCE, &m_pAssemblyIdentity, 0, NULL));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::Initialize(
|
|
PCASSEMBLY_IDENTITY Identity
|
|
)
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
PARAMETER_CHECK(Identity != NULL);
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity == NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxsDuplicateAssemblyIdentity(0, Identity, &m_pAssemblyIdentity));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::Initialize(
|
|
const CAssemblyReference &r
|
|
)
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity == NULL);
|
|
INTERNAL_ERROR_CHECK(r.m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxsDuplicateAssemblyIdentity(
|
|
0, // DWORD Flags,
|
|
r.m_pAssemblyIdentity, // PCASSEMBLY_IDENTITY Source,
|
|
&m_pAssemblyIdentity)); // PASSEMBLY_IDENTITY *Destination
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::Hash(
|
|
ULONG &rulPseudoKey
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxsHashAssemblyIdentity(
|
|
0, // DWORD dwFlags,
|
|
m_pAssemblyIdentity, // ASSEMBLY_IDENTITY pAssemblyIdentity,
|
|
&rulPseudoKey)); // ULONG & rfulPseudoKey
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::SetAssemblyName(
|
|
PCWSTR AssemblyNameValue,
|
|
SIZE_T AssemblyNameValueCch
|
|
)
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
PARAMETER_CHECK(AssemblyNameValue != NULL);
|
|
PARAMETER_CHECK(AssemblyNameValueCch != 0);
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspSetAssemblyIdentityAttributeValue(
|
|
SXSP_SET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_OVERWRITE_EXISTING,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_name,
|
|
AssemblyNameValue,
|
|
AssemblyNameValueCch));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
// if m_pAssemblyIdentity is NULL, return TRUE with Cch == 0
|
|
BOOL
|
|
CAssemblyReference::GetAssemblyName(
|
|
PCWSTR *pAssemblyName,
|
|
SIZE_T *Cch
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
SIZE_T CchTemp = 0;
|
|
|
|
if (Cch != NULL)
|
|
*Cch = 0;
|
|
|
|
if (pAssemblyName != NULL)
|
|
*pAssemblyName = NULL;
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspGetAssemblyIdentityAttributeValue(
|
|
SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_name,
|
|
pAssemblyName,
|
|
&CchTemp));
|
|
|
|
if (Cch != NULL)
|
|
*Cch = CchTemp;
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::TakeValue(
|
|
CAssemblyReference &r
|
|
)
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(r.m_pAssemblyIdentity != NULL);
|
|
|
|
if (m_pAssemblyIdentity != NULL)
|
|
{
|
|
SxsDestroyAssemblyIdentity(m_pAssemblyIdentity);
|
|
m_pAssemblyIdentity = NULL;
|
|
}
|
|
|
|
//
|
|
// ISSUE-2002/05/04-jonwis : I'm not convinced that "take value" should have "copy"
|
|
// semantics... Isn't that what Assign is for? "Take value" to me means "steal
|
|
// their copy, don't allocate more memory."
|
|
//
|
|
IFW32FALSE_EXIT(::SxsDuplicateAssemblyIdentity(0, r.m_pAssemblyIdentity, &m_pAssemblyIdentity));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL CAssemblyReference::ClearAssemblyName()
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxspRemoveAssemblyIdentityAttribute(0, m_pAssemblyIdentity, &s_IdentityAttribute_name));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::GetLanguage(
|
|
PCWSTR &rString,
|
|
SIZE_T &rCch
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspGetAssemblyIdentityAttributeValue(
|
|
SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_language,
|
|
&rString,
|
|
&rCch));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::SetLanguage(
|
|
const CBaseStringBuffer &rbuff
|
|
)
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspSetAssemblyIdentityAttributeValue(
|
|
SXSP_SET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_OVERWRITE_EXISTING,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_language,
|
|
rbuff,
|
|
rbuff.Cch()));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::SetLanguage(
|
|
PCWSTR String,
|
|
SIZE_T Cch
|
|
)
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
PARAMETER_CHECK_INTERNAL((Cch == 0) || (String != NULL));
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspSetAssemblyIdentityAttributeValue(
|
|
SXSP_SET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_OVERWRITE_EXISTING,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_language,
|
|
String,
|
|
Cch));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::ClearLanguage()
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
IFW32FALSE_EXIT(::SxspRemoveAssemblyIdentityAttribute(SXSP_REMOVE_ASSEMBLY_IDENTITY_ATTRIBUTE_FLAG_NOT_FOUND_SUCCEEDS, m_pAssemblyIdentity, &s_IdentityAttribute_language));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::IsLanguageWildcarded(
|
|
bool &rfWildcarded
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
const WCHAR *Value = NULL;
|
|
SIZE_T Cch = 0;
|
|
|
|
rfWildcarded = false;
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxspGetAssemblyIdentityAttributeValue(SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL, m_pAssemblyIdentity, &s_IdentityAttribute_language, &Value, &Cch));
|
|
|
|
if (Cch == 1)
|
|
{
|
|
INTERNAL_ERROR_CHECK(Value != NULL);
|
|
|
|
if (Value[0] == L'*')
|
|
rfWildcarded = true;
|
|
}
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::IsProcessorArchitectureWildcarded(
|
|
bool &rfWildcarded
|
|
) const
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
const WCHAR *Value = NULL;
|
|
SIZE_T Cch = 0;
|
|
|
|
rfWildcarded = false;
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxspGetAssemblyIdentityAttributeValue(SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL, m_pAssemblyIdentity, &s_IdentityAttribute_processorArchitecture, &Value, &Cch));
|
|
|
|
if (Cch == 1)
|
|
{
|
|
INTERNAL_ERROR_CHECK(Value != NULL);
|
|
|
|
if (Value[0] == L'*')
|
|
rfWildcarded = true;
|
|
}
|
|
|
|
fSuccess = TRUE;
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::IsProcessorArchitectureX86(
|
|
bool &rfX86
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
const WCHAR *Value = NULL;
|
|
SIZE_T Cch = 0;
|
|
|
|
rfX86 = false;
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxspGetAssemblyIdentityAttributeValue(SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL, m_pAssemblyIdentity, &s_IdentityAttribute_processorArchitecture, &Value, &Cch));
|
|
|
|
if (Cch == 3)
|
|
{
|
|
INTERNAL_ERROR_CHECK(Value != NULL);
|
|
|
|
if (((Value[0] == L'x') || (Value[0] == L'X')) &&
|
|
(Value[1] == L'8') &&
|
|
(Value[2] == L'6'))
|
|
rfX86 = true;
|
|
}
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::GetProcessorArchitecture(
|
|
PCWSTR &rString,
|
|
SIZE_T &rCch
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspGetAssemblyIdentityAttributeValue(
|
|
SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_processorArchitecture,
|
|
&rString,
|
|
&rCch));
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::SetProcessorArchitecture(
|
|
const WCHAR *String,
|
|
SIZE_T Cch
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
|
|
PARAMETER_CHECK((String != NULL) || (Cch == 0));
|
|
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspSetAssemblyIdentityAttributeValue(
|
|
SXSP_SET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_OVERWRITE_EXISTING,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_processorArchitecture,
|
|
String,
|
|
Cch));
|
|
fSuccess = TRUE;
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::SetProcessorArchitecture(
|
|
IN const CBaseStringBuffer &rbuffProcessorArchitecture
|
|
)
|
|
{
|
|
return this->SetProcessorArchitecture(rbuffProcessorArchitecture, rbuffProcessorArchitecture.Cch());
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::Assign(
|
|
const CAssemblyReference &r
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
PASSEMBLY_IDENTITY IdentityCopy = NULL;
|
|
|
|
//INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
INTERNAL_ERROR_CHECK(r.m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(::SxsDuplicateAssemblyIdentity(0, r.m_pAssemblyIdentity, &IdentityCopy));
|
|
::SxsDestroyAssemblyIdentity(m_pAssemblyIdentity);
|
|
m_pAssemblyIdentity = IdentityCopy;
|
|
|
|
// NTRAID#NTBUG9 - 571856 - 2002/03/26 - xiaoyuw
|
|
// set NULL to pointer after it is taken over
|
|
|
|
// IdentityCopy = NULL;
|
|
fSuccess = TRUE;
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
//dupilicate the input parameter
|
|
BOOL
|
|
CAssemblyReference::SetAssemblyIdentity(
|
|
PCASSEMBLY_IDENTITY pAssemblyIdentitySource
|
|
)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
FN_TRACE_WIN32(fSuccess);
|
|
PASSEMBLY_IDENTITY TempAssemblyIdentity = NULL;
|
|
|
|
PARAMETER_CHECK(pAssemblyIdentitySource != NULL);
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL); // you should have initialized to start with...
|
|
|
|
IFW32FALSE_EXIT(::SxsDuplicateAssemblyIdentity(
|
|
0,
|
|
pAssemblyIdentitySource,
|
|
&TempAssemblyIdentity));
|
|
|
|
::SxsDestroyAssemblyIdentity(m_pAssemblyIdentity);
|
|
m_pAssemblyIdentity = TempAssemblyIdentity;
|
|
|
|
// NTRAID#NTBUG9 - 571856 - 2002/03/26 - xiaoyuw
|
|
// set NULL to pointer after it is taken over
|
|
// TempAssemblyIdentity = NULL;
|
|
|
|
fSuccess = TRUE;
|
|
Exit:
|
|
return fSuccess;
|
|
}
|
|
|
|
BOOL
|
|
CAssemblyReference::GetPublicKeyToken(
|
|
CBaseStringBuffer *pbuffPublicKeyToken,
|
|
BOOL &rfHasPublicKeyToken
|
|
) const
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
PCWSTR wchString = NULL;
|
|
SIZE_T cchString = NULL;
|
|
|
|
rfHasPublicKeyToken = FALSE;
|
|
|
|
if (pbuffPublicKeyToken != NULL)
|
|
pbuffPublicKeyToken->Clear();
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspGetAssemblyIdentityAttributeValue(
|
|
SXSP_GET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_NOT_FOUND_RETURNS_NULL,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_publicKeyToken,
|
|
&wchString,
|
|
&cchString));
|
|
|
|
if (cchString != 0)
|
|
{
|
|
rfHasPublicKeyToken = TRUE;
|
|
if (pbuffPublicKeyToken != NULL)
|
|
IFW32FALSE_EXIT(pbuffPublicKeyToken->Win32Assign(wchString, cchString));
|
|
}
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
BOOL CAssemblyReference::SetPublicKeyToken(
|
|
const CBaseStringBuffer &rbuffPublicKeyToken
|
|
)
|
|
{
|
|
return this->SetPublicKeyToken(rbuffPublicKeyToken, rbuffPublicKeyToken.Cch());
|
|
}
|
|
|
|
BOOL CAssemblyReference::SetPublicKeyToken(
|
|
PCWSTR pszPublicKeyToken,
|
|
SIZE_T cchPublicKeyToken
|
|
)
|
|
{
|
|
BOOL bSuccess = FALSE;
|
|
FN_TRACE_WIN32( bSuccess );
|
|
|
|
PARAMETER_CHECK( (pszPublicKeyToken != NULL ) || ( cchPublicKeyToken == 0 ) );
|
|
INTERNAL_ERROR_CHECK(m_pAssemblyIdentity != NULL);
|
|
|
|
IFW32FALSE_EXIT(
|
|
::SxspSetAssemblyIdentityAttributeValue(
|
|
SXSP_SET_ASSEMBLY_IDENTITY_ATTRIBUTE_VALUE_FLAG_OVERWRITE_EXISTING,
|
|
m_pAssemblyIdentity,
|
|
&s_IdentityAttribute_publicKeyToken,
|
|
pszPublicKeyToken,
|
|
cchPublicKeyToken));
|
|
|
|
bSuccess = TRUE;
|
|
Exit:
|
|
return bSuccess;
|
|
}
|