2 * Copyright (c) 2008 Secure Endpoints, Inc.
3 * Copyright (c) 2009-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 are met:
9 * - Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * - Neither the name of Secure Endpoints Inc. nor the names of its contributors
15 * may be used to endorse or promote products derived from this software without
16 * specific prior written permission from Secure Endpoints, Inc. and
17 * Your File System, Inc.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
23 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #define _WIN32_WINNT 0x0500
35 #define _CRT_SECURE_NO_DEPRECATE
36 #define _CRT_NON_CONFORMING_SWPRINTFS
38 #define STRSAFE_NO_DEPRECATE
41 #define WIN32_NO_STATUS
43 typedef LONG NTSTATUS, *PNTSTATUS; // not declared in ntstatus.h
57 #include "..\\Common\\AFSUserDefines.h"
58 #include "..\\Common\\AFSUserIoctl.h"
59 #include "..\\Common\\AFSUserStructs.h"
63 extern osi_log_t *afsd_logp;
65 #include <WINNT/afsreg.h>
66 #include <afs/cm_config.h>
67 #include <afs/cm_error.h>
69 #include <RDRPrototypes.h>
72 RDR_SetFileStatus2( AFSFileID * pFileId,
77 #define FlagOn(_F,_SF) ((_F) & (_SF))
81 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
85 #define SetFlag(_F,_SF) ((_F) |= (_SF))
89 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
92 #define QuadAlign(Ptr) ( \
93 ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
96 #define MIN_WORKER_THREADS 5
97 #define MAX_WORKER_THREADS 512
99 typedef struct _worker_thread_info {
109 WorkerThreadInfo glWorkerThreadInfo[ MAX_WORKER_THREADS];
111 UINT glThreadHandleIndex = 0;
113 HANDLE glDevHandle = INVALID_HANDLE_VALUE;
115 static DWORD Exit = false;
117 static DWORD ExitPending = false;
121 extern "C" wchar_t RDR_UNCName[64]=L"AFS";
123 HANDLE RDR_SuspendEvent = INVALID_HANDLE_VALUE;
125 /* returns 0 on success */
133 DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
135 // Initialize the Suspend Event
136 RDR_SuspendEvent = CreateEvent( NULL,
137 TRUE, // manual reset event
141 dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
142 0, KEY_QUERY_VALUE, &parmKey);
143 if (dwRet == ERROR_SUCCESS) {
144 dummyLen = sizeof(numSvThreads);
145 dwRet = RegQueryValueEx(parmKey, TEXT("ServerThreads"), NULL, NULL,
146 (BYTE *) &numSvThreads, &dummyLen);
148 dummyLen = sizeof(RDR_UNCName);
149 dwRet = RegQueryValueExW(parmKey, L"NetbiosName", NULL, NULL,
150 (BYTE *) RDR_UNCName, &dummyLen);
152 RegCloseKey (parmKey);
155 // Initialize the Thread local storage index for the overlapped i/o
157 dwOvEvIdx = TlsAlloc();
162 // Launch our workers down to the
163 // filters control device for processing requests
166 dwRet = RDR_ProcessWorkerThreads(numSvThreads);
168 if (dwRet == ERROR_SUCCESS) {
177 BOOL RDR_DeviceIoControl( HANDLE hDevice,
178 DWORD dwIoControlCode,
182 DWORD nOutBufferSize,
183 LPDWORD lpBytesReturned )
190 ZeroMemory(&ov, sizeof(OVERLAPPED));
192 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
193 if (hEvent == NULL) {
194 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
195 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
197 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
202 *lpBytesReturned = 0;
204 rc = DeviceIoControl( hDevice,
213 gle = GetLastError();
215 if ( gle == ERROR_IO_PENDING )
216 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
223 RDR_ShutdownFinal(void)
231 // Close all the worker thread handles
234 while( dwIndex < glThreadHandleIndex)
237 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
242 if( glDevHandle != INVALID_HANDLE_VALUE)
245 CloseHandle( glDevHandle);
252 RDR_ShutdownNotify(void)
255 HANDLE hDevHandle = NULL;
259 // We use the global handle to the control device instance
262 hDevHandle = glDevHandle;
266 // First, notify the file system driver that
267 // we are shutting down.
272 if( !RDR_DeviceIoControl( hDevHandle,
280 // log the error, nothing to do
291 // Here we launch the worker threads for the given volume
295 RDR_ProcessWorkerThreads(DWORD numThreads)
300 DWORD bytesReturned = 0;
301 DWORD dwRedirInitInfo;
302 AFSRedirectorInitInfo * redirInitInfo = NULL;
305 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
308 glDevHandle = CreateFile( AFS_SYMLINK_W,
309 GENERIC_READ | GENERIC_WRITE,
310 FILE_SHARE_READ | FILE_SHARE_WRITE,
313 FILE_FLAG_OVERLAPPED,
316 if( glDevHandle == INVALID_HANDLE_VALUE)
319 return GetLastError();
323 // Now call down to initialize the pool.
326 if( !RDR_DeviceIoControl( glDevHandle,
327 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
335 CloseHandle( glDevHandle);
341 return GetLastError();
345 // OK, now launch the workers
348 hEvent = CreateEvent( NULL,
354 // Here we create a pool of worker threads but you can create the pool with as many requests
358 if (numThreads < MIN_WORKER_THREADS)
359 numThreads = MIN_WORKER_THREADS;
360 else if (numThreads > MAX_WORKER_THREADS)
361 numThreads = MAX_WORKER_THREADS;
363 for (index = 0; index < numThreads; index++)
366 // 20% of worker threads should be reserved for release extent
369 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
370 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
371 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
372 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
375 RDR_RequestWorkerThread,
376 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
380 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
384 // Wait for the thread to signal it is ready for processing
387 WaitForSingleObject( hEvent,
390 glThreadHandleIndex++;
398 // Perform cleanup specific to your application
404 if( !RDR_DeviceIoControl( glDevHandle,
405 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
413 CloseHandle( glDevHandle);
419 return GetLastError();
428 // Entry point for the worker thread
433 RDR_RequestWorkerThread( LPVOID lpParameter)
436 HANDLE hDevHandle = NULL;
438 AFSCommRequest *requestBuffer;
440 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
443 // We use the global handle to the control device instance
446 hDevHandle = glDevHandle;
449 // Allocate a request buffer.
452 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
458 // Here we simply signal back to the main thread that we ahve started
461 SetEvent( pInfo->hEvent);
464 // Process requests until we are told to stop
470 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
472 requestBuffer->RequestFlags = pInfo->Flags;
474 if( !RDR_DeviceIoControl( hDevHandle,
475 IOCTL_AFS_PROCESS_IRP_REQUEST,
476 (void *)requestBuffer,
477 sizeof( AFSCommRequest),
478 (void *)requestBuffer,
479 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
484 // Error condition back from driver
490 WaitForSingleObject( RDR_SuspendEvent, INFINITE);
493 // Go process the request
497 RDR_ProcessRequest( requestBuffer);
500 free( requestBuffer);
509 // This is the entry point for the worker threads to process the request from the TC Filter driver
513 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
519 ULONG ulCreateFlags = 0;
520 AFSCommResult * pResultCB = NULL;
521 AFSCommResult stResultCB;
522 DWORD dwResultBufferLength = 0;
523 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
524 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
525 WCHAR wchBuffer[1024];
526 char *pBuffer = (char *)wchBuffer;
528 cm_user_t * userp = NULL;
529 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
530 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
531 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
532 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
533 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
534 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
535 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
537 BOOL bUnsupported = FALSE;
538 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
540 userp = RDR_UserFromCommRequest(RequestBuffer);
544 // Build up the string to display based on the request type.
547 switch( RequestBuffer->RequestType)
550 case AFS_REQUEST_TYPE_DIR_ENUM:
553 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
555 if (afsd_logp->enabled) {
557 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
558 RequestBuffer->RequestIndex);
560 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
564 // Here is where the content of the specific directory is enumerated.
567 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
568 pQueryCB, bWow64, bFast,
569 RequestBuffer->ResultBufferLength,
574 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
576 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
578 if (afsd_logp->enabled) {
580 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
581 RequestBuffer->RequestIndex);
583 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
586 // Here is where the specified node is evaluated.
589 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
590 RequestBuffer->FileId,
591 bWow64, bFast, bHoldFid,
592 RequestBuffer->ResultBufferLength,
597 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
599 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
601 if (afsd_logp->enabled) {
603 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
604 RequestBuffer->RequestIndex);
606 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
609 // Here is where the specified node is evaluated.
612 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
614 RequestBuffer->NameLength,
615 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
616 bWow64, bFast, bHoldFid,
617 RequestBuffer->ResultBufferLength,
622 case AFS_REQUEST_TYPE_CREATE_FILE:
625 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
627 WCHAR wchFileName[ 256];
629 if (afsd_logp->enabled) {
630 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
634 RequestBuffer->NameLength);
636 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
637 RequestBuffer->RequestIndex, wchFileName);
639 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
642 RDR_CreateFileEntry( userp,
644 RequestBuffer->NameLength,
648 RequestBuffer->ResultBufferLength,
654 case AFS_REQUEST_TYPE_UPDATE_FILE:
657 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
659 if (afsd_logp->enabled) {
660 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
661 RequestBuffer->RequestIndex,
662 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
663 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
665 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
668 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
671 RequestBuffer->ResultBufferLength,
677 case AFS_REQUEST_TYPE_DELETE_FILE:
680 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
682 if (afsd_logp->enabled) {
683 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
684 RequestBuffer->RequestIndex,
685 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
686 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
689 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
692 RDR_DeleteFileEntry( userp,
694 pDeleteCB->ProcessId,
696 RequestBuffer->NameLength,
699 RequestBuffer->ResultBufferLength,
705 case AFS_REQUEST_TYPE_RENAME_FILE:
708 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
710 if (afsd_logp->enabled) {
711 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
712 RequestBuffer->RequestIndex,
713 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
714 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
715 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
717 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
720 RDR_RenameFileEntry( userp,
722 RequestBuffer->NameLength,
723 RequestBuffer->FileId,
726 RequestBuffer->ResultBufferLength,
732 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
735 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
737 if (afsd_logp->enabled) {
738 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
739 RequestBuffer->RequestIndex,
740 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
741 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
742 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
744 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
747 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
748 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
751 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
752 pFileRequestExtentsCB,
754 &dwResultBufferLength,
755 &SetFileExtentsResultCB );
759 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
762 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
764 if (afsd_logp->enabled) {
765 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX",
766 RequestBuffer->RequestIndex,
767 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
768 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
770 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
773 RDR_ReleaseFileExtents( userp, RequestBuffer->FileId,
774 pFileReleaseExtentsCB,
776 RequestBuffer->ResultBufferLength,
782 case AFS_REQUEST_TYPE_FLUSH_FILE:
784 if (afsd_logp->enabled) {
785 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
786 RequestBuffer->RequestIndex,
787 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
788 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
790 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
793 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
795 RequestBuffer->ResultBufferLength,
800 case AFS_REQUEST_TYPE_OPEN_FILE:
802 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
804 if (afsd_logp->enabled) {
805 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
806 RequestBuffer->RequestIndex,
807 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
808 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
810 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
813 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
817 RequestBuffer->ResultBufferLength,
823 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
825 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
827 if (afsd_logp->enabled) {
828 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
829 RequestBuffer->RequestIndex,
830 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
831 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
833 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
836 RDR_ReleaseFileAccess( userp,
837 RequestBuffer->FileId,
838 pFileAccessReleaseCB,
840 RequestBuffer->ResultBufferLength,
846 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
848 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
850 if (afsd_logp->enabled) {
851 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
852 RequestBuffer->RequestIndex,
853 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
854 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
856 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
859 RDR_PioctlOpen( userp,
860 RequestBuffer->FileId,
863 RequestBuffer->ResultBufferLength,
868 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
870 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
872 if (afsd_logp->enabled) {
873 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
874 RequestBuffer->RequestIndex,
875 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
876 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
878 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
881 RDR_PioctlWrite( userp,
882 RequestBuffer->FileId,
885 RequestBuffer->ResultBufferLength,
890 case AFS_REQUEST_TYPE_PIOCTL_READ:
892 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
894 if (afsd_logp->enabled) {
895 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
896 RequestBuffer->RequestIndex,
897 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
898 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
900 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
903 RDR_PioctlRead( userp,
904 RequestBuffer->FileId,
908 RequestBuffer->ResultBufferLength,
913 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
915 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
917 if (afsd_logp->enabled) {
918 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
919 RequestBuffer->RequestIndex,
920 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
921 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
923 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
926 RDR_PioctlClose( userp,
927 RequestBuffer->FileId,
930 RequestBuffer->ResultBufferLength,
936 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
938 if (afsd_logp->enabled) {
939 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
940 RequestBuffer->RequestIndex,
941 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
942 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
943 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
945 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
948 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
950 RDR_ByteRangeLockSync( userp,
951 RequestBuffer->FileId,
954 RequestBuffer->ResultBufferLength,
960 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
962 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
964 if (afsd_logp->enabled) {
965 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
966 RequestBuffer->RequestIndex,
967 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
968 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
970 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
973 RDR_ByteRangeUnlock( userp,
974 RequestBuffer->FileId,
977 RequestBuffer->ResultBufferLength,
982 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
984 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
986 if (afsd_logp->enabled) {
987 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
988 RequestBuffer->RequestIndex,
989 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
990 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
992 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
995 RDR_ByteRangeUnlockAll( userp,
996 RequestBuffer->FileId,
999 RequestBuffer->ResultBufferLength,
1004 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
1006 if (afsd_logp->enabled) {
1007 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1008 RequestBuffer->RequestIndex,
1009 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1010 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1012 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1015 RDR_GetVolumeInfo( userp,
1016 RequestBuffer->FileId,
1018 RequestBuffer->ResultBufferLength,
1023 case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
1025 if (afsd_logp->enabled) {
1026 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1027 RequestBuffer->RequestIndex,
1028 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1029 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1031 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1034 RDR_GetVolumeSizeInfo( userp,
1035 RequestBuffer->FileId,
1037 RequestBuffer->ResultBufferLength,
1042 case AFS_REQUEST_TYPE_HOLD_FID:
1045 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1047 if (afsd_logp->enabled) {
1048 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1049 RequestBuffer->RequestIndex);
1051 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1057 RequestBuffer->ResultBufferLength,
1063 case AFS_REQUEST_TYPE_RELEASE_FID:
1066 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1068 if (afsd_logp->enabled) {
1069 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1070 RequestBuffer->RequestIndex);
1072 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1075 RDR_ReleaseFid( userp,
1078 RequestBuffer->ResultBufferLength,
1084 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1087 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1089 if (afsd_logp->enabled) {
1090 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1091 RequestBuffer->RequestIndex,
1092 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1093 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1095 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1098 RDR_CleanupFileEntry( userp,
1099 RequestBuffer->FileId,
1100 RequestBuffer->Name,
1101 RequestBuffer->NameLength,
1107 RequestBuffer->ResultBufferLength,
1113 case AFS_REQUEST_TYPE_PIPE_OPEN:
1115 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1117 if (afsd_logp->enabled) {
1118 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1119 RequestBuffer->RequestIndex,
1120 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1121 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1123 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1126 RDR_PipeOpen( userp,
1127 RequestBuffer->FileId,
1128 RequestBuffer->Name,
1129 RequestBuffer->NameLength,
1132 RequestBuffer->ResultBufferLength,
1137 case AFS_REQUEST_TYPE_PIPE_WRITE:
1139 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1140 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1142 if (afsd_logp->enabled) {
1143 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1144 RequestBuffer->RequestIndex,
1145 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1146 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1148 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1151 RDR_PipeWrite( userp,
1152 RequestBuffer->FileId,
1156 RequestBuffer->ResultBufferLength,
1161 case AFS_REQUEST_TYPE_PIPE_READ:
1163 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1165 if (afsd_logp->enabled) {
1166 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1167 RequestBuffer->RequestIndex,
1168 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1169 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1171 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1174 RDR_PipeRead( userp,
1175 RequestBuffer->FileId,
1178 RequestBuffer->ResultBufferLength,
1183 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1185 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1187 if (afsd_logp->enabled) {
1188 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1189 RequestBuffer->RequestIndex,
1190 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1191 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1193 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1196 RDR_PipeClose( userp,
1197 RequestBuffer->FileId,
1200 RequestBuffer->ResultBufferLength,
1206 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1208 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1209 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1211 if (afsd_logp->enabled) {
1212 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1213 RequestBuffer->RequestIndex);
1215 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1218 RDR_PipeTransceive( userp,
1219 RequestBuffer->FileId,
1223 RequestBuffer->ResultBufferLength,
1228 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1230 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1232 if (afsd_logp->enabled) {
1233 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1234 RequestBuffer->RequestIndex);
1236 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1239 RDR_PipeQueryInfo( userp,
1240 RequestBuffer->FileId,
1243 RequestBuffer->ResultBufferLength,
1248 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1250 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1251 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1253 if (afsd_logp->enabled) {
1254 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1255 RequestBuffer->RequestIndex);
1257 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1260 RDR_PipeSetInfo( userp,
1261 RequestBuffer->FileId,
1265 RequestBuffer->ResultBufferLength,
1272 bUnsupported = TRUE;
1274 if (afsd_logp->enabled) {
1275 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1276 RequestBuffer->RequestType,
1277 RequestBuffer->RequestIndex);
1279 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1285 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1287 if (pResultCB == NULL) {
1288 // We failed probably due to a memory allocation error
1289 // unless the unsupported flag was set.
1290 pResultCB = &stResultCB;
1291 memset(&stResultCB, 0, sizeof(stResultCB));
1293 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1295 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1299 // This is how the filter associates the response information passed in the IOCtl below to the
1300 // original call. This request index is setup by the filter and should not be modified, otherwise the
1301 // filter will not be able to locate the request in its internal queue and the blocking thread will
1305 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1307 if (afsd_logp->enabled) {
1308 swprintf( wchBuffer,
1309 L"ProcessRequest Responding to Index %08lX Length %08lX",
1310 pResultCB->RequestIndex,
1311 pResultCB->ResultBufferLength);
1313 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1317 // Now post the result back to the driver.
1320 if( !RDR_DeviceIoControl( glDevHandle,
1321 IOCTL_AFS_PROCESS_IRP_RESULT,
1323 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1328 char *pBuffer = (char *)wchBuffer;
1329 gle = GetLastError();
1330 if (afsd_logp->enabled) {
1331 swprintf( wchBuffer,
1332 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1333 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1336 if (gle != ERROR_NOT_READY) {
1338 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1340 osi_panic(pBuffer, __FILE__, __LINE__);
1345 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1347 if (SetFileExtentsResultCB) {
1349 if (1 || afsd_logp->enabled) {
1350 if (SetFileExtentsResultCB->ResultStatus != 0)
1351 swprintf( wchBuffer,
1352 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1353 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1355 swprintf( wchBuffer,
1356 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1357 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1359 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1362 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1363 SetFileExtentsResultCB->ResultStatus != 0) &&
1364 !RDR_DeviceIoControl( glDevHandle,
1365 IOCTL_AFS_SET_FILE_EXTENTS,
1366 (void *)SetFileExtentsResultCB,
1367 dwResultBufferLength,
1372 gle = GetLastError();
1373 if (afsd_logp->enabled) {
1374 swprintf( wchBuffer,
1375 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1377 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1380 // The file system returns an error when it can't find the FID
1381 // This is a bug in the file system but we should try to avoid
1382 // the crash and clean up our own memory space.
1384 // Since we couldn't deliver the extents to the file system
1385 // we should release them.
1386 if ( SetFileExtentsResultCB->ExtentCount != 0)
1388 RDR_ReleaseFailedSetFileExtents( userp,
1389 SetFileExtentsResultCB,
1390 dwResultBufferLength);
1393 if (gle != ERROR_GEN_FAILURE &&
1394 gle != ERROR_NOT_READY) {
1396 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1398 osi_panic(pBuffer, __FILE__, __LINE__);
1402 free(SetFileExtentsResultCB);
1405 /* Must be out of memory */
1406 if (afsd_logp->enabled) {
1407 swprintf( wchBuffer,
1408 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1409 RequestBuffer->RequestIndex);
1411 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1414 RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
1417 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1419 if (afsd_logp->enabled) {
1420 swprintf( wchBuffer,
1421 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1422 RequestBuffer->RequestIndex);
1424 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1428 if (SetByteRangeLockResultCB) {
1430 if( !RDR_DeviceIoControl( glDevHandle,
1431 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1432 (void *)SetByteRangeLockResultCB,
1433 dwResultBufferLength,
1438 gle = GetLastError();
1440 if (afsd_logp->enabled) {
1441 swprintf( wchBuffer,
1442 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1443 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1447 if (gle != ERROR_NOT_READY) {
1448 // TODO - instead of a panic we should release the locks
1450 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1451 osi_panic(pBuffer, __FILE__, __LINE__);
1455 free(SetByteRangeLockResultCB);
1457 /* Must be out of memory */
1458 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1460 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1461 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1462 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1463 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1465 if( !RDR_DeviceIoControl( glDevHandle,
1466 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1467 (void *)&SetByteRangeLockResultCB,
1468 dwResultBufferLength,
1473 gle = GetLastError();
1475 if (afsd_logp->enabled) {
1476 swprintf( wchBuffer,
1477 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1478 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1481 /* We were out of memory - nothing to do */
1487 if (afsd_logp->enabled) {
1488 swprintf( wchBuffer,
1489 L"ProcessRequest Not responding to async Index %08lX",
1490 RequestBuffer->RequestIndex);
1492 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1500 RDR_ReleaseUser(userp);
1503 if( pResultCB && pResultCB != &stResultCB)
1513 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1514 DWORD dwResultBufferLength)
1516 WCHAR wchBuffer[1024];
1517 DWORD bytesReturned;
1520 if (1 || afsd_logp->enabled) {
1521 if (pSetFileExtentsResultCB->ResultStatus != 0)
1522 swprintf( wchBuffer,
1523 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1524 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1526 swprintf( wchBuffer,
1527 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1528 pSetFileExtentsResultCB->ExtentCount);
1530 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1533 if( !RDR_DeviceIoControl( glDevHandle,
1534 IOCTL_AFS_SET_FILE_EXTENTS,
1535 (void *)pSetFileExtentsResultCB,
1536 dwResultBufferLength,
1541 gle = GetLastError();
1550 RDR_SetFileStatus( cm_fid_t *fidp,
1554 WCHAR wchBuffer[1024];
1555 AFSExtentFailureCB SetFileStatusCB;
1556 DWORD bytesReturned;
1559 RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
1560 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1561 SetFileStatusCB.FailureStatus = dwStatus;
1563 if (afsd_logp->enabled) {
1564 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1565 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1566 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1569 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1572 if( !RDR_DeviceIoControl( glDevHandle,
1573 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1574 (void *)&SetFileStatusCB,
1575 sizeof(AFSExtentFailureCB),
1580 gle = GetLastError();
1588 RDR_SetFileStatus2( AFSFileID *pFileId,
1592 WCHAR wchBuffer[1024];
1593 AFSExtentFailureCB SetFileStatusCB;
1594 DWORD bytesReturned;
1597 memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
1598 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1599 SetFileStatusCB.FailureStatus = dwStatus;
1601 if (afsd_logp->enabled) {
1602 swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1603 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1604 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1607 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1610 if( !RDR_DeviceIoControl( glDevHandle,
1611 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1612 (void *)&SetFileStatusCB,
1613 sizeof(AFSExtentFailureCB),
1618 gle = GetLastError();
1626 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1629 HANDLE hDevHandle = NULL;
1630 DWORD bytesReturned;
1631 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1632 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1633 DWORD requestBufferLen, responseBufferLen;
1634 bool bError = false;
1636 WCHAR wchBuffer[256];
1640 if (afsd_logp->enabled) {
1641 swprintf( wchBuffer,
1642 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1644 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1647 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1648 return CM_ERROR_WOULDBLOCK;
1651 if (afsd_logp->enabled) {
1652 swprintf( wchBuffer,
1653 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1656 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1660 // We use the global handle to the control device instance
1663 hDevHandle = glDevHandle;
1666 // Allocate a request buffer.
1669 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1670 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1671 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1672 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1675 if( requestBuffer && responseBuffer)
1678 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1679 memset( responseBuffer, '\0', responseBufferLen);
1681 // If there is a FID provided, use it
1682 if (fidp && extentList)
1684 RDR_fid2FID( fidp, &requestBuffer->FileId);
1686 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1688 requestBuffer->Flags = 0;
1691 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1694 // Set the number of extents to be freed
1695 // Leave the rest of the structure as zeros to indicate free anything
1696 requestBuffer->ExtentCount = numOfExtents;
1698 requestBuffer->HeldExtentCount = numOfHeldExtents;
1700 if( !RDR_DeviceIoControl( hDevHandle,
1701 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1702 (void *)requestBuffer,
1704 (void *)responseBuffer,
1709 // Error condition back from driver
1711 if (afsd_logp->enabled) {
1712 gle = GetLastError();
1713 swprintf( wchBuffer,
1714 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1715 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1722 // Go process the request
1725 if (afsd_logp->enabled) {
1726 swprintf( wchBuffer,
1727 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1728 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1729 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1732 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1740 free( requestBuffer);
1742 free( responseBuffer);
1749 RDR_NetworkStatus(BOOLEAN status)
1752 HANDLE hDevHandle = NULL;
1753 DWORD bytesReturned;
1754 AFSNetworkStatusCB *requestBuffer = NULL;
1756 WCHAR wchBuffer[256];
1759 if (afsd_logp->enabled) {
1760 swprintf( wchBuffer,
1761 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1764 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1768 // We use the global handle to the control device instance
1771 hDevHandle = glDevHandle;
1774 // Allocate a request buffer.
1777 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1783 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1785 // Set the number of extents to be freed
1786 // Leave the rest of the structure as zeros to indicate free anything
1787 requestBuffer->Online = status;
1789 if( !RDR_DeviceIoControl( hDevHandle,
1790 IOCTL_AFS_NETWORK_STATUS,
1791 (void *)requestBuffer,
1792 sizeof( AFSNetworkStatusCB),
1798 // Error condition back from driver
1800 if (afsd_logp->enabled) {
1801 gle = GetLastError();
1802 swprintf( wchBuffer,
1803 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1805 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1816 free( requestBuffer);
1824 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1827 HANDLE hDevHandle = NULL;
1828 DWORD bytesReturned;
1829 AFSVolumeStatusCB *requestBuffer = NULL;
1831 WCHAR wchBuffer[256];
1834 if (afsd_logp->enabled) {
1835 swprintf( wchBuffer,
1836 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1837 cellID, volID, online);
1839 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1843 // We use the global handle to the control device instance
1846 hDevHandle = glDevHandle;
1849 // Allocate a request buffer.
1852 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1858 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1860 requestBuffer->FileID.Cell = cellID;
1861 requestBuffer->FileID.Volume = volID;
1862 requestBuffer->Online = online;
1864 if( !RDR_DeviceIoControl( hDevHandle,
1865 IOCTL_AFS_VOLUME_STATUS,
1866 (void *)requestBuffer,
1867 sizeof( AFSVolumeStatusCB),
1873 // Error condition back from driver
1876 if (afsd_logp->enabled) {
1877 gle = GetLastError();
1878 swprintf( wchBuffer,
1879 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1880 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1891 free( requestBuffer);
1897 RDR_NetworkAddrChange(void)
1904 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1907 HANDLE hDevHandle = NULL;
1908 DWORD bytesReturned;
1909 AFSInvalidateCacheCB *requestBuffer = NULL;
1911 WCHAR wchBuffer[256];
1914 if (afsd_logp->enabled) {
1915 swprintf( wchBuffer,
1916 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1917 cellID, volID, reason);
1919 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1923 // We use the global handle to the control device instance
1926 hDevHandle = glDevHandle;
1929 // Allocate a request buffer.
1932 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1938 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1940 requestBuffer->FileID.Cell = cellID;
1941 requestBuffer->FileID.Volume = volID;
1942 requestBuffer->WholeVolume = TRUE;
1943 requestBuffer->Reason = reason;
1945 if( !RDR_DeviceIoControl( hDevHandle,
1946 IOCTL_AFS_INVALIDATE_CACHE,
1947 (void *)requestBuffer,
1948 sizeof( AFSInvalidateCacheCB),
1954 // Error condition back from driver
1957 if (afsd_logp->enabled) {
1958 gle = GetLastError();
1959 swprintf( wchBuffer,
1960 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
1961 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1972 free( requestBuffer);
1979 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
1982 HANDLE hDevHandle = NULL;
1983 DWORD bytesReturned;
1984 AFSInvalidateCacheCB *requestBuffer = NULL;
1986 WCHAR wchBuffer[256];
1989 if (afsd_logp->enabled) {
1990 swprintf( wchBuffer,
1991 L"IOCTL_AFS_INVALIDATE_CACHE (obj) request - cell 0x%x vol 0x%x vn 0x%x uniq 0x%x hash 0x%x type 0x%x reason %d",
1992 cellID, volID, vnode, uniq, hash, fileType, reason);
1994 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1998 // We use the global handle to the control device instance
2001 hDevHandle = glDevHandle;
2004 // Allocate a request buffer.
2007 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
2013 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
2015 requestBuffer->FileID.Cell = cellID;
2016 requestBuffer->FileID.Volume = volID;
2017 requestBuffer->FileID.Vnode = vnode;
2018 requestBuffer->FileID.Unique = uniq;
2019 requestBuffer->FileID.Hash = hash;
2020 requestBuffer->FileType = fileType;
2021 requestBuffer->WholeVolume = FALSE;
2022 requestBuffer->Reason = reason;
2024 if( !RDR_DeviceIoControl( hDevHandle,
2025 IOCTL_AFS_INVALIDATE_CACHE,
2026 (void *)requestBuffer,
2027 sizeof( AFSInvalidateCacheCB),
2033 // Error condition back from driver
2035 if (afsd_logp->enabled) {
2036 gle = GetLastError();
2037 swprintf( wchBuffer,
2038 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
2039 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2050 free( requestBuffer);
2058 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
2061 HANDLE hDevHandle = NULL;
2062 DWORD bytesReturned;
2063 AFSSysNameNotificationCB *requestBuffer = NULL;
2065 WCHAR wchBuffer[256];
2069 if (afsd_logp->enabled) {
2070 swprintf( wchBuffer,
2071 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
2072 Architecture, Count);
2074 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2077 if (Count <= 0 || NameList == NULL)
2081 // We use the global handle to the control device instance
2084 hDevHandle = glDevHandle;
2087 // Allocate a request buffer.
2090 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2091 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2098 memset( requestBuffer, '\0', Length);
2100 requestBuffer->Architecture = Architecture;
2101 requestBuffer->NumberOfNames = Count;
2102 for ( i=0 ; i<Count; i++) {
2103 size_t len = wcslen(NameList[i]);
2104 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2105 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2109 if( !RDR_DeviceIoControl( hDevHandle,
2110 IOCTL_AFS_SYSNAME_NOTIFICATION,
2111 (void *)requestBuffer,
2118 // Error condition back from driver
2120 if (afsd_logp->enabled) {
2121 gle = GetLastError();
2122 swprintf( wchBuffer,
2123 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2124 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2135 free( requestBuffer);
2143 ResetEvent( RDR_SuspendEvent);
2149 SetEvent( RDR_SuspendEvent);