2 * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3 * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * - Redistributions of source code must retain the above copyright notice,
11 * this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
14 * this list of conditions and the following disclaimer in the
16 * and/or other materials provided with the distribution.
17 * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18 * nor the names of their contributors may be used to endorse or promote
19 * products derived from this software without specific prior written
20 * permission from Kernel Drivers, LLC and Your File System, Inc.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 // File: AFSLibrarySupport.cpp
39 #include "AFSCommon.h"
42 AFSLoadLibrary( IN ULONG Flags,
43 IN UNICODE_STRING *ServicePath)
45 UNREFERENCED_PARAMETER(Flags);
47 NTSTATUS ntStatus = STATUS_SUCCESS;
48 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
49 UNICODE_STRING uniLibraryName;
50 AFSDeviceExt *pLibDevExt = NULL;
51 PFILE_OBJECT pLibraryFileObject = NULL;
52 PDEVICE_OBJECT pLibraryDeviceObject = NULL;
58 // Wait on the load library event so we don't race with any
59 // other requests coming through
62 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
63 AFS_TRACE_LEVEL_VERBOSE,
64 "%s Start load library\n",
67 ntStatus = KeWaitForSingleObject( &pDevExt->Specific.Control.LoadLibraryEvent,
73 if( !NT_SUCCESS( ntStatus))
76 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
77 AFS_TRACE_LEVEL_ERROR,
78 "AFSLoadLibrary Wait for LoadLibraryEvent failure %08lX\n",
81 try_return( ntStatus);
85 // Check our current state to ensure we currently do not have a library loaded
88 if( BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED))
91 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
92 AFS_TRACE_LEVEL_VERBOSE,
93 "%s Library already loaded\n",
96 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
99 pDevExt->Specific.Control.LibraryServicePath.Buffer = (WCHAR *)AFSExAllocatePoolWithTag( PagedPool,
101 AFS_GENERIC_MEMORY_25_TAG);
103 if( pDevExt->Specific.Control.LibraryServicePath.Buffer == NULL)
106 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
107 AFS_TRACE_LEVEL_ERROR,
108 "AFSLoadLibrary AFS_GENERIC_MEMORY_25_TAG allocation error\n"));
110 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
113 RtlZeroMemory( pDevExt->Specific.Control.LibraryServicePath.Buffer,
114 ServicePath->Length);
116 pDevExt->Specific.Control.LibraryServicePath.Length = ServicePath->Length;
117 pDevExt->Specific.Control.LibraryServicePath.MaximumLength = pDevExt->Specific.Control.LibraryServicePath.Length;
119 RtlCopyMemory( pDevExt->Specific.Control.LibraryServicePath.Buffer,
121 pDevExt->Specific.Control.LibraryServicePath.Length);
127 ntStatus = ZwLoadDriver( ServicePath);
129 if( !NT_SUCCESS( ntStatus))
132 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
133 AFS_TRACE_LEVEL_ERROR,
134 "%s Failed to load library Status %08lX\n",
138 try_return( ntStatus);
142 // Open up the control device and grab teh entry points for the library
145 RtlInitUnicodeString( &uniLibraryName,
146 AFS_LIBRARY_CONTROL_DEVICE_NAME);
148 ntStatus = IoGetDeviceObjectPointer( &uniLibraryName,
151 &pLibraryDeviceObject);
153 if( !NT_SUCCESS( ntStatus))
155 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
156 AFS_TRACE_LEVEL_ERROR,
157 "AFSLoadLibrary IoGetDeviceObjectPointer failure %08lX\n",
160 try_return( ntStatus);
164 // We have our reference to the library device object. Grab the
165 // device extension and setup our callbacks
168 pLibDevExt = (AFSDeviceExt *)pLibraryDeviceObject->DeviceExtension;
171 // Save off our references
174 pDevExt->Specific.Control.LibraryFileObject = pLibraryFileObject;
176 pDevExt->Specific.Control.LibraryDeviceObject = pLibraryDeviceObject;
179 // Reset the state for our library
182 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryStateLock,
185 SetFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED);
187 ClearFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_QUEUE_CANCELLED);
189 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
190 AFS_TRACE_LEVEL_VERBOSE,
191 "%s Completed load library, processing queued requests\n",
194 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
197 // Process the queued requests
200 AFSProcessQueuedResults( FALSE);
204 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
205 AFS_TRACE_LEVEL_VERBOSE,
206 "%s Library load complete Status %08lX\n",
210 if( !NT_SUCCESS( ntStatus))
213 if( pDevExt->Specific.Control.LibraryServicePath.Buffer != NULL)
216 ZwUnloadDriver( &pDevExt->Specific.Control.LibraryServicePath);
218 ExFreePool( pDevExt->Specific.Control.LibraryServicePath.Buffer);
220 pDevExt->Specific.Control.LibraryServicePath.Buffer = NULL;
221 pDevExt->Specific.Control.LibraryServicePath.Length = 0;
222 pDevExt->Specific.Control.LibraryServicePath.MaximumLength = 0;
226 KeSetEvent( &pDevExt->Specific.Control.LoadLibraryEvent,
235 AFSUnloadLibrary( IN BOOLEAN CancelQueue)
238 NTSTATUS ntStatus = STATUS_SUCCESS;
239 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
240 LARGE_INTEGER liTimeout;
246 // Wait on the load library event so we don't race with any
247 // other requests coming through
250 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
251 AFS_TRACE_LEVEL_VERBOSE,
252 "%s Start unload library\n",
255 ntStatus = KeWaitForSingleObject( &pDevExt->Specific.Control.LoadLibraryEvent,
261 if( !NT_SUCCESS( ntStatus))
263 try_return( ntStatus);
266 if( !BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED))
268 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
272 // Clear all outstanding requests
275 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryStateLock,
278 ClearFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED);
282 SetFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_QUEUE_CANCELLED);
286 // We'll wait on the inflight event to be set, checking for the inflight
287 // request count to reach zero
290 while( pDevExt->Specific.Control.InflightLibraryRequests > 0)
293 liTimeout.QuadPart = -(AFS_ONE_SECOND);
296 // If the count is non-zero make sure the event is cleared
299 KeClearEvent( &pDevExt->Specific.Control.InflightLibraryEvent);
301 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
303 ntStatus = KeWaitForSingleObject( &pDevExt->Specific.Control.InflightLibraryEvent,
309 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryStateLock,
312 if( ntStatus != STATUS_TIMEOUT &&
313 ntStatus != STATUS_SUCCESS)
316 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
317 AFS_TRACE_LEVEL_VERBOSE,
318 "%s Failed request event Status %08lX\n",
322 SetFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED);
324 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
326 AFSProcessQueuedResults( TRUE);
328 try_return( ntStatus);
331 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
332 AFS_TRACE_LEVEL_VERBOSE,
333 "%s Wait for inflight requests to complete %08lX\n",
335 pDevExt->Specific.Control.InflightLibraryRequests));
338 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
340 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
341 AFS_TRACE_LEVEL_VERBOSE,
342 "%s Processing queued results\n",
345 AFSProcessQueuedResults( TRUE);
348 // Unload the current library implementation
351 if( pDevExt->Specific.Control.LibraryFileObject != NULL)
353 ObDereferenceObject( pDevExt->Specific.Control.LibraryFileObject);
356 pDevExt->Specific.Control.LibraryFileObject = NULL;
358 pDevExt->Specific.Control.LibraryDeviceObject = NULL;
360 ZwUnloadDriver( &pDevExt->Specific.Control.LibraryServicePath);
362 ExFreePool( pDevExt->Specific.Control.LibraryServicePath.Buffer);
364 pDevExt->Specific.Control.LibraryServicePath.Length = 0;
366 pDevExt->Specific.Control.LibraryServicePath.MaximumLength = 0;
368 pDevExt->Specific.Control.LibraryServicePath.Buffer = NULL;
372 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
373 AFS_TRACE_LEVEL_VERBOSE,
374 "%s Library unload complete Status %08lX\n",
378 KeSetEvent( &pDevExt->Specific.Control.LoadLibraryEvent,
387 AFSCheckLibraryState( IN PIRP Irp)
390 NTSTATUS ntStatus = STATUS_SUCCESS;
391 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
392 AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
393 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
398 AFSAcquireShared( &pDevExt->Specific.Control.LibraryStateLock,
401 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
402 AFS_TRACE_LEVEL_VERBOSE,
403 "%s Entry State %08lX Irp %p Function %08lX\n",
405 pRDRDevExt->DeviceFlags,
407 pIrpSp->MajorFunction));
409 if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
412 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
415 if( !BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED))
421 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
422 AFS_TRACE_LEVEL_VERBOSE,
423 "%s Queuing request %p\n",
427 ntStatus = AFSQueueLibraryRequest( Irp);
429 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
430 AFS_TRACE_LEVEL_VERBOSE,
431 "%s Queued request %p Status %08lX\n",
439 ntStatus = STATUS_TOO_LATE;
441 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
442 AFS_TRACE_LEVEL_VERBOSE,
443 "%s Failing request %p\n",
448 try_return( ntStatus);
451 if( InterlockedIncrement( &pDevExt->Specific.Control.InflightLibraryRequests) == 1)
453 KeClearEvent( &pDevExt->Specific.Control.InflightLibraryEvent);
458 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
459 AFS_TRACE_LEVEL_VERBOSE,
460 "%s Completed Irp %p Status %08lX Inflight Count %08lX\n",
464 pDevExt->Specific.Control.InflightLibraryRequests));
466 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
473 AFSClearLibraryRequest()
476 NTSTATUS ntStatus = STATUS_SUCCESS;
477 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
481 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
482 AFS_TRACE_LEVEL_VERBOSE,
483 "%s Inflight Count %08lX\n",
485 pDevExt->Specific.Control.InflightLibraryRequests));
487 if( InterlockedDecrement( &pDevExt->Specific.Control.InflightLibraryRequests) == 0)
490 KeSetEvent( &pDevExt->Specific.Control.InflightLibraryEvent,
501 AFSQueueLibraryRequest( IN PIRP Irp)
504 NTSTATUS ntStatus = STATUS_SUCCESS;
505 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
506 AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
507 AFSLibraryQueueRequestCB *pRequest = NULL;
508 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
513 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryQueueLock,
516 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
517 AFS_TRACE_LEVEL_VERBOSE,
518 "%s Entry for Irp %p Function %08lX\n",
521 pIrpSp->MajorFunction));
524 // Has the load processing timed out and we are no longer
528 if( BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_QUEUE_CANCELLED) ||
529 BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
532 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
533 AFS_TRACE_LEVEL_ERROR,
534 "%s Library not loaded for Irp %p\n",
538 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
541 pRequest = (AFSLibraryQueueRequestCB *)AFSExAllocatePoolWithTag( PagedPool,
542 sizeof( AFSLibraryQueueRequestCB),
543 AFS_LIBRARY_QUEUE_TAG);
545 if( pRequest == NULL)
547 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
550 RtlZeroMemory( pRequest,
551 sizeof( AFSLibraryQueueRequestCB));
555 if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
557 pDevExt->Specific.Control.LibraryQueueHead = pRequest;
561 pDevExt->Specific.Control.LibraryQueueTail->fLink = pRequest;
564 pDevExt->Specific.Control.LibraryQueueTail = pRequest;
566 IoMarkIrpPending( Irp);
568 ntStatus = STATUS_PENDING;
572 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
573 AFS_TRACE_LEVEL_VERBOSE,
574 "%s Completed for Irp %p Status %08lX\n",
579 AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
586 AFSProcessQueuedResults( IN BOOLEAN CancelRequest)
589 NTSTATUS ntStatus = STATUS_SUCCESS;
590 AFSLibraryQueueRequestCB *pRequest = NULL;
591 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
596 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
597 AFS_TRACE_LEVEL_VERBOSE,
602 // Loop through the queue either resubmitting requests or cancelling them
608 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryQueueLock,
611 if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
614 AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
619 pRequest = pDevExt->Specific.Control.LibraryQueueHead;
621 pDevExt->Specific.Control.LibraryQueueHead = pRequest->fLink;
623 if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
626 pDevExt->Specific.Control.LibraryQueueTail = NULL;
629 AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
634 pRequest->Irp->IoStatus.Status = STATUS_CANCELLED;
636 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
637 AFS_TRACE_LEVEL_VERBOSE,
638 "%s Cancelling request Irp %p\n",
642 IoCompleteRequest( pRequest->Irp,
648 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
649 AFS_TRACE_LEVEL_VERBOSE,
650 "%s Resubmitting request Irp %p\n",
654 AFSSubmitLibraryRequest( pRequest->Irp);
657 ExFreePool( pRequest);
660 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
661 AFS_TRACE_LEVEL_VERBOSE,
670 AFSSubmitLibraryRequest( IN PIRP Irp)
673 NTSTATUS ntStatus = STATUS_SUCCESS;
674 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
679 AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY,
680 AFS_TRACE_LEVEL_VERBOSE,
681 "%s Submitting Irp %p Function %08lX\n",
684 pIrpSp->MajorFunction));
686 switch( pIrpSp->MajorFunction)
691 AFSCreate( AFSRDRDeviceObject,
698 AFSClose( AFSRDRDeviceObject,
705 AFSRead( AFSRDRDeviceObject,
712 AFSWrite( AFSRDRDeviceObject,
717 case IRP_MJ_QUERY_INFORMATION:
719 AFSQueryFileInfo( AFSRDRDeviceObject,
724 case IRP_MJ_SET_INFORMATION:
726 AFSSetFileInfo( AFSRDRDeviceObject,
731 case IRP_MJ_QUERY_EA:
733 AFSQueryEA( AFSRDRDeviceObject,
740 AFSSetEA( AFSRDRDeviceObject,
745 case IRP_MJ_FLUSH_BUFFERS:
747 AFSFlushBuffers( AFSRDRDeviceObject,
752 case IRP_MJ_QUERY_VOLUME_INFORMATION:
754 AFSQueryVolumeInfo( AFSRDRDeviceObject,
759 case IRP_MJ_SET_VOLUME_INFORMATION:
761 AFSSetVolumeInfo( AFSRDRDeviceObject,
766 case IRP_MJ_DIRECTORY_CONTROL:
768 AFSDirControl( AFSRDRDeviceObject,
773 case IRP_MJ_FILE_SYSTEM_CONTROL:
775 AFSFSControl( AFSRDRDeviceObject,
780 case IRP_MJ_DEVICE_CONTROL:
782 AFSDevControl( AFSRDRDeviceObject,
787 case IRP_MJ_INTERNAL_DEVICE_CONTROL:
789 AFSInternalDevControl( AFSRDRDeviceObject,
794 case IRP_MJ_SHUTDOWN:
796 AFSShutdown( AFSRDRDeviceObject,
801 case IRP_MJ_LOCK_CONTROL:
803 AFSLockControl( AFSRDRDeviceObject,
810 AFSCleanup( AFSRDRDeviceObject,
815 case IRP_MJ_QUERY_SECURITY:
817 AFSQuerySecurity( AFSRDRDeviceObject,
822 case IRP_MJ_SET_SECURITY:
824 AFSSetSecurity( AFSRDRDeviceObject,
829 case IRP_MJ_SYSTEM_CONTROL:
831 AFSSystemControl( AFSRDRDeviceObject,
838 AFSDefaultDispatch( AFSRDRDeviceObject,
849 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
850 IN BOOLEAN QueueRootEnumeration)
852 UNREFERENCED_PARAMETER(QueueRootEnumeration);
854 NTSTATUS ntStatus = STATUS_SUCCESS;
855 AFSLibraryInitCB stInitLib;
856 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
857 AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
862 RtlZeroMemory( &stInitLib,
863 sizeof( AFSLibraryInitCB));
866 // Initialize the parameters to pass to the library
869 stInitLib.AFSControlDeviceObject = AFSDeviceObject;
871 stInitLib.AFSRDRDeviceObject = AFSRDRDeviceObject;
873 stInitLib.AFSServerName = AFSServerName;
875 stInitLib.AFSMountRootName = AFSMountRootName;
877 stInitLib.AFSDebugFlags = AFSDebugFlags;
879 if( GlobalRootFid != NULL)
881 stInitLib.GlobalRootFid = *GlobalRootFid;
884 stInitLib.AFSCacheManagerCallbacks = &AFSCacheManagerCallbacks;
886 stInitLib.AFSCacheBaseAddress = pRDRDevExt->Specific.RDR.CacheBaseAddress;
888 stInitLib.AFSCacheLength = pRDRDevExt->Specific.RDR.CacheLength;
891 // Initialize the callback functions for the library
894 stInitLib.AFSProcessRequest = AFSProcessRequest;
896 stInitLib.AFSDbgLogMsg = AFSDbgLogMsg;
898 stInitLib.AFSAddConnectionEx = AFSAddConnectionEx;
900 stInitLib.AFSExAllocatePoolWithTag = AFSExAllocatePoolWithTag;
902 stInitLib.AFSExFreePoolWithTag = AFSExFreePoolWithTag;
904 stInitLib.AFSDumpTraceFiles = AFSDumpTraceFiles;
906 stInitLib.AFSRetrieveAuthGroup = AFSRetrieveAuthGroup;
908 ntStatus = AFSSendDeviceIoControl( pDevExt->Specific.Control.LibraryDeviceObject,
909 IOCTL_AFS_INITIALIZE_LIBRARY_DEVICE,
911 sizeof( AFSLibraryInitCB),
916 if ( !NT_SUCCESS( ntStatus))
919 AFSDbgTrace(( AFS_SUBSYSTEM_INIT_PROCESSING,
920 AFS_TRACE_LEVEL_ERROR,
921 "AFSInitializeLibrary AFSSendDeviceIoControl failure %08lX\n",
930 AFSConfigLibraryDebug()
933 NTSTATUS ntStatus = STATUS_SUCCESS;
934 AFSDebugTraceConfigCB stConfigLib;
935 AFSDeviceExt *pDevExt;
940 if ( AFSDeviceObject != NULL &&
941 AFSDeviceObject->DeviceExtension != NULL)
944 pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
946 if ( pDevExt->Specific.Control.LibraryDeviceObject != NULL)
948 RtlZeroMemory( &stConfigLib,
949 sizeof( AFSDebugTraceConfigCB));
951 stConfigLib.AFSDbgLogMsg = AFSDebugTraceFnc;
953 ntStatus = AFSSendDeviceIoControl( pDevExt->Specific.Control.LibraryDeviceObject,
954 IOCTL_AFS_CONFIG_LIBRARY_TRACE,
956 sizeof( AFSDebugTraceConfigCB),
961 if ( !NT_SUCCESS( ntStatus))
964 AFSDbgTrace(( AFS_SUBSYSTEM_INIT_PROCESSING,
965 AFS_TRACE_LEVEL_ERROR,
966 "AFSInitializeLibrary AFSSendDeviceIoControl failure %08lX\n",