2 * Copyright (c) 2008 Secure Endpoints, Inc.
3 * Copyright (c) 2009-2011 Your File System, Inc.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
9 * - Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 * - Neither the name of Secure Endpoints Inc. nor the names of its contributors
15 * may be used to endorse or promote products derived from this software without
16 * specific prior written permission from Secure Endpoints, Inc. and
17 * Your File System, Inc.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
23 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #define _WIN32_WINNT 0x0500
35 #define _CRT_SECURE_NO_DEPRECATE
36 #define _CRT_NON_CONFORMING_SWPRINTFS
38 #define STRSAFE_NO_DEPRECATE
41 #define WIN32_NO_STATUS
43 typedef LONG NTSTATUS, *PNTSTATUS; // not declared in ntstatus.h
57 #include "..\\Common\\AFSUserDefines.h"
58 #include "..\\Common\\AFSUserIoctl.h"
59 #include "..\\Common\\AFSUserStructs.h"
63 extern osi_log_t *afsd_logp;
65 #include <WINNT/afsreg.h>
66 #include <afs/cm_config.h>
67 #include <afs/cm_error.h>
69 #include <RDRPrototypes.h>
72 #define FlagOn(_F,_SF) ((_F) & (_SF))
76 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
80 #define SetFlag(_F,_SF) ((_F) |= (_SF))
84 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
87 #define QuadAlign(Ptr) ( \
88 ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
91 #define MIN_WORKER_THREADS 5
92 #define MAX_WORKER_THREADS 512
94 typedef struct _worker_thread_info {
104 WorkerThreadInfo glWorkerThreadInfo[ MAX_WORKER_THREADS];
106 UINT glThreadHandleIndex = 0;
108 HANDLE glDevHandle = INVALID_HANDLE_VALUE;
110 static DWORD Exit = false;
112 static DWORD ExitPending = false;
116 extern "C" wchar_t RDR_UNCName[64]=L"AFS";
118 /* returns 0 on success */
126 DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
128 dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
129 0, KEY_QUERY_VALUE, &parmKey);
130 if (dwRet == ERROR_SUCCESS) {
131 dummyLen = sizeof(numSvThreads);
132 dwRet = RegQueryValueEx(parmKey, TEXT("ServerThreads"), NULL, NULL,
133 (BYTE *) &numSvThreads, &dummyLen);
135 dummyLen = sizeof(RDR_UNCName);
136 dwRet = RegQueryValueExW(parmKey, L"NetbiosName", NULL, NULL,
137 (BYTE *) RDR_UNCName, &dummyLen);
139 RegCloseKey (parmKey);
142 // Initialize the Thread local storage index for the overlapped i/o
144 dwOvEvIdx = TlsAlloc();
149 // Launch our workers down to the
150 // filters control device for processing requests
153 dwRet = RDR_ProcessWorkerThreads(numSvThreads);
155 if (dwRet == ERROR_SUCCESS) {
163 BOOL RDR_DeviceIoControl( HANDLE hDevice,
164 DWORD dwIoControlCode,
168 DWORD nOutBufferSize,
169 LPDWORD lpBytesReturned )
176 ZeroMemory(&ov, sizeof(OVERLAPPED));
178 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
179 if (hEvent == NULL) {
180 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
181 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
183 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
188 *lpBytesReturned = 0;
190 rc = DeviceIoControl( hDevice,
199 gle = GetLastError();
201 if ( gle == ERROR_IO_PENDING )
202 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
209 RDR_ShutdownFinal(void)
217 // Close all the worker thread handles
220 while( dwIndex < glThreadHandleIndex)
223 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
228 if( glDevHandle != INVALID_HANDLE_VALUE)
231 CloseHandle( glDevHandle);
238 RDR_ShutdownNotify(void)
241 HANDLE hDevHandle = NULL;
245 // We use the global handle to the control device instance
248 hDevHandle = glDevHandle;
252 // First, notify the file system driver that
253 // we are shutting down.
258 if( !RDR_DeviceIoControl( hDevHandle,
266 // log the error, nothing to do
273 // Here we launch the worker threads for the given volume
277 RDR_ProcessWorkerThreads(DWORD numThreads)
282 DWORD bytesReturned = 0;
283 DWORD dwRedirInitInfo;
284 AFSRedirectorInitInfo * redirInitInfo = NULL;
287 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
290 glDevHandle = CreateFile( AFS_SYMLINK_W,
291 GENERIC_READ | GENERIC_WRITE,
292 FILE_SHARE_READ | FILE_SHARE_WRITE,
295 FILE_FLAG_OVERLAPPED,
298 if( glDevHandle == INVALID_HANDLE_VALUE)
301 return GetLastError();
305 // Now call down to initialize the pool.
308 if( !RDR_DeviceIoControl( glDevHandle,
309 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
317 CloseHandle( glDevHandle);
323 return GetLastError();
327 // OK, now launch the workers
330 hEvent = CreateEvent( NULL,
336 // Here we create a pool of worker threads but you can create the pool with as many requests
340 if (numThreads < MIN_WORKER_THREADS)
341 numThreads = MIN_WORKER_THREADS;
342 else if (numThreads > MAX_WORKER_THREADS)
343 numThreads = MAX_WORKER_THREADS;
345 for (index = 0; index < numThreads; index++)
348 // 20% of worker threads should be reserved for release extent
351 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
352 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
353 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
354 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
357 RDR_RequestWorkerThread,
358 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
362 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
366 // Wait for the thread to signal it is ready for processing
369 WaitForSingleObject( hEvent,
372 glThreadHandleIndex++;
380 // Perform cleanup specific to your application
386 if( !RDR_DeviceIoControl( glDevHandle,
387 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
395 CloseHandle( glDevHandle);
401 return GetLastError();
410 // Entry point for the worker thread
415 RDR_RequestWorkerThread( LPVOID lpParameter)
418 HANDLE hDevHandle = NULL;
420 AFSCommRequest *requestBuffer;
422 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
425 // We use the global handle to the control device instance
428 hDevHandle = glDevHandle;
431 // Allocate a request buffer.
434 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
440 // Here we simply signal back to the main thread that we ahve started
443 SetEvent( pInfo->hEvent);
446 // Process requests until we are told to stop
452 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
454 requestBuffer->RequestFlags = pInfo->Flags;
456 if( !RDR_DeviceIoControl( hDevHandle,
457 IOCTL_AFS_PROCESS_IRP_REQUEST,
458 (void *)requestBuffer,
459 sizeof( AFSCommRequest),
460 (void *)requestBuffer,
461 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
466 // Error condition back from driver
473 // Go process the request
477 RDR_ProcessRequest( requestBuffer);
480 free( requestBuffer);
489 // This is the entry point for the worker threads to process the request from the TC Filter driver
493 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
499 ULONG ulCreateFlags = 0;
500 AFSCommResult * pResultCB = NULL;
501 AFSCommResult stResultCB;
502 DWORD dwResultBufferLength = 0;
503 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
504 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
505 WCHAR wchBuffer[1024];
506 char *pBuffer = (char *)wchBuffer;
508 cm_user_t * userp = NULL;
509 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
510 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
511 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
512 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
513 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
514 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
515 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
517 BOOL bUnsupported = FALSE;
518 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
520 userp = RDR_UserFromCommRequest(RequestBuffer);
524 // Build up the string to display based on the request type.
527 switch( RequestBuffer->RequestType)
530 case AFS_REQUEST_TYPE_DIR_ENUM:
533 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
535 if (afsd_logp->enabled) {
537 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
538 RequestBuffer->RequestIndex);
540 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
544 // Here is where the content of the specific directory is enumerated.
547 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
548 pQueryCB, bWow64, bFast,
549 RequestBuffer->ResultBufferLength,
554 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
556 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
558 if (afsd_logp->enabled) {
560 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
561 RequestBuffer->RequestIndex);
563 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
566 // Here is where the specified node is evaluated.
569 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
570 RequestBuffer->FileId,
571 bWow64, bFast, bHoldFid,
572 RequestBuffer->ResultBufferLength,
577 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
579 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
581 if (afsd_logp->enabled) {
583 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
584 RequestBuffer->RequestIndex);
586 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
589 // Here is where the specified node is evaluated.
592 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
594 RequestBuffer->NameLength,
595 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
596 bWow64, bFast, bHoldFid,
597 RequestBuffer->ResultBufferLength,
602 case AFS_REQUEST_TYPE_CREATE_FILE:
605 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
607 WCHAR wchFileName[ 256];
609 if (afsd_logp->enabled) {
610 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
614 RequestBuffer->NameLength);
616 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
617 RequestBuffer->RequestIndex, wchFileName);
619 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
622 RDR_CreateFileEntry( userp,
624 RequestBuffer->NameLength,
628 RequestBuffer->ResultBufferLength,
634 case AFS_REQUEST_TYPE_UPDATE_FILE:
637 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
639 if (afsd_logp->enabled) {
640 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
641 RequestBuffer->RequestIndex,
642 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
643 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
645 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
648 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
651 RequestBuffer->ResultBufferLength,
657 case AFS_REQUEST_TYPE_DELETE_FILE:
660 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
662 if (afsd_logp->enabled) {
663 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
664 RequestBuffer->RequestIndex,
665 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
666 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
669 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
672 RDR_DeleteFileEntry( userp,
674 pDeleteCB->ProcessId,
676 RequestBuffer->NameLength,
679 RequestBuffer->ResultBufferLength,
685 case AFS_REQUEST_TYPE_RENAME_FILE:
688 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
690 if (afsd_logp->enabled) {
691 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
692 RequestBuffer->RequestIndex,
693 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
694 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
695 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
697 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
700 RDR_RenameFileEntry( userp,
702 RequestBuffer->NameLength,
703 RequestBuffer->FileId,
706 RequestBuffer->ResultBufferLength,
712 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
715 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
717 if (afsd_logp->enabled) {
718 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
719 RequestBuffer->RequestIndex,
720 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
721 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
722 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
724 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
727 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
728 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
731 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
732 pFileRequestExtentsCB,
734 &dwResultBufferLength,
735 &SetFileExtentsResultCB );
739 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
742 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
744 if (afsd_logp->enabled) {
745 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX",
746 RequestBuffer->RequestIndex,
747 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
748 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
750 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
753 RDR_ReleaseFileExtents( userp, RequestBuffer->FileId,
754 pFileReleaseExtentsCB,
756 RequestBuffer->ResultBufferLength,
762 case AFS_REQUEST_TYPE_FLUSH_FILE:
764 if (afsd_logp->enabled) {
765 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
766 RequestBuffer->RequestIndex,
767 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
768 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
770 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
773 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
775 RequestBuffer->ResultBufferLength,
780 case AFS_REQUEST_TYPE_OPEN_FILE:
782 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
784 if (afsd_logp->enabled) {
785 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
786 RequestBuffer->RequestIndex,
787 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
788 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
790 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
793 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
797 RequestBuffer->ResultBufferLength,
803 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
805 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
807 if (afsd_logp->enabled) {
808 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
809 RequestBuffer->RequestIndex,
810 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
811 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
813 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
816 RDR_ReleaseFileAccess( userp,
817 RequestBuffer->FileId,
818 pFileAccessReleaseCB,
820 RequestBuffer->ResultBufferLength,
826 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
828 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
830 if (afsd_logp->enabled) {
831 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
832 RequestBuffer->RequestIndex,
833 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
834 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
836 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
839 RDR_PioctlOpen( userp,
840 RequestBuffer->FileId,
843 RequestBuffer->ResultBufferLength,
848 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
850 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
852 if (afsd_logp->enabled) {
853 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
854 RequestBuffer->RequestIndex,
855 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
856 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
858 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
861 RDR_PioctlWrite( userp,
862 RequestBuffer->FileId,
865 RequestBuffer->ResultBufferLength,
870 case AFS_REQUEST_TYPE_PIOCTL_READ:
872 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
874 if (afsd_logp->enabled) {
875 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
876 RequestBuffer->RequestIndex,
877 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
878 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
880 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
883 RDR_PioctlRead( userp,
884 RequestBuffer->FileId,
888 RequestBuffer->ResultBufferLength,
893 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
895 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
897 if (afsd_logp->enabled) {
898 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
899 RequestBuffer->RequestIndex,
900 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
901 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
903 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
906 RDR_PioctlClose( userp,
907 RequestBuffer->FileId,
910 RequestBuffer->ResultBufferLength,
916 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
918 if (afsd_logp->enabled) {
919 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
920 RequestBuffer->RequestIndex,
921 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
922 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
923 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
925 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
928 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
930 RDR_ByteRangeLockSync( userp,
931 RequestBuffer->FileId,
934 RequestBuffer->ResultBufferLength,
940 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
942 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
944 if (afsd_logp->enabled) {
945 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
946 RequestBuffer->RequestIndex,
947 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
948 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
950 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
953 RDR_ByteRangeUnlock( userp,
954 RequestBuffer->FileId,
957 RequestBuffer->ResultBufferLength,
962 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
964 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
966 if (afsd_logp->enabled) {
967 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
968 RequestBuffer->RequestIndex,
969 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
970 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
972 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
975 RDR_ByteRangeUnlockAll( userp,
976 RequestBuffer->FileId,
979 RequestBuffer->ResultBufferLength,
984 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
986 if (afsd_logp->enabled) {
987 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
988 RequestBuffer->RequestIndex,
989 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
990 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
992 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
995 RDR_GetVolumeInfo( userp,
996 RequestBuffer->FileId,
998 RequestBuffer->ResultBufferLength,
1003 case AFS_REQUEST_TYPE_HOLD_FID:
1006 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1008 if (afsd_logp->enabled) {
1009 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1010 RequestBuffer->RequestIndex);
1012 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1018 RequestBuffer->ResultBufferLength,
1024 case AFS_REQUEST_TYPE_RELEASE_FID:
1027 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1029 if (afsd_logp->enabled) {
1030 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1031 RequestBuffer->RequestIndex);
1033 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1036 RDR_ReleaseFid( userp,
1039 RequestBuffer->ResultBufferLength,
1045 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1048 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1050 if (afsd_logp->enabled) {
1051 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1052 RequestBuffer->RequestIndex,
1053 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1054 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1056 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1059 RDR_CleanupFileEntry( userp,
1060 RequestBuffer->FileId,
1061 RequestBuffer->Name,
1062 RequestBuffer->NameLength,
1068 RequestBuffer->ResultBufferLength,
1074 case AFS_REQUEST_TYPE_PIPE_OPEN:
1076 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1078 if (afsd_logp->enabled) {
1079 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1080 RequestBuffer->RequestIndex,
1081 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1082 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1084 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1087 RDR_PipeOpen( userp,
1088 RequestBuffer->FileId,
1089 RequestBuffer->Name,
1090 RequestBuffer->NameLength,
1093 RequestBuffer->ResultBufferLength,
1098 case AFS_REQUEST_TYPE_PIPE_WRITE:
1100 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1101 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1103 if (afsd_logp->enabled) {
1104 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1105 RequestBuffer->RequestIndex,
1106 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1107 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1109 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1112 RDR_PipeWrite( userp,
1113 RequestBuffer->FileId,
1117 RequestBuffer->ResultBufferLength,
1122 case AFS_REQUEST_TYPE_PIPE_READ:
1124 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1126 if (afsd_logp->enabled) {
1127 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1128 RequestBuffer->RequestIndex,
1129 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1130 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1132 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1135 RDR_PipeRead( userp,
1136 RequestBuffer->FileId,
1139 RequestBuffer->ResultBufferLength,
1144 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1146 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1148 if (afsd_logp->enabled) {
1149 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1150 RequestBuffer->RequestIndex,
1151 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1152 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1154 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1157 RDR_PipeClose( userp,
1158 RequestBuffer->FileId,
1161 RequestBuffer->ResultBufferLength,
1167 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1169 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1170 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1172 if (afsd_logp->enabled) {
1173 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1174 RequestBuffer->RequestIndex);
1176 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1179 RDR_PipeTransceive( userp,
1180 RequestBuffer->FileId,
1184 RequestBuffer->ResultBufferLength,
1189 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1191 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1193 if (afsd_logp->enabled) {
1194 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1195 RequestBuffer->RequestIndex);
1197 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1200 RDR_PipeQueryInfo( userp,
1201 RequestBuffer->FileId,
1204 RequestBuffer->ResultBufferLength,
1209 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1211 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1212 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1214 if (afsd_logp->enabled) {
1215 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1216 RequestBuffer->RequestIndex);
1218 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1221 RDR_PipeSetInfo( userp,
1222 RequestBuffer->FileId,
1226 RequestBuffer->ResultBufferLength,
1233 bUnsupported = TRUE;
1235 if (afsd_logp->enabled) {
1236 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1237 RequestBuffer->RequestType,
1238 RequestBuffer->RequestIndex);
1240 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1246 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1248 if (pResultCB == NULL) {
1249 // We failed probably due to a memory allocation error
1250 // unless the unsupported flag was set.
1251 pResultCB = &stResultCB;
1252 memset(&stResultCB, 0, sizeof(stResultCB));
1254 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1256 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1260 // This is how the filter associates the response information passed in the IOCtl below to the
1261 // original call. This request index is setup by the filter and should not be modified, otherwise the
1262 // filter will not be able to locate the request in its internal queue and the blocking thread will
1266 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1268 if (afsd_logp->enabled) {
1269 swprintf( wchBuffer,
1270 L"ProcessRequest Responding to Index %08lX Length %08lX",
1271 pResultCB->RequestIndex,
1272 pResultCB->ResultBufferLength);
1274 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1278 // Now post the result back to the driver.
1281 if( !RDR_DeviceIoControl( glDevHandle,
1282 IOCTL_AFS_PROCESS_IRP_RESULT,
1284 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1289 char *pBuffer = (char *)wchBuffer;
1290 gle = GetLastError();
1291 if (afsd_logp->enabled) {
1292 swprintf( wchBuffer,
1293 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1294 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1298 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1300 osi_panic(pBuffer, __FILE__, __LINE__);
1304 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1306 if (SetFileExtentsResultCB) {
1308 if (1 || afsd_logp->enabled) {
1309 if (SetFileExtentsResultCB->ResultStatus != 0)
1310 swprintf( wchBuffer,
1311 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1312 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1314 swprintf( wchBuffer,
1315 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1316 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1318 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1321 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1322 SetFileExtentsResultCB->ResultStatus != 0) &&
1323 !RDR_DeviceIoControl( glDevHandle,
1324 IOCTL_AFS_SET_FILE_EXTENTS,
1325 (void *)SetFileExtentsResultCB,
1326 dwResultBufferLength,
1331 gle = GetLastError();
1332 if (afsd_logp->enabled) {
1333 swprintf( wchBuffer,
1334 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1336 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1339 // The file system returns an error when it can't find the FID
1340 // This is a bug in the file system but we should try to avoid
1341 // the crash and clean up our own memory space.
1343 // Since we couldn't deliver the extents to the file system
1344 // we should release them.
1345 if ( SetFileExtentsResultCB->ExtentCount != 0)
1347 RDR_ReleaseFailedSetFileExtents( userp,
1348 SetFileExtentsResultCB,
1349 dwResultBufferLength);
1352 if (gle != ERROR_GEN_FAILURE) {
1354 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1356 osi_panic(pBuffer, __FILE__, __LINE__);
1360 free(SetFileExtentsResultCB);
1363 /* Must be out of memory */
1364 if (afsd_logp->enabled) {
1365 swprintf( wchBuffer,
1366 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1367 RequestBuffer->RequestIndex);
1369 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1372 RDR_SetFileStatus( (cm_fid_t *)&RequestBuffer->FileId, STATUS_NO_MEMORY);
1375 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1377 if (afsd_logp->enabled) {
1378 swprintf( wchBuffer,
1379 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1380 RequestBuffer->RequestIndex);
1382 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1386 if (SetByteRangeLockResultCB) {
1388 if( !RDR_DeviceIoControl( glDevHandle,
1389 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1390 (void *)SetByteRangeLockResultCB,
1391 dwResultBufferLength,
1396 gle = GetLastError();
1398 if (afsd_logp->enabled) {
1399 swprintf( wchBuffer,
1400 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1401 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1405 // TODO - instead of a panic we should release the locks
1407 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1408 osi_panic(pBuffer, __FILE__, __LINE__);
1411 free(SetByteRangeLockResultCB);
1413 /* Must be out of memory */
1414 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1416 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1417 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1418 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1419 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1421 if( !RDR_DeviceIoControl( glDevHandle,
1422 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1423 (void *)&SetByteRangeLockResultCB,
1424 dwResultBufferLength,
1429 gle = GetLastError();
1431 if (afsd_logp->enabled) {
1432 swprintf( wchBuffer,
1433 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1434 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1437 /* We were out of memory - nothing to do */
1443 if (afsd_logp->enabled) {
1444 swprintf( wchBuffer,
1445 L"ProcessRequest Not responding to async Index %08lX",
1446 RequestBuffer->RequestIndex);
1448 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1456 RDR_ReleaseUser(userp);
1459 if( pResultCB && pResultCB != &stResultCB)
1469 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1470 DWORD dwResultBufferLength)
1472 WCHAR wchBuffer[1024];
1473 DWORD bytesReturned;
1476 if (1 || afsd_logp->enabled) {
1477 if (pSetFileExtentsResultCB->ResultStatus != 0)
1478 swprintf( wchBuffer,
1479 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1480 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1482 swprintf( wchBuffer,
1483 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1484 pSetFileExtentsResultCB->ExtentCount);
1486 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1489 if( !RDR_DeviceIoControl( glDevHandle,
1490 IOCTL_AFS_SET_FILE_EXTENTS,
1491 (void *)pSetFileExtentsResultCB,
1492 dwResultBufferLength,
1497 gle = GetLastError();
1506 RDR_SetFileStatus( cm_fid_t *fidp,
1509 WCHAR wchBuffer[1024];
1510 AFSExtentFailureCB SetFileStatusCB;
1511 DWORD bytesReturned;
1513 AFSFileID *pFileId = (AFSFileID *)fidp;
1515 SetFileStatusCB.FileId = *pFileId;
1516 SetFileStatusCB.FailureStatus = dwStatus;
1518 if (afsd_logp->enabled) {
1519 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1520 pFileId->Cell, pFileId->Volume,
1521 pFileId->Vnode, pFileId->Unique,
1524 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1527 if( !RDR_DeviceIoControl( glDevHandle,
1528 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1529 (void *)&SetFileStatusCB,
1530 sizeof(AFSExtentFailureCB),
1535 gle = GetLastError();
1544 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1547 HANDLE hDevHandle = NULL;
1548 DWORD bytesReturned;
1549 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1550 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1551 DWORD requestBufferLen, responseBufferLen;
1552 bool bError = false;
1554 WCHAR wchBuffer[256];
1558 if (afsd_logp->enabled) {
1559 swprintf( wchBuffer,
1560 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1562 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1565 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1566 return CM_ERROR_WOULDBLOCK;
1569 if (afsd_logp->enabled) {
1570 swprintf( wchBuffer,
1571 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1574 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1578 // We use the global handle to the control device instance
1581 hDevHandle = glDevHandle;
1584 // Allocate a request buffer.
1587 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1588 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1589 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1590 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1593 if( requestBuffer && responseBuffer)
1596 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1597 memset( responseBuffer, '\0', responseBufferLen);
1599 // If there is a FID provided, use it
1600 if (fidp && extentList)
1602 RDR_fid2FID( fidp, &requestBuffer->FileId);
1604 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1606 requestBuffer->Flags = 0;
1609 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1612 // Set the number of extents to be freed
1613 // Leave the rest of the structure as zeros to indicate free anything
1614 requestBuffer->ExtentCount = numOfExtents;
1616 requestBuffer->HeldExtentCount = numOfHeldExtents;
1618 if( !RDR_DeviceIoControl( hDevHandle,
1619 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1620 (void *)requestBuffer,
1622 (void *)responseBuffer,
1627 // Error condition back from driver
1629 if (afsd_logp->enabled) {
1630 gle = GetLastError();
1631 swprintf( wchBuffer,
1632 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1633 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1640 // Go process the request
1643 if (afsd_logp->enabled) {
1644 swprintf( wchBuffer,
1645 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1646 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1647 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1650 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1658 free( requestBuffer);
1660 free( responseBuffer);
1667 RDR_NetworkStatus(BOOLEAN status)
1670 HANDLE hDevHandle = NULL;
1671 DWORD bytesReturned;
1672 AFSNetworkStatusCB *requestBuffer = NULL;
1674 WCHAR wchBuffer[256];
1677 if (afsd_logp->enabled) {
1678 swprintf( wchBuffer,
1679 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1682 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1686 // We use the global handle to the control device instance
1689 hDevHandle = glDevHandle;
1692 // Allocate a request buffer.
1695 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1701 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1703 // Set the number of extents to be freed
1704 // Leave the rest of the structure as zeros to indicate free anything
1705 requestBuffer->Online = status;
1707 if( !RDR_DeviceIoControl( hDevHandle,
1708 IOCTL_AFS_NETWORK_STATUS,
1709 (void *)requestBuffer,
1710 sizeof( AFSNetworkStatusCB),
1716 // Error condition back from driver
1718 if (afsd_logp->enabled) {
1719 gle = GetLastError();
1720 swprintf( wchBuffer,
1721 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1723 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1734 free( requestBuffer);
1742 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1745 HANDLE hDevHandle = NULL;
1746 DWORD bytesReturned;
1747 AFSVolumeStatusCB *requestBuffer = NULL;
1749 WCHAR wchBuffer[256];
1752 if (afsd_logp->enabled) {
1753 swprintf( wchBuffer,
1754 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1755 cellID, volID, online);
1757 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1761 // We use the global handle to the control device instance
1764 hDevHandle = glDevHandle;
1767 // Allocate a request buffer.
1770 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1776 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1778 requestBuffer->FileID.Cell = cellID;
1779 requestBuffer->FileID.Volume = volID;
1780 requestBuffer->Online = online;
1782 if( !RDR_DeviceIoControl( hDevHandle,
1783 IOCTL_AFS_VOLUME_STATUS,
1784 (void *)requestBuffer,
1785 sizeof( AFSVolumeStatusCB),
1791 // Error condition back from driver
1794 if (afsd_logp->enabled) {
1795 gle = GetLastError();
1796 swprintf( wchBuffer,
1797 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1798 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1809 free( requestBuffer);
1815 RDR_NetworkAddrChange(void)
1822 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1825 HANDLE hDevHandle = NULL;
1826 DWORD bytesReturned;
1827 AFSInvalidateCacheCB *requestBuffer = NULL;
1829 WCHAR wchBuffer[256];
1832 if (afsd_logp->enabled) {
1833 swprintf( wchBuffer,
1834 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1835 cellID, volID, reason);
1837 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1841 // We use the global handle to the control device instance
1844 hDevHandle = glDevHandle;
1847 // Allocate a request buffer.
1850 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1856 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1858 requestBuffer->FileID.Cell = cellID;
1859 requestBuffer->FileID.Volume = volID;
1860 requestBuffer->WholeVolume = TRUE;
1861 requestBuffer->Reason = reason;
1863 if( !RDR_DeviceIoControl( hDevHandle,
1864 IOCTL_AFS_INVALIDATE_CACHE,
1865 (void *)requestBuffer,
1866 sizeof( AFSInvalidateCacheCB),
1872 // Error condition back from driver
1875 if (afsd_logp->enabled) {
1876 gle = GetLastError();
1877 swprintf( wchBuffer,
1878 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
1879 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1890 free( requestBuffer);
1897 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
1900 HANDLE hDevHandle = NULL;
1901 DWORD bytesReturned;
1902 AFSInvalidateCacheCB *requestBuffer = NULL;
1904 WCHAR wchBuffer[256];
1907 if (afsd_logp->enabled) {
1908 swprintf( wchBuffer,
1909 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",
1910 cellID, volID, vnode, uniq, hash, fileType, reason);
1912 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1916 // We use the global handle to the control device instance
1919 hDevHandle = glDevHandle;
1922 // Allocate a request buffer.
1925 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1931 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1933 requestBuffer->FileID.Cell = cellID;
1934 requestBuffer->FileID.Volume = volID;
1935 requestBuffer->FileID.Vnode = vnode;
1936 requestBuffer->FileID.Unique = uniq;
1937 requestBuffer->FileID.Hash = hash;
1938 requestBuffer->FileType = fileType;
1939 requestBuffer->WholeVolume = FALSE;
1940 requestBuffer->Reason = reason;
1942 if( !RDR_DeviceIoControl( hDevHandle,
1943 IOCTL_AFS_INVALIDATE_CACHE,
1944 (void *)requestBuffer,
1945 sizeof( AFSInvalidateCacheCB),
1951 // Error condition back from driver
1953 if (afsd_logp->enabled) {
1954 gle = GetLastError();
1955 swprintf( wchBuffer,
1956 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
1957 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1968 free( requestBuffer);
1976 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
1979 HANDLE hDevHandle = NULL;
1980 DWORD bytesReturned;
1981 AFSSysNameNotificationCB *requestBuffer = NULL;
1983 WCHAR wchBuffer[256];
1987 if (afsd_logp->enabled) {
1988 swprintf( wchBuffer,
1989 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
1990 Architecture, Count);
1992 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1995 if (Count <= 0 || NameList == NULL)
1999 // We use the global handle to the control device instance
2002 hDevHandle = glDevHandle;
2005 // Allocate a request buffer.
2008 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2009 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2016 memset( requestBuffer, '\0', Length);
2018 requestBuffer->Architecture = Architecture;
2019 requestBuffer->NumberOfNames = Count;
2020 for ( i=0 ; i<Count; i++) {
2021 size_t len = wcslen(NameList[i]);
2022 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2023 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2027 if( !RDR_DeviceIoControl( hDevHandle,
2028 IOCTL_AFS_SYSNAME_NOTIFICATION,
2029 (void *)requestBuffer,
2036 // Error condition back from driver
2038 if (afsd_logp->enabled) {
2039 gle = GetLastError();
2040 swprintf( wchBuffer,
2041 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2042 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2053 free( requestBuffer);