Windows: Restrict redir trace buffer to 10240KB
[openafs.git] / src / WINNT / afsrdr / kernel / fs / AFSGeneric.cpp
index bd01b56..27503bb 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Kernel Drivers, LLC.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * - Redistributions of source code must retain the above copyright notice,
  *   this list of conditions and the following disclaimer.
  * - Redistributions in binary form must reproduce the above copyright
- *   notice,
- *   this list of conditions and the following disclaimer in the
- *   documentation
- *   and/or other materials provided with the distribution.
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
  *   nor the names of their contributors may be used to endorse or promote
  *   products derived from this software without specific prior written
 //
 
 ULONG
-AFSExceptionFilter( IN ULONG Code,
+AFSExceptionFilter( IN CHAR *FunctionString,
+                    IN ULONG Code,
                     IN PEXCEPTION_POINTERS ExceptPtrs)
 {
+    UNREFERENCED_PARAMETER(Code);
 
     PEXCEPTION_RECORD ExceptRec;
     PCONTEXT Context;
@@ -65,13 +65,15 @@ AFSExceptionFilter( IN ULONG Code,
 
         Context = ExceptPtrs->ContextRecord;
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
-                      "AFSExceptionFilter (Framework) - EXR %p CXR %p Code %08lX Address %p\n",
+                      "AFSExceptionFilter (Framework) - EXR %p CXR %p Function %s Code %08lX Address %p Routine %p\n",
                       ExceptRec,
                       Context,
+                      FunctionString,
                       ExceptRec->ExceptionCode,
-                      ExceptRec->ExceptionAddress);
+                      ExceptRec->ExceptionAddress,
+                      (void *)AFSExceptionFilter));
 
         DbgPrint("**** Exception Caught in AFS Redirector ****\n");
 
@@ -213,11 +215,11 @@ AFSReleaseResource( IN PERESOURCE Resource)
     if( Resource != &AFSDbgLogLock)
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSReleaseResource Releasing lock %08lX Thread %08lX\n",
+                      "AFSReleaseResource Releasing lock %p Thread %08lX\n",
                       Resource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
     }
 
     ExReleaseResourceLite( Resource);
@@ -231,11 +233,11 @@ void
 AFSConvertToShared( IN PERESOURCE Resource)
 {
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSConvertToShared Converting lock %08lX Thread %08lX\n",
+                  "AFSConvertToShared Converting lock %p Thread %08lX\n",
                   Resource,
-                  PsGetCurrentThread());
+                  PsGetCurrentThread()));
 
     ExConvertExclusiveToSharedLite( Resource);
 
@@ -415,10 +417,10 @@ AFSReadRegistry( IN PUNICODE_STRING RegistryPath)
             // Let's limit things a bit ...
             //
 
-            if( AFSDbgBufferLength > 10240)
+           if( AFSDbgBufferLength > AFS_DBG_LOG_MAXLENGTH)
             {
 
-                AFSDbgBufferLength = 1024;
+               AFSDbgBufferLength = AFS_DBG_LOG_MAXLENGTH;
             }
         }
         else
@@ -606,7 +608,6 @@ AFSUpdateRegistryParameter( IN PUNICODE_STRING ValueName,
     NTSTATUS ntStatus        = STATUS_SUCCESS;
     UNICODE_STRING paramPath, uniParamKey;
     HANDLE hParameters = 0;
-    ULONG ulDisposition = 0;
     OBJECT_ATTRIBUTES stObjectAttributes;
 
     __Enter
@@ -697,7 +698,6 @@ AFSInitializeControlDevice()
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
-    AFSProcessCB *pProcessCB = NULL;
 
     __Enter
     {
@@ -721,11 +721,11 @@ AFSInitializeControlDevice()
         //
 
         KeInitializeEvent( &pDeviceExt->Specific.Control.CommServiceCB.IrpPoolHasEntries,
-                           NotificationEvent,
+                           SynchronizationEvent,
                            FALSE);
 
         KeInitializeEvent( &pDeviceExt->Specific.Control.CommServiceCB.IrpPoolHasReleaseEntries,
-                           NotificationEvent,
+                           SynchronizationEvent,
                            FALSE);
 
         KeInitializeEvent( &pDeviceExt->Specific.Control.ExtentReleaseEvent,
@@ -773,6 +773,12 @@ AFSInitializeControlDevice()
                            NotificationEvent,
                            TRUE);
 
+        pDeviceExt->Specific.Control.WaitingForMemoryCount = 0;
+
+        KeInitializeEvent( &pDeviceExt->Specific.Control.MemoryAvailableEvent,
+                           NotificationEvent,
+                           TRUE);
+
         ExInitializeResourceLite( &pDeviceExt->Specific.Control.LibraryQueueLock);
 
         pDeviceExt->Specific.Control.LibraryQueueHead = NULL;
@@ -800,6 +806,14 @@ AFSInitializeControlDevice()
         pDeviceExt->Specific.Control.AuthGroupTree.TreeLock = &pDeviceExt->Specific.Control.AuthGroupTreeLock;
 
         pDeviceExt->Specific.Control.AuthGroupTree.TreeHead = NULL;
+
+        //
+        // Increase the StackSize to support the extra stack frame required
+        // for use of IoCompletion routines.
+        //
+
+        AFSDeviceObject->StackSize++;
+
     }
 
     return ntStatus;
@@ -811,7 +825,6 @@ AFSRemoveControlDevice()
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
-    AFSProcessCB *pProcessCB = NULL;
 
     __Enter
     {
@@ -900,7 +913,6 @@ AFSReadServerName()
 {
 
     NTSTATUS ntStatus        = STATUS_SUCCESS;
-    ULONG Default            = 0;
     UNICODE_STRING paramPath;
     RTL_QUERY_REGISTRY_TABLE paramTable[2];
 
@@ -951,7 +963,7 @@ AFSReadServerName()
         AFSServerName.Buffer = NULL;
 
         paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
-        paramTable[0].Name = AFS_NETBIOS_NAME;
+        paramTable[0].Name = AFS_REG_NETBIOS_NAME;
         paramTable[0].EntryContext = &AFSServerName;
 
         paramTable[0].DefaultType = REG_NONE;
@@ -988,9 +1000,110 @@ try_exit:
 }
 
 NTSTATUS
+AFSReadMountRootName()
+{
+
+    NTSTATUS ntStatus        = STATUS_SUCCESS;
+    UNICODE_STRING paramPath;
+    RTL_QUERY_REGISTRY_TABLE paramTable[2];
+
+    __Enter
+    {
+
+        //
+        // Setup the paramPath buffer.
+        //
+
+        paramPath.MaximumLength = PAGE_SIZE;
+        paramPath.Buffer = (PWSTR)AFSExAllocatePoolWithTag( PagedPool,
+                                                            paramPath.MaximumLength,
+                                                            AFS_GENERIC_MEMORY_17_TAG);
+
+        //
+        // If it exists, setup the path.
+        //
+
+        if( paramPath.Buffer == NULL)
+        {
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        //
+        // Move in the paths
+        //
+
+        RtlZeroMemory( paramPath.Buffer,
+                       paramPath.MaximumLength);
+
+        RtlCopyMemory( &paramPath.Buffer[ 0],
+                       L"\\TransarcAFSDaemon\\Parameters",
+                       58);
+
+        paramPath.Length = 58;
+
+        RtlZeroMemory( paramTable,
+                       sizeof( paramTable));
+
+        //
+        // Setup the table to query the registry for the needed value
+        //
+
+        AFSMountRootName.Length = 0;
+        AFSMountRootName.MaximumLength = 0;
+        AFSMountRootName.Buffer = NULL;
+
+        paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
+        paramTable[0].Name = AFS_REG_MOUNT_ROOT;
+        paramTable[0].EntryContext = &AFSMountRootName;
+
+        paramTable[0].DefaultType = REG_NONE;
+        paramTable[0].DefaultData = NULL;
+        paramTable[0].DefaultLength = 0;
+
+        //
+        // Query the registry
+        //
+
+        ntStatus = RtlQueryRegistryValues( RTL_REGISTRY_SERVICES,
+                                           paramPath.Buffer,
+                                           paramTable,
+                                           NULL,
+                                           NULL);
+
+        if ( NT_SUCCESS( ntStatus))
+        {
+            if ( AFSMountRootName.Buffer[0] == L'/')
+            {
+
+                AFSMountRootName.Buffer[0] = L'\\';
+            }
+        }
+
+        //
+        // Free up the buffer
+        //
+
+        ExFreePool( paramPath.Buffer);
+
+try_exit:
+
+        if( !NT_SUCCESS( ntStatus))
+        {
+
+            RtlInitUnicodeString( &AFSMountRootName,
+                                  L"\\afs");
+        }
+    }
+
+    return ntStatus;
+}
+
+NTSTATUS
 AFSSetSysNameInformation( IN AFSSysNameNotificationCB *SysNameInfo,
                           IN ULONG SysNameInfoBufferLength)
 {
+    UNREFERENCED_PARAMETER(SysNameInfoBufferLength);
 
     NTSTATUS         ntStatus = STATUS_SUCCESS;
     AFSDeviceExt    *pControlDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
@@ -1035,11 +1148,11 @@ AFSSetSysNameInformation( IN AFSSysNameNotificationCB *SysNameInfo,
         // Process the request
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSSetSysNameInformation Acquiring SysName lock %08lX EXCL %08lX\n",
+                      "AFSSetSysNameInformation Acquiring SysName lock %p EXCL %08lX\n",
                       pSysNameLock,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireExcl( pSysNameLock,
                         TRUE);
@@ -1145,9 +1258,9 @@ NTSTATUS
 AFSDefaultDispatch( IN PDEVICE_OBJECT DeviceObject,
                     IN PIRP Irp)
 {
+    UNREFERENCED_PARAMETER(DeviceObject);
 
     NTSTATUS            ntStatus = STATUS_INVALID_DEVICE_REQUEST;
-    PIO_STACK_LOCATION  pIrpSp = IoGetCurrentIrpStackLocation( Irp);
 
     AFSCompleteRequest( Irp,
                         ntStatus);
@@ -1164,6 +1277,8 @@ AFSSendDeviceIoControl( IN DEVICE_OBJECT *TargetDeviceObject,
                         IN ULONG OutputBufferLength,
                         OUT ULONG *ResultLength)
 {
+    UNREFERENCED_PARAMETER(OutputBuffer);
+    UNREFERENCED_PARAMETER(OutputBufferLength);
 
     NTSTATUS            ntStatus = STATUS_SUCCESS;
     PIRP                pIrp = NULL;
@@ -1218,6 +1333,11 @@ AFSSendDeviceIoControl( IN DEVICE_OBJECT *TargetDeviceObject,
         // Set the completion routine.
         //
 
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "Setting AFSIrpComplete as IoCompletion Routine Irp %p\n",
+                      pIrp));
+
         IoSetCompletionRoutine( pIrp,
                                 AFSIrpComplete,
                                 &kEvent,
@@ -1292,6 +1412,8 @@ AFSIrpComplete( IN PDEVICE_OBJECT DeviceObject,
                 IN PIRP           Irp,
                 IN PVOID          Context)
 {
+    UNREFERENCED_PARAMETER(DeviceObject);
+    UNREFERENCED_PARAMETER(Irp);
 
     KEVENT *pEvent = (KEVENT *)Context;
 
@@ -1308,41 +1430,86 @@ AFSExAllocatePoolWithTag( IN POOL_TYPE  PoolType,
                           IN ULONG  Tag)
 {
 
+    AFSDeviceExt *pControlDevExt = NULL;
     void *pBuffer = NULL;
+    BOOLEAN bTimeout = FALSE;
+    LARGE_INTEGER liTimeout;
+    NTSTATUS ntStatus;
 
-    pBuffer = ExAllocatePoolWithTag( PoolType,
-                                     NumberOfBytes,
-                                     Tag);
+    //
+    // Attempt to allocation memory from the system.  If the allocation fails
+    // wait up to 30 seconds for the AFS redirector to free some memory.  As
+    // long as the wait does not timeout, continue to retry the allocation.
+    // If the wait does timeout, attempt to allocate one more time in case
+    // memory was freed by another driver.  Otherwise, fail the request.
+    //
 
-    if( pBuffer == NULL)
+    if ( AFSDeviceObject)
     {
 
-        if( BooleanFlagOn( AFSDebugFlags, AFS_DBG_BUGCHECK_EXCEPTION))
-        {
+        pControlDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
+    }
 
-            KeBugCheck( (ULONG)-2);
-        }
-        else
+    while( pBuffer == NULL)
+    {
+
+        pBuffer = ExAllocatePoolWithTag( PoolType,
+                                         NumberOfBytes,
+                                         Tag);
+
+        if( pBuffer == NULL)
         {
 
-            AFSDbgLogMsg( 0,
-                          0,
-                          "AFSExAllocatePoolWithTag failure Type %08lX Size %08lX Tag %08lX %08lX\n",
-                          PoolType,
-                          NumberOfBytes,
-                          Tag,
-                          PsGetCurrentThread());
+            if ( bTimeout || pControlDevExt == NULL)
+            {
+
+                AFSDbgTrace(( 0,
+                              0,
+                              "AFSExAllocatePoolWithTag failure Type %08lX Size %08lX Tag %08lX %08lX\n",
+                              PoolType,
+                              NumberOfBytes,
+                              Tag,
+                              PsGetCurrentThread()));
 
-            switch ( Tag ) {
+                switch ( Tag ) {
+
+                case AFS_GENERIC_MEMORY_21_TAG:
+                case AFS_GENERIC_MEMORY_22_TAG:
+                    // AFSDumpTraceFiles -- do nothing;
+                    break;
+
+                default:
+                    AFSBreakPoint();
+                }
 
-            case AFS_GENERIC_MEMORY_21_TAG:
-            case AFS_GENERIC_MEMORY_22_TAG:
-                // AFSDumpTraceFiles -- do nothing;
                 break;
+            }
+
+
+            //
+            // Wait up to 30 seconds for a memory deallocation
+            //
+
+            liTimeout.QuadPart = -(30 *AFS_ONE_SECOND);
+
+            if( InterlockedIncrement( &pControlDevExt->Specific.Control.WaitingForMemoryCount) == 1)
+            {
+                KeClearEvent( &pControlDevExt->Specific.Control.MemoryAvailableEvent);
+            }
+
+            ntStatus = KeWaitForSingleObject( &pControlDevExt->Specific.Control.MemoryAvailableEvent,
+                                              Executive,
+                                              KernelMode,
+                                              FALSE,
+                                              &liTimeout);
+
+            if( ntStatus == STATUS_TIMEOUT)
+            {
 
-            default:
-                AFSBreakPoint();
+                bTimeout = TRUE;
             }
+
+            InterlockedDecrement( &pControlDevExt->Specific.Control.WaitingForMemoryCount);
         }
     }
 
@@ -1350,11 +1517,35 @@ AFSExAllocatePoolWithTag( IN POOL_TYPE  PoolType,
 }
 
 void
-AFSExFreePool( IN void *Buffer)
+AFSExFreePoolWithTag( IN void *Buffer, IN ULONG Tag)
 {
 
-    ExFreePool( Buffer);
+    AFSDeviceExt *pControlDevExt = NULL;
+
+    if ( AFSDeviceObject)
+    {
+
+        pControlDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
+    }
 
+    if ( Tag)
+    {
+
+        ExFreePoolWithTag( Buffer, Tag);
+    }
+    else
+    {
+
+        ExFreePool( Buffer);
+    }
+
+    if ( pControlDevExt)
+    {
+
+        KeSetEvent( &pControlDevExt->Specific.Control.MemoryAvailableEvent,
+                    0,
+                    FALSE);
+    }
     return;
 }
 
@@ -1370,12 +1561,12 @@ AFSShutdownRedirector()
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "%s Shutting down redirector Extent count %08lX Request count %08lX\n",
-                                __FUNCTION__,
-                                pControlDevExt->Specific.Control.ExtentCount,
-                                pControlDevExt->Specific.Control.OutstandingServiceRequestCount);
+                      __FUNCTION__,
+                      pControlDevExt->Specific.Control.ExtentCount,
+                      pControlDevExt->Specific.Control.OutstandingServiceRequestCount));
 
         //
         // Set the shutdown flag so the worker is more agressive in tearing down extents
@@ -1398,10 +1589,10 @@ AFSShutdownRedirector()
         if( ntStatus == STATUS_TIMEOUT)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
-                              "AFSShutdownRedirector Failed to complete all service requests Remaining count %08lX\n",
-                                                    pControlDevExt->Specific.Control.OutstandingServiceRequestCount);
+                          "AFSShutdownRedirector Failed to complete all service requests Remaining count %08lX\n",
+                          pControlDevExt->Specific.Control.OutstandingServiceRequestCount));
 
             try_return( ntStatus = STATUS_UNSUCCESSFUL);
         }
@@ -1423,10 +1614,10 @@ AFSShutdownRedirector()
         if( ntStatus == STATUS_TIMEOUT)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
-                              "AFSShutdownRedirector Failed to purge all extents Remaining count %08lX\n",
-                                                    pControlDevExt->Specific.Control.ExtentCount);
+                          "AFSShutdownRedirector Failed to purge all extents Remaining count %08lX\n",
+                          pControlDevExt->Specific.Control.ExtentCount));
 
             try_return( ntStatus = STATUS_UNSUCCESSFUL);
         }
@@ -1441,13 +1632,13 @@ AFSShutdownRedirector()
 
 try_exit:
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "%s Completed shut down of redirector Extent count %08lX Request count %08lX Status %08lX\n",
-                                __FUNCTION__,
-                                pControlDevExt->Specific.Control.ExtentCount,
-                                pControlDevExt->Specific.Control.OutstandingServiceRequestCount,
-                                ntStatus);
+                      __FUNCTION__,
+                      pControlDevExt->Specific.Control.ExtentCount,
+                      pControlDevExt->Specific.Control.OutstandingServiceRequestCount,
+                      ntStatus));
     }
 
     return ntStatus;
@@ -1464,60 +1655,56 @@ AFSAcquireFcbForLazyWrite( IN PVOID Fcb,
 
     BOOLEAN bStatus = FALSE;
     AFSFcb *pFcb = (AFSFcb *)Fcb;
-    BOOLEAN bReleaseMain = FALSE, bReleasePaging = FALSE;
+    BOOLEAN bReleaseSectionObject = FALSE, bReleasePaging = FALSE;
 
     //
     // Try and acquire the Fcb resource
     //
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSAcquireFcbForLazyWrite Acquiring Fcb %08lX\n",
-                  Fcb);
-
-    ASSERT( NULL == pFcb->Specific.File.LazyWriterThread);
+                  "AFSAcquireFcbForLazyWrite Acquiring Fcb %p\n",
+                  Fcb));
 
-    pFcb->Specific.File.LazyWriterThread = PsGetCurrentThread();
+    //
+    // Try and grab the paging
+    //
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSAcquireFcbForLazyWrite Attempt to acquire Fcb lock %08lX SHARED %08lX\n",
-                  &pFcb->NPFcb->Resource,
-                  PsGetCurrentThread());
+                  "AFSAcquireFcbForLazyWrite Attempt to acquire Fcb PagingIo lock %p SHARED %08lX\n",
+                  &pFcb->NPFcb->PagingResource,
+                  PsGetCurrentThread()));
 
-    if( AFSAcquireShared( &pFcb->NPFcb->Resource,
+    if( AFSAcquireShared( &pFcb->NPFcb->PagingResource,
                           Wait))
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSAcquireFcbForLazyWrite Acquired Fcb lock %08lX SHARED %08lX\n",
-                      &pFcb->NPFcb->Resource,
-                      PsGetCurrentThread());
-
-        bReleaseMain = TRUE;
+                      "AFSAcquireFcbForLazyWrite Acquired Fcb PagingIo lock %p SHARED %08lX\n",
+                      &pFcb->NPFcb->PagingResource,
+                      PsGetCurrentThread()));
 
-        //
-        // Try and grab the paging
-        //
+        bReleasePaging = TRUE;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSAcquireFcbForLazyWrite Attempt to acquire Fcb PagingIo lock %08lX SHARED %08lX\n",
-                      &pFcb->NPFcb->PagingResource,
-                      PsGetCurrentThread());
+                      "AFSAcquireFcbForLazyWrite Attempt to acquire Fcb SectionObject lock %p SHARED %08lX\n",
+                      &pFcb->NPFcb->SectionObjectResource,
+                      PsGetCurrentThread()));
 
-        if( AFSAcquireShared( &pFcb->NPFcb->PagingResource,
+        if( AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource,
                               Wait))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSAcquireFcbForLazyWrite Acquired Fcb PagingIo lock %08lX SHARED %08lX\n",
-                          &pFcb->NPFcb->PagingResource,
-                          PsGetCurrentThread());
+                          "AFSAcquireFcbForLazyWrite Acquired Fcb SectionObject lock %p SHARED %08lX\n",
+                          &pFcb->NPFcb->SectionObjectResource,
+                          PsGetCurrentThread()));
 
-            bReleasePaging = TRUE;
+            bReleaseSectionObject = TRUE;
 
             //
             // All is well ...
@@ -1532,10 +1719,10 @@ AFSAcquireFcbForLazyWrite( IN PVOID Fcb,
     if( !bStatus)
     {
 
-        if( bReleaseMain)
+        if( bReleaseSectionObject)
         {
 
-            AFSReleaseResource( &pFcb->NPFcb->Resource);
+            AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
         }
 
         if( bReleasePaging)
@@ -1554,22 +1741,17 @@ AFSReleaseFcbFromLazyWrite( IN PVOID Fcb)
 
     AFSFcb *pFcb = (AFSFcb *)Fcb;
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSReleaseFcbFromLazyWrite Releasing Fcb %08lX\n",
-                  Fcb);
+                  "AFSReleaseFcbFromLazyWrite Releasing Fcb %p\n",
+                  Fcb));
 
     IoSetTopLevelIrp( NULL);
 
-    ASSERT( PsGetCurrentThread() == pFcb->Specific.File.LazyWriterThread);
-
-    pFcb->Specific.File.LazyWriterThread = NULL;
-
+    AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
     AFSReleaseResource( &pFcb->NPFcb->PagingResource);
 
-    AFSReleaseResource( &pFcb->NPFcb->Resource);
-
     return;
 }
 
@@ -1581,21 +1763,21 @@ AFSAcquireFcbForReadAhead( IN PVOID Fcb,
     BOOLEAN bStatus = FALSE;
     AFSFcb *pFcb = (AFSFcb *)Fcb;
 
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSAcquireFcbForReadAhead Attempt to acquire Fcb lock %08lX SHARED %08lX\n",
-                  &pFcb->NPFcb->Resource,
-                  PsGetCurrentThread());
+                  "AFSAcquireFcbForReadAhead Attempt to acquire Fcb SectionObject lock %p SHARED %08lX\n",
+                  &pFcb->NPFcb->SectionObjectResource,
+                  PsGetCurrentThread()));
 
-    if( AFSAcquireShared( &pFcb->NPFcb->Resource,
+    if( AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource,
                           Wait))
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSAcquireFcbForReadAhead Acquired Fcb lock %08lX SHARED %08lX\n",
-                      &pFcb->NPFcb->Resource,
-                      PsGetCurrentThread());
+                      "AFSAcquireFcbForReadAhead Acquired Fcb SectionObject lock %p SHARED %08lX\n",
+                      &pFcb->NPFcb->SectionObjectResource,
+                      PsGetCurrentThread()));
 
         bStatus = TRUE;
 
@@ -1613,7 +1795,7 @@ AFSReleaseFcbFromReadAhead( IN PVOID Fcb)
 
     IoSetTopLevelIrp( NULL);
 
-    AFSReleaseResource( &pFcb->NPFcb->Resource);
+    AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
     return;
 }
@@ -1647,9 +1829,9 @@ AFSGetCallerSID( OUT UNICODE_STRING *SIDString, OUT BOOLEAN *pbImpersonation)
             if( hToken == NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSGetCallerSID Failed to retrieve impersonation or primary token\n");
+                              "AFSGetCallerSID Failed to retrieve impersonation or primary token\n"));
 
                 try_return( ntStatus);
             }
@@ -1664,9 +1846,10 @@ AFSGetCallerSID( OUT UNICODE_STRING *SIDString, OUT BOOLEAN *pbImpersonation)
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSGetCallerSID Failed to retrieve information Status %08lX\n", ntStatus);
+                          "AFSGetCallerSID Failed to retrieve information Status %08lX\n",
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1682,19 +1865,20 @@ AFSGetCallerSID( OUT UNICODE_STRING *SIDString, OUT BOOLEAN *pbImpersonation)
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSGetCallerSID Failed to convert sid to string Status %08lX\n", ntStatus);
+                          "AFSGetCallerSID Failed to convert sid to string Status %08lX\n",
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
         *SIDString = uniSIDString;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_AUTHGROUP_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_AUTHGROUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSGetCallerSID Successfully retrieved SID %wZ\n",
-                      SIDString);
+                      SIDString));
 
         if ( bPrimaryToken == FALSE &&
              pbImpersonation)
@@ -1718,7 +1902,7 @@ try_exit:
 
         if( pTokenInfo != NULL)
         {
-            AFSExFreePool( pTokenInfo);
+            ExFreePool( pTokenInfo);    // Allocated by SeQueryInformationToken
         }
     }
 
@@ -1728,6 +1912,7 @@ try_exit:
 ULONG
 AFSGetSessionId( IN HANDLE ProcessId, OUT BOOLEAN *pbImpersonation)
 {
+    UNREFERENCED_PARAMETER(ProcessId);
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PACCESS_TOKEN hToken = NULL;
@@ -1753,9 +1938,9 @@ AFSGetSessionId( IN HANDLE ProcessId, OUT BOOLEAN *pbImpersonation)
             if( hToken == NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSGetSessionId Failed to retrieve impersonation or primary token\n");
+                              "AFSGetSessionId Failed to retrieve impersonation or primary token\n"));
 
                 try_return( ntStatus);
             }
@@ -1771,18 +1956,18 @@ AFSGetSessionId( IN HANDLE ProcessId, OUT BOOLEAN *pbImpersonation)
         {
             ulSessionId = (ULONG)-1;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSGetSessionId Failed to retrieve session id Status %08lX\n",
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_AUTHGROUP_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING | AFS_SUBSYSTEM_AUTHGROUP_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
                       "AFSGetSessionId found %08lX\n",
-                      ulSessionId);
+                      ulSessionId));
 
         if ( bPrimaryToken == FALSE &&
              pbImpersonation)
@@ -2047,4 +2232,58 @@ try_exit:
     return ntStatus;
 }
 
+NTSTATUS
+AFSSetReparsePointPolicy( IN AFSSetReparsePointPolicyCB *PolicyCB)
+{
+
+    NTSTATUS    ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt* pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+    ULONG       ulPolicy = 0;
+
+    __Enter
+    {
+
+       ulPolicy = (PolicyCB->Policy & AFS_REPARSE_POINT_VALID_POLICY_FLAGS);
+
+       if ( PolicyCB->Scope == AFS_REPARSE_POINT_POLICY_GLOBAL)
+       {
+
+           pDeviceExt->Specific.RDR.ReparsePointPolicy = ulPolicy;
+       }
+       else if ( PolicyCB->Scope == AFS_REPARSE_POINT_POLICY_AUTHGROUP)
+       {
+
+           ntStatus = STATUS_NOT_SUPPORTED;
+       }
+    }
+
+    return ntStatus;
+}
+
+
+NTSTATUS
+AFSGetReparsePointPolicy( OUT AFSGetReparsePointPolicyCB *PolicyCB)
+{
+
+    NTSTATUS    ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt* pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+
+    __Enter
+    {
+
+       PolicyCB->GlobalPolicy = pDeviceExt->Specific.RDR.ReparsePointPolicy;
 
+       //
+       // When per-AuthGroup or per-Process policies are permitted
+       // this function will need to query the policies when determining
+       // the active policy.
+       //
+
+       {
+
+           PolicyCB->ActivePolicy = PolicyCB->GlobalPolicy;
+       }
+    }
+
+    return ntStatus;
+}