/*
- * 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;
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");
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);
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);
// Let's limit things a bit ...
//
- if( AFSDbgBufferLength > 10240)
+ if( AFSDbgBufferLength > AFS_DBG_LOG_MAXLENGTH)
{
- AFSDbgBufferLength = 1024;
+ AFSDbgBufferLength = AFS_DBG_LOG_MAXLENGTH;
}
}
else
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING paramPath, uniParamKey;
HANDLE hParameters = 0;
- ULONG ulDisposition = 0;
OBJECT_ATTRIBUTES stObjectAttributes;
__Enter
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
- AFSProcessCB *pProcessCB = NULL;
__Enter
{
//
KeInitializeEvent( &pDeviceExt->Specific.Control.CommServiceCB.IrpPoolHasEntries,
- NotificationEvent,
+ SynchronizationEvent,
FALSE);
KeInitializeEvent( &pDeviceExt->Specific.Control.CommServiceCB.IrpPoolHasReleaseEntries,
- NotificationEvent,
+ SynchronizationEvent,
FALSE);
KeInitializeEvent( &pDeviceExt->Specific.Control.ExtentReleaseEvent,
NotificationEvent,
TRUE);
+ pDeviceExt->Specific.Control.WaitingForMemoryCount = 0;
+
+ KeInitializeEvent( &pDeviceExt->Specific.Control.MemoryAvailableEvent,
+ NotificationEvent,
+ TRUE);
+
ExInitializeResourceLite( &pDeviceExt->Specific.Control.LibraryQueueLock);
pDeviceExt->Specific.Control.LibraryQueueHead = NULL;
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;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
- AFSProcessCB *pProcessCB = NULL;
__Enter
{
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- ULONG Default = 0;
UNICODE_STRING paramPath;
RTL_QUERY_REGISTRY_TABLE paramTable[2];
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;
}
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( ¶mPath.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;
// 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);
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);
IN ULONG OutputBufferLength,
OUT ULONG *ResultLength)
{
+ UNREFERENCED_PARAMETER(OutputBuffer);
+ UNREFERENCED_PARAMETER(OutputBufferLength);
NTSTATUS ntStatus = STATUS_SUCCESS;
PIRP pIrp = NULL;
// 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,
IN PIRP Irp,
IN PVOID Context)
{
+ UNREFERENCED_PARAMETER(DeviceObject);
+ UNREFERENCED_PARAMETER(Irp);
KEVENT *pEvent = (KEVENT *)Context;
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);
}
}
}
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;
}
__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);
+ pControlDevExt->Specific.Control.OutstandingServiceRequestCount));
//
// Set the shutdown flag so the worker is more agressive in tearing down extents
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);
+ pControlDevExt->Specific.Control.OutstandingServiceRequestCount));
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
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);
+ pControlDevExt->Specific.Control.ExtentCount));
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
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);
+ ntStatus));
}
return ntStatus;
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 ...
if( !bStatus)
{
- if( bReleaseMain)
+ if( bReleaseSectionObject)
{
- AFSReleaseResource( &pFcb->NPFcb->Resource);
+ AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
}
if( bReleasePaging)
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;
}
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;
IoSetTopLevelIrp( NULL);
- AFSReleaseResource( &pFcb->NPFcb->Resource);
+ AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
return;
}
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);
}
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);
}
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)
if( pTokenInfo != NULL)
{
- AFSExFreePool( pTokenInfo);
+ ExFreePool( pTokenInfo); // Allocated by SeQueryInformationToken
}
}
ULONG
AFSGetSessionId( IN HANDLE ProcessId, OUT BOOLEAN *pbImpersonation)
{
+ UNREFERENCED_PARAMETER(ProcessId);
NTSTATUS ntStatus = STATUS_SUCCESS;
PACCESS_TOKEN hToken = NULL;
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);
}
{
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)
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;
+}