text: //+-------------------------------------------------------------------------
  //
  //  Microsoft Windows
  //  Copyright (C) Microsoft Corporation, 1992 - 1992.
  //
  //  File:       prefix.hxx
  //
  //  Contents:   PREFIX table definition
  //
  //  History:    SethuR -- Implemented
  //--------------------------------------------------------------------------
  
  #ifndef __PREFIX_HXX__
  #define __PREFIX_HXX__
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  
  //+---------------------------------------------------------------------
  //
  // Struct:  DFS_PREFIX_TABLE API.
  //
  // History:
  //
  // Notes:   The following API's are provided for manipulating the
  //          DFS_PREFIX_TABLE.
  //
  //----------------------------------------------------------------------
  struct _DFS_PREFIX_TABLE;
  
  extern
  NTSTATUS DfsInitializePrefixTable(struct _DFS_PREFIX_TABLE **ppTable,
                                    BOOLEAN           fCaseSensitive,
                                    PVOID Lock);
                              
  
  extern
  NTSTATUS DfsInsertInPrefixTableLocked(struct _DFS_PREFIX_TABLE *pTable,
                                  PUNICODE_STRING   pPath,
                                  PVOID             pData);
  
  extern
  NTSTATUS DfsRemoveFromPrefixTableLocked(struct _DFS_PREFIX_TABLE *pTable,
                                    PUNICODE_STRING pPath,
                                    PVOID pMatchingData );
  
  
  extern
  NTSTATUS DfsReplaceInPrefixTableLocked(struct _DFS_PREFIX_TABLE *pTable,
                                   PUNICODE_STRING pPath,
                                   PVOID pReplaceData,
                                   PVOID pMatchingData );
  
  extern 
  NTSTATUS DfsFreePrefixTable(struct _DFS_PREFIX_TABLE *pTable);
  
  extern
  NTSTATUS DfsFindUnicodePrefixLocked(
      IN  struct _DFS_PREFIX_TABLE *pTable,
      IN  PUNICODE_STRING     pPath,
      OUT PUNICODE_STRING     pSuffix,
      OUT PVOID *ppData,
      OUT PBOOLEAN pSubStringMatch );
  
  
  extern
  NTSTATUS
  DfsPrefixTableAcquireWriteLock(
      struct _DFS_PREFIX_TABLE *pTable );
  
  extern
  NTSTATUS
  DfsPrefixTableAcquireReadLock(
      struct _DFS_PREFIX_TABLE *pTable );
  
  
  extern
  NTSTATUS
  DfsPrefixTableReleaseLock(
      struct _DFS_PREFIX_TABLE *pTable );
  
  extern NTSTATUS
  DfsPrefixTableInit(VOID);
  
  extern
  void
  DfsPrefixTableShutdown(void);
  
  VOID
  DfsDumpPrefixTable(
     struct _DFS_PREFIX_TABLE *pPrefixTable,
     IN VOID (*DumpFunction)(PVOID pEntry));
  
  VOID
  DfsProcessPrefixTable(
     struct _DFS_PREFIX_TABLE *pPrefixTable,
     IN VOID (*DumpFunction)(PVOID pEntry));
  
  
  NTSTATUS
  DfsDismantlePrefixTable(
      IN struct _DFS_PREFIX_TABLE *pTable,
      IN VOID (*ProcessFunction)(PVOID pEntry));
  
  NTSTATUS
  DfsInsertInPrefixTable(
      IN struct _DFS_PREFIX_TABLE *pTable,
      IN PUNICODE_STRING   pPath,
      IN PVOID             pData);
  
  NTSTATUS
  DfsFindUnicodePrefix(
      IN struct _DFS_PREFIX_TABLE *pTable,
      IN PUNICODE_STRING pPath,
      IN PUNICODE_STRING pSuffix,
      IN PVOID *ppData);
  
  NTSTATUS 
  DfsRemoveFromPrefixTable(
      IN struct _DFS_PREFIX_TABLE *pTable,
      IN PUNICODE_STRING pPath,
      IN PVOID pMatchingData);
  
  NTSTATUS
  DfsReplaceInPrefixTable(
      IN struct _DFS_PREFIX_TABLE *pTable,
      IN PUNICODE_STRING pPath,
      IN PVOID pReplaceData,
      IN PVOID pMatchingData);
  
  
  NTSTATUS 
  DfsRemoveFromPrefixTableEx(
      IN struct _DFS_PREFIX_TABLE * pTable,
      IN PUNICODE_STRING pPath,
      IN PVOID pMatchingData,
      IN PVOID *pReturnedData);
  
  
  NTSTATUS DfsRemoveFromPrefixTableLockedEx(
      IN struct _DFS_PREFIX_TABLE * pTable,
      IN PUNICODE_STRING pPath,
      IN PVOID pMatchingData,
      IN PVOID *pReturnedData);
  
  
  #ifdef WPP_CB_TYPE
  // only define this if we are doing tracing
  VOID
  PrefixSetTraceControl(WPP_CB_TYPE *Control);
  
  #endif
  
  #define DfsReferencePrefixTable(_pTable) \
           DfsIncrementReference((PDFS_OBJECT_HEADER)(_pTable))
           
  NTSTATUS
  DfsDereferencePrefixTable(struct _DFS_PREFIX_TABLE *pTable );
  
  
  NTSTATUS
  DfsEnumeratePrefixTableLocked(
      IN struct _DFS_PREFIX_TABLE *pNameTable,
      IN VOID (*pfnCallback)(LPVOID pEntry, LPVOID pContext),
      LPVOID lpvClientContext);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif // __PREFIX_HXX__
  