/*++ 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_