📄 error.c
字号:
/*
* Unit tests for RtlNtStatusToDosError function
*
* Copyright (c) 2002 Andriy Palamarchuk
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include <stdio.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "wine/test.h"
#include "windef.h"
#include "winbase.h"
#include "rpcnterr.h"
#include "winreg.h"
#include "winternl.h"
/* FIXME!!! this test checks only mappings, defined by MSDN:
* http://support.microsoft.com/default.aspx?scid=KB;EN-US;q113996&
* It is necessary to add other mappings and to test them up to Windows XP.
*
* Some Windows platforms don't know about all the mappings, and in such
* cases they return somewhat strange results (Win98) or a generic error
* like ERROR_MR_MID_NOT_FOUND (NT4). Our tests have to know about these to
* not fail, but we would very much prefer Wine not to return such garbage.
* To you can pass the 'strict' option to this test to force it to only check
* results against the first listed value. This test should pass in strict
* mode on the latest Windows platform (currently XP) and in Wine.
* (of course older Windows platforms will fail to pass the strict mode)
*/
static ULONG (WINAPI *statustodoserror)(NTSTATUS Status);
static int strict;
static int prepare_test(void)
{
HMODULE ntdll;
int argc;
char** argv;
ntdll = LoadLibraryA("ntdll.dll");
statustodoserror = (void*)GetProcAddress(ntdll, "RtlNtStatusToDosError");
if (!statustodoserror)
return 0;
argc = winetest_get_mainargs(&argv);
strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
return 1;
}
static void cmp_call(NTSTATUS win_nt, ULONG win32, const char* message)
{
ULONG err;
err = statustodoserror(win_nt);
ok(err == win32,
"%s (%lx): got %ld, expected %ld\n",
message, win_nt, err, win32);
}
static void cmp_call2(NTSTATUS win_nt, ULONG win32, const char* message)
{
ULONG err;
err = statustodoserror(win_nt);
ok(err == win32 ||
(!strict && err == ERROR_MR_MID_NOT_FOUND),
"%s (%lx): got %ld, expected %ld (or MID_NOT_FOUND)\n",
message, win_nt, err, win32);
}
static void cmp_call3(NTSTATUS win_nt, ULONG win32_1, ULONG win32_2, const char* message)
{
ULONG err;
err = statustodoserror(win_nt);
ok(err == win32_1 || (!strict && err == win32_2),
"%s (%lx): got %ld, expected %ld or %ld\n",
message, win_nt, err, win32_1, win32_2);
}
static void cmp_call4(NTSTATUS win_nt, ULONG win32_1, ULONG win32_2, const char* message)
{
ULONG err;
err = statustodoserror(win_nt);
ok(err == win32_1 ||
(!strict && (err == win32_2 || err == ERROR_MR_MID_NOT_FOUND)),
"%s (%lx): got %ld, expected %ld or %ld\n",
message, win_nt, err, win32_1, win32_2);
}
#define cmp(status, error) \
cmp_call(status, error, #status)
#define cmp2(status, error) \
cmp_call2(status, error, #status)
#define cmp3(status, error1, error2) \
cmp_call3(status, error1, error2, #status)
#define cmp4(status, error1, error2) \
cmp_call4(status, error1, error2, #status)
static void run_error_tests(void)
{
cmp(STATUS_DATATYPE_MISALIGNMENT, ERROR_NOACCESS);
cmp(STATUS_ACCESS_VIOLATION, ERROR_NOACCESS);
cmp2(STATUS_DATATYPE_MISALIGNMENT_ERROR, ERROR_NOACCESS);
cmp(STATUS_CTL_FILE_NOT_SUPPORTED, ERROR_NOT_SUPPORTED);
cmp(STATUS_PORT_ALREADY_SET, ERROR_INVALID_PARAMETER);
cmp(STATUS_SECTION_NOT_IMAGE, ERROR_INVALID_PARAMETER);
cmp(STATUS_BAD_WORKING_SET_LIMIT, ERROR_INVALID_PARAMETER);
cmp(STATUS_WORKING_SET_LIMIT_RANGE, ERROR_INVALID_PARAMETER);
cmp(STATUS_INCOMPATIBLE_FILE_MAP, ERROR_INVALID_PARAMETER);
cmp(STATUS_PORT_DISCONNECTED, ERROR_INVALID_HANDLE);
cmp(STATUS_NOT_LOCKED, ERROR_NOT_LOCKED);
cmp(STATUS_NOT_MAPPED_VIEW, ERROR_INVALID_ADDRESS);
cmp(STATUS_UNABLE_TO_FREE_VM, ERROR_INVALID_PARAMETER);
cmp(STATUS_UNABLE_TO_DELETE_SECTION, ERROR_INVALID_PARAMETER);
cmp(STATUS_MORE_PROCESSING_REQUIRED, ERROR_MORE_DATA);
cmp(STATUS_INVALID_CID, ERROR_INVALID_PARAMETER);
cmp(STATUS_STACK_OVERFLOW, ERROR_STACK_OVERFLOW);
cmp(STATUS_BAD_INITIAL_STACK, ERROR_STACK_OVERFLOW);
cmp(STATUS_INVALID_VOLUME_LABEL, ERROR_LABEL_TOO_LONG);
cmp(STATUS_SECTION_NOT_EXTENDED, ERROR_OUTOFMEMORY);
cmp(STATUS_NOT_MAPPED_DATA, ERROR_INVALID_ADDRESS);
cmp2(STATUS_NO_LDT, ERROR_INVALID_THREAD_ID);
cmp(STATUS_INFO_LENGTH_MISMATCH, ERROR_BAD_LENGTH);
cmp(STATUS_INVALID_INFO_CLASS, ERROR_INVALID_PARAMETER);
cmp(STATUS_SUSPEND_COUNT_EXCEEDED, ERROR_SIGNAL_REFUSED);
cmp(STATUS_NOTIFY_ENUM_DIR, ERROR_NOTIFY_ENUM_DIR);
cmp(STATUS_REGISTRY_RECOVERED, ERROR_REGISTRY_RECOVERED);
cmp(STATUS_REGISTRY_IO_FAILED, ERROR_REGISTRY_IO_FAILED);
cmp(STATUS_NOT_REGISTRY_FILE, ERROR_NOT_REGISTRY_FILE);
cmp(STATUS_KEY_DELETED, ERROR_KEY_DELETED);
cmp(STATUS_NO_LOG_SPACE, ERROR_NO_LOG_SPACE);
cmp(STATUS_KEY_HAS_CHILDREN, ERROR_KEY_HAS_CHILDREN);
cmp(STATUS_CHILD_MUST_BE_VOLATILE, ERROR_CHILD_MUST_BE_VOLATILE);
cmp(STATUS_REGISTRY_CORRUPT, ERROR_BADDB);
cmp(STATUS_DLL_NOT_FOUND, ERROR_MOD_NOT_FOUND);
cmp(STATUS_DLL_INIT_FAILED, ERROR_DLL_INIT_FAILED);
cmp2(STATUS_INVALID_IMPORT_OF_NON_DLL, ERROR_INVALID_IMPORT_OF_NON_DLL);
cmp(STATUS_ORDINAL_NOT_FOUND, ERROR_INVALID_ORDINAL);
cmp(STATUS_DRIVER_ORDINAL_NOT_FOUND, ERROR_INVALID_ORDINAL);
cmp2(STATUS_DRIVER_UNABLE_TO_LOAD, ERROR_BAD_DRIVER);
cmp(STATUS_ENTRYPOINT_NOT_FOUND, ERROR_PROC_NOT_FOUND);
cmp(STATUS_DRIVER_ENTRYPOINT_NOT_FOUND, ERROR_PROC_NOT_FOUND);
cmp(STATUS_PENDING, ERROR_IO_PENDING);
cmp(STATUS_MORE_ENTRIES, ERROR_MORE_DATA);
cmp(STATUS_INTEGER_OVERFLOW, ERROR_ARITHMETIC_OVERFLOW);
cmp(STATUS_BUFFER_OVERFLOW, ERROR_MORE_DATA);
cmp(STATUS_NO_MORE_FILES, ERROR_NO_MORE_FILES);
cmp(STATUS_NO_INHERITANCE, ERROR_NO_INHERITANCE);
cmp(STATUS_NO_MORE_EAS, ERROR_NO_MORE_ITEMS);
cmp(STATUS_NO_MORE_ENTRIES, ERROR_NO_MORE_ITEMS);
cmp(STATUS_GUIDS_EXHAUSTED, ERROR_NO_MORE_ITEMS);
cmp(STATUS_AGENTS_EXHAUSTED, ERROR_NO_MORE_ITEMS);
cmp(STATUS_UNSUCCESSFUL, ERROR_GEN_FAILURE);
cmp(STATUS_TOO_MANY_LINKS, ERROR_TOO_MANY_LINKS);
cmp(STATUS_NOT_IMPLEMENTED, ERROR_INVALID_FUNCTION);
cmp(STATUS_ILLEGAL_FUNCTION, ERROR_INVALID_FUNCTION);
cmp(STATUS_IN_PAGE_ERROR, ERROR_SWAPERROR);
cmp(STATUS_PAGEFILE_QUOTA, ERROR_PAGEFILE_QUOTA);
cmp(STATUS_COMMITMENT_LIMIT, ERROR_COMMITMENT_LIMIT);
cmp(STATUS_SECTION_TOO_BIG, ERROR_NOT_ENOUGH_MEMORY);
cmp(RPC_NT_SS_IN_NULL_CONTEXT, ERROR_INVALID_HANDLE);
cmp(RPC_NT_INVALID_BINDING, ERROR_INVALID_HANDLE);
cmp(STATUS_INVALID_HANDLE, ERROR_INVALID_HANDLE);
cmp(STATUS_OBJECT_TYPE_MISMATCH, ERROR_INVALID_HANDLE);
cmp(STATUS_FILE_CLOSED, ERROR_INVALID_HANDLE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -