void release_service(struct service_entry *service) { if (InterlockedDecrement(&service->ref_count) == 0 && is_marked_for_delete(service)) { scmdatabase_lock_exclusive(service->db); service_lock_exclusive(service); scmdatabase_remove_service(service->db, service); service_unlock(service); scmdatabase_unlock(service->db); free_service_entry(service); } }
static DWORD scmdatabase_load_services(struct scmdatabase *db) { DWORD err; int i; for (i = 0; TRUE; i++) { WCHAR szName[MAX_SERVICE_NAME]; struct service_entry *entry; HKEY hServiceKey; err = RegEnumKeyW(db->root_key, i, szName, MAX_SERVICE_NAME); if (err == ERROR_NO_MORE_ITEMS) break; if (err != 0) { WINE_ERR("Error %d reading key %d name - skipping\n", err, i); continue; } err = service_create(szName, &entry); if (err != ERROR_SUCCESS) break; WINE_TRACE("Loading service %s\n", wine_dbgstr_w(szName)); err = RegOpenKeyExW(db->root_key, szName, 0, KEY_READ, &hServiceKey); if (err == ERROR_SUCCESS) { err = load_service_config(hServiceKey, entry); RegCloseKey(hServiceKey); } if (err != ERROR_SUCCESS) { WINE_ERR("Error %d reading registry key for service %s - skipping\n", err, wine_dbgstr_w(szName)); free_service_entry(entry); continue; } if (entry->config.dwServiceType == 0) { /* Maybe an application only wrote some configuration in the service key. Continue silently */ WINE_TRACE("Even the service type not set for service %s - skipping\n", wine_dbgstr_w(szName)); free_service_entry(entry); continue; } if (!validate_service_config(entry)) { WINE_ERR("Invalid configuration of service %s - skipping\n", wine_dbgstr_w(szName)); free_service_entry(entry); continue; } entry->status.dwServiceType = entry->config.dwServiceType; entry->db = db; list_add_tail(&db->services, &entry->entry); } return ERROR_SUCCESS; }
void release_service(struct service_entry *service) { if (InterlockedDecrement(&service->ref_count) == 0 && is_marked_for_delete(service)) free_service_entry(service); }