www.pudn.com > filespy.rar > unicode_str.c
#include "unicode_strdef.h" #include "unicode_str.h" #include#include #include // // CopyRight: Wanfustudio (C) 2007 // Distribute: free use and copy ,modify // ULONG GetWideStrLen( const WCHAR* str ) //============================== // Get a NULL terminated unicode // string's length //============================== { ULONG len = 0; if(NULL == str) { return 0; } while(*(str++) != L'\0') { ++len; } return len; } VOID CopyWideStr( WCHAR* dst, const WCHAR* src ) //============================== // Copy a NULL terminated unicode // string to another one //============================== { if(NULL == dst || NULL == src) { return; } while( ( *(dst++)= *(src++) ) != L'\0' ) { ; // do nothing } } PVOID AllocStrWithWideStr( const WCHAR* str ) //============================== // Allocate a String // //============================== { USTR_BLOCK *block = (USTR_BLOCK *)ExAllocatePool(NonPagedPool, sizeof(USTR_BLOCK)); WCHAR* buf = NULL; WCHAR buflen = Max(wcslen(str) + WIDE_STR_APD_LEN, WIDE_STR_BUF_LEN); if(NULL == block) { return NULL; } buf = ExAllocatePool(NonPagedPool, buflen * sizeof(WCHAR) ); if( NULL == buf) { ExFreePool(block); return NULL; } wcscpy(buf, str); RtlInitUnicodeString(&block->ustr, buf); block->buf = buf; block->buflen = buflen; return (PVOID)block; } PVOID AllocStrWithUniStr( const PUNICODE_STRING ustr ) //============================== // Allocate a string with // unicode string //============================== { USTR_BLOCK *block = (USTR_BLOCK *)ExAllocatePool(NonPagedPool, sizeof(USTR_BLOCK)); WCHAR* buf = NULL; WCHAR buflen = Max(ustr->Length + WIDE_STR_APD_LEN, WIDE_STR_BUF_LEN); if(NULL == block) { return NULL; } buf = ExAllocatePool(NonPagedPool, buflen * sizeof( WCHAR) ); if( NULL == buf) { ExFreePool(block); return NULL; } block->buf = buf; block->buflen = buflen; RtlInitEmptyUnicodeString(&block->ustr, block->buf, buflen * sizeof(WCHAR)); RtlCopyUnicodeString(&block->ustr, ustr); block->buf[ustr->Length] = L'\0'; return (PVOID)block; } VOID FreeStr( PVOID str ) //============================== // Free String 's Buffer // //============================== { USTR_BLOCK *block = (USTR_BLOCK *)str; if( NULL == str) { return; } if(block->buf) { ExFreePool(block->buf); } ExFreePool(block); } BOOLEAN SetStrWithWideStr( PVOID str, const WCHAR* content ) //============================== // Set String With WideByte String // USTR_BLOCK TYPE //============================== { USTR_BLOCK *block = (USTR_BLOCK *)str; WCHAR *buf = NULL; ULONG buflen = GetWideStrLen(content) + WIDE_STR_APD_LEN; if(block->buflen < buflen) { buf = ExAllocatePool(NonPagedPool, buflen * sizeof(WCHAR) ); if(NULL == buf) { return FALSE; } if(block->buf) { ExFreePool(block->buf); block->buf = NULL; } block->buf = buf; block->buflen = buflen; } RtlZeroMemory(&block->ustr, sizeof(block->ustr) ); wcscpy(block->buf, content); RtlInitUnicodeString(&block->ustr, block->buf); return TRUE; } BOOLEAN SetStrWithUniStr( PVOID str, const PUNICODE_STRING content ) //============================== // Set String With Unicode String // USTR_BLOCK TYPE //============================== { USTR_BLOCK *block = (USTR_BLOCK*)str; WCHAR* buf = NULL; ULONG buflen = content->Length + WIDE_STR_APD_LEN; if(block->buflen < buflen ){ buf = ExAllocatePool(NonPagedPool, buflen * sizeof(WCHAR) ); if( NULL == buf) { return FALSE; } if(block->buf) { ExFreePool(block->buf); block->buf = NULL; } block->buf = buf; block->buflen = buflen ; } RtlZeroMemory(&block->ustr, sizeof(block->ustr) ); RtlInitEmptyUnicodeString(&block->ustr, block->buf, buflen * sizeof(WCHAR)); RtlCopyUnicodeString(&block->ustr, content); return TRUE; } VOID CopyStr( PVOID dst, const PVOID src ) //============================== // Copy A String To Dst. String // USTR_BLOCK TYPE //============================== { USTR_BLOCK *block_dst = (USTR_BLOCK*)dst; USTR_BLOCK *block_src = (USTR_BLOCK*)src; SetStrWithUniStr(block_dst, &block_src->ustr); } VOID AppendStrWithInt( int num ) //============================== // Append Int-Type to String // USTR_BLOCK TYPE //============================== { assert(0); //implement later } BOOLEAN AppendStrWithWideStr( PVOID dst, const WCHAR* str ) //============================== // Append WideBytes String to String // USTR_BLOCK TYPE //============================== { USTR_BLOCK *block_dst = (USTR_BLOCK*)dst; WCHAR *buf = NULL; ULONG buflen = wcslen(str) + block_dst->ustr.Length + WIDE_STR_APD_LEN; if(block_dst->buflen < buflen) { buf = ExAllocatePool(NonPagedPool, buflen * sizeof(WCHAR) ); if( NULL == buf ) { return FALSE; } RtlZeroMemory(buf, buflen * sizeof(WCHAR) ); if(block_dst->buf) { wcscpy(buf, block_dst->buf); ExFreePool(block_dst->buf); block_dst->buf = buf; block_dst->buflen = buflen; } } wcscat( block_dst->buf, str); RtlZeroMemory(&block_dst->ustr, sizeof(block_dst->ustr) ); RtlInitUnicodeString(&block_dst->ustr, block_dst->buf); return TRUE; } BOOLEAN AppendStrWithUniStr( PVOID dst, PUNICODE_STRING str ) //============================== // Append Uniocde String to String // USTR_BLOCK TYPE //============================== { USTR_BLOCK * block_dst = (USTR_BLOCK*)dst; WCHAR *buf = NULL; ULONG buflen = wcslen(block_dst->buf) + str->Length + WIDE_STR_APD_LEN; ULONG oldstrlen = wcslen(block_dst->buf); if(str->Length == 0) { return FALSE; } if(block_dst->buflen < buflen) { buf = ExAllocatePool(NonPagedPool, buflen * sizeof(WCHAR) ); if(NULL == buf) { return FALSE; } RtlZeroMemory(buf, buflen * sizeof(WCHAR) ); if(block_dst->buf) { wcscpy(buf, block_dst->buf); ExFreePool(block_dst->buf); block_dst->buf = buf; block_dst->buflen = buflen; } } wcscat(block_dst->buf, str->Buffer); RtlZeroMemory( &block_dst->ustr, sizeof(block_dst->ustr) ); RtlInitUnicodeString(&block_dst->ustr, block_dst->buf); return TRUE; } BOOLEAN AppendStrWithStr( PVOID dst, PVOID str ) //============================== // Append A String to String // USTR_BLOCK TYPE //============================== { USTR_BLOCK *block_str = (USTR_BLOCK*)str; return AppendStrWithUniStr(dst, &block_str->ustr); } WCHAR* GetStrBuf( PVOID str ) //============================== // Get a String's buffer // USTR_BLOCK TYPE //============================== { USTR_BLOCK* block = (USTR_BLOCK*)str; return block->buf; } PUNICODE_STRING GetStrUniStr( PVOID str ) //============================== // Get a String's Unicode string // USTR_BLOCK TYPE //============================== { USTR_BLOCK* block = (USTR_BLOCK*)str; return &block->ustr; } ULONG GetStrBufLen( PVOID str ) //============================== // Get a String's buffer length // USTR_BLOCK TYPE //============================== { USTR_BLOCK* block = (USTR_BLOCK*)str; return block->ustr.Length; }