Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167////////////////////////////////////////////////////////////////////// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine// All rights reserved// This file was released under the GPLv2 on June 2015.////////////////////////////////////////////////////////////////////
extern "C"ULONGMyRtlCompareMemory( PVOID s1, PVOID s2, ULONG len ){ ULONG i;
for(i=0; i<len; i++) { if( ((char*)s1)[i] != ((char*)s2)[i] ) break; } return i;}
#define STRING_BUFFER_ALIGNMENT (32)#define STRING_BUFFER_ALIGN(sz) (((sz)+STRING_BUFFER_ALIGNMENT)&(~((ULONG)(STRING_BUFFER_ALIGNMENT-1))))
#ifndef NT_NATIVE_MODE
extern "C"ULONGRtlCompareUnicodeString( PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase ){ ULONG i;
if(s1->Length != s2->Length) return (-1); i = memcmp(s1->Buffer, s2->Buffer, (s1->Length) ? (s1->Length) : (s2->Length)); return i;}
extern "C"NTSTATUSRtlUpcaseUnicodeString( PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc ){// if(s1->Length != s2->Length) return (-1); memcpy(dst->Buffer, src->Buffer, src->Length); dst->Buffer[src->Length/sizeof(WCHAR)] = 0; dst->Length = src->Length; _wcsupr(dst->Buffer); return STATUS_SUCCESS;}
extern "C"NTSTATUSRtlAppendUnicodeToString( IN PUNICODE_STRING Str1, IN PWSTR Str2 ){ PWCHAR tmp; USHORT i;
#ifdef _X86_
__asm push ebx __asm push esi __asm xor ebx,ebx __asm mov esi,Str2Scan_1: __asm cmp [word ptr esi+ebx],0 __asm je EO_Scan __asm add ebx,2 __asm jmp Scan_1EO_Scan: __asm mov i,bx __asm pop esi __asm pop ebx
#else // NO X86 optimization, use generic C/C++
i=0; while(Str2[i]) { i++; } i *= sizeof(WCHAR);
#endif // _X86_
tmp = Str1->Buffer; ASSERT(Str1->MaximumLength); if((Str1->Length+i+sizeof(WCHAR)) > Str1->MaximumLength) { PWCHAR tmp2 = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool, STRING_BUFFER_ALIGN(i + Str1->Length + sizeof(WCHAR))*2, 'ilTS'); if(!tmp2) return STATUS_INSUFFICIENT_RESOURCES; memcpy(tmp2, tmp, Str1->MaximumLength); ExFreePool(tmp); tmp = tmp2; Str1->MaximumLength = STRING_BUFFER_ALIGN(i + sizeof(WCHAR))*2; Str1->Buffer = tmp; } RtlCopyMemory(((PCHAR)tmp)+Str1->Length, Str2, i); i+=Str1->Length; tmp[(i / sizeof(WCHAR))] = 0; Str1->Length = i;
return STATUS_SUCCESS;
#undef UDF_UNC_STR_TAG
} // end RtlAppendUnicodeToString()
#endif //NT_NATIVE_MODE
#ifdef CDRW_W32NTSTATUSMyInitUnicodeString( IN PUNICODE_STRING Str1, IN PCWSTR Str2 ){
USHORT i;
#ifdef _X86_
__asm push ebx __asm push esi __asm xor ebx,ebx __asm mov esi,Str2Scan_1: __asm cmp [word ptr esi+ebx],0 __asm je EO_Scan __asm add ebx,2 __asm jmp Scan_1EO_Scan: __asm mov i,bx __asm pop esi __asm pop ebx
#else // NO X86 optimization, use generic C/C++
i=0; while(Str2[i]) { i++; } i *= sizeof(WCHAR);
#endif // _X86_
Str1->MaximumLength = STRING_BUFFER_ALIGN((Str1->Length = i) + sizeof(WCHAR)); Str1->Buffer = (PWCHAR)MyAllocatePool__(NonPagedPool, Str1->MaximumLength); if(!Str1->Buffer) return STATUS_INSUFFICIENT_RESOURCES; RtlCopyMemory(Str1->Buffer, Str2, i); Str1->Buffer[i/sizeof(WCHAR)] = 0; return STATUS_SUCCESS;
} // end MyInitUnicodeString()#endif //CDRW_W32