You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
3.8 KiB
151 lines
3.8 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
smb64.c
|
|
|
|
Abstract:
|
|
|
|
This module implements thunking needed for the SMB MiniRDR
|
|
|
|
Author:
|
|
|
|
David Kruse [DKruse] 30-November 2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
PBYTE
|
|
Smb64ThunkFileRenameInfo(
|
|
IN PFILE_RENAME_INFORMATION pRenameInfo,
|
|
IN OUT PULONG pBufferSize,
|
|
OUT NTSTATUS* pStatus
|
|
);
|
|
|
|
PBYTE
|
|
Smb64ThunkRemoteLinkTrackingInfo(
|
|
IN PBYTE pData,
|
|
IN OUT PULONG BufferSize,
|
|
OUT NTSTATUS* pStatus
|
|
);
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
#pragma alloc_text(PAGE, Smb64ThunkFileRenameInfo)
|
|
#pragma alloc_text(PAGE, Smb64ThunkRemoteLinkTrackingInfo)
|
|
#endif
|
|
|
|
PBYTE
|
|
Smb64ThunkFileRenameInfo(
|
|
IN PFILE_RENAME_INFORMATION pRenameInfo,
|
|
IN OUT PULONG pBufferSize,
|
|
OUT NTSTATUS* pStatus
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine thunks the FILE_RENAME_INFORMATION structure IN PLACE. This means that the
|
|
original buffer will no longer be intact after this call! (However, it requires no memory
|
|
allocation either)
|
|
|
|
Arguments:
|
|
|
|
RxContext - the RDBSS context
|
|
|
|
Return Value:
|
|
|
|
RXSTATUS - The return status for the operation
|
|
|
|
Notes:
|
|
|
|
Remoting of FSCTL's is permitted only to NT servers.
|
|
|
|
--*/
|
|
{
|
|
PFILE_RENAME_INFORMATION32 pRenameInfo32;
|
|
|
|
if (*pBufferSize < pRenameInfo->FileNameLength + sizeof(FILE_RENAME_INFORMATION32)) {
|
|
*pStatus = STATUS_BUFFER_OVERFLOW;
|
|
return NULL;
|
|
}
|
|
|
|
// Allocate the new buffer
|
|
pRenameInfo32 = RxAllocatePoolWithTag( NonPagedPool, *pBufferSize, MRXSMB_MISC_POOLTAG );
|
|
if( !pRenameInfo32 )
|
|
{
|
|
*pStatus = STATUS_INSUFFICIENT_RESOURCES;
|
|
return NULL;
|
|
}
|
|
|
|
// Copy the data into the new buffer
|
|
pRenameInfo32->ReplaceIfExists = pRenameInfo->ReplaceIfExists;
|
|
pRenameInfo32->RootDirectory = *((PULONG)&pRenameInfo->RootDirectory);
|
|
pRenameInfo32->FileNameLength = pRenameInfo->FileNameLength;
|
|
RtlCopyMemory( &pRenameInfo32->FileName, &pRenameInfo->FileName, pRenameInfo->FileNameLength );
|
|
|
|
// Succeeded. Return
|
|
*pStatus = STATUS_SUCCESS;
|
|
return (PBYTE)pRenameInfo32;
|
|
}
|
|
|
|
PBYTE
|
|
Smb64ThunkRemoteLinkTrackingInfo(
|
|
IN PBYTE pData,
|
|
IN OUT PULONG BufferSize,
|
|
OUT NTSTATUS* pStatus
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine handles all the FSCTL's
|
|
|
|
Arguments:
|
|
|
|
RxContext - the RDBSS context
|
|
|
|
Return Value:
|
|
|
|
RXSTATUS - The return status for the operation
|
|
|
|
Notes:
|
|
|
|
Remoting of FSCTL's is permitted only to NT servers.
|
|
|
|
--*/
|
|
{
|
|
PREMOTE_LINK_TRACKING_INFORMATION pRemoteLink = (PREMOTE_LINK_TRACKING_INFORMATION)pData;
|
|
PREMOTE_LINK_TRACKING_INFORMATION32 pRemoteLink32;
|
|
|
|
if (*BufferSize < pRemoteLink->TargetLinkTrackingInformationLength +
|
|
FIELD_OFFSET(REMOTE_LINK_TRACKING_INFORMATION32, TargetLinkTrackingInformationBuffer)) {
|
|
*pStatus = STATUS_BUFFER_OVERFLOW;
|
|
return NULL;
|
|
}
|
|
|
|
// Allocate the new buffer
|
|
pRemoteLink32 = RxAllocatePoolWithTag( NonPagedPool, *BufferSize, MRXSMB_MISC_POOLTAG );
|
|
|
|
if( !pRemoteLink32 )
|
|
{
|
|
*pStatus = STATUS_INSUFFICIENT_RESOURCES;
|
|
return NULL;
|
|
}
|
|
|
|
// Copy the data into the new buffer
|
|
pRemoteLink32->TargetFileObject = *((PULONG)&pRemoteLink->TargetFileObject);
|
|
pRemoteLink32->TargetLinkTrackingInformationLength = pRemoteLink->TargetLinkTrackingInformationLength;
|
|
RtlCopyMemory( &pRemoteLink32->TargetLinkTrackingInformationBuffer,
|
|
&pRemoteLink->TargetLinkTrackingInformationBuffer,
|
|
pRemoteLink->TargetLinkTrackingInformationLength );
|
|
|
|
// Succeeded. Return
|
|
*pStatus = STATUS_SUCCESS;
|
|
return (PBYTE)pRemoteLink32;
|
|
}
|