NTSTATUS ntStatus = STATUS_SUCCESS;
AFSEvalTargetCB stTargetID;
ULONG ulResultBufferLength;
+ AFSFileEvalResultCB *pEvalResultCB = NULL;
AFSDirEnumEntry *pDirEnumCB = NULL;
ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
// Allocate our response buffer
//
- pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_2_TAG);
+ pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_30_TAG);
- if( pDirEnumCB == NULL)
+ if( pEvalResultCB == NULL)
{
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
&ObjectInfo->FileId,
&stTargetID,
sizeof( AFSEvalTargetCB),
- pDirEnumCB,
+ pEvalResultCB,
&ulResultBufferLength);
if( ntStatus != STATUS_SUCCESS)
if( DirEnumEntry != NULL)
{
+ pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_2_TAG);
+
+ if( pDirEnumCB == NULL)
+ {
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlCopyMemory( pDirEnumCB, &pEvalResultCB->DirEnum,
+ ulResultBufferLength - sizeof( AFSFileEvalResultCB) + sizeof( AFSDirEnumEntry));
+
*DirEnumEntry = pDirEnumCB;
}
- else
+
+try_exit:
+
+ if( pEvalResultCB != NULL)
{
- AFSExFreePool( pDirEnumCB);
+ AFSExFreePool( pEvalResultCB);
}
-try_exit:
-
if( !NT_SUCCESS( ntStatus))
{
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSEvalTargetCB stTargetID;
ULONG ulResultBufferLength;
+ AFSFileEvalResultCB *pEvalResultCB = NULL;
AFSDirEnumEntry *pDirEnumCB = NULL;
__Enter
// Allocate our response buffer
//
- pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_3_TAG);
+ pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_31_TAG);
- if( pDirEnumCB == NULL)
+ if( pEvalResultCB == NULL)
{
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
NULL,
&stTargetID,
sizeof( AFSEvalTargetCB),
- pDirEnumCB,
+ pEvalResultCB,
&ulResultBufferLength);
if( ntStatus != STATUS_SUCCESS)
if( DirEnumEntry != NULL)
{
+ pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_3_TAG);
+
+ if( pDirEnumCB == NULL)
+ {
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlCopyMemory( pDirEnumCB, &pEvalResultCB->DirEnum,
+ ulResultBufferLength - sizeof( AFSFileEvalResultCB) + sizeof( AFSDirEnumEntry));
+
*DirEnumEntry = pDirEnumCB;
}
- else
+
+try_exit:
+
+ if( pEvalResultCB != NULL)
{
- AFSExFreePool( pDirEnumCB);
+ AFSExFreePool( pEvalResultCB);
}
-try_exit:
-
if( !NT_SUCCESS( ntStatus))
{
IN DWORD ResultBufferLength,
IN OUT AFSCommResult **ResultCB)
{
+ AFSFileEvalResultCB *pEvalResultCB = NULL;
AFSDirEnumEntry * pCurrentEntry;
- size_t size = sizeof(AFSCommResult) + ResultBufferLength - 1;
+ size_t size = ResultBufferLength ? sizeof(AFSCommResult) + ResultBufferLength - 1 : sizeof(AFSCommResult);
afs_uint32 code = 0;
cm_scache_t * scp = NULL;
cm_scache_t * dscp = NULL;
}
memset(*ResultCB, 0, size);
- (*ResultCB)->ResultBufferLength = ResultBufferLength;
- if (ResultBufferLength)
- pCurrentEntry = (AFSDirEnumEntry *)&(*ResultCB)->ResultData;
+ (*ResultCB)->ResultBufferLength = 0;
+ dwRemaining = ResultBufferLength;
+ if (ResultBufferLength >= sizeof( AFSFileEvalResultCB)) {
+ pEvalResultCB = (AFSFileEvalResultCB *)&(*ResultCB)->ResultData;
+ pCurrentEntry = &pEvalResultCB->DirEnum;
+ dwRemaining -= (sizeof( AFSFileEvalResultCB) - sizeof( AFSDirEnumEntry));
+ }
if (ParentID.Cell != 0) {
parentFid.cell = ParentID.Cell;
shortName[0] = '\0';
}
- code = RDR_PopulateCurrentEntry(pCurrentEntry, ResultBufferLength,
+ code = RDR_PopulateCurrentEntry(pCurrentEntry, dwRemaining,
dscp, scp, userp, &req,
FileName, shortName,
(bWow64 ? RDR_POP_WOW64 : 0) |
osi_Log2(afsd_logp, "RDR_EvaluateNodeByName FAILURE code=0x%x status=0x%x",
code, status);
} else {
+ pEvalResultCB->ParentDataVersion.QuadPart = dscp->dataVersion;
(*ResultCB)->ResultStatus = STATUS_SUCCESS;
(*ResultCB)->ResultBufferLength = ResultBufferLength - dwRemaining;
osi_Log0(afsd_logp, "RDR_EvaluateNodeByName SUCCESS");
IN DWORD ResultBufferLength,
IN OUT AFSCommResult **ResultCB)
{
- AFSDirEnumEntry * pCurrentEntry;
- size_t size = sizeof(AFSCommResult) + ResultBufferLength - 1;
+ AFSFileEvalResultCB *pEvalResultCB = NULL;
+ AFSDirEnumEntry * pCurrentEntry = NULL;
+ size_t size = ResultBufferLength ? sizeof(AFSCommResult) + ResultBufferLength - 1 : sizeof(AFSCommResult);
afs_uint32 code = 0;
cm_scache_t * scp = NULL;
cm_scache_t * dscp = NULL;
}
memset(*ResultCB, 0, size);
- (*ResultCB)->ResultBufferLength = ResultBufferLength;
+ (*ResultCB)->ResultBufferLength = 0;
dwRemaining = ResultBufferLength;
- if (ResultBufferLength)
- pCurrentEntry = (AFSDirEnumEntry *)&(*ResultCB)->ResultData;
+ if (ResultBufferLength >= sizeof( AFSFileEvalResultCB)) {
+ pEvalResultCB = (AFSFileEvalResultCB *)&(*ResultCB)->ResultData;
+ pCurrentEntry = &pEvalResultCB->DirEnum;
+ dwRemaining -= (sizeof( AFSFileEvalResultCB) - sizeof( AFSDirEnumEntry));
+ }
RDR_InitReq(&req);
if ( bWow64 )
return;
}
- code = RDR_PopulateCurrentEntry(pCurrentEntry, ResultBufferLength,
+ code = RDR_PopulateCurrentEntry(pCurrentEntry, dwRemaining,
dscp, scp, userp, &req, NULL, NULL,
(bWow64 ? RDR_POP_WOW64 : 0) |
(bNoFollow ? 0 : (RDR_POP_FOLLOW_MOUNTPOINTS | RDR_POP_EVALUATE_SYMLINKS)),
osi_Log2(afsd_logp, "RDR_EvaluateNodeByID FAILURE code=0x%x status=0x%x",
code, status);
} else {
+ pEvalResultCB->ParentDataVersion.QuadPart = dscp->dataVersion;
+
(*ResultCB)->ResultStatus = STATUS_SUCCESS;
(*ResultCB)->ResultBufferLength = ResultBufferLength - dwRemaining;
osi_Log0(afsd_logp, "RDR_EvaluateNodeByID SUCCESS");