📄 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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"#include "ntsecapi.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", 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)", 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", 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", 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); cmp(STATUS_INVALID_PORT_HANDLE, ERROR_INVALID_HANDLE); cmp(STATUS_HANDLE_NOT_CLOSABLE, ERROR_INVALID_HANDLE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -