171 lines
5 KiB
C
171 lines
5 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
pathutils.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Contains prototypes for functions from ntdll
|
||
|
on XP that are not available on W2K.
|
||
|
|
||
|
History:
|
||
|
|
||
|
09/10/2001 rparsons Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _RTLUTILS_H_
|
||
|
#define _RTLUTILS_H_
|
||
|
|
||
|
#include "ShimHook.h"
|
||
|
|
||
|
namespace ShimLib
|
||
|
{
|
||
|
|
||
|
PVOID
|
||
|
ShimAllocateStringRoutine(
|
||
|
SIZE_T NumberOfBytes
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ShimFreeStringRoutine(
|
||
|
PVOID Buffer
|
||
|
);
|
||
|
|
||
|
const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine = ShimAllocateStringRoutine;
|
||
|
const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine = ShimFreeStringRoutine;
|
||
|
|
||
|
RTL_PATH_TYPE
|
||
|
NTAPI
|
||
|
ShimDetermineDosPathNameType_Ustr(
|
||
|
IN PCUNICODE_STRING String
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
NTAPI
|
||
|
ShimNtPathNameToDosPathName(
|
||
|
IN ULONG Flags,
|
||
|
IN OUT PRTL_UNICODE_STRING_BUFFER Path,
|
||
|
OUT ULONG* Disposition OPTIONAL,
|
||
|
IN OUT PWSTR* FilePart OPTIONAL
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ShimDuplicateUnicodeString(
|
||
|
ULONG Flags,
|
||
|
PCUNICODE_STRING StringIn,
|
||
|
PUNICODE_STRING StringOut
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
NTAPI
|
||
|
ShimpEnsureBufferSize(
|
||
|
IN ULONG Flags,
|
||
|
IN OUT PRTL_BUFFER Buffer,
|
||
|
IN SIZE_T Size
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ShimValidateUnicodeString(
|
||
|
ULONG Flags,
|
||
|
const UNICODE_STRING *String
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Taken from %SDXROOT%\public\sdk\inc\NtRtlStringAndBuffer.h
|
||
|
//
|
||
|
#define ShimEnsureBufferSize(Flags, Buff, NewSizeBytes) \
|
||
|
( ((Buff) != NULL && (NewSizeBytes) <= (Buff)->Size) \
|
||
|
? STATUS_SUCCESS \
|
||
|
: ShimpEnsureBufferSize((Flags), (Buff), (NewSizeBytes)) \
|
||
|
)
|
||
|
|
||
|
#define ShimEnsureUnicodeStringBufferSizeBytes(Buff_, NewSizeBytes_) \
|
||
|
( ( ((NewSizeBytes_) + sizeof((Buff_)->String.Buffer[0])) > UNICODE_STRING_MAX_BYTES ) \
|
||
|
? STATUS_NAME_TOO_LONG \
|
||
|
: !NT_SUCCESS(ShimEnsureBufferSize(0, &(Buff_)->ByteBuffer, ((NewSizeBytes_) + sizeof((Buff_)->String.Buffer[0])))) \
|
||
|
? STATUS_NO_MEMORY \
|
||
|
: (RtlSyncStringToBuffer(Buff_)) \
|
||
|
)
|
||
|
|
||
|
#define ShimEnsureUnicodeStringBufferSizeChars(Buff_, NewSizeChars_) \
|
||
|
(ShimEnsureUnicodeStringBufferSizeBytes((Buff_), (NewSizeChars_) * sizeof((Buff_)->String.Buffer[0])))
|
||
|
|
||
|
//
|
||
|
// Taken from %SDXROOT%\public\sdk\inc\NtRtlStringAndBuffer.h
|
||
|
//
|
||
|
//++
|
||
|
//
|
||
|
// NTSTATUS
|
||
|
// RtlAppendUnicodeStringBuffer(
|
||
|
// OUT PRTL_UNICODE_STRING_BUFFER Destination,
|
||
|
// IN PCUNICODE_STRING Source
|
||
|
// );
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Destination -
|
||
|
// Source -
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// STATUS_SUCCESS
|
||
|
// STATUS_NO_MEMORY
|
||
|
// STATUS_NAME_TOO_LONG (64K UNICODE_STRING length would be exceeded)
|
||
|
//
|
||
|
//--
|
||
|
#define ShimAppendUnicodeStringBuffer(Dest, Source) \
|
||
|
( ( ( (Dest)->String.Length + (Source)->Length + sizeof((Dest)->String.Buffer[0]) ) > UNICODE_STRING_MAX_BYTES ) \
|
||
|
? STATUS_NAME_TOO_LONG \
|
||
|
: (!NT_SUCCESS( \
|
||
|
ShimEnsureBufferSize( \
|
||
|
0, \
|
||
|
&(Dest)->ByteBuffer, \
|
||
|
(Dest)->String.Length + (Source)->Length + sizeof((Dest)->String.Buffer[0]) ) ) \
|
||
|
? STATUS_NO_MEMORY \
|
||
|
: ( ( (Dest)->String.Buffer = (PWSTR)(Dest)->ByteBuffer.Buffer ), \
|
||
|
( RtlMoveMemory( \
|
||
|
(Dest)->String.Buffer + (Dest)->String.Length / sizeof((Dest)->String.Buffer[0]), \
|
||
|
(Source)->Buffer, \
|
||
|
(Source)->Length) ), \
|
||
|
( (Dest)->String.MaximumLength = (RTL_STRING_LENGTH_TYPE)((Dest)->String.Length + (Source)->Length + sizeof((Dest)->String.Buffer[0]))), \
|
||
|
( (Dest)->String.Length += (Source)->Length ), \
|
||
|
( (Dest)->String.Buffer[(Dest)->String.Length / sizeof((Dest)->String.Buffer[0])] = 0 ), \
|
||
|
( STATUS_SUCCESS ) ) ) )
|
||
|
|
||
|
//
|
||
|
// Taken from %SDXROOT%\public\sdk\inc\NtRtlStringAndBuffer.h
|
||
|
//
|
||
|
//++
|
||
|
//
|
||
|
// NTSTATUS
|
||
|
// RtlAssignUnicodeStringBuffer(
|
||
|
// IN OUT PRTL_UNICODE_STRING_BUFFER Buffer,
|
||
|
// PCUNICODE_STRING String
|
||
|
// );
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Buffer -
|
||
|
// String -
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// STATUS_SUCCESS
|
||
|
// STATUS_NO_MEMORY
|
||
|
//--
|
||
|
#define ShimAssignUnicodeStringBuffer(Buff, Str) \
|
||
|
(((Buff)->String.Length = 0), (ShimAppendUnicodeStringBuffer((Buff), (Str))))
|
||
|
|
||
|
|
||
|
}; // end of namespace ShimLib
|
||
|
|
||
|
#endif // _RTLUTILS_H_
|