diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 66b56b0eba8..7512d91acab 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -239,8 +239,8 @@ @ cdecl __setusermatherr(ptr) msvcrt.__setusermatherr @ stub __strncnt @ stub __swprintf_l -@ stub __sys_errlist -@ stub __sys_nerr +@ cdecl __sys_errlist() msvcr90.__sys_errlist +@ cdecl __sys_nerr() msvcr90.__sys_nerr @ cdecl __threadhandle() msvcrt.__threadhandle @ cdecl __threadid() msvcrt.__threadid @ stub __timezone diff --git a/dlls/msvcr90/msvcr90.c b/dlls/msvcr90/msvcr90.c index 4fa65b5e544..a1994d87d09 100644 --- a/dlls/msvcr90/msvcr90.c +++ b/dlls/msvcr90/msvcr90.c @@ -123,3 +123,19 @@ int CDECL _initterm_e(_INITTERM_E_FN *table, _INITTERM_E_FN *end) } return res; } + +/********************************************************************* + * __sys_nerr (MSVCR90.@) + */ +int* CDECL __sys_nerr(void) +{ + return (int*)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "_sys_nerr"); +} + +/********************************************************************* + * __sys_errlist (MSVCR90.@) + */ +char** CDECL __sys_errlist(void) +{ + return (char**)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "_sys_errlist"); +} diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 0255b96adf2..74b1614a19e 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -231,8 +231,8 @@ @ cdecl __setusermatherr(ptr) msvcrt.__setusermatherr @ stub __strncnt @ stub __swprintf_l -@ stub __sys_errlist -@ stub __sys_nerr +@ cdecl __sys_errlist() +@ cdecl __sys_nerr() @ cdecl __threadhandle() msvcrt.__threadhandle @ cdecl __threadid() msvcrt.__threadid @ stub __timezone diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c index 03d75eef9cb..5fe00b2168d 100644 --- a/dlls/msvcr90/tests/msvcr90.c +++ b/dlls/msvcr90/tests/msvcr90.c @@ -31,6 +31,10 @@ static int (__cdecl *p_initterm_e)(_INITTERM_E_FN *table, _INITTERM_E_FN *end); static void* (__cdecl *p_encode_pointer)(void *); static void* (__cdecl *p_decode_pointer)(void *); static void* (__cdecl *p_encoded_null)(void); +static int *p_sys_nerr; +static int* (__cdecl *p__sys_nerr)(void); +static char **p_sys_errlist; +static char** (__cdecl *p__sys_errlist)(void); int cb_called[4]; @@ -168,6 +172,27 @@ static void test__encode_pointer(void) ok(p_encoded_null() == p_encode_pointer(NULL), "Error encoding null\n"); } +static void test_error_messages(void) +{ + int *size, size_copy; + + if(!p_sys_nerr || !p__sys_nerr || !p_sys_errlist || !p__sys_errlist) { + win_skip("Skipping test_error_messages tests\n"); + return; + } + + size = p__sys_nerr(); + size_copy = *size; + ok(*p_sys_nerr == *size, "_sys_nerr = %u, size = %u\n", *p_sys_nerr, *size); + + *size = 20; + ok(*p_sys_nerr == *size, "_sys_nerr = %u, size = %u\n", *p_sys_nerr, *size); + + *size = size_copy; + + ok(*p_sys_errlist == *(p__sys_errlist()), "p_sys_errlist != p__sys_errlist()\n"); +} + /* ########## */ START_TEST(msvcr90) @@ -190,7 +215,12 @@ START_TEST(msvcr90) p_encode_pointer = (void *) GetProcAddress(hcrt, "_encode_pointer"); p_decode_pointer = (void *) GetProcAddress(hcrt, "_decode_pointer"); p_encoded_null = (void *) GetProcAddress(hcrt, "_encoded_null"); + p_sys_nerr = (void *) GetProcAddress(hcrt, "_sys_nerr"); + p__sys_nerr = (void *) GetProcAddress(hcrt, "__sys_nerr"); + p_sys_errlist = (void *) GetProcAddress(hcrt, "_sys_errlist"); + p__sys_errlist = (void *) GetProcAddress(hcrt, "__sys_errlist"); test__initterm_e(); test__encode_pointer(); + test_error_messages(); }