Windows NT 4.0 source code leak
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

/*++
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');
}
}