[PATCH 3/3] ntdll/tests: Add tests for RtlIpv4AddressToString / RtlIpv4AddressToStringEx [resend]
Detlef Riekenberg
wine.dev at web.de
Wed Aug 4 14:48:38 CDT 2010
According to MSDN, the functions are available since Vista.
This is wrong.
The functions are also available in XP/W2003
--
By By ... Detlef
---
dlls/ntdll/tests/rtl.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 166 insertions(+), 0 deletions(-)
diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c
index 6e76a3c..763cb8d 100644
--- a/dlls/ntdll/tests/rtl.c
+++ b/dlls/ntdll/tests/rtl.c
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include "ntdll_test.h"
+#include "winsock2.h"
#ifndef __WINE_WINTERNL_H
@@ -70,6 +71,9 @@ static NTSTATUS (WINAPI *pRtlFreeSid)(PSID);
static struct _TEB * (WINAPI *pNtCurrentTeb)(void);
static DWORD (WINAPI *pRtlGetThreadErrorMode)(void);
static NTSTATUS (WINAPI *pRtlSetThreadErrorMode)(DWORD, LPDWORD);
+static CHAR * (WINAPI *pRtlIpv4AddressToStringA)(const IN_ADDR *, LPSTR);
+static NTSTATUS (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, LPSTR, PULONG);
+
static HMODULE hkernel32 = 0;
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
#define LEN 16
@@ -107,6 +111,8 @@ static void InitFunctionPtrs(void)
pNtCurrentTeb = (void *)GetProcAddress(hntdll, "NtCurrentTeb");
pRtlGetThreadErrorMode = (void *)GetProcAddress(hntdll, "RtlGetThreadErrorMode");
pRtlSetThreadErrorMode = (void *)GetProcAddress(hntdll, "RtlSetThreadErrorMode");
+ pRtlIpv4AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringA");
+ pRtlIpv4AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringExA");
}
hkernel32 = LoadLibraryA("kernel32.dll");
ok(hkernel32 != 0, "LoadLibrary failed\n");
@@ -1094,6 +1100,164 @@ static void test_RtlThreadErrorMode(void)
pRtlSetThreadErrorMode(oldmode, NULL);
}
+static void test_RtlIpv4AddressToString(void)
+{
+ CHAR buffer[20];
+ CHAR *res;
+ IN_ADDR ip;
+ DWORD len;
+
+ if (!pRtlIpv4AddressToStringA)
+ {
+ win_skip("RtlIpv4AddressToStringA not available\n");
+ return;
+ }
+
+ ip.s_addr = htonl(0x01020304);
+
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringA(&ip, buffer);
+ len = strlen(buffer);
+ ok(res == (buffer + len), "got %p with '%s' (expected %p)\n", res, buffer, buffer + len);
+
+ res = pRtlIpv4AddressToStringA(&ip, NULL);
+ ok( (res == (void *)~0) ||
+ broken(res == (NULL + len)), /* XP and w2003 */
+ "got %p (expected ~0)\n", res);
+
+ if (0) {
+ /* this crash in windows */
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringA(NULL, buffer);
+ trace("got 0x%x with '%s'\n", res, buffer);
+ }
+
+ if (0) {
+ /* this crash in windows */
+ res = pRtlIpv4AddressToStringA(NULL, NULL);
+ trace("got 0x%x\n", res);
+ }
+}
+
+static void test_RtlIpv4AddressToStringEx(void)
+{
+ LPSTR ip_1234 = "1.2.3.4";
+ LPSTR ip_1234_80 = "1.2.3.4:80";
+ LPSTR expect;
+ CHAR buffer[30];
+ NTSTATUS res;
+ IN_ADDR ip;
+ ULONG size;
+ DWORD used;
+ USHORT port;
+
+ if (!pRtlIpv4AddressToStringExA)
+ {
+ win_skip("RtlIpv4AddressToStringExA not available\n");
+ return;
+ }
+
+ ip.s_addr = htonl(0x01020304);
+
+ port = htons(80);
+ expect = ip_1234_80;
+
+ size = sizeof(buffer);
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ used = strlen(buffer);
+ ok( (res == STATUS_SUCCESS) &&
+ (size == strlen(expect) + 1) && !strcmp(buffer, expect),
+ "got 0x%x and size %d with '%s'\n", res, size, buffer);
+
+ size = used + 1;
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ ok( (res == STATUS_SUCCESS) &&
+ (size == strlen(expect) + 1) && !strcmp(buffer, expect),
+ "got 0x%x and size %d with '%s'\n", res, size, buffer);
+
+ size = used;
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1),
+ "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n",
+ res, size, buffer, used + 1);
+
+ size = used - 1;
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1),
+ "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n",
+ res, size, buffer, used + 1);
+
+
+ /* to get only the ip, use 0 as port */
+ port = 0;
+ expect = ip_1234;
+
+ size = sizeof(buffer);
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ used = strlen(buffer);
+ ok( (res == STATUS_SUCCESS) &&
+ (size == strlen(expect) + 1) && !strcmp(buffer, expect),
+ "got 0x%x and size %d with '%s'\n", res, size, buffer);
+
+ size = used + 1;
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ ok( (res == STATUS_SUCCESS) &&
+ (size == strlen(expect) + 1) && !strcmp(buffer, expect),
+ "got 0x%x and size %d with '%s'\n", res, size, buffer);
+
+ size = used;
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1),
+ "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n",
+ res, size, buffer, used + 1);
+
+ size = used - 1;
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size);
+ ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1),
+ "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n",
+ res, size, buffer, used + 1);
+
+
+ /* parameters are checked */
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(&ip, 0, buffer, NULL);
+ ok(res == STATUS_INVALID_PARAMETER,
+ "got 0x%x with '%s' (expected STATUS_INVALID_PARAMETER)\n", res, buffer);
+
+ size = sizeof(buffer);
+ res = pRtlIpv4AddressToStringExA(&ip, 0, NULL, &size);
+ ok( res == STATUS_INVALID_PARAMETER,
+ "got 0x%x and size %d (expected STATUS_INVALID_PARAMETER)\n", res, size);
+
+ size = sizeof(buffer);
+ memset(buffer, '#', sizeof(buffer) - 1);
+ buffer[sizeof(buffer) -1] = 0;
+ res = pRtlIpv4AddressToStringExA(NULL, 0, buffer, &size);
+ ok( res == STATUS_INVALID_PARAMETER,
+ "got 0x%x and size %d with '%s' (expected STATUS_INVALID_PARAMETER)\n",
+ res, size, buffer);
+}
+
+
START_TEST(rtl)
{
InitFunctionPtrs();
@@ -1114,4 +1278,6 @@ START_TEST(rtl)
test_RtlAllocateAndInitializeSid();
test_RtlDeleteTimer();
test_RtlThreadErrorMode();
+ test_RtlIpv4AddressToString();
+ test_RtlIpv4AddressToStringEx();
}
--
1.7.0.4
More information about the wine-patches
mailing list