mirror of
https://github.com/reactos/reactos.git
synced 2024-06-29 01:12:06 +00:00
[RTL]
- Implement Rtl MemoryStream functions. Patch by David Quintana. CORE-7492 svn path=/trunk/; revision=60705
This commit is contained in:
parent
fc553a6968
commit
fec54daadd
|
@ -52,6 +52,7 @@ target_link_libraries(ntdll
|
|||
rtl
|
||||
ntdllsys
|
||||
libcntpr
|
||||
uuid
|
||||
${PSEH_LIB})
|
||||
|
||||
add_pch(ntdll include/ntdll.h)
|
||||
|
|
|
@ -405,7 +405,7 @@
|
|||
@ stdcall -arch=x86_64 RtlAddFunctionTable(ptr long long)
|
||||
;@ stdcall RtlAddMandatoryAce(ptr long long long long ptr)
|
||||
@ stdcall RtlAddRefActivationContext(ptr)
|
||||
;@ stdcall RtlAddRefMemoryStream
|
||||
@ stdcall RtlAddRefMemoryStream(ptr)
|
||||
@ stdcall RtlAddVectoredContinueHandler(long ptr)
|
||||
@ stdcall RtlAddVectoredExceptionHandler(long ptr)
|
||||
;@ stdcall RtlAddressInSectionTable
|
||||
|
@ -440,8 +440,8 @@
|
|||
@ stdcall RtlCheckRegistryKey(long ptr)
|
||||
@ stdcall RtlClearAllBits(ptr)
|
||||
@ stdcall RtlClearBits(ptr long long)
|
||||
;@ stdcall RtlCloneMemoryStream
|
||||
;@ stdcall RtlCommitMemoryStream
|
||||
@ stdcall RtlCloneMemoryStream(ptr ptr)
|
||||
@ stdcall RtlCommitMemoryStream(ptr long)
|
||||
@ stdcall RtlCompactHeap(long long)
|
||||
@ stdcall RtlCompareMemory(ptr ptr long)
|
||||
@ stdcall RtlCompareMemoryUlong(ptr long long)
|
||||
|
@ -464,8 +464,8 @@
|
|||
@ stdcall RtlCopyLuid(ptr ptr)
|
||||
@ stdcall RtlCopyLuidAndAttributesArray(long ptr ptr)
|
||||
;@ stdcall RtlCopyMappedMemory
|
||||
;@ stdcall RtlCopyMemoryStreamTo
|
||||
;@ stdcall RtlCopyOutOfProcessMemoryStreamTo
|
||||
@ stdcall RtlCopyMemoryStreamTo(ptr ptr int64 ptr ptr)
|
||||
@ stdcall RtlCopyOutOfProcessMemoryStreamTo(ptr ptr int64 ptr ptr) RtlCopyMemoryStreamTo
|
||||
;@ stdcall RtlCopyRangeList ; 5.0 and 5.1 only
|
||||
@ stdcall RtlCopySecurityDescriptor(ptr ptr)
|
||||
@ stdcall RtlCopySid(long ptr ptr)
|
||||
|
@ -571,7 +571,7 @@
|
|||
@ stdcall -arch=win32 -ret64 RtlExtendedMagicDivide(double double long)
|
||||
@ stdcall RtlFillMemory(ptr long long)
|
||||
@ stdcall RtlFillMemoryUlong(ptr long long)
|
||||
;@ stdcall RtlFinalReleaseOutOfProcessMemoryStream
|
||||
@ stdcall RtlFinalReleaseOutOfProcessMemoryStream(ptr)
|
||||
@ stdcall RtlFindActivationContextSectionGuid(long ptr long ptr ptr)
|
||||
@ stdcall RtlFindActivationContextSectionString(long ptr long ptr ptr)
|
||||
@ stdcall RtlFindCharInUnicodeString(long ptr ptr ptr)
|
||||
|
@ -658,9 +658,9 @@
|
|||
@ stdcall RtlInitAnsiString(ptr str)
|
||||
@ stdcall RtlInitAnsiStringEx(ptr str)
|
||||
@ stdcall RtlInitCodePageTable(ptr ptr)
|
||||
;@ stdcall RtlInitMemoryStream
|
||||
@ stdcall RtlInitMemoryStream(ptr)
|
||||
@ stdcall RtlInitNlsTables(ptr ptr ptr ptr)
|
||||
;@ stdcall RtlInitOutOfProcessMemoryStream
|
||||
@ stdcall RtlInitOutOfProcessMemoryStream(ptr)
|
||||
@ stdcall RtlInitString(ptr str)
|
||||
@ stdcall RtlInitUnicodeString(ptr wstr)
|
||||
@ stdcall RtlInitUnicodeStringEx(ptr wstr)
|
||||
|
@ -735,7 +735,7 @@
|
|||
@ stdcall RtlLocalTimeToSystemTime(ptr ptr)
|
||||
@ stdcall RtlLockBootStatusData(ptr)
|
||||
@ stdcall RtlLockHeap(long)
|
||||
;@ stdcall RtlLockMemoryStreamRegion
|
||||
@ stdcall RtlLockMemoryStreamRegion(ptr int64 int64 long)
|
||||
;@ stdcall RtlLogStackBackTrace
|
||||
@ stdcall RtlLookupAtomInAtomTable(ptr wstr ptr)
|
||||
@ stdcall RtlLookupElementGenericTable(ptr ptr)
|
||||
|
@ -781,7 +781,7 @@
|
|||
@ stdcall RtlQueryInformationAcl(ptr ptr long long)
|
||||
@ stdcall RtlQueryInformationActivationContext(long long ptr long ptr long ptr)
|
||||
@ stdcall RtlQueryInformationActiveActivationContext(long ptr long ptr)
|
||||
;@ stdcall RtlQueryInterfaceMemoryStream
|
||||
@ stdcall RtlQueryInterfaceMemoryStream(ptr ptr ptr)
|
||||
;@ stdcall RtlQueryProcessBackTraceInformation
|
||||
@ stdcall RtlQueryProcessDebugInformation(long long ptr)
|
||||
;@ stdcall RtlQueryProcessHeapInformation
|
||||
|
@ -800,14 +800,14 @@
|
|||
@ stdcall RtlRandom(ptr)
|
||||
@ stdcall RtlRandomEx(ptr)
|
||||
@ stdcall RtlReAllocateHeap(long long ptr long)
|
||||
;@ stdcall RtlReadMemoryStream
|
||||
;@ stdcall RtlReadOutOfProcessMemoryStream
|
||||
@ stdcall RtlReadMemoryStream(ptr ptr long ptr)
|
||||
@ stdcall RtlReadOutOfProcessMemoryStream(ptr ptr long ptr)
|
||||
@ stdcall RtlRealPredecessor(ptr)
|
||||
@ stdcall RtlRealSuccessor(ptr)
|
||||
@ stdcall RtlRegisterSecureMemoryCacheCallback(ptr)
|
||||
@ stdcall RtlRegisterWait(ptr ptr ptr ptr long long)
|
||||
@ stdcall RtlReleaseActivationContext(ptr)
|
||||
;@ stdcall RtlReleaseMemoryStream
|
||||
@ stdcall RtlReleaseMemoryStream(ptr)
|
||||
@ stdcall RtlReleasePebLock()
|
||||
@ stdcall RtlReleasePrivilege(ptr)
|
||||
@ stdcall RtlReleaseRelativeName(ptr)
|
||||
|
@ -820,12 +820,12 @@
|
|||
@ stdcall RtlResetRtlTranslations(ptr)
|
||||
@ stdcall -arch=x86_64 RtlRestoreContext(ptr ptr)
|
||||
@ stdcall RtlRestoreLastWin32Error(long) RtlSetLastWin32Error
|
||||
;@ stdcall RtlRevertMemoryStream
|
||||
@ stdcall RtlRevertMemoryStream(ptr)
|
||||
@ stdcall RtlRunDecodeUnicodeString(long ptr)
|
||||
@ stdcall RtlRunEncodeUnicodeString(long ptr)
|
||||
@ stdcall RtlSecondsSince1970ToTime(long ptr)
|
||||
@ stdcall RtlSecondsSince1980ToTime(long ptr)
|
||||
;@ stdcall RtlSeekMemoryStream
|
||||
@ stdcall RtlSeekMemoryStream(ptr int64 long ptr)
|
||||
@ stdcall RtlSelfRelativeToAbsoluteSD2(ptr ptr)
|
||||
@ stdcall RtlSelfRelativeToAbsoluteSD(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
|
||||
@ stdcall RtlSetAllBits(ptr)
|
||||
|
@ -844,7 +844,7 @@
|
|||
@ stdcall RtlSetIoCompletionCallback(long ptr long)
|
||||
@ stdcall RtlSetLastWin32Error(long)
|
||||
@ stdcall RtlSetLastWin32ErrorAndNtStatusFromNtStatus(long)
|
||||
;@ stdcall RtlSetMemoryStreamSize
|
||||
@ stdcall RtlSetMemoryStreamSize(ptr int64)
|
||||
@ stdcall RtlSetOwnerSecurityDescriptor(ptr ptr long)
|
||||
@ stdcall RtlSetProcessIsCritical(long ptr long)
|
||||
;@ stdcall RtlSetProperties ; RtlSetProperties
|
||||
|
@ -869,7 +869,7 @@
|
|||
@ stdcall RtlSleepConditionVariableSRW(ptr ptr ptr long)
|
||||
@ stdcall RtlSplay(ptr)
|
||||
;@ stdcall RtlStartRXact
|
||||
;@ stdcall RtlStatMemoryStream
|
||||
@ stdcall RtlStatMemoryStream(ptr ptr long)
|
||||
@ stdcall RtlStringFromGUID(ptr ptr)
|
||||
@ stdcall RtlSubAuthorityCountSid(ptr)
|
||||
@ stdcall RtlSubAuthoritySid(ptr long)
|
||||
|
@ -907,7 +907,7 @@
|
|||
@ stdcall RtlUniform(ptr)
|
||||
@ stdcall RtlUnlockBootStatusData(ptr)
|
||||
@ stdcall RtlUnlockHeap(long)
|
||||
;@ stdcall RtlUnlockMemoryStreamRegion
|
||||
@ stdcall RtlUnlockMemoryStreamRegion(ptr int64 int64 long)
|
||||
@ stdcall -register RtlUnwind(ptr ptr ptr ptr)
|
||||
@ stdcall -arch=x86_64 RtlUnwindEx(long long ptr long ptr)
|
||||
@ stdcall RtlUpcaseUnicodeChar(long)
|
||||
|
@ -938,7 +938,7 @@
|
|||
@ stdcall RtlWow64EnableFsRedirectionEx(long ptr)
|
||||
@ stdcall RtlWakeAllConditionVariable(ptr)
|
||||
@ stdcall RtlWakeConditionVariable(ptr)
|
||||
;@ stdcall RtlWriteMemoryStream
|
||||
@ stdcall RtlWriteMemoryStream(ptr ptr long ptr)
|
||||
@ stdcall RtlWriteRegistryValue(long ptr ptr long ptr long)
|
||||
@ stdcall RtlZeroHeap(ptr long)
|
||||
@ stdcall RtlZeroMemory(ptr long)
|
||||
|
|
|
@ -4152,6 +4152,180 @@ RtlComputeImportTableHash(
|
|||
);
|
||||
#endif
|
||||
|
||||
//
|
||||
// MemoryStream functions
|
||||
//
|
||||
#ifdef NTOS_MODE_USER
|
||||
|
||||
NTSYSAPI
|
||||
VOID
|
||||
NTAPI
|
||||
RtlInitMemoryStream(
|
||||
_Out_ PRTL_MEMORY_STREAM Stream
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
VOID
|
||||
NTAPI
|
||||
RtlInitOutOfProcessMemoryStream(
|
||||
_Out_ PRTL_MEMORY_STREAM Stream
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
VOID
|
||||
NTAPI
|
||||
RtlFinalReleaseOutOfProcessMemoryStream(
|
||||
_In_ PRTL_MEMORY_STREAM Stream
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlQueryInterfaceMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_In_ REFIID RequestedIid,
|
||||
_Outptr_ PVOID *ResultObject
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
ULONG
|
||||
NTAPI
|
||||
RtlAddRefMemoryStream(
|
||||
_In_ struct IStream *This
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
ULONG
|
||||
NTAPI
|
||||
RtlReleaseMemoryStream(
|
||||
_In_ struct IStream *This
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlReadMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_Out_writes_bytes_(Length) PVOID Buffer,
|
||||
_In_ ULONG Length,
|
||||
_Out_opt_ PULONG BytesRead
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlReadOutOfProcessMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_Out_writes_bytes_(Length) PVOID Buffer,
|
||||
_In_ ULONG Length,
|
||||
_Out_opt_ PULONG BytesRead
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlSeekMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_In_ LARGE_INTEGER RelativeOffset,
|
||||
_In_ ULONG Origin,
|
||||
_Out_opt_ PULARGE_INTEGER ResultOffset
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCopyMemoryStreamTo(
|
||||
_In_ struct IStream *This,
|
||||
_In_ struct IStream *Target,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_Out_opt_ PULARGE_INTEGER BytesRead,
|
||||
_Out_opt_ PULARGE_INTEGER BytesWritten
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCopyOutOfProcessMemoryStreamTo(
|
||||
_In_ struct IStream *This,
|
||||
_In_ struct IStream *Target,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_Out_opt_ PULARGE_INTEGER BytesRead,
|
||||
_Out_opt_ PULARGE_INTEGER BytesWritten
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlStatMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_Out_ struct tagSTATSTG *Stats,
|
||||
_In_ ULONG Flags
|
||||
);
|
||||
|
||||
// Dummy functions
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlWriteMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_In_reads_bytes_(Length) CONST VOID *Buffer,
|
||||
_In_ ULONG Length,
|
||||
_Out_opt_ PULONG BytesWritten
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlSetMemoryStreamSize(
|
||||
_In_ struct IStream *This,
|
||||
_In_ ULARGE_INTEGER NewSize
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCommitMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_In_ ULONG CommitFlags
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlRevertMemoryStream(
|
||||
_In_ struct IStream *This
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlLockMemoryStreamRegion(
|
||||
_In_ struct IStream *This,
|
||||
_In_ ULARGE_INTEGER Offset,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_In_ ULONG LockType
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlUnlockMemoryStreamRegion(
|
||||
_In_ struct IStream *This,
|
||||
_In_ ULARGE_INTEGER Offset,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_In_ ULONG LockType
|
||||
);
|
||||
|
||||
NTSYSAPI
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCloneMemoryStream(
|
||||
_In_ struct IStream *This,
|
||||
_Outptr_ struct IStream **ResultStream
|
||||
);
|
||||
|
||||
#endif // NTOS_MODE_USER
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1559,6 +1559,44 @@ typedef struct _MESSAGE_RESOURCE_DATA
|
|||
|
||||
#endif /* !NTOS_MODE_USER */
|
||||
|
||||
#ifdef NTOS_MODE_USER
|
||||
|
||||
//
|
||||
// Memory Stream
|
||||
//
|
||||
#ifndef CONST_VTBL
|
||||
#ifdef CONST_VTABLE
|
||||
#define CONST_VTBL const
|
||||
#else
|
||||
#define CONST_VTBL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct IStreamVtbl;
|
||||
struct IStream;
|
||||
struct tagSTATSTG;
|
||||
|
||||
typedef struct _RTL_MEMORY_STREAM RTL_MEMORY_STREAM, *PRTL_MEMORY_STREAM;
|
||||
|
||||
typedef VOID
|
||||
(NTAPI *PRTL_MEMORY_STREAM_FINAL_RELEASE_ROUTINE)(
|
||||
_In_ PRTL_MEMORY_STREAM Stream
|
||||
);
|
||||
|
||||
struct _RTL_MEMORY_STREAM
|
||||
{
|
||||
CONST_VTBL struct IStreamVtbl *Vtbl;
|
||||
LONG RefCount;
|
||||
ULONG Unk1;
|
||||
PVOID Current;
|
||||
PVOID Start;
|
||||
PVOID End;
|
||||
PRTL_MEMORY_STREAM_FINAL_RELEASE_ROUTINE FinalRelease;
|
||||
HANDLE ProcessHandle;
|
||||
};
|
||||
|
||||
#endif /* NTOS_MODE_USER */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -33,6 +33,7 @@ list(APPEND SOURCE
|
|||
heapuser.c
|
||||
image.c
|
||||
interlck.c
|
||||
memstream.c
|
||||
message.c
|
||||
largeint.c
|
||||
luid.c
|
||||
|
|
469
reactos/lib/rtl/memstream.c
Normal file
469
reactos/lib/rtl/memstream.c
Normal file
|
@ -0,0 +1,469 @@
|
|||
/* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS system libraries
|
||||
* FILE: lib/rtl/mem.c
|
||||
* PURPOSE: MemoryStream functions
|
||||
* PROGRAMMER: David Quintana (gigaherz@gmail.com)
|
||||
*/
|
||||
|
||||
/* INCLUDES *******************************************************************/
|
||||
|
||||
#define COBJMACROS
|
||||
#define CONST_VTABLE
|
||||
|
||||
#include <rtl.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* VIRTUAL METHOD TABLES ******************************************************/
|
||||
|
||||
const struct IStreamVtbl RtlMemoryStreamVtbl =
|
||||
{
|
||||
RtlQueryInterfaceMemoryStream,
|
||||
RtlAddRefMemoryStream,
|
||||
RtlReleaseMemoryStream,
|
||||
RtlReadMemoryStream,
|
||||
RtlWriteMemoryStream,
|
||||
RtlSeekMemoryStream,
|
||||
RtlSetMemoryStreamSize,
|
||||
RtlCopyMemoryStreamTo,
|
||||
RtlCommitMemoryStream,
|
||||
RtlRevertMemoryStream,
|
||||
RtlLockMemoryStreamRegion,
|
||||
RtlUnlockMemoryStreamRegion,
|
||||
RtlStatMemoryStream,
|
||||
RtlCloneMemoryStream,
|
||||
};
|
||||
|
||||
const struct IStreamVtbl RtlOutOfProcessMemoryStreamVtbl =
|
||||
{
|
||||
RtlQueryInterfaceMemoryStream,
|
||||
RtlAddRefMemoryStream,
|
||||
RtlReleaseMemoryStream,
|
||||
RtlReadOutOfProcessMemoryStream,
|
||||
RtlWriteMemoryStream,
|
||||
RtlSeekMemoryStream,
|
||||
RtlSetMemoryStreamSize,
|
||||
RtlCopyMemoryStreamTo,
|
||||
RtlCommitMemoryStream,
|
||||
RtlRevertMemoryStream,
|
||||
RtlLockMemoryStreamRegion,
|
||||
RtlUnlockMemoryStreamRegion,
|
||||
RtlStatMemoryStream,
|
||||
RtlCloneMemoryStream,
|
||||
};
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
static
|
||||
PRTL_MEMORY_STREAM
|
||||
IStream_To_RTL_MEMORY_STREAM(
|
||||
_In_ IStream *Interface)
|
||||
{
|
||||
if (Interface == NULL)
|
||||
return NULL;
|
||||
|
||||
return CONTAINING_RECORD(Interface, RTL_MEMORY_STREAM, Vtbl);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
RtlInitMemoryStream(
|
||||
_Out_ PRTL_MEMORY_STREAM Stream)
|
||||
{
|
||||
RtlZeroMemory(Stream, sizeof(RTL_MEMORY_STREAM));
|
||||
Stream->Vtbl = &RtlMemoryStreamVtbl;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
RtlInitOutOfProcessMemoryStream(
|
||||
_Out_ PRTL_MEMORY_STREAM Stream)
|
||||
{
|
||||
RtlZeroMemory(Stream, sizeof(RTL_MEMORY_STREAM));
|
||||
Stream->Vtbl = &RtlOutOfProcessMemoryStreamVtbl;
|
||||
Stream->FinalRelease = RtlFinalReleaseOutOfProcessMemoryStream;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
VOID
|
||||
NTAPI
|
||||
RtlFinalReleaseOutOfProcessMemoryStream(
|
||||
_In_ PRTL_MEMORY_STREAM Stream)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlQueryInterfaceMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_In_ REFIID RequestedIid,
|
||||
_Outptr_ PVOID *ResultObject)
|
||||
{
|
||||
if (IsEqualGUID(RequestedIid, &IID_IUnknown) ||
|
||||
IsEqualGUID(RequestedIid, &IID_ISequentialStream) ||
|
||||
IsEqualGUID(RequestedIid, &IID_IStream))
|
||||
{
|
||||
IStream_AddRef(This);
|
||||
*ResultObject = This;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
*ResultObject = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
NTAPI
|
||||
RtlAddRefMemoryStream(
|
||||
_In_ IStream *This)
|
||||
{
|
||||
PRTL_MEMORY_STREAM Stream = IStream_To_RTL_MEMORY_STREAM(This);
|
||||
|
||||
return InterlockedIncrement(&Stream->RefCount);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
NTAPI
|
||||
RtlReleaseMemoryStream(
|
||||
_In_ IStream *This)
|
||||
{
|
||||
PRTL_MEMORY_STREAM Stream = IStream_To_RTL_MEMORY_STREAM(This);
|
||||
LONG Result;
|
||||
|
||||
Result = InterlockedDecrement(&Stream->RefCount);
|
||||
|
||||
if (Result == 0)
|
||||
{
|
||||
if (Stream->FinalRelease)
|
||||
Stream->FinalRelease(Stream);
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlReadMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_Out_writes_bytes_(Length) PVOID Buffer,
|
||||
_In_ ULONG Length,
|
||||
_Out_opt_ PULONG BytesRead)
|
||||
{
|
||||
ULONG CopyLength;
|
||||
PRTL_MEMORY_STREAM Stream = IStream_To_RTL_MEMORY_STREAM(This);
|
||||
SIZE_T Available = (PUCHAR)Stream->End - (PUCHAR)Stream->Current;
|
||||
|
||||
if (BytesRead)
|
||||
*BytesRead = 0;
|
||||
|
||||
if (!Length)
|
||||
return S_OK;
|
||||
|
||||
CopyLength = min(Available, Length);
|
||||
|
||||
RtlMoveMemory(Buffer, Stream->Current, CopyLength);
|
||||
|
||||
Stream->Current = (PUCHAR)Stream->Current + CopyLength;
|
||||
|
||||
*BytesRead = CopyLength;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlReadOutOfProcessMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_Out_writes_bytes_(Length) PVOID Buffer,
|
||||
_In_ ULONG Length,
|
||||
_Out_opt_ PULONG BytesRead)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ULONG CopyLength;
|
||||
PRTL_MEMORY_STREAM Stream = IStream_To_RTL_MEMORY_STREAM(This);
|
||||
SIZE_T Available = (PUCHAR)Stream->End - (PUCHAR)Stream->Current;
|
||||
|
||||
if (BytesRead)
|
||||
*BytesRead = 0;
|
||||
|
||||
if (!Length)
|
||||
return S_OK;
|
||||
|
||||
CopyLength = min(Available, Length);
|
||||
|
||||
Status = NtReadVirtualMemory(Stream->ProcessHandle,
|
||||
Stream->Current,
|
||||
Buffer,
|
||||
CopyLength,
|
||||
BytesRead);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
Stream->Current = (PUCHAR)Stream->Current + *BytesRead;
|
||||
|
||||
return HRESULT_FROM_WIN32(RtlNtStatusToDosError(Status));
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlSeekMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_In_ LARGE_INTEGER RelativeOffset,
|
||||
_In_ ULONG Origin,
|
||||
_Out_opt_ PULARGE_INTEGER ResultOffset)
|
||||
{
|
||||
PVOID NewPosition;
|
||||
PRTL_MEMORY_STREAM Stream = IStream_To_RTL_MEMORY_STREAM(This);
|
||||
|
||||
switch (Origin)
|
||||
{
|
||||
case STREAM_SEEK_SET:
|
||||
NewPosition = (PUCHAR)Stream->Start + RelativeOffset.QuadPart;
|
||||
break;
|
||||
|
||||
case STREAM_SEEK_CUR:
|
||||
NewPosition = (PUCHAR)Stream->Current + RelativeOffset.QuadPart;
|
||||
break;
|
||||
|
||||
case STREAM_SEEK_END:
|
||||
NewPosition = (PUCHAR)Stream->End - RelativeOffset.QuadPart;
|
||||
break;
|
||||
|
||||
default:
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
if (NewPosition < Stream->Start || NewPosition > Stream->End)
|
||||
return STG_E_INVALIDPOINTER;
|
||||
|
||||
Stream->Current = NewPosition;
|
||||
|
||||
if (ResultOffset)
|
||||
ResultOffset->QuadPart = (PUCHAR)Stream->Current - (PUCHAR)Stream->Start;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCopyMemoryStreamTo(
|
||||
_In_ IStream *This,
|
||||
_In_ IStream *Target,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_Out_opt_ PULARGE_INTEGER BytesRead,
|
||||
_Out_opt_ PULARGE_INTEGER BytesWritten)
|
||||
{
|
||||
CHAR Buffer[1024];
|
||||
ULONGLONG TotalSize;
|
||||
ULONG Left, Amount;
|
||||
HRESULT Result;
|
||||
|
||||
if (BytesRead)
|
||||
BytesRead->QuadPart = 0;
|
||||
if (BytesWritten)
|
||||
BytesWritten->QuadPart = 0;
|
||||
|
||||
if (!Target)
|
||||
return S_OK;
|
||||
|
||||
if (!Length.QuadPart)
|
||||
return S_OK;
|
||||
|
||||
/* Copy data */
|
||||
TotalSize = Length.QuadPart;
|
||||
while (TotalSize)
|
||||
{
|
||||
Left = min(TotalSize, sizeof(Buffer));
|
||||
|
||||
/* Read */
|
||||
Result = IStream_Read(This, Buffer, Left, &Amount);
|
||||
if (BytesRead)
|
||||
BytesRead->QuadPart += Amount;
|
||||
if (FAILED(Result) || Amount == 0)
|
||||
break;
|
||||
|
||||
Left = Amount;
|
||||
|
||||
/* Write */
|
||||
Result = IStream_Write(Target, Buffer, Left, &Amount);
|
||||
if (BytesWritten)
|
||||
BytesWritten->QuadPart += Amount;
|
||||
if (FAILED(Result) || Amount != Left)
|
||||
break;
|
||||
|
||||
TotalSize -= Left;
|
||||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlStatMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_Out_ STATSTG *Stats,
|
||||
_In_ ULONG Flags)
|
||||
{
|
||||
PRTL_MEMORY_STREAM Stream = IStream_To_RTL_MEMORY_STREAM(This);
|
||||
|
||||
if (!Stats)
|
||||
return STG_E_INVALIDPOINTER;
|
||||
|
||||
RtlZeroMemory(Stats, sizeof(STATSTG));
|
||||
Stats->type = STGTY_STREAM;
|
||||
Stats->cbSize.QuadPart = (PUCHAR)Stream->End - (PUCHAR)Stream->Start;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* DUMMY FUNCTIONS ************************************************************/
|
||||
/*
|
||||
* The following functions return E_NOTIMPL in Windows Server 2003.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlWriteMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_In_reads_bytes_(Length) CONST VOID *Buffer,
|
||||
_In_ ULONG Length,
|
||||
_Out_opt_ PULONG BytesWritten)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
UNREFERENCED_PARAMETER(Buffer);
|
||||
UNREFERENCED_PARAMETER(Length);
|
||||
UNREFERENCED_PARAMETER(BytesWritten);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlSetMemoryStreamSize(
|
||||
_In_ IStream *This,
|
||||
_In_ ULARGE_INTEGER NewSize)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
UNREFERENCED_PARAMETER(NewSize);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCommitMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_In_ ULONG CommitFlags)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
UNREFERENCED_PARAMETER(CommitFlags);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlRevertMemoryStream(
|
||||
_In_ IStream *This)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlLockMemoryStreamRegion(
|
||||
_In_ IStream *This,
|
||||
_In_ ULARGE_INTEGER Offset,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_In_ ULONG LockType)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
UNREFERENCED_PARAMETER(Offset);
|
||||
UNREFERENCED_PARAMETER(Length);
|
||||
UNREFERENCED_PARAMETER(LockType);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlUnlockMemoryStreamRegion(
|
||||
_In_ IStream *This,
|
||||
_In_ ULARGE_INTEGER Offset,
|
||||
_In_ ULARGE_INTEGER Length,
|
||||
_In_ ULONG LockType)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
UNREFERENCED_PARAMETER(Offset);
|
||||
UNREFERENCED_PARAMETER(Length);
|
||||
UNREFERENCED_PARAMETER(LockType);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HRESULT
|
||||
NTAPI
|
||||
RtlCloneMemoryStream(
|
||||
_In_ IStream *This,
|
||||
_Outptr_ IStream **ResultStream)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(This);
|
||||
UNREFERENCED_PARAMETER(ResultStream);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
Loading…
Reference in a new issue