Windows: Runtime RDR Trace Toggle
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSDevControl.cpp
index 276ca66..e330296 100644 (file)
@@ -74,6 +74,14 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSLibraryInitCB *pLibInitCB = (AFSLibraryInitCB *)Irp->AssociatedIrp.SystemBuffer;
 
+                if ( Irp->RequestorMode != KernelMode)
+                {
+
+                    ntStatus = STATUS_ACCESS_DENIED;
+
+                    break;
+                }
+
                 if( pIrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof( AFSLibraryInitCB))
                 {
 
@@ -87,10 +95,27 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
                 if( !NT_SUCCESS( ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSDevControl AFSInitializeLibrary failure %08lX\n",
-                                  ntStatus);
+                                  ntStatus));
+
+                    break;
+                }
+
+                //
+                // Initialize the worker pool.
+                //
+
+                ntStatus = AFSInitializeWorkerPool();
+
+                if( !NT_SUCCESS( ntStatus))
+                {
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+                                  AFS_TRACE_LEVEL_ERROR,
+                                  "AFSDevControl AFSInitializeWorkerPool failure %08lX\n",
+                                  ntStatus));
 
                     break;
                 }
@@ -104,10 +129,10 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
                 if( !NT_SUCCESS( ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSDevControl AFSInitializeGlobalDirectoryEntries failure %08lX\n",
-                                  ntStatus);
+                                  ntStatus));
 
                     break;
                 }
@@ -117,10 +142,10 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
                 if( !NT_SUCCESS( ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSDevControl AFSInitializeSpecialShareNameList failure %08lX\n",
-                                  ntStatus);
+                                  ntStatus));
 
                     break;
                 }
@@ -415,8 +440,34 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
                 break;
             }
 
+            case IOCTL_AFS_CONFIG_LIBRARY_TRACE:
+            {
+                AFSDebugTraceConfigCB *pConfigLib;
+
+                if ( pIrpSp->Parameters.DeviceIoControl.InputBufferLength != sizeof( AFSDebugTraceConfigCB))
+                {
+
+                    ntStatus = STATUS_INVALID_PARAMETER;
+
+                    break;
+                }
+
+                pConfigLib = (AFSDebugTraceConfigCB *)Irp->AssociatedIrp.SystemBuffer;
+
+                InterlockedCompareExchangePointer( (PVOID *)&AFSDebugTraceFnc,
+                                                   pConfigLib->AFSDbgLogMsg,
+                                                   (void *)pConfigLib->AFSDbgLogMsg);
+
+                break;
+            }
+
          default:
             {
+                //
+                // Note that this code path is never executed - default behavior is caught in the
+                // security checks in lib.  New Ioctl functions therefore have to be added here and
+                // in ..\fs\AFSCommSupport.cpp
+                //
 
                 ntStatus = STATUS_NOT_IMPLEMENTED;
 
@@ -432,10 +483,10 @@ AFSDevControl( IN PDEVICE_OBJECT LibDeviceObject,
 
         ntStatus = STATUS_UNSUCCESSFUL;
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
                       "EXCEPTION - AFSDevControl %08lX\n",
-                      ulIoControlCode);
+                      ulIoControlCode));
 
         AFSDumpTraceFilesFnc();
     }