Leaked source code of windows server 2003
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

/*++
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;
}