Implementieren von SceSvcAttachmentConfig

Die SceSvcAttachmentConfig-Funktion muss Informationen aus der Sicherheitsdatenbank abrufen und diese Informationen dann zum Konfigurieren des Diensts verwenden.

Bei der Implementierung von SceSvcAttachmentConfig können Sie entweder alle Informationen abrufen und dann den Dienst konfigurieren oder den Dienst in Schritten abrufen und konfigurieren. Der folgende Algorithmus ruft alle Informationen ab und konfiguriert dann den Dienst.

So implementieren Sie SceSvcAttachmentConfig

  1. Definieren Sie die Variablen, die zum Abrufen von Informationen und Rückgabecodes erforderlich sind.
  2. Rufen Sie die PfQueryInfo-Rückruffunktion in der Rückrufstruktur auf, um Konfigurationsinformationen aus der Sicherheitsdatenbank abzurufen.
  3. Konfigurieren Sie das System mit den zurückgegebenen Informationen.
  4. Rufen Sie die PfFreeInfo-Rückruffunktion in der Rückrufstruktur auf, um Arbeitsspeicher freizugeben, der für zurückgegebene Informationen verwendet wird.
  5. 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.
  6. Gibt die entsprechenden SCESTATUS-Codes zurück.

Das folgende Beispiel zeigt eine mögliche Implementierung von SceSvcAttachmentConfig. Beachten Sie, dass in diesem Beispiel die Funktion ProcessConfigurationLine die Dienstkonfiguration festlegt. Die Implementierung dieser Funktion wird nicht angezeigt.

SCESTATUS WINAPI SceSvcAttachmentConfig (
    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 configuration information and configure
      // system. 
      ////////////////////////////////////////////////////
      do
      {
            retCode = (*(pSceCbInfo->pfQueryInfo))( pSceCbInfo->sceHandle,
                                  SceSvcConfigurationInfo,
                                  NULL,
                                  FALSE,
                                  (PVOID *)&pConfigInfo,
                                  &EnumContext
                                 );
            if (retCode == SCESTATUS_SUCCESS && pConfigInfo != NULL)
            {
              ULONG i:
              //////////////////////////////////////////////////
              // Configure system.
              /////////////////////////////////////////////////
              for(i = 0; < pConfigInfo->Count; i++)
              {
                if(pConfigInfo->Line[i].Key == NULL) 
                    continue;
                ProcessConfigurationLine(pConfigInfo->Line[i]);
              }
      
      
              //////////////////////////////////////////////////
              // Free data returned.
              /////////////////////////////////////////////////
              (*(pSceCbInfo->pfFreeInfo)) ((PVOPID)pConfigInfo);
              pConfigInfo = NULL;
            }
        } while (retCode == SCESTATUS_SUCCESS && CountReturned > 0);
  
  
  ////////////////////////////////////////////////////
  // Add code for other return codes if retCode is 
  // not SCESTATUS_SUCCESS.
  ///////////////////////////////////////////////////
  return retCode;
}