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;
68 #include <WINNT/afsreg.h>
69 #include <afs/cm_config.h>
70 #include <afs/cm_error.h>
71 #include <afs/cm_nls.h>
72 #include <afs/cm_user.h>
74 #include <RDRPrototypes.h>
77 RDR_SetFileStatus2( AFSFileID * pFileId,
82 #define FlagOn(_F,_SF) ((_F) & (_SF))
86 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
90 #define SetFlag(_F,_SF) ((_F) |= (_SF))
94 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
97 #define QuadAlign(Ptr) ( \
98 ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
101 #define MIN_WORKER_THREADS 5
102 #define MAX_WORKER_THREADS 512
104 typedef struct _worker_thread_info {
114 WorkerThreadInfo glWorkerThreadInfo[ MAX_WORKER_THREADS];
116 UINT glThreadHandleIndex = 0;
118 HANDLE glDevHandle = INVALID_HANDLE_VALUE;
120 static DWORD Exit = false;
122 static DWORD ExitPending = false;
126 extern "C" wchar_t RDR_UNCName[64]=L"AFS";
128 HANDLE RDR_SuspendEvent = INVALID_HANDLE_VALUE;
130 /* returns 0 on success */
138 DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
140 // Initialize the Suspend Event
141 RDR_SuspendEvent = CreateEvent( NULL,
142 TRUE, // manual reset event
146 dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
147 0, KEY_QUERY_VALUE, &parmKey);
148 if (dwRet == ERROR_SUCCESS) {
149 dummyLen = sizeof(numSvThreads);
150 dwRet = RegQueryValueEx(parmKey, TEXT("ServerThreads"), NULL, NULL,
151 (BYTE *) &numSvThreads, &dummyLen);
153 dummyLen = sizeof(RDR_UNCName);
154 dwRet = RegQueryValueExW(parmKey, L"NetbiosName", NULL, NULL,
155 (BYTE *) RDR_UNCName, &dummyLen);
157 RegCloseKey (parmKey);
160 // Initialize the Thread local storage index for the overlapped i/o
162 dwOvEvIdx = TlsAlloc();
167 // Launch our workers down to the
168 // filters control device for processing requests
171 dwRet = RDR_ProcessWorkerThreads(numSvThreads);
173 if (dwRet == ERROR_SUCCESS) {
182 BOOL RDR_DeviceIoControl( HANDLE hDevice,
183 DWORD dwIoControlCode,
187 DWORD nOutBufferSize,
188 LPDWORD lpBytesReturned )
195 ZeroMemory(&ov, sizeof(OVERLAPPED));
197 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
198 if (hEvent == NULL) {
199 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
200 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
202 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
207 *lpBytesReturned = 0;
209 rc = DeviceIoControl( hDevice,
218 gle = GetLastError();
220 if ( gle == ERROR_IO_PENDING )
221 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
228 RDR_ShutdownFinal(void)
236 // Close all the worker thread handles
239 while( dwIndex < glThreadHandleIndex)
242 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
247 if( glDevHandle != INVALID_HANDLE_VALUE)
250 CloseHandle( glDevHandle);
257 RDR_ShutdownNotify(void)
260 HANDLE hDevHandle = NULL;
264 // We use the global handle to the control device instance
267 hDevHandle = glDevHandle;
271 // First, notify the file system driver that
272 // we are shutting down.
277 if( !RDR_DeviceIoControl( hDevHandle,
285 // log the error, nothing to do
296 // Here we launch the worker threads for the given volume
300 RDR_ProcessWorkerThreads(DWORD numThreads)
305 DWORD bytesReturned = 0;
306 DWORD dwRedirInitInfo;
307 AFSRedirectorInitInfo * redirInitInfo = NULL;
310 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
313 glDevHandle = CreateFile( AFS_SYMLINK_W,
314 GENERIC_READ | GENERIC_WRITE,
315 FILE_SHARE_READ | FILE_SHARE_WRITE,
318 FILE_FLAG_OVERLAPPED,
321 if( glDevHandle == INVALID_HANDLE_VALUE)
324 return GetLastError();
328 // Now call down to initialize the pool.
331 if( !RDR_DeviceIoControl( glDevHandle,
332 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
340 CloseHandle( glDevHandle);
346 return GetLastError();
350 // OK, now launch the workers
353 hEvent = CreateEvent( NULL,
359 // Here we create a pool of worker threads but you can create the pool with as many requests
363 if (numThreads < MIN_WORKER_THREADS)
364 numThreads = MIN_WORKER_THREADS;
365 else if (numThreads > MAX_WORKER_THREADS)
366 numThreads = MAX_WORKER_THREADS;
368 for (index = 0; index < numThreads; index++)
371 // 20% of worker threads should be reserved for release extent
374 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
375 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
376 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
377 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
380 RDR_RequestWorkerThread,
381 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
385 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
389 // Wait for the thread to signal it is ready for processing
392 WaitForSingleObject( hEvent,
395 glThreadHandleIndex++;
403 // Perform cleanup specific to your application
409 if( !RDR_DeviceIoControl( glDevHandle,
410 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
418 CloseHandle( glDevHandle);
424 return GetLastError();
433 // Entry point for the worker thread
438 RDR_RequestWorkerThread( LPVOID lpParameter)
441 HANDLE hDevHandle = NULL;
443 AFSCommRequest *requestBuffer;
445 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
448 // We use the global handle to the control device instance
451 hDevHandle = glDevHandle;
454 // Allocate a request buffer.
457 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
463 // Here we simply signal back to the main thread that we ahve started
466 SetEvent( pInfo->hEvent);
469 // Process requests until we are told to stop
475 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
477 requestBuffer->RequestFlags = pInfo->Flags;
479 if( RDR_DeviceIoControl( hDevHandle,
480 IOCTL_AFS_PROCESS_IRP_REQUEST,
481 (void *)requestBuffer,
482 sizeof( AFSCommRequest),
483 (void *)requestBuffer,
484 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
488 WaitForSingleObject( RDR_SuspendEvent, INFINITE);
491 // Go process the request
495 RDR_ProcessRequest( requestBuffer);
500 if (afsd_logp->enabled) {
501 WCHAR wchBuffer[256];
502 DWORD gle = GetLastError();
505 L"Failed to post IOCTL_AFS_IRP_REQUEST gle 0x%x", gle);
506 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
511 free( requestBuffer);
520 // This is the entry point for the worker threads to process the request from the TC Filter driver
524 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
530 ULONG ulCreateFlags = 0;
531 AFSCommResult * pResultCB = NULL;
532 AFSCommResult stResultCB;
533 DWORD dwResultBufferLength = 0;
534 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
535 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
536 WCHAR wchBuffer[1024];
537 char *pBuffer = (char *)wchBuffer;
539 cm_user_t * userp = NULL;
540 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
541 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
542 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
543 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
544 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
545 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
546 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
548 BOOL bUnsupported = FALSE;
549 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
551 userp = RDR_UserFromCommRequest(RequestBuffer);
555 // Build up the string to display based on the request type.
558 switch( RequestBuffer->RequestType)
561 case AFS_REQUEST_TYPE_DIR_ENUM:
564 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
566 if (afsd_logp->enabled) {
568 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
569 RequestBuffer->RequestIndex);
571 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
575 // Here is where the content of the specific directory is enumerated.
578 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
579 pQueryCB, bWow64, bFast,
580 RequestBuffer->ResultBufferLength,
585 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
587 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
589 if (afsd_logp->enabled) {
591 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
592 RequestBuffer->RequestIndex);
594 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
597 // Here is where the specified node is evaluated.
600 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
601 RequestBuffer->FileId,
602 bWow64, bFast, bHoldFid,
603 RequestBuffer->ResultBufferLength,
608 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
610 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
612 if (afsd_logp->enabled) {
614 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
615 RequestBuffer->RequestIndex);
617 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
620 // Here is where the specified node is evaluated.
623 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
625 RequestBuffer->NameLength,
626 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
627 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_LAST_COMPONENT ? TRUE : FALSE,
628 bWow64, bFast, bHoldFid,
629 RequestBuffer->ResultBufferLength,
634 case AFS_REQUEST_TYPE_CREATE_FILE:
637 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
639 WCHAR wchFileName[ 256];
641 if (afsd_logp->enabled) {
642 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
646 RequestBuffer->NameLength);
648 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
649 RequestBuffer->RequestIndex, wchFileName);
651 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
654 RDR_CreateFileEntry( userp,
656 RequestBuffer->NameLength,
660 RequestBuffer->ResultBufferLength,
666 case AFS_REQUEST_TYPE_UPDATE_FILE:
669 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
671 if (afsd_logp->enabled) {
672 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
673 RequestBuffer->RequestIndex,
674 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
675 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
677 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
680 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
683 RequestBuffer->ResultBufferLength,
689 case AFS_REQUEST_TYPE_DELETE_FILE:
692 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
694 if (afsd_logp->enabled) {
695 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
696 RequestBuffer->RequestIndex,
697 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
698 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
701 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
704 RDR_DeleteFileEntry( userp,
706 pDeleteCB->ProcessId,
708 RequestBuffer->NameLength,
711 RequestBuffer->ResultBufferLength,
717 case AFS_REQUEST_TYPE_RENAME_FILE:
720 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
722 if (afsd_logp->enabled) {
723 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",
724 RequestBuffer->RequestIndex,
725 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
726 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
727 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
728 pFileRenameCB->TargetNameLength, (int)pFileRenameCB->TargetNameLength, pFileRenameCB->TargetName);
730 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
733 RDR_RenameFileEntry( userp,
735 RequestBuffer->NameLength,
736 RequestBuffer->FileId,
739 RequestBuffer->ResultBufferLength,
745 case AFS_REQUEST_TYPE_HARDLINK_FILE:
748 AFSFileHardLinkCB *pFileHardLinkCB = (AFSFileHardLinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
750 if (afsd_logp->enabled) {
751 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",
752 RequestBuffer->RequestIndex,
753 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
754 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
755 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
756 pFileHardLinkCB->TargetNameLength, (int)pFileHardLinkCB->TargetNameLength, pFileHardLinkCB->TargetName);
758 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
761 RDR_HardLinkFileEntry( userp,
763 RequestBuffer->NameLength,
764 RequestBuffer->FileId,
767 RequestBuffer->ResultBufferLength,
773 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
776 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
778 if (afsd_logp->enabled) {
779 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
780 RequestBuffer->RequestIndex,
781 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
782 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
783 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
785 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
788 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
789 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
792 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
793 pFileRequestExtentsCB,
795 &dwResultBufferLength,
796 &SetFileExtentsResultCB );
800 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
803 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
805 if (afsd_logp->enabled) {
806 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX",
807 RequestBuffer->RequestIndex,
808 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
809 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
811 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
814 RDR_ReleaseFileExtents( userp, RequestBuffer->FileId,
815 pFileReleaseExtentsCB,
817 RequestBuffer->ResultBufferLength,
823 case AFS_REQUEST_TYPE_FLUSH_FILE:
825 if (afsd_logp->enabled) {
826 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
827 RequestBuffer->RequestIndex,
828 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
829 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
831 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
834 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
836 RequestBuffer->ResultBufferLength,
841 case AFS_REQUEST_TYPE_OPEN_FILE:
843 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
845 if (afsd_logp->enabled) {
846 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
847 RequestBuffer->RequestIndex,
848 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
849 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
851 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
854 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
858 RequestBuffer->ResultBufferLength,
864 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
866 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
868 if (afsd_logp->enabled) {
869 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
870 RequestBuffer->RequestIndex,
871 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
872 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
874 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
877 RDR_ReleaseFileAccess( userp,
878 RequestBuffer->FileId,
879 pFileAccessReleaseCB,
881 RequestBuffer->ResultBufferLength,
887 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
889 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
891 if (afsd_logp->enabled) {
892 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
893 RequestBuffer->RequestIndex,
894 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
895 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
897 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
900 RDR_PioctlOpen( userp,
901 RequestBuffer->FileId,
904 RequestBuffer->ResultBufferLength,
909 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
911 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
913 if (afsd_logp->enabled) {
914 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
915 RequestBuffer->RequestIndex,
916 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
917 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
919 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
922 RDR_PioctlWrite( userp,
923 RequestBuffer->FileId,
926 RequestBuffer->ResultBufferLength,
931 case AFS_REQUEST_TYPE_PIOCTL_READ:
933 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
935 if (afsd_logp->enabled) {
936 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
937 RequestBuffer->RequestIndex,
938 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
939 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
941 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
944 RDR_PioctlRead( userp,
945 RequestBuffer->FileId,
949 RequestBuffer->ResultBufferLength,
954 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
956 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
958 if (afsd_logp->enabled) {
959 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
960 RequestBuffer->RequestIndex,
961 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
962 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
964 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
967 RDR_PioctlClose( userp,
968 RequestBuffer->FileId,
971 RequestBuffer->ResultBufferLength,
977 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
979 if (afsd_logp->enabled) {
980 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
981 RequestBuffer->RequestIndex,
982 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
983 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
984 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
986 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
989 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
991 RDR_ByteRangeLockSync( userp,
992 RequestBuffer->FileId,
995 RequestBuffer->ResultBufferLength,
1001 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
1003 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1005 if (afsd_logp->enabled) {
1006 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
1007 RequestBuffer->RequestIndex,
1008 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1009 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1011 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1014 RDR_ByteRangeUnlock( userp,
1015 RequestBuffer->FileId,
1018 RequestBuffer->ResultBufferLength,
1023 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
1025 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1027 if (afsd_logp->enabled) {
1028 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
1029 RequestBuffer->RequestIndex,
1030 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1031 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1033 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1036 RDR_ByteRangeUnlockAll( userp,
1037 RequestBuffer->FileId,
1040 RequestBuffer->ResultBufferLength,
1045 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
1047 if (afsd_logp->enabled) {
1048 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1049 RequestBuffer->RequestIndex,
1050 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1051 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1053 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1056 RDR_GetVolumeInfo( userp,
1057 RequestBuffer->FileId,
1059 RequestBuffer->ResultBufferLength,
1064 case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
1066 if (afsd_logp->enabled) {
1067 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
1068 RequestBuffer->RequestIndex,
1069 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1070 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1072 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1075 RDR_GetVolumeSizeInfo( userp,
1076 RequestBuffer->FileId,
1078 RequestBuffer->ResultBufferLength,
1083 case AFS_REQUEST_TYPE_HOLD_FID:
1086 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1088 if (afsd_logp->enabled) {
1089 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1090 RequestBuffer->RequestIndex);
1092 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1098 RequestBuffer->ResultBufferLength,
1104 case AFS_REQUEST_TYPE_RELEASE_FID:
1107 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1109 if (afsd_logp->enabled) {
1110 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1111 RequestBuffer->RequestIndex);
1113 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1116 RDR_ReleaseFid( userp,
1119 RequestBuffer->ResultBufferLength,
1125 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1128 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1130 if (afsd_logp->enabled) {
1131 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1132 RequestBuffer->RequestIndex,
1133 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1134 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1136 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1139 RDR_CleanupFileEntry( userp,
1140 RequestBuffer->FileId,
1141 RequestBuffer->Name,
1142 RequestBuffer->NameLength,
1148 RequestBuffer->ResultBufferLength,
1154 case AFS_REQUEST_TYPE_PIPE_OPEN:
1156 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1158 if (afsd_logp->enabled) {
1159 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1160 RequestBuffer->RequestIndex,
1161 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1162 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1164 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1167 RDR_PipeOpen( userp,
1168 RequestBuffer->FileId,
1169 RequestBuffer->Name,
1170 RequestBuffer->NameLength,
1173 RequestBuffer->ResultBufferLength,
1178 case AFS_REQUEST_TYPE_PIPE_WRITE:
1180 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1181 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1183 if (afsd_logp->enabled) {
1184 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1185 RequestBuffer->RequestIndex,
1186 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1187 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1189 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1192 RDR_PipeWrite( userp,
1193 RequestBuffer->FileId,
1197 RequestBuffer->ResultBufferLength,
1202 case AFS_REQUEST_TYPE_PIPE_READ:
1204 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1206 if (afsd_logp->enabled) {
1207 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1208 RequestBuffer->RequestIndex,
1209 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1210 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1212 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1215 RDR_PipeRead( userp,
1216 RequestBuffer->FileId,
1219 RequestBuffer->ResultBufferLength,
1224 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1226 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1228 if (afsd_logp->enabled) {
1229 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1230 RequestBuffer->RequestIndex,
1231 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1232 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1234 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1237 RDR_PipeClose( userp,
1238 RequestBuffer->FileId,
1241 RequestBuffer->ResultBufferLength,
1247 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1249 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1250 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1252 if (afsd_logp->enabled) {
1253 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1254 RequestBuffer->RequestIndex);
1256 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1259 RDR_PipeTransceive( userp,
1260 RequestBuffer->FileId,
1264 RequestBuffer->ResultBufferLength,
1269 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1271 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1273 if (afsd_logp->enabled) {
1274 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1275 RequestBuffer->RequestIndex);
1277 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1280 RDR_PipeQueryInfo( userp,
1281 RequestBuffer->FileId,
1284 RequestBuffer->ResultBufferLength,
1289 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1291 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1292 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1294 if (afsd_logp->enabled) {
1295 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1296 RequestBuffer->RequestIndex);
1298 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1301 RDR_PipeSetInfo( userp,
1302 RequestBuffer->FileId,
1306 RequestBuffer->ResultBufferLength,
1313 bUnsupported = TRUE;
1315 if (afsd_logp->enabled) {
1316 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1317 RequestBuffer->RequestType,
1318 RequestBuffer->RequestIndex);
1320 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1326 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1329 if (pResultCB == NULL) {
1330 // We failed probably due to a memory allocation error
1331 // unless the unsupported flag was set.
1332 pResultCB = &stResultCB;
1333 memset(&stResultCB, 0, sizeof(stResultCB));
1335 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1337 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1341 pResultCB->Authenticated = cm_HaveToken( userp,
1342 RequestBuffer->FileId.Cell);
1346 // This is how the filter associates the response information passed in the IOCtl below to the
1347 // original call. This request index is setup by the filter and should not be modified, otherwise the
1348 // filter will not be able to locate the request in its internal queue and the blocking thread will
1352 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1354 if (afsd_logp->enabled) {
1355 swprintf( wchBuffer,
1356 L"ProcessRequest Responding to Index %08lX Length %08lX",
1357 pResultCB->RequestIndex,
1358 pResultCB->ResultBufferLength);
1360 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1364 // Now post the result back to the driver.
1367 if( !RDR_DeviceIoControl( glDevHandle,
1368 IOCTL_AFS_PROCESS_IRP_RESULT,
1370 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1375 char *pBuffer = (char *)wchBuffer;
1376 gle = GetLastError();
1377 if (afsd_logp->enabled) {
1378 swprintf( wchBuffer,
1379 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1380 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1383 if (gle != ERROR_NOT_READY) {
1385 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1387 osi_panic(pBuffer, __FILE__, __LINE__);
1392 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1394 if (SetFileExtentsResultCB) {
1396 if (1 || afsd_logp->enabled) {
1397 if (SetFileExtentsResultCB->ResultStatus != 0)
1398 swprintf( wchBuffer,
1399 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1400 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1402 swprintf( wchBuffer,
1403 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1404 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1406 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1409 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1410 SetFileExtentsResultCB->ResultStatus != 0) &&
1411 !RDR_DeviceIoControl( glDevHandle,
1412 IOCTL_AFS_SET_FILE_EXTENTS,
1413 (void *)SetFileExtentsResultCB,
1414 dwResultBufferLength,
1419 gle = GetLastError();
1420 if (afsd_logp->enabled) {
1421 swprintf( wchBuffer,
1422 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1424 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1427 // The file system returns an error when it can't find the FID
1428 // This is a bug in the file system but we should try to avoid
1429 // the crash and clean up our own memory space.
1431 // Since we couldn't deliver the extents to the file system
1432 // we should release them.
1433 if ( SetFileExtentsResultCB->ExtentCount != 0)
1435 RDR_ReleaseFailedSetFileExtents( userp,
1436 SetFileExtentsResultCB,
1437 dwResultBufferLength);
1440 if (gle != ERROR_GEN_FAILURE &&
1441 gle != ERROR_NOT_READY) {
1443 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1445 osi_panic(pBuffer, __FILE__, __LINE__);
1449 free(SetFileExtentsResultCB);
1452 /* Must be out of memory */
1453 if (afsd_logp->enabled) {
1454 swprintf( wchBuffer,
1455 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1456 RequestBuffer->RequestIndex);
1458 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1461 RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
1464 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1466 if (afsd_logp->enabled) {
1467 swprintf( wchBuffer,
1468 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1469 RequestBuffer->RequestIndex);
1471 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1475 if (SetByteRangeLockResultCB) {
1477 if( !RDR_DeviceIoControl( glDevHandle,
1478 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1479 (void *)SetByteRangeLockResultCB,
1480 dwResultBufferLength,
1485 gle = GetLastError();
1487 if (afsd_logp->enabled) {
1488 swprintf( wchBuffer,
1489 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1490 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1494 if (gle != ERROR_NOT_READY) {
1495 // TODO - instead of a panic we should release the locks
1497 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1498 osi_panic(pBuffer, __FILE__, __LINE__);
1502 free(SetByteRangeLockResultCB);
1504 /* Must be out of memory */
1505 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1507 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1508 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1509 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1510 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1512 if( !RDR_DeviceIoControl( glDevHandle,
1513 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1514 (void *)&SetByteRangeLockResultCB,
1515 dwResultBufferLength,
1520 gle = GetLastError();
1522 if (afsd_logp->enabled) {
1523 swprintf( wchBuffer,
1524 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1525 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1528 /* We were out of memory - nothing to do */
1534 if (afsd_logp->enabled) {
1535 swprintf( wchBuffer,
1536 L"ProcessRequest Not responding to async Index %08lX",
1537 RequestBuffer->RequestIndex);
1539 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1547 RDR_ReleaseUser(userp);
1550 if( pResultCB && pResultCB != &stResultCB)
1560 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1561 DWORD dwResultBufferLength)
1563 WCHAR wchBuffer[1024];
1564 DWORD bytesReturned;
1567 if (1 || afsd_logp->enabled) {
1568 if (pSetFileExtentsResultCB->ResultStatus != 0)
1569 swprintf( wchBuffer,
1570 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1571 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1573 swprintf( wchBuffer,
1574 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1575 pSetFileExtentsResultCB->ExtentCount);
1577 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1580 if( !RDR_DeviceIoControl( glDevHandle,
1581 IOCTL_AFS_SET_FILE_EXTENTS,
1582 (void *)pSetFileExtentsResultCB,
1583 dwResultBufferLength,
1588 gle = GetLastError();
1597 RDR_SetFileStatus( cm_fid_t *fidp,
1601 WCHAR wchBuffer[1024];
1602 AFSExtentFailureCB SetFileStatusCB;
1603 DWORD bytesReturned;
1606 RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
1607 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1608 SetFileStatusCB.FailureStatus = dwStatus;
1610 if (afsd_logp->enabled) {
1611 swprintf( wchBuffer, L"RDR_SetFileStatus 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_SetFileStatus2( AFSFileID *pFileId,
1639 WCHAR wchBuffer[1024];
1640 AFSExtentFailureCB SetFileStatusCB;
1641 DWORD bytesReturned;
1644 memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
1645 memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
1646 SetFileStatusCB.FailureStatus = dwStatus;
1648 if (afsd_logp->enabled) {
1649 swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1650 SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
1651 SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
1654 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1657 if( !RDR_DeviceIoControl( glDevHandle,
1658 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1659 (void *)&SetFileStatusCB,
1660 sizeof(AFSExtentFailureCB),
1665 gle = GetLastError();
1673 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1676 HANDLE hDevHandle = NULL;
1677 DWORD bytesReturned;
1678 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1679 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1680 DWORD requestBufferLen, responseBufferLen;
1681 bool bError = false;
1683 WCHAR wchBuffer[256];
1687 if (afsd_logp->enabled) {
1688 swprintf( wchBuffer,
1689 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1691 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1694 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1695 return CM_ERROR_WOULDBLOCK;
1698 if (afsd_logp->enabled) {
1699 swprintf( wchBuffer,
1700 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1703 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1707 // We use the global handle to the control device instance
1710 hDevHandle = glDevHandle;
1713 // Allocate a request buffer.
1716 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1717 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1718 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1719 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1722 if( requestBuffer && responseBuffer)
1725 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1726 memset( responseBuffer, '\0', responseBufferLen);
1728 // If there is a FID provided, use it
1729 if (fidp && extentList)
1731 RDR_fid2FID( fidp, &requestBuffer->FileId);
1733 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1735 requestBuffer->Flags = 0;
1738 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1741 // Set the number of extents to be freed
1742 // Leave the rest of the structure as zeros to indicate free anything
1743 requestBuffer->ExtentCount = numOfExtents;
1745 requestBuffer->HeldExtentCount = numOfHeldExtents;
1747 if( !RDR_DeviceIoControl( hDevHandle,
1748 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1749 (void *)requestBuffer,
1751 (void *)responseBuffer,
1756 // Error condition back from driver
1758 if (afsd_logp->enabled) {
1759 gle = GetLastError();
1760 swprintf( wchBuffer,
1761 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1762 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1769 // Go process the request
1772 if (afsd_logp->enabled) {
1773 swprintf( wchBuffer,
1774 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1775 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1776 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1779 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1787 free( requestBuffer);
1789 free( responseBuffer);
1796 RDR_NetworkStatus(BOOLEAN status)
1799 HANDLE hDevHandle = NULL;
1800 DWORD bytesReturned;
1801 AFSNetworkStatusCB *requestBuffer = NULL;
1803 WCHAR wchBuffer[256];
1806 if (afsd_logp->enabled) {
1807 swprintf( wchBuffer,
1808 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1811 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1815 // We use the global handle to the control device instance
1818 hDevHandle = glDevHandle;
1821 // Allocate a request buffer.
1824 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1830 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1832 // Set the number of extents to be freed
1833 // Leave the rest of the structure as zeros to indicate free anything
1834 requestBuffer->Online = status;
1836 if( !RDR_DeviceIoControl( hDevHandle,
1837 IOCTL_AFS_NETWORK_STATUS,
1838 (void *)requestBuffer,
1839 sizeof( AFSNetworkStatusCB),
1845 // Error condition back from driver
1847 if (afsd_logp->enabled) {
1848 gle = GetLastError();
1849 swprintf( wchBuffer,
1850 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1852 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1863 free( requestBuffer);
1871 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1874 HANDLE hDevHandle = NULL;
1875 DWORD bytesReturned;
1876 AFSVolumeStatusCB *requestBuffer = NULL;
1878 WCHAR wchBuffer[256];
1881 if (afsd_logp->enabled) {
1882 swprintf( wchBuffer,
1883 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1884 cellID, volID, online);
1886 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1890 // We use the global handle to the control device instance
1893 hDevHandle = glDevHandle;
1896 // Allocate a request buffer.
1899 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1905 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1907 requestBuffer->FileID.Cell = cellID;
1908 requestBuffer->FileID.Volume = volID;
1909 requestBuffer->Online = online;
1911 if( !RDR_DeviceIoControl( hDevHandle,
1912 IOCTL_AFS_VOLUME_STATUS,
1913 (void *)requestBuffer,
1914 sizeof( AFSVolumeStatusCB),
1920 // Error condition back from driver
1923 if (afsd_logp->enabled) {
1924 gle = GetLastError();
1925 swprintf( wchBuffer,
1926 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1927 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1938 free( requestBuffer);
1944 RDR_NetworkAddrChange(void)
1951 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1954 HANDLE hDevHandle = NULL;
1955 DWORD bytesReturned;
1956 AFSInvalidateCacheCB *requestBuffer = NULL;
1958 WCHAR wchBuffer[256];
1961 if (afsd_logp->enabled) {
1962 swprintf( wchBuffer,
1963 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1964 cellID, volID, reason);
1966 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1970 // We use the global handle to the control device instance
1973 hDevHandle = glDevHandle;
1976 // Allocate a request buffer.
1979 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1985 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1987 requestBuffer->FileID.Cell = cellID;
1988 requestBuffer->FileID.Volume = volID;
1989 requestBuffer->WholeVolume = TRUE;
1990 requestBuffer->Reason = reason;
1992 if( !RDR_DeviceIoControl( hDevHandle,
1993 IOCTL_AFS_INVALIDATE_CACHE,
1994 (void *)requestBuffer,
1995 sizeof( AFSInvalidateCacheCB),
2001 // Error condition back from driver
2004 if (afsd_logp->enabled) {
2005 gle = GetLastError();
2006 swprintf( wchBuffer,
2007 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
2008 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2019 free( requestBuffer);
2026 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
2029 HANDLE hDevHandle = NULL;
2030 DWORD bytesReturned;
2031 AFSInvalidateCacheCB *requestBuffer = NULL;
2033 WCHAR wchBuffer[256];
2036 if (afsd_logp->enabled) {
2037 swprintf( wchBuffer,
2038 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",
2039 cellID, volID, vnode, uniq, hash, fileType, reason);
2041 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2045 // We use the global handle to the control device instance
2048 hDevHandle = glDevHandle;
2051 // Allocate a request buffer.
2054 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
2060 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
2062 requestBuffer->FileID.Cell = cellID;
2063 requestBuffer->FileID.Volume = volID;
2064 requestBuffer->FileID.Vnode = vnode;
2065 requestBuffer->FileID.Unique = uniq;
2066 requestBuffer->FileID.Hash = hash;
2067 requestBuffer->FileType = fileType;
2068 requestBuffer->WholeVolume = FALSE;
2069 requestBuffer->Reason = reason;
2071 if( !RDR_DeviceIoControl( hDevHandle,
2072 IOCTL_AFS_INVALIDATE_CACHE,
2073 (void *)requestBuffer,
2074 sizeof( AFSInvalidateCacheCB),
2080 // Error condition back from driver
2082 if (afsd_logp->enabled) {
2083 gle = GetLastError();
2084 swprintf( wchBuffer,
2085 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
2086 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2097 free( requestBuffer);
2105 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
2108 HANDLE hDevHandle = NULL;
2109 DWORD bytesReturned;
2110 AFSSysNameNotificationCB *requestBuffer = NULL;
2112 WCHAR wchBuffer[256];
2116 if (afsd_logp->enabled) {
2117 swprintf( wchBuffer,
2118 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
2119 Architecture, Count);
2121 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2124 if (Count <= 0 || NameList == NULL)
2128 // We use the global handle to the control device instance
2131 hDevHandle = glDevHandle;
2134 // Allocate a request buffer.
2137 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2138 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2145 memset( requestBuffer, '\0', Length);
2147 requestBuffer->Architecture = Architecture;
2148 requestBuffer->NumberOfNames = Count;
2149 for ( i=0 ; i<Count; i++) {
2150 size_t len = wcslen(NameList[i]);
2151 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2152 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2156 if( !RDR_DeviceIoControl( hDevHandle,
2157 IOCTL_AFS_SYSNAME_NOTIFICATION,
2158 (void *)requestBuffer,
2165 // Error condition back from driver
2167 if (afsd_logp->enabled) {
2168 gle = GetLastError();
2169 swprintf( wchBuffer,
2170 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2171 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2182 free( requestBuffer);
2190 ResetEvent( RDR_SuspendEvent);
2196 SetEvent( RDR_SuspendEvent);