Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Contient des informations sur un seul attribut dans un assembly et se compose de trois DWORD. Chaque DWORD est un décalage dans un tampon de caractères, produit par la méthode CurrentIntoBuffer de l’interface IEnumIDENTITY_ATTRIBUTE
Syntaxe
typedef struct _IDENTITY_ATTRIBUTE_BLOB {
DWORD ofsNamespace;
DWORD ofsName;
DWORD ofsValue;
} IDENTITY_ATTRIBUTE_BLOB;
Membres
| Membre | Description |
|---|---|
ofsNamespace |
Premier décalage dans le tampon de caractères. Ce décalage n’est pas suivi de l’espace de noms de l’attribut, mais d’une série de caractères Null. Il n’est donc pas utilisé. |
ofsName |
Deuxième décalage dans le tampon de caractères. Cet emplacement marque le début du nom de l’attribut. |
ofsValue |
Troisième décalage dans le tampon de caractères. Cet emplacement marque le début de la valeur de l’attribut. |
Exemple
L’exemple suivant illustre plusieurs étapes de base, qui aboutissent à une structure IDENTITY_ATTRIBUTE_BLOB remplie :
Récupérez une IReferenceIdentity pour l’assembly.
Appelez la méthode
IReferenceIdentity::EnumAttributeset récupérez un IEnumIDENTITY_ATTRIBUTE.Créez un tampon de caractères et castez-le en structure
IDENTITY_ATTRIBUTE_BLOB.Appelez la méthode
CurrentIntoBufferde l’interfaceIEnumIDENTITY_ATTRIBUTE. Cette méthode copie les attributsNamespace,NameetValuedans le tampon de caractères. Les trois décalages appliqués à ces chaînes seront disponibles dans la structureIDENTITY_ATTRIBUTE_BLOB.
// EnumAssemblyAttributes.cpp : main project file.
#include "stdafx.h"
#include "fusion.h"
#include "windows.h"
#include "stdio.h"
#include "mscoree.h"
#include "isolation.h"
typedef HRESULT (__stdcall *PFNGETREF)(LPCWSTR pwzFile, REFIID riid, IUnknown **ppUnk);
typedef HRESULT (__stdcall *PFNGETAUTH)(IIdentityAuthority **ppIIdentityAuthority);
PFNGETREF g_pfnGetAssemblyIdentityFromFile = NULL;
PFNGETAUTH g_pfnGetIdentityAuthority = NULL;
IUnknown *g_pUnk = NULL;
bool Init()
{
HRESULT hr = S_OK;
DWORD dwSize = 0;
bool bRC = false;
hr = CorBindToRuntimeEx(NULL, L"wks", 0, CLSID_CorRuntimeHost,
IID_ICorRuntimeHost, (void **)&g_pUnk);
if(FAILED(hr)) {
printf("Error: Failed to initialize CLR runtime! hr = 0x%0x\n",
hr);
goto Exit;
}
if (SUCCEEDED(hr)) {
hr = GetRealProcAddress("GetAssemblyIdentityFromFile",
(VOID **)&g_pfnGetAssemblyIdentityFromFile);
}
if (SUCCEEDED(hr)) {
hr = GetRealProcAddress("GetIdentityAuthority",
(VOID **)&g_pfnGetIdentityAuthority);
}
if (!g_pfnGetAssemblyIdentityFromFile ||
!g_pfnGetIdentityAuthority)
{
printf("Error: Cannot get required APIs from fusion.dll!\n");
goto Exit;
}
bRC = true;
Exit:
return bRC;
}
void Shutdown()
{
if(g_pUnk) {
g_pUnk->Release();
g_pUnk = NULL;
}
}
void Usage()
{
printf("EnumAssemblyAttributes: A tool to enumerate the identity
attributes of a given assembly.\n\n");
printf("Usage: EnumAssemblyAttributes AssemblyFilePath\n");
printf("\n");
}
int _cdecl wmain(int argc, LPCWSTR argv[])
{
int iResult = 1;
IUnknown *pUnk = NULL;
IReferenceIdentity *pRef = NULL;
HRESULT hr = S_OK;
IEnumIDENTITY_ATTRIBUTE *pEnum = NULL;
BYTE abData[1024];
DWORD cbAvailable;
DWORD cbUsed;
IDENTITY_ATTRIBUTE_BLOB *pBlob;
if(argc != 2) {
Usage();
goto Exit;
}
if(!Init()) {
printf("Failure initializing EnumIdAttr.\n");
goto Exit;
}
hr = g_pfnGetAssemblyIdentityFromFile(argv[1],
__uuidof(IReferenceIdentity), &pUnk);
if (FAILED(hr)) {
printf("GetAssemblyIdentityFromFile failed with hr = 0x%x",
hr);
goto Exit;
}
hr = pUnk->QueryInterface(__uuidof(IReferenceIdentity),
(void**)&pRef);
if (FAILED(hr)) {
goto Exit;
}
hr = pRef->EnumAttributes(&pEnum);
if (FAILED(hr)) {
printf("IReferenceIdentity::EnumAttributes failed with hr =
0x%x", hr);
goto Exit;
}
pBlob = (IDENTITY_ATTRIBUTE_BLOB *)(abData);
while (1) {
cbAvailable = sizeof(abData);
hr = pEnum->CurrentIntoBuffer(cbAvailable, abData, &cbUsed);
if (FAILED(hr)) {
printf("IEnumIDENTITY_ATTRIBUTE::CurrentIntoBuffer failed
with hr = 0x%x", hr);
goto Exit;
}
if (! cbUsed) {
break;
}
LPWSTR pwzNameSpace = (LPWSTR)(abData + pBlob->ofsNamespace);
LPWSTR pwzName = (LPWSTR)(abData + pBlob->ofsName);
LPWSTR pwzValue = (LPWSTR)(abData + pBlob->ofsValue);
printf("%ws: %ws = %ws\n", pwzNameSpace, pwzName, pwzValue);
hr = pEnum->Skip(1);
if (FAILED(hr)) {
printf("IEnumIDENTITY_ATTRIBUTE::Skip failed with hr =
0x%x", hr);
goto Exit;
}
}
iResult = 0;
Exit:
Shutdown();
if (pUnk) {
pUnk->Release();
}
if (pRef) {
pRef->Release();
}
if (pEnum) {
pEnum->Release();
}
return iResult;
}
Exécution de l'exemple
C:\> EnumAssemblyAttributes.exe C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll
Exemple de sortie
Culture = neutral
name = System
processorArchitecture = MSIL
PublicKeyToken = b77a5c561934e089
Version = 2.0.0.0
Configuration requise
Plateformes : Consultez Configuration requise.
En-tête : Isolation.h
Versions de .NET Framework : Disponible depuis la version 2.0