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 HANDLE RDR_SuspendEvent = INVALID_HANDLE_VALUE;
120 /* returns 0 on success */
128 DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
130 // Initialize the Suspend Event
131 RDR_SuspendEvent = CreateEvent( NULL,
132 TRUE, // manual reset event
136 dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
137 0, KEY_QUERY_VALUE, &parmKey);
138 if (dwRet == ERROR_SUCCESS) {
139 dummyLen = sizeof(numSvThreads);
140 dwRet = RegQueryValueEx(parmKey, TEXT("ServerThreads"), NULL, NULL,
141 (BYTE *) &numSvThreads, &dummyLen);
143 dummyLen = sizeof(RDR_UNCName);
144 dwRet = RegQueryValueExW(parmKey, L"NetbiosName", NULL, NULL,
145 (BYTE *) RDR_UNCName, &dummyLen);
147 RegCloseKey (parmKey);
150 // Initialize the Thread local storage index for the overlapped i/o
152 dwOvEvIdx = TlsAlloc();
157 // Launch our workers down to the
158 // filters control device for processing requests
161 dwRet = RDR_ProcessWorkerThreads(numSvThreads);
163 if (dwRet == ERROR_SUCCESS) {
171 BOOL RDR_DeviceIoControl( HANDLE hDevice,
172 DWORD dwIoControlCode,
176 DWORD nOutBufferSize,
177 LPDWORD lpBytesReturned )
184 ZeroMemory(&ov, sizeof(OVERLAPPED));
186 hEvent = (HANDLE)TlsGetValue(dwOvEvIdx);
187 if (hEvent == NULL) {
188 hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
189 if (hEvent == INVALID_HANDLE_VALUE || hEvent == NULL)
191 TlsSetValue( dwOvEvIdx, (LPVOID) hEvent );
196 *lpBytesReturned = 0;
198 rc = DeviceIoControl( hDevice,
207 gle = GetLastError();
209 if ( gle == ERROR_IO_PENDING )
210 rc = GetOverlappedResult( hDevice, &ov, lpBytesReturned, TRUE );
217 RDR_ShutdownFinal(void)
225 // Close all the worker thread handles
228 while( dwIndex < glThreadHandleIndex)
231 CloseHandle( glWorkerThreadInfo[ dwIndex].hThread);
236 if( glDevHandle != INVALID_HANDLE_VALUE)
239 CloseHandle( glDevHandle);
246 RDR_ShutdownNotify(void)
249 HANDLE hDevHandle = NULL;
253 // We use the global handle to the control device instance
256 hDevHandle = glDevHandle;
260 // First, notify the file system driver that
261 // we are shutting down.
266 if( !RDR_DeviceIoControl( hDevHandle,
274 // log the error, nothing to do
281 // Here we launch the worker threads for the given volume
285 RDR_ProcessWorkerThreads(DWORD numThreads)
290 DWORD bytesReturned = 0;
291 DWORD dwRedirInitInfo;
292 AFSRedirectorInitInfo * redirInitInfo = NULL;
295 if (dwErr = RDR_SetInitParams(&redirInitInfo, &dwRedirInitInfo))
298 glDevHandle = CreateFile( AFS_SYMLINK_W,
299 GENERIC_READ | GENERIC_WRITE,
300 FILE_SHARE_READ | FILE_SHARE_WRITE,
303 FILE_FLAG_OVERLAPPED,
306 if( glDevHandle == INVALID_HANDLE_VALUE)
309 return GetLastError();
313 // Now call down to initialize the pool.
316 if( !RDR_DeviceIoControl( glDevHandle,
317 IOCTL_AFS_INITIALIZE_CONTROL_DEVICE,
325 CloseHandle( glDevHandle);
331 return GetLastError();
335 // OK, now launch the workers
338 hEvent = CreateEvent( NULL,
344 // Here we create a pool of worker threads but you can create the pool with as many requests
348 if (numThreads < MIN_WORKER_THREADS)
349 numThreads = MIN_WORKER_THREADS;
350 else if (numThreads > MAX_WORKER_THREADS)
351 numThreads = MAX_WORKER_THREADS;
353 for (index = 0; index < numThreads; index++)
356 // 20% of worker threads should be reserved for release extent
359 glWorkerThreadInfo[ glThreadHandleIndex].Flags =
360 (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
361 glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
362 glWorkerThreadInfo[ glThreadHandleIndex].hThread =
365 RDR_RequestWorkerThread,
366 (void *)&glWorkerThreadInfo[ glThreadHandleIndex],
370 if( glWorkerThreadInfo[ glThreadHandleIndex].hThread != NULL)
374 // Wait for the thread to signal it is ready for processing
377 WaitForSingleObject( hEvent,
380 glThreadHandleIndex++;
388 // Perform cleanup specific to your application
394 if( !RDR_DeviceIoControl( glDevHandle,
395 IOCTL_AFS_INITIALIZE_REDIRECTOR_DEVICE,
403 CloseHandle( glDevHandle);
409 return GetLastError();
418 // Entry point for the worker thread
423 RDR_RequestWorkerThread( LPVOID lpParameter)
426 HANDLE hDevHandle = NULL;
428 AFSCommRequest *requestBuffer;
430 WorkerThreadInfo * pInfo = (WorkerThreadInfo *)lpParameter;
433 // We use the global handle to the control device instance
436 hDevHandle = glDevHandle;
439 // Allocate a request buffer.
442 requestBuffer = (AFSCommRequest *)malloc( sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
448 // Here we simply signal back to the main thread that we ahve started
451 SetEvent( pInfo->hEvent);
454 // Process requests until we are told to stop
460 memset( requestBuffer, '\0', sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE);
462 requestBuffer->RequestFlags = pInfo->Flags;
464 if( !RDR_DeviceIoControl( hDevHandle,
465 IOCTL_AFS_PROCESS_IRP_REQUEST,
466 (void *)requestBuffer,
467 sizeof( AFSCommRequest),
468 (void *)requestBuffer,
469 sizeof( AFSCommRequest) + AFS_PAYLOAD_BUFFER_SIZE,
474 // Error condition back from driver
480 WaitForSingleObject( RDR_SuspendEvent, INFINITE);
483 // Go process the request
487 RDR_ProcessRequest( requestBuffer);
490 free( requestBuffer);
499 // This is the entry point for the worker threads to process the request from the TC Filter driver
503 RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
509 ULONG ulCreateFlags = 0;
510 AFSCommResult * pResultCB = NULL;
511 AFSCommResult stResultCB;
512 DWORD dwResultBufferLength = 0;
513 AFSSetFileExtentsCB * SetFileExtentsResultCB = NULL;
514 AFSSetByteRangeLockResultCB *SetByteRangeLockResultCB = NULL;
515 WCHAR wchBuffer[1024];
516 char *pBuffer = (char *)wchBuffer;
518 cm_user_t * userp = NULL;
519 BOOL bWow64 = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_WOW64) ? TRUE : FALSE;
520 BOOL bFast = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FAST_REQUEST) ? TRUE : FALSE;
521 BOOL bHoldFid = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_HOLD_FID) ? TRUE : FALSE;
522 BOOL bFlushFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FLUSH_FILE) ? TRUE : FALSE;
523 BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
524 BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
525 BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
527 BOOL bUnsupported = FALSE;
528 BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
530 userp = RDR_UserFromCommRequest(RequestBuffer);
534 // Build up the string to display based on the request type.
537 switch( RequestBuffer->RequestType)
540 case AFS_REQUEST_TYPE_DIR_ENUM:
543 AFSDirQueryCB *pQueryCB = (AFSDirQueryCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
545 if (afsd_logp->enabled) {
547 L"ProcessRequest Processing AFS_REQUEST_TYPE_DIR_ENUM Index %08lX",
548 RequestBuffer->RequestIndex);
550 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
554 // Here is where the content of the specific directory is enumerated.
557 RDR_EnumerateDirectory( userp, RequestBuffer->FileId,
558 pQueryCB, bWow64, bFast,
559 RequestBuffer->ResultBufferLength,
564 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID:
566 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
568 if (afsd_logp->enabled) {
570 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_ID Index %08lX",
571 RequestBuffer->RequestIndex);
573 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
576 // Here is where the specified node is evaluated.
579 RDR_EvaluateNodeByID( userp, pEvalTargetCB->ParentId,
580 RequestBuffer->FileId,
581 bWow64, bFast, bHoldFid,
582 RequestBuffer->ResultBufferLength,
587 case AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME:
589 AFSEvalTargetCB *pEvalTargetCB = (AFSEvalTargetCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
591 if (afsd_logp->enabled) {
593 L"ProcessRequest Processing AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME Index %08lX",
594 RequestBuffer->RequestIndex);
596 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
599 // Here is where the specified node is evaluated.
602 RDR_EvaluateNodeByName( userp, pEvalTargetCB->ParentId,
604 RequestBuffer->NameLength,
605 RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
606 bWow64, bFast, bHoldFid,
607 RequestBuffer->ResultBufferLength,
612 case AFS_REQUEST_TYPE_CREATE_FILE:
615 AFSFileCreateCB *pCreateCB = (AFSFileCreateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
617 WCHAR wchFileName[ 256];
619 if (afsd_logp->enabled) {
620 memset( wchFileName, '\0', 256 * sizeof( WCHAR));
624 RequestBuffer->NameLength);
626 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_FILE Index %08lX File %S",
627 RequestBuffer->RequestIndex, wchFileName);
629 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
632 RDR_CreateFileEntry( userp,
634 RequestBuffer->NameLength,
638 RequestBuffer->ResultBufferLength,
644 case AFS_REQUEST_TYPE_UPDATE_FILE:
647 AFSFileUpdateCB *pUpdateCB = (AFSFileUpdateCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
649 if (afsd_logp->enabled) {
650 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_UPDATE_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
651 RequestBuffer->RequestIndex,
652 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
653 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
655 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
658 RDR_UpdateFileEntry( userp, RequestBuffer->FileId,
661 RequestBuffer->ResultBufferLength,
667 case AFS_REQUEST_TYPE_DELETE_FILE:
670 AFSFileDeleteCB *pDeleteCB = (AFSFileDeleteCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
672 if (afsd_logp->enabled) {
673 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_DELETE_FILE Index %08lX %08lX.%08lX.%08lX.%08lX CheckOnly %X",
674 RequestBuffer->RequestIndex,
675 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
676 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
679 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
682 RDR_DeleteFileEntry( userp,
684 pDeleteCB->ProcessId,
686 RequestBuffer->NameLength,
689 RequestBuffer->ResultBufferLength,
695 case AFS_REQUEST_TYPE_RENAME_FILE:
698 AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
700 if (afsd_logp->enabled) {
701 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
702 RequestBuffer->RequestIndex,
703 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
704 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
705 RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
707 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
710 RDR_RenameFileEntry( userp,
712 RequestBuffer->NameLength,
713 RequestBuffer->FileId,
716 RequestBuffer->ResultBufferLength,
722 case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
725 AFSRequestExtentsCB *pFileRequestExtentsCB = (AFSRequestExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
727 if (afsd_logp->enabled) {
728 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
729 RequestBuffer->RequestIndex,
730 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
731 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
732 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
734 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
737 if (BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
738 osi_panic("SYNCHRONOUS AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS not supported",
741 bRetry = RDR_RequestFileExtentsAsync( userp, RequestBuffer->FileId,
742 pFileRequestExtentsCB,
744 &dwResultBufferLength,
745 &SetFileExtentsResultCB );
749 case AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS:
752 AFSReleaseExtentsCB *pFileReleaseExtentsCB = (AFSReleaseExtentsCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
754 if (afsd_logp->enabled) {
755 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS Index %08lX File %08lX.%08lX.%08lX.%08lX",
756 RequestBuffer->RequestIndex,
757 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
758 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
760 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
763 RDR_ReleaseFileExtents( userp, RequestBuffer->FileId,
764 pFileReleaseExtentsCB,
766 RequestBuffer->ResultBufferLength,
772 case AFS_REQUEST_TYPE_FLUSH_FILE:
774 if (afsd_logp->enabled) {
775 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_FLUSH_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
776 RequestBuffer->RequestIndex,
777 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
778 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
780 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
783 RDR_FlushFileEntry( userp, RequestBuffer->FileId,
785 RequestBuffer->ResultBufferLength,
790 case AFS_REQUEST_TYPE_OPEN_FILE:
792 AFSFileOpenCB *pFileOpenCB = (AFSFileOpenCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
794 if (afsd_logp->enabled) {
795 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_OPEN_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
796 RequestBuffer->RequestIndex,
797 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
798 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
800 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
803 RDR_OpenFileEntry( userp, RequestBuffer->FileId,
807 RequestBuffer->ResultBufferLength,
813 case AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS:
815 AFSFileAccessReleaseCB *pFileAccessReleaseCB = (AFSFileAccessReleaseCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
817 if (afsd_logp->enabled) {
818 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FILE_ACCESS Index %08lX File %08lX.%08lX.%08lX.%08lX",
819 RequestBuffer->RequestIndex,
820 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
821 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
823 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
826 RDR_ReleaseFileAccess( userp,
827 RequestBuffer->FileId,
828 pFileAccessReleaseCB,
830 RequestBuffer->ResultBufferLength,
836 case AFS_REQUEST_TYPE_PIOCTL_OPEN:
838 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
840 if (afsd_logp->enabled) {
841 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
842 RequestBuffer->RequestIndex,
843 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
844 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
846 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
849 RDR_PioctlOpen( userp,
850 RequestBuffer->FileId,
853 RequestBuffer->ResultBufferLength,
858 case AFS_REQUEST_TYPE_PIOCTL_WRITE:
860 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
862 if (afsd_logp->enabled) {
863 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
864 RequestBuffer->RequestIndex,
865 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
866 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
868 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
871 RDR_PioctlWrite( userp,
872 RequestBuffer->FileId,
875 RequestBuffer->ResultBufferLength,
880 case AFS_REQUEST_TYPE_PIOCTL_READ:
882 AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
884 if (afsd_logp->enabled) {
885 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
886 RequestBuffer->RequestIndex,
887 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
888 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
890 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
893 RDR_PioctlRead( userp,
894 RequestBuffer->FileId,
898 RequestBuffer->ResultBufferLength,
903 case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
905 AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
907 if (afsd_logp->enabled) {
908 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
909 RequestBuffer->RequestIndex,
910 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
911 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
913 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
916 RDR_PioctlClose( userp,
917 RequestBuffer->FileId,
920 RequestBuffer->ResultBufferLength,
926 case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
928 if (afsd_logp->enabled) {
929 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
930 RequestBuffer->RequestIndex,
931 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
932 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
933 BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
935 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
938 AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
940 RDR_ByteRangeLockSync( userp,
941 RequestBuffer->FileId,
944 RequestBuffer->ResultBufferLength,
950 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
952 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
954 if (afsd_logp->enabled) {
955 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
956 RequestBuffer->RequestIndex,
957 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
958 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
960 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
963 RDR_ByteRangeUnlock( userp,
964 RequestBuffer->FileId,
967 RequestBuffer->ResultBufferLength,
972 case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
974 AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
976 if (afsd_logp->enabled) {
977 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
978 RequestBuffer->RequestIndex,
979 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
980 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
982 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
985 RDR_ByteRangeUnlockAll( userp,
986 RequestBuffer->FileId,
989 RequestBuffer->ResultBufferLength,
994 case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
996 if (afsd_logp->enabled) {
997 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
998 RequestBuffer->RequestIndex,
999 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1000 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1002 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1005 RDR_GetVolumeInfo( userp,
1006 RequestBuffer->FileId,
1008 RequestBuffer->ResultBufferLength,
1013 case AFS_REQUEST_TYPE_HOLD_FID:
1016 AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1018 if (afsd_logp->enabled) {
1019 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
1020 RequestBuffer->RequestIndex);
1022 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1028 RequestBuffer->ResultBufferLength,
1034 case AFS_REQUEST_TYPE_RELEASE_FID:
1037 AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1039 if (afsd_logp->enabled) {
1040 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
1041 RequestBuffer->RequestIndex);
1043 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1046 RDR_ReleaseFid( userp,
1049 RequestBuffer->ResultBufferLength,
1055 case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
1058 AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1060 if (afsd_logp->enabled) {
1061 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
1062 RequestBuffer->RequestIndex,
1063 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1064 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1066 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1069 RDR_CleanupFileEntry( userp,
1070 RequestBuffer->FileId,
1071 RequestBuffer->Name,
1072 RequestBuffer->NameLength,
1078 RequestBuffer->ResultBufferLength,
1084 case AFS_REQUEST_TYPE_PIPE_OPEN:
1086 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1088 if (afsd_logp->enabled) {
1089 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1090 RequestBuffer->RequestIndex,
1091 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1092 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1094 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1097 RDR_PipeOpen( userp,
1098 RequestBuffer->FileId,
1099 RequestBuffer->Name,
1100 RequestBuffer->NameLength,
1103 RequestBuffer->ResultBufferLength,
1108 case AFS_REQUEST_TYPE_PIPE_WRITE:
1110 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1111 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1113 if (afsd_logp->enabled) {
1114 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1115 RequestBuffer->RequestIndex,
1116 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1117 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1119 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1122 RDR_PipeWrite( userp,
1123 RequestBuffer->FileId,
1127 RequestBuffer->ResultBufferLength,
1132 case AFS_REQUEST_TYPE_PIPE_READ:
1134 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1136 if (afsd_logp->enabled) {
1137 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
1138 RequestBuffer->RequestIndex,
1139 RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
1140 RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
1142 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1145 RDR_PipeRead( userp,
1146 RequestBuffer->FileId,
1149 RequestBuffer->ResultBufferLength,
1154 case AFS_REQUEST_TYPE_PIPE_CLOSE:
1156 AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1158 if (afsd_logp->enabled) {
1159 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE 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_PipeClose( userp,
1168 RequestBuffer->FileId,
1171 RequestBuffer->ResultBufferLength,
1177 case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
1179 AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1180 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
1182 if (afsd_logp->enabled) {
1183 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
1184 RequestBuffer->RequestIndex);
1186 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1189 RDR_PipeTransceive( userp,
1190 RequestBuffer->FileId,
1194 RequestBuffer->ResultBufferLength,
1199 case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
1201 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1203 if (afsd_logp->enabled) {
1204 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
1205 RequestBuffer->RequestIndex);
1207 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1210 RDR_PipeQueryInfo( userp,
1211 RequestBuffer->FileId,
1214 RequestBuffer->ResultBufferLength,
1219 case AFS_REQUEST_TYPE_PIPE_SET_INFO:
1221 AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
1222 BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
1224 if (afsd_logp->enabled) {
1225 swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
1226 RequestBuffer->RequestIndex);
1228 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1231 RDR_PipeSetInfo( userp,
1232 RequestBuffer->FileId,
1236 RequestBuffer->ResultBufferLength,
1243 bUnsupported = TRUE;
1245 if (afsd_logp->enabled) {
1246 swprintf( wchBuffer, L"ProcessRequest Received unknown request type %08lX Index %08lX",
1247 RequestBuffer->RequestType,
1248 RequestBuffer->RequestIndex);
1250 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1256 if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
1258 if (pResultCB == NULL) {
1259 // We failed probably due to a memory allocation error
1260 // unless the unsupported flag was set.
1261 pResultCB = &stResultCB;
1262 memset(&stResultCB, 0, sizeof(stResultCB));
1264 pResultCB->ResultStatus = STATUS_NOT_IMPLEMENTED;
1266 pResultCB->ResultStatus = STATUS_NO_MEMORY;
1270 // This is how the filter associates the response information passed in the IOCtl below to the
1271 // original call. This request index is setup by the filter and should not be modified, otherwise the
1272 // filter will not be able to locate the request in its internal queue and the blocking thread will
1276 pResultCB->RequestIndex = RequestBuffer->RequestIndex;
1278 if (afsd_logp->enabled) {
1279 swprintf( wchBuffer,
1280 L"ProcessRequest Responding to Index %08lX Length %08lX",
1281 pResultCB->RequestIndex,
1282 pResultCB->ResultBufferLength);
1284 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1288 // Now post the result back to the driver.
1291 if( !RDR_DeviceIoControl( glDevHandle,
1292 IOCTL_AFS_PROCESS_IRP_RESULT,
1294 sizeof( AFSCommResult) + pResultCB->ResultBufferLength,
1299 char *pBuffer = (char *)wchBuffer;
1300 gle = GetLastError();
1301 if (afsd_logp->enabled) {
1302 swprintf( wchBuffer,
1303 L"Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X", gle);
1304 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1308 "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
1310 osi_panic(pBuffer, __FILE__, __LINE__);
1314 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS) {
1316 if (SetFileExtentsResultCB) {
1318 if (1 || afsd_logp->enabled) {
1319 if (SetFileExtentsResultCB->ResultStatus != 0)
1320 swprintf( wchBuffer,
1321 L"ProcessRequest Responding Asynchronously with FAILURE to REQUEST_FILE_EXTENTS Index %08lX Count %08lX Status %08lX",
1322 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount, SetFileExtentsResultCB->ResultStatus);
1324 swprintf( wchBuffer,
1325 L"ProcessRequest Responding Asynchronously with SUCCESS to REQUEST_FILE_EXTENTS Index %08lX Count %08lX",
1326 RequestBuffer->RequestIndex, SetFileExtentsResultCB->ExtentCount);
1328 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1331 if( (SetFileExtentsResultCB->ExtentCount != 0 ||
1332 SetFileExtentsResultCB->ResultStatus != 0) &&
1333 !RDR_DeviceIoControl( glDevHandle,
1334 IOCTL_AFS_SET_FILE_EXTENTS,
1335 (void *)SetFileExtentsResultCB,
1336 dwResultBufferLength,
1341 gle = GetLastError();
1342 if (afsd_logp->enabled) {
1343 swprintf( wchBuffer,
1344 L"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1346 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1349 // The file system returns an error when it can't find the FID
1350 // This is a bug in the file system but we should try to avoid
1351 // the crash and clean up our own memory space.
1353 // Since we couldn't deliver the extents to the file system
1354 // we should release them.
1355 if ( SetFileExtentsResultCB->ExtentCount != 0)
1357 RDR_ReleaseFailedSetFileExtents( userp,
1358 SetFileExtentsResultCB,
1359 dwResultBufferLength);
1362 if (gle != ERROR_GEN_FAILURE) {
1364 "Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
1366 osi_panic(pBuffer, __FILE__, __LINE__);
1370 free(SetFileExtentsResultCB);
1373 /* Must be out of memory */
1374 if (afsd_logp->enabled) {
1375 swprintf( wchBuffer,
1376 L"ProcessRequest Responding Asynchronously STATUS_NO_MEMORY to REQUEST_FILE_EXTENTS Index %08lX",
1377 RequestBuffer->RequestIndex);
1379 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1382 RDR_SetFileStatus( (cm_fid_t *)&RequestBuffer->FileId, STATUS_NO_MEMORY);
1385 else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
1387 if (afsd_logp->enabled) {
1388 swprintf( wchBuffer,
1389 L"ProcessRequest Responding Asynchronously to REQUEST_TYPE_BYTE_RANGELOCK Index %08lX",
1390 RequestBuffer->RequestIndex);
1392 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1396 if (SetByteRangeLockResultCB) {
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));
1415 // TODO - instead of a panic we should release the locks
1417 "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
1418 osi_panic(pBuffer, __FILE__, __LINE__);
1421 free(SetByteRangeLockResultCB);
1423 /* Must be out of memory */
1424 AFSSetByteRangeLockResultCB SetByteRangeLockResultCB;
1426 dwResultBufferLength = sizeof(AFSSetByteRangeLockResultCB);
1427 memset( &SetByteRangeLockResultCB, '\0', dwResultBufferLength );
1428 SetByteRangeLockResultCB.FileId = RequestBuffer->FileId;
1429 SetByteRangeLockResultCB.Result[0].Status = STATUS_NO_MEMORY;
1431 if( !RDR_DeviceIoControl( glDevHandle,
1432 IOCTL_AFS_SET_BYTE_RANGE_LOCKS,
1433 (void *)&SetByteRangeLockResultCB,
1434 dwResultBufferLength,
1439 gle = GetLastError();
1441 if (afsd_logp->enabled) {
1442 swprintf( wchBuffer,
1443 L"Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle 0x%x", gle);
1444 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1447 /* We were out of memory - nothing to do */
1453 if (afsd_logp->enabled) {
1454 swprintf( wchBuffer,
1455 L"ProcessRequest Not responding to async Index %08lX",
1456 RequestBuffer->RequestIndex);
1458 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1466 RDR_ReleaseUser(userp);
1469 if( pResultCB && pResultCB != &stResultCB)
1479 RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
1480 DWORD dwResultBufferLength)
1482 WCHAR wchBuffer[1024];
1483 DWORD bytesReturned;
1486 if (1 || afsd_logp->enabled) {
1487 if (pSetFileExtentsResultCB->ResultStatus != 0)
1488 swprintf( wchBuffer,
1489 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS FAILURE Count %08lX Status %08lX",
1490 pSetFileExtentsResultCB->ExtentCount, pSetFileExtentsResultCB->ResultStatus);
1492 swprintf( wchBuffer,
1493 L"RDR_SetFileExtents IOCTL_AFS_SET_FILE_EXTENTS SUCCESS Count %08lX",
1494 pSetFileExtentsResultCB->ExtentCount);
1496 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1499 if( !RDR_DeviceIoControl( glDevHandle,
1500 IOCTL_AFS_SET_FILE_EXTENTS,
1501 (void *)pSetFileExtentsResultCB,
1502 dwResultBufferLength,
1507 gle = GetLastError();
1516 RDR_SetFileStatus( cm_fid_t *fidp,
1519 WCHAR wchBuffer[1024];
1520 AFSExtentFailureCB SetFileStatusCB;
1521 DWORD bytesReturned;
1523 AFSFileID *pFileId = (AFSFileID *)fidp;
1525 SetFileStatusCB.FileId = *pFileId;
1526 SetFileStatusCB.FailureStatus = dwStatus;
1528 if (afsd_logp->enabled) {
1529 swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
1530 pFileId->Cell, pFileId->Volume,
1531 pFileId->Vnode, pFileId->Unique,
1534 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1537 if( !RDR_DeviceIoControl( glDevHandle,
1538 IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
1539 (void *)&SetFileStatusCB,
1540 sizeof(AFSExtentFailureCB),
1545 gle = GetLastError();
1554 RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)
1557 HANDLE hDevHandle = NULL;
1558 DWORD bytesReturned;
1559 AFSReleaseFileExtentsCB *requestBuffer = NULL;
1560 AFSReleaseFileExtentsResultCB *responseBuffer = NULL;
1561 DWORD requestBufferLen, responseBufferLen;
1562 bool bError = false;
1564 WCHAR wchBuffer[256];
1568 if (afsd_logp->enabled) {
1569 swprintf( wchBuffer,
1570 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request ignored due to shutdown pending");
1572 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1575 OutputDebugString(L"RDR_RequestExtentRequest ignored - shutdown pending\n");
1576 return CM_ERROR_WOULDBLOCK;
1579 if (afsd_logp->enabled) {
1580 swprintf( wchBuffer,
1581 L"IOCTL_AFS_RELEASE_FILE_EXTENTS request - number %08lX",
1584 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1588 // We use the global handle to the control device instance
1591 hDevHandle = glDevHandle;
1594 // Allocate a request buffer.
1597 requestBufferLen = sizeof( AFSReleaseFileExtentsCB) + sizeof(AFSFileExtentCB) * numOfExtents;
1598 requestBuffer = (AFSReleaseFileExtentsCB *)malloc( requestBufferLen);
1599 responseBufferLen = (sizeof( AFSReleaseFileExtentsResultCB) + sizeof( AFSReleaseFileExtentsResultFileCB)) * numOfExtents;
1600 responseBuffer = (AFSReleaseFileExtentsResultCB *)malloc( responseBufferLen);
1603 if( requestBuffer && responseBuffer)
1606 memset( requestBuffer, '\0', sizeof( AFSReleaseFileExtentsCB));
1607 memset( responseBuffer, '\0', responseBufferLen);
1609 // If there is a FID provided, use it
1610 if (fidp && extentList)
1612 RDR_fid2FID( fidp, &requestBuffer->FileId);
1614 memcpy(&requestBuffer->FileExtents, extentList, numOfExtents * sizeof(AFSFileExtentCB));
1616 requestBuffer->Flags = 0;
1619 requestBuffer->Flags = AFS_RELEASE_EXTENTS_FLAGS_RELEASE_ALL;
1622 // Set the number of extents to be freed
1623 // Leave the rest of the structure as zeros to indicate free anything
1624 requestBuffer->ExtentCount = numOfExtents;
1626 requestBuffer->HeldExtentCount = numOfHeldExtents;
1628 if( !RDR_DeviceIoControl( hDevHandle,
1629 IOCTL_AFS_RELEASE_FILE_EXTENTS,
1630 (void *)requestBuffer,
1632 (void *)responseBuffer,
1637 // Error condition back from driver
1639 if (afsd_logp->enabled) {
1640 gle = GetLastError();
1641 swprintf( wchBuffer,
1642 L"Failed to post IOCTL_AFS_RELEASE_FILE_EXTENTS - gle 0x%x", gle);
1643 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1650 // Go process the request
1653 if (afsd_logp->enabled) {
1654 swprintf( wchBuffer,
1655 L"IOCTL_AFS_RELEASE_FILE_EXTENTS returns - serial number %08lX flags %lX FileCount %lX",
1656 responseBuffer->SerialNumber, responseBuffer->Flags, responseBuffer->FileCount);
1657 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1660 rc = RDR_ProcessReleaseFileExtentsResult( responseBuffer, bytesReturned);
1668 free( requestBuffer);
1670 free( responseBuffer);
1677 RDR_NetworkStatus(BOOLEAN status)
1680 HANDLE hDevHandle = NULL;
1681 DWORD bytesReturned;
1682 AFSNetworkStatusCB *requestBuffer = NULL;
1684 WCHAR wchBuffer[256];
1687 if (afsd_logp->enabled) {
1688 swprintf( wchBuffer,
1689 L"IOCTL_AFS_NETWORK_STATUS request - status %d",
1692 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1696 // We use the global handle to the control device instance
1699 hDevHandle = glDevHandle;
1702 // Allocate a request buffer.
1705 requestBuffer = (AFSNetworkStatusCB *)malloc( sizeof( AFSNetworkStatusCB));
1711 memset( requestBuffer, '\0', sizeof( AFSNetworkStatusCB));
1713 // Set the number of extents to be freed
1714 // Leave the rest of the structure as zeros to indicate free anything
1715 requestBuffer->Online = status;
1717 if( !RDR_DeviceIoControl( hDevHandle,
1718 IOCTL_AFS_NETWORK_STATUS,
1719 (void *)requestBuffer,
1720 sizeof( AFSNetworkStatusCB),
1726 // Error condition back from driver
1728 if (afsd_logp->enabled) {
1729 gle = GetLastError();
1730 swprintf( wchBuffer,
1731 L"Failed to post IOCTL_AFS_NETWORK_STATUS gle 0x%x",
1733 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1744 free( requestBuffer);
1752 RDR_VolumeStatus(ULONG cellID, ULONG volID, BOOLEAN online)
1755 HANDLE hDevHandle = NULL;
1756 DWORD bytesReturned;
1757 AFSVolumeStatusCB *requestBuffer = NULL;
1759 WCHAR wchBuffer[256];
1762 if (afsd_logp->enabled) {
1763 swprintf( wchBuffer,
1764 L"IOCTL_AFS_VOLUME_STATUS request - cell 0x%x vol 0x%x online %d",
1765 cellID, volID, online);
1767 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1771 // We use the global handle to the control device instance
1774 hDevHandle = glDevHandle;
1777 // Allocate a request buffer.
1780 requestBuffer = (AFSVolumeStatusCB *)malloc( sizeof( AFSVolumeStatusCB));
1786 memset( requestBuffer, '\0', sizeof( AFSVolumeStatusCB));
1788 requestBuffer->FileID.Cell = cellID;
1789 requestBuffer->FileID.Volume = volID;
1790 requestBuffer->Online = online;
1792 if( !RDR_DeviceIoControl( hDevHandle,
1793 IOCTL_AFS_VOLUME_STATUS,
1794 (void *)requestBuffer,
1795 sizeof( AFSVolumeStatusCB),
1801 // Error condition back from driver
1804 if (afsd_logp->enabled) {
1805 gle = GetLastError();
1806 swprintf( wchBuffer,
1807 L"Failed to post IOCTL_AFS_VOLUME_STATUS gle 0x%x", gle);
1808 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1819 free( requestBuffer);
1825 RDR_NetworkAddrChange(void)
1832 RDR_InvalidateVolume(ULONG cellID, ULONG volID, ULONG reason)
1835 HANDLE hDevHandle = NULL;
1836 DWORD bytesReturned;
1837 AFSInvalidateCacheCB *requestBuffer = NULL;
1839 WCHAR wchBuffer[256];
1842 if (afsd_logp->enabled) {
1843 swprintf( wchBuffer,
1844 L"IOCTL_AFS_INVALIDATE_CACHE (vol) request - cell 0x%x vol 0x%x reason %d",
1845 cellID, volID, reason);
1847 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1851 // We use the global handle to the control device instance
1854 hDevHandle = glDevHandle;
1857 // Allocate a request buffer.
1860 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1866 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1868 requestBuffer->FileID.Cell = cellID;
1869 requestBuffer->FileID.Volume = volID;
1870 requestBuffer->WholeVolume = TRUE;
1871 requestBuffer->Reason = reason;
1873 if( !RDR_DeviceIoControl( hDevHandle,
1874 IOCTL_AFS_INVALIDATE_CACHE,
1875 (void *)requestBuffer,
1876 sizeof( AFSInvalidateCacheCB),
1882 // Error condition back from driver
1885 if (afsd_logp->enabled) {
1886 gle = GetLastError();
1887 swprintf( wchBuffer,
1888 L"Failed to post IOCTL_AFS_INVALIDATE_VOLUME gle 0x%x", gle);
1889 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1900 free( requestBuffer);
1907 RDR_InvalidateObject(ULONG cellID, ULONG volID, ULONG vnode, ULONG uniq, ULONG hash, ULONG fileType, ULONG reason)
1910 HANDLE hDevHandle = NULL;
1911 DWORD bytesReturned;
1912 AFSInvalidateCacheCB *requestBuffer = NULL;
1914 WCHAR wchBuffer[256];
1917 if (afsd_logp->enabled) {
1918 swprintf( wchBuffer,
1919 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",
1920 cellID, volID, vnode, uniq, hash, fileType, reason);
1922 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1926 // We use the global handle to the control device instance
1929 hDevHandle = glDevHandle;
1932 // Allocate a request buffer.
1935 requestBuffer = (AFSInvalidateCacheCB *)malloc( sizeof( AFSInvalidateCacheCB));
1941 memset( requestBuffer, '\0', sizeof( AFSInvalidateCacheCB));
1943 requestBuffer->FileID.Cell = cellID;
1944 requestBuffer->FileID.Volume = volID;
1945 requestBuffer->FileID.Vnode = vnode;
1946 requestBuffer->FileID.Unique = uniq;
1947 requestBuffer->FileID.Hash = hash;
1948 requestBuffer->FileType = fileType;
1949 requestBuffer->WholeVolume = FALSE;
1950 requestBuffer->Reason = reason;
1952 if( !RDR_DeviceIoControl( hDevHandle,
1953 IOCTL_AFS_INVALIDATE_CACHE,
1954 (void *)requestBuffer,
1955 sizeof( AFSInvalidateCacheCB),
1961 // Error condition back from driver
1963 if (afsd_logp->enabled) {
1964 gle = GetLastError();
1965 swprintf( wchBuffer,
1966 L"Failed to post IOCTL_AFS_INVALIDATE_CACHE gle 0x%x", gle);
1967 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
1978 free( requestBuffer);
1986 RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
1989 HANDLE hDevHandle = NULL;
1990 DWORD bytesReturned;
1991 AFSSysNameNotificationCB *requestBuffer = NULL;
1993 WCHAR wchBuffer[256];
1997 if (afsd_logp->enabled) {
1998 swprintf( wchBuffer,
1999 L"IOCTL_AFS_SYSNAME_NOTIFICATION request - Arch %d Count %d",
2000 Architecture, Count);
2002 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2005 if (Count <= 0 || NameList == NULL)
2009 // We use the global handle to the control device instance
2012 hDevHandle = glDevHandle;
2015 // Allocate a request buffer.
2018 Length = sizeof (AFSSysNameNotificationCB) + (Count - 1) * sizeof (AFSSysName);
2019 requestBuffer = (AFSSysNameNotificationCB *)malloc( Length );
2026 memset( requestBuffer, '\0', Length);
2028 requestBuffer->Architecture = Architecture;
2029 requestBuffer->NumberOfNames = Count;
2030 for ( i=0 ; i<Count; i++) {
2031 size_t len = wcslen(NameList[i]);
2032 requestBuffer->SysNames[i].Length = (ULONG) (len * sizeof(WCHAR));
2033 StringCchCopyNW(requestBuffer->SysNames[i].String, AFS_MAX_SYSNAME_LENGTH,
2037 if( !RDR_DeviceIoControl( hDevHandle,
2038 IOCTL_AFS_SYSNAME_NOTIFICATION,
2039 (void *)requestBuffer,
2046 // Error condition back from driver
2048 if (afsd_logp->enabled) {
2049 gle = GetLastError();
2050 swprintf( wchBuffer,
2051 L"Failed to post IOCTL_AFS_SYSNAME_NOTIFICATION gle 0x%x", gle);
2052 osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
2063 free( requestBuffer);
2071 ResetEvent( RDR_SuspendEvent);
2077 SetEvent( RDR_SuspendEvent);