📄 rtlstr.c
字号:
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; } /* for */ 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");}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; } /* if */ ok(upper_ch == expected_upper_ch, "RtlUpcaseUnicodeChar('%c'[=0x%x]) has result '%c'[=0x%x], expected: '%c'[=0x%x]", ch, ch, upper_ch, upper_ch, expected_upper_ch, expected_upper_ch); } /* for */}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; } /* if */ ascii_buf[i] = ch; result_buf[i] = '\0'; upper_buf[i] = upper_ch; } /* for */ 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]", ascii_str.Buffer[i], ascii_str.Buffer[i], result_str.Buffer[i], result_str.Buffer[i], upper_str.Buffer[i], upper_str.Buffer[i]); } /* for */}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 */ } /* if */ source_buf[i] = ch; result_buf[i] = '\0'; lower_buf[i] = lower_ch; } /* for */ 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]", source_str.Buffer[i], source_str.Buffer[i], result_str.Buffer[i], result_str.Buffer[i], lower_str.Buffer[i], lower_str.Buffer[i]); } /* for */}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; } /* if */ uni_str.Length = ustr2astr[test_num].uni_Length; uni_str.MaximumLength = ustr2astr[test_num].uni_MaximumLength; if (ustr2astr[test_num].uni_buf != NULL) { for (pos = 0; pos < ustr2astr[test_num].uni_buf_size/sizeof(WCHAR); pos++) { uni_buf[pos] = ustr2astr[test_num].uni_buf[pos]; } /* for */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -