PNSCATALOG WSAAPI WsProcGetNsCatalog(IN PWSPROCESS Process) { /* Check if the catalogs have been modified */ if (WsCheckCatalogState(Process->NamespaceCatalogEvent)) { /* Modification happened, reload them */ WsNcRefreshFromRegistry(Process->NamespaceCatalog, Process->NamespaceCatalogEvent); } /* Return it */ return Process->NamespaceCatalog; }
INT WSAAPI WsNcRefreshFromRegistry(IN PNSCATALOG Catalog, IN HANDLE CatalogEvent) { INT ErrorCode; BOOLEAN LocalEvent = FALSE; LIST_ENTRY LocalList; DWORD UniqueId; HKEY EntriesKey; DWORD CatalogEntries; PNSCATALOG_ENTRY CatalogEntry; BOOL NewChangesMade; PLIST_ENTRY Entry; DWORD RegType = REG_DWORD; DWORD RegSize = sizeof(DWORD); DWORD i; /* Check if we got an event */ if (!CatalogEvent) { /* Create an event ourselves */ CatalogEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (!CatalogEvent) return WSASYSCALLFAILURE; LocalEvent = TRUE; } /* Lock the catalog */ WsNcLock(); /* Initialize our local list for the loop */ InitializeListHead(&LocalList); /* Start looping */ do { /* Setup notifications for the catalog entry */ ErrorCode = WsSetupCatalogProtection(Catalog->CatalogKey, CatalogEvent, &UniqueId); if (ErrorCode != ERROR_SUCCESS) break; /* Check if we've changed till now */ if (UniqueId == Catalog->UniqueId) { /* We haven't, so return */ ErrorCode = ERROR_SUCCESS; break; } /* Now Open the Entries */ ErrorCode = RegOpenKeyEx(Catalog->CatalogKey, "Catalog_Entries", 0, MAXIMUM_ALLOWED, &EntriesKey); if (ErrorCode != ERROR_SUCCESS) { /* Critical failure */ ErrorCode = WSASYSCALLFAILURE; break; } /* Find out how many there are */ ErrorCode = RegQueryValueEx(Catalog->CatalogKey, "Num_Catalog_Entries", 0, &RegType, (LPBYTE)&CatalogEntries, &RegSize); if (ErrorCode != ERROR_SUCCESS) { /* Critical failure */ ErrorCode = WSASYSCALLFAILURE; break; } /* Initialize them all */ for (i = 1; i <= CatalogEntries; i++) { /* Allocate a Catalog Entry Structure */ CatalogEntry = WsNcEntryAllocate(); if (!CatalogEntry) { /* Not enough memory, fail */ ErrorCode = WSA_NOT_ENOUGH_MEMORY; break; } /* Initialize it from the Registry Key */ ErrorCode = WsNcEntryInitializeFromRegistry(CatalogEntry, EntriesKey, i); if (ErrorCode != ERROR_SUCCESS) { /* We failed to get it, dereference the entry and leave */ WsNcEntryDereference(CatalogEntry); break; } /* Insert it to our List */ InsertTailList(&LocalList, &CatalogEntry->CatalogLink); } /* Close the catalog key */ RegCloseKey(EntriesKey); /* Check if we changed during our read and if we have success */ NewChangesMade = WsCheckCatalogState(CatalogEvent); if (!NewChangesMade && ErrorCode == ERROR_SUCCESS) { /* All is good, update the protocol list */ WsNcUpdateNamespaceList(Catalog, &LocalList); /* Update and return */ Catalog->UniqueId = UniqueId; break; } /* We failed and/or catalog data changed, free what we did till now */ while (!IsListEmpty(&LocalList)) { /* Get the LP Catalog Item */ Entry = RemoveHeadList(&LocalList); CatalogEntry = CONTAINING_RECORD(Entry, NSCATALOG_ENTRY, CatalogLink); /* Dereference it */ WsNcEntryDereference(CatalogEntry); } } while (NewChangesMade); /* Release the lock */ WsNcUnlock(); /* Close the event, if any was created by us */ if (LocalEvent) CloseHandle(CatalogEvent); /* All Done */ return ErrorCode; }