Windows: Move Authenticated field to CommResultCB
[openafs.git] / src / WINNT / afsrdr / user / RDRInit.cpp
index 91e178e..ad68376 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * 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>
 
@@ -65,9 +68,16 @@ extern osi_log_t *afsd_logp;
 #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
@@ -115,6 +125,8 @@ DWORD  dwOvEvIdx = 0;
 
 extern "C" wchar_t RDR_UNCName[64]=L"AFS";
 
+HANDLE RDR_SuspendEvent = INVALID_HANDLE_VALUE;
+
 /* returns 0 on success */
 extern "C" DWORD
 RDR_Initialize(void)
@@ -125,6 +137,12 @@ RDR_Initialize(void)
     DWORD dummyLen;
     DWORD numSvThreads = CM_CONFIGDEFAULT_SVTHREADS;
 
+    // Initialize the Suspend Event
+    RDR_SuspendEvent = CreateEvent( NULL,
+                                    TRUE, // manual reset event
+                                    TRUE, // signaled
+                                    NULL);
+
     dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
                          0, KEY_QUERY_VALUE, &parmKey);
     if (dwRet == ERROR_SUCCESS) {
@@ -155,6 +173,7 @@ RDR_Initialize(void)
     if (dwRet == ERROR_SUCCESS) {
 
         RDR_InitIoctl();
+        RDR_InitPipe();
     }
 
     return dwRet;
@@ -266,6 +285,10 @@ RDR_ShutdownNotify(void)
         // log the error, nothing to do
     }
 
+
+    RDR_ShutdownIoctl();
+    RDR_ShutdownPipe();
+
     return 0;
 }
 
@@ -453,7 +476,7 @@ RDR_RequestWorkerThread( LPVOID lpParameter)
 
             requestBuffer->RequestFlags = pInfo->Flags;
 
-            if( !RDR_DeviceIoControl( hDevHandle,
+            if( RDR_DeviceIoControl( hDevHandle,
                                       IOCTL_AFS_PROCESS_IRP_REQUEST,
                                       (void *)requestBuffer,
                                       sizeof( AFSCommRequest),
@@ -462,19 +485,27 @@ RDR_RequestWorkerThread( LPVOID lpParameter)
                                       &bytesReturned ))
             {
 
+                WaitForSingleObject( RDR_SuspendEvent, INFINITE);
+
                 //
-                // Error condition back from driver
+                // Go process the request
                 //
 
-                break;
+                if (!Exit)
+                    RDR_ProcessRequest( requestBuffer);
             }
+            else
+            {
 
-            //
-            // 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);
@@ -688,11 +719,12 @@ RDR_ProcessRequest( AFSCommRequest *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));
             }
@@ -709,6 +741,34 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
             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:
         {
 
@@ -867,369 +927,388 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
             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));
 
-                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;
-            }
-
-
-    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) {
@@ -1243,6 +1322,11 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
             break;
     }
 
+    if (userp) {
+        pResultCB->Authenticated = cm_HaveToken( userp,
+                                                 RequestBuffer->FileId.Cell);
+    }
+
     if( BooleanFlagOn( RequestBuffer->RequestFlags, AFS_REQUEST_FLAG_SYNCHRONOUS))
     {
        if (pResultCB == NULL) {
@@ -1294,10 +1378,12 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                 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__);
+            }
         }
 
     }
@@ -1349,7 +1435,8 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                                                  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);
@@ -1369,7 +1456,7 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
               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) {
@@ -1402,10 +1489,12 @@ RDR_ProcessRequest( AFSCommRequest *RequestBuffer)
                 }
 
 
-                // 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);
@@ -1504,21 +1593,22 @@ RDR_SetFileExtents( AFSSetFileExtentsCB *pSetFileExtentsResultCB,
 
 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));
@@ -1539,6 +1629,43 @@ RDR_SetFileStatus( cm_fid_t *fidp,
     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)
@@ -2054,3 +2181,15 @@ RDR_SysName(ULONG Architecture, ULONG Count, WCHAR **NameList)
 
     return rc;
 }
+
+extern "C" VOID
+RDR_Suspend( VOID)
+{
+    ResetEvent( RDR_SuspendEvent);
+}
+
+extern "C" VOID
+RDR_Resume( VOID)
+{
+    SetEvent( RDR_SuspendEvent);
+}