SetupAPI - SetupGetInfInformation in C# verwenden

Christian Kusmanow

Erfahrenes Mitglied
Ich grüße euch!

Ich schaffe nicht einen bestimmten Typ richtig in C# zu marshallen. Genauer gesagt geht um die SP_INF_INFORMATION Struktur, die folgender Maßen in der Setupapi.h definiert wird:
Code:
//
// Inf file information structure.
//
typedef struct _SP_INF_INFORMATION {
    DWORD InfStyle;
    DWORD InfCount;
    BYTE VersionData[ANYSIZE_ARRAY];
} SP_INF_INFORMATION, *PSP_INF_INFORMATION;
Diese Struktur wird von der SetupGetInfInformation Funktion gefüllt. Hier mein Code:
C#:
/// <summary>
/// Stores information about an INF file, including the style, number of constituent INF files, and version data.
/// </summary>
/// <remarks>http://msdn2.microsoft.com/en-us/library/aa377644.aspx</remarks>
[StructLayout ( LayoutKind.Sequential, CharSet = CharSet.Auto )]
internal struct SP_INF_INFORMATION
{
    public InfStyle InfStyle;
    public int InfCount;
    public byte[] VersionData;
}

/// <summary>
/// Returns the <see cref="SP_INF_INFORMATION"/> structure for the specified INF file to a buffer.
/// </summary>
/// <remarks>http://msdn2.microsoft.com/en-us/library/aa377383.aspx</remarks>
/// <param name="InfSpec">Handle or a file name for an INF file, depending on the value of SearchControl.</param>
/// <param name="SearchControl">This parameter can be one of the <see cref="Inflnformation"/> constants.</param>
/// <param name="ReturnBuffer">The return buffer.</param>
/// <param name="ReturnBufferSize">Size of the return buffer.</param>
/// <param name="RequiredSize">The required buffer size.</param>
/// <returns></returns>
[DllImport("setupapi.dll", SetLastError = true)]
static extern bool SetupGetInfInformation(
    [In] IntPtr InfSpec,
    [In] Inflnformation SearchControl,
    [In, Out] ref SP_INF_INFORMATION ReturnBuffer,
    [In] int ReturnBufferSize,
    [In, Out] ref long RequiredSize );

public static bool SetupGetInfInformation( InfFile infFile, out SP_INF_INFORMATION infInformation )
{
    long requiredSize = 0;
    infInformation = new SP_INF_INFORMATION();
    SetupGetInfInformation( infFile.Handle, Inflnformation.INFINFO_INF_SPEC_IS_HINF, ref infInformation, 0, ref requiredSize );
    return SetupGetInfInformation( infFile.Handle, Inflnformation.INFINFO_INF_SPEC_IS_HINF, ref infInformation, (int) requiredSize, ref requiredSize );
}
InfFile ist ein Managed Object, was ein InfFile repräsentiert und besitzt ein valides Handle. Bei dem 2. Aufruf der SetupGetInfInformation Funktion bekomme ich einen FatalExecutionEngineError. Die ersten 2 Felder der SP_INF_INFORMATION Struktur werden korrekt ausgefüllt. Nur leider wird das Byte-Array anscheinen nicht richtig gemarshallt bzw. weiß ich nicht wie ich das anstellen soll. :(

Hier der komplette Fehlercode:
FatalExecutionEngineError hat gesagt.:
FatalExecutionEngineError was detected
Message: Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0x79e8a634" in Thread "0xb8c". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können.
  1. Kann mir jemand sagen, was ich hier falsch mache? Ich habe leider noch keine große Erfahrung mit P/Invoke.
  2. Wo finde ich ein gescheites Tutorial, wo alle möglichen Datentypen an Beispielen erklärt werden? :)
 
Zurück