⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 error.c

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 * 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 + -