Implementieren von SceSvcAttachmentAnalyze

Die SceSvcAttachmentAnalyze-Funktion muss Konfigurationsinformationen aus der Sicherheitsdatenbank und dem Dienst abrufen, die beiden Informationssätze vergleichen und dann den Analyseabschnitt der Sicherheitsdatenbank mit allen Unterschieden aktualisieren. Sie können dies mithilfe des folgenden Algorithmus sicherstellen.

So implementieren Sie SceSvcAttachmentAnalyze

  1. Definieren Sie die Variablen, die zum Abrufen und Festlegen der Sicherheitsinformationen und Rückgabecodes erforderlich sind.
  2. Rufen Sie die Rückruffunktion pfQueryInfo in der Rückrufstruktur auf, um Konfigurationsinformationen aus der Sicherheitsdatenbank abzurufen.
  3. Rufen Sie die entsprechenden Informationen aus dem Dienst ab.
  4. Vergleichen Sie die vom Dienst abgerufenen Konfigurationsdaten mit den aus der Sicherheitsdatenbank abgerufenen Daten.
  5. Wenn die Informationen nicht identisch sind, rufen Sie die Rückruffunktion pfSetInfo in der Rückrufstruktur auf, um die Datenbank zu aktualisieren.
  6. Geben Sie alle Puffer frei, die zum Abrufen von Informationen verwendet werden. Rufen Sie die PfFreeInfo-Rückruffunktion in der Rückrufstruktur auf, um Arbeitsspeicher freizugeben, der für zurückgegebene Datenbankinformationen verwendet wird.
  7. Wenn eine Meldung vorhanden ist, die die Erweiterung der Analyseprotokolldatei hinzufügen möchte, rufen Sie die Rückruffunktion pfLogInfo in der Rückrufstruktur auf.
  8. Gibt die entsprechenden SCESTATUS-Codes zurück.

Das folgende Beispiel zeigt eine mögliche Implementierung von SceSvcAttachmentAnalyze. Beachten Sie, dass in diesem Beispiel die Funktionen QueryConfigurationLine bzw. CompareValue Informationen aus dem Dienst abfragen und diese Werte mit denen vergleichen, die aus der Sicherheitsdatenbank abgerufen wurden. Die Implementierung dieser Funktionen wird nicht angezeigt.

#include <windows.h>

SCESTATUS WINAPI SceSvcAttachmentAnalyze (
    IN PSCESVC_CALLBACK_INFO pSceCbInfo
)
{
  
    ////////////////////////////////////////////////////
    // Define variables.
    ////////////////////////////////////////////////////
    PSCESVC_CONFIGURATION_INFO     pConfigInfo = NULL;
    SCESTATUS                      retCode;
    SCE_ENUMERATION_CONTEXT        EnumContext = 0;
  
  

    if ( pSceCbInfo == NULL ||
         pSceCbInfo->sceHandle == NULL ||
         pSceCbInfo->pfQueryInfo == NULL ||
         pSceCbInfo->pfSetInfo == NULL ||
         pSceCbInfo->pfFreeInfo == NULL ) 
    {
        return(SCESTATUS_INVALID_PARAMETER);
    }


  ////////////////////////////////////////////////////
  // Retrieve information from security database.
  ///////////////////////////////////////////////////
    do
    {
        retCode =  (*(pSceCbInfo->pfQueryInfo))(
                              pSceCbInfo->sceHandle,
                              SceSvcConfigurationInfo,
                              NULL,
                              FALSE,
                              &pConfigInfo,
                              &EnumContext
                              );
        if(retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
        {
          ULONG i;
          for(i = 0;i < pConfigInfo->Count; i++)
          {
            if(pConfigInfo->Line[I].Key == NULL) 
                continue;
        
        //////////////////////////////////////////////
        // Query service for corresponding key.
        //////////////////////////////////////////////
            QueryConfigurationLine(
                               pConfigInfo->Line[i].Key,
                               &SystemValue);
        
        //////////////////////////////////////////////
        // Compare values.
        //////////////////////////////////////////////
            CompareValue(
                     pConfigInfo->Line[i].Key,
                     SystemValue,
                     pConfigInfo->Line[i].Value,
                     &Result);
        
        //////////////////////////////////////////////
        // Write to security database if values are 
        // not equal.
        //////////////////////////////////////////////
            if(Result != NULL)
            {
              retCode =  (*(pSceCbInfo->pfSetInfo))(pSceCbInfo->sceHandle,
                                      SceSvcAnalysisInfo,
                                      pConfigInfo->Line[i].Key,
                                      TRUE,
                                      Result);
              if(retCode != SCESTATUS_SUCCESS)
              {
                //////////////////////////////////////////
                // Add code to handle other return codes.
                //////////////////////////////////////////
              }
            }
        }
      
          //////////////////////////////////////////////
          // Free all buffers used to retrieve 
          // SceSvcFree frees memory allocated by call 
          // to SceSvcQueryQueryInfo. 
          /////////////////////////////////////////
        (*(pSceCbInfo->pfFreeInfo)) (PVOID)pConfigInfo);
          pConfigInfo = NULL;
    }
  } while (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL);
  
  
  //////////////////////////////////////////////////
  // If the return code is not SCESTATUS_SUCCESS, add code to 
  // set error message appropriately.
  //////////////////////////////////////////////////
  return retCode;
}