Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
3.9 KiB

// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// Copyright (c) 1985-2000 Microsoft Corporation
//
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
// You should have received a copy of the Microsoft End-User License Agreement
// for this software along with this release; see the file "license.txt".
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//
#include "inc.h"
#pragma hdrstop
#include "localmsg.h"
struct ErrorTable {
IP_STATUS Error;
DWORD ErrorCode;
} ErrorTable[] =
{
{ IP_BUF_TOO_SMALL, IP_MESSAGE_BUF_TOO_SMALL },
{ IP_DEST_NO_ROUTE, IP_MESSAGE_DEST_NO_ROUTE },
{ IP_DEST_PROHIBITED, IP_MESSAGE_DEST_PROHIBITED },
{ IP_DEST_SCOPE_MISMATCH, IP_MESSAGE_DEST_SCOPE_MISMATCH },
{ IP_DEST_ADDR_UNREACHABLE, IP_MESSAGE_DEST_ADDR_UNREACHABLE },
{ IP_DEST_PORT_UNREACHABLE, IP_MESSAGE_DEST_PORT_UNREACHABLE },
{ IP_DEST_UNREACHABLE, IP_MESSAGE_DEST_UNREACHABLE },
{ IP_NO_RESOURCES, IP_MESSAGE_NO_RESOURCES },
{ IP_BAD_OPTION, IP_MESSAGE_BAD_OPTION },
{ IP_HW_ERROR, IP_MESSAGE_HW_ERROR },
{ IP_PACKET_TOO_BIG, IP_MESSAGE_PACKET_TOO_BIG },
{ IP_REQ_TIMED_OUT, IP_MESSAGE_REQ_TIMED_OUT },
{ IP_BAD_REQ, IP_MESSAGE_BAD_REQ },
{ IP_BAD_ROUTE, IP_MESSAGE_BAD_ROUTE },
{ IP_HOP_LIMIT_EXCEEDED, IP_MESSAGE_HOP_LIMIT_EXCEEDED },
{ IP_REASSEMBLY_TIME_EXCEEDED, IP_MESSAGE_REASSEMBLY_TIME_EXCEEDED },
{ IP_PARAMETER_PROBLEM, IP_MESSAGE_PARAMETER_PROBLEM },
{ IP_OPTION_TOO_BIG, IP_MESSAGE_OPTION_TOO_BIG },
{ IP_BAD_DESTINATION, IP_MESSAGE_BAD_DESTINATION },
{ IP_TIME_EXCEEDED, IP_MESSAGE_TIME_EXCEEDED },
{ IP_BAD_HEADER, IP_MESSAGE_BAD_HEADER },
{ IP_UNRECOGNIZED_NEXT_HEADER, IP_MESSAGE_UNRECOGNIZED_NEXT_HEADER },
{ IP_ICMP_ERROR, IP_MESSAGE_ICMP_ERROR },
// the following error must be last - it is used as a sentinel
{ IP_GENERAL_FAILURE, IP_MESSAGE_GENERAL_FAILURE }
};
DWORD
WINAPI
GetIpErrorString(
IN IP_STATUS ErrorCode,
OUT PWCHAR Buffer,
IN OUT PDWORD Size
)
/*++
Routine Description:
Returns the error message corresponding to the specified error code
in the user supplied buffer.
Arguments:
ErrorCode - Supplies the code identifying the error.
Buffer - Returns the error message.
Size - Supplies the number of characters that can be stored in 'Buffer',
excluding the terminating nul. Returns the required character count.
Return Value:
NO_ERROR or ERROR_INSUFFICIENT_BUFFER.
--*/
{
DWORD Count, Status = NO_ERROR;
PWCHAR Message = NULL;
int i;
for (i = 0; ErrorTable[i].Error != IP_GENERAL_FAILURE; i++) {
if (ErrorTable[i].Error == ErrorCode) {
break;
}
}
Count = FormatMessageW(
FORMAT_MESSAGE_FROM_HMODULE |
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_MAX_WIDTH_MASK,
g_hModule,
ErrorTable[i].ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR) &Message,
0,
NULL);
if (*Size < Count) {
*Size = Count;
Status = ERROR_INSUFFICIENT_BUFFER;
} else if (Count) {
wcscpy(Buffer, Message);
}
if (Count) {
LocalFree(Message);
}
return Status;
}