Delen via


Een callbackroutine ontwerpen voor een miniportstuurprogramma die WMI-klassen met methoden verwerkt

In deze sectie worden voorbeeld-WMI-klassen gebruikt die WMI-methoden bevatten en wordt beschreven hoe de bijbehorende callbackroutine voor miniportstuurprogramma's eruit moet zien. Zie HwScsiWmiExecuteMethodMethodvoor meer informatie over de callbackroutine voor miniportstuurprogramma's die WMI-methoden uitvoeren.

De volgende WMI-klassen bevatten WMI-methoden:

class MSFC_HBAAdapterMethods
{
    [key] 
    string InstanceName;
    boolean Active;
    [
     Implemented,
     WmiMethodId(1)
    ]
    void GetDiscoveredPortAttributes(
            [in ] uint32 PortIndex,
            [in ] uint32 DiscoveredPortIndex,
            [out, HBA_STATUS_QUALIFIERS ] HBA_STATUS HBAStatus,
            [out, HBAType("HBA_PORTATTRIBUTES") ] 
                MSFC_HBAPortAttributesResults PortAttributes
            );
    [
     Implemented,
     WmiMethodId(2)
    ]
    void GetPortAttributesByWWN(
            [in, HBAType("HBA_WWN")] uint8 wwn[8],
            [out, HBA_STATUS_QUALIFIERS ] HBA_STATUS HBAStatus,
          [out, HBAType("HBA_PORTATTRIBUTES") ] 
                MSFC_HBAPortAttributesResults PortAttributes
            );
};
class MSFC_HBAFCPInfo
{
    [key] 
    string InstanceName;
    boolean Active;
    [
     Implemented,
     WmiMethodId(1)
    ]
    void GetFcpTargetMapping(
            [in, HBAType("HBA_WWN")] uint8 HbaPortWWN[8],
            [in ] uint32 InEntryCount,
            [out, HBA_STATUS_QUALIFIERS ] HBA_STATUS HBAStatus,
            [out] uint32 TotalEntryCount,
            [out] uint32 OutEntryCount,
            [out, WmiSizeIs("OutEntryCount")] HBAFCPScsiEntry  
                 Entry[]
            );
};

De MSFC_HBAAdapterMethods-klasse bevat twee methoden, GetDiscoveredPortAttributes en GetPortAttributesByWWN-. De klasse MSFC_HBAFCPInfo bevat één methode, GetFcpTargetMapping-.

Wanneer de afhandelingsroutine van de WMI-bibliotheek voor de SCSI-poort de uitvoeren-methodecallback van uw minipoortstuurprogramma aanroept, wordt er een GuidIndex--waarde doorgegeven die de WMI-klasse identificeert, een MethodId-waarde die de methode binnen de klasse identificeert en een InstanceIndex-waarde waarmee wordt aangegeven welke van de mogelijke meerdere exemplaren van de klasse moeten worden verwerkt. De callback-routine moet de juiste actie ondernemen voor een bepaalde combinatie van klasse, methode en klasse-exemplaar.

In het volgende voorbeeld ziet u hoe de callback-routine van de execute-methode de methoden in het vorige voorbeeld kan verwerken.

HwScsiWmiExecuteMethod (
    IN PVOID Context,
    IN PSCSIWMI_REQUEST_CONTEXT DispatchContext,
    IN ULONG GuidIndex,
    IN ULONG InstanceIndex,
    IN ULONG MethodId,
    IN ULONG InBufferSize,
    IN ULONG OutBufferSize,
    IN OUT PUCHAR Buffer
    )

  switch(GuidIndex) { 
    case MSFC_HBAAdapterMethodsGuidIndex:
    {
      switch(MethodId) {
      case GetDiscoveredPortAttributes:
        // handle method here 
        Switch(InstanceIndex) {
        case 1:
          // handle instance 1
          PGetDiscoveredPortAttributes_IN In;
          PGetDiscoveredPortAttributes_OUT Out;
          // note: input and output parameters use the same buffer
          In = (PGetDiscoveredPortAttributes_IN)Buffer;
          Out = (PGetDiscoveredPortAttributes_OUT)Buffer;
          // put code for method here
          break;
        case 2:
       // handle instance 2
        default:
          break;
        }
      case GetPortAttributesByWWN:
        // handle method here 
      default:
        break;
    }
    case MSFC_HBAFCPInfoGuidIndex:
    {
      switch(MethodId) {
      case GetFcpTargetMapping:
        // handle method here 
      default:
        break;
      }
    }

De WMI tool suite (mofcomp en wmimofck) vereenvoudigt de taak van het schrijven van deze routine door automatisch een bibliotheek met binaire typen en een headerbestand te genereren dat een symbolische constante definieert voor elke WMI-klasse GUID-index en elke methode-id. Zie voor meer informatie over het gebruik van deze hulpprogramma's Het MOF-bestand van een stuurprogramma compileren en Gebruik wmimofck.exe.

Het hulpprogramma wmimofck genereert een .h-bestand op basis van het binaire .bmf-bestand dat is gegenereerd door mofcomp-. Het vormt de naam van de symbolische constante voor de klasse-index door een 'GuidIndex'-achtervoegsel aan de naam van de WMI-klasse toe te voegen. Met de MSFC_FibrePortHBAMethods-klasse maakt het hulpprogramma bijvoorbeeld een symbolische constante met de naam MSFC_FibrePortHBAMethodsGuidIndex die de GUID-index voor die klasse vertegenwoordigt. Op een vergelijkbare manier gebruikt het hulpprogramma de methodenaam om een symbolische constante te vormen die de methode vertegenwoordigt, maar zonder achtervoegsels toe te voegen. De naam van de symbolische constante voor de methode is gewoon de naam van de methode. In het voorbeeld test de switch-instructie de waarde van de methode-id. Elk geval in de switch-instructie komt overeen met een methodenaam.

De MOF-syntaxis die wordt gebruikt om een WMI-klassemethode te definiëren, lijkt op een routine; een WMI-methode is echter geen routine. Wanneer de mofcomp- en wmimofck-hulpprogramma's een methodedefinitie verwerken in het MOF-bestand, genereren ze twee afzonderlijke C-taalstructuurdeclaraties voor de methode. Een structuur is voor de parameters die in het MOF-bestand worden geïdentificeerd als invoerparameters door een voorvoegsel [in], en een andere structuur voor de parameters die worden geïdentificeerd als uitvoerparameters door een voorvoegsel [out].

Het wmimofck-hulpprogramma vormt de naam van de structuur die de invoerparameters van de methode bevat door een achtervoegsel van '_IN' aan de naam van de methode toe te voegen. Als de naam van de methode bijvoorbeeld wordt GetDiscoveredPortAttributes, genereert wmimofck- automatisch een declaratie voor een structuur met de naam GetDiscoveredPortAttributes_IN. Op dezelfde manier genereert wmimofck een declaratie voor een structuur met de naam GetDiscoveredPortAttributes_OUT die de uitvoerparameters van de methode bevat.

In het volgende codefragment ziet u hoe een callback-routine voor de execute-methode de grootte van de invoer- en uitvoerbuffers kan valideren voor een methode met de naam GetDiscoveredPortAttributes in een klasse met de naam MSFC_HBAPortMethods:

case MSFC_HBAPortMethodsGuidIndex:
  switch(MethodId) {
    case GetDiscoveredPortAttributes:
  {
      BOOLEAN bInputBigEnough = (InBufferSize >= 
              sizeof(GetDiscoveredPortAttributes_IN))
      BOOLEAN bOutputBigEnough = (OutBufferSize >= 
              sizeof(GetDiscoveredPortAttributes_OUT))
      if (bInputBigEnough && bOutputBigEngough) {
        PGetDiscoveredPortAttributes_IN In;
        PGetDiscoveredPortAttributes_OUT Out;

        In = (PGetDiscoveredPortAttributes_IN)Buffer;
         Out = (PGetDiscoveredPortAttributes_OUT)Buffer;
        // 
        // process method here
      //
        status = SRB_STATUS_SUCCESS;
      } else {
        status = SRB_STATUS_DATA_OVERRUN;
      }
    }

Voordat u terugkeert, moet uw callback-routine ScsiPortWmiPostProcessaanroepen. Deze WMI-bibliotheekroutine van de SCSI-poort werkt de aanvraagcontext bij met informatie, zoals de status van de aanvraag en de grootte van de retourgegevens. Zie SCSIWMI_REQUEST_CONTEXTvoor meer informatie over de informatie die is opgeslagen in de aanvraagcontext.