📄 rtlstr.c
字号:
CHAR upper_ch;
char ascii_buf[257];
char result_buf[257];
char upper_buf[257];
STRING ascii_str;
STRING result_str;
STRING upper_str;
for (i = 0; i <= 255; i++) {
ch = (CHAR) i;
if (ch >= 'a' && ch <= 'z') {
upper_ch = ch - 'a' + 'A';
} else {
upper_ch = ch;
}
ascii_buf[i] = ch;
result_buf[i] = '\0';
upper_buf[i] = upper_ch;
}
ascii_buf[i] = '\0';
result_buf[i] = '\0';
upper_buf[i] = '\0';
ascii_str.Length = 256;
ascii_str.MaximumLength = 256;
ascii_str.Buffer = ascii_buf;
result_str.Length = 256;
result_str.MaximumLength = 256;
result_str.Buffer = result_buf;
upper_str.Length = 256;
upper_str.MaximumLength = 256;
upper_str.Buffer = upper_buf;
pRtlUpperString(&result_str, &ascii_str);
ok(memcmp(result_str.Buffer, upper_str.Buffer, 256) == 0,
"RtlUpperString does not work as expected\n");
}
static void test_RtlUpcaseUnicodeChar(void)
{
int i;
WCHAR ch;
WCHAR upper_ch;
WCHAR expected_upper_ch;
for (i = 0; i <= 255; i++) {
ch = (WCHAR) i;
upper_ch = pRtlUpcaseUnicodeChar(ch);
if (ch >= 'a' && ch <= 'z') {
expected_upper_ch = ch - 'a' + 'A';
} else if (ch >= 0xe0 && ch <= 0xfe && ch != 0xf7) {
expected_upper_ch = ch - 0x20;
} else if (ch == 0xff) {
expected_upper_ch = 0x178;
} else {
expected_upper_ch = ch;
}
ok(upper_ch == expected_upper_ch,
"RtlUpcaseUnicodeChar('%c'[=0x%x]) has result '%c'[=0x%x], expected: '%c'[=0x%x]\n",
ch, ch, upper_ch, upper_ch, expected_upper_ch, expected_upper_ch);
}
}
static void test_RtlUpcaseUnicodeString(void)
{
int i;
WCHAR ch;
WCHAR upper_ch;
WCHAR ascii_buf[257];
WCHAR result_buf[257];
WCHAR upper_buf[257];
UNICODE_STRING ascii_str;
UNICODE_STRING result_str;
UNICODE_STRING upper_str;
for (i = 0; i <= 255; i++) {
ch = (WCHAR) i;
if (ch >= 'a' && ch <= 'z') {
upper_ch = ch - 'a' + 'A';
} else if (ch >= 0xe0 && ch <= 0xfe && ch != 0xf7) {
upper_ch = ch - 0x20;
} else if (ch == 0xff) {
upper_ch = 0x178;
} else {
upper_ch = ch;
}
ascii_buf[i] = ch;
result_buf[i] = '\0';
upper_buf[i] = upper_ch;
}
ascii_buf[i] = '\0';
result_buf[i] = '\0';
upper_buf[i] = '\0';
ascii_str.Length = 512;
ascii_str.MaximumLength = 512;
ascii_str.Buffer = ascii_buf;
result_str.Length = 512;
result_str.MaximumLength = 512;
result_str.Buffer = result_buf;
upper_str.Length = 512;
upper_str.MaximumLength = 512;
upper_str.Buffer = upper_buf;
pRtlUpcaseUnicodeString(&result_str, &ascii_str, 0);
for (i = 0; i <= 255; i++) {
ok(result_str.Buffer[i] == upper_str.Buffer[i],
"RtlUpcaseUnicodeString works wrong: '%c'[=0x%x] is converted to '%c'[=0x%x], expected: '%c'[=0x%x]\n",
ascii_str.Buffer[i], ascii_str.Buffer[i],
result_str.Buffer[i], result_str.Buffer[i],
upper_str.Buffer[i], upper_str.Buffer[i]);
}
}
static void test_RtlDowncaseUnicodeString(void)
{
int i;
WCHAR ch;
WCHAR lower_ch;
WCHAR source_buf[1025];
WCHAR result_buf[1025];
WCHAR lower_buf[1025];
UNICODE_STRING source_str;
UNICODE_STRING result_str;
UNICODE_STRING lower_str;
for (i = 0; i <= 1024; i++) {
ch = (WCHAR) i;
if (ch >= 'A' && ch <= 'Z') {
lower_ch = ch - 'A' + 'a';
} else if (ch >= 0xc0 && ch <= 0xde && ch != 0xd7) {
lower_ch = ch + 0x20;
} else if (ch >= 0x391 && ch <= 0x3ab && ch != 0x3a2) {
lower_ch = ch + 0x20;
} else {
switch (ch) {
case 0x178: lower_ch = 0xff; break;
case 0x181: lower_ch = 0x253; break;
case 0x186: lower_ch = 0x254; break;
case 0x189: lower_ch = 0x256; break;
case 0x18a: lower_ch = 0x257; break;
case 0x18e: lower_ch = 0x1dd; break;
case 0x18f: lower_ch = 0x259; break;
case 0x190: lower_ch = 0x25b; break;
case 0x193: lower_ch = 0x260; break;
case 0x194: lower_ch = 0x263; break;
case 0x196: lower_ch = 0x269; break;
case 0x197: lower_ch = 0x268; break;
case 0x19c: lower_ch = 0x26f; break;
case 0x19d: lower_ch = 0x272; break;
case 0x19f: lower_ch = 0x275; break;
case 0x1a9: lower_ch = 0x283; break;
case 0x1ae: lower_ch = 0x288; break;
case 0x1b1: lower_ch = 0x28a; break;
case 0x1b2: lower_ch = 0x28b; break;
case 0x1b7: lower_ch = 0x292; break;
case 0x1c4: lower_ch = 0x1c6; break;
case 0x1c7: lower_ch = 0x1c9; break;
case 0x1ca: lower_ch = 0x1cc; break;
case 0x1f1: lower_ch = 0x1f3; break;
case 0x386: lower_ch = 0x3ac; break;
case 0x388: lower_ch = 0x3ad; break;
case 0x389: lower_ch = 0x3ae; break;
case 0x38a: lower_ch = 0x3af; break;
case 0x38c: lower_ch = 0x3cc; break;
case 0x38e: lower_ch = 0x3cd; break;
case 0x38f: lower_ch = 0x3ce; break;
case 0x400: lower_ch = 0x0; break;
default: lower_ch = ch; break;
} /* switch */
}
source_buf[i] = ch;
result_buf[i] = '\0';
lower_buf[i] = lower_ch;
}
source_buf[i] = '\0';
result_buf[i] = '\0';
lower_buf[i] = '\0';
source_str.Length = 2048;
source_str.MaximumLength = 2048;
source_str.Buffer = source_buf;
result_str.Length = 2048;
result_str.MaximumLength = 2048;
result_str.Buffer = result_buf;
lower_str.Length = 2048;
lower_str.MaximumLength = 2048;
lower_str.Buffer = lower_buf;
pRtlDowncaseUnicodeString(&result_str, &source_str, 0);
for (i = 0; i <= 1024; i++) {
ok(result_str.Buffer[i] == lower_str.Buffer[i] || result_str.Buffer[i] == source_str.Buffer[i] + 1,
"RtlDowncaseUnicodeString works wrong: '%c'[=0x%x] is converted to '%c'[=0x%x], expected: '%c'[=0x%x]\n",
source_str.Buffer[i], source_str.Buffer[i],
result_str.Buffer[i], result_str.Buffer[i],
lower_str.Buffer[i], lower_str.Buffer[i]);
}
}
typedef struct {
int ansi_Length;
int ansi_MaximumLength;
int ansi_buf_size;
const char *ansi_buf;
int uni_Length;
int uni_MaximumLength;
int uni_buf_size;
const char *uni_buf;
BOOLEAN doalloc;
int res_Length;
int res_MaximumLength;
int res_buf_size;
const char *res_buf;
NTSTATUS result;
} ustr2astr_t;
static const ustr2astr_t ustr2astr[] = {
{ 10, 12, 12, "------------", 0, 0, 0, "", TRUE, 0, 1, 1, "", STATUS_SUCCESS},
{ 10, 12, 12, "------------", 12, 12, 12, "abcdef", TRUE, 6, 7, 7, "abcdef", STATUS_SUCCESS},
{ 0, 2, 12, "------------", 12, 12, 12, "abcdef", TRUE, 6, 7, 7, "abcdef", STATUS_SUCCESS},
{ 10, 12, 12, NULL, 12, 12, 12, "abcdef", TRUE, 6, 7, 7, "abcdef", STATUS_SUCCESS},
{ 0, 0, 12, "------------", 12, 12, 12, "abcdef", FALSE, 6, 0, 0, "", STATUS_BUFFER_OVERFLOW},
{ 0, 1, 12, "------------", 12, 12, 12, "abcdef", FALSE, 0, 1, 1, "", STATUS_BUFFER_OVERFLOW},
{ 0, 2, 12, "------------", 12, 12, 12, "abcdef", FALSE, 1, 2, 2, "a", STATUS_BUFFER_OVERFLOW},
{ 0, 3, 12, "------------", 12, 12, 12, "abcdef", FALSE, 2, 3, 3, "ab", STATUS_BUFFER_OVERFLOW},
{ 0, 5, 12, "------------", 12, 12, 12, "abcdef", FALSE, 4, 5, 5, "abcd", STATUS_BUFFER_OVERFLOW},
{ 8, 5, 12, "------------", 12, 12, 12, "abcdef", FALSE, 4, 5, 5, "abcd", STATUS_BUFFER_OVERFLOW},
{ 8, 6, 12, "------------", 12, 12, 12, "abcdef", FALSE, 5, 6, 6, "abcde", STATUS_BUFFER_OVERFLOW},
{ 8, 7, 12, "------------", 12, 12, 12, "abcdef", FALSE, 6, 7, 7, "abcdef", STATUS_SUCCESS},
{ 8, 7, 12, "------------", 0, 12, 12, NULL, FALSE, 0, 7, 0, "", STATUS_SUCCESS},
{ 0, 0, 12, NULL, 10, 10, 12, NULL, FALSE, 5, 0, 0, NULL, STATUS_BUFFER_OVERFLOW},
};
#define NB_USTR2ASTR (sizeof(ustr2astr)/sizeof(*ustr2astr))
static void test_RtlUnicodeStringToAnsiString(void)
{
size_t pos;
CHAR ansi_buf[257];
WCHAR uni_buf[257];
STRING ansi_str;
UNICODE_STRING uni_str;
NTSTATUS result;
size_t test_num;
for (test_num = 0; test_num < NB_USTR2ASTR; test_num++) {
ansi_str.Length = ustr2astr[test_num].ansi_Length;
ansi_str.MaximumLength = ustr2astr[test_num].ansi_MaximumLength;
if (ustr2astr[test_num].ansi_buf != NULL) {
memcpy(ansi_buf, ustr2astr[test_num].ansi_buf, ustr2astr[test_num].ansi_buf_size);
ansi_buf[ustr2astr[test_num].ansi_buf_size] = '\0';
ansi_str.Buffer = ansi_buf;
} else {
ansi_str.Buffer = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -