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) {
176 BOOL RDR_DeviceIoControl( HANDLE hDevice,
177 DWORD dwIoControlCode,
181 DWORD nOutBufferSize,
182 LPDWORD lpBytesReturned )
189 ZeroMemory(&ov, sizeof(OVERLAPPED));
191 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
192 if (hEvent == NULL) {
193 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
194 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
196 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
201 *lpBytesReturned = 0;
203 rc = DeviceIoControl( hDevice,
212 gle = GetLastError();
214 if ( gle == ERROR_IO_PENDING )
215 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
222 RDR_ShutdownFinal(void)
230 // Close all the worker thread handles
233 while( dwIndex < glThreadHandleIndex)
236 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
241 if( glDevHandle != INVALID_HANDLE_VALUE)
244 CloseHandle( glDevHandle);
251 RDR_ShutdownNotify(void)
254 HANDLE hDevHandle = NULL;
258 // We use the global handle to the control device instance
261 hDevHandle = glDevHandle;
265 // First, notify the file system driver that
266 // we are shutting down.
271 if( !RDR_DeviceIoControl( hDevHandle,
279 // log the error, nothing to do
286 // Here we launch the worker threads for the given volume
290 RDR_ProcessWorkerThreads(DWORD numThreads)
295 DWORD bytesReturned = 0;
296 DWORD dwRedirInitInfo;
297 AFSRedirectorInitInfo * redirInitInfo = NULL;
300 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
303 glDevHandle = CreateFile( AFS_SYMLINK_W,
304 GENERIC_READ | GENERIC_WRITE,
305 FILE_SHARE_READ | FILE_SHARE_WRITE,
308 FILE_FLAG_OVERLAPPED,
311 if( glDevHandle == INVALID_HANDLE_VALUE)
314 return GetLastError();
318 // Now call down to initialize the pool.
321 if( !RDR_DeviceIoControl( glDevHandle,
322 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
330 CloseHandle( glDevHandle);
336 return GetLastError();
340 // OK, now launch the workers
343 hEvent = CreateEvent( NULL,
349 // Here we create a pool of worker threads but you can create the pool with as many requests
353 if (numThreads < MIN_WORKER_THREADS)
354 numThreads = MIN_WORKER_THREADS;
355 else if (numThreads > MAX_WORKER_THREADS)
356 numThreads = MAX_WORKER_THREADS;
358 for (index = 0; index < numThreads; index++)
361 // 20% of worker threads should be reserved for release extent
364 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
365 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
366 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
367 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
370 RDR_RequestWorkerThread,
371 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
375 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
379 // Wait for the thread to signal it is ready for processing
382 WaitForSingleObject( hEvent,
385 glThreadHandleIndex++;
393 // Perform cleanup specific to your application
399 if( !RDR_DeviceIoControl( glDevHandle,
400 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
408 CloseHandle( glDevHandle);
414 return GetLastError();
423 // Entry point for the worker thread
428 RDR_RequestWorkerThread( LPVOID lpParameter)
431 HANDLE hDevHandle = NULL;
433 AFSCommRequest *requestBuffer;
435 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
438 // We use the global handle to the control device instance
441 hDevHandle = glDevHandle;
444 // Allocate a request buffer.
447 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
453 // Here we simply signal back to the main thread that we ahve started
456 SetEvent( pInfo->hEvent);
459 // Process requests until we are told to stop
465 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
467 requestBuffer->RequestFlags = pInfo->Flags;
469 if( !RDR_DeviceIoControl( hDevHandle,
470 IOCTL_AFS_PROCESS_IRP_REQUEST,
471 (void *)requestBuffer,
472 sizeof( AFSCommRequest),
473 (void *)requestBuffer,
474 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
479 // Error condition back from driver
485 WaitForSingleObject( RDR_SuspendEvent, INFINITE);
488 // Go process the request
492 RDR_ProcessRequest( requestBuffer);
495 free( requestBuffer);
504 // This is the entry point for the worker threads to process the request from the TC Filter driver
508 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
514 ULONG ulCreateFlags = 0;
515 AFSCommResult * pResultCB = NULL;
516 AFSCommResult stResultCB;
517 DWORD dwResultBufferLength = 0;
518 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
519 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
520 WCHAR wchBuffer[1024];
521 char *pBuffer = (char *)wchBuffer;
523 cm_user_t * userp = NULL;
524 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
525 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
526 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
527 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
528 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
529 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
530 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
532 BOOL bUnsupported = FALSE;
533 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
535 userp = RDR_UserFromCommRequest(RequestBuffer);
539 // Build up the string to display based on the request type.
542 switch( RequestBuffer->RequestType)
545 case AFS_REQUEST_TYPE_DIR_ENUM:
548 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
550 if (afsd_logp->enabled) {
552 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
553 RequestBuffer->RequestIndex);
555 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
559 // Here is where the content of the specific directory is enumerated.
562 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
563 pQueryCB, bWow64, bFast,
564 RequestBuffer->ResultBufferLength,
569 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
571 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
573 if (afsd_logp->enabled) {
575 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
576 RequestBuffer->RequestIndex);
578 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
581 // Here is where the specified node is evaluated.
584 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
585 RequestBuffer->FileId,
586 bWow64, bFast, bHoldFid,
587 RequestBuffer->ResultBufferLength,
592 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
594 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
596 if (afsd_logp->enabled) {
598 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
599 RequestBuffer->RequestIndex);
601 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
604 // Here is where the specified node is evaluated.
607 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
609 RequestBuffer->NameLength,
610 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
611 bWow64, bFast, bHoldFid,
612 RequestBuffer->ResultBufferLength,
617 case AFS_REQUEST_TYPE_CREATE_FILE:
620 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
622 WCHAR wchFileName[ 256];
624 if (afsd_logp->enabled) {
625 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
629 RequestBuffer->NameLength);
631 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
632 RequestBuffer->RequestIndex, wchFileName);
634 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
637 RDR_CreateFileEntry( userp,
639 RequestBuffer->NameLength,
643 RequestBuffer->ResultBufferLength,
649 case AFS_REQUEST_TYPE_UPDATE_FILE:
652 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
654 if (afsd_logp->enabled) {
655 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
656 RequestBuffer->RequestIndex,
657 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
658 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
660 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
663 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
666 RequestBuffer->ResultBufferLength,
672 case AFS_REQUEST_TYPE_DELETE_FILE:
675 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
677 if (afsd_logp->enabled) {
678 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
679 RequestBuffer->RequestIndex,
680 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
681 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
684 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
687 RDR_DeleteFileEntry( userp,
689 pDeleteCB->ProcessId,
691 RequestBuffer->NameLength,
694 RequestBuffer->ResultBufferLength,
700 case AFS_REQUEST_TYPE_RENAME_FILE:
703 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
705 if (afsd_logp->enabled) {
706 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
707 RequestBuffer->RequestIndex,
708 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
709 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
710 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
712 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
715 RDR_RenameFileEntry( userp,
717 RequestBuffer->NameLength,
718 RequestBuffer->FileId,
721 RequestBuffer->ResultBufferLength,
727 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
730 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
732 if (afsd_logp->enabled) {
733 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
734 RequestBuffer->RequestIndex,
735 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
736 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
737 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
739 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
742 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
743 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
746 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
747 pFileRequestExtentsCB,
749 &dwResultBufferLength,
750 &SetFileExtentsResultCB );
754 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
757 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
759 if (afsd_logp->enabled) {
760 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX",
761 RequestBuffer->RequestIndex,
762 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
763 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
765 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
768 RDR_ReleaseFileExtents( userp, RequestBuffer->FileId,
769 pFileReleaseExtentsCB,
771 RequestBuffer->ResultBufferLength,
777 case AFS_REQUEST_TYPE_FLUSH_FILE:
779 if (afsd_logp->enabled) {
780 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
781 RequestBuffer->RequestIndex,
782 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
783 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
785 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
788 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
790 RequestBuffer->ResultBufferLength,
795 case AFS_REQUEST_TYPE_OPEN_FILE:
797 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
799 if (afsd_logp->enabled) {
800 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
801 RequestBuffer->RequestIndex,
802 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
803 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
805 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
808 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
812 RequestBuffer->ResultBufferLength,
818 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
820 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
822 if (afsd_logp->enabled) {
823 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
824 RequestBuffer->RequestIndex,
825 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
826 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
828 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
831 RDR_ReleaseFileAccess( userp,
832 RequestBuffer->FileId,
833 pFileAccessReleaseCB,
835 RequestBuffer->ResultBufferLength,
841 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
843 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
845 if (afsd_logp->enabled) {
846 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
847 RequestBuffer->RequestIndex,
848 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
849 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
851 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
854 RDR_PioctlOpen( userp,
855 RequestBuffer->FileId,
858 RequestBuffer->ResultBufferLength,
863 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
865 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
867 if (afsd_logp->enabled) {
868 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
869 RequestBuffer->RequestIndex,
870 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
871 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
873 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
876 RDR_PioctlWrite( userp,
877 RequestBuffer->FileId,
880 RequestBuffer->ResultBufferLength,
885 case AFS_REQUEST_TYPE_PIOCTL_READ:
887 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
889 if (afsd_logp->enabled) {
890 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
891 RequestBuffer->RequestIndex,
892 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
893 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
895 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
898 RDR_PioctlRead( userp,
899 RequestBuffer->FileId,
903 RequestBuffer->ResultBufferLength,
908 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
910 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
912 if (afsd_logp->enabled) {
913 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
914 RequestBuffer->RequestIndex,
915 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
916 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
918 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
921 RDR_PioctlClose( userp,
922 RequestBuffer->FileId,
925 RequestBuffer->ResultBufferLength,
931 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
933 if (afsd_logp->enabled) {
934 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
935 RequestBuffer->RequestIndex,
936 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
937 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
938 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
940 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
943 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
945 RDR_ByteRangeLockSync( userp,
946 RequestBuffer->FileId,
949 RequestBuffer->ResultBufferLength,
955 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
957 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
959 if (afsd_logp->enabled) {
960 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
961 RequestBuffer->RequestIndex,
962 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
963 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
965 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
968 RDR_ByteRangeUnlock( userp,
969 RequestBuffer->FileId,
972 RequestBuffer->ResultBufferLength,
977 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
979 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
981 if (afsd_logp->enabled) {
982 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
983 RequestBuffer->RequestIndex,
984 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
985 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
987 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
990 RDR_ByteRangeUnlockAll( userp,
991 RequestBuffer->FileId,
994 RequestBuffer->ResultBufferLength,
999 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
1001 if (afsd_logp->enabled) {
1002 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1003 RequestBuffer->RequestIndex,
1004 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1005 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1007 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1010 RDR_GetVolumeInfo( userp,
1011 RequestBuffer->FileId,
1013 RequestBuffer->ResultBufferLength,
1018 case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
1020 if (afsd_logp->enabled) {
1021 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1022 RequestBuffer->RequestIndex,
1023 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1024 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1026 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1029 RDR_GetVolumeSizeInfo( userp,
1030 RequestBuffer->FileId,
1032 RequestBuffer->ResultBufferLength,
1037 case AFS_REQUEST_TYPE_HOLD_FID:
1040 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1042 if (afsd_logp->enabled) {
1043 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1044 RequestBuffer->RequestIndex);
1046 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1052 RequestBuffer->ResultBufferLength,
1058 case AFS_REQUEST_TYPE_RELEASE_FID:
1061 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1063 if (afsd_logp->enabled) {
1064 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1065 RequestBuffer->RequestIndex);
1067 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1070 RDR_ReleaseFid( userp,
1073 RequestBuffer->ResultBufferLength,
1079 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1082 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1084 if (afsd_logp->enabled) {
1085 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1086 RequestBuffer->RequestIndex,
1087 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1088 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1090 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1093 RDR_CleanupFileEntry( userp,
1094 RequestBuffer->FileId,
1095 RequestBuffer->Name,
1096 RequestBuffer->NameLength,
1102 RequestBuffer->ResultBufferLength,
1108 case AFS_REQUEST_TYPE_PIPE_OPEN:
1110 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1112 if (afsd_logp->enabled) {
1113 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1114 RequestBuffer->RequestIndex,
1115 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1116 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1118 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1121 RDR_PipeOpen( userp,
1122 RequestBuffer->FileId,
1123 RequestBuffer->Name,
1124 RequestBuffer->NameLength,
1127 RequestBuffer->ResultBufferLength,
1132 case AFS_REQUEST_TYPE_PIPE_WRITE:
1134 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1135 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1137 if (afsd_logp->enabled) {
1138 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1139 RequestBuffer->RequestIndex,
1140 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1141 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1143 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1146 RDR_PipeWrite( userp,
1147 RequestBuffer->FileId,
1151 RequestBuffer->ResultBufferLength,
1156 case AFS_REQUEST_TYPE_PIPE_READ:
1158 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1160 if (afsd_logp->enabled) {
1161 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1162 RequestBuffer->RequestIndex,
1163 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1164 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1166 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1169 RDR_PipeRead( userp,
1170 RequestBuffer->FileId,
1173 RequestBuffer->ResultBufferLength,
1178 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1180 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1182 if (afsd_logp->enabled) {
1183 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1184 RequestBuffer->RequestIndex,
1185 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1186 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1188 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1191 RDR_PipeClose( userp,
1192 RequestBuffer->FileId,
1195 RequestBuffer->ResultBufferLength,
1201 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1203 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1204 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1206 if (afsd_logp->enabled) {
1207 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1208 RequestBuffer->RequestIndex);
1210 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1213 RDR_PipeTransceive( userp,
1214 RequestBuffer->FileId,
1218 RequestBuffer->ResultBufferLength,
1223 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1225 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1227 if (afsd_logp->enabled) {
1228 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1229 RequestBuffer->RequestIndex);
1231 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1234 RDR_PipeQueryInfo( userp,
1235 RequestBuffer->FileId,
1238 RequestBuffer->ResultBufferLength,
1243 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1245 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1246 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1248 if (afsd_logp->enabled) {
1249 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1250 RequestBuffer->RequestIndex);
1252 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1255 RDR_PipeSetInfo( userp,
1256 RequestBuffer->FileId,
1260 RequestBuffer->ResultBufferLength,
1267 bUnsupported = TRUE;
1269 if (afsd_logp->enabled) {
1270 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1271 RequestBuffer->RequestType,
1272 RequestBuffer->RequestIndex);
1274 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1280 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1282 if (pResultCB == NULL) {
1283 // We failed probably due to a memory allocation error
1284 // unless the unsupported flag was set.
1285 pResultCB = &stResultCB;
1286 memset(&stResultCB, 0, sizeof(stResultCB));
1288 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1290 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1294 // This is how the filter associates the response information passed in the IOCtl below to the
1295 // original call. This request index is setup by the filter and should not be modified, otherwise the
1296 // filter will not be able to locate the request in its internal queue and the blocking thread will
1300 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1302 if (afsd_logp->enabled) {
1303 swprintf( wchBuffer,
1304 L"ProcessRequest Responding to Index %08lX Length %08lX",
1305 pResultCB->RequestIndex,
1306 pResultCB->ResultBufferLength);
1308 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1312 // Now post the result back to the driver.
1315 if( !RDR_DeviceIoControl( glDevHandle,
1316 IOCTL_AFS_PROCESS_IRP_RESULT,
1318 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1323 char *pBuffer = (char *)wchBuffer;
1324 gle = GetLastError();
1325 if (afsd_logp->enabled) {
1326 swprintf( wchBuffer,
1327 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1328 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1331 if (gle != ERROR_NOT_READY) {
1333 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1335 osi_panic(pBuffer, __FILE__, __LINE__);
1340 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1342 if (SetFileExtentsResultCB) {
1344 if (1 || afsd_logp->enabled) {
1345 if (SetFileExtentsResultCB->ResultStatus != 0)
1346 swprintf( wchBuffer,
1347 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1348 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1350 swprintf( wchBuffer,
1351 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1352 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1354 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1357 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1358 SetFileExtentsResultCB->ResultStatus != 0) &&
1359 !RDR_DeviceIoControl( glDevHandle,
1360 IOCTL_AFS_SET_FILE_EXTENTS,
1361 (void *)SetFileExtentsResultCB,
1362 dwResultBufferLength,
1367 gle = GetLastError();
1368 if (afsd_logp->enabled) {
1369 swprintf( wchBuffer,
1370 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1372 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1375 // The file system returns an error when it can't find the FID
1376 // This is a bug in the file system but we should try to avoid
1377 // the crash and clean up our own memory space.
1379 // Since we couldn't deliver the extents to the file system
1380 // we should release them.
1381 if ( SetFileExtentsResultCB->ExtentCount != 0)
1383 RDR_ReleaseFailedSetFileExtents( userp,
1384 SetFileExtentsResultCB,
1385 dwResultBufferLength);
1388 if (gle != ERROR_GEN_FAILURE &&
1389 gle != ERROR_NOT_READY) {
1391 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1393 osi_panic(pBuffer, __FILE__, __LINE__);
1397 free(SetFileExtentsResultCB);
1400 /* Must be out of memory */
1401 if (afsd_logp->enabled) {
1402 swprintf( wchBuffer,
1403 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1404 RequestBuffer->RequestIndex);
1406 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1409 RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
1412 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1414 if (afsd_logp->enabled) {
1415 swprintf( wchBuffer,
1416 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1417 RequestBuffer->RequestIndex);
1419 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1423 if (SetByteRangeLockResultCB) {
1425 if( !RDR_DeviceIoControl( glDevHandle,
1426 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1427 (void *)SetByteRangeLockResultCB,
1428 dwResultBufferLength,
1433 gle = GetLastError();
1435 if (afsd_logp->enabled) {
1436 swprintf( wchBuffer,
1437 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1438 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1442 if (gle != ERROR_NOT_READY) {
1443 // TODO - instead of a panic we should release the locks
1445 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1446 osi_panic(pBuffer, __FILE__, __LINE__);
1450 free(SetByteRangeLockResultCB);
1452 /* Must be out of memory */
1453 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1455 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1456 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1457 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1458 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1460 if( !RDR_DeviceIoControl( glDevHandle,
1461 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1462 (void *)&SetByteRangeLockResultCB,
1463 dwResultBufferLength,
1468 gle = GetLastError();
1470 if (afsd_logp->enabled) {
1471 swprintf( wchBuffer,
1472 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1473 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1476 /* We were out of memory - nothing to do */
1482 if (afsd_logp->enabled) {
1483 swprintf( wchBuffer,
1484 L"ProcessRequest Not responding to async Index %08lX",
1485 RequestBuffer->RequestIndex);
1487 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1495 RDR_ReleaseUser(userp);
1498 if( pResultCB && pResultCB != &stResultCB)
1508 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1509 DWORD dwResultBufferLength)
1511 WCHAR wchBuffer[1024];
1512 DWORD bytesReturned;
1515 if (1 || afsd_logp->enabled) {
1516 if (pSetFileExtentsResultCB->ResultStatus != 0)
1517 swprintf( wchBuffer,
1518 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1519 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1521 swprintf( wchBuffer,
1522 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1523 pSetFileExtentsResultCB->ExtentCount);
1525 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1528 if( !RDR_DeviceIoControl( glDevHandle,
1529 IOCTL_AFS_SET_FILE_EXTENTS,
1530 (void *)pSetFileExtentsResultCB,
1531 dwResultBufferLength,
1536 gle = GetLastError();
1545 RDR_SetFileStatus( cm_fid_t *fidp,
1549 WCHAR wchBuffer[1024];
1550 AFSExtentFailureCB SetFileStatusCB;
1551 DWORD bytesReturned;
1554 RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
1555 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1556 SetFileStatusCB.FailureStatus = dwStatus;
1558 if (afsd_logp->enabled) {
1559 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1560 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1561 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1564 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1567 if( !RDR_DeviceIoControl( glDevHandle,
1568 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1569 (void *)&SetFileStatusCB,
1570 sizeof(AFSExtentFailureCB),
1575 gle = GetLastError();
1583 RDR_SetFileStatus2( AFSFileID *pFileId,
1587 WCHAR wchBuffer[1024];
1588 AFSExtentFailureCB SetFileStatusCB;
1589 DWORD bytesReturned;
1592 memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
1593 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1594 SetFileStatusCB.FailureStatus = dwStatus;
1596 if (afsd_logp->enabled) {
1597 swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1598 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1599 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1602 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1605 if( !RDR_DeviceIoControl( glDevHandle,
1606 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1607 (void *)&SetFileStatusCB,
1608 sizeof(AFSExtentFailureCB),
1613 gle = GetLastError();
1621 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1624 HANDLE hDevHandle = NULL;
1625 DWORD bytesReturned;
1626 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1627 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1628 DWORD requestBufferLen, responseBufferLen;
1629 bool bError = false;
1631 WCHAR wchBuffer[256];
1635 if (afsd_logp->enabled) {
1636 swprintf( wchBuffer,
1637 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1639 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1642 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1643 return CM_ERROR_WOULDBLOCK;
1646 if (afsd_logp->enabled) {
1647 swprintf( wchBuffer,
1648 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1651 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1655 // We use the global handle to the control device instance
1658 hDevHandle = glDevHandle;
1661 // Allocate a request buffer.
1664 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1665 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1666 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1667 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1670 if( requestBuffer && responseBuffer)
1673 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1674 memset( responseBuffer, '\0', responseBufferLen);
1676 // If there is a FID provided, use it
1677 if (fidp && extentList)
1679 RDR_fid2FID( fidp, &requestBuffer->FileId);
1681 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1683 requestBuffer->Flags = 0;
1686 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1689 // Set the number of extents to be freed
1690 // Leave the rest of the structure as zeros to indicate free anything
1691 requestBuffer->ExtentCount = numOfExtents;
1693 requestBuffer->HeldExtentCount = numOfHeldExtents;
1695 if( !RDR_DeviceIoControl( hDevHandle,
1696 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1697 (void *)requestBuffer,
1699 (void *)responseBuffer,
1704 // Error condition back from driver
1706 if (afsd_logp->enabled) {
1707 gle = GetLastError();
1708 swprintf( wchBuffer,
1709 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1710 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1717 // Go process the request
1720 if (afsd_logp->enabled) {
1721 swprintf( wchBuffer,
1722 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1723 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1724 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1727 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1735 free( requestBuffer);
1737 free( responseBuffer);
1744 RDR_NetworkStatus(BOOLEAN status)
1747 HANDLE hDevHandle = NULL;
1748 DWORD bytesReturned;
1749 AFSNetworkStatusCB *requestBuffer = NULL;
1751 WCHAR wchBuffer[256];
1754 if (afsd_logp->enabled) {
1755 swprintf( wchBuffer,
1756 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1759 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1763 // We use the global handle to the control device instance
1766 hDevHandle = glDevHandle;
1769 // Allocate a request buffer.
1772 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1778 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1780 // Set the number of extents to be freed
1781 // Leave the rest of the structure as zeros to indicate free anything
1782 requestBuffer->Online = status;
1784 if( !RDR_DeviceIoControl( hDevHandle,
1785 IOCTL_AFS_NETWORK_STATUS,
1786 (void *)requestBuffer,
1787 sizeof( AFSNetworkStatusCB),
1793 // Error condition back from driver
1795 if (afsd_logp->enabled) {
1796 gle = GetLastError();
1797 swprintf( wchBuffer,
1798 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1800 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1811 free( requestBuffer);
1819 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1822 HANDLE hDevHandle = NULL;
1823 DWORD bytesReturned;
1824 AFSVolumeStatusCB *requestBuffer = NULL;
1826 WCHAR wchBuffer[256];
1829 if (afsd_logp->enabled) {
1830 swprintf( wchBuffer,
1831 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1832 cellID, volID, online);
1834 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1838 // We use the global handle to the control device instance
1841 hDevHandle = glDevHandle;
1844 // Allocate a request buffer.
1847 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1853 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1855 requestBuffer->FileID.Cell = cellID;
1856 requestBuffer->FileID.Volume = volID;
1857 requestBuffer->Online = online;
1859 if( !RDR_DeviceIoControl( hDevHandle,
1860 IOCTL_AFS_VOLUME_STATUS,
1861 (void *)requestBuffer,
1862 sizeof( AFSVolumeStatusCB),
1868 // Error condition back from driver
1871 if (afsd_logp->enabled) {
1872 gle = GetLastError();
1873 swprintf( wchBuffer,
1874 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1875 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1886 free( requestBuffer);
1892 RDR_NetworkAddrChange(void)
1899 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1902 HANDLE hDevHandle = NULL;
1903 DWORD bytesReturned;
1904 AFSInvalidateCacheCB *requestBuffer = NULL;
1906 WCHAR wchBuffer[256];
1909 if (afsd_logp->enabled) {
1910 swprintf( wchBuffer,
1911 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1912 cellID, volID, reason);
1914 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1918 // We use the global handle to the control device instance
1921 hDevHandle = glDevHandle;
1924 // Allocate a request buffer.
1927 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1933 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1935 requestBuffer->FileID.Cell = cellID;
1936 requestBuffer->FileID.Volume = volID;
1937 requestBuffer->WholeVolume = TRUE;
1938 requestBuffer->Reason = reason;
1940 if( !RDR_DeviceIoControl( hDevHandle,
1941 IOCTL_AFS_INVALIDATE_CACHE,
1942 (void *)requestBuffer,
1943 sizeof( AFSInvalidateCacheCB),
1949 // Error condition back from driver
1952 if (afsd_logp->enabled) {
1953 gle = GetLastError();
1954 swprintf( wchBuffer,
1955 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
1956 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1967 free( requestBuffer);
1974 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
1977 HANDLE hDevHandle = NULL;
1978 DWORD bytesReturned;
1979 AFSInvalidateCacheCB *requestBuffer = NULL;
1981 WCHAR wchBuffer[256];
1984 if (afsd_logp->enabled) {
1985 swprintf( wchBuffer,
1986 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",
1987 cellID, volID, vnode, uniq, hash, fileType, reason);
1989 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1993 // We use the global handle to the control device instance
1996 hDevHandle = glDevHandle;
1999 // Allocate a request buffer.
2002 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
2008 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
2010 requestBuffer->FileID.Cell = cellID;
2011 requestBuffer->FileID.Volume = volID;
2012 requestBuffer->FileID.Vnode = vnode;
2013 requestBuffer->FileID.Unique = uniq;
2014 requestBuffer->FileID.Hash = hash;
2015 requestBuffer->FileType = fileType;
2016 requestBuffer->WholeVolume = FALSE;
2017 requestBuffer->Reason = reason;
2019 if( !RDR_DeviceIoControl( hDevHandle,
2020 IOCTL_AFS_INVALIDATE_CACHE,
2021 (void *)requestBuffer,
2022 sizeof( AFSInvalidateCacheCB),
2028 // Error condition back from driver
2030 if (afsd_logp->enabled) {
2031 gle = GetLastError();
2032 swprintf( wchBuffer,
2033 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
2034 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2045 free( requestBuffer);
2053 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
2056 HANDLE hDevHandle = NULL;
2057 DWORD bytesReturned;
2058 AFSSysNameNotificationCB *requestBuffer = NULL;
2060 WCHAR wchBuffer[256];
2064 if (afsd_logp->enabled) {
2065 swprintf( wchBuffer,
2066 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
2067 Architecture, Count);
2069 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2072 if (Count <= 0 || NameList == NULL)
2076 // We use the global handle to the control device instance
2079 hDevHandle = glDevHandle;
2082 // Allocate a request buffer.
2085 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2086 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2093 memset( requestBuffer, '\0', Length);
2095 requestBuffer->Architecture = Architecture;
2096 requestBuffer->NumberOfNames = Count;
2097 for ( i=0 ; i<Count; i++) {
2098 size_t len = wcslen(NameList[i]);
2099 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2100 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2104 if( !RDR_DeviceIoControl( hDevHandle,
2105 IOCTL_AFS_SYSNAME_NOTIFICATION,
2106 (void *)requestBuffer,
2113 // Error condition back from driver
2115 if (afsd_logp->enabled) {
2116 gle = GetLastError();
2117 swprintf( wchBuffer,
2118 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2119 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2130 free( requestBuffer);
2138 ResetEvent( RDR_SuspendEvent);
2144 SetEvent( RDR_SuspendEvent);