/*
* 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>
#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>
+static DWORD
+RDR_SetFileStatus2( AFSFileID * pFileId,
+ GUID *pAuthGroup,
+ DWORD dwStatus);
+
#ifndef FlagOn
#define FlagOn(_F,_SF) ((_F) & (_SF))
#endif
if (dwRet == ERROR_SUCCESS) {
RDR_InitIoctl();
+ RDR_InitPipe();
}
return dwRet;
// log the error, nothing to do
}
+
+ RDR_ShutdownIoctl();
+ RDR_ShutdownPipe();
+
return 0;
}
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);
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_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);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
- RDR_GetVolumeInfo( userp,
+ 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));
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
+ RequestBuffer->RequestIndex);
- RDR_PipeClose( userp,
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+
+ RDR_PipeTransceive( userp,
RequestBuffer->FileId,
pPipeCB,
+ pPipeData,
bWow64,
RequestBuffer->ResultBufferLength,
&pResultCB);
- break;
- }
-
-
- case AFS_REQUEST_TYPE_PIPE_TRANSCEIVE:
- {
- AFSPipeIORequestCB *pPipeCB = (AFSPipeIORequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
- BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeIORequestCB));
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_TRANSCEIVE Index %08lX",
- RequestBuffer->RequestIndex);
+ case AFS_REQUEST_TYPE_PIPE_QUERY_INFO:
+ {
+ AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((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_QUERY_INFO Index %08lX",
+ RequestBuffer->RequestIndex);
- RDR_PipeTransceive( 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_QUERY_INFO:
- {
- AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ RDR_PipeQueryInfo( userp,
+ RequestBuffer->FileId,
+ pPipeInfoCB,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
+ break;
+ }
- if (afsd_logp->enabled) {
- swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_QUERY_INFO Index %08lX",
- RequestBuffer->RequestIndex);
+ case AFS_REQUEST_TYPE_PIPE_SET_INFO:
+ {
+ AFSPipeInfoRequestCB *pPipeInfoCB = (AFSPipeInfoRequestCB *)((char *)RequestBuffer->Name + RequestBuffer->DataOffset);
+ BYTE *pPipeData = ((BYTE *)RequestBuffer->Name + RequestBuffer->DataOffset + sizeof(AFSPipeInfoRequestCB));
- osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
- }
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"ProcessRequest Processing AFS_REQUEST_TYPE_PIPE_SET_INFO Index %08lX",
+ RequestBuffer->RequestIndex);
- RDR_PipeQueryInfo( userp,
- RequestBuffer->FileId,
- pPipeInfoCB,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
- break;
+ 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));
-
- 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));
- }
-
- RDR_PipeSetInfo( userp,
- RequestBuffer->FileId,
- pPipeInfoCB,
- pPipeData,
- bWow64,
- RequestBuffer->ResultBufferLength,
- &pResultCB);
+ RDR_PipeSetInfo( userp,
+ RequestBuffer->FileId,
+ pPipeInfoCB,
+ pPipeData,
+ bWow64,
+ RequestBuffer->ResultBufferLength,
+ &pResultCB);
- break;
- }
+ break;
+ }
- default:
+ default:
bUnsupported = TRUE;
if (afsd_logp->enabled) {
break;
}
+ if (userp) {
+ pResultCB->Authenticated = cm_HaveToken( userp,
+ RequestBuffer->FileId.Cell);
+ }
+
if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
{
if (pResultCB == NULL) {
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);
osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
}
- RDR_SetFileStatus( (cm_fid_t *)&RequestBuffer->FileId, STATUS_NO_MEMORY);
+ RDR_SetFileStatus2( &RequestBuffer->FileId, &RequestBuffer->AuthGroup, STATUS_NO_MEMORY);
}
}
else if (RequestBuffer->RequestType == AFS_REQUEST_TYPE_BYTE_RANGE_LOCK) {
}
- // 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);
extern "C" DWORD
RDR_SetFileStatus( cm_fid_t *fidp,
+ GUID *pAuthGroup,
DWORD dwStatus)
{
WCHAR wchBuffer[1024];
AFSExtentFailureCB SetFileStatusCB;
DWORD bytesReturned;
DWORD gle;
- AFSFileID *pFileId = (AFSFileID *)fidp;
- SetFileStatusCB.FileId = *pFileId;
+ RDR_fid2FID(fidp, &SetFileStatusCB.FileId);
+ memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
SetFileStatusCB.FailureStatus = dwStatus;
if (afsd_logp->enabled) {
swprintf( wchBuffer, L"RDR_SetFileStatus IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
- pFileId->Cell, pFileId->Volume,
- pFileId->Vnode, pFileId->Unique,
+ SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
+ SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
dwStatus);
osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
return 0;
}
+static DWORD
+RDR_SetFileStatus2( AFSFileID *pFileId,
+ GUID *pAuthGroup,
+ DWORD dwStatus)
+{
+ WCHAR wchBuffer[1024];
+ AFSExtentFailureCB SetFileStatusCB;
+ DWORD bytesReturned;
+ DWORD gle;
+
+ memcpy(&SetFileStatusCB.FileId, pFileId, sizeof(AFSFileID));
+ memcpy(&SetFileStatusCB.AuthGroup, pAuthGroup, sizeof(GUID));
+ SetFileStatusCB.FailureStatus = dwStatus;
+
+ if (afsd_logp->enabled) {
+ swprintf( wchBuffer, L"RDR_SetFileStatus2 IOCTL_AFS_EXTENT_FAILURE_CB Fid %08lX.%08lX.%08lX.%08lX Status 0x%lX",
+ SetFileStatusCB.FileId.Cell, SetFileStatusCB.FileId.Volume,
+ SetFileStatusCB.FileId.Vnode, SetFileStatusCB.FileId.Unique,
+ dwStatus);
+
+ osi_Log1(afsd_logp, "%S", osi_LogSaveStringW(afsd_logp, wchBuffer));
+ }
+
+ if( !RDR_DeviceIoControl( glDevHandle,
+ IOCTL_AFS_SET_FILE_EXTENT_FAILURE,
+ (void *)&SetFileStatusCB,
+ sizeof(AFSExtentFailureCB),
+ (void *)NULL,
+ 0,
+ &bytesReturned ))
+ {
+ gle = GetLastError();
+ return gle;
+ }
+
+ return 0;
+}
extern "C" DWORD
RDR_RequestExtentRelease(cm_fid_t *fidp, LARGE_INTEGER numOfHeldExtents, DWORD numOfExtents, AFSFileExtentCB *extentList)