/*
* Copyright (c) 2008 Secure Endpoints, Inc.
- * Copyright (c) 2009-2011 Your File System, Inc.
+ * Copyright (c) 2009-2013 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+extern "C" {
+#include <afsconfig.h>
+#include <afs/param.h>
+#include <afs/stds.h>
+}
+
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
#include <windows.h>
typedef LONG NTSTATUS, *PNTSTATUS; // not declared in ntstatus.h
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <errno.h>
+#include <roken.h>
#include <devioctl.h>
extern "C" {
#include <osilog.h>
extern osi_log_t *afsd_logp;
+extern int cm_directIO;
#include <WINNT/afsreg.h>
#include <afs/cm_config.h>
#include <afs/cm_error.h>
+#include <afs/cm_nls.h>
+#include <afs/cm_user.h>
}
#include <RDRPrototypes.h>
if (dwRet == ERROR_SUCCESS) {
RDR_InitIoctl();
+ RDR_InitPipe();
}
return dwRet;
// log the error, nothing to do
}
+
+ RDR_ShutdownIoctl();
+ RDR_ShutdownPipe();
+
return 0;
}
if( glDevHandle == INVALID_HANDLE_VALUE)
{
+ dwErr = GetLastError();
+
free(redirInitInfo);
- return GetLastError();
+
+ return dwErr;
}
//
&bytesReturned ))
{
+ dwErr = GetLastError();
+
CloseHandle( glDevHandle);
glDevHandle = NULL;
free(redirInitInfo);
- return GetLastError();
+ return dwErr;
}
//
for (index = 0; index < numThreads; index++)
{
- //
- // 20% of worker threads should be reserved for release extent
- // event processing
- //
- glWorkerThreadInfo[ glThreadHandleIndex].Flags =
- (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
+ if ( !cm_directIO)
+ {
+ //
+ // 20% of worker threads should be reserved for release extent
+ // event processing
+ //
+ glWorkerThreadInfo[ glThreadHandleIndex].Flags =
+ (glThreadHandleIndex % 5) ? 0 : AFS_REQUEST_RELEASE_THREAD;
+ }
+ else
+ {
+ glWorkerThreadInfo[ glThreadHandleIndex].Flags = 0;
+ }
glWorkerThreadInfo[ glThreadHandleIndex].hEvent = hEvent;
glWorkerThreadInfo[ glThreadHandleIndex].hThread =
CreateThread( NULL,
&bytesReturned ))
{
+ //
+ // Must kill off the worker threads we spawned.
+ //
+
+ RDR_ShutdownFinal();
+
+ dwErr = GetLastError();
+
CloseHandle( glDevHandle);
glDevHandle = NULL;
free(redirInitInfo);
- return GetLastError();
+ return dwErr;
}
free(redirInitInfo);
requestBuffer->RequestFlags = pInfo->Flags;
- if( !RDR_DeviceIoControl( hDevHandle,
+ if( RDR_DeviceIoControl( hDevHandle,
IOCTL_AFS_PROCESS_IRP_REQUEST,
(void *)requestBuffer,
sizeof( AFSCommRequest),
&bytesReturned ))
{
+ WaitForSingleObject( RDR_SuspendEvent, INFINITE);
+
//
- // Error condition back from driver
+ // Go process the request
//
- break;
+ if (!Exit)
+ RDR_ProcessRequest( requestBuffer);
}
+ else
+ {
- WaitForSingleObject( RDR_SuspendEvent, INFINITE);
-
- //
- // Go process the request
- //
+ if (afsd_logp->enabled) {
+ WCHAR wchBuffer[256];
+ DWORD gle = GetLastError();
- if (!Exit)
- RDR_ProcessRequest( requestBuffer);
+ swprintf( wchBuffer,
+ L"Failed to post IOCTL_AFS_IRP_REQUEST gle 0x%x", gle);
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+ }
}
free( requestBuffer);
BOOL bDeleteFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_FILE_DELETED) ? TRUE : FALSE;
BOOL bUnlockFile = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_BYTE_RANGE_UNLOCK_ALL) ? TRUE : FALSE;
BOOL bCheckOnly = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CHECK_ONLY) ? TRUE : FALSE;
+ BOOL bCacheBypass = (RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CACHE_BYPASS) ? TRUE : FALSE;
BOOL bRetry = FALSE;
BOOL bUnsupported = FALSE;
BOOL bIsLocalSystem = (RequestBuffer->RequestFlags & AFS_REQUEST_LOCAL_SYSTEM_PAG) ? TRUE : FALSE;
RequestBuffer->Name,
RequestBuffer->NameLength,
RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_CASE_SENSITIVE ? TRUE : FALSE,
+ RequestBuffer->RequestFlags & AFS_REQUEST_FLAG_LAST_COMPONENT ? TRUE : FALSE,
bWow64, bFast, bHoldFid,
RequestBuffer->ResultBufferLength,
&pResultCB);
AFSFileRenameCB *pFileRenameCB = (AFSFileRenameCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S",
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RENAME_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S TargetLength %08lX Target %*S",
RequestBuffer->RequestIndex,
RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
- RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name);
+ RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
+ pFileRenameCB->TargetNameLength, (int)pFileRenameCB->TargetNameLength, pFileRenameCB->TargetName);
osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
break;
}
+ case AFS_REQUEST_TYPE_HARDLINK_FILE:
+ {
+
+ AFSFileHardLinkCB *pFileHardLinkCB = (AFSFileHardLinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HARDLINK_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX NameLength %08lX Name %*S TargetLength %08lX Target %*S",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
+ RequestBuffer->NameLength, (int)RequestBuffer->NameLength, RequestBuffer->Name,
+ pFileHardLinkCB->TargetNameLength, (int)pFileHardLinkCB->TargetNameLength, pFileHardLinkCB->TargetName);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+
+ RDR_HardLinkFileEntry( userp,
+ RequestBuffer->Name,
+ RequestBuffer->NameLength,
+ RequestBuffer->FileId,
+ pFileHardLinkCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+
+ break;
+ }
+
+ case AFS_REQUEST_TYPE_CREATE_SYMLINK:
+ {
+
+ AFSCreateSymlinkCB *pCreateSymlinkCB = (AFSCreateSymlinkCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+ WCHAR wchFileName[ 256];
+
+ if (afsd_logp->enabled) {
+ memset( wchFileName, '\0', 256 * sizeof( WCHAR));
+
+ memcpy( wchFileName,
+ RequestBuffer->Name,
+ RequestBuffer->NameLength);
+
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CREATE_SYMLINK Index %08lX File %S",
+ RequestBuffer->RequestIndex, wchFileName);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+
+ RDR_CreateSymlinkEntry( userp,
+ RequestBuffer->FileId,
+ RequestBuffer->Name,
+ RequestBuffer->NameLength,
+ pCreateSymlinkCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+
+ break;
+ }
+
case AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS:
{
break;
}
- case AFS_REQUEST_TYPE_PIOCTL_READ:
- {
- AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ case AFS_REQUEST_TYPE_PIOCTL_READ:
+ {
+ AFSPIOCtlIORequestCB *pPioctlCB = (AFSPIOCtlIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
- RDR_PioctlRead( userp,
- RequestBuffer->FileId,
- pPioctlCB,
- bWow64,
- bIsLocalSystem,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ RDR_PioctlRead( userp,
+ RequestBuffer->FileId,
+ pPioctlCB,
+ bWow64,
+ bIsLocalSystem,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
+
+ case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
+ {
+ AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIOCTL_CLOSE:
- {
- AFSPIOCtlOpenCloseRequestCB *pPioctlCB = (AFSPIOCtlOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_PioctlClose( userp,
+ RequestBuffer->FileId,
+ pPioctlCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIOCTL_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
+ {
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
+ BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
- RDR_PioctlClose( userp,
- RequestBuffer->FileId,
- pPioctlCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
+ AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- case AFS_REQUEST_TYPE_BYTE_RANGE_LOCK:
- {
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_LOCK Index %08lX File %08lX.%08lX.%08lX.%08lX %S",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique,
- BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS) ? L"Sync" : L"Async");
+ RDR_ByteRangeLockSync( userp,
+ RequestBuffer->FileId,
+ pBRLRequestCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ break;
+ }
- AFSByteRangeLockRequestCB *pBRLRequestCB = (AFSByteRangeLockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
+ {
+ AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- RDR_ByteRangeLockSync( userp,
- RequestBuffer->FileId,
- pBRLRequestCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK:
- {
- AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_ByteRangeUnlock( userp,
+ RequestBuffer->FileId,
+ pBRURequestCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK Index %08lX File %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
+ {
+ AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_ByteRangeUnlock( userp,
- RequestBuffer->FileId,
- pBRURequestCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL:
- {
- AFSByteRangeUnlockRequestCB *pBRURequestCB = (AFSByteRangeUnlockRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
-
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_BYTE_RANGE_UNLOCK_ALL Index %08lX File %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ RDR_ByteRangeUnlockAll( userp,
+ RequestBuffer->FileId,
+ pBRURequestCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
+ {
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_ByteRangeUnlockAll( userp,
- RequestBuffer->FileId,
- pBRURequestCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_GET_VOLUME_INFO:
- {
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ RDR_GetVolumeInfo( userp,
+ RequestBuffer->FileId,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ case AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO:
+ {
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO Index %08lX File %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_GetVolumeInfo( userp,
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+
+ RDR_GetVolumeSizeInfo( userp,
RequestBuffer->FileId,
bWow64,
RequestBuffer->ResultBufferLength,
&pResultCB);
- break;
+ break;
+ }
+
+ case AFS_REQUEST_TYPE_HOLD_FID:
+ {
+
+ AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
+ RequestBuffer->RequestIndex);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_HOLD_FID:
- {
+ RDR_HoldFid( userp,
+ pHoldFidCB,
+ bFast,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- AFSHoldFidRequestCB *pHoldFidCB = (AFSHoldFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_HOLD_FID Index %08lX",
- RequestBuffer->RequestIndex);
+ case AFS_REQUEST_TYPE_RELEASE_FID:
+ {
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- RDR_HoldFid( userp,
- pHoldFidCB,
- bFast,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
+ RequestBuffer->RequestIndex);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_RELEASE_FID:
- {
+ RDR_ReleaseFid( userp,
+ pReleaseFidCB,
+ bFast,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- AFSReleaseFidRequestCB *pReleaseFidCB = (AFSReleaseFidRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_RELEASE_FID Index %08lX",
- RequestBuffer->RequestIndex);
+ case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
+ {
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- RDR_ReleaseFid( userp,
- pReleaseFidCB,
- bFast,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_CLEANUP_PROCESSING:
- {
+ RDR_CleanupFileEntry( userp,
+ RequestBuffer->FileId,
+ RequestBuffer->Name,
+ RequestBuffer->NameLength,
+ pCleanupCB,
+ bWow64,
+ bFlushFile,
+ bDeleteFile,
+ bUnlockFile,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- AFSFileCleanupCB *pCleanupCB = (AFSFileCleanupCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_CLEANUP_FILE Index %08lX File %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ case AFS_REQUEST_TYPE_PIPE_OPEN:
+ {
+ AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_CleanupFileEntry( userp,
- RequestBuffer->FileId,
- RequestBuffer->Name,
- RequestBuffer->NameLength,
- pCleanupCB,
- bWow64,
- bFlushFile,
- bDeleteFile,
- bUnlockFile,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
-
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIPE_OPEN:
- {
- AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_PipeOpen( userp,
+ RequestBuffer->FileId,
+ RequestBuffer->Name,
+ RequestBuffer->NameLength,
+ pPipeCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_OPEN Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ case AFS_REQUEST_TYPE_PIPE_WRITE:
+ {
+ AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_PipeOpen( userp,
- RequestBuffer->FileId,
- RequestBuffer->Name,
- RequestBuffer->NameLength,
- pPipeCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIPE_WRITE:
- {
- AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
+ RDR_PipeWrite( userp,
+ RequestBuffer->FileId,
+ pPipeCB,
+ pPipeData,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_WRITE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ case AFS_REQUEST_TYPE_PIPE_READ:
+ {
+ AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_PipeWrite( userp,
- RequestBuffer->FileId,
- pPipeCB,
- pPipeData,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIPE_READ:
- {
- AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_PipeRead( userp,
+ RequestBuffer->FileId,
+ pPipeCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_READ Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+ case AFS_REQUEST_TYPE_PIPE_CLOSE:
+ {
+ AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- RDR_PipeRead( userp,
- RequestBuffer->FileId,
- pPipeCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIPE_CLOSE:
- {
- AFSPipeOpenCloseRequestCB *pPipeCB = (AFSPipeOpenCloseRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_PipeClose( userp,
+ RequestBuffer->FileId,
+ pPipeCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_CLOSE Index %08lX Parent %08lX.%08lX.%08lX.%08lX",
- RequestBuffer->RequestIndex,
- RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
- RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
+ {
+ AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
- RDR_PipeClose( userp,
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
+ RequestBuffer->RequestIndex);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+
+ RDR_PipeTransceive( userp,
RequestBuffer->FileId,
pPipeCB,
+ pPipeData,
bWow64,
RequestBuffer->ResultBufferLength,
&pResultCB);
- break;
- }
+ break;
+ }
+ case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
+ {
+ AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
- {
- AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
+ RequestBuffer->RequestIndex);
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
- RequestBuffer->RequestIndex);
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ RDR_PipeQueryInfo( userp,
+ RequestBuffer->FileId,
+ pPipeInfoCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- RDR_PipeTransceive( userp,
- RequestBuffer->FileId,
- pPipeCB,
- pPipeData,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ case AFS_REQUEST_TYPE_PIPE_SET_INFO:
+ {
+ AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
+ RequestBuffer->RequestIndex);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
- {
- AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_PipeSetInfo( userp,
+ RequestBuffer->FileId,
+ pPipeInfoCB,
+ pPipeData,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
- RequestBuffer->RequestIndex);
+ break;
+ }
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
- RDR_PipeQueryInfo( userp,
- RequestBuffer->FileId,
- pPipeInfoCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ case AFS_REQUEST_TYPE_PROCESS_READ_FILE: {
+ AFSFileIOCB *pFileIOCB = (AFSFileIOCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_READ_FILE Index %08lX FID %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- case AFS_REQUEST_TYPE_PIPE_SET_INFO:
- {
- AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
+ RDR_ReadFile( userp,
+ RequestBuffer->FileId,
+ &pFileIOCB->IOOffset,
+ pFileIOCB->IOLength,
+ pFileIOCB->MappedIOBuffer,
+ bWow64,
+ bCacheBypass,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
- RequestBuffer->RequestIndex);
+ break;
+ }
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ case AFS_REQUEST_TYPE_PROCESS_WRITE_FILE: {
+ AFSFileIOCB *pFileIOCB = (AFSFileIOCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- RDR_PipeSetInfo( userp,
- RequestBuffer->FileId,
- pPipeInfoCB,
- pPipeData,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_WRITE_FILE Index %08lX FID %08lX.%08lX.%08lX.%08lX",
+ RequestBuffer->RequestIndex,
+ RequestBuffer->FileId.Cell, RequestBuffer->FileId.Volume,
+ RequestBuffer->FileId.Vnode, RequestBuffer->FileId.Unique);
- break;
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- default:
+ RDR_WriteFile( userp,
+ RequestBuffer->FileId,
+ pFileIOCB,
+ &pFileIOCB->IOOffset,
+ pFileIOCB->IOLength,
+ pFileIOCB->MappedIOBuffer,
+ bWow64,
+ bCacheBypass,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+
+ break;
+ }
+
+ default:
bUnsupported = TRUE;
if (afsd_logp->enabled) {
if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
{
- if (pResultCB == NULL) {
+
+ if (pResultCB == NULL) {
// We failed probably due to a memory allocation error
// unless the unsupported flag was set.
pResultCB = &stResultCB;
pResultCB->ResultStatus = STATUS_NO_MEMORY;
}
+ if (userp) {
+ pResultCB->Authenticated = cm_HaveToken( userp,
+ RequestBuffer->FileId.Cell);
+ }
+
//
// This is how the filter associates the response information passed in the IOCtl below to the
// original call. This request index is setup by the filter and should not be modified, otherwise the
osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- sprintf( pBuffer,
- "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
- GetLastError());
- osi_panic(pBuffer, __FILE__, __LINE__);
+ if (gle != ERROR_NOT_READY) {
+ sprintf( pBuffer,
+ "Failed to post IOCTL_AFS_PROCESS_IRP_RESULT gle %X",
+ GetLastError());
+ osi_panic(pBuffer, __FILE__, __LINE__);
+ }
}
}
dwResultBufferLength);
}
- if (gle != ERROR_GEN_FAILURE) {
+ if (gle != ERROR_GEN_FAILURE &&
+ gle != ERROR_NOT_READY) {
sprintf( pBuffer,
"Failed to post IOCTL_AFS_SET_FILE_EXTENTS gle %X",
gle);
}
- // TODO - instead of a panic we should release the locks
- sprintf( pBuffer,
- "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
- osi_panic(pBuffer, __FILE__, __LINE__);
+ if (gle != ERROR_NOT_READY) {
+ // TODO - instead of a panic we should release the locks
+ sprintf( pBuffer,
+ "Failed to post IOCTL_AFS_SET_BYTE_RANGE_LOCKS gle %X", gle);
+ osi_panic(pBuffer, __FILE__, __LINE__);
+ }
}
free(SetByteRangeLockResultCB);