mirror of https://github.com/lianthony/NT4.0
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.
367 lines
11 KiB
367 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
error.c
|
|
|
|
Abstract:
|
|
|
|
Wininet error handlers
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 03-Nov-1995
|
|
|
|
Revision History:
|
|
|
|
03-Nov-1995 rfirth
|
|
Created
|
|
|
|
--*/
|
|
|
|
#include "asyncdl.h"
|
|
|
|
//
|
|
// data
|
|
//
|
|
|
|
BOOL NoAlerts = TRUE;
|
|
|
|
//
|
|
// external data
|
|
//
|
|
|
|
extern BOOL Verbose;
|
|
|
|
//
|
|
// private prototypes
|
|
//
|
|
|
|
char* map_error(DWORD);
|
|
void get_last_internet_error(void);
|
|
LPSTR get_error_string(DWORD);
|
|
void print_response(LPSTR, DWORD, BOOL);
|
|
void alert(void);
|
|
|
|
//
|
|
// functions
|
|
//
|
|
|
|
void print_error(char* func, char* format, ...) {
|
|
|
|
va_list argptr;
|
|
char buf[256];
|
|
DWORD error;
|
|
|
|
error = GetLastError();
|
|
va_start(argptr, format);
|
|
vsprintf(buf, format, argptr);
|
|
printf("error: %s: %s returns %d [%s]\n", func, buf, error, map_error(error));
|
|
va_end(argptr);
|
|
if (error == ERROR_INTERNET_EXTENDED_ERROR) {
|
|
get_last_internet_error();
|
|
}
|
|
}
|
|
|
|
#define ERROR_CASE(error) case error: return # error
|
|
|
|
char* map_error(DWORD error) {
|
|
switch (error) {
|
|
|
|
//
|
|
// Windows base errors
|
|
//
|
|
|
|
ERROR_CASE(ERROR_SUCCESS);
|
|
ERROR_CASE(ERROR_INVALID_FUNCTION);
|
|
ERROR_CASE(ERROR_FILE_NOT_FOUND);
|
|
ERROR_CASE(ERROR_PATH_NOT_FOUND);
|
|
ERROR_CASE(ERROR_ACCESS_DENIED);
|
|
ERROR_CASE(ERROR_INVALID_HANDLE);
|
|
ERROR_CASE(ERROR_NOT_ENOUGH_MEMORY);
|
|
ERROR_CASE(ERROR_NO_MORE_FILES);
|
|
ERROR_CASE(ERROR_INVALID_PASSWORD);
|
|
ERROR_CASE(ERROR_INVALID_PARAMETER);
|
|
ERROR_CASE(ERROR_BUFFER_OVERFLOW);
|
|
ERROR_CASE(ERROR_NO_MORE_SEARCH_HANDLES);
|
|
ERROR_CASE(ERROR_INVALID_TARGET_HANDLE);
|
|
ERROR_CASE(ERROR_CALL_NOT_IMPLEMENTED);
|
|
ERROR_CASE(ERROR_INSUFFICIENT_BUFFER);
|
|
ERROR_CASE(ERROR_INVALID_NAME);
|
|
ERROR_CASE(ERROR_INVALID_LEVEL);
|
|
ERROR_CASE(ERROR_BAD_PATHNAME);
|
|
ERROR_CASE(ERROR_BUSY);
|
|
ERROR_CASE(ERROR_ALREADY_EXISTS);
|
|
ERROR_CASE(ERROR_FILENAME_EXCED_RANGE);
|
|
ERROR_CASE(ERROR_MORE_DATA);
|
|
ERROR_CASE(ERROR_NO_MORE_ITEMS);
|
|
ERROR_CASE(ERROR_INVALID_ADDRESS);
|
|
ERROR_CASE(ERROR_OPERATION_ABORTED);
|
|
ERROR_CASE(ERROR_IO_PENDING);
|
|
ERROR_CASE(RPC_S_INVALID_STRING_BINDING);
|
|
ERROR_CASE(RPC_S_WRONG_KIND_OF_BINDING);
|
|
ERROR_CASE(RPC_S_INVALID_BINDING);
|
|
ERROR_CASE(RPC_S_PROTSEQ_NOT_SUPPORTED);
|
|
ERROR_CASE(RPC_S_INVALID_RPC_PROTSEQ);
|
|
ERROR_CASE(RPC_S_INVALID_STRING_UUID);
|
|
ERROR_CASE(RPC_S_INVALID_ENDPOINT_FORMAT);
|
|
ERROR_CASE(RPC_S_INVALID_NET_ADDR);
|
|
ERROR_CASE(RPC_S_NO_ENDPOINT_FOUND);
|
|
ERROR_CASE(RPC_S_INVALID_TIMEOUT);
|
|
ERROR_CASE(RPC_S_OBJECT_NOT_FOUND);
|
|
ERROR_CASE(RPC_S_ALREADY_REGISTERED);
|
|
ERROR_CASE(RPC_S_TYPE_ALREADY_REGISTERED);
|
|
ERROR_CASE(RPC_S_ALREADY_LISTENING);
|
|
ERROR_CASE(RPC_S_NO_PROTSEQS_REGISTERED);
|
|
ERROR_CASE(RPC_S_NOT_LISTENING);
|
|
ERROR_CASE(RPC_S_UNKNOWN_MGR_TYPE);
|
|
ERROR_CASE(RPC_S_UNKNOWN_IF);
|
|
ERROR_CASE(RPC_S_NO_BINDINGS);
|
|
ERROR_CASE(RPC_S_NO_PROTSEQS);
|
|
ERROR_CASE(RPC_S_CANT_CREATE_ENDPOINT);
|
|
ERROR_CASE(RPC_S_OUT_OF_RESOURCES);
|
|
ERROR_CASE(RPC_S_SERVER_UNAVAILABLE);
|
|
ERROR_CASE(RPC_S_SERVER_TOO_BUSY);
|
|
ERROR_CASE(RPC_S_INVALID_NETWORK_OPTIONS);
|
|
ERROR_CASE(RPC_S_NO_CALL_ACTIVE);
|
|
ERROR_CASE(RPC_S_CALL_FAILED);
|
|
ERROR_CASE(RPC_S_CALL_FAILED_DNE);
|
|
ERROR_CASE(RPC_S_PROTOCOL_ERROR);
|
|
ERROR_CASE(RPC_S_UNSUPPORTED_TRANS_SYN);
|
|
ERROR_CASE(RPC_S_UNSUPPORTED_TYPE);
|
|
ERROR_CASE(RPC_S_INVALID_TAG);
|
|
ERROR_CASE(RPC_S_INVALID_BOUND);
|
|
ERROR_CASE(RPC_S_NO_ENTRY_NAME);
|
|
ERROR_CASE(RPC_S_INVALID_NAME_SYNTAX);
|
|
ERROR_CASE(RPC_S_UNSUPPORTED_NAME_SYNTAX);
|
|
ERROR_CASE(RPC_S_UUID_NO_ADDRESS);
|
|
ERROR_CASE(RPC_S_DUPLICATE_ENDPOINT);
|
|
ERROR_CASE(RPC_S_UNKNOWN_AUTHN_TYPE);
|
|
ERROR_CASE(RPC_S_MAX_CALLS_TOO_SMALL);
|
|
ERROR_CASE(RPC_S_STRING_TOO_LONG);
|
|
ERROR_CASE(RPC_S_PROTSEQ_NOT_FOUND);
|
|
ERROR_CASE(RPC_S_PROCNUM_OUT_OF_RANGE);
|
|
ERROR_CASE(RPC_S_BINDING_HAS_NO_AUTH);
|
|
ERROR_CASE(RPC_S_UNKNOWN_AUTHN_SERVICE);
|
|
ERROR_CASE(RPC_S_UNKNOWN_AUTHN_LEVEL);
|
|
ERROR_CASE(RPC_S_INVALID_AUTH_IDENTITY);
|
|
ERROR_CASE(RPC_S_UNKNOWN_AUTHZ_SERVICE);
|
|
ERROR_CASE(EPT_S_INVALID_ENTRY);
|
|
ERROR_CASE(EPT_S_CANT_PERFORM_OP);
|
|
ERROR_CASE(EPT_S_NOT_REGISTERED);
|
|
ERROR_CASE(RPC_S_NOTHING_TO_EXPORT);
|
|
ERROR_CASE(RPC_S_INCOMPLETE_NAME);
|
|
ERROR_CASE(RPC_S_INVALID_VERS_OPTION);
|
|
ERROR_CASE(RPC_S_NO_MORE_MEMBERS);
|
|
ERROR_CASE(RPC_S_NOT_ALL_OBJS_UNEXPORTED);
|
|
ERROR_CASE(RPC_S_INTERFACE_NOT_FOUND);
|
|
ERROR_CASE(RPC_S_ENTRY_ALREADY_EXISTS);
|
|
ERROR_CASE(RPC_S_ENTRY_NOT_FOUND);
|
|
ERROR_CASE(RPC_S_NAME_SERVICE_UNAVAILABLE);
|
|
ERROR_CASE(RPC_S_INVALID_NAF_ID);
|
|
ERROR_CASE(RPC_S_CANNOT_SUPPORT);
|
|
ERROR_CASE(RPC_S_NO_CONTEXT_AVAILABLE);
|
|
ERROR_CASE(RPC_S_INTERNAL_ERROR);
|
|
ERROR_CASE(RPC_S_ZERO_DIVIDE);
|
|
ERROR_CASE(RPC_S_ADDRESS_ERROR);
|
|
ERROR_CASE(RPC_S_FP_DIV_ZERO);
|
|
ERROR_CASE(RPC_S_FP_UNDERFLOW);
|
|
ERROR_CASE(RPC_S_FP_OVERFLOW);
|
|
ERROR_CASE(RPC_X_NO_MORE_ENTRIES);
|
|
ERROR_CASE(RPC_X_SS_CHAR_TRANS_OPEN_FAIL);
|
|
ERROR_CASE(RPC_X_SS_CHAR_TRANS_SHORT_FILE);
|
|
ERROR_CASE(RPC_X_SS_IN_NULL_CONTEXT);
|
|
ERROR_CASE(RPC_X_SS_CONTEXT_DAMAGED);
|
|
ERROR_CASE(RPC_X_SS_HANDLES_MISMATCH);
|
|
ERROR_CASE(RPC_X_SS_CANNOT_GET_CALL_HANDLE);
|
|
ERROR_CASE(RPC_X_NULL_REF_POINTER);
|
|
ERROR_CASE(RPC_X_ENUM_VALUE_OUT_OF_RANGE);
|
|
ERROR_CASE(RPC_X_BYTE_COUNT_TOO_SMALL);
|
|
ERROR_CASE(RPC_X_BAD_STUB_DATA);
|
|
|
|
|
|
//
|
|
// WinInet errors
|
|
//
|
|
|
|
ERROR_CASE(ERROR_INTERNET_OUT_OF_HANDLES);
|
|
ERROR_CASE(ERROR_INTERNET_TIMEOUT);
|
|
ERROR_CASE(ERROR_INTERNET_EXTENDED_ERROR);
|
|
ERROR_CASE(ERROR_INTERNET_INTERNAL_ERROR);
|
|
ERROR_CASE(ERROR_INTERNET_INVALID_URL);
|
|
ERROR_CASE(ERROR_INTERNET_UNRECOGNIZED_SCHEME);
|
|
ERROR_CASE(ERROR_INTERNET_NAME_NOT_RESOLVED);
|
|
ERROR_CASE(ERROR_INTERNET_PROTOCOL_NOT_FOUND);
|
|
ERROR_CASE(ERROR_INTERNET_INVALID_OPTION);
|
|
ERROR_CASE(ERROR_INTERNET_BAD_OPTION_LENGTH);
|
|
ERROR_CASE(ERROR_INTERNET_OPTION_NOT_SETTABLE);
|
|
ERROR_CASE(ERROR_INTERNET_SHUTDOWN);
|
|
ERROR_CASE(ERROR_INTERNET_INCORRECT_USER_NAME);
|
|
ERROR_CASE(ERROR_INTERNET_INCORRECT_PASSWORD);
|
|
ERROR_CASE(ERROR_INTERNET_LOGIN_FAILURE);
|
|
ERROR_CASE(ERROR_INTERNET_INVALID_OPERATION);
|
|
ERROR_CASE(ERROR_INTERNET_OPERATION_CANCELLED);
|
|
ERROR_CASE(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
|
|
ERROR_CASE(ERROR_INTERNET_NOT_PROXY_REQUEST);
|
|
ERROR_CASE(ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND);
|
|
ERROR_CASE(ERROR_INTERNET_BAD_REGISTRY_PARAMETER);
|
|
ERROR_CASE(ERROR_INTERNET_NO_DIRECT_ACCESS);
|
|
ERROR_CASE(ERROR_INTERNET_NO_CONTEXT);
|
|
ERROR_CASE(ERROR_INTERNET_NO_CALLBACK);
|
|
ERROR_CASE(ERROR_INTERNET_REQUEST_PENDING);
|
|
|
|
ERROR_CASE(ERROR_FTP_TRANSFER_IN_PROGRESS);
|
|
ERROR_CASE(ERROR_FTP_DROPPED);
|
|
|
|
ERROR_CASE(ERROR_GOPHER_PROTOCOL_ERROR);
|
|
ERROR_CASE(ERROR_GOPHER_NOT_FILE);
|
|
ERROR_CASE(ERROR_GOPHER_DATA_ERROR);
|
|
ERROR_CASE(ERROR_GOPHER_END_OF_DATA);
|
|
ERROR_CASE(ERROR_GOPHER_INVALID_LOCATOR);
|
|
ERROR_CASE(ERROR_GOPHER_INCORRECT_LOCATOR_TYPE);
|
|
ERROR_CASE(ERROR_GOPHER_NOT_GOPHER_PLUS);
|
|
ERROR_CASE(ERROR_GOPHER_ATTRIBUTE_NOT_FOUND);
|
|
ERROR_CASE(ERROR_GOPHER_UNKNOWN_LOCATOR);
|
|
|
|
ERROR_CASE(ERROR_HTTP_HEADER_NOT_FOUND);
|
|
ERROR_CASE(ERROR_HTTP_DOWNLEVEL_SERVER);
|
|
ERROR_CASE(ERROR_HTTP_INVALID_SERVER_RESPONSE);
|
|
|
|
|
|
//
|
|
// Windows sockets errors
|
|
//
|
|
|
|
ERROR_CASE(WSAEINTR);
|
|
ERROR_CASE(WSAEBADF);
|
|
ERROR_CASE(WSAEACCES);
|
|
ERROR_CASE(WSAEFAULT);
|
|
ERROR_CASE(WSAEINVAL);
|
|
ERROR_CASE(WSAEMFILE);
|
|
ERROR_CASE(WSAEWOULDBLOCK);
|
|
ERROR_CASE(WSAEINPROGRESS);
|
|
ERROR_CASE(WSAEALREADY);
|
|
ERROR_CASE(WSAENOTSOCK);
|
|
ERROR_CASE(WSAEDESTADDRREQ);
|
|
ERROR_CASE(WSAEMSGSIZE);
|
|
ERROR_CASE(WSAEPROTOTYPE);
|
|
ERROR_CASE(WSAENOPROTOOPT);
|
|
ERROR_CASE(WSAEPROTONOSUPPORT);
|
|
ERROR_CASE(WSAESOCKTNOSUPPORT);
|
|
ERROR_CASE(WSAEOPNOTSUPP);
|
|
ERROR_CASE(WSAEPFNOSUPPORT);
|
|
ERROR_CASE(WSAEAFNOSUPPORT);
|
|
ERROR_CASE(WSAEADDRINUSE);
|
|
ERROR_CASE(WSAEADDRNOTAVAIL);
|
|
ERROR_CASE(WSAENETDOWN);
|
|
ERROR_CASE(WSAENETUNREACH);
|
|
ERROR_CASE(WSAENETRESET);
|
|
ERROR_CASE(WSAECONNABORTED);
|
|
ERROR_CASE(WSAECONNRESET);
|
|
ERROR_CASE(WSAENOBUFS);
|
|
ERROR_CASE(WSAEISCONN);
|
|
ERROR_CASE(WSAENOTCONN);
|
|
ERROR_CASE(WSAESHUTDOWN);
|
|
ERROR_CASE(WSAETOOMANYREFS);
|
|
ERROR_CASE(WSAETIMEDOUT);
|
|
ERROR_CASE(WSAECONNREFUSED);
|
|
ERROR_CASE(WSAELOOP);
|
|
ERROR_CASE(WSAENAMETOOLONG);
|
|
ERROR_CASE(WSAEHOSTDOWN);
|
|
ERROR_CASE(WSAEHOSTUNREACH);
|
|
ERROR_CASE(WSAENOTEMPTY);
|
|
ERROR_CASE(WSAEPROCLIM);
|
|
ERROR_CASE(WSAEUSERS);
|
|
ERROR_CASE(WSAEDQUOT);
|
|
ERROR_CASE(WSAESTALE);
|
|
ERROR_CASE(WSAEREMOTE);
|
|
ERROR_CASE(WSAEDISCON);
|
|
ERROR_CASE(WSASYSNOTREADY);
|
|
ERROR_CASE(WSAVERNOTSUPPORTED);
|
|
ERROR_CASE(WSANOTINITIALISED);
|
|
ERROR_CASE(WSAHOST_NOT_FOUND);
|
|
ERROR_CASE(WSATRY_AGAIN);
|
|
ERROR_CASE(WSANO_RECOVERY);
|
|
ERROR_CASE(WSANO_DATA);
|
|
|
|
default:
|
|
return "?";
|
|
}
|
|
}
|
|
|
|
void get_last_internet_error() {
|
|
|
|
DWORD buflen;
|
|
char buffer[256];
|
|
DWORD category;
|
|
|
|
buflen = sizeof(buffer);
|
|
if (InternetGetLastResponseInfo(&category, buffer, &buflen)) {
|
|
print_response(buffer, buflen, FALSE);
|
|
} else {
|
|
|
|
DWORD error;
|
|
|
|
error = GetLastError();
|
|
if (Verbose || (error != ERROR_INSUFFICIENT_BUFFER)) {
|
|
printf(get_error_string(error), error, buflen);
|
|
}
|
|
if (error == ERROR_INSUFFICIENT_BUFFER) {
|
|
|
|
LPSTR errbuf;
|
|
|
|
if ((errbuf = malloc(buflen)) != NULL) {
|
|
if (InternetGetLastResponseInfo(&category, errbuf, &buflen)) {
|
|
print_response(errbuf, buflen, FALSE);
|
|
} else {
|
|
error = GetLastError();
|
|
printf(get_error_string(GetLastError()), error, buflen);
|
|
}
|
|
free(errbuf);
|
|
} else {
|
|
printf("error: get_last_internet_error: malloc(%d) failed\n", buflen);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
LPSTR get_error_string(DWORD error) {
|
|
|
|
static LPSTR errText_1 = "error: get_last_internet_error: InternetGetLastResponseInfo() returns error %d (buflen = %d)\n";
|
|
static LPSTR errText_2 = "error: get_last_internet_error: InternetGetLastResponseInfo() returns error %d\n";
|
|
|
|
return (error == ERROR_INSUFFICIENT_BUFFER) ? errText_1 : errText_2;
|
|
}
|
|
|
|
void print_response(LPSTR buffer, DWORD buflen, BOOL isMessage) {
|
|
if (Verbose || !isMessage) {
|
|
printf("InternetGetLastResponseInfo() returns %d bytes\n", buflen);
|
|
}
|
|
if (buflen != 0) {
|
|
if (isMessage) {
|
|
|
|
int mode;
|
|
|
|
mode = _setmode(1, _O_BINARY);
|
|
_write(1, buffer, buflen);
|
|
_setmode(1, mode);
|
|
} else {
|
|
printf("Text = \"%s\"\n", buffer);
|
|
}
|
|
}
|
|
if (strlen(buffer) != buflen) {
|
|
alert();
|
|
printf("error: print_response: InternetGetLastResponseInfo(): buflen = %d; strlen(buffer) = %d\n",
|
|
buflen,
|
|
strlen(buffer)
|
|
);
|
|
}
|
|
}
|
|
|
|
void alert() {
|
|
if (!NoAlerts) {
|
|
putchar('\a');
|
|
}
|
|
}
|