2 * Copyright (c) 2008 Secure Endpoints, Inc.
3 * Copyright (c) 2009-2013 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;
67 extern int cm_directIO;
69 #include <WINNT/afsreg.h>
70 #include <afs/cm_config.h>
71 #include <afs/cm_error.h>
72 #include <afs/cm_nls.h>
73 #include <afs/cm_user.h>
75 #include <RDRPrototypes.h>
78 RDR_SetFileStatus2( AFSFileID * pFileId,
83 #define FlagOn(_F,_SF) ((_F) & (_SF))
87 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
91 #define SetFlag(_F,_SF) ((_F) |= (_SF))
95 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
98 #define QuadAlign(Ptr) ( \
99 ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
102 #define MIN_WORKER_THREADS 5
103 #define MAX_WORKER_THREADS 512
105 typedef struct _worker_thread_info {
115 WorkerThreadInfo glWorkerThreadInfo[ MAX_WORKER_THREADS];
117 UINT glThreadHandleIndex = 0;
119 HANDLE glDevHandle = INVALID_HANDLE_VALUE;
121 static DWORD Exit = false;
123 static DWORD ExitPending = false;
127 extern "C" wchar_t RDR_UNCName[64]=L"AFS";
129 HANDLE RDR_SuspendEvent = INVALID_HANDLE_VALUE;
131 /* returns 0 on success */
139 DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
141 // Initialize the Suspend Event
142 RDR_SuspendEvent = CreateEvent( NULL,
143 TRUE, // manual reset event
147 dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
148 0, KEY_QUERY_VALUE, &parmKey);
149 if (dwRet == ERROR_SUCCESS) {
150 dummyLen = sizeof(numSvThreads);
151 dwRet = RegQueryValueEx(parmKey, TEXT("ServerThreads"), NULL, NULL,
152 (BYTE *) &numSvThreads, &dummyLen);
154 dummyLen = sizeof(RDR_UNCName);
155 dwRet = RegQueryValueExW(parmKey, L"NetbiosName", NULL, NULL,
156 (BYTE *) RDR_UNCName, &dummyLen);
158 RegCloseKey (parmKey);
161 // Initialize the Thread local storage index for the overlapped i/o
163 dwOvEvIdx = TlsAlloc();
168 // Launch our workers down to the
169 // filters control device for processing requests
172 dwRet = RDR_ProcessWorkerThreads(numSvThreads);
174 if (dwRet == ERROR_SUCCESS) {
183 BOOL RDR_DeviceIoControl( HANDLE hDevice,
184 DWORD dwIoControlCode,
188 DWORD nOutBufferSize,
189 LPDWORD lpBytesReturned )
196 ZeroMemory(&ov, sizeof(OVERLAPPED));
198 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
199 if (hEvent == NULL) {
200 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
201 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
203 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
208 *lpBytesReturned = 0;
210 rc = DeviceIoControl( hDevice,
219 gle = GetLastError();
221 if ( gle == ERROR_IO_PENDING )
222 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
229 RDR_ShutdownFinal(void)
237 // Close all the worker thread handles
240 while( dwIndex < glThreadHandleIndex)
243 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
248 if( glDevHandle != INVALID_HANDLE_VALUE)
251 CloseHandle( glDevHandle);
258 RDR_ShutdownNotify(void)
261 HANDLE hDevHandle = NULL;
265 // We use the global handle to the control device instance
268 hDevHandle = glDevHandle;
272 // First, notify the file system driver that
273 // we are shutting down.
278 if( !RDR_DeviceIoControl( hDevHandle,
286 // log the error, nothing to do
297 // Here we launch the worker threads for the given volume
301 RDR_ProcessWorkerThreads(DWORD numThreads)
306 DWORD bytesReturned = 0;
307 DWORD dwRedirInitInfo;
308 AFSRedirectorInitInfo * redirInitInfo = NULL;
311 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
314 glDevHandle = CreateFile( AFS_SYMLINK_W,
315 GENERIC_READ | GENERIC_WRITE,
316 FILE_SHARE_READ | FILE_SHARE_WRITE,
319 FILE_FLAG_OVERLAPPED,
322 if( glDevHandle == INVALID_HANDLE_VALUE)
324 dwErr = GetLastError();
332 // Now call down to initialize the pool.
335 if( !RDR_DeviceIoControl( glDevHandle,
336 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
344 dwErr = GetLastError();
346 CloseHandle( glDevHandle);
356 // OK, now launch the workers
359 hEvent = CreateEvent( NULL,
365 // Here we create a pool of worker threads but you can create the pool with as many requests
369 if (numThreads < MIN_WORKER_THREADS)
370 numThreads = MIN_WORKER_THREADS;
371 else if (numThreads > MAX_WORKER_THREADS)
372 numThreads = MAX_WORKER_THREADS;
374 for (index = 0; index < numThreads; index++)
379 // 20% of worker threads should be reserved for release extent
382 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
383 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
387 glWorkerThreadInfo[ glThreadHandleIndex].Flags = 0;
389 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
390 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
393 RDR_RequestWorkerThread,
394 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
398 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
402 // Wait for the thread to signal it is ready for processing
405 WaitForSingleObject( hEvent,
408 glThreadHandleIndex++;
416 // Perform cleanup specific to your application
422 if( !RDR_DeviceIoControl( glDevHandle,
423 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
432 // Must kill off the worker threads we spawned.
437 dwErr = GetLastError();
439 CloseHandle( glDevHandle);
454 // Entry point for the worker thread
459 RDR_RequestWorkerThread( LPVOID lpParameter)
462 HANDLE hDevHandle = NULL;
464 AFSCommRequest *requestBuffer;
466 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
469 // We use the global handle to the control device instance
472 hDevHandle = glDevHandle;
475 // Allocate a request buffer.
478 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
484 // Here we simply signal back to the main thread that we ahve started
487 SetEvent( pInfo->hEvent);
490 // Process requests until we are told to stop
496 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
498 requestBuffer->RequestFlags = pInfo->Flags;
500 if( RDR_DeviceIoControl( hDevHandle,
501 IOCTL_AFS_PROCESS_IRP_REQUEST,
502 (void *)requestBuffer,
503 sizeof( AFSCommRequest),
504 (void *)requestBuffer,
505 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
509 WaitForSingleObject( RDR_SuspendEvent, INFINITE);
512 // Go process the request
516 RDR_ProcessRequest( requestBuffer);
521 if (afsd_logp->enabled) {
522 WCHAR wchBuffer[256];
523 DWORD gle = GetLastError();
526 L"Failed to post IOCTL_AFS_IRP_REQUEST gle 0x%x", gle);
527 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
532 free( requestBuffer);
541 // This is the entry point for the worker threads to process the request from the TC Filter driver
545 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
551 ULONG ulCreateFlags = 0;
552 AFSCommResult * pResultCB = NULL;
553 AFSCommResult stResultCB;
554 DWORD dwResultBufferLength = 0;
555 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
556 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
557 WCHAR wchBuffer[1024];
558 char *pBuffer = (char *)wchBuffer;
560 cm_user_t * userp = NULL;
561 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
562 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
563 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
564 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
565 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
566 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
567 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
568 BOOL bCacheBypass = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CACHE_BYPASS) ? TRUE : FALSE;
570 BOOL bUnsupported = FALSE;
571 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
573 userp = RDR_UserFromCommRequest(RequestBuffer);
577 // Build up the string to display based on the request type.
580 switch( RequestBuffer->RequestType)
583 case AFS_REQUEST_TYPE_DIR_ENUM:
586 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
588 if (afsd_logp->enabled) {
590 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
591 RequestBuffer->RequestIndex);
593 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
597 // Here is where the content of the specific directory is enumerated.
600 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
601 pQueryCB, bWow64, bFast,
602 RequestBuffer->ResultBufferLength,
607 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
609 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
611 if (afsd_logp->enabled) {
613 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
614 RequestBuffer->RequestIndex);
616 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
619 // Here is where the specified node is evaluated.
622 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
623 RequestBuffer->FileId,
624 bWow64, bFast, bHoldFid,
625 RequestBuffer->ResultBufferLength,
630 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
632 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
634 if (afsd_logp->enabled) {
636 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
637 RequestBuffer->RequestIndex);
639 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
642 // Here is where the specified node is evaluated.
645 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
647 RequestBuffer->NameLength,
648 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
649 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_LAST_COMPONENT ? TRUE : FALSE,
650 bWow64, bFast, bHoldFid,
651 RequestBuffer->ResultBufferLength,
656 case AFS_REQUEST_TYPE_CREATE_FILE:
659 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
661 WCHAR wchFileName[ 256];
663 if (afsd_logp->enabled) {
664 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
668 RequestBuffer->NameLength);
670 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
671 RequestBuffer->RequestIndex, wchFileName);
673 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
676 RDR_CreateFileEntry( userp,
678 RequestBuffer->NameLength,
682 RequestBuffer->ResultBufferLength,
688 case AFS_REQUEST_TYPE_UPDATE_FILE:
691 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
693 if (afsd_logp->enabled) {
694 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
695 RequestBuffer->RequestIndex,
696 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
697 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
699 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
702 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
705 RequestBuffer->ResultBufferLength,
711 case AFS_REQUEST_TYPE_DELETE_FILE:
714 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
716 if (afsd_logp->enabled) {
717 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
718 RequestBuffer->RequestIndex,
719 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
720 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
723 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
726 RDR_DeleteFileEntry( userp,
728 pDeleteCB->ProcessId,
730 RequestBuffer->NameLength,
733 RequestBuffer->ResultBufferLength,
739 case AFS_REQUEST_TYPE_RENAME_FILE:
742 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
744 if (afsd_logp->enabled) {
745 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S TargetLength %08lX Target %*S",
746 RequestBuffer->RequestIndex,
747 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
748 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
749 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
750 pFileRenameCB->TargetNameLength, (int)pFileRenameCB->TargetNameLength, pFileRenameCB->TargetName);
752 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
755 RDR_RenameFileEntry( userp,
757 RequestBuffer->NameLength,
758 RequestBuffer->FileId,
761 RequestBuffer->ResultBufferLength,
767 case AFS_REQUEST_TYPE_HARDLINK_FILE:
770 AFSFileHardLinkCB *pFileHardLinkCB = (AFSFileHardLinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
772 if (afsd_logp->enabled) {
773 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HARDLINK_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S TargetLength %08lX Target %*S",
774 RequestBuffer->RequestIndex,
775 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
776 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
777 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
778 pFileHardLinkCB->TargetNameLength, (int)pFileHardLinkCB->TargetNameLength, pFileHardLinkCB->TargetName);
780 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
783 RDR_HardLinkFileEntry( userp,
785 RequestBuffer->NameLength,
786 RequestBuffer->FileId,
789 RequestBuffer->ResultBufferLength,
795 case AFS_REQUEST_TYPE_CREATE_SYMLINK:
798 AFSCreateSymlinkCB *pCreateSymlinkCB = (AFSCreateSymlinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
800 WCHAR wchFileName[ 256];
802 if (afsd_logp->enabled) {
803 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
807 RequestBuffer->NameLength);
809 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_SYMLINK Index %08lX File %S",
810 RequestBuffer->RequestIndex, wchFileName);
812 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
815 RDR_CreateSymlinkEntry( userp,
816 RequestBuffer->FileId,
818 RequestBuffer->NameLength,
821 RequestBuffer->ResultBufferLength,
827 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
830 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
832 if (afsd_logp->enabled) {
833 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
834 RequestBuffer->RequestIndex,
835 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
836 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
837 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
839 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
842 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
843 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
846 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
847 pFileRequestExtentsCB,
849 &dwResultBufferLength,
850 &SetFileExtentsResultCB );
854 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
857 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
859 if (afsd_logp->enabled) {
860 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %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_ReleaseFileExtents( userp, RequestBuffer->FileId,
869 pFileReleaseExtentsCB,
871 RequestBuffer->ResultBufferLength,
877 case AFS_REQUEST_TYPE_FLUSH_FILE:
879 if (afsd_logp->enabled) {
880 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
881 RequestBuffer->RequestIndex,
882 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
883 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
885 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
888 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
890 RequestBuffer->ResultBufferLength,
895 case AFS_REQUEST_TYPE_OPEN_FILE:
897 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
899 if (afsd_logp->enabled) {
900 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
901 RequestBuffer->RequestIndex,
902 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
903 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
905 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
908 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
912 RequestBuffer->ResultBufferLength,
918 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
920 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
922 if (afsd_logp->enabled) {
923 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
924 RequestBuffer->RequestIndex,
925 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
926 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
928 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
931 RDR_ReleaseFileAccess( userp,
932 RequestBuffer->FileId,
933 pFileAccessReleaseCB,
935 RequestBuffer->ResultBufferLength,
941 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
943 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
945 if (afsd_logp->enabled) {
946 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
947 RequestBuffer->RequestIndex,
948 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
949 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
951 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
954 RDR_PioctlOpen( userp,
955 RequestBuffer->FileId,
958 RequestBuffer->ResultBufferLength,
963 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
965 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
967 if (afsd_logp->enabled) {
968 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
969 RequestBuffer->RequestIndex,
970 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
971 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
973 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
976 RDR_PioctlWrite( userp,
977 RequestBuffer->FileId,
980 RequestBuffer->ResultBufferLength,
985 case AFS_REQUEST_TYPE_PIOCTL_READ:
987 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
989 if (afsd_logp->enabled) {
990 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
991 RequestBuffer->RequestIndex,
992 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
993 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
995 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
998 RDR_PioctlRead( userp,
999 RequestBuffer->FileId,
1003 RequestBuffer->ResultBufferLength,
1008 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
1010 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1012 if (afsd_logp->enabled) {
1013 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1014 RequestBuffer->RequestIndex,
1015 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1016 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1018 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1021 RDR_PioctlClose( userp,
1022 RequestBuffer->FileId,
1025 RequestBuffer->ResultBufferLength,
1031 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
1033 if (afsd_logp->enabled) {
1034 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
1035 RequestBuffer->RequestIndex,
1036 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1037 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
1038 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
1040 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1043 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1045 RDR_ByteRangeLockSync( userp,
1046 RequestBuffer->FileId,
1049 RequestBuffer->ResultBufferLength,
1055 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
1057 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1059 if (afsd_logp->enabled) {
1060 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
1061 RequestBuffer->RequestIndex,
1062 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1063 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1065 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1068 RDR_ByteRangeUnlock( userp,
1069 RequestBuffer->FileId,
1072 RequestBuffer->ResultBufferLength,
1077 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
1079 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1081 if (afsd_logp->enabled) {
1082 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
1083 RequestBuffer->RequestIndex,
1084 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1085 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1087 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1090 RDR_ByteRangeUnlockAll( userp,
1091 RequestBuffer->FileId,
1094 RequestBuffer->ResultBufferLength,
1099 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
1101 if (afsd_logp->enabled) {
1102 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1103 RequestBuffer->RequestIndex,
1104 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1105 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1107 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1110 RDR_GetVolumeInfo( userp,
1111 RequestBuffer->FileId,
1113 RequestBuffer->ResultBufferLength,
1118 case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
1120 if (afsd_logp->enabled) {
1121 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1122 RequestBuffer->RequestIndex,
1123 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1124 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1126 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1129 RDR_GetVolumeSizeInfo( userp,
1130 RequestBuffer->FileId,
1132 RequestBuffer->ResultBufferLength,
1137 case AFS_REQUEST_TYPE_HOLD_FID:
1140 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1142 if (afsd_logp->enabled) {
1143 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1144 RequestBuffer->RequestIndex);
1146 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1152 RequestBuffer->ResultBufferLength,
1158 case AFS_REQUEST_TYPE_RELEASE_FID:
1161 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1163 if (afsd_logp->enabled) {
1164 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1165 RequestBuffer->RequestIndex);
1167 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1170 RDR_ReleaseFid( userp,
1173 RequestBuffer->ResultBufferLength,
1179 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1182 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1184 if (afsd_logp->enabled) {
1185 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1186 RequestBuffer->RequestIndex,
1187 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1188 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1190 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1193 RDR_CleanupFileEntry( userp,
1194 RequestBuffer->FileId,
1195 RequestBuffer->Name,
1196 RequestBuffer->NameLength,
1202 RequestBuffer->ResultBufferLength,
1208 case AFS_REQUEST_TYPE_PIPE_OPEN:
1210 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1212 if (afsd_logp->enabled) {
1213 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1214 RequestBuffer->RequestIndex,
1215 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1216 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1218 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1221 RDR_PipeOpen( userp,
1222 RequestBuffer->FileId,
1223 RequestBuffer->Name,
1224 RequestBuffer->NameLength,
1227 RequestBuffer->ResultBufferLength,
1232 case AFS_REQUEST_TYPE_PIPE_WRITE:
1234 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1235 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1237 if (afsd_logp->enabled) {
1238 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1239 RequestBuffer->RequestIndex,
1240 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1241 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1243 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1246 RDR_PipeWrite( userp,
1247 RequestBuffer->FileId,
1251 RequestBuffer->ResultBufferLength,
1256 case AFS_REQUEST_TYPE_PIPE_READ:
1258 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1260 if (afsd_logp->enabled) {
1261 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1262 RequestBuffer->RequestIndex,
1263 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1264 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1266 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1269 RDR_PipeRead( userp,
1270 RequestBuffer->FileId,
1273 RequestBuffer->ResultBufferLength,
1278 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1280 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1282 if (afsd_logp->enabled) {
1283 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1284 RequestBuffer->RequestIndex,
1285 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1286 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1288 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1291 RDR_PipeClose( userp,
1292 RequestBuffer->FileId,
1295 RequestBuffer->ResultBufferLength,
1301 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1303 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1304 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1306 if (afsd_logp->enabled) {
1307 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1308 RequestBuffer->RequestIndex);
1310 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1313 RDR_PipeTransceive( userp,
1314 RequestBuffer->FileId,
1318 RequestBuffer->ResultBufferLength,
1323 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1325 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1327 if (afsd_logp->enabled) {
1328 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1329 RequestBuffer->RequestIndex);
1331 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1334 RDR_PipeQueryInfo( userp,
1335 RequestBuffer->FileId,
1338 RequestBuffer->ResultBufferLength,
1343 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1345 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1346 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1348 if (afsd_logp->enabled) {
1349 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1350 RequestBuffer->RequestIndex);
1352 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1355 RDR_PipeSetInfo( userp,
1356 RequestBuffer->FileId,
1360 RequestBuffer->ResultBufferLength,
1367 case AFS_REQUEST_TYPE_PROCESS_READ_FILE: {
1368 AFSFileIOCB *pFileIOCB = (AFSFileIOCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1370 if (afsd_logp->enabled) {
1371 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_READ_FILE Index %08lX FID %08lX.%08lX.%08lX.%08lX",
1372 RequestBuffer->RequestIndex,
1373 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1374 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1376 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1379 RDR_ReadFile( userp,
1380 RequestBuffer->FileId,
1381 &pFileIOCB->IOOffset,
1382 pFileIOCB->IOLength,
1383 pFileIOCB->MappedIOBuffer,
1386 RequestBuffer->ResultBufferLength,
1392 case AFS_REQUEST_TYPE_PROCESS_WRITE_FILE: {
1393 AFSFileIOCB *pFileIOCB = (AFSFileIOCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1395 if (afsd_logp->enabled) {
1396 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_WRITE_FILE Index %08lX FID %08lX.%08lX.%08lX.%08lX",
1397 RequestBuffer->RequestIndex,
1398 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1399 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1401 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1404 RDR_WriteFile( userp,
1405 RequestBuffer->FileId,
1407 &pFileIOCB->IOOffset,
1408 pFileIOCB->IOLength,
1409 pFileIOCB->MappedIOBuffer,
1412 RequestBuffer->ResultBufferLength,
1419 bUnsupported = TRUE;
1421 if (afsd_logp->enabled) {
1422 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1423 RequestBuffer->RequestType,
1424 RequestBuffer->RequestIndex);
1426 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1432 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1435 if (pResultCB == NULL) {
1436 // We failed probably due to a memory allocation error
1437 // unless the unsupported flag was set.
1438 pResultCB = &stResultCB;
1439 memset(&stResultCB, 0, sizeof(stResultCB));
1441 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1443 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1447 pResultCB->Authenticated = cm_HaveToken( userp,
1448 RequestBuffer->FileId.Cell);
1452 // This is how the filter associates the response information passed in the IOCtl below to the
1453 // original call. This request index is setup by the filter and should not be modified, otherwise the
1454 // filter will not be able to locate the request in its internal queue and the blocking thread will
1458 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1460 if (afsd_logp->enabled) {
1461 swprintf( wchBuffer,
1462 L"ProcessRequest Responding to Index %08lX Length %08lX",
1463 pResultCB->RequestIndex,
1464 pResultCB->ResultBufferLength);
1466 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1470 // Now post the result back to the driver.
1473 if( !RDR_DeviceIoControl( glDevHandle,
1474 IOCTL_AFS_PROCESS_IRP_RESULT,
1476 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1481 char *pBuffer = (char *)wchBuffer;
1482 gle = GetLastError();
1483 if (afsd_logp->enabled) {
1484 swprintf( wchBuffer,
1485 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1486 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1489 if (gle != ERROR_NOT_READY) {
1491 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1493 osi_panic(pBuffer, __FILE__, __LINE__);
1498 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1500 if (SetFileExtentsResultCB) {
1502 if (1 || afsd_logp->enabled) {
1503 if (SetFileExtentsResultCB->ResultStatus != 0)
1504 swprintf( wchBuffer,
1505 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1506 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1508 swprintf( wchBuffer,
1509 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1510 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1512 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1515 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1516 SetFileExtentsResultCB->ResultStatus != 0) &&
1517 !RDR_DeviceIoControl( glDevHandle,
1518 IOCTL_AFS_SET_FILE_EXTENTS,
1519 (void *)SetFileExtentsResultCB,
1520 dwResultBufferLength,
1525 gle = GetLastError();
1526 if (afsd_logp->enabled) {
1527 swprintf( wchBuffer,
1528 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1530 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1533 // The file system returns an error when it can't find the FID
1534 // This is a bug in the file system but we should try to avoid
1535 // the crash and clean up our own memory space.
1537 // Since we couldn't deliver the extents to the file system
1538 // we should release them.
1539 if ( SetFileExtentsResultCB->ExtentCount != 0)
1541 RDR_ReleaseFailedSetFileExtents( userp,
1542 SetFileExtentsResultCB,
1543 dwResultBufferLength);
1546 if (gle != ERROR_GEN_FAILURE &&
1547 gle != ERROR_NOT_READY) {
1549 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1551 osi_panic(pBuffer, __FILE__, __LINE__);
1555 free(SetFileExtentsResultCB);
1558 /* Must be out of memory */
1559 if (afsd_logp->enabled) {
1560 swprintf( wchBuffer,
1561 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1562 RequestBuffer->RequestIndex);
1564 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1567 RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
1570 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1572 if (afsd_logp->enabled) {
1573 swprintf( wchBuffer,
1574 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1575 RequestBuffer->RequestIndex);
1577 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1581 if (SetByteRangeLockResultCB) {
1583 if( !RDR_DeviceIoControl( glDevHandle,
1584 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1585 (void *)SetByteRangeLockResultCB,
1586 dwResultBufferLength,
1591 gle = GetLastError();
1593 if (afsd_logp->enabled) {
1594 swprintf( wchBuffer,
1595 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1596 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1600 if (gle != ERROR_NOT_READY) {
1601 // TODO - instead of a panic we should release the locks
1603 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1604 osi_panic(pBuffer, __FILE__, __LINE__);
1608 free(SetByteRangeLockResultCB);
1610 /* Must be out of memory */
1611 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1613 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1614 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1615 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1616 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1618 if( !RDR_DeviceIoControl( glDevHandle,
1619 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1620 (void *)&SetByteRangeLockResultCB,
1621 dwResultBufferLength,
1626 gle = GetLastError();
1628 if (afsd_logp->enabled) {
1629 swprintf( wchBuffer,
1630 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1631 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1634 /* We were out of memory - nothing to do */
1640 if (afsd_logp->enabled) {
1641 swprintf( wchBuffer,
1642 L"ProcessRequest Not responding to async Index %08lX",
1643 RequestBuffer->RequestIndex);
1645 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1653 RDR_ReleaseUser(userp);
1656 if( pResultCB && pResultCB != &stResultCB)
1666 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1667 DWORD dwResultBufferLength)
1669 WCHAR wchBuffer[1024];
1670 DWORD bytesReturned;
1673 if (1 || afsd_logp->enabled) {
1674 if (pSetFileExtentsResultCB->ResultStatus != 0)
1675 swprintf( wchBuffer,
1676 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1677 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1679 swprintf( wchBuffer,
1680 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1681 pSetFileExtentsResultCB->ExtentCount);
1683 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1686 if( !RDR_DeviceIoControl( glDevHandle,
1687 IOCTL_AFS_SET_FILE_EXTENTS,
1688 (void *)pSetFileExtentsResultCB,
1689 dwResultBufferLength,
1694 gle = GetLastError();
1703 RDR_SetFileStatus( cm_fid_t *fidp,
1707 WCHAR wchBuffer[1024];
1708 AFSExtentFailureCB SetFileStatusCB;
1709 DWORD bytesReturned;
1712 RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
1713 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1714 SetFileStatusCB.FailureStatus = dwStatus;
1716 if (afsd_logp->enabled) {
1717 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1718 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1719 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1722 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1725 if( !RDR_DeviceIoControl( glDevHandle,
1726 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1727 (void *)&SetFileStatusCB,
1728 sizeof(AFSExtentFailureCB),
1733 gle = GetLastError();
1741 RDR_SetFileStatus2( AFSFileID *pFileId,
1745 WCHAR wchBuffer[1024];
1746 AFSExtentFailureCB SetFileStatusCB;
1747 DWORD bytesReturned;
1750 memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
1751 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1752 SetFileStatusCB.FailureStatus = dwStatus;
1754 if (afsd_logp->enabled) {
1755 swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1756 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1757 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1760 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1763 if( !RDR_DeviceIoControl( glDevHandle,
1764 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1765 (void *)&SetFileStatusCB,
1766 sizeof(AFSExtentFailureCB),
1771 gle = GetLastError();
1779 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1782 HANDLE hDevHandle = NULL;
1783 DWORD bytesReturned;
1784 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1785 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1786 DWORD requestBufferLen, responseBufferLen;
1787 bool bError = false;
1789 WCHAR wchBuffer[256];
1793 if (afsd_logp->enabled) {
1794 swprintf( wchBuffer,
1795 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1797 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1800 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1801 return CM_ERROR_WOULDBLOCK;
1804 if (afsd_logp->enabled) {
1805 swprintf( wchBuffer,
1806 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1809 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1813 // We use the global handle to the control device instance
1816 hDevHandle = glDevHandle;
1819 // Allocate a request buffer.
1822 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1823 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1824 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1825 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1828 if( requestBuffer && responseBuffer)
1831 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1832 memset( responseBuffer, '\0', responseBufferLen);
1834 // If there is a FID provided, use it
1835 if (fidp && extentList)
1837 RDR_fid2FID( fidp, &requestBuffer->FileId);
1839 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1841 requestBuffer->Flags = 0;
1844 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1847 // Set the number of extents to be freed
1848 // Leave the rest of the structure as zeros to indicate free anything
1849 requestBuffer->ExtentCount = numOfExtents;
1851 requestBuffer->HeldExtentCount = numOfHeldExtents;
1853 if( !RDR_DeviceIoControl( hDevHandle,
1854 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1855 (void *)requestBuffer,
1857 (void *)responseBuffer,
1862 // Error condition back from driver
1864 if (afsd_logp->enabled) {
1865 gle = GetLastError();
1866 swprintf( wchBuffer,
1867 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1868 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1875 // Go process the request
1878 if (afsd_logp->enabled) {
1879 swprintf( wchBuffer,
1880 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1881 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1882 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1885 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1893 free( requestBuffer);
1895 free( responseBuffer);
1902 RDR_NetworkStatus(BOOLEAN status)
1905 HANDLE hDevHandle = NULL;
1906 DWORD bytesReturned;
1907 AFSNetworkStatusCB *requestBuffer = NULL;
1909 WCHAR wchBuffer[256];
1912 if (afsd_logp->enabled) {
1913 swprintf( wchBuffer,
1914 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1917 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1921 // We use the global handle to the control device instance
1924 hDevHandle = glDevHandle;
1927 // Allocate a request buffer.
1930 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1936 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1938 // Set the number of extents to be freed
1939 // Leave the rest of the structure as zeros to indicate free anything
1940 requestBuffer->Online = status;
1942 if( !RDR_DeviceIoControl( hDevHandle,
1943 IOCTL_AFS_NETWORK_STATUS,
1944 (void *)requestBuffer,
1945 sizeof( AFSNetworkStatusCB),
1951 // Error condition back from driver
1953 if (afsd_logp->enabled) {
1954 gle = GetLastError();
1955 swprintf( wchBuffer,
1956 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1958 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1969 free( requestBuffer);
1977 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1980 HANDLE hDevHandle = NULL;
1981 DWORD bytesReturned;
1982 AFSVolumeStatusCB *requestBuffer = NULL;
1984 WCHAR wchBuffer[256];
1987 if (afsd_logp->enabled) {
1988 swprintf( wchBuffer,
1989 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1990 cellID, volID, online);
1992 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1996 // We use the global handle to the control device instance
1999 hDevHandle = glDevHandle;
2002 // Allocate a request buffer.
2005 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
2011 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
2013 requestBuffer->FileID.Cell = cellID;
2014 requestBuffer->FileID.Volume = volID;
2015 requestBuffer->Online = online;
2017 if( !RDR_DeviceIoControl( hDevHandle,
2018 IOCTL_AFS_VOLUME_STATUS,
2019 (void *)requestBuffer,
2020 sizeof( AFSVolumeStatusCB),
2026 // Error condition back from driver
2029 if (afsd_logp->enabled) {
2030 gle = GetLastError();
2031 swprintf( wchBuffer,
2032 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
2033 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2044 free( requestBuffer);
2050 RDR_NetworkAddrChange(void)
2057 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
2060 HANDLE hDevHandle = NULL;
2061 DWORD bytesReturned;
2062 AFSInvalidateCacheCB *requestBuffer = NULL;
2064 WCHAR wchBuffer[256];
2067 if (afsd_logp->enabled) {
2068 swprintf( wchBuffer,
2069 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
2070 cellID, volID, reason);
2072 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2076 // We use the global handle to the control device instance
2079 hDevHandle = glDevHandle;
2082 // Allocate a request buffer.
2085 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
2091 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
2093 requestBuffer->FileID.Cell = cellID;
2094 requestBuffer->FileID.Volume = volID;
2095 requestBuffer->WholeVolume = TRUE;
2096 requestBuffer->Reason = reason;
2098 if( !RDR_DeviceIoControl( hDevHandle,
2099 IOCTL_AFS_INVALIDATE_CACHE,
2100 (void *)requestBuffer,
2101 sizeof( AFSInvalidateCacheCB),
2107 // Error condition back from driver
2110 if (afsd_logp->enabled) {
2111 gle = GetLastError();
2112 swprintf( wchBuffer,
2113 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
2114 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2125 free( requestBuffer);
2132 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
2135 HANDLE hDevHandle = NULL;
2136 DWORD bytesReturned;
2137 AFSInvalidateCacheCB *requestBuffer = NULL;
2139 WCHAR wchBuffer[256];
2142 if (afsd_logp->enabled) {
2143 swprintf( wchBuffer,
2144 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",
2145 cellID, volID, vnode, uniq, hash, fileType, reason);
2147 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2151 // We use the global handle to the control device instance
2154 hDevHandle = glDevHandle;
2157 // Allocate a request buffer.
2160 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
2166 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
2168 requestBuffer->FileID.Cell = cellID;
2169 requestBuffer->FileID.Volume = volID;
2170 requestBuffer->FileID.Vnode = vnode;
2171 requestBuffer->FileID.Unique = uniq;
2172 requestBuffer->FileID.Hash = hash;
2173 requestBuffer->FileType = fileType;
2174 requestBuffer->WholeVolume = FALSE;
2175 requestBuffer->Reason = reason;
2177 if( !RDR_DeviceIoControl( hDevHandle,
2178 IOCTL_AFS_INVALIDATE_CACHE,
2179 (void *)requestBuffer,
2180 sizeof( AFSInvalidateCacheCB),
2186 // Error condition back from driver
2188 if (afsd_logp->enabled) {
2189 gle = GetLastError();
2190 swprintf( wchBuffer,
2191 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
2192 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2203 free( requestBuffer);
2211 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
2214 HANDLE hDevHandle = NULL;
2215 DWORD bytesReturned;
2216 AFSSysNameNotificationCB *requestBuffer = NULL;
2218 WCHAR wchBuffer[256];
2222 if (afsd_logp->enabled) {
2223 swprintf( wchBuffer,
2224 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
2225 Architecture, Count);
2227 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2230 if (Count <= 0 || NameList == NULL)
2234 // We use the global handle to the control device instance
2237 hDevHandle = glDevHandle;
2240 // Allocate a request buffer.
2243 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2244 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2251 memset( requestBuffer, '\0', Length);
2253 requestBuffer->Architecture = Architecture;
2254 requestBuffer->NumberOfNames = Count;
2255 for ( i=0 ; i<Count; i++) {
2256 size_t len = wcslen(NameList[i]);
2257 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2258 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2262 if( !RDR_DeviceIoControl( hDevHandle,
2263 IOCTL_AFS_SYSNAME_NOTIFICATION,
2264 (void *)requestBuffer,
2271 // Error condition back from driver
2273 if (afsd_logp->enabled) {
2274 gle = GetLastError();
2275 swprintf( wchBuffer,
2276 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2277 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2288 free( requestBuffer);
2296 ResetEvent( RDR_SuspendEvent);
2302 SetEvent( RDR_SuspendEvent);