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_PIOCTL_OPEN:
805 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
807 if (afsd_logp->enabled) {
808 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %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_PioctlOpen( userp,
817 RequestBuffer->FileId,
820 RequestBuffer->ResultBufferLength,
825 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
827 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
829 if (afsd_logp->enabled) {
830 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
831 RequestBuffer->RequestIndex,
832 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
833 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
835 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
838 RDR_PioctlWrite( userp,
839 RequestBuffer->FileId,
842 RequestBuffer->ResultBufferLength,
847 case AFS_REQUEST_TYPE_PIOCTL_READ:
849 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
851 if (afsd_logp->enabled) {
852 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
853 RequestBuffer->RequestIndex,
854 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
855 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
857 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
860 RDR_PioctlRead( userp,
861 RequestBuffer->FileId,
865 RequestBuffer->ResultBufferLength,
870 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
872 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
874 if (afsd_logp->enabled) {
875 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE 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_PioctlClose( userp,
884 RequestBuffer->FileId,
887 RequestBuffer->ResultBufferLength,
893 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
895 if (afsd_logp->enabled) {
896 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
897 RequestBuffer->RequestIndex,
898 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
899 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
900 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
902 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
905 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
907 RDR_ByteRangeLockSync( userp,
908 RequestBuffer->FileId,
911 RequestBuffer->ResultBufferLength,
917 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
919 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
921 if (afsd_logp->enabled) {
922 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
923 RequestBuffer->RequestIndex,
924 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
925 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
927 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
930 RDR_ByteRangeUnlock( userp,
931 RequestBuffer->FileId,
934 RequestBuffer->ResultBufferLength,
939 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
941 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
943 if (afsd_logp->enabled) {
944 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
945 RequestBuffer->RequestIndex,
946 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
947 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
949 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
952 RDR_ByteRangeUnlockAll( userp,
953 RequestBuffer->FileId,
956 RequestBuffer->ResultBufferLength,
961 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
963 if (afsd_logp->enabled) {
964 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
965 RequestBuffer->RequestIndex,
966 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
967 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
969 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
972 RDR_GetVolumeInfo( userp,
973 RequestBuffer->FileId,
975 RequestBuffer->ResultBufferLength,
980 case AFS_REQUEST_TYPE_HOLD_FID:
983 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
985 if (afsd_logp->enabled) {
986 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
987 RequestBuffer->RequestIndex);
989 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
995 RequestBuffer->ResultBufferLength,
1001 case AFS_REQUEST_TYPE_RELEASE_FID:
1004 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1006 if (afsd_logp->enabled) {
1007 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1008 RequestBuffer->RequestIndex);
1010 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1013 RDR_ReleaseFid( userp,
1016 RequestBuffer->ResultBufferLength,
1022 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1025 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1027 if (afsd_logp->enabled) {
1028 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE 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_CleanupFileEntry( userp,
1037 RequestBuffer->FileId,
1038 RequestBuffer->Name,
1039 RequestBuffer->NameLength,
1045 RequestBuffer->ResultBufferLength,
1051 case AFS_REQUEST_TYPE_PIPE_OPEN:
1053 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1055 if (afsd_logp->enabled) {
1056 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1057 RequestBuffer->RequestIndex,
1058 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1059 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1061 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1064 RDR_PipeOpen( userp,
1065 RequestBuffer->FileId,
1066 RequestBuffer->Name,
1067 RequestBuffer->NameLength,
1070 RequestBuffer->ResultBufferLength,
1075 case AFS_REQUEST_TYPE_PIPE_WRITE:
1077 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1078 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1080 if (afsd_logp->enabled) {
1081 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1082 RequestBuffer->RequestIndex,
1083 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1084 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1086 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1089 RDR_PipeWrite( userp,
1090 RequestBuffer->FileId,
1094 RequestBuffer->ResultBufferLength,
1099 case AFS_REQUEST_TYPE_PIPE_READ:
1101 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1103 if (afsd_logp->enabled) {
1104 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ 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_PipeRead( userp,
1113 RequestBuffer->FileId,
1116 RequestBuffer->ResultBufferLength,
1121 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1123 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1125 if (afsd_logp->enabled) {
1126 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1127 RequestBuffer->RequestIndex,
1128 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1129 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1131 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1134 RDR_PipeClose( userp,
1135 RequestBuffer->FileId,
1138 RequestBuffer->ResultBufferLength,
1144 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1146 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1147 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1149 if (afsd_logp->enabled) {
1150 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1151 RequestBuffer->RequestIndex);
1153 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1156 RDR_PipeTransceive( userp,
1157 RequestBuffer->FileId,
1161 RequestBuffer->ResultBufferLength,
1166 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1168 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1170 if (afsd_logp->enabled) {
1171 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1172 RequestBuffer->RequestIndex);
1174 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1177 RDR_PipeQueryInfo( userp,
1178 RequestBuffer->FileId,
1181 RequestBuffer->ResultBufferLength,
1186 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1188 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1189 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1191 if (afsd_logp->enabled) {
1192 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1193 RequestBuffer->RequestIndex);
1195 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1198 RDR_PipeSetInfo( userp,
1199 RequestBuffer->FileId,
1203 RequestBuffer->ResultBufferLength,
1210 bUnsupported = TRUE;
1212 if (afsd_logp->enabled) {
1213 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1214 RequestBuffer->RequestType,
1215 RequestBuffer->RequestIndex);
1217 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1223 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1225 if (pResultCB == NULL) {
1226 // We failed probably due to a memory allocation error
1227 // unless the unsupported flag was set.
1228 pResultCB = &stResultCB;
1229 memset(&stResultCB, 0, sizeof(stResultCB));
1231 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1233 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1237 // This is how the filter associates the response information passed in the IOCtl below to the
1238 // original call. This request index is setup by the filter and should not be modified, otherwise the
1239 // filter will not be able to locate the request in its internal queue and the blocking thread will
1243 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1245 if (afsd_logp->enabled) {
1246 swprintf( wchBuffer,
1247 L"ProcessRequest Responding to Index %08lX Length %08lX",
1248 pResultCB->RequestIndex,
1249 pResultCB->ResultBufferLength);
1251 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1255 // Now post the result back to the driver.
1258 if( !RDR_DeviceIoControl( glDevHandle,
1259 IOCTL_AFS_PROCESS_IRP_RESULT,
1261 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1266 char *pBuffer = (char *)wchBuffer;
1267 gle = GetLastError();
1268 if (afsd_logp->enabled) {
1269 swprintf( wchBuffer,
1270 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1271 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1275 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1277 osi_panic(pBuffer, __FILE__, __LINE__);
1281 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1283 if (SetFileExtentsResultCB) {
1285 if (1 || afsd_logp->enabled) {
1286 if (SetFileExtentsResultCB->ResultStatus != 0)
1287 swprintf( wchBuffer,
1288 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1289 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1291 swprintf( wchBuffer,
1292 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1293 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1295 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1298 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1299 SetFileExtentsResultCB->ResultStatus != 0) &&
1300 !RDR_DeviceIoControl( glDevHandle,
1301 IOCTL_AFS_SET_FILE_EXTENTS,
1302 (void *)SetFileExtentsResultCB,
1303 dwResultBufferLength,
1308 gle = GetLastError();
1309 if (afsd_logp->enabled) {
1310 swprintf( wchBuffer,
1311 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1313 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1316 // The file system returns an error when it can't find the FID
1317 // This is a bug in the file system but we should try to avoid
1318 // the crash and clean up our own memory space.
1320 // Since we couldn't deliver the extents to the file system
1321 // we should release them.
1322 if ( SetFileExtentsResultCB->ExtentCount != 0)
1324 RDR_ReleaseFailedSetFileExtents( userp,
1325 SetFileExtentsResultCB,
1326 dwResultBufferLength);
1329 if (gle != ERROR_GEN_FAILURE) {
1331 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1333 osi_panic(pBuffer, __FILE__, __LINE__);
1337 free(SetFileExtentsResultCB);
1340 /* Must be out of memory */
1341 if (afsd_logp->enabled) {
1342 swprintf( wchBuffer,
1343 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1344 RequestBuffer->RequestIndex);
1346 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1349 RDR_SetFileStatus( (cm_fid_t *)&RequestBuffer->FileId, STATUS_NO_MEMORY);
1352 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1354 if (afsd_logp->enabled) {
1355 swprintf( wchBuffer,
1356 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1357 RequestBuffer->RequestIndex);
1359 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1363 if (SetByteRangeLockResultCB) {
1365 if( !RDR_DeviceIoControl( glDevHandle,
1366 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1367 (void *)SetByteRangeLockResultCB,
1368 dwResultBufferLength,
1373 gle = GetLastError();
1375 if (afsd_logp->enabled) {
1376 swprintf( wchBuffer,
1377 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1378 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1382 // TODO - instead of a panic we should release the locks
1384 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1385 osi_panic(pBuffer, __FILE__, __LINE__);
1388 free(SetByteRangeLockResultCB);
1390 /* Must be out of memory */
1391 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1393 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1394 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1395 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1396 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1398 if( !RDR_DeviceIoControl( glDevHandle,
1399 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1400 (void *)&SetByteRangeLockResultCB,
1401 dwResultBufferLength,
1406 gle = GetLastError();
1408 if (afsd_logp->enabled) {
1409 swprintf( wchBuffer,
1410 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1411 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1414 /* We were out of memory - nothing to do */
1420 if (afsd_logp->enabled) {
1421 swprintf( wchBuffer,
1422 L"ProcessRequest Not responding to async Index %08lX",
1423 RequestBuffer->RequestIndex);
1425 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1433 RDR_ReleaseUser(userp);
1436 if( pResultCB && pResultCB != &stResultCB)
1446 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1447 DWORD dwResultBufferLength)
1449 WCHAR wchBuffer[1024];
1450 DWORD bytesReturned;
1453 if (1 || afsd_logp->enabled) {
1454 if (pSetFileExtentsResultCB->ResultStatus != 0)
1455 swprintf( wchBuffer,
1456 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1457 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1459 swprintf( wchBuffer,
1460 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1461 pSetFileExtentsResultCB->ExtentCount);
1463 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1466 if( !RDR_DeviceIoControl( glDevHandle,
1467 IOCTL_AFS_SET_FILE_EXTENTS,
1468 (void *)pSetFileExtentsResultCB,
1469 dwResultBufferLength,
1474 gle = GetLastError();
1483 RDR_SetFileStatus( cm_fid_t *fidp,
1486 WCHAR wchBuffer[1024];
1487 AFSExtentFailureCB SetFileStatusCB;
1488 DWORD bytesReturned;
1490 AFSFileID *pFileId = (AFSFileID *)fidp;
1492 SetFileStatusCB.FileId = *pFileId;
1493 SetFileStatusCB.FailureStatus = dwStatus;
1495 if (afsd_logp->enabled) {
1496 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1497 pFileId->Cell, pFileId->Volume,
1498 pFileId->Vnode, pFileId->Unique,
1501 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1504 if( !RDR_DeviceIoControl( glDevHandle,
1505 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1506 (void *)&SetFileStatusCB,
1507 sizeof(AFSExtentFailureCB),
1512 gle = GetLastError();
1521 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1524 HANDLE hDevHandle = NULL;
1525 DWORD bytesReturned;
1526 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1527 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1528 DWORD requestBufferLen, responseBufferLen;
1529 bool bError = false;
1531 WCHAR wchBuffer[256];
1535 if (afsd_logp->enabled) {
1536 swprintf( wchBuffer,
1537 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1539 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1542 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1543 return CM_ERROR_WOULDBLOCK;
1546 if (afsd_logp->enabled) {
1547 swprintf( wchBuffer,
1548 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1551 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1555 // We use the global handle to the control device instance
1558 hDevHandle = glDevHandle;
1561 // Allocate a request buffer.
1564 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1565 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1566 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1567 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1570 if( requestBuffer && responseBuffer)
1573 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1574 memset( responseBuffer, '\0', responseBufferLen);
1576 // If there is a FID provided, use it
1577 if (fidp && extentList)
1579 RDR_fid2FID( fidp, &requestBuffer->FileId);
1581 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1583 requestBuffer->Flags = 0;
1586 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1589 // Set the number of extents to be freed
1590 // Leave the rest of the structure as zeros to indicate free anything
1591 requestBuffer->ExtentCount = numOfExtents;
1593 requestBuffer->HeldExtentCount = numOfHeldExtents;
1595 if( !RDR_DeviceIoControl( hDevHandle,
1596 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1597 (void *)requestBuffer,
1599 (void *)responseBuffer,
1604 // Error condition back from driver
1606 if (afsd_logp->enabled) {
1607 gle = GetLastError();
1608 swprintf( wchBuffer,
1609 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1610 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1617 // Go process the request
1620 if (afsd_logp->enabled) {
1621 swprintf( wchBuffer,
1622 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1623 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1624 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1627 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1635 free( requestBuffer);
1637 free( responseBuffer);
1644 RDR_NetworkStatus(BOOLEAN status)
1647 HANDLE hDevHandle = NULL;
1648 DWORD bytesReturned;
1649 AFSNetworkStatusCB *requestBuffer = NULL;
1651 WCHAR wchBuffer[256];
1654 if (afsd_logp->enabled) {
1655 swprintf( wchBuffer,
1656 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1659 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1663 // We use the global handle to the control device instance
1666 hDevHandle = glDevHandle;
1669 // Allocate a request buffer.
1672 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1678 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1680 // Set the number of extents to be freed
1681 // Leave the rest of the structure as zeros to indicate free anything
1682 requestBuffer->Online = status;
1684 if( !RDR_DeviceIoControl( hDevHandle,
1685 IOCTL_AFS_NETWORK_STATUS,
1686 (void *)requestBuffer,
1687 sizeof( AFSNetworkStatusCB),
1693 // Error condition back from driver
1695 if (afsd_logp->enabled) {
1696 gle = GetLastError();
1697 swprintf( wchBuffer,
1698 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1700 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1711 free( requestBuffer);
1719 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1722 HANDLE hDevHandle = NULL;
1723 DWORD bytesReturned;
1724 AFSVolumeStatusCB *requestBuffer = NULL;
1726 WCHAR wchBuffer[256];
1729 if (afsd_logp->enabled) {
1730 swprintf( wchBuffer,
1731 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1732 cellID, volID, online);
1734 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1738 // We use the global handle to the control device instance
1741 hDevHandle = glDevHandle;
1744 // Allocate a request buffer.
1747 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1753 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1755 requestBuffer->FileID.Cell = cellID;
1756 requestBuffer->FileID.Volume = volID;
1757 requestBuffer->Online = online;
1759 if( !RDR_DeviceIoControl( hDevHandle,
1760 IOCTL_AFS_VOLUME_STATUS,
1761 (void *)requestBuffer,
1762 sizeof( AFSVolumeStatusCB),
1768 // Error condition back from driver
1771 if (afsd_logp->enabled) {
1772 gle = GetLastError();
1773 swprintf( wchBuffer,
1774 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1775 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1786 free( requestBuffer);
1792 RDR_NetworkAddrChange(void)
1799 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1802 HANDLE hDevHandle = NULL;
1803 DWORD bytesReturned;
1804 AFSInvalidateCacheCB *requestBuffer = NULL;
1806 WCHAR wchBuffer[256];
1809 if (afsd_logp->enabled) {
1810 swprintf( wchBuffer,
1811 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1812 cellID, volID, reason);
1814 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1818 // We use the global handle to the control device instance
1821 hDevHandle = glDevHandle;
1824 // Allocate a request buffer.
1827 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1833 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1835 requestBuffer->FileID.Cell = cellID;
1836 requestBuffer->FileID.Volume = volID;
1837 requestBuffer->WholeVolume = TRUE;
1838 requestBuffer->Reason = reason;
1840 if( !RDR_DeviceIoControl( hDevHandle,
1841 IOCTL_AFS_INVALIDATE_CACHE,
1842 (void *)requestBuffer,
1843 sizeof( AFSInvalidateCacheCB),
1849 // Error condition back from driver
1852 if (afsd_logp->enabled) {
1853 gle = GetLastError();
1854 swprintf( wchBuffer,
1855 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
1856 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1867 free( requestBuffer);
1874 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
1877 HANDLE hDevHandle = NULL;
1878 DWORD bytesReturned;
1879 AFSInvalidateCacheCB *requestBuffer = NULL;
1881 WCHAR wchBuffer[256];
1884 if (afsd_logp->enabled) {
1885 swprintf( wchBuffer,
1886 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",
1887 cellID, volID, vnode, uniq, hash, fileType, reason);
1889 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1893 // We use the global handle to the control device instance
1896 hDevHandle = glDevHandle;
1899 // Allocate a request buffer.
1902 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1908 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1910 requestBuffer->FileID.Cell = cellID;
1911 requestBuffer->FileID.Volume = volID;
1912 requestBuffer->FileID.Vnode = vnode;
1913 requestBuffer->FileID.Unique = uniq;
1914 requestBuffer->FileID.Hash = hash;
1915 requestBuffer->FileType = fileType;
1916 requestBuffer->WholeVolume = FALSE;
1917 requestBuffer->Reason = reason;
1919 if( !RDR_DeviceIoControl( hDevHandle,
1920 IOCTL_AFS_INVALIDATE_CACHE,
1921 (void *)requestBuffer,
1922 sizeof( AFSInvalidateCacheCB),
1928 // Error condition back from driver
1930 if (afsd_logp->enabled) {
1931 gle = GetLastError();
1932 swprintf( wchBuffer,
1933 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
1934 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1945 free( requestBuffer);
1953 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
1956 HANDLE hDevHandle = NULL;
1957 DWORD bytesReturned;
1958 AFSSysNameNotificationCB *requestBuffer = NULL;
1960 WCHAR wchBuffer[256];
1964 if (afsd_logp->enabled) {
1965 swprintf( wchBuffer,
1966 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
1967 Architecture, Count);
1969 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1972 if (Count <= 0 || NameList == NULL)
1976 // We use the global handle to the control device instance
1979 hDevHandle = glDevHandle;
1982 // Allocate a request buffer.
1985 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
1986 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
1993 memset( requestBuffer, '\0', Length);
1995 requestBuffer->Architecture = Architecture;
1996 requestBuffer->NumberOfNames = Count;
1997 for ( i=0 ; i<Count; i++) {
1998 size_t len = wcslen(NameList[i]);
1999 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2000 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2004 if( !RDR_DeviceIoControl( hDevHandle,
2005 IOCTL_AFS_SYSNAME_NOTIFICATION,
2006 (void *)requestBuffer,
2013 // Error condition back from driver
2015 if (afsd_logp->enabled) {
2016 gle = GetLastError();
2017 swprintf( wchBuffer,
2018 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2019 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2030 free( requestBuffer);