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 #include <afsconfig.h>
34 #include <afs/param.h>
39 #define _WIN32_WINNT 0x0500
41 #define _CRT_SECURE_NO_DEPRECATE
42 #define _CRT_NON_CONFORMING_SWPRINTFS
44 #define STRSAFE_NO_DEPRECATE
47 #define WIN32_NO_STATUS
49 typedef LONG NTSTATUS, *PNTSTATUS; // not declared in ntstatus.h
60 #include "..\\Common\\AFSUserDefines.h"
61 #include "..\\Common\\AFSUserIoctl.h"
62 #include "..\\Common\\AFSUserStructs.h"
66 extern osi_log_t *afsd_logp;
68 #include <WINNT/afsreg.h>
69 #include <afs/cm_config.h>
70 #include <afs/cm_error.h>
72 #include <RDRPrototypes.h>
75 RDR_SetFileStatus2( AFSFileID * pFileId,
80 #define FlagOn(_F,_SF) ((_F) & (_SF))
84 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
88 #define SetFlag(_F,_SF) ((_F) |= (_SF))
92 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
95 #define QuadAlign(Ptr) ( \
96 ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
99 #define MIN_WORKER_THREADS 5
100 #define MAX_WORKER_THREADS 512
102 typedef struct _worker_thread_info {
112 WorkerThreadInfo glWorkerThreadInfo[ MAX_WORKER_THREADS];
114 UINT glThreadHandleIndex = 0;
116 HANDLE glDevHandle = INVALID_HANDLE_VALUE;
118 static DWORD Exit = false;
120 static DWORD ExitPending = false;
124 extern "C" wchar_t RDR_UNCName[64]=L"AFS";
126 HANDLE RDR_SuspendEvent = INVALID_HANDLE_VALUE;
128 /* returns 0 on success */
136 DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
138 // Initialize the Suspend Event
139 RDR_SuspendEvent = CreateEvent( NULL,
140 TRUE, // manual reset event
144 dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
145 0, KEY_QUERY_VALUE, &parmKey);
146 if (dwRet == ERROR_SUCCESS) {
147 dummyLen = sizeof(numSvThreads);
148 dwRet = RegQueryValueEx(parmKey, TEXT("ServerThreads"), NULL, NULL,
149 (BYTE *) &numSvThreads, &dummyLen);
151 dummyLen = sizeof(RDR_UNCName);
152 dwRet = RegQueryValueExW(parmKey, L"NetbiosName", NULL, NULL,
153 (BYTE *) RDR_UNCName, &dummyLen);
155 RegCloseKey (parmKey);
158 // Initialize the Thread local storage index for the overlapped i/o
160 dwOvEvIdx = TlsAlloc();
165 // Launch our workers down to the
166 // filters control device for processing requests
169 dwRet = RDR_ProcessWorkerThreads(numSvThreads);
171 if (dwRet == ERROR_SUCCESS) {
180 BOOL RDR_DeviceIoControl( HANDLE hDevice,
181 DWORD dwIoControlCode,
185 DWORD nOutBufferSize,
186 LPDWORD lpBytesReturned )
193 ZeroMemory(&ov, sizeof(OVERLAPPED));
195 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
196 if (hEvent == NULL) {
197 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
198 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
200 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
205 *lpBytesReturned = 0;
207 rc = DeviceIoControl( hDevice,
216 gle = GetLastError();
218 if ( gle == ERROR_IO_PENDING )
219 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
226 RDR_ShutdownFinal(void)
234 // Close all the worker thread handles
237 while( dwIndex < glThreadHandleIndex)
240 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
245 if( glDevHandle != INVALID_HANDLE_VALUE)
248 CloseHandle( glDevHandle);
255 RDR_ShutdownNotify(void)
258 HANDLE hDevHandle = NULL;
262 // We use the global handle to the control device instance
265 hDevHandle = glDevHandle;
269 // First, notify the file system driver that
270 // we are shutting down.
275 if( !RDR_DeviceIoControl( hDevHandle,
283 // log the error, nothing to do
294 // Here we launch the worker threads for the given volume
298 RDR_ProcessWorkerThreads(DWORD numThreads)
303 DWORD bytesReturned = 0;
304 DWORD dwRedirInitInfo;
305 AFSRedirectorInitInfo * redirInitInfo = NULL;
308 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
311 glDevHandle = CreateFile( AFS_SYMLINK_W,
312 GENERIC_READ | GENERIC_WRITE,
313 FILE_SHARE_READ | FILE_SHARE_WRITE,
316 FILE_FLAG_OVERLAPPED,
319 if( glDevHandle == INVALID_HANDLE_VALUE)
322 return GetLastError();
326 // Now call down to initialize the pool.
329 if( !RDR_DeviceIoControl( glDevHandle,
330 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
338 CloseHandle( glDevHandle);
344 return GetLastError();
348 // OK, now launch the workers
351 hEvent = CreateEvent( NULL,
357 // Here we create a pool of worker threads but you can create the pool with as many requests
361 if (numThreads < MIN_WORKER_THREADS)
362 numThreads = MIN_WORKER_THREADS;
363 else if (numThreads > MAX_WORKER_THREADS)
364 numThreads = MAX_WORKER_THREADS;
366 for (index = 0; index < numThreads; index++)
369 // 20% of worker threads should be reserved for release extent
372 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
373 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
374 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
375 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
378 RDR_RequestWorkerThread,
379 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
383 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
387 // Wait for the thread to signal it is ready for processing
390 WaitForSingleObject( hEvent,
393 glThreadHandleIndex++;
401 // Perform cleanup specific to your application
407 if( !RDR_DeviceIoControl( glDevHandle,
408 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
416 CloseHandle( glDevHandle);
422 return GetLastError();
431 // Entry point for the worker thread
436 RDR_RequestWorkerThread( LPVOID lpParameter)
439 HANDLE hDevHandle = NULL;
441 AFSCommRequest *requestBuffer;
443 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
446 // We use the global handle to the control device instance
449 hDevHandle = glDevHandle;
452 // Allocate a request buffer.
455 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
461 // Here we simply signal back to the main thread that we ahve started
464 SetEvent( pInfo->hEvent);
467 // Process requests until we are told to stop
473 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
475 requestBuffer->RequestFlags = pInfo->Flags;
477 if( RDR_DeviceIoControl( hDevHandle,
478 IOCTL_AFS_PROCESS_IRP_REQUEST,
479 (void *)requestBuffer,
480 sizeof( AFSCommRequest),
481 (void *)requestBuffer,
482 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
486 WaitForSingleObject( RDR_SuspendEvent, INFINITE);
489 // Go process the request
493 RDR_ProcessRequest( requestBuffer);
498 if (afsd_logp->enabled) {
499 WCHAR wchBuffer[256];
500 DWORD gle = GetLastError();
503 L"Failed to post IOCTL_AFS_IRP_REQUEST gle 0x%x", gle);
504 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
509 free( requestBuffer);
518 // This is the entry point for the worker threads to process the request from the TC Filter driver
522 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
528 ULONG ulCreateFlags = 0;
529 AFSCommResult * pResultCB = NULL;
530 AFSCommResult stResultCB;
531 DWORD dwResultBufferLength = 0;
532 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
533 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
534 WCHAR wchBuffer[1024];
535 char *pBuffer = (char *)wchBuffer;
537 cm_user_t * userp = NULL;
538 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
539 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
540 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
541 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
542 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
543 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
544 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
546 BOOL bUnsupported = FALSE;
547 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
549 userp = RDR_UserFromCommRequest(RequestBuffer);
553 // Build up the string to display based on the request type.
556 switch( RequestBuffer->RequestType)
559 case AFS_REQUEST_TYPE_DIR_ENUM:
562 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
564 if (afsd_logp->enabled) {
566 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
567 RequestBuffer->RequestIndex);
569 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
573 // Here is where the content of the specific directory is enumerated.
576 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
577 pQueryCB, bWow64, bFast,
578 RequestBuffer->ResultBufferLength,
583 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
585 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
587 if (afsd_logp->enabled) {
589 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
590 RequestBuffer->RequestIndex);
592 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
595 // Here is where the specified node is evaluated.
598 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
599 RequestBuffer->FileId,
600 bWow64, bFast, bHoldFid,
601 RequestBuffer->ResultBufferLength,
606 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
608 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
610 if (afsd_logp->enabled) {
612 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
613 RequestBuffer->RequestIndex);
615 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
618 // Here is where the specified node is evaluated.
621 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
623 RequestBuffer->NameLength,
624 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
625 bWow64, bFast, bHoldFid,
626 RequestBuffer->ResultBufferLength,
631 case AFS_REQUEST_TYPE_CREATE_FILE:
634 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
636 WCHAR wchFileName[ 256];
638 if (afsd_logp->enabled) {
639 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
643 RequestBuffer->NameLength);
645 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
646 RequestBuffer->RequestIndex, wchFileName);
648 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
651 RDR_CreateFileEntry( userp,
653 RequestBuffer->NameLength,
657 RequestBuffer->ResultBufferLength,
663 case AFS_REQUEST_TYPE_UPDATE_FILE:
666 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
668 if (afsd_logp->enabled) {
669 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
670 RequestBuffer->RequestIndex,
671 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
672 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
674 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
677 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
680 RequestBuffer->ResultBufferLength,
686 case AFS_REQUEST_TYPE_DELETE_FILE:
689 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
691 if (afsd_logp->enabled) {
692 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
693 RequestBuffer->RequestIndex,
694 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
695 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
698 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
701 RDR_DeleteFileEntry( userp,
703 pDeleteCB->ProcessId,
705 RequestBuffer->NameLength,
708 RequestBuffer->ResultBufferLength,
714 case AFS_REQUEST_TYPE_RENAME_FILE:
717 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
719 if (afsd_logp->enabled) {
720 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
721 RequestBuffer->RequestIndex,
722 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
723 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
724 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
726 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
729 RDR_RenameFileEntry( userp,
731 RequestBuffer->NameLength,
732 RequestBuffer->FileId,
735 RequestBuffer->ResultBufferLength,
741 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
744 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
746 if (afsd_logp->enabled) {
747 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
748 RequestBuffer->RequestIndex,
749 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
750 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
751 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
753 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
756 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
757 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
760 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
761 pFileRequestExtentsCB,
763 &dwResultBufferLength,
764 &SetFileExtentsResultCB );
768 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
771 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
773 if (afsd_logp->enabled) {
774 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX",
775 RequestBuffer->RequestIndex,
776 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
777 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
779 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
782 RDR_ReleaseFileExtents( userp, RequestBuffer->FileId,
783 pFileReleaseExtentsCB,
785 RequestBuffer->ResultBufferLength,
791 case AFS_REQUEST_TYPE_FLUSH_FILE:
793 if (afsd_logp->enabled) {
794 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
795 RequestBuffer->RequestIndex,
796 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
797 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
799 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
802 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
804 RequestBuffer->ResultBufferLength,
809 case AFS_REQUEST_TYPE_OPEN_FILE:
811 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
813 if (afsd_logp->enabled) {
814 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
815 RequestBuffer->RequestIndex,
816 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
817 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
819 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
822 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
826 RequestBuffer->ResultBufferLength,
832 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
834 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
836 if (afsd_logp->enabled) {
837 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
838 RequestBuffer->RequestIndex,
839 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
840 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
842 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
845 RDR_ReleaseFileAccess( userp,
846 RequestBuffer->FileId,
847 pFileAccessReleaseCB,
849 RequestBuffer->ResultBufferLength,
855 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
857 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
859 if (afsd_logp->enabled) {
860 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
861 RequestBuffer->RequestIndex,
862 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
863 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
865 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
868 RDR_PioctlOpen( userp,
869 RequestBuffer->FileId,
872 RequestBuffer->ResultBufferLength,
877 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
879 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
881 if (afsd_logp->enabled) {
882 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
883 RequestBuffer->RequestIndex,
884 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
885 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
887 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
890 RDR_PioctlWrite( userp,
891 RequestBuffer->FileId,
894 RequestBuffer->ResultBufferLength,
899 case AFS_REQUEST_TYPE_PIOCTL_READ:
901 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
903 if (afsd_logp->enabled) {
904 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
905 RequestBuffer->RequestIndex,
906 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
907 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
909 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
912 RDR_PioctlRead( userp,
913 RequestBuffer->FileId,
917 RequestBuffer->ResultBufferLength,
922 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
924 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
926 if (afsd_logp->enabled) {
927 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
928 RequestBuffer->RequestIndex,
929 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
930 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
932 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
935 RDR_PioctlClose( userp,
936 RequestBuffer->FileId,
939 RequestBuffer->ResultBufferLength,
945 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
947 if (afsd_logp->enabled) {
948 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
949 RequestBuffer->RequestIndex,
950 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
951 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
952 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
954 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
957 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
959 RDR_ByteRangeLockSync( userp,
960 RequestBuffer->FileId,
963 RequestBuffer->ResultBufferLength,
969 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
971 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
973 if (afsd_logp->enabled) {
974 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
975 RequestBuffer->RequestIndex,
976 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
977 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
979 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
982 RDR_ByteRangeUnlock( userp,
983 RequestBuffer->FileId,
986 RequestBuffer->ResultBufferLength,
991 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
993 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
995 if (afsd_logp->enabled) {
996 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
997 RequestBuffer->RequestIndex,
998 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
999 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1001 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1004 RDR_ByteRangeUnlockAll( userp,
1005 RequestBuffer->FileId,
1008 RequestBuffer->ResultBufferLength,
1013 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
1015 if (afsd_logp->enabled) {
1016 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1017 RequestBuffer->RequestIndex,
1018 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1019 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1021 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1024 RDR_GetVolumeInfo( userp,
1025 RequestBuffer->FileId,
1027 RequestBuffer->ResultBufferLength,
1032 case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
1034 if (afsd_logp->enabled) {
1035 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1036 RequestBuffer->RequestIndex,
1037 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1038 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1040 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1043 RDR_GetVolumeSizeInfo( userp,
1044 RequestBuffer->FileId,
1046 RequestBuffer->ResultBufferLength,
1051 case AFS_REQUEST_TYPE_HOLD_FID:
1054 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1056 if (afsd_logp->enabled) {
1057 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1058 RequestBuffer->RequestIndex);
1060 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1066 RequestBuffer->ResultBufferLength,
1072 case AFS_REQUEST_TYPE_RELEASE_FID:
1075 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1077 if (afsd_logp->enabled) {
1078 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1079 RequestBuffer->RequestIndex);
1081 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1084 RDR_ReleaseFid( userp,
1087 RequestBuffer->ResultBufferLength,
1093 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1096 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1098 if (afsd_logp->enabled) {
1099 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1100 RequestBuffer->RequestIndex,
1101 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1102 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1104 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1107 RDR_CleanupFileEntry( userp,
1108 RequestBuffer->FileId,
1109 RequestBuffer->Name,
1110 RequestBuffer->NameLength,
1116 RequestBuffer->ResultBufferLength,
1122 case AFS_REQUEST_TYPE_PIPE_OPEN:
1124 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1126 if (afsd_logp->enabled) {
1127 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1128 RequestBuffer->RequestIndex,
1129 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1130 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1132 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1135 RDR_PipeOpen( userp,
1136 RequestBuffer->FileId,
1137 RequestBuffer->Name,
1138 RequestBuffer->NameLength,
1141 RequestBuffer->ResultBufferLength,
1146 case AFS_REQUEST_TYPE_PIPE_WRITE:
1148 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1149 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1151 if (afsd_logp->enabled) {
1152 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1153 RequestBuffer->RequestIndex,
1154 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1155 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1157 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1160 RDR_PipeWrite( userp,
1161 RequestBuffer->FileId,
1165 RequestBuffer->ResultBufferLength,
1170 case AFS_REQUEST_TYPE_PIPE_READ:
1172 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1174 if (afsd_logp->enabled) {
1175 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1176 RequestBuffer->RequestIndex,
1177 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1178 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1180 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1183 RDR_PipeRead( userp,
1184 RequestBuffer->FileId,
1187 RequestBuffer->ResultBufferLength,
1192 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1194 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1196 if (afsd_logp->enabled) {
1197 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1198 RequestBuffer->RequestIndex,
1199 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1200 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1202 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1205 RDR_PipeClose( userp,
1206 RequestBuffer->FileId,
1209 RequestBuffer->ResultBufferLength,
1215 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1217 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1218 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1220 if (afsd_logp->enabled) {
1221 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1222 RequestBuffer->RequestIndex);
1224 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1227 RDR_PipeTransceive( userp,
1228 RequestBuffer->FileId,
1232 RequestBuffer->ResultBufferLength,
1237 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1239 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1241 if (afsd_logp->enabled) {
1242 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1243 RequestBuffer->RequestIndex);
1245 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1248 RDR_PipeQueryInfo( userp,
1249 RequestBuffer->FileId,
1252 RequestBuffer->ResultBufferLength,
1257 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1259 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1260 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1262 if (afsd_logp->enabled) {
1263 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1264 RequestBuffer->RequestIndex);
1266 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1269 RDR_PipeSetInfo( userp,
1270 RequestBuffer->FileId,
1274 RequestBuffer->ResultBufferLength,
1281 bUnsupported = TRUE;
1283 if (afsd_logp->enabled) {
1284 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1285 RequestBuffer->RequestType,
1286 RequestBuffer->RequestIndex);
1288 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1294 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1296 if (pResultCB == NULL) {
1297 // We failed probably due to a memory allocation error
1298 // unless the unsupported flag was set.
1299 pResultCB = &stResultCB;
1300 memset(&stResultCB, 0, sizeof(stResultCB));
1302 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1304 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1308 // This is how the filter associates the response information passed in the IOCtl below to the
1309 // original call. This request index is setup by the filter and should not be modified, otherwise the
1310 // filter will not be able to locate the request in its internal queue and the blocking thread will
1314 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1316 if (afsd_logp->enabled) {
1317 swprintf( wchBuffer,
1318 L"ProcessRequest Responding to Index %08lX Length %08lX",
1319 pResultCB->RequestIndex,
1320 pResultCB->ResultBufferLength);
1322 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1326 // Now post the result back to the driver.
1329 if( !RDR_DeviceIoControl( glDevHandle,
1330 IOCTL_AFS_PROCESS_IRP_RESULT,
1332 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1337 char *pBuffer = (char *)wchBuffer;
1338 gle = GetLastError();
1339 if (afsd_logp->enabled) {
1340 swprintf( wchBuffer,
1341 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1342 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1345 if (gle != ERROR_NOT_READY) {
1347 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1349 osi_panic(pBuffer, __FILE__, __LINE__);
1354 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1356 if (SetFileExtentsResultCB) {
1358 if (1 || afsd_logp->enabled) {
1359 if (SetFileExtentsResultCB->ResultStatus != 0)
1360 swprintf( wchBuffer,
1361 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1362 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1364 swprintf( wchBuffer,
1365 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1366 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1368 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1371 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1372 SetFileExtentsResultCB->ResultStatus != 0) &&
1373 !RDR_DeviceIoControl( glDevHandle,
1374 IOCTL_AFS_SET_FILE_EXTENTS,
1375 (void *)SetFileExtentsResultCB,
1376 dwResultBufferLength,
1381 gle = GetLastError();
1382 if (afsd_logp->enabled) {
1383 swprintf( wchBuffer,
1384 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1386 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1389 // The file system returns an error when it can't find the FID
1390 // This is a bug in the file system but we should try to avoid
1391 // the crash and clean up our own memory space.
1393 // Since we couldn't deliver the extents to the file system
1394 // we should release them.
1395 if ( SetFileExtentsResultCB->ExtentCount != 0)
1397 RDR_ReleaseFailedSetFileExtents( userp,
1398 SetFileExtentsResultCB,
1399 dwResultBufferLength);
1402 if (gle != ERROR_GEN_FAILURE &&
1403 gle != ERROR_NOT_READY) {
1405 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1407 osi_panic(pBuffer, __FILE__, __LINE__);
1411 free(SetFileExtentsResultCB);
1414 /* Must be out of memory */
1415 if (afsd_logp->enabled) {
1416 swprintf( wchBuffer,
1417 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1418 RequestBuffer->RequestIndex);
1420 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1423 RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
1426 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1428 if (afsd_logp->enabled) {
1429 swprintf( wchBuffer,
1430 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1431 RequestBuffer->RequestIndex);
1433 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1437 if (SetByteRangeLockResultCB) {
1439 if( !RDR_DeviceIoControl( glDevHandle,
1440 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1441 (void *)SetByteRangeLockResultCB,
1442 dwResultBufferLength,
1447 gle = GetLastError();
1449 if (afsd_logp->enabled) {
1450 swprintf( wchBuffer,
1451 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1452 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1456 if (gle != ERROR_NOT_READY) {
1457 // TODO - instead of a panic we should release the locks
1459 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1460 osi_panic(pBuffer, __FILE__, __LINE__);
1464 free(SetByteRangeLockResultCB);
1466 /* Must be out of memory */
1467 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1469 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1470 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1471 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1472 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1474 if( !RDR_DeviceIoControl( glDevHandle,
1475 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1476 (void *)&SetByteRangeLockResultCB,
1477 dwResultBufferLength,
1482 gle = GetLastError();
1484 if (afsd_logp->enabled) {
1485 swprintf( wchBuffer,
1486 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1487 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1490 /* We were out of memory - nothing to do */
1496 if (afsd_logp->enabled) {
1497 swprintf( wchBuffer,
1498 L"ProcessRequest Not responding to async Index %08lX",
1499 RequestBuffer->RequestIndex);
1501 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1509 RDR_ReleaseUser(userp);
1512 if( pResultCB && pResultCB != &stResultCB)
1522 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1523 DWORD dwResultBufferLength)
1525 WCHAR wchBuffer[1024];
1526 DWORD bytesReturned;
1529 if (1 || afsd_logp->enabled) {
1530 if (pSetFileExtentsResultCB->ResultStatus != 0)
1531 swprintf( wchBuffer,
1532 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1533 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1535 swprintf( wchBuffer,
1536 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1537 pSetFileExtentsResultCB->ExtentCount);
1539 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1542 if( !RDR_DeviceIoControl( glDevHandle,
1543 IOCTL_AFS_SET_FILE_EXTENTS,
1544 (void *)pSetFileExtentsResultCB,
1545 dwResultBufferLength,
1550 gle = GetLastError();
1559 RDR_SetFileStatus( cm_fid_t *fidp,
1563 WCHAR wchBuffer[1024];
1564 AFSExtentFailureCB SetFileStatusCB;
1565 DWORD bytesReturned;
1568 RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
1569 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1570 SetFileStatusCB.FailureStatus = dwStatus;
1572 if (afsd_logp->enabled) {
1573 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1574 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1575 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1578 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1581 if( !RDR_DeviceIoControl( glDevHandle,
1582 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1583 (void *)&SetFileStatusCB,
1584 sizeof(AFSExtentFailureCB),
1589 gle = GetLastError();
1597 RDR_SetFileStatus2( AFSFileID *pFileId,
1601 WCHAR wchBuffer[1024];
1602 AFSExtentFailureCB SetFileStatusCB;
1603 DWORD bytesReturned;
1606 memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
1607 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1608 SetFileStatusCB.FailureStatus = dwStatus;
1610 if (afsd_logp->enabled) {
1611 swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1612 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1613 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1616 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1619 if( !RDR_DeviceIoControl( glDevHandle,
1620 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1621 (void *)&SetFileStatusCB,
1622 sizeof(AFSExtentFailureCB),
1627 gle = GetLastError();
1635 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1638 HANDLE hDevHandle = NULL;
1639 DWORD bytesReturned;
1640 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1641 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1642 DWORD requestBufferLen, responseBufferLen;
1643 bool bError = false;
1645 WCHAR wchBuffer[256];
1649 if (afsd_logp->enabled) {
1650 swprintf( wchBuffer,
1651 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1653 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1656 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1657 return CM_ERROR_WOULDBLOCK;
1660 if (afsd_logp->enabled) {
1661 swprintf( wchBuffer,
1662 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1665 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1669 // We use the global handle to the control device instance
1672 hDevHandle = glDevHandle;
1675 // Allocate a request buffer.
1678 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1679 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1680 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1681 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1684 if( requestBuffer && responseBuffer)
1687 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1688 memset( responseBuffer, '\0', responseBufferLen);
1690 // If there is a FID provided, use it
1691 if (fidp && extentList)
1693 RDR_fid2FID( fidp, &requestBuffer->FileId);
1695 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1697 requestBuffer->Flags = 0;
1700 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1703 // Set the number of extents to be freed
1704 // Leave the rest of the structure as zeros to indicate free anything
1705 requestBuffer->ExtentCount = numOfExtents;
1707 requestBuffer->HeldExtentCount = numOfHeldExtents;
1709 if( !RDR_DeviceIoControl( hDevHandle,
1710 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1711 (void *)requestBuffer,
1713 (void *)responseBuffer,
1718 // Error condition back from driver
1720 if (afsd_logp->enabled) {
1721 gle = GetLastError();
1722 swprintf( wchBuffer,
1723 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1724 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1731 // Go process the request
1734 if (afsd_logp->enabled) {
1735 swprintf( wchBuffer,
1736 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1737 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1738 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1741 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1749 free( requestBuffer);
1751 free( responseBuffer);
1758 RDR_NetworkStatus(BOOLEAN status)
1761 HANDLE hDevHandle = NULL;
1762 DWORD bytesReturned;
1763 AFSNetworkStatusCB *requestBuffer = NULL;
1765 WCHAR wchBuffer[256];
1768 if (afsd_logp->enabled) {
1769 swprintf( wchBuffer,
1770 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1773 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1777 // We use the global handle to the control device instance
1780 hDevHandle = glDevHandle;
1783 // Allocate a request buffer.
1786 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1792 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1794 // Set the number of extents to be freed
1795 // Leave the rest of the structure as zeros to indicate free anything
1796 requestBuffer->Online = status;
1798 if( !RDR_DeviceIoControl( hDevHandle,
1799 IOCTL_AFS_NETWORK_STATUS,
1800 (void *)requestBuffer,
1801 sizeof( AFSNetworkStatusCB),
1807 // Error condition back from driver
1809 if (afsd_logp->enabled) {
1810 gle = GetLastError();
1811 swprintf( wchBuffer,
1812 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1814 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1825 free( requestBuffer);
1833 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1836 HANDLE hDevHandle = NULL;
1837 DWORD bytesReturned;
1838 AFSVolumeStatusCB *requestBuffer = NULL;
1840 WCHAR wchBuffer[256];
1843 if (afsd_logp->enabled) {
1844 swprintf( wchBuffer,
1845 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1846 cellID, volID, online);
1848 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1852 // We use the global handle to the control device instance
1855 hDevHandle = glDevHandle;
1858 // Allocate a request buffer.
1861 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1867 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1869 requestBuffer->FileID.Cell = cellID;
1870 requestBuffer->FileID.Volume = volID;
1871 requestBuffer->Online = online;
1873 if( !RDR_DeviceIoControl( hDevHandle,
1874 IOCTL_AFS_VOLUME_STATUS,
1875 (void *)requestBuffer,
1876 sizeof( AFSVolumeStatusCB),
1882 // Error condition back from driver
1885 if (afsd_logp->enabled) {
1886 gle = GetLastError();
1887 swprintf( wchBuffer,
1888 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1889 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1900 free( requestBuffer);
1906 RDR_NetworkAddrChange(void)
1913 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1916 HANDLE hDevHandle = NULL;
1917 DWORD bytesReturned;
1918 AFSInvalidateCacheCB *requestBuffer = NULL;
1920 WCHAR wchBuffer[256];
1923 if (afsd_logp->enabled) {
1924 swprintf( wchBuffer,
1925 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1926 cellID, volID, reason);
1928 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1932 // We use the global handle to the control device instance
1935 hDevHandle = glDevHandle;
1938 // Allocate a request buffer.
1941 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1947 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1949 requestBuffer->FileID.Cell = cellID;
1950 requestBuffer->FileID.Volume = volID;
1951 requestBuffer->WholeVolume = TRUE;
1952 requestBuffer->Reason = reason;
1954 if( !RDR_DeviceIoControl( hDevHandle,
1955 IOCTL_AFS_INVALIDATE_CACHE,
1956 (void *)requestBuffer,
1957 sizeof( AFSInvalidateCacheCB),
1963 // Error condition back from driver
1966 if (afsd_logp->enabled) {
1967 gle = GetLastError();
1968 swprintf( wchBuffer,
1969 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
1970 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1981 free( requestBuffer);
1988 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
1991 HANDLE hDevHandle = NULL;
1992 DWORD bytesReturned;
1993 AFSInvalidateCacheCB *requestBuffer = NULL;
1995 WCHAR wchBuffer[256];
1998 if (afsd_logp->enabled) {
1999 swprintf( wchBuffer,
2000 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",
2001 cellID, volID, vnode, uniq, hash, fileType, reason);
2003 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2007 // We use the global handle to the control device instance
2010 hDevHandle = glDevHandle;
2013 // Allocate a request buffer.
2016 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
2022 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
2024 requestBuffer->FileID.Cell = cellID;
2025 requestBuffer->FileID.Volume = volID;
2026 requestBuffer->FileID.Vnode = vnode;
2027 requestBuffer->FileID.Unique = uniq;
2028 requestBuffer->FileID.Hash = hash;
2029 requestBuffer->FileType = fileType;
2030 requestBuffer->WholeVolume = FALSE;
2031 requestBuffer->Reason = reason;
2033 if( !RDR_DeviceIoControl( hDevHandle,
2034 IOCTL_AFS_INVALIDATE_CACHE,
2035 (void *)requestBuffer,
2036 sizeof( AFSInvalidateCacheCB),
2042 // Error condition back from driver
2044 if (afsd_logp->enabled) {
2045 gle = GetLastError();
2046 swprintf( wchBuffer,
2047 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
2048 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2059 free( requestBuffer);
2067 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
2070 HANDLE hDevHandle = NULL;
2071 DWORD bytesReturned;
2072 AFSSysNameNotificationCB *requestBuffer = NULL;
2074 WCHAR wchBuffer[256];
2078 if (afsd_logp->enabled) {
2079 swprintf( wchBuffer,
2080 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
2081 Architecture, Count);
2083 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2086 if (Count <= 0 || NameList == NULL)
2090 // We use the global handle to the control device instance
2093 hDevHandle = glDevHandle;
2096 // Allocate a request buffer.
2099 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2100 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2107 memset( requestBuffer, '\0', Length);
2109 requestBuffer->Architecture = Architecture;
2110 requestBuffer->NumberOfNames = Count;
2111 for ( i=0 ; i<Count; i++) {
2112 size_t len = wcslen(NameList[i]);
2113 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2114 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2118 if( !RDR_DeviceIoControl( hDevHandle,
2119 IOCTL_AFS_SYSNAME_NOTIFICATION,
2120 (void *)requestBuffer,
2127 // Error condition back from driver
2129 if (afsd_logp->enabled) {
2130 gle = GetLastError();
2131 swprintf( wchBuffer,
2132 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2133 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2144 free( requestBuffer);
2152 ResetEvent( RDR_SuspendEvent);
2158 SetEvent( RDR_SuspendEvent);