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)
46 NTSTATUS ntStatus = STATUS_SUCCESS;
47 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
48 UNICODE_STRING uniLibraryName;
49 AFSDeviceExt *pLibDevExt = NULL;
50 PFILE_OBJECT pLibraryFileObject = NULL;
51 PDEVICE_OBJECT pLibraryDeviceObject = NULL;
57 // Wait on the load library event so we don't race with any
58 // other requests coming through
61 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
62 AFS_TRACE_LEVEL_VERBOSE,
63 "%s Start load library\n",
66 ntStatus = KeWaitForSingleObject( &pDevExt->Specific.Control.LoadLibraryEvent,
72 if( !NT_SUCCESS( ntStatus))
75 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
76 AFS_TRACE_LEVEL_ERROR,
77 "AFSLoadLibrary Wait for LoadLibraryEvent failure %08lX\n",
80 try_return( ntStatus);
84 // Check our current state to ensure we currently do not have a library loaded
87 if( BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED))
90 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
91 AFS_TRACE_LEVEL_VERBOSE,
92 "%s Library already loaded\n",
95 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
98 pDevExt->Specific.Control.LibraryServicePath.Buffer = (WCHAR *)AFSExAllocatePoolWithTag( PagedPool,
100 AFS_GENERIC_MEMORY_25_TAG);
102 if( pDevExt->Specific.Control.LibraryServicePath.Buffer == NULL)
105 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
106 AFS_TRACE_LEVEL_ERROR,
107 "AFSLoadLibrary AFS_GENERIC_MEMORY_25_TAG allocation error\n");
109 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
112 RtlZeroMemory( pDevExt->Specific.Control.LibraryServicePath.Buffer,
113 ServicePath->Length);
115 pDevExt->Specific.Control.LibraryServicePath.Length = ServicePath->Length;
116 pDevExt->Specific.Control.LibraryServicePath.MaximumLength = pDevExt->Specific.Control.LibraryServicePath.Length;
118 RtlCopyMemory( pDevExt->Specific.Control.LibraryServicePath.Buffer,
120 pDevExt->Specific.Control.LibraryServicePath.Length);
126 ntStatus = ZwLoadDriver( ServicePath);
128 if( !NT_SUCCESS( ntStatus))
131 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
132 AFS_TRACE_LEVEL_ERROR,
133 "%s Failed to load library Status %08lX\n",
137 try_return( ntStatus);
141 // Open up the control device and grab teh entry points for the library
144 RtlInitUnicodeString( &uniLibraryName,
145 AFS_LIBRARY_CONTROL_DEVICE_NAME);
147 ntStatus = IoGetDeviceObjectPointer( &uniLibraryName,
150 &pLibraryDeviceObject);
152 if( !NT_SUCCESS( ntStatus))
154 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
155 AFS_TRACE_LEVEL_ERROR,
156 "AFSLoadLibrary IoGetDeviceObjectPointer failure %08lX\n",
159 try_return( ntStatus);
163 // We have our reference to the library device object. Grab the
164 // device extension and setup our callbacks
167 pLibDevExt = (AFSDeviceExt *)pLibraryDeviceObject->DeviceExtension;
170 // Save off our references
173 pDevExt->Specific.Control.LibraryFileObject = pLibraryFileObject;
175 pDevExt->Specific.Control.LibraryDeviceObject = pLibraryDeviceObject;
178 // Reset the state for our library
181 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryStateLock,
184 SetFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED);
186 ClearFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_QUEUE_CANCELLED);
188 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
189 AFS_TRACE_LEVEL_VERBOSE,
190 "%s Completed load library, processing queued requests\n",
193 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
196 // Process the queued requests
199 AFSProcessQueuedResults( FALSE);
203 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
204 AFS_TRACE_LEVEL_VERBOSE,
205 "%s Library load complete Status %08lX\n",
209 if( !NT_SUCCESS( ntStatus))
212 if( pDevExt->Specific.Control.LibraryServicePath.Buffer != NULL)
215 ZwUnloadDriver( &pDevExt->Specific.Control.LibraryServicePath);
217 ExFreePool( pDevExt->Specific.Control.LibraryServicePath.Buffer);
219 pDevExt->Specific.Control.LibraryServicePath.Buffer = NULL;
220 pDevExt->Specific.Control.LibraryServicePath.Length = 0;
221 pDevExt->Specific.Control.LibraryServicePath.MaximumLength = 0;
225 KeSetEvent( &pDevExt->Specific.Control.LoadLibraryEvent,
234 AFSUnloadLibrary( IN BOOLEAN CancelQueue)
237 NTSTATUS ntStatus = STATUS_SUCCESS;
238 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
239 LARGE_INTEGER liTimeout;
245 // Wait on the load library event so we don't race with any
246 // other requests coming through
249 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
250 AFS_TRACE_LEVEL_VERBOSE,
251 "%s Start unload library\n",
254 ntStatus = KeWaitForSingleObject( &pDevExt->Specific.Control.LoadLibraryEvent,
260 if( !NT_SUCCESS( ntStatus))
262 try_return( ntStatus);
265 if( !BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED))
267 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
271 // Clear all outstanding requests
274 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryStateLock,
277 ClearFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED);
281 SetFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_QUEUE_CANCELLED);
285 // We'll wait on the inflight event to be set, checking for the inflight
286 // request count to reach zero
289 while( pDevExt->Specific.Control.InflightLibraryRequests > 0)
292 liTimeout.QuadPart = -(AFS_ONE_SECOND);
295 // If the count is non-zero make sure the event is cleared
298 KeClearEvent( &pDevExt->Specific.Control.InflightLibraryEvent);
300 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
302 ntStatus = KeWaitForSingleObject( &pDevExt->Specific.Control.InflightLibraryEvent,
308 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryStateLock,
311 if( ntStatus != STATUS_TIMEOUT &&
312 ntStatus != STATUS_SUCCESS)
315 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
316 AFS_TRACE_LEVEL_VERBOSE,
317 "%s Failed request event Status %08lX\n",
321 SetFlag( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED);
323 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
325 AFSProcessQueuedResults( TRUE);
327 try_return( ntStatus);
330 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
331 AFS_TRACE_LEVEL_VERBOSE,
332 "%s Wait for inflight requests to complete %08lX\n",
334 pDevExt->Specific.Control.InflightLibraryRequests);
337 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
339 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
340 AFS_TRACE_LEVEL_VERBOSE,
341 "%s Processing queued results\n",
344 AFSProcessQueuedResults( TRUE);
347 // Unload the current library implementation
350 if( pDevExt->Specific.Control.LibraryFileObject != NULL)
352 ObDereferenceObject( pDevExt->Specific.Control.LibraryFileObject);
355 pDevExt->Specific.Control.LibraryFileObject = NULL;
357 pDevExt->Specific.Control.LibraryDeviceObject = NULL;
359 ZwUnloadDriver( &pDevExt->Specific.Control.LibraryServicePath);
361 ExFreePool( pDevExt->Specific.Control.LibraryServicePath.Buffer);
363 pDevExt->Specific.Control.LibraryServicePath.Length = 0;
365 pDevExt->Specific.Control.LibraryServicePath.MaximumLength = 0;
367 pDevExt->Specific.Control.LibraryServicePath.Buffer = NULL;
371 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
372 AFS_TRACE_LEVEL_VERBOSE,
373 "%s Library unload complete Status %08lX\n",
377 KeSetEvent( &pDevExt->Specific.Control.LoadLibraryEvent,
386 AFSCheckLibraryState( IN PIRP Irp)
389 NTSTATUS ntStatus = STATUS_SUCCESS;
390 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
391 AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
392 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
397 AFSAcquireShared( &pDevExt->Specific.Control.LibraryStateLock,
400 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
401 AFS_TRACE_LEVEL_VERBOSE,
402 "%s Entry State %08lX Irp %p Function %08lX\n",
404 pRDRDevExt->DeviceFlags,
406 pIrpSp->MajorFunction);
408 if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
411 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
414 if( !BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_LOADED))
420 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
421 AFS_TRACE_LEVEL_VERBOSE,
422 "%s Queuing request %p\n",
426 ntStatus = AFSQueueLibraryRequest( Irp);
428 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
429 AFS_TRACE_LEVEL_VERBOSE,
430 "%s Queued request %p Status %08lX\n",
438 ntStatus = STATUS_TOO_LATE;
440 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
441 AFS_TRACE_LEVEL_VERBOSE,
442 "%s Failing request %p\n",
447 try_return( ntStatus);
450 if( InterlockedIncrement( &pDevExt->Specific.Control.InflightLibraryRequests) == 1)
452 KeClearEvent( &pDevExt->Specific.Control.InflightLibraryEvent);
457 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
458 AFS_TRACE_LEVEL_VERBOSE,
459 "%s Completed Irp %p Status %08lX Inflight Count %08lX\n",
463 pDevExt->Specific.Control.InflightLibraryRequests);
465 AFSReleaseResource( &pDevExt->Specific.Control.LibraryStateLock);
472 AFSClearLibraryRequest()
475 NTSTATUS ntStatus = STATUS_SUCCESS;
476 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
480 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
481 AFS_TRACE_LEVEL_VERBOSE,
482 "%s Inflight Count %08lX\n",
484 pDevExt->Specific.Control.InflightLibraryRequests);
486 if( InterlockedDecrement( &pDevExt->Specific.Control.InflightLibraryRequests) == 0)
489 KeSetEvent( &pDevExt->Specific.Control.InflightLibraryEvent,
500 AFSQueueLibraryRequest( IN PIRP Irp)
503 NTSTATUS ntStatus = STATUS_SUCCESS;
504 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
505 AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
506 AFSLibraryQueueRequestCB *pRequest = NULL;
507 PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
512 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryQueueLock,
515 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
516 AFS_TRACE_LEVEL_VERBOSE,
517 "%s Entry for Irp %p Function %08lX\n",
520 pIrpSp->MajorFunction);
523 // Has the load processing timed out and we are no longer
527 if( BooleanFlagOn( pDevExt->Specific.Control.LibraryState, AFS_LIBRARY_QUEUE_CANCELLED) ||
528 BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
531 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
532 AFS_TRACE_LEVEL_ERROR,
533 "%s Library not loaded for Irp %p\n",
537 try_return( ntStatus = STATUS_DEVICE_NOT_READY);
540 pRequest = (AFSLibraryQueueRequestCB *)AFSExAllocatePoolWithTag( PagedPool,
541 sizeof( AFSLibraryQueueRequestCB),
542 AFS_LIBRARY_QUEUE_TAG);
544 if( pRequest == NULL)
546 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
549 RtlZeroMemory( pRequest,
550 sizeof( AFSLibraryQueueRequestCB));
554 if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
556 pDevExt->Specific.Control.LibraryQueueHead = pRequest;
560 pDevExt->Specific.Control.LibraryQueueTail->fLink = pRequest;
563 pDevExt->Specific.Control.LibraryQueueTail = pRequest;
565 IoMarkIrpPending( Irp);
567 ntStatus = STATUS_PENDING;
571 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
572 AFS_TRACE_LEVEL_VERBOSE,
573 "%s Completed for Irp %p Status %08lX\n",
578 AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
585 AFSProcessQueuedResults( IN BOOLEAN CancelRequest)
588 NTSTATUS ntStatus = STATUS_SUCCESS;
589 AFSLibraryQueueRequestCB *pRequest = NULL;
590 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
595 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
596 AFS_TRACE_LEVEL_VERBOSE,
601 // Loop through the queue either resubmitting requests or cancelling them
607 AFSAcquireExcl( &pDevExt->Specific.Control.LibraryQueueLock,
610 if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
613 AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
618 pRequest = pDevExt->Specific.Control.LibraryQueueHead;
620 pDevExt->Specific.Control.LibraryQueueHead = pRequest->fLink;
622 if( pDevExt->Specific.Control.LibraryQueueHead == NULL)
625 pDevExt->Specific.Control.LibraryQueueTail = NULL;
628 AFSReleaseResource( &pDevExt->Specific.Control.LibraryQueueLock);
633 pRequest->Irp->IoStatus.Status = STATUS_CANCELLED;
635 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
636 AFS_TRACE_LEVEL_VERBOSE,
637 "%s Cancelling request Irp %p\n",
641 IoCompleteRequest( pRequest->Irp,
647 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
648 AFS_TRACE_LEVEL_VERBOSE,
649 "%s Resubmitting request Irp %p\n",
653 AFSSubmitLibraryRequest( pRequest->Irp);
656 ExFreePool( pRequest);
659 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
660 AFS_TRACE_LEVEL_VERBOSE,
669 AFSSubmitLibraryRequest( IN PIRP Irp)
672 NTSTATUS ntStatus = STATUS_SUCCESS;
673 IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
678 AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY,
679 AFS_TRACE_LEVEL_VERBOSE,
680 "%s Submitting Irp %p Function %08lX\n",
683 pIrpSp->MajorFunction);
685 switch( pIrpSp->MajorFunction)
690 AFSCreate( AFSRDRDeviceObject,
697 AFSClose( AFSRDRDeviceObject,
704 AFSRead( AFSRDRDeviceObject,
711 AFSWrite( AFSRDRDeviceObject,
716 case IRP_MJ_QUERY_INFORMATION:
718 AFSQueryFileInfo( AFSRDRDeviceObject,
723 case IRP_MJ_SET_INFORMATION:
725 AFSSetFileInfo( AFSRDRDeviceObject,
730 case IRP_MJ_QUERY_EA:
732 AFSQueryEA( AFSRDRDeviceObject,
739 AFSSetEA( AFSRDRDeviceObject,
744 case IRP_MJ_FLUSH_BUFFERS:
746 AFSFlushBuffers( AFSRDRDeviceObject,
751 case IRP_MJ_QUERY_VOLUME_INFORMATION:
753 AFSQueryVolumeInfo( AFSRDRDeviceObject,
758 case IRP_MJ_SET_VOLUME_INFORMATION:
760 AFSSetVolumeInfo( AFSRDRDeviceObject,
765 case IRP_MJ_DIRECTORY_CONTROL:
767 AFSDirControl( AFSRDRDeviceObject,
772 case IRP_MJ_FILE_SYSTEM_CONTROL:
774 AFSFSControl( AFSRDRDeviceObject,
779 case IRP_MJ_DEVICE_CONTROL:
781 AFSDevControl( AFSRDRDeviceObject,
786 case IRP_MJ_INTERNAL_DEVICE_CONTROL:
788 AFSInternalDevControl( AFSRDRDeviceObject,
793 case IRP_MJ_SHUTDOWN:
795 AFSShutdown( AFSRDRDeviceObject,
800 case IRP_MJ_LOCK_CONTROL:
802 AFSLockControl( AFSRDRDeviceObject,
809 AFSCleanup( AFSRDRDeviceObject,
814 case IRP_MJ_QUERY_SECURITY:
816 AFSQuerySecurity( AFSRDRDeviceObject,
821 case IRP_MJ_SET_SECURITY:
823 AFSSetSecurity( AFSRDRDeviceObject,
828 case IRP_MJ_SYSTEM_CONTROL:
830 AFSSystemControl( AFSRDRDeviceObject,
837 AFSDefaultDispatch( AFSRDRDeviceObject,
848 AFSInitializeLibrary( IN AFSFileID *GlobalRootFid,
849 IN BOOLEAN QueueRootEnumeration)
852 NTSTATUS ntStatus = STATUS_SUCCESS;
853 AFSLibraryInitCB stInitLib;
854 AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSDeviceObject->DeviceExtension;
855 AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
860 RtlZeroMemory( &stInitLib,
861 sizeof( AFSLibraryInitCB));
864 // Initialize the parameters to pass to the library
867 stInitLib.AFSControlDeviceObject = AFSDeviceObject;
869 stInitLib.AFSRDRDeviceObject = AFSRDRDeviceObject;
871 stInitLib.AFSServerName = AFSServerName;
873 stInitLib.AFSMountRootName = AFSMountRootName;
875 stInitLib.AFSDebugFlags = AFSDebugFlags;
877 if( GlobalRootFid != NULL)
879 stInitLib.GlobalRootFid = *GlobalRootFid;
882 stInitLib.AFSCacheManagerCallbacks = &AFSCacheManagerCallbacks;
884 stInitLib.AFSCacheBaseAddress = pRDRDevExt->Specific.RDR.CacheBaseAddress;
886 stInitLib.AFSCacheLength = pRDRDevExt->Specific.RDR.CacheLength;
889 // Initialize the callback functions for the library
892 stInitLib.AFSProcessRequest = AFSProcessRequest;
894 stInitLib.AFSDbgLogMsg = AFSDbgLogMsg;
896 stInitLib.AFSAddConnectionEx = AFSAddConnectionEx;
898 stInitLib.AFSExAllocatePoolWithTag = AFSExAllocatePoolWithTag;
900 stInitLib.AFSExFreePoolWithTag = AFSExFreePoolWithTag;
902 stInitLib.AFSDumpTraceFiles = AFSDumpTraceFiles;
904 stInitLib.AFSRetrieveAuthGroup = AFSRetrieveAuthGroup;
906 ntStatus = AFSSendDeviceIoControl( pDevExt->Specific.Control.LibraryDeviceObject,
907 IOCTL_AFS_INITIALIZE_LIBRARY_DEVICE,
909 sizeof( AFSLibraryInitCB),
914 if ( !NT_SUCCESS( ntStatus))
917 AFSDbgLogMsg( AFS_SUBSYSTEM_INIT_PROCESSING,
918 AFS_TRACE_LEVEL_ERROR,
919 "AFSInitializeLibrary AFSSendDeviceIoControl failure %08lX\n",