NTSTATUS AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS ntStatus = STATUS_SUCCESS; FILE_OBJECT *pFileObject = NULL; IO_STACK_LOCATION *pIrpSp; AFSDeviceExt *pDeviceExt = NULL; AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension; GUID *pAuthGroup = NULL; UNICODE_STRING uniGUIDString; __Enter { pIrpSp = IoGetCurrentIrpStackLocation( Irp); pDeviceExt = (AFSDeviceExt *)DeviceObject->DeviceExtension; pFileObject = pIrpSp->FileObject; uniGUIDString.Buffer = NULL; uniGUIDString.Length = 0; uniGUIDString.MaximumLength = 0; // // Validate the process entry // pAuthGroup = AFSValidateProcessEntry(); if( pAuthGroup != NULL) { RtlStringFromGUID( *pAuthGroup, &uniGUIDString); AFSDbgLogMsg( AFS_SUBSYSTEM_AUTHGROUP_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "%s (%08lX) Located AuthGroup %wZ after validation\n", __FUNCTION__, Irp, &uniGUIDString); } else { AFSDbgLogMsg( AFS_SUBSYSTEM_AUTHGROUP_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "%s (%08lX) Failed to locate AuthGroup\n", __FUNCTION__, Irp); } // // Root open? // if( pFileObject == NULL || pFileObject->FileName.Buffer == NULL) { AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSCommonCreate (%08lX) Processing volume open request\n", Irp); ntStatus = AFSOpenRedirector( Irp); AFSCompleteRequest( Irp, ntStatus); try_return( ntStatus); } // // Check the state of the library // ntStatus = AFSCheckLibraryState( Irp); if( !NT_SUCCESS( ntStatus) || ntStatus == STATUS_PENDING) { if( ntStatus != STATUS_PENDING) { AFSCompleteRequest( Irp, ntStatus); } try_return( ntStatus); } IoSkipCurrentIrpStackLocation( Irp); ntStatus = IoCallDriver( pControlDevExt->Specific.Control.LibraryDeviceObject, Irp); // // Indicate the library is done with the request // AFSClearLibraryRequest(); try_exit: if ( pFileObject) { AFSDbgLogMsg( AFS_SUBSYSTEM_AUTHGROUP_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "%s (%08lX) File \"%wZ\" AuthGroup '%wZ' ntStatus %08lX\n", __FUNCTION__, Irp, &pFileObject->FileName, &uniGUIDString, ntStatus); } if( uniGUIDString.Buffer != NULL) { RtlFreeUnicodeString( &uniGUIDString); } } return ntStatus; }
void AFSProcessCreate( IN HANDLE ParentId, IN HANDLE ProcessId, IN HANDLE CreatingProcessId, IN HANDLE CreatingThreadId) { AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension; AFSProcessCB *pProcessCB = NULL; __Enter { AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSProcessCreate Acquiring Control ProcessTree.TreeLock lock %p EXCL %08lX\n", pDeviceExt->Specific.Control.ProcessTree.TreeLock, PsGetCurrentThread())); AFSAcquireExcl( pDeviceExt->Specific.Control.ProcessTree.TreeLock, TRUE); AFSDbgTrace(( AFS_SUBSYSTEM_PROCESS_PROCESSING, AFS_TRACE_LEVEL_VERBOSE, "AFSProcessCreate Parent %08lX Process %08lX %08lX\n", ParentId, ProcessId, PsGetCurrentThread())); pProcessCB = AFSInitializeProcessCB( (ULONGLONG)ParentId, (ULONGLONG)ProcessId); if( pProcessCB != NULL) { pProcessCB->CreatingProcessId = (ULONGLONG)CreatingProcessId; pProcessCB->CreatingThreadId = (ULONGLONG)CreatingThreadId; // // Now assign the AuthGroup ACE // AFSValidateProcessEntry( ProcessId, TRUE); } else { AFSDbgTrace(( AFS_SUBSYSTEM_PROCESS_PROCESSING, AFS_TRACE_LEVEL_ERROR, "AFSProcessCreate Initialization failure for Parent %08lX Process %08lX %08lX\n", ParentId, ProcessId, PsGetCurrentThread())); } AFSReleaseResource( pDeviceExt->Specific.Control.ProcessTree.TreeLock); } return; }