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.
 
 
 
 
 
 

340 lines
9.2 KiB

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
thh.c
Abstract:
Test program for handle hierarchy
Author:
Richard L Firth (rfirth) 12-Jan-1996
Revision History:
12-Jan-1996 rfirth
Created
--*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wininet.h>
#include <catlib.h>
#ifndef _CRTAPI1
#define _CRTAPI1
#endif
#define OPEN_CONTEXT_VALUE 0x11
#define CONNECT_CONTEXT_VALUE 0x22
#define IS_ARG(c) (((c) == '-') || ((c) == '/'))
void _CRTAPI1 main(int, char**);
void usage(void);
void my_callback(HINTERNET, DWORD, DWORD, LPVOID, DWORD);
BOOL Verbose = FALSE;
DWORD AsyncResult;
DWORD AsyncError;
void _CRTAPI1 main(int argc, char** argv) {
HINTERNET hInternet;
HINTERNET hConnect;
HINTERNET hRequest;
BOOL callbacks = FALSE;
INTERNET_STATUS_CALLBACK cbres;
for (--argc, ++argv; argc; --argc, ++argv) {
if (IS_ARG(**argv)) {
switch (*++*argv) {
case 'c':
callbacks = TRUE;
break;
case 'v':
Verbose = TRUE;
break;
default:
printf("error: unrecognized command line flag: '%c'\n", **argv);
usage();
break;
}
} else {
printf("error: unrecognized command line argument: \"%s\"\n", *argv);
usage();
}
}
hInternet = InternetOpen("Handle Hierarchy Test Program (thh)",
LOCAL_INTERNET_ACCESS,
NULL,
0,
0
);
if (!hInternet) {
print_error("thh()", "InternetOpen()");
exit(1);
}
if (Verbose) {
printf("InternetOpen() returns handle %x\n", hInternet);
}
if (callbacks) {
if (Verbose) {
printf("installing callback\n");
}
cbres = InternetSetStatusCallback(hInternet, my_callback);
if (cbres == INTERNET_INVALID_STATUS_CALLBACK) {
print_error("thh()", "InternetSetStatusCallback()");
exit(1);
} else if (Verbose) {
printf("previous callback = %x\n", cbres);
}
}
if (Verbose) {
printf("calling InternetConnect()...\n");
}
hConnect = InternetConnect(hInternet,
"foo.bar.com",
0,
"albert einstein",
"e=mc2",
INTERNET_SERVICE_HTTP,
0,
callbacks ? CONNECT_CONTEXT_VALUE : 0
);
if (!hInternet) {
print_error("thh()", "InternetConnect()");
exit(1);
} else if (Verbose) {
printf("InternetConnect() returns handle %x\n", hConnect);
}
if (Verbose) {
printf("calling HttpOpenRequest()...\n");
}
hRequest = HttpOpenRequest(hConnect,
NULL, // verb
NULL, // object
NULL, // version
NULL, // referrer
NULL, // accept types
0, // flags
callbacks ? OPEN_CONTEXT_VALUE : 0
);
if (!hRequest) {
print_error("thh()", "HttpOpenRequest()");
exit(1);
} else if (Verbose) {
printf("HttpOpenRequest() returns handle %x\n", hRequest);
}
if (Verbose) {
printf("closing InternetOpen() handle %x\n", hInternet);
}
if (InternetCloseHandle(hInternet)) {
if (Verbose) {
printf("closed Internet handle %x OK\n", hInternet);
}
} else {
print_error("thh()", "InternetCloseHandle()");
exit(1);
}
printf("Done.\n");
exit(0);
}
void usage() {
printf("usage: thh [-c] [-v]\n"
"where: -c = use callbacks\n"
" -v = verbose mode\n"
);
exit(1);
}
VOID
my_callback(
HINTERNET Handle,
DWORD Context,
DWORD Status,
LPVOID Info,
DWORD Length
)
{
char* type$;
switch (Status) {
case INTERNET_STATUS_RESOLVING_NAME:
type$ = "RESOLVING NAME";
break;
case INTERNET_STATUS_NAME_RESOLVED:
type$ = "NAME RESOLVED";
break;
case INTERNET_STATUS_CONNECTING_TO_SERVER:
type$ = "CONNECTING TO SERVER";
break;
case INTERNET_STATUS_CONNECTED_TO_SERVER:
type$ = "CONNECTED TO SERVER";
break;
case INTERNET_STATUS_SENDING_REQUEST:
type$ = "SENDING REQUEST";
break;
case INTERNET_STATUS_REQUEST_SENT:
type$ = "REQUEST SENT";
break;
case INTERNET_STATUS_RECEIVING_RESPONSE:
type$ = "RECEIVING RESPONSE";
break;
case INTERNET_STATUS_RESPONSE_RECEIVED:
type$ = "RESPONSE RECEIVED";
break;
case INTERNET_STATUS_CLOSING_CONNECTION:
type$ = "CLOSING CONNECTION";
break;
case INTERNET_STATUS_CONNECTION_CLOSED:
type$ = "CONNECTION CLOSED";
break;
case INTERNET_STATUS_HANDLE_CREATED:
type$ = "HANDLE CREATED";
break;
case INTERNET_STATUS_HANDLE_CLOSING:
type$ = "HANDLE CLOSING";
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
type$ = "REQUEST COMPLETE";
AsyncResult = ((LPINTERNET_ASYNC_RESULT)Info)->dwResult;
AsyncError = ((LPINTERNET_ASYNC_RESULT)Info)->dwError;
break;
default:
type$ = "???";
break;
}
if (Verbose) {
printf("callback: H=%x [C=%x [%s]] %s ",
Handle,
Context,
(Context == CONNECT_CONTEXT_VALUE)
? "Connect"
: (Context == OPEN_CONTEXT_VALUE)
? "Open "
: "???",
type$
);
if (Info) {
if ((Status == INTERNET_STATUS_HANDLE_CREATED)
|| (Status == INTERNET_STATUS_HANDLE_CLOSING)) {
DWORD handleType;
DWORD handleTypeSize = sizeof(handleType);
if (InternetQueryOption(*(LPHINTERNET)Info,
INTERNET_OPTION_HANDLE_TYPE,
(LPVOID)&handleType,
&handleTypeSize
)) {
switch (handleType) {
case INTERNET_HANDLE_TYPE_INTERNET:
type$ = "Internet";
break;
case INTERNET_HANDLE_TYPE_CONNECT_FTP:
type$ = "FTP Connect";
break;
case INTERNET_HANDLE_TYPE_CONNECT_GOPHER:
type$ = "Gopher Connect";
break;
case INTERNET_HANDLE_TYPE_CONNECT_HTTP:
type$ = "HTTP Connect";
break;
case INTERNET_HANDLE_TYPE_FTP_FIND:
type$ = "FTP Find";
break;
case INTERNET_HANDLE_TYPE_FTP_FIND_HTML:
type$ = "FTP Find HTML";
break;
case INTERNET_HANDLE_TYPE_FTP_FILE:
type$ = "FTP File";
break;
case INTERNET_HANDLE_TYPE_FTP_FILE_HTML:
type$ = "FTP File HTML";
break;
case INTERNET_HANDLE_TYPE_GOPHER_FIND:
type$ = "Gopher Find";
break;
case INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML:
type$ = "Gopher Find HTML";
break;
case INTERNET_HANDLE_TYPE_GOPHER_FILE:
type$ = "Gopher File";
break;
case INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML:
type$ = "Gopher File HTML";
break;
case INTERNET_HANDLE_TYPE_HTTP_REQUEST:
type$ = "HTTP Request";
break;
default:
type$ = "???";
break;
}
} else {
type$ = "<error>";
}
printf("%x [%s]", *(LPHINTERNET)Info, type$);
} else if (Status == INTERNET_STATUS_REQUEST_COMPLETE) {
//
// nothing
//
} else if (Length == sizeof(DWORD)) {
printf("%d", *(LPDWORD)Info);
} else {
printf(Info);
}
}
putchar('\n');
}
}