Partager via


IDENTITY_ATTRIBUTE_BLOB, structure

Contient des informations à propos d'un attribut unique dans un assembly et se compose de trois DWORD. Chaque DWORD est un offset dans une mémoire tampon de caractères produite par la méthode CurrentIntoBuffer de l'interface IEnumIDENTITY_ATTRIBUTE

typedef struct _IDENTITY_ATTRIBUTE_BLOB {
    DWORD  ofsNamespace;
    DWORD  ofsName;
    DWORD  ofsValue;
}   IDENTITY_ATTRIBUTE_BLOB;

Membres

Membre

Description

ofsNamespace

Premier offset figurant dans la mémoire tampon de caractères. Cet offset n'est pas suivi de l'espace de noms de l'attribut, mais d'une série de caractères null. Il n'est par conséquent pas utilisé.

ofsName

Deuxième offset figurant dans la mémoire tampon de caractères. Cet emplacement correspond au début du nom de l'attribut.

ofsValue

Troisième offset figurant dans la mémoire tampon de caractères. Cet emplacement correspond au début de la valeur de l'attribut.

Exemple

L'exemple suivant illustre plusieurs étapes de base qui aboutiront par la suite à une structure IDENTITY_ATTRIBUTE_BLOB remplie :

  1. Obtenez un IReferenceIdentity pour l'assembly.

  2. Appelez la méthode IReferenceIdentity::EnumAttributes et obtenez un IEnumIDENTITY_ATTRIBUTE.

  3. Créez une mémoire tampon de caractères et castez-la en structure IDENTITY_ATTRIBUTE_BLOB.

  4. Appelez la méthode CurrentIntoBuffer de l'interface IEnumIDENTITY_ATTRIBUTE. Cette méthode copie les attributs Namespace, Name et Value dans la mémoire tampon de caractères. Les trois offsets de ces chaînes seront disponibles dans la structure IDENTITY_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;
}

Pour exécuter l'exemple

C:\> EnumAssemblyAttributes.exe C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll

Résultat de l'exemple

Culture = neutral

name = System

processorArchitecture = MSIL

PublicKeyToken = b77a5c561934e089

Version = 2.0.0.0

Configuration requise

Plateformes : consultez Configuration requise du .NET Framework.

En-tête : Isolation.h

Versions du .NET Framework : 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

Voir aussi

Référence

IReferenceIdentity, interface

IEnumIDENTITY_ATTRIBUTE, interface

IDENTITY_ATTRIBUTE, structure

Autres ressources

Structures de fusion