Leaked source code of windows server 2003
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

/*++
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;
}