home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / C++ / FreeCommandLineTools.exe / Include / wininet.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-31  |  117.2 KB  |  3,772 lines

  1. /*++
  2.  
  3. Copyright (c) 1995-1999  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     wininet.h
  8.  
  9. Abstract:
  10.  
  11.     Contains manifests, macros, types and prototypes for Microsoft Windows
  12.     Internet Extensions
  13.  
  14. --*/
  15.  
  16.  
  17. #if !defined(_WININET_)
  18. #pragma option push -b -a8 -pc -A- /*P_O_Push*/
  19. #define _WININET_
  20.  
  21.  
  22. /*
  23.  * Set up Structure Packing to be 4 bytes
  24.  * for all wininet structures
  25.  */
  26. #include <pshpack4.h>
  27.  
  28.  
  29.  
  30. #if defined(__cplusplus)
  31. extern "C" {
  32. #endif
  33.  
  34.  
  35. #if !defined(_WINX32_)
  36. #define INTERNETAPI DECLSPEC_IMPORT
  37. #define URLCACHEAPI DECLSPEC_IMPORT
  38. #else
  39. #define INTERNETAPI
  40. #define URLCACHEAPI
  41. #endif
  42.  
  43. #define BOOLAPI INTERNETAPI BOOL WINAPI
  44.  
  45. //
  46. // internet types
  47. //
  48.  
  49. typedef LPVOID HINTERNET;
  50. typedef HINTERNET * LPHINTERNET;
  51.  
  52. typedef WORD INTERNET_PORT;
  53. typedef INTERNET_PORT * LPINTERNET_PORT;
  54.  
  55. //
  56. // Internet APIs
  57. //
  58.  
  59. //
  60. // manifests
  61. //
  62.  
  63. #define INTERNET_INVALID_PORT_NUMBER    0           // use the protocol-specific default
  64.  
  65. #define INTERNET_DEFAULT_FTP_PORT       21          // default for FTP servers
  66. #define INTERNET_DEFAULT_GOPHER_PORT    70          //    "     "  gopher "
  67. #define INTERNET_DEFAULT_HTTP_PORT      80          //    "     "  HTTP   "
  68. #define INTERNET_DEFAULT_HTTPS_PORT     443         //    "     "  HTTPS  "
  69. #define INTERNET_DEFAULT_SOCKS_PORT     1080        // default for SOCKS firewall servers.
  70.  
  71.  
  72. //
  73. // maximum field lengths (arbitrary)
  74. //
  75.  
  76. #define INTERNET_MAX_HOST_NAME_LENGTH   256
  77. #define INTERNET_MAX_USER_NAME_LENGTH   128
  78. #define INTERNET_MAX_PASSWORD_LENGTH    128
  79. #define INTERNET_MAX_PORT_NUMBER_LENGTH 5           // INTERNET_PORT is unsigned short
  80. #define INTERNET_MAX_PORT_NUMBER_VALUE  65535       // maximum unsigned short value
  81. #define INTERNET_MAX_PATH_LENGTH        2048
  82. #define INTERNET_MAX_SCHEME_LENGTH      32          // longest protocol name length
  83. #define INTERNET_MAX_URL_LENGTH         (INTERNET_MAX_SCHEME_LENGTH \
  84.                                         + sizeof("://") \
  85.                                         + INTERNET_MAX_PATH_LENGTH)
  86.  
  87. //
  88. // values returned by InternetQueryOption() with INTERNET_OPTION_KEEP_CONNECTION:
  89. //
  90.  
  91. #define INTERNET_KEEP_ALIVE_UNKNOWN     ((DWORD)-1)
  92. #define INTERNET_KEEP_ALIVE_ENABLED     1
  93. #define INTERNET_KEEP_ALIVE_DISABLED    0
  94.  
  95. //
  96. // flags returned by InternetQueryOption() with INTERNET_OPTION_REQUEST_FLAGS
  97. //
  98.  
  99. #define INTERNET_REQFLAG_FROM_CACHE     0x00000001  // response came from cache
  100. #define INTERNET_REQFLAG_ASYNC          0x00000002  // request was made asynchronously
  101. #define INTERNET_REQFLAG_VIA_PROXY      0x00000004  // request was made via a proxy
  102. #define INTERNET_REQFLAG_NO_HEADERS     0x00000008  // orginal response contained no headers
  103. #define INTERNET_REQFLAG_PASSIVE        0x00000010  // FTP: passive-mode connection
  104. #define INTERNET_REQFLAG_CACHE_WRITE_DISABLED 0x00000040  // HTTPS: this request not cacheable
  105. #define INTERNET_REQFLAG_NET_TIMEOUT    0x00000080  // w/ _FROM_CACHE: net request timed out
  106.  
  107. //
  108. // flags common to open functions (not InternetOpen()):
  109. //
  110.  
  111. #define INTERNET_FLAG_RELOAD            0x80000000  // retrieve the original item
  112.  
  113. //
  114. // flags for InternetOpenUrl():
  115. //
  116.  
  117. #define INTERNET_FLAG_RAW_DATA          0x40000000  // FTP/gopher find: receive the item as raw (structured) data
  118. #define INTERNET_FLAG_EXISTING_CONNECT  0x20000000  // FTP: use existing InternetConnect handle for server if possible
  119.  
  120. //
  121. // flags for InternetOpen():
  122. //
  123.  
  124. #define INTERNET_FLAG_ASYNC             0x10000000  // this request is asynchronous (where supported)
  125.  
  126. //
  127. // protocol-specific flags:
  128. //
  129.  
  130. #define INTERNET_FLAG_PASSIVE           0x08000000  // used for FTP connections
  131.  
  132. //
  133. // additional cache flags
  134. //
  135.  
  136. #define INTERNET_FLAG_NO_CACHE_WRITE    0x04000000  // don't write this item to the cache
  137. #define INTERNET_FLAG_DONT_CACHE        INTERNET_FLAG_NO_CACHE_WRITE
  138. #define INTERNET_FLAG_MAKE_PERSISTENT   0x02000000  // make this item persistent in cache
  139. #define INTERNET_FLAG_FROM_CACHE        0x01000000  // use offline semantics
  140. #define INTERNET_FLAG_OFFLINE           INTERNET_FLAG_FROM_CACHE
  141.  
  142. //
  143. // additional flags
  144. //
  145.  
  146. #define INTERNET_FLAG_SECURE            0x00800000  // use PCT/SSL if applicable (HTTP)
  147. #define INTERNET_FLAG_KEEP_CONNECTION   0x00400000  // use keep-alive semantics
  148. #define INTERNET_FLAG_NO_AUTO_REDIRECT  0x00200000  // don't handle redirections automatically
  149. #define INTERNET_FLAG_READ_PREFETCH     0x00100000  // do background read prefetch
  150. #define INTERNET_FLAG_NO_COOKIES        0x00080000  // no automatic cookie handling
  151. #define INTERNET_FLAG_NO_AUTH           0x00040000  // no automatic authentication handling
  152. #define INTERNET_FLAG_CACHE_IF_NET_FAIL 0x00010000  // return cache file if net request fails
  153.  
  154. //
  155. // Security Ignore Flags, Allow HttpOpenRequest to overide
  156. //  Secure Channel (SSL/PCT) failures of the following types.
  157. //
  158.  
  159. #define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP   0x00008000 // ex: https:// to http://
  160. #define INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS  0x00004000 // ex: http:// to https://
  161. #define INTERNET_FLAG_IGNORE_CERT_DATE_INVALID  0x00002000 // expired X509 Cert.
  162. #define INTERNET_FLAG_IGNORE_CERT_CN_INVALID    0x00001000 // bad common name in X509 Cert.
  163.  
  164. //
  165. // more caching flags
  166. //
  167.  
  168. #define INTERNET_FLAG_RESYNCHRONIZE     0x00000800  // asking wininet to update an item if it is newer
  169. #define INTERNET_FLAG_HYPERLINK         0x00000400  // asking wininet to do hyperlinking semantic which works right for scripts
  170. #define INTERNET_FLAG_NO_UI             0x00000200  // no cookie popup
  171. #define INTERNET_FLAG_PRAGMA_NOCACHE    0x00000100  // asking wininet to add "pragma: no-cache"
  172. #define INTERNET_FLAG_CACHE_ASYNC       0x00000080  // ok to perform lazy cache-write
  173. #define INTERNET_FLAG_FORMS_SUBMIT      0x00000040  // this is a forms submit
  174. #define INTERNET_FLAG_FWD_BACK          0x00000020  // fwd-back button op
  175. #define INTERNET_FLAG_NEED_FILE         0x00000010  // need a file for this request
  176. #define INTERNET_FLAG_MUST_CACHE_REQUEST INTERNET_FLAG_NEED_FILE
  177.  
  178. //
  179. // flags for FTP
  180. //
  181.  
  182. #define INTERNET_FLAG_TRANSFER_ASCII    FTP_TRANSFER_TYPE_ASCII     // 0x00000001
  183. #define INTERNET_FLAG_TRANSFER_BINARY   FTP_TRANSFER_TYPE_BINARY    // 0x00000002
  184.  
  185. //
  186. // flags field masks
  187. //
  188.  
  189. #define SECURITY_INTERNET_MASK  (INTERNET_FLAG_IGNORE_CERT_CN_INVALID    |  \
  190.                                  INTERNET_FLAG_IGNORE_CERT_DATE_INVALID  |  \
  191.                                  INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS  |  \
  192.                                  INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP   )
  193.  
  194. #define INTERNET_FLAGS_MASK     (INTERNET_FLAG_RELOAD               \
  195.                                 | INTERNET_FLAG_RAW_DATA            \
  196.                                 | INTERNET_FLAG_EXISTING_CONNECT    \
  197.                                 | INTERNET_FLAG_ASYNC               \
  198.                                 | INTERNET_FLAG_PASSIVE             \
  199.                                 | INTERNET_FLAG_NO_CACHE_WRITE      \
  200.                                 | INTERNET_FLAG_MAKE_PERSISTENT     \
  201.                                 | INTERNET_FLAG_FROM_CACHE          \
  202.                                 | INTERNET_FLAG_SECURE              \
  203.                                 | INTERNET_FLAG_KEEP_CONNECTION     \
  204.                                 | INTERNET_FLAG_NO_AUTO_REDIRECT    \
  205.                                 | INTERNET_FLAG_READ_PREFETCH       \
  206.                                 | INTERNET_FLAG_NO_COOKIES          \
  207.                                 | INTERNET_FLAG_NO_AUTH             \
  208.                                 | INTERNET_FLAG_CACHE_IF_NET_FAIL   \
  209.                                 | SECURITY_INTERNET_MASK            \
  210.                                 | INTERNET_FLAG_RESYNCHRONIZE       \
  211.                                 | INTERNET_FLAG_HYPERLINK           \
  212.                                 | INTERNET_FLAG_NO_UI               \
  213.                                 | INTERNET_FLAG_PRAGMA_NOCACHE      \
  214.                                 | INTERNET_FLAG_CACHE_ASYNC         \
  215.                                 | INTERNET_FLAG_FORMS_SUBMIT        \
  216.                                 | INTERNET_FLAG_NEED_FILE           \
  217.                                 | INTERNET_FLAG_TRANSFER_BINARY     \
  218.                                 | INTERNET_FLAG_TRANSFER_ASCII      \
  219.                                 | INTERNET_FLAG_FWD_BACK            \
  220.                                 | INTERNET_FLAG_BGUPDATE            \
  221.                                 )
  222.  
  223. #define INTERNET_ERROR_MASK_INSERT_CDROM                    0x1
  224. #define INTERNET_ERROR_MASK_COMBINED_SEC_CERT               0x2
  225. #define INTERNET_ERROR_MASK_NEED_MSN_SSPI_PKG               0X4
  226. #define INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY 0x8
  227.  
  228. #define INTERNET_OPTIONS_MASK   (~INTERNET_FLAGS_MASK)
  229.  
  230. //
  231. // common per-API flags (new APIs)
  232. //
  233.  
  234. #define WININET_API_FLAG_ASYNC          0x00000001  // force async operation
  235. #define WININET_API_FLAG_SYNC           0x00000004  // force sync operation
  236. #define WININET_API_FLAG_USE_CONTEXT    0x00000008  // use value supplied in dwContext (even if 0)
  237.  
  238. //
  239. // INTERNET_NO_CALLBACK - if this value is presented as the dwContext parameter
  240. // then no call-backs will be made for that API
  241. //
  242.  
  243. #define INTERNET_NO_CALLBACK            0
  244.  
  245. //
  246. // structures/types
  247. //
  248.  
  249. //
  250. // INTERNET_SCHEME - enumerated URL scheme type
  251. //
  252.  
  253. typedef enum {
  254.     INTERNET_SCHEME_PARTIAL = -2,
  255.     INTERNET_SCHEME_UNKNOWN = -1,
  256.     INTERNET_SCHEME_DEFAULT = 0,
  257.     INTERNET_SCHEME_FTP,
  258.     INTERNET_SCHEME_GOPHER,
  259.     INTERNET_SCHEME_HTTP,
  260.     INTERNET_SCHEME_HTTPS,
  261.     INTERNET_SCHEME_FILE,
  262.     INTERNET_SCHEME_NEWS,
  263.     INTERNET_SCHEME_MAILTO,
  264.     INTERNET_SCHEME_SOCKS,
  265.     INTERNET_SCHEME_JAVASCRIPT,
  266.     INTERNET_SCHEME_VBSCRIPT,
  267.     INTERNET_SCHEME_FIRST = INTERNET_SCHEME_FTP,
  268.     INTERNET_SCHEME_LAST = INTERNET_SCHEME_VBSCRIPT
  269. } INTERNET_SCHEME, * LPINTERNET_SCHEME;
  270.  
  271. //
  272. // INTERNET_ASYNC_RESULT - this structure is returned to the application via
  273. // the callback with INTERNET_STATUS_REQUEST_COMPLETE. It is not sufficient to
  274. // just return the result of the async operation. If the API failed then the
  275. // app cannot call GetLastError() because the thread context will be incorrect.
  276. // Both the value returned by the async API and any resultant error code are
  277. // made available. The app need not check dwError if dwResult indicates that
  278. // the API succeeded (in this case dwError will be ERROR_SUCCESS)
  279. //
  280.  
  281. typedef struct {
  282.  
  283.     //
  284.     // dwResult - the HINTERNET, DWORD or BOOL return code from an async API
  285.     //
  286.  
  287.     DWORD dwResult;
  288.  
  289.     //
  290.     // dwError - the error code if the API failed
  291.     //
  292.  
  293.     DWORD dwError;
  294. } INTERNET_ASYNC_RESULT, * LPINTERNET_ASYNC_RESULT;
  295.  
  296.  
  297. //
  298. // INTERNET_PROXY_INFO - structure supplied with INTERNET_OPTION_PROXY to get/
  299. // set proxy information on a InternetOpen() handle
  300. //
  301.  
  302. typedef struct {
  303.  
  304.     //
  305.     // dwAccessType - INTERNET_OPEN_TYPE_DIRECT, INTERNET_OPEN_TYPE_PROXY, or
  306.     // INTERNET_OPEN_TYPE_PRECONFIG (set only)
  307.     //
  308.  
  309.     DWORD dwAccessType;
  310.  
  311.     //
  312.     // lpszProxy - proxy server list
  313.     //
  314.  
  315.     LPCTSTR lpszProxy;
  316.  
  317.     //
  318.     // lpszProxyBypass - proxy bypass list
  319.     //
  320.  
  321.     LPCTSTR lpszProxyBypass;
  322. } INTERNET_PROXY_INFO, * LPINTERNET_PROXY_INFO;
  323.  
  324. //
  325. // INTERNET_PER_CONN_OPTION_LIST - set per-connection options such as proxy
  326. // and autoconfig info
  327. //
  328. // Set and queried using Internet[Set|Query]Option with 
  329. // INTERNET_OPTION_PER_CONNECTION_OPTION
  330. //
  331.  
  332. typedef struct {
  333.     DWORD   dwOption;            // option to be queried or set
  334.     union {                     
  335.         DWORD    dwValue;        // dword value for the option 
  336.         LPSTR    pszValue;       // pointer to string value for the option         
  337.         FILETIME ftValue;        // file-time value for the option
  338.     } Value;    
  339. } INTERNET_PER_CONN_OPTIONA, * LPINTERNET_PER_CONN_OPTIONA;
  340. typedef struct {
  341.     DWORD   dwOption;            // option to be queried or set
  342.     union {                     
  343.         DWORD    dwValue;        // dword value for the option 
  344.         LPWSTR   pszValue;       // pointer to string value for the option         
  345.         FILETIME ftValue;        // file-time value for the option
  346.     } Value;    
  347. } INTERNET_PER_CONN_OPTIONW, * LPINTERNET_PER_CONN_OPTIONW;
  348. #ifdef UNICODE
  349. typedef INTERNET_PER_CONN_OPTIONW INTERNET_PER_CONN_OPTION;
  350. typedef LPINTERNET_PER_CONN_OPTIONW LPINTERNET_PER_CONN_OPTION;
  351. #else
  352. typedef INTERNET_PER_CONN_OPTIONA INTERNET_PER_CONN_OPTION;
  353. typedef LPINTERNET_PER_CONN_OPTIONA LPINTERNET_PER_CONN_OPTION;
  354. #endif // UNICODE
  355.  
  356. typedef struct {
  357.     DWORD   dwSize;             // size of the INTERNET_PER_CONN_OPTION_LIST struct 
  358.     LPSTR   pszConnection;      // connection name to set/query options 
  359.     DWORD   dwOptionCount;      // number of options to set/query 
  360.     DWORD   dwOptionError;      // on error, which option failed 
  361.     LPINTERNET_PER_CONN_OPTIONA  pOptions;
  362.                                 // array of options to set/query 
  363. } INTERNET_PER_CONN_OPTION_LISTA, * LPINTERNET_PER_CONN_OPTION_LISTA;
  364. typedef struct {
  365.     DWORD   dwSize;             // size of the INTERNET_PER_CONN_OPTION_LIST struct 
  366.     LPWSTR  pszConnection;      // connection name to set/query options 
  367.     DWORD   dwOptionCount;      // number of options to set/query 
  368.     DWORD   dwOptionError;      // on error, which option failed 
  369.     LPINTERNET_PER_CONN_OPTIONW  pOptions;
  370.                                 // array of options to set/query 
  371. } INTERNET_PER_CONN_OPTION_LISTW, * LPINTERNET_PER_CONN_OPTION_LISTW;
  372. #ifdef UNICODE
  373. typedef INTERNET_PER_CONN_OPTION_LISTW INTERNET_PER_CONN_OPTION_LIST;
  374. typedef LPINTERNET_PER_CONN_OPTION_LISTW LPINTERNET_PER_CONN_OPTION_LIST;
  375. #else
  376. typedef INTERNET_PER_CONN_OPTION_LISTA INTERNET_PER_CONN_OPTION_LIST;
  377. typedef LPINTERNET_PER_CONN_OPTION_LISTA LPINTERNET_PER_CONN_OPTION_LIST;
  378. #endif // UNICODE
  379.  
  380. //
  381. // Options used in INTERNET_PER_CONN_OPTON struct
  382. //
  383. #define INTERNET_PER_CONN_FLAGS                         1
  384. #define INTERNET_PER_CONN_PROXY_SERVER                  2
  385. #define INTERNET_PER_CONN_PROXY_BYPASS                  3
  386. #define INTERNET_PER_CONN_AUTOCONFIG_URL                4
  387. #define INTERNET_PER_CONN_AUTODISCOVERY_FLAGS           5
  388.  
  389. //
  390. // PER_CONN_FLAGS
  391. //
  392. #define PROXY_TYPE_DIRECT                               0x00000001   // direct to net
  393. #define PROXY_TYPE_PROXY                                0x00000002   // via named proxy
  394. #define PROXY_TYPE_AUTO_PROXY_URL                       0x00000004   // autoproxy URL
  395. #define PROXY_TYPE_AUTO_DETECT                          0x00000008   // use autoproxy detection
  396.  
  397. //
  398. // PER_CONN_AUTODISCOVERY_FLAGS
  399. //
  400. #define AUTO_PROXY_FLAG_USER_SET                        0x00000001   // user changed this setting
  401. #define AUTO_PROXY_FLAG_ALWAYS_DETECT                   0x00000002   // force detection even when its not needed
  402. #define AUTO_PROXY_FLAG_DETECTION_RUN                   0x00000004   // detection has been run
  403. #define AUTO_PROXY_FLAG_MIGRATED                        0x00000008   // migration has just been done 
  404. #define AUTO_PROXY_FLAG_DONT_CACHE_PROXY_RESULT         0x00000010   // don't cache result of host=proxy name
  405. #define AUTO_PROXY_FLAG_CACHE_INIT_RUN                  0x00000020   // don't initalize and run unless URL expired
  406. #define AUTO_PROXY_FLAG_DETECTION_SUSPECT               0x00000040   // if we're on a LAN & Modem, with only one IP, bad?!?
  407.  
  408. //
  409. // INTERNET_VERSION_INFO - version information returned via
  410. // InternetQueryOption(..., INTERNET_OPTION_VERSION, ...)
  411. //
  412.  
  413. typedef struct {
  414.     DWORD dwMajorVersion;
  415.     DWORD dwMinorVersion;
  416. } INTERNET_VERSION_INFO, * LPINTERNET_VERSION_INFO;
  417.  
  418. //
  419. // HTTP_VERSION_INFO - query or set global HTTP version (1.0 or 1.1)
  420. //
  421.  
  422. typedef struct {
  423.     DWORD dwMajorVersion;
  424.     DWORD dwMinorVersion;
  425. } HTTP_VERSION_INFO, * LPHTTP_VERSION_INFO;
  426.  
  427. //
  428. // INTERNET_CONNECTED_INFO - information used to set the global connected state
  429. //
  430.  
  431. typedef struct {
  432.  
  433.     //
  434.     // dwConnectedState - new connected/disconnected state.
  435.     // See INTERNET_STATE_CONNECTED, etc.
  436.     //
  437.  
  438.     DWORD dwConnectedState;
  439.  
  440.     //
  441.     // dwFlags - flags controlling connected->disconnected (or disconnected->
  442.     // connected) transition. See below
  443.     //
  444.  
  445.     DWORD dwFlags;
  446. } INTERNET_CONNECTED_INFO, * LPINTERNET_CONNECTED_INFO;
  447.  
  448.  
  449. //
  450. // flags for INTERNET_CONNECTED_INFO dwFlags
  451. //
  452.  
  453. //
  454. // ISO_FORCE_DISCONNECTED - if set when putting Wininet into disconnected mode,
  455. // all outstanding requests will be aborted with a cancelled error
  456. //
  457.  
  458. #define ISO_FORCE_DISCONNECTED  0x00000001
  459.  
  460.  
  461. //
  462. // URL_COMPONENTS - the constituent parts of an URL. Used in InternetCrackUrl()
  463. // and InternetCreateUrl()
  464. //
  465. // For InternetCrackUrl(), if a pointer field and its corresponding length field
  466. // are both 0 then that component is not returned. If the pointer field is NULL
  467. // but the length field is not zero, then both the pointer and length fields are
  468. // returned if both pointer and corresponding length fields are non-zero then
  469. // the pointer field points to a buffer where the component is copied. The
  470. // component may be un-escaped, depending on dwFlags
  471. //
  472. // For InternetCreateUrl(), the pointer fields should be NULL if the component
  473. // is not required. If the corresponding length field is zero then the pointer
  474. // field is the address of a zero-terminated string. If the length field is not
  475. // zero then it is the string length of the corresponding pointer field
  476. //
  477.  
  478. #pragma warning( disable : 4121 )   // disable alignment warning
  479.  
  480. typedef struct {
  481.     DWORD   dwStructSize;       // size of this structure. Used in version check
  482.     LPSTR   lpszScheme;         // pointer to scheme name
  483.     DWORD   dwSchemeLength;     // length of scheme name
  484.     INTERNET_SCHEME nScheme;    // enumerated scheme type (if known)
  485.     LPSTR   lpszHostName;       // pointer to host name
  486.     DWORD   dwHostNameLength;   // length of host name
  487.     INTERNET_PORT nPort;        // converted port number
  488.     LPSTR   lpszUserName;       // pointer to user name
  489.     DWORD   dwUserNameLength;   // length of user name
  490.     LPSTR   lpszPassword;       // pointer to password
  491.     DWORD   dwPasswordLength;   // length of password
  492.     LPSTR   lpszUrlPath;        // pointer to URL-path
  493.     DWORD   dwUrlPathLength;    // length of URL-path
  494.     LPSTR   lpszExtraInfo;      // pointer to extra information (e.g. ?foo or #foo)
  495.     DWORD   dwExtraInfoLength;  // length of extra information
  496. } URL_COMPONENTSA, * LPURL_COMPONENTSA;
  497. typedef struct {
  498.     DWORD   dwStructSize;       // size of this structure. Used in version check
  499.     LPWSTR  lpszScheme;         // pointer to scheme name
  500.     DWORD   dwSchemeLength;     // length of scheme name
  501.     INTERNET_SCHEME nScheme;    // enumerated scheme type (if known)
  502.     LPWSTR  lpszHostName;       // pointer to host name
  503.     DWORD   dwHostNameLength;   // length of host name
  504.     INTERNET_PORT nPort;        // converted port number
  505.     LPWSTR  lpszUserName;       // pointer to user name
  506.     DWORD   dwUserNameLength;   // length of user name
  507.     LPWSTR  lpszPassword;       // pointer to password
  508.     DWORD   dwPasswordLength;   // length of password
  509.     LPWSTR  lpszUrlPath;        // pointer to URL-path
  510.     DWORD   dwUrlPathLength;    // length of URL-path
  511.     LPWSTR  lpszExtraInfo;      // pointer to extra information (e.g. ?foo or #foo)
  512.     DWORD   dwExtraInfoLength;  // length of extra information
  513. } URL_COMPONENTSW, * LPURL_COMPONENTSW;
  514. #ifdef UNICODE
  515. typedef URL_COMPONENTSW URL_COMPONENTS;
  516. typedef LPURL_COMPONENTSW LPURL_COMPONENTS;
  517. #else
  518. typedef URL_COMPONENTSA URL_COMPONENTS;
  519. typedef LPURL_COMPONENTSA LPURL_COMPONENTS;
  520. #endif // UNICODE
  521.  
  522. #pragma warning( default : 4121 )   // restore alignment warning
  523.  
  524. //
  525. // INTERNET_CERTIFICATE_INFO lpBuffer - contains the certificate returned from
  526. // the server
  527. //
  528.  
  529. typedef struct {
  530.  
  531.     //
  532.     // ftExpiry - date the certificate expires.
  533.     //
  534.  
  535.     FILETIME ftExpiry;
  536.  
  537.     //
  538.     // ftStart - date the certificate becomes valid.
  539.     //
  540.  
  541.     FILETIME ftStart;
  542.  
  543.     //
  544.     // lpszSubjectInfo - the name of organization, site, and server
  545.     //   the cert. was issued for.
  546.     //
  547.  
  548.     LPTSTR lpszSubjectInfo;
  549.  
  550.     //
  551.     // lpszIssuerInfo - the name of orgainzation, site, and server
  552.     //   the cert was issues by.
  553.     //
  554.  
  555.     LPTSTR lpszIssuerInfo;
  556.  
  557.     //
  558.     // lpszProtocolName - the name of the protocol used to provide the secure
  559.     //   connection.
  560.     //
  561.  
  562.     LPTSTR lpszProtocolName;
  563.  
  564.     //
  565.     // lpszSignatureAlgName - the name of the algorithm used for signing
  566.     //  the certificate.
  567.     //
  568.  
  569.     LPTSTR lpszSignatureAlgName;
  570.  
  571.     //
  572.     // lpszEncryptionAlgName - the name of the algorithm used for
  573.     //  doing encryption over the secure channel (SSL/PCT) connection.
  574.     //
  575.  
  576.     LPTSTR lpszEncryptionAlgName;
  577.  
  578.     //
  579.     // dwKeySize - size of the key.
  580.     //
  581.  
  582.     DWORD dwKeySize;
  583.  
  584. } INTERNET_CERTIFICATE_INFO, * LPINTERNET_CERTIFICATE_INFO;
  585.  
  586.  
  587. //
  588. // INTERNET_BUFFERS - combines headers and data. May be chained for e.g. file
  589. // upload or scatter/gather operations. For chunked read/write, lpcszHeader
  590. // contains the chunked-ext
  591. //
  592.  
  593. typedef struct _INTERNET_BUFFERSA {
  594.     DWORD dwStructSize;                 // used for API versioning. Set to sizeof(INTERNET_BUFFERS)
  595.     struct _INTERNET_BUFFERSA * Next;   // chain of buffers
  596.     LPCSTR   lpcszHeader;               // pointer to headers (may be NULL)
  597.     DWORD dwHeadersLength;              // length of headers if not NULL
  598.     DWORD dwHeadersTotal;               // size of headers if not enough buffer
  599.     LPVOID lpvBuffer;                   // pointer to data buffer (may be NULL)
  600.     DWORD dwBufferLength;               // length of data buffer if not NULL
  601.     DWORD dwBufferTotal;                // total size of chunk, or content-length if not chunked
  602.     DWORD dwOffsetLow;                  // used for read-ranges (only used in HttpSendRequest2)
  603.     DWORD dwOffsetHigh;
  604. } INTERNET_BUFFERSA, * LPINTERNET_BUFFERSA;
  605. typedef struct _INTERNET_BUFFERSW {
  606.     DWORD dwStructSize;                 // used for API versioning. Set to sizeof(INTERNET_BUFFERS)
  607.     struct _INTERNET_BUFFERSW * Next;   // chain of buffers
  608.     LPCWSTR  lpcszHeader;               // pointer to headers (may be NULL)
  609.     DWORD dwHeadersLength;              // length of headers if not NULL
  610.     DWORD dwHeadersTotal;               // size of headers if not enough buffer
  611.     LPVOID lpvBuffer;                   // pointer to data buffer (may be NULL)
  612.     DWORD dwBufferLength;               // length of data buffer if not NULL
  613.     DWORD dwBufferTotal;                // total size of chunk, or content-length if not chunked
  614.     DWORD dwOffsetLow;                  // used for read-ranges (only used in HttpSendRequest2)
  615.     DWORD dwOffsetHigh;
  616. } INTERNET_BUFFERSW, * LPINTERNET_BUFFERSW;
  617. #ifdef UNICODE
  618. typedef INTERNET_BUFFERSW INTERNET_BUFFERS;
  619. typedef LPINTERNET_BUFFERSW LPINTERNET_BUFFERS;
  620. #else
  621. typedef INTERNET_BUFFERSA INTERNET_BUFFERS;
  622. typedef LPINTERNET_BUFFERSA LPINTERNET_BUFFERS;
  623. #endif // UNICODE
  624.  
  625. //
  626. // prototypes
  627. //
  628.  
  629. BOOLAPI
  630. InternetTimeFromSystemTimeA(
  631.     IN  CONST SYSTEMTIME *pst,  // input GMT time
  632.     IN  DWORD dwRFC,            // RFC format
  633.     OUT LPSTR lpszTime,         // output string buffer
  634.     IN  DWORD cbTime            // output buffer size
  635.     );
  636.  
  637. BOOLAPI
  638. InternetTimeFromSystemTimeW(
  639.     IN  CONST SYSTEMTIME *pst,  // input GMT time
  640.     IN  DWORD dwRFC,            // RFC format
  641.     OUT LPWSTR lpszTime,        // output string buffer
  642.     IN  DWORD cbTime            // output buffer size
  643.     );
  644.  
  645. #ifdef UNICODE
  646. #define InternetTimeFromSystemTime  InternetTimeFromSystemTimeW
  647. #else
  648. #ifdef _WINX32_
  649. #define InternetTimeFromSystemTime  InternetTimeFromSystemTimeA
  650. #else
  651. BOOLAPI
  652. InternetTimeFromSystemTime(
  653.     IN  CONST SYSTEMTIME *pst,  // input GMT time
  654.     IN  DWORD dwRFC,            // RFC format
  655.     OUT LPSTR lpszTime,         // output string buffer
  656.     IN  DWORD cbTime            // output buffer size
  657.     );
  658. #endif // _WINX32_
  659. #endif // !UNICODE
  660.  
  661. //
  662. // constants for InternetTimeFromSystemTime
  663. //
  664.  
  665. #define INTERNET_RFC1123_FORMAT     0
  666. #define INTERNET_RFC1123_BUFSIZE   30
  667.  
  668. BOOLAPI
  669. InternetTimeToSystemTimeA(
  670.     IN  LPCSTR lpszTime,         // NULL terminated string
  671.     OUT SYSTEMTIME *pst,         // output in GMT time
  672.     IN  DWORD dwReserved
  673.     );
  674.  
  675. BOOLAPI
  676. InternetTimeToSystemTimeW(
  677.     IN  LPCWSTR lpszTime,        // NULL terminated string
  678.     OUT SYSTEMTIME *pst,         // output in GMT time
  679.     IN  DWORD dwReserved
  680.     );
  681.  
  682. #ifdef UNICODE
  683. #define InternetTimeToSystemTime  InternetTimeToSystemTimeW
  684. #else
  685. #ifdef _WINX32_
  686. #define InternetTimeToSystemTime  InternetTimeToSystemTimeA
  687. #else
  688. BOOLAPI
  689. InternetTimeToSystemTime(
  690.     IN  LPCSTR lpszTime,         // NULL terminated string
  691.     OUT SYSTEMTIME *pst,         // output in GMT time
  692.     IN  DWORD dwReserved
  693.     );
  694. #endif // _WINX32_
  695. #endif // !UNICODE
  696.  
  697.  
  698. BOOLAPI
  699. InternetCrackUrlA(
  700.     IN LPCSTR lpszUrl,
  701.     IN DWORD dwUrlLength,
  702.     IN DWORD dwFlags,
  703.     IN OUT LPURL_COMPONENTSA lpUrlComponents
  704.     );
  705. BOOLAPI
  706. InternetCrackUrlW(
  707.     IN LPCWSTR lpszUrl,
  708.     IN DWORD dwUrlLength,
  709.     IN DWORD dwFlags,
  710.     IN OUT LPURL_COMPONENTSW lpUrlComponents
  711.     );
  712. #ifdef UNICODE
  713. #define InternetCrackUrl  InternetCrackUrlW
  714. #else
  715. #define InternetCrackUrl  InternetCrackUrlA
  716. #endif // !UNICODE
  717.  
  718. BOOLAPI
  719. InternetCreateUrlA(
  720.     IN LPURL_COMPONENTSA lpUrlComponents,
  721.     IN DWORD dwFlags,
  722.     OUT LPSTR lpszUrl,
  723.     IN OUT LPDWORD lpdwUrlLength
  724.     );
  725. BOOLAPI
  726. InternetCreateUrlW(
  727.     IN LPURL_COMPONENTSW lpUrlComponents,
  728.     IN DWORD dwFlags,
  729.     OUT LPWSTR lpszUrl,
  730.     IN OUT LPDWORD lpdwUrlLength
  731.     );
  732. #ifdef UNICODE
  733. #define InternetCreateUrl  InternetCreateUrlW
  734. #else
  735. #define InternetCreateUrl  InternetCreateUrlA
  736. #endif // !UNICODE
  737.  
  738. BOOLAPI
  739. InternetCanonicalizeUrlA(
  740.     IN LPCSTR lpszUrl,
  741.     OUT LPSTR lpszBuffer,
  742.     IN OUT LPDWORD lpdwBufferLength,
  743.     IN DWORD dwFlags
  744.     );
  745. BOOLAPI
  746. InternetCanonicalizeUrlW(
  747.     IN LPCWSTR lpszUrl,
  748.     OUT LPWSTR lpszBuffer,
  749.     IN OUT LPDWORD lpdwBufferLength,
  750.     IN DWORD dwFlags
  751.     );
  752. #ifdef UNICODE
  753. #define InternetCanonicalizeUrl  InternetCanonicalizeUrlW
  754. #else
  755. #define InternetCanonicalizeUrl  InternetCanonicalizeUrlA
  756. #endif // !UNICODE
  757.  
  758. BOOLAPI
  759. InternetCombineUrlA(
  760.     IN LPCSTR lpszBaseUrl,
  761.     IN LPCSTR lpszRelativeUrl,
  762.     OUT LPSTR lpszBuffer,
  763.     IN OUT LPDWORD lpdwBufferLength,
  764.     IN DWORD dwFlags
  765.     );
  766. BOOLAPI
  767. InternetCombineUrlW(
  768.     IN LPCWSTR lpszBaseUrl,
  769.     IN LPCWSTR lpszRelativeUrl,
  770.     OUT LPWSTR lpszBuffer,
  771.     IN OUT LPDWORD lpdwBufferLength,
  772.     IN DWORD dwFlags
  773.     );
  774. #ifdef UNICODE
  775. #define InternetCombineUrl  InternetCombineUrlW
  776. #else
  777. #define InternetCombineUrl  InternetCombineUrlA
  778. #endif // !UNICODE
  779.  
  780. //
  781. // flags for InternetCrackUrl() and InternetCreateUrl()
  782. //
  783.  
  784. #define ICU_ESCAPE      0x80000000  // (un)escape URL characters
  785. #define ICU_USERNAME    0x40000000  // use internal username & password
  786.  
  787. //
  788. // flags for InternetCanonicalizeUrl() and InternetCombineUrl()
  789. //
  790.  
  791. #define ICU_NO_ENCODE   0x20000000  // Don't convert unsafe characters to escape sequence
  792. #define ICU_DECODE      0x10000000  // Convert %XX escape sequences to characters
  793. #define ICU_NO_META     0x08000000  // Don't convert .. etc. meta path sequences
  794. #define ICU_ENCODE_SPACES_ONLY 0x04000000  // Encode spaces only
  795. #define ICU_BROWSER_MODE 0x02000000 // Special encode/decode rules for browser
  796. #define ICU_ENCODE_PERCENT      0x00001000      // Encode any percent (ASCII25)
  797.         // signs encountered, default is to not encode percent.
  798.  
  799. INTERNETAPI
  800. HINTERNET
  801. WINAPI
  802. InternetOpenA(
  803.     IN LPCSTR lpszAgent,
  804.     IN DWORD dwAccessType,
  805.     IN LPCSTR lpszProxy OPTIONAL,
  806.     IN LPCSTR lpszProxyBypass OPTIONAL,
  807.     IN DWORD dwFlags
  808.     );
  809. INTERNETAPI
  810. HINTERNET
  811. WINAPI
  812. InternetOpenW(
  813.     IN LPCWSTR lpszAgent,
  814.     IN DWORD dwAccessType,
  815.     IN LPCWSTR lpszProxy OPTIONAL,
  816.     IN LPCWSTR lpszProxyBypass OPTIONAL,
  817.     IN DWORD dwFlags
  818.     );
  819. #ifdef UNICODE
  820. #define InternetOpen  InternetOpenW
  821. #else
  822. #define InternetOpen  InternetOpenA
  823. #endif // !UNICODE
  824.  
  825. //
  826. // access types for InternetOpen()
  827. //
  828.  
  829. #define INTERNET_OPEN_TYPE_PRECONFIG                    0   // use registry configuration
  830. #define INTERNET_OPEN_TYPE_DIRECT                       1   // direct to net
  831. #define INTERNET_OPEN_TYPE_PROXY                        3   // via named proxy
  832. #define INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY  4   // prevent using java/script/INS
  833.  
  834. //
  835. // old names for access types
  836. //
  837.  
  838. #define PRE_CONFIG_INTERNET_ACCESS  INTERNET_OPEN_TYPE_PRECONFIG
  839. #define LOCAL_INTERNET_ACCESS       INTERNET_OPEN_TYPE_DIRECT
  840. #define CERN_PROXY_INTERNET_ACCESS  INTERNET_OPEN_TYPE_PROXY
  841.  
  842. BOOLAPI
  843. InternetCloseHandle(
  844.     IN HINTERNET hInternet
  845.     );
  846.  
  847. INTERNETAPI
  848. HINTERNET
  849. WINAPI
  850. InternetConnectA(
  851.     IN HINTERNET hInternet,
  852.     IN LPCSTR lpszServerName,
  853.     IN INTERNET_PORT nServerPort,
  854.     IN LPCSTR lpszUserName OPTIONAL,
  855.     IN LPCSTR lpszPassword OPTIONAL,
  856.     IN DWORD dwService,
  857.     IN DWORD dwFlags,
  858.     IN DWORD_PTR dwContext
  859.     );
  860. INTERNETAPI
  861. HINTERNET
  862. WINAPI
  863. InternetConnectW(
  864.     IN HINTERNET hInternet,
  865.     IN LPCWSTR lpszServerName,
  866.     IN INTERNET_PORT nServerPort,
  867.     IN LPCWSTR lpszUserName OPTIONAL,
  868.     IN LPCWSTR lpszPassword OPTIONAL,
  869.     IN DWORD dwService,
  870.     IN DWORD dwFlags,
  871.     IN DWORD_PTR dwContext
  872.     );
  873. #ifdef UNICODE
  874. #define InternetConnect  InternetConnectW
  875. #else
  876. #define InternetConnect  InternetConnectA
  877. #endif // !UNICODE
  878.  
  879. //
  880. // service types for InternetConnect()
  881. //
  882.  
  883. #define INTERNET_SERVICE_FTP    1
  884. #define INTERNET_SERVICE_GOPHER 2
  885. #define INTERNET_SERVICE_HTTP   3
  886.  
  887.  
  888. INTERNETAPI
  889. HINTERNET
  890. WINAPI
  891. InternetOpenUrlA(
  892.     IN HINTERNET hInternet,
  893.     IN LPCSTR lpszUrl,
  894.     IN LPCSTR lpszHeaders OPTIONAL,
  895.     IN DWORD dwHeadersLength,
  896.     IN DWORD dwFlags,
  897.     IN DWORD_PTR dwContext
  898.     );
  899. INTERNETAPI
  900. HINTERNET
  901. WINAPI
  902. InternetOpenUrlW(
  903.     IN HINTERNET hInternet,
  904.     IN LPCWSTR lpszUrl,
  905.     IN LPCWSTR lpszHeaders OPTIONAL,
  906.     IN DWORD dwHeadersLength,
  907.     IN DWORD dwFlags,
  908.     IN DWORD_PTR dwContext
  909.     );
  910. #ifdef UNICODE
  911. #define InternetOpenUrl  InternetOpenUrlW
  912. #else
  913. #define InternetOpenUrl  InternetOpenUrlA
  914. #endif // !UNICODE
  915.  
  916. BOOLAPI
  917. InternetReadFile(
  918.     IN HINTERNET hFile,
  919.     IN LPVOID lpBuffer,
  920.     IN DWORD dwNumberOfBytesToRead,
  921.     OUT LPDWORD lpdwNumberOfBytesRead
  922.     );
  923.  
  924. INTERNETAPI
  925. BOOL
  926. WINAPI
  927. InternetReadFileExA(
  928.     IN HINTERNET hFile,
  929.     OUT LPINTERNET_BUFFERSA lpBuffersOut,
  930.     IN DWORD dwFlags,
  931.     IN DWORD_PTR dwContext
  932.     );
  933. INTERNETAPI
  934. BOOL
  935. WINAPI
  936. InternetReadFileExW(
  937.     IN HINTERNET hFile,
  938.     OUT LPINTERNET_BUFFERSW lpBuffersOut,
  939.     IN DWORD dwFlags,
  940.     IN DWORD_PTR dwContext
  941.     );
  942. #ifdef UNICODE
  943. #define InternetReadFileEx  InternetReadFileExW
  944. #else
  945. #define InternetReadFileEx  InternetReadFileExA
  946. #endif // !UNICODE
  947.  
  948. //
  949. // flags for InternetReadFileEx()
  950. //
  951.  
  952. #define IRF_ASYNC       WININET_API_FLAG_ASYNC
  953. #define IRF_SYNC        WININET_API_FLAG_SYNC
  954. #define IRF_USE_CONTEXT WININET_API_FLAG_USE_CONTEXT
  955. #define IRF_NO_WAIT     0x00000008
  956.  
  957. INTERNETAPI
  958. DWORD
  959. WINAPI
  960. InternetSetFilePointer(
  961.     IN HINTERNET hFile,
  962.     IN LONG  lDistanceToMove,
  963.     IN PVOID pReserved,
  964.     IN DWORD dwMoveMethod,
  965.     IN DWORD_PTR dwContext
  966.     );
  967.  
  968. BOOLAPI
  969. InternetWriteFile(
  970.     IN HINTERNET hFile,
  971.     IN LPCVOID lpBuffer,
  972.     IN DWORD dwNumberOfBytesToWrite,
  973.     OUT LPDWORD lpdwNumberOfBytesWritten
  974.     );
  975.  
  976.  
  977. BOOLAPI
  978. InternetQueryDataAvailable(
  979.     IN HINTERNET hFile,
  980.     OUT LPDWORD lpdwNumberOfBytesAvailable OPTIONAL,
  981.     IN DWORD dwFlags,
  982.     IN DWORD_PTR dwContext
  983.     );
  984.  
  985. BOOLAPI
  986. InternetFindNextFileA(
  987.     IN HINTERNET hFind,
  988.     OUT LPVOID lpvFindData
  989.     );
  990. BOOLAPI
  991. InternetFindNextFileW(
  992.     IN HINTERNET hFind,
  993.     OUT LPVOID lpvFindData
  994.     );
  995. #ifdef UNICODE
  996. #define InternetFindNextFile  InternetFindNextFileW
  997. #else
  998. #define InternetFindNextFile  InternetFindNextFileA
  999. #endif // !UNICODE
  1000.  
  1001. BOOLAPI
  1002. InternetQueryOptionA(
  1003.     IN HINTERNET hInternet OPTIONAL,
  1004.     IN DWORD dwOption,
  1005.     OUT LPVOID lpBuffer OPTIONAL,
  1006.     IN OUT LPDWORD lpdwBufferLength
  1007.     );
  1008. BOOLAPI
  1009. InternetQueryOptionW(
  1010.     IN HINTERNET hInternet OPTIONAL,
  1011.     IN DWORD dwOption,
  1012.     OUT LPVOID lpBuffer OPTIONAL,
  1013.     IN OUT LPDWORD lpdwBufferLength
  1014.     );
  1015. #ifdef UNICODE
  1016. #define InternetQueryOption  InternetQueryOptionW
  1017. #else
  1018. #define InternetQueryOption  InternetQueryOptionA
  1019. #endif // !UNICODE
  1020.  
  1021. BOOLAPI
  1022. InternetSetOptionA(
  1023.     IN HINTERNET hInternet OPTIONAL,
  1024.     IN DWORD dwOption,
  1025.     IN LPVOID lpBuffer,
  1026.     IN DWORD dwBufferLength
  1027.     );
  1028. BOOLAPI
  1029. InternetSetOptionW(
  1030.     IN HINTERNET hInternet OPTIONAL,
  1031.     IN DWORD dwOption,
  1032.     IN LPVOID lpBuffer,
  1033.     IN DWORD dwBufferLength
  1034.     );
  1035. #ifdef UNICODE
  1036. #define InternetSetOption  InternetSetOptionW
  1037. #else
  1038. #define InternetSetOption  InternetSetOptionA
  1039. #endif // !UNICODE
  1040.  
  1041. BOOLAPI
  1042. InternetSetOptionExA(
  1043.     IN HINTERNET hInternet OPTIONAL,
  1044.     IN DWORD dwOption,
  1045.     IN LPVOID lpBuffer,
  1046.     IN DWORD dwBufferLength,
  1047.     IN DWORD dwFlags
  1048.     );
  1049. BOOLAPI
  1050. InternetSetOptionExW(
  1051.     IN HINTERNET hInternet OPTIONAL,
  1052.     IN DWORD dwOption,
  1053.     IN LPVOID lpBuffer,
  1054.     IN DWORD dwBufferLength,
  1055.     IN DWORD dwFlags
  1056.     );
  1057. #ifdef UNICODE
  1058. #define InternetSetOptionEx  InternetSetOptionExW
  1059. #else
  1060. #define InternetSetOptionEx  InternetSetOptionExA
  1061. #endif // !UNICODE
  1062.  
  1063. BOOLAPI
  1064. InternetLockRequestFile(
  1065.     IN  HINTERNET hInternet,
  1066.     OUT HANDLE * lphLockRequestInfo
  1067.     );
  1068.  
  1069. BOOLAPI
  1070. InternetUnlockRequestFile(
  1071.     IN HANDLE hLockRequestInfo
  1072.     );
  1073.  
  1074. //
  1075. // flags for InternetSetOptionEx()
  1076. //
  1077.  
  1078. #define ISO_GLOBAL      0x00000001  // modify option globally
  1079. #define ISO_REGISTRY    0x00000002  // write option to registry (where applicable)
  1080.  
  1081. #define ISO_VALID_FLAGS (ISO_GLOBAL | ISO_REGISTRY)
  1082.  
  1083. //
  1084. // options manifests for Internet{Query|Set}Option
  1085. //
  1086.  
  1087. #define INTERNET_OPTION_CALLBACK                1
  1088. #define INTERNET_OPTION_CONNECT_TIMEOUT         2
  1089. #define INTERNET_OPTION_CONNECT_RETRIES         3
  1090. #define INTERNET_OPTION_CONNECT_BACKOFF         4
  1091. #define INTERNET_OPTION_SEND_TIMEOUT            5
  1092. #define INTERNET_OPTION_CONTROL_SEND_TIMEOUT    INTERNET_OPTION_SEND_TIMEOUT
  1093. #define INTERNET_OPTION_RECEIVE_TIMEOUT         6
  1094. #define INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT INTERNET_OPTION_RECEIVE_TIMEOUT
  1095. #define INTERNET_OPTION_DATA_SEND_TIMEOUT       7
  1096. #define INTERNET_OPTION_DATA_RECEIVE_TIMEOUT    8
  1097. #define INTERNET_OPTION_HANDLE_TYPE             9
  1098. #define INTERNET_OPTION_LISTEN_TIMEOUT          11
  1099. #define INTERNET_OPTION_READ_BUFFER_SIZE        12
  1100. #define INTERNET_OPTION_WRITE_BUFFER_SIZE       13
  1101.  
  1102. #define INTERNET_OPTION_ASYNC_ID                15
  1103. #define INTERNET_OPTION_ASYNC_PRIORITY          16
  1104.  
  1105. #define INTERNET_OPTION_PARENT_HANDLE           21
  1106. #define INTERNET_OPTION_KEEP_CONNECTION         22
  1107. #define INTERNET_OPTION_REQUEST_FLAGS           23
  1108. #define INTERNET_OPTION_EXTENDED_ERROR          24
  1109.  
  1110. #define INTERNET_OPTION_OFFLINE_MODE            26
  1111. #define INTERNET_OPTION_CACHE_STREAM_HANDLE     27
  1112. #define INTERNET_OPTION_USERNAME                28
  1113. #define INTERNET_OPTION_PASSWORD                29
  1114. #define INTERNET_OPTION_ASYNC                   30
  1115. #define INTERNET_OPTION_SECURITY_FLAGS          31
  1116. #define INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT 32
  1117. #define INTERNET_OPTION_DATAFILE_NAME           33
  1118. #define INTERNET_OPTION_URL                     34
  1119. #define INTERNET_OPTION_SECURITY_CERTIFICATE    35
  1120. #define INTERNET_OPTION_SECURITY_KEY_BITNESS    36
  1121. #define INTERNET_OPTION_REFRESH                 37
  1122. #define INTERNET_OPTION_PROXY                   38
  1123. #define INTERNET_OPTION_SETTINGS_CHANGED        39
  1124. #define INTERNET_OPTION_VERSION                 40
  1125. #define INTERNET_OPTION_USER_AGENT              41
  1126. #define INTERNET_OPTION_END_BROWSER_SESSION     42
  1127. #define INTERNET_OPTION_PROXY_USERNAME          43
  1128. #define INTERNET_OPTION_PROXY_PASSWORD          44
  1129. #define INTERNET_OPTION_CONTEXT_VALUE           45
  1130. #define INTERNET_OPTION_CONNECT_LIMIT           46
  1131. #define INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT 47
  1132. #define INTERNET_OPTION_POLICY                  48
  1133. #define INTERNET_OPTION_DISCONNECTED_TIMEOUT    49
  1134. #define INTERNET_OPTION_CONNECTED_STATE         50
  1135. #define INTERNET_OPTION_IDLE_STATE              51
  1136. #define INTERNET_OPTION_OFFLINE_SEMANTICS       52
  1137. #define INTERNET_OPTION_SECONDARY_CACHE_KEY     53
  1138. #define INTERNET_OPTION_CALLBACK_FILTER         54
  1139. #define INTERNET_OPTION_CONNECT_TIME            55
  1140. #define INTERNET_OPTION_SEND_THROUGHPUT         56
  1141. #define INTERNET_OPTION_RECEIVE_THROUGHPUT      57
  1142. #define INTERNET_OPTION_REQUEST_PRIORITY        58
  1143. #define INTERNET_OPTION_HTTP_VERSION            59
  1144. #define INTERNET_OPTION_RESET_URLCACHE_SESSION  60
  1145. #define INTERNET_OPTION_ERROR_MASK              62
  1146. #define INTERNET_OPTION_FROM_CACHE_TIMEOUT      63
  1147. #define INTERNET_OPTION_BYPASS_EDITED_ENTRY     64
  1148. #define INTERNET_OPTION_CODEPAGE                68
  1149. #define INTERNET_OPTION_CACHE_TIMESTAMPS        69
  1150. #define INTERNET_OPTION_DISABLE_AUTODIAL        70
  1151. #define INTERNET_OPTION_MAX_CONNS_PER_SERVER     73
  1152. #define INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER 74
  1153. #define INTERNET_OPTION_PER_CONNECTION_OPTION   75
  1154. #define INTERNET_OPTION_DIGEST_AUTH_UNLOAD             76
  1155. #define INTERNET_OPTION_IGNORE_OFFLINE           77
  1156.  
  1157. #define INTERNET_FIRST_OPTION                   INTERNET_OPTION_CALLBACK
  1158. #define INTERNET_LAST_OPTION                    INTERNET_OPTION_IGNORE_OFFLINE
  1159.  
  1160. //
  1161. // values for INTERNET_OPTION_PRIORITY
  1162. //
  1163.  
  1164. #define INTERNET_PRIORITY_FOREGROUND            1000
  1165.  
  1166. //
  1167. // handle types
  1168. //
  1169.  
  1170. #define INTERNET_HANDLE_TYPE_INTERNET           1
  1171. #define INTERNET_HANDLE_TYPE_CONNECT_FTP        2
  1172. #define INTERNET_HANDLE_TYPE_CONNECT_GOPHER     3
  1173. #define INTERNET_HANDLE_TYPE_CONNECT_HTTP       4
  1174. #define INTERNET_HANDLE_TYPE_FTP_FIND           5
  1175. #define INTERNET_HANDLE_TYPE_FTP_FIND_HTML      6
  1176. #define INTERNET_HANDLE_TYPE_FTP_FILE           7
  1177. #define INTERNET_HANDLE_TYPE_FTP_FILE_HTML      8
  1178. #define INTERNET_HANDLE_TYPE_GOPHER_FIND        9
  1179. #define INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML   10
  1180. #define INTERNET_HANDLE_TYPE_GOPHER_FILE        11
  1181. #define INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML   12
  1182. #define INTERNET_HANDLE_TYPE_HTTP_REQUEST       13
  1183. #define INTERNET_HANDLE_TYPE_FILE_REQUEST       14
  1184.  
  1185. //
  1186. // values for INTERNET_OPTION_SECURITY_FLAGS
  1187. //
  1188.  
  1189. // query only
  1190. #define SECURITY_FLAG_SECURE                    0x00000001 // can query only
  1191. #define SECURITY_FLAG_STRENGTH_WEAK             0x10000000
  1192. #define SECURITY_FLAG_STRENGTH_MEDIUM           0x40000000
  1193. #define SECURITY_FLAG_STRENGTH_STRONG           0x20000000
  1194. #define SECURITY_FLAG_UNKNOWNBIT                0x80000000
  1195. #define SECURITY_FLAG_FORTEZZA                  0x08000000
  1196. #define SECURITY_FLAG_NORMALBITNESS             SECURITY_FLAG_STRENGTH_WEAK
  1197.  
  1198.  
  1199.  
  1200. // The following are unused
  1201. #define SECURITY_FLAG_SSL                       0x00000002
  1202. #define SECURITY_FLAG_SSL3                      0x00000004
  1203. #define SECURITY_FLAG_PCT                       0x00000008
  1204. #define SECURITY_FLAG_PCT4                      0x00000010
  1205. #define SECURITY_FLAG_IETFSSL4                  0x00000020
  1206.  
  1207. // The following are for backwards compatability only.
  1208. #define SECURITY_FLAG_40BIT                     SECURITY_FLAG_STRENGTH_WEAK
  1209. #define SECURITY_FLAG_128BIT                    SECURITY_FLAG_STRENGTH_STRONG
  1210. #define SECURITY_FLAG_56BIT                     SECURITY_FLAG_STRENGTH_MEDIUM
  1211.  
  1212. // setable flags
  1213. #define SECURITY_FLAG_IGNORE_REVOCATION         0x00000080
  1214. #define SECURITY_FLAG_IGNORE_UNKNOWN_CA         0x00000100
  1215. #define SECURITY_FLAG_IGNORE_WRONG_USAGE        0x00000200
  1216.  
  1217. #define SECURITY_FLAG_IGNORE_CERT_CN_INVALID    INTERNET_FLAG_IGNORE_CERT_CN_INVALID
  1218. #define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID  INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
  1219.  
  1220.  
  1221. #define SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS  INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS
  1222. #define SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP   INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
  1223.  
  1224.  
  1225.  
  1226. #define SECURITY_SET_MASK       (SECURITY_FLAG_IGNORE_REVOCATION |\
  1227.                                  SECURITY_FLAG_IGNORE_UNKNOWN_CA |\
  1228.                                  SECURITY_FLAG_IGNORE_CERT_CN_INVALID |\
  1229.                                  SECURITY_FLAG_IGNORE_CERT_DATE_INVALID |\
  1230.                                  SECURITY_FLAG_IGNORE_WRONG_USAGE)
  1231.  
  1232.  
  1233.  
  1234. BOOLAPI
  1235. InternetGetLastResponseInfoA(
  1236.     OUT LPDWORD lpdwError,
  1237.     OUT LPSTR lpszBuffer OPTIONAL,
  1238.     IN OUT LPDWORD lpdwBufferLength
  1239.     );
  1240. BOOLAPI
  1241. InternetGetLastResponseInfoW(
  1242.     OUT LPDWORD lpdwError,
  1243.     OUT LPWSTR lpszBuffer OPTIONAL,
  1244.     IN OUT LPDWORD lpdwBufferLength
  1245.     );
  1246. #ifdef UNICODE
  1247. #define InternetGetLastResponseInfo  InternetGetLastResponseInfoW
  1248. #else
  1249. #define InternetGetLastResponseInfo  InternetGetLastResponseInfoA
  1250. #endif // !UNICODE
  1251.  
  1252. //
  1253. // callback function for InternetSetStatusCallback
  1254. //
  1255.  
  1256. typedef
  1257. VOID
  1258. (CALLBACK * INTERNET_STATUS_CALLBACK)(
  1259.     IN HINTERNET hInternet,
  1260.     IN DWORD_PTR dwContext,
  1261.     IN DWORD dwInternetStatus,
  1262.     IN LPVOID lpvStatusInformation OPTIONAL,
  1263.     IN DWORD dwStatusInformationLength
  1264.     );
  1265.  
  1266. typedef INTERNET_STATUS_CALLBACK * LPINTERNET_STATUS_CALLBACK;
  1267.  
  1268. INTERNETAPI
  1269. INTERNET_STATUS_CALLBACK
  1270. WINAPI
  1271. InternetSetStatusCallbackA(
  1272.     IN HINTERNET hInternet,
  1273.     IN INTERNET_STATUS_CALLBACK lpfnInternetCallback
  1274.     );
  1275.  
  1276. INTERNETAPI
  1277. INTERNET_STATUS_CALLBACK
  1278. WINAPI
  1279. InternetSetStatusCallbackW(
  1280.     IN HINTERNET hInternet,
  1281.     IN INTERNET_STATUS_CALLBACK lpfnInternetCallback
  1282.     );
  1283.  
  1284. #ifdef UNICODE
  1285. #define InternetSetStatusCallback  InternetSetStatusCallbackW
  1286. #else
  1287. #ifdef _WINX32_
  1288. #define InternetSetStatusCallback  InternetSetStatusCallbackA
  1289. #else
  1290. INTERNETAPI
  1291. INTERNET_STATUS_CALLBACK
  1292. WINAPI
  1293. InternetSetStatusCallback(
  1294.     IN HINTERNET hInternet,
  1295.     IN INTERNET_STATUS_CALLBACK lpfnInternetCallback
  1296.     );
  1297. #endif // _WINX32_
  1298. #endif // !UNICODE
  1299.  
  1300. //
  1301. // status manifests for Internet status callback
  1302. //
  1303.  
  1304. #define INTERNET_STATUS_RESOLVING_NAME          10
  1305. #define INTERNET_STATUS_NAME_RESOLVED           11
  1306. #define INTERNET_STATUS_CONNECTING_TO_SERVER    20
  1307. #define INTERNET_STATUS_CONNECTED_TO_SERVER     21
  1308. #define INTERNET_STATUS_SENDING_REQUEST         30
  1309. #define INTERNET_STATUS_REQUEST_SENT            31
  1310. #define INTERNET_STATUS_RECEIVING_RESPONSE      40
  1311. #define INTERNET_STATUS_RESPONSE_RECEIVED       41
  1312. #define INTERNET_STATUS_CTL_RESPONSE_RECEIVED   42
  1313. #define INTERNET_STATUS_PREFETCH                43
  1314. #define INTERNET_STATUS_CLOSING_CONNECTION      50
  1315. #define INTERNET_STATUS_CONNECTION_CLOSED       51
  1316. #define INTERNET_STATUS_HANDLE_CREATED          60
  1317. #define INTERNET_STATUS_HANDLE_CLOSING          70
  1318. #define INTERNET_STATUS_DETECTING_PROXY         80
  1319. #define INTERNET_STATUS_REQUEST_COMPLETE        100
  1320. #define INTERNET_STATUS_REDIRECT                110
  1321. #define INTERNET_STATUS_INTERMEDIATE_RESPONSE   120
  1322. #define INTERNET_STATUS_USER_INPUT_REQUIRED     140
  1323. #define INTERNET_STATUS_STATE_CHANGE            200
  1324.  
  1325. //
  1326. // the following can be indicated in a state change notification:
  1327. //
  1328.  
  1329. #define INTERNET_STATE_CONNECTED                0x00000001  // connected state (mutually exclusive with disconnected)
  1330. #define INTERNET_STATE_DISCONNECTED             0x00000002  // disconnected from network
  1331. #define INTERNET_STATE_DISCONNECTED_BY_USER     0x00000010  // disconnected by user request
  1332. #define INTERNET_STATE_IDLE                     0x00000100  // no network requests being made (by Wininet)
  1333. #define INTERNET_STATE_BUSY                     0x00000200  // network requests being made (by Wininet)
  1334.  
  1335.  
  1336. //
  1337. // if the following value is returned by InternetSetStatusCallback, then
  1338. // probably an invalid (non-code) address was supplied for the callback
  1339. //
  1340.  
  1341. #define INTERNET_INVALID_STATUS_CALLBACK        ((INTERNET_STATUS_CALLBACK)(-1L))
  1342.  
  1343. //
  1344. // FTP
  1345. //
  1346.  
  1347. //
  1348. // manifests
  1349. //
  1350.  
  1351. #define FTP_TRANSFER_TYPE_UNKNOWN   0x00000000
  1352. #define FTP_TRANSFER_TYPE_ASCII     0x00000001
  1353. #define FTP_TRANSFER_TYPE_BINARY    0x00000002
  1354.  
  1355. #define FTP_TRANSFER_TYPE_MASK      (FTP_TRANSFER_TYPE_ASCII | FTP_TRANSFER_TYPE_BINARY)
  1356.  
  1357. //
  1358. // prototypes
  1359. //
  1360.  
  1361. INTERNETAPI
  1362. HINTERNET
  1363. WINAPI
  1364. FtpFindFirstFileA(
  1365.     IN HINTERNET hConnect,
  1366.     IN LPCSTR lpszSearchFile OPTIONAL,
  1367.     OUT LPWIN32_FIND_DATAA lpFindFileData OPTIONAL,
  1368.     IN DWORD dwFlags,
  1369.     IN DWORD_PTR dwContext
  1370.     );
  1371. INTERNETAPI
  1372. HINTERNET
  1373. WINAPI
  1374. FtpFindFirstFileW(
  1375.     IN HINTERNET hConnect,
  1376.     IN LPCWSTR lpszSearchFile OPTIONAL,
  1377.     OUT LPWIN32_FIND_DATAW lpFindFileData OPTIONAL,
  1378.     IN DWORD dwFlags,
  1379.     IN DWORD_PTR dwContext
  1380.     );
  1381. #ifdef UNICODE
  1382. #define FtpFindFirstFile  FtpFindFirstFileW
  1383. #else
  1384. #define FtpFindFirstFile  FtpFindFirstFileA
  1385. #endif // !UNICODE
  1386.  
  1387. BOOLAPI
  1388. FtpGetFileA(
  1389.     IN HINTERNET hConnect,
  1390.     IN LPCSTR lpszRemoteFile,
  1391.     IN LPCSTR lpszNewFile,
  1392.     IN BOOL fFailIfExists,
  1393.     IN DWORD dwFlagsAndAttributes,
  1394.     IN DWORD dwFlags,
  1395.     IN DWORD_PTR dwContext
  1396.     );
  1397. BOOLAPI
  1398. FtpGetFileW(
  1399.     IN HINTERNET hConnect,
  1400.     IN LPCWSTR lpszRemoteFile,
  1401.     IN LPCWSTR lpszNewFile,
  1402.     IN BOOL fFailIfExists,
  1403.     IN DWORD dwFlagsAndAttributes,
  1404.     IN DWORD dwFlags,
  1405.     IN DWORD_PTR dwContext
  1406.     );
  1407. #ifdef UNICODE
  1408. #define FtpGetFile  FtpGetFileW
  1409. #else
  1410. #define FtpGetFile  FtpGetFileA
  1411. #endif // !UNICODE
  1412.  
  1413. BOOLAPI
  1414. FtpPutFileA(
  1415.     IN HINTERNET hConnect,
  1416.     IN LPCSTR lpszLocalFile,
  1417.     IN LPCSTR lpszNewRemoteFile,
  1418.     IN DWORD dwFlags,
  1419.     IN DWORD_PTR dwContext
  1420.     );
  1421. BOOLAPI
  1422. FtpPutFileW(
  1423.     IN HINTERNET hConnect,
  1424.     IN LPCWSTR lpszLocalFile,
  1425.     IN LPCWSTR lpszNewRemoteFile,
  1426.     IN DWORD dwFlags,
  1427.     IN DWORD_PTR dwContext
  1428.     );
  1429. #ifdef UNICODE
  1430. #define FtpPutFile  FtpPutFileW
  1431. #else
  1432. #define FtpPutFile  FtpPutFileA
  1433. #endif // !UNICODE
  1434.  
  1435. BOOLAPI
  1436. FtpGetFileEx(
  1437.     IN HINTERNET hFtpSession,
  1438.     IN LPCSTR lpszRemoteFile,
  1439.     IN LPCWSTR lpszNewFile,
  1440.     IN BOOL fFailIfExists,
  1441.     IN DWORD dwFlagsAndAttributes,
  1442.     IN DWORD dwFlags,
  1443.     IN DWORD_PTR dwContext
  1444.     );
  1445.  
  1446. BOOLAPI    
  1447. FtpPutFileEx(
  1448.     IN HINTERNET hFtpSession,
  1449.     IN LPCWSTR lpszLocalFile,
  1450.     IN LPCSTR lpszNewRemoteFile,
  1451.     IN DWORD dwFlags,
  1452.     IN DWORD_PTR dwContext
  1453.     );
  1454.  
  1455. BOOLAPI
  1456. FtpDeleteFileA(
  1457.     IN HINTERNET hConnect,
  1458.     IN LPCSTR lpszFileName
  1459.     );
  1460. BOOLAPI
  1461. FtpDeleteFileW(
  1462.     IN HINTERNET hConnect,
  1463.     IN LPCWSTR lpszFileName
  1464.     );
  1465. #ifdef UNICODE
  1466. #define FtpDeleteFile  FtpDeleteFileW
  1467. #else
  1468. #define FtpDeleteFile  FtpDeleteFileA
  1469. #endif // !UNICODE
  1470.  
  1471. BOOLAPI
  1472. FtpRenameFileA(
  1473.     IN HINTERNET hConnect,
  1474.     IN LPCSTR lpszExisting,
  1475.     IN LPCSTR lpszNew
  1476.     );
  1477. BOOLAPI
  1478. FtpRenameFileW(
  1479.     IN HINTERNET hConnect,
  1480.     IN LPCWSTR lpszExisting,
  1481.     IN LPCWSTR lpszNew
  1482.     );
  1483. #ifdef UNICODE
  1484. #define FtpRenameFile  FtpRenameFileW
  1485. #else
  1486. #define FtpRenameFile  FtpRenameFileA
  1487. #endif // !UNICODE
  1488.  
  1489. INTERNETAPI
  1490. HINTERNET
  1491. WINAPI
  1492. FtpOpenFileA(
  1493.     IN HINTERNET hConnect,
  1494.     IN LPCSTR lpszFileName,
  1495.     IN DWORD dwAccess,
  1496.     IN DWORD dwFlags,
  1497.     IN DWORD_PTR dwContext
  1498.     );
  1499. INTERNETAPI
  1500. HINTERNET
  1501. WINAPI
  1502. FtpOpenFileW(
  1503.     IN HINTERNET hConnect,
  1504.     IN LPCWSTR lpszFileName,
  1505.     IN DWORD dwAccess,
  1506.     IN DWORD dwFlags,
  1507.     IN DWORD_PTR dwContext
  1508.     );
  1509. #ifdef UNICODE
  1510. #define FtpOpenFile  FtpOpenFileW
  1511. #else
  1512. #define FtpOpenFile  FtpOpenFileA
  1513. #endif // !UNICODE
  1514.  
  1515. BOOLAPI
  1516. FtpCreateDirectoryA(
  1517.     IN HINTERNET hConnect,
  1518.     IN LPCSTR lpszDirectory
  1519.     );
  1520. BOOLAPI
  1521. FtpCreateDirectoryW(
  1522.     IN HINTERNET hConnect,
  1523.     IN LPCWSTR lpszDirectory
  1524.     );
  1525. #ifdef UNICODE
  1526. #define FtpCreateDirectory  FtpCreateDirectoryW
  1527. #else
  1528. #define FtpCreateDirectory  FtpCreateDirectoryA
  1529. #endif // !UNICODE
  1530.  
  1531. BOOLAPI
  1532. FtpRemoveDirectoryA(
  1533.     IN HINTERNET hConnect,
  1534.     IN LPCSTR lpszDirectory
  1535.     );
  1536. BOOLAPI
  1537. FtpRemoveDirectoryW(
  1538.     IN HINTERNET hConnect,
  1539.     IN LPCWSTR lpszDirectory
  1540.     );
  1541. #ifdef UNICODE
  1542. #define FtpRemoveDirectory  FtpRemoveDirectoryW
  1543. #else
  1544. #define FtpRemoveDirectory  FtpRemoveDirectoryA
  1545. #endif // !UNICODE
  1546.  
  1547. BOOLAPI
  1548. FtpSetCurrentDirectoryA(
  1549.     IN HINTERNET hConnect,
  1550.     IN LPCSTR lpszDirectory
  1551.     );
  1552. BOOLAPI
  1553. FtpSetCurrentDirectoryW(
  1554.     IN HINTERNET hConnect,
  1555.     IN LPCWSTR lpszDirectory
  1556.     );
  1557. #ifdef UNICODE
  1558. #define FtpSetCurrentDirectory  FtpSetCurrentDirectoryW
  1559. #else
  1560. #define FtpSetCurrentDirectory  FtpSetCurrentDirectoryA
  1561. #endif // !UNICODE
  1562.  
  1563. BOOLAPI
  1564. FtpGetCurrentDirectoryA(
  1565.     IN HINTERNET hConnect,
  1566.     OUT LPSTR lpszCurrentDirectory,
  1567.     IN OUT LPDWORD lpdwCurrentDirectory
  1568.     );
  1569. BOOLAPI
  1570. FtpGetCurrentDirectoryW(
  1571.     IN HINTERNET hConnect,
  1572.     OUT LPWSTR lpszCurrentDirectory,
  1573.     IN OUT LPDWORD lpdwCurrentDirectory
  1574.     );
  1575. #ifdef UNICODE
  1576. #define FtpGetCurrentDirectory  FtpGetCurrentDirectoryW
  1577. #else
  1578. #define FtpGetCurrentDirectory  FtpGetCurrentDirectoryA
  1579. #endif // !UNICODE
  1580.  
  1581. BOOLAPI
  1582. FtpCommandA(
  1583.     IN HINTERNET hConnect,
  1584.     IN BOOL fExpectResponse,
  1585.     IN DWORD dwFlags,
  1586.     IN LPCSTR lpszCommand,
  1587.     IN DWORD_PTR dwContext,
  1588.     OUT HINTERNET *phFtpCommand OPTIONAL
  1589.     );
  1590. BOOLAPI
  1591. FtpCommandW(
  1592.     IN HINTERNET hConnect,
  1593.     IN BOOL fExpectResponse,
  1594.     IN DWORD dwFlags,
  1595.     IN LPCWSTR lpszCommand,
  1596.     IN DWORD_PTR dwContext,
  1597.     OUT HINTERNET *phFtpCommand OPTIONAL
  1598.     );
  1599. #ifdef UNICODE
  1600. #define FtpCommand  FtpCommandW
  1601. #else
  1602. #define FtpCommand  FtpCommandA
  1603. #endif // !UNICODE
  1604.  
  1605. INTERNETAPI
  1606. DWORD
  1607. WINAPI
  1608. FtpGetFileSize(
  1609.     IN HINTERNET hFile,
  1610.     OUT LPDWORD lpdwFileSizeHigh OPTIONAL
  1611.     );
  1612.  
  1613.  
  1614.  
  1615. //
  1616. // Gopher
  1617. //
  1618.  
  1619. //
  1620. // manifests
  1621. //
  1622.  
  1623. //
  1624. // string field lengths (in characters, not bytes)
  1625. //
  1626.  
  1627. #define MAX_GOPHER_DISPLAY_TEXT     128
  1628. #define MAX_GOPHER_SELECTOR_TEXT    256
  1629. #define MAX_GOPHER_HOST_NAME        INTERNET_MAX_HOST_NAME_LENGTH
  1630. #define MAX_GOPHER_LOCATOR_LENGTH   (1                                  \
  1631.                                     + MAX_GOPHER_DISPLAY_TEXT           \
  1632.                                     + 1                                 \
  1633.                                     + MAX_GOPHER_SELECTOR_TEXT          \
  1634.                                     + 1                                 \
  1635.                                     + MAX_GOPHER_HOST_NAME              \
  1636.                                     + 1                                 \
  1637.                                     + INTERNET_MAX_PORT_NUMBER_LENGTH   \
  1638.                                     + 1                                 \
  1639.                                     + 1                                 \
  1640.                                     + 2                                 \
  1641.                                     )
  1642.  
  1643. //
  1644. // structures/types
  1645. //
  1646.  
  1647. //
  1648. // GOPHER_FIND_DATA - returns the results of a GopherFindFirstFile()/
  1649. // InternetFindNextFile() request
  1650. //
  1651.  
  1652. typedef struct {
  1653.     CHAR   DisplayString[MAX_GOPHER_DISPLAY_TEXT + 1];
  1654.     DWORD GopherType;   // GOPHER_TYPE_, if known
  1655.     DWORD SizeLow;
  1656.     DWORD SizeHigh;
  1657.     FILETIME LastModificationTime;
  1658.     CHAR   Locator[MAX_GOPHER_LOCATOR_LENGTH + 1];
  1659. } GOPHER_FIND_DATAA, * LPGOPHER_FIND_DATAA;
  1660. typedef struct {
  1661.     WCHAR  DisplayString[MAX_GOPHER_DISPLAY_TEXT + 1];
  1662.     DWORD GopherType;   // GOPHER_TYPE_, if known
  1663.     DWORD SizeLow;
  1664.     DWORD SizeHigh;
  1665.     FILETIME LastModificationTime;
  1666.     WCHAR  Locator[MAX_GOPHER_LOCATOR_LENGTH + 1];
  1667. } GOPHER_FIND_DATAW, * LPGOPHER_FIND_DATAW;
  1668. #ifdef UNICODE
  1669. typedef GOPHER_FIND_DATAW GOPHER_FIND_DATA;
  1670. typedef LPGOPHER_FIND_DATAW LPGOPHER_FIND_DATA;
  1671. #else
  1672. typedef GOPHER_FIND_DATAA GOPHER_FIND_DATA;
  1673. typedef LPGOPHER_FIND_DATAA LPGOPHER_FIND_DATA;
  1674. #endif // UNICODE
  1675.  
  1676. //
  1677. // manifests for GopherType
  1678. //
  1679.  
  1680. #define GOPHER_TYPE_TEXT_FILE       0x00000001
  1681. #define GOPHER_TYPE_DIRECTORY       0x00000002
  1682. #define GOPHER_TYPE_CSO             0x00000004
  1683. #define GOPHER_TYPE_ERROR           0x00000008
  1684. #define GOPHER_TYPE_MAC_BINHEX      0x00000010
  1685. #define GOPHER_TYPE_DOS_ARCHIVE     0x00000020
  1686. #define GOPHER_TYPE_UNIX_UUENCODED  0x00000040
  1687. #define GOPHER_TYPE_INDEX_SERVER    0x00000080
  1688. #define GOPHER_TYPE_TELNET          0x00000100
  1689. #define GOPHER_TYPE_BINARY          0x00000200
  1690. #define GOPHER_TYPE_REDUNDANT       0x00000400
  1691. #define GOPHER_TYPE_TN3270          0x00000800
  1692. #define GOPHER_TYPE_GIF             0x00001000
  1693. #define GOPHER_TYPE_IMAGE           0x00002000
  1694. #define GOPHER_TYPE_BITMAP          0x00004000
  1695. #define GOPHER_TYPE_MOVIE           0x00008000
  1696. #define GOPHER_TYPE_SOUND           0x00010000
  1697. #define GOPHER_TYPE_HTML            0x00020000
  1698. #define GOPHER_TYPE_PDF             0x00040000
  1699. #define GOPHER_TYPE_CALENDAR        0x00080000
  1700. #define GOPHER_TYPE_INLINE          0x00100000
  1701. #define GOPHER_TYPE_UNKNOWN         0x20000000
  1702. #define GOPHER_TYPE_ASK             0x40000000
  1703. #define GOPHER_TYPE_GOPHER_PLUS     0x80000000
  1704.  
  1705. //
  1706. // gopher type macros
  1707. //
  1708.  
  1709. #define IS_GOPHER_FILE(type)            (BOOL)(((type) & GOPHER_TYPE_FILE_MASK) ? TRUE : FALSE)
  1710. #define IS_GOPHER_DIRECTORY(type)       (BOOL)(((type) & GOPHER_TYPE_DIRECTORY) ? TRUE : FALSE)
  1711. #define IS_GOPHER_PHONE_SERVER(type)    (BOOL)(((type) & GOPHER_TYPE_CSO) ? TRUE : FALSE)
  1712. #define IS_GOPHER_ERROR(type)           (BOOL)(((type) & GOPHER_TYPE_ERROR) ? TRUE : FALSE)
  1713. #define IS_GOPHER_INDEX_SERVER(type)    (BOOL)(((type) & GOPHER_TYPE_INDEX_SERVER) ? TRUE : FALSE)
  1714. #define IS_GOPHER_TELNET_SESSION(type)  (BOOL)(((type) & GOPHER_TYPE_TELNET) ? TRUE : FALSE)
  1715. #define IS_GOPHER_BACKUP_SERVER(type)   (BOOL)(((type) & GOPHER_TYPE_REDUNDANT) ? TRUE : FALSE)
  1716. #define IS_GOPHER_TN3270_SESSION(type)  (BOOL)(((type) & GOPHER_TYPE_TN3270) ? TRUE : FALSE)
  1717. #define IS_GOPHER_ASK(type)             (BOOL)(((type) & GOPHER_TYPE_ASK) ? TRUE : FALSE)
  1718. #define IS_GOPHER_PLUS(type)            (BOOL)(((type) & GOPHER_TYPE_GOPHER_PLUS) ? TRUE : FALSE)
  1719.  
  1720. #define IS_GOPHER_TYPE_KNOWN(type)      (BOOL)(((type) & GOPHER_TYPE_UNKNOWN) ? FALSE : TRUE)
  1721.  
  1722. //
  1723. // GOPHER_TYPE_FILE_MASK - use this to determine if a locator identifies a
  1724. // (known) file type
  1725. //
  1726.  
  1727. #define GOPHER_TYPE_FILE_MASK       (GOPHER_TYPE_TEXT_FILE          \
  1728.                                     | GOPHER_TYPE_MAC_BINHEX        \
  1729.                                     | GOPHER_TYPE_DOS_ARCHIVE       \
  1730.                                     | GOPHER_TYPE_UNIX_UUENCODED    \
  1731.                                     | GOPHER_TYPE_BINARY            \
  1732.                                     | GOPHER_TYPE_GIF               \
  1733.                                     | GOPHER_TYPE_IMAGE             \
  1734.                                     | GOPHER_TYPE_BITMAP            \
  1735.                                     | GOPHER_TYPE_MOVIE             \
  1736.                                     | GOPHER_TYPE_SOUND             \
  1737.                                     | GOPHER_TYPE_HTML              \
  1738.                                     | GOPHER_TYPE_PDF               \
  1739.                                     | GOPHER_TYPE_CALENDAR          \
  1740.                                     | GOPHER_TYPE_INLINE            \
  1741.                                     )
  1742.  
  1743. //
  1744. // structured gopher attributes (as defined in gopher+ protocol document)
  1745. //
  1746.  
  1747. typedef struct {
  1748.     LPCTSTR Comment;
  1749.     LPCTSTR EmailAddress;
  1750. } GOPHER_ADMIN_ATTRIBUTE_TYPE, * LPGOPHER_ADMIN_ATTRIBUTE_TYPE;
  1751.  
  1752. typedef struct {
  1753.     FILETIME DateAndTime;
  1754. } GOPHER_MOD_DATE_ATTRIBUTE_TYPE, * LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE;
  1755.  
  1756. typedef struct {
  1757.     DWORD Ttl;
  1758. } GOPHER_TTL_ATTRIBUTE_TYPE, * LPGOPHER_TTL_ATTRIBUTE_TYPE;
  1759.  
  1760. typedef struct {
  1761.     INT Score;
  1762. } GOPHER_SCORE_ATTRIBUTE_TYPE, * LPGOPHER_SCORE_ATTRIBUTE_TYPE;
  1763.  
  1764. typedef struct {
  1765.     INT LowerBound;
  1766.     INT UpperBound;
  1767. } GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, * LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE;
  1768.  
  1769. typedef struct {
  1770.     LPCTSTR Site;
  1771. } GOPHER_SITE_ATTRIBUTE_TYPE, * LPGOPHER_SITE_ATTRIBUTE_TYPE;
  1772.  
  1773. typedef struct {
  1774.     LPCTSTR Organization;
  1775. } GOPHER_ORGANIZATION_ATTRIBUTE_TYPE, * LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPE;
  1776.  
  1777. typedef struct {
  1778.     LPCTSTR Location;
  1779. } GOPHER_LOCATION_ATTRIBUTE_TYPE, * LPGOPHER_LOCATION_ATTRIBUTE_TYPE;
  1780.  
  1781. typedef struct {
  1782.     INT DegreesNorth;
  1783.     INT MinutesNorth;
  1784.     INT SecondsNorth;
  1785.     INT DegreesEast;
  1786.     INT MinutesEast;
  1787.     INT SecondsEast;
  1788. } GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, * LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE;
  1789.  
  1790. typedef struct {
  1791.     INT Zone;
  1792. } GOPHER_TIMEZONE_ATTRIBUTE_TYPE, * LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE;
  1793.  
  1794. typedef struct {
  1795.     LPCTSTR Provider;
  1796. } GOPHER_PROVIDER_ATTRIBUTE_TYPE, * LPGOPHER_PROVIDER_ATTRIBUTE_TYPE;
  1797.  
  1798. typedef struct {
  1799.     LPCTSTR Version;
  1800. } GOPHER_VERSION_ATTRIBUTE_TYPE, * LPGOPHER_VERSION_ATTRIBUTE_TYPE;
  1801.  
  1802. typedef struct {
  1803.     LPCTSTR ShortAbstract;
  1804.     LPCTSTR AbstractFile;
  1805. } GOPHER_ABSTRACT_ATTRIBUTE_TYPE, * LPGOPHER_ABSTRACT_ATTRIBUTE_TYPE;
  1806.  
  1807. typedef struct {
  1808.     LPCTSTR ContentType;
  1809.     LPCTSTR Language;
  1810.     DWORD Size;
  1811. } GOPHER_VIEW_ATTRIBUTE_TYPE, * LPGOPHER_VIEW_ATTRIBUTE_TYPE;
  1812.  
  1813. typedef struct {
  1814.     BOOL TreeWalk;
  1815. } GOPHER_VERONICA_ATTRIBUTE_TYPE, * LPGOPHER_VERONICA_ATTRIBUTE_TYPE;
  1816.  
  1817. typedef struct {
  1818.     LPCTSTR QuestionType;
  1819.     LPCTSTR QuestionText;
  1820. } GOPHER_ASK_ATTRIBUTE_TYPE, * LPGOPHER_ASK_ATTRIBUTE_TYPE;
  1821.  
  1822. //
  1823. // GOPHER_UNKNOWN_ATTRIBUTE_TYPE - this is returned if we retrieve an attribute
  1824. // that is not specified in the current gopher/gopher+ documentation. It is up
  1825. // to the application to parse the information
  1826. //
  1827.  
  1828. typedef struct {
  1829.     LPCTSTR Text;
  1830. } GOPHER_UNKNOWN_ATTRIBUTE_TYPE, * LPGOPHER_UNKNOWN_ATTRIBUTE_TYPE;
  1831.  
  1832. //
  1833. // GOPHER_ATTRIBUTE_TYPE - returned in the user's buffer when an enumerated
  1834. // GopherGetAttribute call is made
  1835. //
  1836.  
  1837. typedef struct {
  1838.     DWORD CategoryId;   // e.g. GOPHER_CATEGORY_ID_ADMIN
  1839.     DWORD AttributeId;  // e.g. GOPHER_ATTRIBUTE_ID_ADMIN
  1840.     union {
  1841.         GOPHER_ADMIN_ATTRIBUTE_TYPE Admin;
  1842.         GOPHER_MOD_DATE_ATTRIBUTE_TYPE ModDate;
  1843.         GOPHER_TTL_ATTRIBUTE_TYPE Ttl;
  1844.         GOPHER_SCORE_ATTRIBUTE_TYPE Score;
  1845.         GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE ScoreRange;
  1846.         GOPHER_SITE_ATTRIBUTE_TYPE Site;
  1847.         GOPHER_ORGANIZATION_ATTRIBUTE_TYPE Organization;
  1848.         GOPHER_LOCATION_ATTRIBUTE_TYPE Location;
  1849.         GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE GeographicalLocation;
  1850.         GOPHER_TIMEZONE_ATTRIBUTE_TYPE TimeZone;
  1851.         GOPHER_PROVIDER_ATTRIBUTE_TYPE Provider;
  1852.         GOPHER_VERSION_ATTRIBUTE_TYPE Version;
  1853.         GOPHER_ABSTRACT_ATTRIBUTE_TYPE Abstract;
  1854.         GOPHER_VIEW_ATTRIBUTE_TYPE View;
  1855.         GOPHER_VERONICA_ATTRIBUTE_TYPE Veronica;
  1856.         GOPHER_ASK_ATTRIBUTE_TYPE Ask;
  1857.         GOPHER_UNKNOWN_ATTRIBUTE_TYPE Unknown;
  1858.     } AttributeType;
  1859. } GOPHER_ATTRIBUTE_TYPE, * LPGOPHER_ATTRIBUTE_TYPE;
  1860.  
  1861. #define MAX_GOPHER_CATEGORY_NAME    128     // arbitrary
  1862. #define MAX_GOPHER_ATTRIBUTE_NAME   128     //     "
  1863. #define MIN_GOPHER_ATTRIBUTE_LENGTH 256     //     "
  1864.  
  1865. //
  1866. // known gopher attribute categories. See below for ordinals
  1867. //
  1868.  
  1869. #define GOPHER_INFO_CATEGORY        TEXT("+INFO")
  1870. #define GOPHER_ADMIN_CATEGORY       TEXT("+ADMIN")
  1871. #define GOPHER_VIEWS_CATEGORY       TEXT("+VIEWS")
  1872. #define GOPHER_ABSTRACT_CATEGORY    TEXT("+ABSTRACT")
  1873. #define GOPHER_VERONICA_CATEGORY    TEXT("+VERONICA")
  1874.  
  1875. //
  1876. // known gopher attributes. These are the attribute names as defined in the
  1877. // gopher+ protocol document
  1878. //
  1879.  
  1880. #define GOPHER_ADMIN_ATTRIBUTE      TEXT("Admin")
  1881. #define GOPHER_MOD_DATE_ATTRIBUTE   TEXT("Mod-Date")
  1882. #define GOPHER_TTL_ATTRIBUTE        TEXT("TTL")
  1883. #define GOPHER_SCORE_ATTRIBUTE      TEXT("Score")
  1884. #define GOPHER_RANGE_ATTRIBUTE      TEXT("Score-range")
  1885. #define GOPHER_SITE_ATTRIBUTE       TEXT("Site")
  1886. #define GOPHER_ORG_ATTRIBUTE        TEXT("Org")
  1887. #define GOPHER_LOCATION_ATTRIBUTE   TEXT("Loc")
  1888. #define GOPHER_GEOG_ATTRIBUTE       TEXT("Geog")
  1889. #define GOPHER_TIMEZONE_ATTRIBUTE   TEXT("TZ")
  1890. #define GOPHER_PROVIDER_ATTRIBUTE   TEXT("Provider")
  1891. #define GOPHER_VERSION_ATTRIBUTE    TEXT("Version")
  1892. #define GOPHER_ABSTRACT_ATTRIBUTE   TEXT("Abstract")
  1893. #define GOPHER_VIEW_ATTRIBUTE       TEXT("View")
  1894. #define GOPHER_TREEWALK_ATTRIBUTE   TEXT("treewalk")
  1895.  
  1896. //
  1897. // identifiers for attribute strings
  1898. //
  1899.  
  1900. #define GOPHER_ATTRIBUTE_ID_BASE        0xabcccc00
  1901.  
  1902. #define GOPHER_CATEGORY_ID_ALL          (GOPHER_ATTRIBUTE_ID_BASE + 1)
  1903.  
  1904. #define GOPHER_CATEGORY_ID_INFO         (GOPHER_ATTRIBUTE_ID_BASE + 2)
  1905. #define GOPHER_CATEGORY_ID_ADMIN        (GOPHER_ATTRIBUTE_ID_BASE + 3)
  1906. #define GOPHER_CATEGORY_ID_VIEWS        (GOPHER_ATTRIBUTE_ID_BASE + 4)
  1907. #define GOPHER_CATEGORY_ID_ABSTRACT     (GOPHER_ATTRIBUTE_ID_BASE + 5)
  1908. #define GOPHER_CATEGORY_ID_VERONICA     (GOPHER_ATTRIBUTE_ID_BASE + 6)
  1909. #define GOPHER_CATEGORY_ID_ASK          (GOPHER_ATTRIBUTE_ID_BASE + 7)
  1910.  
  1911. #define GOPHER_CATEGORY_ID_UNKNOWN      (GOPHER_ATTRIBUTE_ID_BASE + 8)
  1912.  
  1913. #define GOPHER_ATTRIBUTE_ID_ALL         (GOPHER_ATTRIBUTE_ID_BASE + 9)
  1914.  
  1915. #define GOPHER_ATTRIBUTE_ID_ADMIN       (GOPHER_ATTRIBUTE_ID_BASE + 10)
  1916. #define GOPHER_ATTRIBUTE_ID_MOD_DATE    (GOPHER_ATTRIBUTE_ID_BASE + 11)
  1917. #define GOPHER_ATTRIBUTE_ID_TTL         (GOPHER_ATTRIBUTE_ID_BASE + 12)
  1918. #define GOPHER_ATTRIBUTE_ID_SCORE       (GOPHER_ATTRIBUTE_ID_BASE + 13)
  1919. #define GOPHER_ATTRIBUTE_ID_RANGE       (GOPHER_ATTRIBUTE_ID_BASE + 14)
  1920. #define GOPHER_ATTRIBUTE_ID_SITE        (GOPHER_ATTRIBUTE_ID_BASE + 15)
  1921. #define GOPHER_ATTRIBUTE_ID_ORG         (GOPHER_ATTRIBUTE_ID_BASE + 16)
  1922. #define GOPHER_ATTRIBUTE_ID_LOCATION    (GOPHER_ATTRIBUTE_ID_BASE + 17)
  1923. #define GOPHER_ATTRIBUTE_ID_GEOG        (GOPHER_ATTRIBUTE_ID_BASE + 18)
  1924. #define GOPHER_ATTRIBUTE_ID_TIMEZONE    (GOPHER_ATTRIBUTE_ID_BASE + 19)
  1925. #define GOPHER_ATTRIBUTE_ID_PROVIDER    (GOPHER_ATTRIBUTE_ID_BASE + 20)
  1926. #define GOPHER_ATTRIBUTE_ID_VERSION     (GOPHER_ATTRIBUTE_ID_BASE + 21)
  1927. #define GOPHER_ATTRIBUTE_ID_ABSTRACT    (GOPHER_ATTRIBUTE_ID_BASE + 22)
  1928. #define GOPHER_ATTRIBUTE_ID_VIEW        (GOPHER_ATTRIBUTE_ID_BASE + 23)
  1929. #define GOPHER_ATTRIBUTE_ID_TREEWALK    (GOPHER_ATTRIBUTE_ID_BASE + 24)
  1930.  
  1931. #define GOPHER_ATTRIBUTE_ID_UNKNOWN     (GOPHER_ATTRIBUTE_ID_BASE + 25)
  1932.  
  1933. //
  1934. // prototypes
  1935. //
  1936.  
  1937. BOOLAPI
  1938. GopherCreateLocatorA(
  1939.     IN LPCSTR lpszHost,
  1940.     IN INTERNET_PORT nServerPort,
  1941.     IN LPCSTR lpszDisplayString OPTIONAL,
  1942.     IN LPCSTR lpszSelectorString OPTIONAL,
  1943.     IN DWORD dwGopherType,
  1944.     OUT LPSTR lpszLocator OPTIONAL,
  1945.     IN OUT LPDWORD lpdwBufferLength
  1946.     );
  1947. BOOLAPI
  1948. GopherCreateLocatorW(
  1949.     IN LPCWSTR lpszHost,
  1950.     IN INTERNET_PORT nServerPort,
  1951.     IN LPCWSTR lpszDisplayString OPTIONAL,
  1952.     IN LPCWSTR lpszSelectorString OPTIONAL,
  1953.     IN DWORD dwGopherType,
  1954.     OUT LPWSTR lpszLocator OPTIONAL,
  1955.     IN OUT LPDWORD lpdwBufferLength
  1956.     );
  1957. #ifdef UNICODE
  1958. #define GopherCreateLocator  GopherCreateLocatorW
  1959. #else
  1960. #define GopherCreateLocator  GopherCreateLocatorA
  1961. #endif // !UNICODE
  1962.  
  1963. BOOLAPI
  1964. GopherGetLocatorTypeA(
  1965.     IN LPCSTR lpszLocator,
  1966.     OUT LPDWORD lpdwGopherType
  1967.     );
  1968. BOOLAPI
  1969. GopherGetLocatorTypeW(
  1970.     IN LPCWSTR lpszLocator,
  1971.     OUT LPDWORD lpdwGopherType
  1972.     );
  1973. #ifdef UNICODE
  1974. #define GopherGetLocatorType  GopherGetLocatorTypeW
  1975. #else
  1976. #define GopherGetLocatorType  GopherGetLocatorTypeA
  1977. #endif // !UNICODE
  1978.  
  1979. INTERNETAPI
  1980. HINTERNET
  1981. WINAPI
  1982. GopherFindFirstFileA(
  1983.     IN HINTERNET hConnect,
  1984.     IN LPCSTR lpszLocator OPTIONAL,
  1985.     IN LPCSTR lpszSearchString OPTIONAL,
  1986.     OUT LPGOPHER_FIND_DATAA lpFindData OPTIONAL,
  1987.     IN DWORD dwFlags,
  1988.     IN DWORD_PTR dwContext
  1989.     );
  1990. INTERNETAPI
  1991. HINTERNET
  1992. WINAPI
  1993. GopherFindFirstFileW(
  1994.     IN HINTERNET hConnect,
  1995.     IN LPCWSTR lpszLocator OPTIONAL,
  1996.     IN LPCWSTR lpszSearchString OPTIONAL,
  1997.     OUT LPGOPHER_FIND_DATAW lpFindData OPTIONAL,
  1998.     IN DWORD dwFlags,
  1999.     IN DWORD_PTR dwContext
  2000.     );
  2001. #ifdef UNICODE
  2002. #define GopherFindFirstFile  GopherFindFirstFileW
  2003. #else
  2004. #define GopherFindFirstFile  GopherFindFirstFileA
  2005. #endif // !UNICODE
  2006.  
  2007. INTERNETAPI
  2008. HINTERNET
  2009. WINAPI
  2010. GopherOpenFileA(
  2011.     IN HINTERNET hConnect,
  2012.     IN LPCSTR lpszLocator,
  2013.     IN LPCSTR lpszView OPTIONAL,
  2014.     IN DWORD dwFlags,
  2015.     IN DWORD_PTR dwContext
  2016.     );
  2017. INTERNETAPI
  2018. HINTERNET
  2019. WINAPI
  2020. GopherOpenFileW(
  2021.     IN HINTERNET hConnect,
  2022.     IN LPCWSTR lpszLocator,
  2023.     IN LPCWSTR lpszView OPTIONAL,
  2024.     IN DWORD dwFlags,
  2025.     IN DWORD_PTR dwContext
  2026.     );
  2027. #ifdef UNICODE
  2028. #define GopherOpenFile  GopherOpenFileW
  2029. #else
  2030. #define GopherOpenFile  GopherOpenFileA
  2031. #endif // !UNICODE
  2032.  
  2033. typedef
  2034. BOOL
  2035. (CALLBACK * GOPHER_ATTRIBUTE_ENUMERATOR)(
  2036.     LPGOPHER_ATTRIBUTE_TYPE lpAttributeInfo,
  2037.     DWORD dwError
  2038.     );
  2039.  
  2040. BOOLAPI
  2041. GopherGetAttributeA(
  2042.     IN HINTERNET hConnect,
  2043.     IN LPCSTR lpszLocator,
  2044.     IN LPCSTR lpszAttributeName OPTIONAL,
  2045.     OUT LPBYTE lpBuffer,
  2046.     IN DWORD dwBufferLength,
  2047.     OUT LPDWORD lpdwCharactersReturned,
  2048.     IN GOPHER_ATTRIBUTE_ENUMERATOR lpfnEnumerator OPTIONAL,
  2049.     IN DWORD_PTR dwContext
  2050.     );
  2051. BOOLAPI
  2052. GopherGetAttributeW(
  2053.     IN HINTERNET hConnect,
  2054.     IN LPCWSTR lpszLocator,
  2055.     IN LPCWSTR lpszAttributeName OPTIONAL,
  2056.     OUT LPBYTE lpBuffer,
  2057.     IN DWORD dwBufferLength,
  2058.     OUT LPDWORD lpdwCharactersReturned,
  2059.     IN GOPHER_ATTRIBUTE_ENUMERATOR lpfnEnumerator OPTIONAL,
  2060.     IN DWORD_PTR dwContext
  2061.     );
  2062. #ifdef UNICODE
  2063. #define GopherGetAttribute  GopherGetAttributeW
  2064. #else
  2065. #define GopherGetAttribute  GopherGetAttributeA
  2066. #endif // !UNICODE
  2067.  
  2068. //
  2069. // HTTP
  2070. //
  2071.  
  2072. //
  2073. // manifests
  2074. //
  2075.  
  2076. //
  2077. // the default major/minor HTTP version numbers
  2078. //
  2079.  
  2080. #define HTTP_MAJOR_VERSION      1
  2081. #define HTTP_MINOR_VERSION      0
  2082.  
  2083. #define HTTP_VERSIONA           "HTTP/1.0"
  2084. #define HTTP_VERSIONW           L"HTTP/1.0"
  2085.  
  2086. #ifdef UNICODE
  2087. #define HTTP_VERSION            HTTP_VERSIONW
  2088. #else
  2089. #define HTTP_VERSION            HTTP_VERSIONA
  2090. #endif
  2091.  
  2092. //
  2093. // HttpQueryInfo info levels. Generally, there is one info level
  2094. // for each potential RFC822/HTTP/MIME header that an HTTP server
  2095. // may send as part of a request response.
  2096. //
  2097. // The HTTP_QUERY_RAW_HEADERS info level is provided for clients
  2098. // that choose to perform their own header parsing.
  2099. //
  2100.  
  2101.  
  2102. #define HTTP_QUERY_MIME_VERSION                 0
  2103. #define HTTP_QUERY_CONTENT_TYPE                 1
  2104. #define HTTP_QUERY_CONTENT_TRANSFER_ENCODING    2
  2105. #define HTTP_QUERY_CONTENT_ID                   3
  2106. #define HTTP_QUERY_CONTENT_DESCRIPTION          4
  2107. #define HTTP_QUERY_CONTENT_LENGTH               5
  2108. #define HTTP_QUERY_CONTENT_LANGUAGE             6
  2109. #define HTTP_QUERY_ALLOW                        7
  2110. #define HTTP_QUERY_PUBLIC                       8
  2111. #define HTTP_QUERY_DATE                         9
  2112. #define HTTP_QUERY_EXPIRES                      10
  2113. #define HTTP_QUERY_LAST_MODIFIED                11
  2114. #define HTTP_QUERY_MESSAGE_ID                   12
  2115. #define HTTP_QUERY_URI                          13
  2116. #define HTTP_QUERY_DERIVED_FROM                 14
  2117. #define HTTP_QUERY_COST                         15
  2118. #define HTTP_QUERY_LINK                         16
  2119. #define HTTP_QUERY_PRAGMA                       17
  2120. #define HTTP_QUERY_VERSION                      18  // special: part of status line
  2121. #define HTTP_QUERY_STATUS_CODE                  19  // special: part of status line
  2122. #define HTTP_QUERY_STATUS_TEXT                  20  // special: part of status line
  2123. #define HTTP_QUERY_RAW_HEADERS                  21  // special: all headers as ASCIIZ
  2124. #define HTTP_QUERY_RAW_HEADERS_CRLF             22  // special: all headers
  2125. #define HTTP_QUERY_CONNECTION                   23
  2126. #define HTTP_QUERY_ACCEPT                       24
  2127. #define HTTP_QUERY_ACCEPT_CHARSET               25
  2128. #define HTTP_QUERY_ACCEPT_ENCODING              26
  2129. #define HTTP_QUERY_ACCEPT_LANGUAGE              27
  2130. #define HTTP_QUERY_AUTHORIZATION                28
  2131. #define HTTP_QUERY_CONTENT_ENCODING             29
  2132. #define HTTP_QUERY_FORWARDED                    30
  2133. #define HTTP_QUERY_FROM                         31
  2134. #define HTTP_QUERY_IF_MODIFIED_SINCE            32
  2135. #define HTTP_QUERY_LOCATION                     33
  2136. #define HTTP_QUERY_ORIG_URI                     34
  2137. #define HTTP_QUERY_REFERER                      35
  2138. #define HTTP_QUERY_RETRY_AFTER                  36
  2139. #define HTTP_QUERY_SERVER                       37
  2140. #define HTTP_QUERY_TITLE                        38
  2141. #define HTTP_QUERY_USER_AGENT                   39
  2142. #define HTTP_QUERY_WWW_AUTHENTICATE             40
  2143. #define HTTP_QUERY_PROXY_AUTHENTICATE           41
  2144. #define HTTP_QUERY_ACCEPT_RANGES                42
  2145. #define HTTP_QUERY_SET_COOKIE                   43
  2146. #define HTTP_QUERY_COOKIE                       44
  2147. #define HTTP_QUERY_REQUEST_METHOD               45  // special: GET/POST etc.
  2148. #define HTTP_QUERY_REFRESH                      46
  2149. #define HTTP_QUERY_CONTENT_DISPOSITION          47
  2150.  
  2151. //
  2152. // HTTP 1.1 defined headers
  2153. //
  2154.  
  2155. #define HTTP_QUERY_AGE                          48
  2156. #define HTTP_QUERY_CACHE_CONTROL                49
  2157. #define HTTP_QUERY_CONTENT_BASE                 50
  2158. #define HTTP_QUERY_CONTENT_LOCATION             51
  2159. #define HTTP_QUERY_CONTENT_MD5                  52
  2160. #define HTTP_QUERY_CONTENT_RANGE                53
  2161. #define HTTP_QUERY_ETAG                         54
  2162. #define HTTP_QUERY_HOST                         55
  2163. #define HTTP_QUERY_IF_MATCH                     56
  2164. #define HTTP_QUERY_IF_NONE_MATCH                57
  2165. #define HTTP_QUERY_IF_RANGE                     58
  2166. #define HTTP_QUERY_IF_UNMODIFIED_SINCE          59
  2167. #define HTTP_QUERY_MAX_FORWARDS                 60
  2168. #define HTTP_QUERY_PROXY_AUTHORIZATION          61
  2169. #define HTTP_QUERY_RANGE                        62
  2170. #define HTTP_QUERY_TRANSFER_ENCODING            63
  2171. #define HTTP_QUERY_UPGRADE                      64
  2172. #define HTTP_QUERY_VARY                         65
  2173. #define HTTP_QUERY_VIA                          66
  2174. #define HTTP_QUERY_WARNING                      67
  2175. #define HTTP_QUERY_EXPECT                       68
  2176. #define HTTP_QUERY_PROXY_CONNECTION             69
  2177. #define HTTP_QUERY_UNLESS_MODIFIED_SINCE        70
  2178.  
  2179.  
  2180.  
  2181. #define HTTP_QUERY_ECHO_REQUEST                 71
  2182. #define HTTP_QUERY_ECHO_REPLY                   72
  2183.  
  2184. // These are the set of headers that should be added back to a request when
  2185. // re-doing a request after a RETRY_WITH response.
  2186. #define HTTP_QUERY_ECHO_HEADERS                 73
  2187. #define HTTP_QUERY_ECHO_HEADERS_CRLF            74
  2188.  
  2189. #define HTTP_QUERY_MAX                          74
  2190.  
  2191. //
  2192. // HTTP_QUERY_CUSTOM - if this special value is supplied as the dwInfoLevel
  2193. // parameter of HttpQueryInfo() then the lpBuffer parameter contains the name
  2194. // of the header we are to query
  2195. //
  2196.  
  2197. #define HTTP_QUERY_CUSTOM                       65535
  2198.  
  2199. //
  2200. // HTTP_QUERY_FLAG_REQUEST_HEADERS - if this bit is set in the dwInfoLevel
  2201. // parameter of HttpQueryInfo() then the request headers will be queried for the
  2202. // request information
  2203. //
  2204.  
  2205. #define HTTP_QUERY_FLAG_REQUEST_HEADERS         0x80000000
  2206.  
  2207. //
  2208. // HTTP_QUERY_FLAG_SYSTEMTIME - if this bit is set in the dwInfoLevel parameter
  2209. // of HttpQueryInfo() AND the header being queried contains date information,
  2210. // e.g. the "Expires:" header then lpBuffer will contain a SYSTEMTIME structure
  2211. // containing the date and time information converted from the header string
  2212. //
  2213.  
  2214. #define HTTP_QUERY_FLAG_SYSTEMTIME              0x40000000
  2215.  
  2216. //
  2217. // HTTP_QUERY_FLAG_NUMBER - if this bit is set in the dwInfoLevel parameter of
  2218. // HttpQueryInfo(), then the value of the header will be converted to a number
  2219. // before being returned to the caller, if applicable
  2220. //
  2221.  
  2222. #define HTTP_QUERY_FLAG_NUMBER                  0x20000000
  2223.  
  2224. //
  2225. // HTTP_QUERY_FLAG_COALESCE - combine the values from several headers of the
  2226. // same name into the output buffer
  2227. //
  2228.  
  2229. #define HTTP_QUERY_FLAG_COALESCE                0x10000000
  2230.  
  2231.  
  2232. #define HTTP_QUERY_MODIFIER_FLAGS_MASK          (HTTP_QUERY_FLAG_REQUEST_HEADERS    \
  2233.                                                 | HTTP_QUERY_FLAG_SYSTEMTIME        \
  2234.                                                 | HTTP_QUERY_FLAG_NUMBER            \
  2235.                                                 | HTTP_QUERY_FLAG_COALESCE          \
  2236.                                                 )
  2237.  
  2238. #define HTTP_QUERY_HEADER_MASK                  (~HTTP_QUERY_MODIFIER_FLAGS_MASK)
  2239.  
  2240. //
  2241. // HTTP Response Status Codes:
  2242. //
  2243.  
  2244. #define HTTP_STATUS_CONTINUE            100 // OK to continue with request
  2245. #define HTTP_STATUS_SWITCH_PROTOCOLS    101 // server has switched protocols in upgrade header
  2246.  
  2247. #define HTTP_STATUS_OK                  200 // request completed
  2248. #define HTTP_STATUS_CREATED             201 // object created, reason = new URI
  2249. #define HTTP_STATUS_ACCEPTED            202 // async completion (TBS)
  2250. #define HTTP_STATUS_PARTIAL             203 // partial completion
  2251. #define HTTP_STATUS_NO_CONTENT          204 // no info to return
  2252. #define HTTP_STATUS_RESET_CONTENT       205 // request completed, but clear form
  2253. #define HTTP_STATUS_PARTIAL_CONTENT     206 // partial GET furfilled
  2254.  
  2255. #define HTTP_STATUS_AMBIGUOUS           300 // server couldn't decide what to return
  2256. #define HTTP_STATUS_MOVED               301 // object permanently moved
  2257. #define HTTP_STATUS_REDIRECT            302 // object temporarily moved
  2258. #define HTTP_STATUS_REDIRECT_METHOD     303 // redirection w/ new access method
  2259. #define HTTP_STATUS_NOT_MODIFIED        304 // if-modified-since was not modified
  2260. #define HTTP_STATUS_USE_PROXY           305 // redirection to proxy, location header specifies proxy to use
  2261. #define HTTP_STATUS_REDIRECT_KEEP_VERB  307 // HTTP/1.1: keep same verb
  2262.  
  2263. #define HTTP_STATUS_BAD_REQUEST         400 // invalid syntax
  2264. #define HTTP_STATUS_DENIED              401 // access denied
  2265. #define HTTP_STATUS_PAYMENT_REQ         402 // payment required
  2266. #define HTTP_STATUS_FORBIDDEN           403 // request forbidden
  2267. #define HTTP_STATUS_NOT_FOUND           404 // object not found
  2268. #define HTTP_STATUS_BAD_METHOD          405 // method is not allowed
  2269. #define HTTP_STATUS_NONE_ACCEPTABLE     406 // no response acceptable to client found
  2270. #define HTTP_STATUS_PROXY_AUTH_REQ      407 // proxy authentication required
  2271. #define HTTP_STATUS_REQUEST_TIMEOUT     408 // server timed out waiting for request
  2272. #define HTTP_STATUS_CONFLICT            409 // user should resubmit with more info
  2273. #define HTTP_STATUS_GONE                410 // the resource is no longer available
  2274. #define HTTP_STATUS_LENGTH_REQUIRED     411 // the server refused to accept request w/o a length
  2275. #define HTTP_STATUS_PRECOND_FAILED      412 // precondition given in request failed
  2276. #define HTTP_STATUS_REQUEST_TOO_LARGE   413 // request entity was too large
  2277. #define HTTP_STATUS_URI_TOO_LONG        414 // request URI too long
  2278. #define HTTP_STATUS_UNSUPPORTED_MEDIA   415 // unsupported media type
  2279. #define HTTP_STATUS_RETRY_WITH          449 // retry after doing the appropriate action.
  2280.  
  2281. #define HTTP_STATUS_SERVER_ERROR        500 // internal server error
  2282. #define HTTP_STATUS_NOT_SUPPORTED       501 // required not supported
  2283. #define HTTP_STATUS_BAD_GATEWAY         502 // error response received from gateway
  2284. #define HTTP_STATUS_SERVICE_UNAVAIL     503 // temporarily overloaded
  2285. #define HTTP_STATUS_GATEWAY_TIMEOUT     504 // timed out waiting for gateway
  2286. #define HTTP_STATUS_VERSION_NOT_SUP     505 // HTTP version not supported
  2287.  
  2288. #define HTTP_STATUS_FIRST               HTTP_STATUS_CONTINUE
  2289. #define HTTP_STATUS_LAST                HTTP_STATUS_VERSION_NOT_SUP
  2290.  
  2291. //
  2292. // prototypes
  2293. //
  2294.  
  2295. INTERNETAPI
  2296. HINTERNET
  2297. WINAPI
  2298. HttpOpenRequestA(
  2299.     IN HINTERNET hConnect,
  2300.     IN LPCSTR lpszVerb,
  2301.     IN LPCSTR lpszObjectName,
  2302.     IN LPCSTR lpszVersion,
  2303.     IN LPCSTR lpszReferrer OPTIONAL,
  2304.     IN LPCSTR FAR * lplpszAcceptTypes OPTIONAL,
  2305.     IN DWORD dwFlags,
  2306.     IN DWORD_PTR dwContext
  2307.     );
  2308. INTERNETAPI
  2309. HINTERNET
  2310. WINAPI
  2311. HttpOpenRequestW(
  2312.     IN HINTERNET hConnect,
  2313.     IN LPCWSTR lpszVerb,
  2314.     IN LPCWSTR lpszObjectName,
  2315.     IN LPCWSTR lpszVersion,
  2316.     IN LPCWSTR lpszReferrer OPTIONAL,
  2317.     IN LPCWSTR FAR * lplpszAcceptTypes OPTIONAL,
  2318.     IN DWORD dwFlags,
  2319.     IN DWORD_PTR dwContext
  2320.     );
  2321. #ifdef UNICODE
  2322. #define HttpOpenRequest  HttpOpenRequestW
  2323. #else
  2324. #define HttpOpenRequest  HttpOpenRequestA
  2325. #endif // !UNICODE
  2326.  
  2327. BOOLAPI
  2328. HttpAddRequestHeadersA(
  2329.     IN HINTERNET hRequest,
  2330.     IN LPCSTR lpszHeaders,
  2331.     IN DWORD dwHeadersLength,
  2332.     IN DWORD dwModifiers
  2333.     );
  2334. BOOLAPI
  2335. HttpAddRequestHeadersW(
  2336.     IN HINTERNET hRequest,
  2337.     IN LPCWSTR lpszHeaders,
  2338.     IN DWORD dwHeadersLength,
  2339.     IN DWORD dwModifiers
  2340.     );
  2341. #ifdef UNICODE
  2342. #define HttpAddRequestHeaders  HttpAddRequestHeadersW
  2343. #else
  2344. #define HttpAddRequestHeaders  HttpAddRequestHeadersA
  2345. #endif // !UNICODE
  2346.  
  2347. //
  2348. // values for dwModifiers parameter of HttpAddRequestHeaders()
  2349. //
  2350.  
  2351. #define HTTP_ADDREQ_INDEX_MASK      0x0000FFFF
  2352. #define HTTP_ADDREQ_FLAGS_MASK      0xFFFF0000
  2353.  
  2354. //
  2355. // HTTP_ADDREQ_FLAG_ADD_IF_NEW - the header will only be added if it doesn't
  2356. // already exist
  2357. //
  2358.  
  2359. #define HTTP_ADDREQ_FLAG_ADD_IF_NEW 0x10000000
  2360.  
  2361. //
  2362. // HTTP_ADDREQ_FLAG_ADD - if HTTP_ADDREQ_FLAG_REPLACE is set but the header is
  2363. // not found then if this flag is set, the header is added anyway, so long as
  2364. // there is a valid header-value
  2365. //
  2366.  
  2367. #define HTTP_ADDREQ_FLAG_ADD        0x20000000
  2368.  
  2369. //
  2370. // HTTP_ADDREQ_FLAG_COALESCE - coalesce headers with same name. e.g.
  2371. // "Accept: text/*" and "Accept: audio/*" with this flag results in a single
  2372. // header: "Accept: text/*, audio/*"
  2373. //
  2374.  
  2375. #define HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA       0x40000000
  2376. #define HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON   0x01000000
  2377. #define HTTP_ADDREQ_FLAG_COALESCE                  HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA
  2378.  
  2379. //
  2380. // HTTP_ADDREQ_FLAG_REPLACE - replaces the specified header. Only one header can
  2381. // be supplied in the buffer. If the header to be replaced is not the first
  2382. // in a list of headers with the same name, then the relative index should be
  2383. // supplied in the low 8 bits of the dwModifiers parameter. If the header-value
  2384. // part is missing, then the header is removed
  2385. //
  2386.  
  2387. #define HTTP_ADDREQ_FLAG_REPLACE    0x80000000
  2388.  
  2389. BOOLAPI
  2390. HttpSendRequestA(
  2391.     IN HINTERNET hRequest,
  2392.     IN LPCSTR lpszHeaders OPTIONAL,
  2393.     IN DWORD dwHeadersLength,
  2394.     IN LPVOID lpOptional OPTIONAL,
  2395.     IN DWORD dwOptionalLength
  2396.     );
  2397. BOOLAPI
  2398. HttpSendRequestW(
  2399.     IN HINTERNET hRequest,
  2400.     IN LPCWSTR lpszHeaders OPTIONAL,
  2401.     IN DWORD dwHeadersLength,
  2402.     IN LPVOID lpOptional OPTIONAL,
  2403.     IN DWORD dwOptionalLength
  2404.     );
  2405. #ifdef UNICODE
  2406. #define HttpSendRequest  HttpSendRequestW
  2407. #else
  2408. #define HttpSendRequest  HttpSendRequestA
  2409. #endif // !UNICODE
  2410.  
  2411. INTERNETAPI
  2412. BOOL
  2413. WINAPI
  2414. HttpSendRequestExA(
  2415.     IN HINTERNET hRequest,
  2416.     IN LPINTERNET_BUFFERSA lpBuffersIn OPTIONAL,
  2417.     OUT LPINTERNET_BUFFERSA lpBuffersOut OPTIONAL,
  2418.     IN DWORD dwFlags,
  2419.     IN DWORD_PTR dwContext
  2420.     );
  2421. INTERNETAPI
  2422. BOOL
  2423. WINAPI
  2424. HttpSendRequestExW(
  2425.     IN HINTERNET hRequest,
  2426.     IN LPINTERNET_BUFFERSW lpBuffersIn OPTIONAL,
  2427.     OUT LPINTERNET_BUFFERSW lpBuffersOut OPTIONAL,
  2428.     IN DWORD dwFlags,
  2429.     IN DWORD_PTR dwContext
  2430.     );
  2431. #ifdef UNICODE
  2432. #define HttpSendRequestEx  HttpSendRequestExW
  2433. #else
  2434. #define HttpSendRequestEx  HttpSendRequestExA
  2435. #endif // !UNICODE
  2436.  
  2437. //
  2438. // flags for HttpSendRequestEx(), HttpEndRequest()
  2439. //
  2440.  
  2441. #define HSR_ASYNC       WININET_API_FLAG_ASYNC          // force async
  2442. #define HSR_SYNC        WININET_API_FLAG_SYNC           // force sync
  2443. #define HSR_USE_CONTEXT WININET_API_FLAG_USE_CONTEXT    // use dwContext value
  2444. #define HSR_INITIATE    0x00000008                      // iterative operation (completed by HttpEndRequest)
  2445. #define HSR_DOWNLOAD    0x00000010                      // download to file
  2446. #define HSR_CHUNKED     0x00000020                      // operation is send of chunked data
  2447.  
  2448. INTERNETAPI
  2449. BOOL
  2450. WINAPI
  2451. HttpEndRequestA(
  2452.     IN HINTERNET hRequest,
  2453.     OUT LPINTERNET_BUFFERSA lpBuffersOut OPTIONAL,
  2454.     IN DWORD dwFlags,
  2455.     IN DWORD_PTR dwContext
  2456.     );
  2457. INTERNETAPI
  2458. BOOL
  2459. WINAPI
  2460. HttpEndRequestW(
  2461.     IN HINTERNET hRequest,
  2462.     OUT LPINTERNET_BUFFERSW lpBuffersOut OPTIONAL,
  2463.     IN DWORD dwFlags,
  2464.     IN DWORD_PTR dwContext
  2465.     );
  2466. #ifdef UNICODE
  2467. #define HttpEndRequest  HttpEndRequestW
  2468. #else
  2469. #define HttpEndRequest  HttpEndRequestA
  2470. #endif // !UNICODE
  2471.  
  2472. BOOLAPI
  2473. HttpQueryInfoA(
  2474.     IN HINTERNET hRequest,
  2475.     IN DWORD dwInfoLevel,
  2476.     IN OUT LPVOID lpBuffer OPTIONAL,
  2477.     IN OUT LPDWORD lpdwBufferLength,
  2478.     IN OUT LPDWORD lpdwIndex OPTIONAL
  2479.     );
  2480. BOOLAPI
  2481. HttpQueryInfoW(
  2482.     IN HINTERNET hRequest,
  2483.     IN DWORD dwInfoLevel,
  2484.     IN OUT LPVOID lpBuffer OPTIONAL,
  2485.     IN OUT LPDWORD lpdwBufferLength,
  2486.     IN OUT LPDWORD lpdwIndex OPTIONAL
  2487.     );
  2488. #ifdef UNICODE
  2489. #define HttpQueryInfo  HttpQueryInfoW
  2490. #else
  2491. #define HttpQueryInfo  HttpQueryInfoA
  2492. #endif // !UNICODE
  2493.  
  2494. //
  2495. // Cookie APIs
  2496. //
  2497.  
  2498.  
  2499. BOOLAPI
  2500. InternetSetCookieA(
  2501.     IN LPCSTR lpszUrl,
  2502.     IN LPCSTR lpszCookieName,
  2503.     IN LPCSTR lpszCookieData
  2504.     );
  2505. BOOLAPI
  2506. InternetSetCookieW(
  2507.     IN LPCWSTR lpszUrl,
  2508.     IN LPCWSTR lpszCookieName,
  2509.     IN LPCWSTR lpszCookieData
  2510.     );
  2511. #ifdef UNICODE
  2512. #define InternetSetCookie  InternetSetCookieW
  2513. #else
  2514. #define InternetSetCookie  InternetSetCookieA
  2515. #endif // !UNICODE
  2516.  
  2517. BOOLAPI
  2518. InternetGetCookieA(
  2519.     IN LPCSTR lpszUrl,
  2520.     IN LPCSTR lpszCookieName,
  2521.     OUT LPSTR lpCookieData,
  2522.     IN OUT LPDWORD lpdwSize
  2523.     );
  2524. BOOLAPI
  2525. InternetGetCookieW(
  2526.     IN LPCWSTR lpszUrl,
  2527.     IN LPCWSTR lpszCookieName,
  2528.     OUT LPWSTR lpCookieData,
  2529.     IN OUT LPDWORD lpdwSize
  2530.     );
  2531. #ifdef UNICODE
  2532. #define InternetGetCookie  InternetGetCookieW
  2533. #else
  2534. #define InternetGetCookie  InternetGetCookieA
  2535. #endif // !UNICODE
  2536.  
  2537. //
  2538. // offline browsing
  2539. //
  2540.  
  2541. INTERNETAPI
  2542. DWORD
  2543. WINAPI
  2544. InternetAttemptConnect(
  2545.     IN DWORD dwReserved
  2546.     );
  2547.  
  2548. BOOLAPI
  2549. InternetCheckConnectionA(
  2550.     IN LPCSTR lpszUrl,
  2551.     IN DWORD dwFlags,
  2552.     IN DWORD dwReserved
  2553.     );
  2554. BOOLAPI
  2555. InternetCheckConnectionW(
  2556.     IN LPCWSTR lpszUrl,
  2557.     IN DWORD dwFlags,
  2558.     IN DWORD dwReserved
  2559.     );
  2560. #ifdef UNICODE
  2561. #define InternetCheckConnection  InternetCheckConnectionW
  2562. #else
  2563. #define InternetCheckConnection  InternetCheckConnectionA
  2564. #endif // !UNICODE
  2565.  
  2566.  
  2567. #define FLAG_ICC_FORCE_CONNECTION       0x00000001
  2568.  
  2569. //
  2570. // Internet UI
  2571. //
  2572.  
  2573. //
  2574. // InternetErrorDlg - Provides UI for certain Errors.
  2575. //
  2576.  
  2577. #define FLAGS_ERROR_UI_FILTER_FOR_ERRORS        0x01
  2578. #define FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS     0x02
  2579. #define FLAGS_ERROR_UI_FLAGS_GENERATE_DATA      0x04
  2580. #define FLAGS_ERROR_UI_FLAGS_NO_UI              0x08
  2581. #define FLAGS_ERROR_UI_SERIALIZE_DIALOGS        0x10
  2582.  
  2583. //
  2584. // If SERIALIZE_DIALOGS flag set, client should implement thread-safe non-blocking callback...
  2585. //
  2586.  
  2587. DWORD InternetAuthNotifyCallback
  2588. (
  2589.     DWORD_PTR       dwContext,    // as passed to InternetErrorDlg
  2590.     DWORD           dwReturn,     // error code: success, resend, or cancel
  2591.     LPVOID          lpReserved    // reserved: will be set to null
  2592. );
  2593. typedef DWORD (CALLBACK * PFN_AUTH_NOTIFY) (DWORD_PTR, DWORD, LPVOID);
  2594.  
  2595. //
  2596. // ... and last parameter of InternetErrorDlg should point to...
  2597. //
  2598.  
  2599. typedef struct
  2600. {
  2601.     DWORD            cbStruct;    // size of this structure
  2602.     DWORD            dwOptions;   // reserved: must set to 0
  2603.     PFN_AUTH_NOTIFY  pfnNotify;   // notification callback to retry InternetErrorDlg
  2604.     DWORD_PTR        dwContext;   // context to pass to to notification function
  2605. }
  2606.     INTERNET_AUTH_NOTIFY_DATA;
  2607.  
  2608.  
  2609. INTERNETAPI
  2610. BOOL
  2611. WINAPI
  2612. ResumeSuspendedDownload(
  2613.     IN HINTERNET hRequest,
  2614.     IN DWORD dwResultCode
  2615.     );
  2616.  
  2617. INTERNETAPI
  2618. DWORD
  2619. WINAPI
  2620. InternetErrorDlg(
  2621.     IN HWND hWnd,
  2622.     IN OUT HINTERNET hRequest,
  2623.     IN DWORD dwError,
  2624.     IN DWORD dwFlags,
  2625.     IN OUT LPVOID * lppvData
  2626.     );
  2627.  
  2628. INTERNETAPI
  2629. DWORD
  2630. WINAPI
  2631. InternetConfirmZoneCrossingA(
  2632.     IN HWND hWnd,
  2633.     IN LPSTR szUrlPrev,
  2634.     IN LPSTR szUrlNew,
  2635.     IN BOOL bPost
  2636.     );
  2637.  
  2638. INTERNETAPI
  2639. DWORD
  2640. WINAPI
  2641. InternetConfirmZoneCrossingW(
  2642.     IN HWND hWnd,
  2643.     IN LPWSTR szUrlPrev,
  2644.     IN LPWSTR szUrlNew,
  2645.     IN BOOL bPost
  2646.     );
  2647.  
  2648. #ifdef UNICODE
  2649. #define InternetConfirmZoneCrossing  InternetConfirmZoneCrossingW
  2650. #else
  2651. #ifdef _WINX32_
  2652. #define InternetConfirmZoneCrossing  InternetConfirmZoneCrossingA
  2653. #else
  2654. INTERNETAPI
  2655. DWORD
  2656. WINAPI
  2657. InternetConfirmZoneCrossing(
  2658.     IN HWND hWnd,
  2659.     IN LPSTR szUrlPrev,
  2660.     IN LPSTR szUrlNew,
  2661.     IN BOOL bPost
  2662.     );
  2663. #endif // _WINX32_
  2664. #endif // !UNICODE
  2665.  
  2666. //#if !defined(_WINERROR_)
  2667.  
  2668. //
  2669. // Internet API error returns
  2670. //
  2671.  
  2672. #define INTERNET_ERROR_BASE                     12000
  2673.  
  2674. #define ERROR_INTERNET_OUT_OF_HANDLES           (INTERNET_ERROR_BASE + 1)
  2675. #define ERROR_INTERNET_TIMEOUT                  (INTERNET_ERROR_BASE + 2)
  2676. #define ERROR_INTERNET_EXTENDED_ERROR           (INTERNET_ERROR_BASE + 3)
  2677. #define ERROR_INTERNET_INTERNAL_ERROR           (INTERNET_ERROR_BASE + 4)
  2678. #define ERROR_INTERNET_INVALID_URL              (INTERNET_ERROR_BASE + 5)
  2679. #define ERROR_INTERNET_UNRECOGNIZED_SCHEME      (INTERNET_ERROR_BASE + 6)
  2680. #define ERROR_INTERNET_NAME_NOT_RESOLVED        (INTERNET_ERROR_BASE + 7)
  2681. #define ERROR_INTERNET_PROTOCOL_NOT_FOUND       (INTERNET_ERROR_BASE + 8)
  2682. #define ERROR_INTERNET_INVALID_OPTION           (INTERNET_ERROR_BASE + 9)
  2683. #define ERROR_INTERNET_BAD_OPTION_LENGTH        (INTERNET_ERROR_BASE + 10)
  2684. #define ERROR_INTERNET_OPTION_NOT_SETTABLE      (INTERNET_ERROR_BASE + 11)
  2685. #define ERROR_INTERNET_SHUTDOWN                 (INTERNET_ERROR_BASE + 12)
  2686. #define ERROR_INTERNET_INCORRECT_USER_NAME      (INTERNET_ERROR_BASE + 13)
  2687. #define ERROR_INTERNET_INCORRECT_PASSWORD       (INTERNET_ERROR_BASE + 14)
  2688. #define ERROR_INTERNET_LOGIN_FAILURE            (INTERNET_ERROR_BASE + 15)
  2689. #define ERROR_INTERNET_INVALID_OPERATION        (INTERNET_ERROR_BASE + 16)
  2690. #define ERROR_INTERNET_OPERATION_CANCELLED      (INTERNET_ERROR_BASE + 17)
  2691. #define ERROR_INTERNET_INCORRECT_HANDLE_TYPE    (INTERNET_ERROR_BASE + 18)
  2692. #define ERROR_INTERNET_INCORRECT_HANDLE_STATE   (INTERNET_ERROR_BASE + 19)
  2693. #define ERROR_INTERNET_NOT_PROXY_REQUEST        (INTERNET_ERROR_BASE + 20)
  2694. #define ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND (INTERNET_ERROR_BASE + 21)
  2695. #define ERROR_INTERNET_BAD_REGISTRY_PARAMETER   (INTERNET_ERROR_BASE + 22)
  2696. #define ERROR_INTERNET_NO_DIRECT_ACCESS         (INTERNET_ERROR_BASE + 23)
  2697. #define ERROR_INTERNET_NO_CONTEXT               (INTERNET_ERROR_BASE + 24)
  2698. #define ERROR_INTERNET_NO_CALLBACK              (INTERNET_ERROR_BASE + 25)
  2699. #define ERROR_INTERNET_REQUEST_PENDING          (INTERNET_ERROR_BASE + 26)
  2700. #define ERROR_INTERNET_INCORRECT_FORMAT         (INTERNET_ERROR_BASE + 27)
  2701. #define ERROR_INTERNET_ITEM_NOT_FOUND           (INTERNET_ERROR_BASE + 28)
  2702. #define ERROR_INTERNET_CANNOT_CONNECT           (INTERNET_ERROR_BASE + 29)
  2703. #define ERROR_INTERNET_CONNECTION_ABORTED       (INTERNET_ERROR_BASE + 30)
  2704. #define ERROR_INTERNET_CONNECTION_RESET         (INTERNET_ERROR_BASE + 31)
  2705. #define ERROR_INTERNET_FORCE_RETRY              (INTERNET_ERROR_BASE + 32)
  2706. #define ERROR_INTERNET_INVALID_PROXY_REQUEST    (INTERNET_ERROR_BASE + 33)
  2707. #define ERROR_INTERNET_NEED_UI                  (INTERNET_ERROR_BASE + 34)
  2708.  
  2709. #define ERROR_INTERNET_HANDLE_EXISTS            (INTERNET_ERROR_BASE + 36)
  2710. #define ERROR_INTERNET_SEC_CERT_DATE_INVALID    (INTERNET_ERROR_BASE + 37)
  2711. #define ERROR_INTERNET_SEC_CERT_CN_INVALID      (INTERNET_ERROR_BASE + 38)
  2712. #define ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR   (INTERNET_ERROR_BASE + 39)
  2713. #define ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR   (INTERNET_ERROR_BASE + 40)
  2714. #define ERROR_INTERNET_MIXED_SECURITY           (INTERNET_ERROR_BASE + 41)
  2715. #define ERROR_INTERNET_CHG_POST_IS_NON_SECURE   (INTERNET_ERROR_BASE + 42)
  2716. #define ERROR_INTERNET_POST_IS_NON_SECURE       (INTERNET_ERROR_BASE + 43)
  2717. #define ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED  (INTERNET_ERROR_BASE + 44)
  2718. #define ERROR_INTERNET_INVALID_CA               (INTERNET_ERROR_BASE + 45)
  2719. #define ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP    (INTERNET_ERROR_BASE + 46)
  2720. #define ERROR_INTERNET_ASYNC_THREAD_FAILED      (INTERNET_ERROR_BASE + 47)
  2721. #define ERROR_INTERNET_REDIRECT_SCHEME_CHANGE   (INTERNET_ERROR_BASE + 48)
  2722. #define ERROR_INTERNET_DIALOG_PENDING           (INTERNET_ERROR_BASE + 49)
  2723. #define ERROR_INTERNET_RETRY_DIALOG             (INTERNET_ERROR_BASE + 50)
  2724. #define ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR  (INTERNET_ERROR_BASE + 52)
  2725. #define ERROR_INTERNET_INSERT_CDROM             (INTERNET_ERROR_BASE + 53)
  2726. #define ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED    (INTERNET_ERROR_BASE + 54)
  2727. #define ERROR_INTERNET_SEC_CERT_ERRORS          (INTERNET_ERROR_BASE + 55)
  2728. #define ERROR_INTERNET_SEC_CERT_NO_REV          (INTERNET_ERROR_BASE + 56)
  2729. #define ERROR_INTERNET_SEC_CERT_REV_FAILED      (INTERNET_ERROR_BASE + 57)
  2730.  
  2731. //
  2732. // FTP API errors
  2733. //
  2734.  
  2735. #define ERROR_FTP_TRANSFER_IN_PROGRESS          (INTERNET_ERROR_BASE + 110)
  2736. #define ERROR_FTP_DROPPED                       (INTERNET_ERROR_BASE + 111)
  2737. #define ERROR_FTP_NO_PASSIVE_MODE               (INTERNET_ERROR_BASE + 112)
  2738.  
  2739. //
  2740. // gopher API errors
  2741. //
  2742.  
  2743. #define ERROR_GOPHER_PROTOCOL_ERROR             (INTERNET_ERROR_BASE + 130)
  2744. #define ERROR_GOPHER_NOT_FILE                   (INTERNET_ERROR_BASE + 131)
  2745. #define ERROR_GOPHER_DATA_ERROR                 (INTERNET_ERROR_BASE + 132)
  2746. #define ERROR_GOPHER_END_OF_DATA                (INTERNET_ERROR_BASE + 133)
  2747. #define ERROR_GOPHER_INVALID_LOCATOR            (INTERNET_ERROR_BASE + 134)
  2748. #define ERROR_GOPHER_INCORRECT_LOCATOR_TYPE     (INTERNET_ERROR_BASE + 135)
  2749. #define ERROR_GOPHER_NOT_GOPHER_PLUS            (INTERNET_ERROR_BASE + 136)
  2750. #define ERROR_GOPHER_ATTRIBUTE_NOT_FOUND        (INTERNET_ERROR_BASE + 137)
  2751. #define ERROR_GOPHER_UNKNOWN_LOCATOR            (INTERNET_ERROR_BASE + 138)
  2752.  
  2753. //
  2754. // HTTP API errors
  2755. //
  2756.  
  2757. #define ERROR_HTTP_HEADER_NOT_FOUND             (INTERNET_ERROR_BASE + 150)
  2758. #define ERROR_HTTP_DOWNLEVEL_SERVER             (INTERNET_ERROR_BASE + 151)
  2759. #define ERROR_HTTP_INVALID_SERVER_RESPONSE      (INTERNET_ERROR_BASE + 152)
  2760. #define ERROR_HTTP_INVALID_HEADER               (INTERNET_ERROR_BASE + 153)
  2761. #define ERROR_HTTP_INVALID_QUERY_REQUEST        (INTERNET_ERROR_BASE + 154)
  2762. #define ERROR_HTTP_HEADER_ALREADY_EXISTS        (INTERNET_ERROR_BASE + 155)
  2763. #define ERROR_HTTP_REDIRECT_FAILED              (INTERNET_ERROR_BASE + 156)
  2764. #define ERROR_HTTP_NOT_REDIRECTED               (INTERNET_ERROR_BASE + 160)
  2765. #define ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION    (INTERNET_ERROR_BASE + 161)
  2766. #define ERROR_HTTP_COOKIE_DECLINED              (INTERNET_ERROR_BASE + 162)
  2767. #define ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION  (INTERNET_ERROR_BASE + 168)
  2768.  
  2769. //
  2770. // additional Internet API error codes
  2771. //
  2772.  
  2773. #define ERROR_INTERNET_SECURITY_CHANNEL_ERROR   (INTERNET_ERROR_BASE + 157)
  2774. #define ERROR_INTERNET_UNABLE_TO_CACHE_FILE     (INTERNET_ERROR_BASE + 158)
  2775. #define ERROR_INTERNET_TCPIP_NOT_INSTALLED      (INTERNET_ERROR_BASE + 159)
  2776. #define ERROR_INTERNET_DISCONNECTED             (INTERNET_ERROR_BASE + 163)
  2777. #define ERROR_INTERNET_SERVER_UNREACHABLE       (INTERNET_ERROR_BASE + 164)
  2778. #define ERROR_INTERNET_PROXY_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 165)
  2779.  
  2780. #define ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT    (INTERNET_ERROR_BASE + 166)
  2781. #define ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT (INTERNET_ERROR_BASE + 167)
  2782. #define ERROR_INTERNET_SEC_INVALID_CERT         (INTERNET_ERROR_BASE + 169)
  2783. #define ERROR_INTERNET_SEC_CERT_REVOKED         (INTERNET_ERROR_BASE + 170)
  2784.  
  2785. // InternetAutodial specific errors
  2786.  
  2787. #define ERROR_INTERNET_FAILED_DUETOSECURITYCHECK  (INTERNET_ERROR_BASE + 171)
  2788. #define ERROR_INTERNET_NOT_INITIALIZED          (INTERNET_ERROR_BASE + 172)
  2789. #define ERROR_INTERNET_NEED_MSN_SSPI_PKG          (INTERNET_ERROR_BASE + 173)
  2790. #define ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY   (INTERNET_ERROR_BASE + 174)
  2791.  
  2792.  
  2793. #define INTERNET_ERROR_LAST                     ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY
  2794.  
  2795.  
  2796. //#endif // !defined(_WINERROR_)
  2797.  
  2798. //
  2799. // URLCACHE APIs
  2800. //
  2801.  
  2802. //
  2803. // datatype definitions.
  2804. //
  2805.  
  2806. //
  2807. // cache entry type flags.
  2808. //
  2809.  
  2810. #define NORMAL_CACHE_ENTRY              0x00000001
  2811. #define STICKY_CACHE_ENTRY              0x00000004
  2812. #define EDITED_CACHE_ENTRY              0x00000008
  2813. #define TRACK_OFFLINE_CACHE_ENTRY       0x00000010
  2814. #define TRACK_ONLINE_CACHE_ENTRY        0x00000020
  2815. #define SPARSE_CACHE_ENTRY              0x00010000
  2816. #define COOKIE_CACHE_ENTRY              0x00100000
  2817. #define URLHISTORY_CACHE_ENTRY          0x00200000
  2818.  
  2819.  
  2820. #define URLCACHE_FIND_DEFAULT_FILTER    NORMAL_CACHE_ENTRY             \
  2821.                                     |   COOKIE_CACHE_ENTRY             \
  2822.                                     |   URLHISTORY_CACHE_ENTRY         \
  2823.                                     |   TRACK_OFFLINE_CACHE_ENTRY      \
  2824.                                     |   TRACK_ONLINE_CACHE_ENTRY       \
  2825.                                     |   STICKY_CACHE_ENTRY
  2826.  
  2827.  
  2828.  
  2829. //
  2830. // INTERNET_CACHE_ENTRY_INFO -
  2831. //
  2832.  
  2833. #if _MSC_VER >= 1200
  2834. #pragma warning(push)
  2835. #endif
  2836. #pragma warning(disable:4201)
  2837.  
  2838. typedef struct _INTERNET_CACHE_ENTRY_INFOA {
  2839.     DWORD dwStructSize;         // version of cache system.
  2840.     LPSTR   lpszSourceUrlName;    // embedded pointer to the URL name string.
  2841.     LPSTR   lpszLocalFileName;  // embedded pointer to the local file name.
  2842.     DWORD CacheEntryType;       // cache type bit mask.
  2843.     DWORD dwUseCount;           // current users count of the cache entry.
  2844.     DWORD dwHitRate;            // num of times the cache entry was retrieved.
  2845.     DWORD dwSizeLow;            // low DWORD of the file size.
  2846.     DWORD dwSizeHigh;           // high DWORD of the file size.
  2847.     FILETIME LastModifiedTime;  // last modified time of the file in GMT format.
  2848.     FILETIME ExpireTime;        // expire time of the file in GMT format
  2849.     FILETIME LastAccessTime;    // last accessed time in GMT format
  2850.     FILETIME LastSyncTime;      // last time the URL was synchronized
  2851.                                 // with the source
  2852.     LPSTR   lpHeaderInfo;        // embedded pointer to the header info.
  2853.     DWORD dwHeaderInfoSize;     // size of the above header.
  2854.     LPSTR   lpszFileExtension;  // File extension used to retrive the urldata as a file.
  2855.         union {                     // Exemption delta from last access time.
  2856.                 DWORD dwReserved;
  2857.                 DWORD dwExemptDelta;
  2858.     };                          // Exemption delta from last access
  2859. } INTERNET_CACHE_ENTRY_INFOA, * LPINTERNET_CACHE_ENTRY_INFOA;
  2860. typedef struct _INTERNET_CACHE_ENTRY_INFOW {
  2861.     DWORD dwStructSize;         // version of cache system.
  2862.     LPWSTR  lpszSourceUrlName;    // embedded pointer to the URL name string.
  2863.     LPWSTR  lpszLocalFileName;  // embedded pointer to the local file name.
  2864.     DWORD CacheEntryType;       // cache type bit mask.
  2865.     DWORD dwUseCount;           // current users count of the cache entry.
  2866.     DWORD dwHitRate;            // num of times the cache entry was retrieved.
  2867.     DWORD dwSizeLow;            // low DWORD of the file size.
  2868.     DWORD dwSizeHigh;           // high DWORD of the file size.
  2869.     FILETIME LastModifiedTime;  // last modified time of the file in GMT format.
  2870.     FILETIME ExpireTime;        // expire time of the file in GMT format
  2871.     FILETIME LastAccessTime;    // last accessed time in GMT format
  2872.     FILETIME LastSyncTime;      // last time the URL was synchronized
  2873.                                 // with the source
  2874.     LPWSTR  lpHeaderInfo;        // embedded pointer to the header info.
  2875.     DWORD dwHeaderInfoSize;     // size of the above header.
  2876.     LPWSTR  lpszFileExtension;  // File extension used to retrive the urldata as a file.
  2877.         union {                     // Exemption delta from last access time.
  2878.                 DWORD dwReserved;
  2879.                 DWORD dwExemptDelta;
  2880.     };                          // Exemption delta from last access
  2881. } INTERNET_CACHE_ENTRY_INFOW, * LPINTERNET_CACHE_ENTRY_INFOW;
  2882. #ifdef UNICODE
  2883. typedef INTERNET_CACHE_ENTRY_INFOW INTERNET_CACHE_ENTRY_INFO;
  2884. typedef LPINTERNET_CACHE_ENTRY_INFOW LPINTERNET_CACHE_ENTRY_INFO;
  2885. #else
  2886. typedef INTERNET_CACHE_ENTRY_INFOA INTERNET_CACHE_ENTRY_INFO;
  2887. typedef LPINTERNET_CACHE_ENTRY_INFOA LPINTERNET_CACHE_ENTRY_INFO;
  2888. #endif // UNICODE
  2889.  
  2890. #if _MSC_VER >= 1200
  2891. #pragma warning(pop)
  2892. #else
  2893. #pragma warning(default:4201)
  2894. #endif
  2895.  
  2896. typedef struct _INTERNET_CACHE_TIMESTAMPS {
  2897.     FILETIME    ftExpires;
  2898.     FILETIME    ftLastModified;
  2899. } INTERNET_CACHE_TIMESTAMPS, *LPINTERNET_CACHE_TIMESTAMPS;
  2900.  
  2901.  
  2902.  
  2903. //
  2904. // Cache Group
  2905. //
  2906. typedef LONGLONG GROUPID;
  2907.  
  2908.  
  2909. //
  2910. // Cache Group Flags
  2911. //
  2912. #define CACHEGROUP_ATTRIBUTE_GET_ALL        0xffffffff
  2913. #define CACHEGROUP_ATTRIBUTE_BASIC          0x00000001
  2914. #define CACHEGROUP_ATTRIBUTE_FLAG           0x00000002
  2915. #define CACHEGROUP_ATTRIBUTE_TYPE           0x00000004
  2916. #define CACHEGROUP_ATTRIBUTE_QUOTA          0x00000008
  2917. #define CACHEGROUP_ATTRIBUTE_GROUPNAME      0x00000010
  2918. #define CACHEGROUP_ATTRIBUTE_STORAGE        0x00000020
  2919.  
  2920. #define CACHEGROUP_FLAG_NONPURGEABLE        0x00000001
  2921. #define CACHEGROUP_FLAG_GIDONLY             0x00000004
  2922.  
  2923. #define CACHEGROUP_FLAG_FLUSHURL_ONDELETE   0x00000002
  2924.  
  2925. #define CACHEGROUP_SEARCH_ALL               0x00000000
  2926. #define CACHEGROUP_SEARCH_BYURL             0x00000001
  2927.  
  2928. #define CACHEGROUP_TYPE_INVALID             0x00000001
  2929.  
  2930.  
  2931. //
  2932. // updatable cache group fields
  2933. //
  2934. #define CACHEGROUP_READWRITE_MASK                   \
  2935.             CACHEGROUP_ATTRIBUTE_TYPE               \
  2936.         |   CACHEGROUP_ATTRIBUTE_QUOTA              \
  2937.         |   CACHEGROUP_ATTRIBUTE_GROUPNAME          \
  2938.         |   CACHEGROUP_ATTRIBUTE_STORAGE
  2939.  
  2940. //
  2941. // INTERNET_CACHE_GROUP_INFO
  2942. //
  2943.  
  2944. #define  GROUPNAME_MAX_LENGTH       120
  2945. #define  GROUP_OWNER_STORAGE_SIZE   4
  2946. typedef struct _INTERNET_CACHE_GROUP_INFOA {
  2947.     DWORD           dwGroupSize;
  2948.     DWORD           dwGroupFlags;
  2949.     DWORD           dwGroupType;
  2950.     DWORD           dwDiskUsage;    // in KB
  2951.     DWORD           dwDiskQuota;    // in KB
  2952.     DWORD           dwOwnerStorage[GROUP_OWNER_STORAGE_SIZE];
  2953.     CHAR            szGroupName[GROUPNAME_MAX_LENGTH];
  2954. } INTERNET_CACHE_GROUP_INFOA, * LPINTERNET_CACHE_GROUP_INFOA;
  2955. typedef struct _INTERNET_CACHE_GROUP_INFOW {
  2956.     DWORD           dwGroupSize;
  2957.     DWORD           dwGroupFlags;
  2958.     DWORD           dwGroupType;
  2959.     DWORD           dwDiskUsage;    // in KB
  2960.     DWORD           dwDiskQuota;    // in KB
  2961.     DWORD           dwOwnerStorage[GROUP_OWNER_STORAGE_SIZE];
  2962.     WCHAR           szGroupName[GROUPNAME_MAX_LENGTH];
  2963. } INTERNET_CACHE_GROUP_INFOW, * LPINTERNET_CACHE_GROUP_INFOW;
  2964. #ifdef UNICODE
  2965. typedef INTERNET_CACHE_GROUP_INFOW INTERNET_CACHE_GROUP_INFO;
  2966. typedef LPINTERNET_CACHE_GROUP_INFOW LPINTERNET_CACHE_GROUP_INFO;
  2967. #else
  2968. typedef INTERNET_CACHE_GROUP_INFOA INTERNET_CACHE_GROUP_INFO;
  2969. typedef LPINTERNET_CACHE_GROUP_INFOA LPINTERNET_CACHE_GROUP_INFO;
  2970. #endif // UNICODE
  2971.  
  2972.  
  2973.  
  2974. //
  2975. // Cache APIs
  2976. //
  2977.  
  2978. BOOLAPI
  2979. CreateUrlCacheEntryA(
  2980.     IN LPCSTR lpszUrlName,
  2981.     IN DWORD dwExpectedFileSize,
  2982.     IN LPCSTR lpszFileExtension,
  2983.     OUT LPSTR lpszFileName,
  2984.     IN DWORD dwReserved
  2985.     );
  2986. BOOLAPI
  2987. CreateUrlCacheEntryW(
  2988.     IN LPCWSTR lpszUrlName,
  2989.     IN DWORD dwExpectedFileSize,
  2990.     IN LPCWSTR lpszFileExtension,
  2991.     OUT LPWSTR lpszFileName,
  2992.     IN DWORD dwReserved
  2993.     );
  2994. #ifdef UNICODE
  2995. #define CreateUrlCacheEntry  CreateUrlCacheEntryW
  2996. #else
  2997. #define CreateUrlCacheEntry  CreateUrlCacheEntryA
  2998. #endif // !UNICODE
  2999.  
  3000. #ifndef USE_FIXED_COMMIT_URL_CACHE_ENTRY
  3001. // Temporary state of affairs until we reconcile our apis.
  3002.  
  3003. // Why are we doing this? HeaderInfo _should_ be string data.
  3004. // However, one group is passing binary data instead. For the
  3005. // unicode api, we've decided to disallow this, but this
  3006. // brings up an inconsistency between the u and a apis, which
  3007. // is undesirable.
  3008.  
  3009. // For Beta 1, we'll go with this behaviour, but in future releases
  3010. // we want to make these apis consistent.
  3011.  
  3012. BOOLAPI
  3013. CommitUrlCacheEntryA(
  3014.     IN LPCSTR lpszUrlName,
  3015.     IN LPCSTR lpszLocalFileName,
  3016.     IN FILETIME ExpireTime,
  3017.     IN FILETIME LastModifiedTime,
  3018.     IN DWORD CacheEntryType,
  3019.     IN LPBYTE lpHeaderInfo,
  3020.     IN DWORD dwHeaderSize,
  3021.     IN LPCSTR lpszFileExtension,
  3022.     IN LPCSTR lpszOriginalUrl
  3023.     );
  3024. BOOLAPI
  3025. CommitUrlCacheEntryW(
  3026.     IN LPCWSTR lpszUrlName,
  3027.     IN LPCWSTR lpszLocalFileName,
  3028.     IN FILETIME ExpireTime,
  3029.     IN FILETIME LastModifiedTime,
  3030.     IN DWORD CacheEntryType,
  3031.     IN LPWSTR lpHeaderInfo,
  3032.     IN DWORD dwHeaderSize,
  3033.     IN LPCWSTR lpszFileExtension,
  3034.     IN LPCWSTR lpszOriginalUrl
  3035.     );
  3036.  
  3037. #ifdef UNICODE
  3038. #define CommitUrlCacheEntry CommitUrlCacheEntryW
  3039. #else
  3040. #define CommitUrlCacheEntry CommitUrlCacheEntryA
  3041. #endif
  3042.  
  3043. #else
  3044. CommitUrlCacheEntryA(
  3045.     IN LPCSTR lpszUrlName,
  3046.     IN LPCSTR lpszLocalFileName,
  3047.     IN FILETIME ExpireTime,
  3048.     IN FILETIME LastModifiedTime,
  3049.     IN DWORD CacheEntryType,
  3050.     IN LPCSTR lpHeaderInfo,
  3051.     IN DWORD dwHeaderSize,
  3052.     IN LPCSTR lpszFileExtension,
  3053.     IN LPCSTR lpszOriginalUrl
  3054.     );
  3055. CommitUrlCacheEntryW(
  3056.     IN LPCWSTR lpszUrlName,
  3057.     IN LPCWSTR lpszLocalFileName,
  3058.     IN FILETIME ExpireTime,
  3059.     IN FILETIME LastModifiedTime,
  3060.     IN DWORD CacheEntryType,
  3061.     IN LPCWSTR lpHeaderInfo,
  3062.     IN DWORD dwHeaderSize,
  3063.     IN LPCWSTR lpszFileExtension,
  3064.     IN LPCWSTR lpszOriginalUrl
  3065.     );
  3066. #ifdef UNICODE
  3067. #define CommitUrlCacheEntry  CommitUrlCacheEntryW
  3068. #else
  3069. #define CommitUrlCacheEntry  CommitUrlCacheEntryA
  3070. #endif // !UNICODE
  3071. #endif
  3072.  
  3073. BOOLAPI
  3074. RetrieveUrlCacheEntryFileA(
  3075.     IN LPCSTR  lpszUrlName,
  3076.     OUT LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
  3077.     IN OUT LPDWORD lpdwCacheEntryInfoBufferSize,
  3078.     IN DWORD dwReserved
  3079.     );
  3080. BOOLAPI
  3081. RetrieveUrlCacheEntryFileW(
  3082.     IN LPCWSTR  lpszUrlName,
  3083.     OUT LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
  3084.     IN OUT LPDWORD lpdwCacheEntryInfoBufferSize,
  3085.     IN DWORD dwReserved
  3086.     );
  3087. #ifdef UNICODE
  3088. #define RetrieveUrlCacheEntryFile  RetrieveUrlCacheEntryFileW
  3089. #else
  3090. #define RetrieveUrlCacheEntryFile  RetrieveUrlCacheEntryFileA
  3091. #endif // !UNICODE
  3092.  
  3093. BOOLAPI
  3094. UnlockUrlCacheEntryFileA(
  3095.     IN LPCSTR lpszUrlName,
  3096.     IN DWORD dwReserved
  3097.     );
  3098.  
  3099. BOOLAPI
  3100. UnlockUrlCacheEntryFileW(
  3101.     IN LPCWSTR lpszUrlName,
  3102.     IN DWORD dwReserved
  3103.     );
  3104.  
  3105.     
  3106.  
  3107. #ifdef UNICODE
  3108. #define UnlockUrlCacheEntryFile  UnlockUrlCacheEntryFileW
  3109. #else
  3110. #ifdef _WINX32_
  3111. #define UnlockUrlCacheEntryFile  UnlockUrlCacheEntryFileA
  3112. #else
  3113. BOOLAPI
  3114. UnlockUrlCacheEntryFile(
  3115.     IN LPCSTR lpszUrlName,
  3116.     IN DWORD dwReserved
  3117.     );
  3118. #endif // _WINX32_
  3119. #endif // !UNICODE
  3120.  
  3121. INTERNETAPI
  3122. HANDLE
  3123. WINAPI
  3124. RetrieveUrlCacheEntryStreamA(
  3125.     IN LPCSTR  lpszUrlName,
  3126.     OUT LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
  3127.     IN OUT LPDWORD lpdwCacheEntryInfoBufferSize,
  3128.     IN BOOL fRandomRead,
  3129.     IN DWORD dwReserved
  3130.     );
  3131. INTERNETAPI
  3132. HANDLE
  3133. WINAPI
  3134. RetrieveUrlCacheEntryStreamW(
  3135.     IN LPCWSTR  lpszUrlName,
  3136.     OUT LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
  3137.     IN OUT LPDWORD lpdwCacheEntryInfoBufferSize,
  3138.     IN BOOL fRandomRead,
  3139.     IN DWORD dwReserved
  3140.     );
  3141. #ifdef UNICODE
  3142. #define RetrieveUrlCacheEntryStream  RetrieveUrlCacheEntryStreamW
  3143. #else
  3144. #define RetrieveUrlCacheEntryStream  RetrieveUrlCacheEntryStreamA
  3145. #endif // !UNICODE
  3146.  
  3147. BOOLAPI
  3148. ReadUrlCacheEntryStream(
  3149.     IN HANDLE hUrlCacheStream,
  3150.     IN DWORD dwLocation,
  3151.     IN OUT LPVOID lpBuffer,
  3152.     IN OUT LPDWORD lpdwLen,
  3153.     IN DWORD Reserved
  3154.     );
  3155.  
  3156. BOOLAPI
  3157. UnlockUrlCacheEntryStream(
  3158.     IN HANDLE hUrlCacheStream,
  3159.     IN DWORD Reserved
  3160.     );
  3161.  
  3162.  
  3163. BOOLAPI
  3164. GetUrlCacheEntryInfoA(
  3165.     IN LPCSTR lpszUrlName,
  3166.     OUT LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
  3167.     IN OUT LPDWORD lpdwCacheEntryInfoBufferSize
  3168.     );
  3169. BOOLAPI
  3170. GetUrlCacheEntryInfoW(
  3171.     IN LPCWSTR lpszUrlName,
  3172.     OUT LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
  3173.     IN OUT LPDWORD lpdwCacheEntryInfoBufferSize
  3174.     );
  3175. #ifdef UNICODE
  3176. #define GetUrlCacheEntryInfo  GetUrlCacheEntryInfoW
  3177. #else
  3178. #define GetUrlCacheEntryInfo  GetUrlCacheEntryInfoA
  3179. #endif // !UNICODE
  3180.  
  3181.  
  3182. URLCACHEAPI
  3183. HANDLE
  3184. WINAPI
  3185. FindFirstUrlCacheGroup(
  3186.     IN      DWORD                           dwFlags,
  3187.     IN      DWORD                           dwFilter,
  3188.     IN      LPVOID                          lpSearchCondition,
  3189.     IN      DWORD                           dwSearchCondition,
  3190.     OUT     GROUPID*                        lpGroupId,
  3191.     IN OUT  LPVOID                          lpReserved
  3192.     );
  3193.  
  3194. URLCACHEAPI
  3195. BOOL
  3196. WINAPI
  3197. FindNextUrlCacheGroup(
  3198.     IN HANDLE                               hFind,
  3199.     OUT GROUPID*                            lpGroupId,
  3200.     IN OUT  LPVOID                          lpReserved
  3201.     );
  3202.  
  3203.  
  3204. URLCACHEAPI
  3205. BOOL
  3206. WINAPI
  3207. GetUrlCacheGroupAttributeA(
  3208.     IN      GROUPID                         gid,
  3209.     IN      DWORD                           dwFlags,
  3210.     IN      DWORD                           dwAttributes,
  3211.     OUT     LPINTERNET_CACHE_GROUP_INFOA    lpGroupInfo,
  3212.     IN OUT  LPDWORD                         lpdwGroupInfo,
  3213.     IN OUT  LPVOID                          lpReserved
  3214.     );
  3215. URLCACHEAPI
  3216. BOOL
  3217. WINAPI
  3218. GetUrlCacheGroupAttributeW(
  3219.     IN      GROUPID                         gid,
  3220.     IN      DWORD                           dwFlags,
  3221.     IN      DWORD                           dwAttributes,
  3222.     OUT     LPINTERNET_CACHE_GROUP_INFOW    lpGroupInfo,
  3223.     IN OUT  LPDWORD                         lpdwGroupInfo,
  3224.     IN OUT  LPVOID                          lpReserved
  3225.     );
  3226. #ifdef UNICODE
  3227. #define GetUrlCacheGroupAttribute  GetUrlCacheGroupAttributeW
  3228. #else
  3229. #define GetUrlCacheGroupAttribute  GetUrlCacheGroupAttributeA
  3230. #endif // !UNICODE
  3231.  
  3232. URLCACHEAPI
  3233. BOOL
  3234. WINAPI
  3235. SetUrlCacheGroupAttributeA(
  3236.     IN      GROUPID                         gid,
  3237.     IN      DWORD                           dwFlags,
  3238.     IN      DWORD                           dwAttributes,
  3239.     IN      LPINTERNET_CACHE_GROUP_INFOA    lpGroupInfo,
  3240.     IN OUT  LPVOID                          lpReserved
  3241.     );
  3242. URLCACHEAPI
  3243. BOOL
  3244. WINAPI
  3245. SetUrlCacheGroupAttributeW(
  3246.     IN      GROUPID                         gid,
  3247.     IN      DWORD                           dwFlags,
  3248.     IN      DWORD                           dwAttributes,
  3249.     IN      LPINTERNET_CACHE_GROUP_INFOW    lpGroupInfo,
  3250.     IN OUT  LPVOID                          lpReserved
  3251.     );
  3252. #ifdef UNICODE
  3253. #define SetUrlCacheGroupAttribute  SetUrlCacheGroupAttributeW
  3254. #else
  3255. #define SetUrlCacheGroupAttribute  SetUrlCacheGroupAttributeA
  3256. #endif // !UNICODE
  3257.  
  3258.  
  3259. INTERNETAPI
  3260. GROUPID
  3261. WINAPI
  3262. CreateUrlCacheGroup(
  3263.     IN      DWORD                           dwFlags,
  3264.     IN      LPVOID                          lpReserved
  3265.     );
  3266.  
  3267. BOOLAPI
  3268. DeleteUrlCacheGroup(
  3269.     IN      GROUPID                         GroupId,
  3270.     IN      DWORD                           dwFlags,
  3271.     IN      LPVOID                          lpReserved
  3272.     );
  3273.  
  3274.  
  3275. BOOLAPI
  3276. GetUrlCacheEntryInfoExA(
  3277.     IN LPCSTR lpszUrl,
  3278.     OUT LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
  3279.     IN OUT LPDWORD lpdwCacheEntryInfoBufSize,
  3280.     OUT LPSTR      lpszReserved,  // must pass null
  3281.     IN OUT LPDWORD lpdwReserved,  // must pass null
  3282.     LPVOID         lpReserved,    // must pass null
  3283.     DWORD          dwFlags        // reserved
  3284.     );
  3285. BOOLAPI
  3286. GetUrlCacheEntryInfoExW(
  3287.     IN LPCWSTR lpszUrl,
  3288.     OUT LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
  3289.     IN OUT LPDWORD lpdwCacheEntryInfoBufSize,
  3290.     OUT LPWSTR      lpszReserved,  // must pass null
  3291.     IN OUT LPDWORD lpdwReserved,  // must pass null
  3292.     LPVOID         lpReserved,    // must pass null
  3293.     DWORD          dwFlags        // reserved
  3294.     );
  3295. #ifdef UNICODE
  3296. #define GetUrlCacheEntryInfoEx  GetUrlCacheEntryInfoExW
  3297. #else
  3298. #define GetUrlCacheEntryInfoEx  GetUrlCacheEntryInfoExA
  3299. #endif // !UNICODE
  3300.  
  3301. #define CACHE_ENTRY_ATTRIBUTE_FC    0x00000004
  3302. #define CACHE_ENTRY_HITRATE_FC      0x00000010
  3303. #define CACHE_ENTRY_MODTIME_FC      0x00000040
  3304. #define CACHE_ENTRY_EXPTIME_FC      0x00000080
  3305. #define CACHE_ENTRY_ACCTIME_FC      0x00000100
  3306. #define CACHE_ENTRY_SYNCTIME_FC     0x00000200
  3307. #define CACHE_ENTRY_HEADERINFO_FC   0x00000400
  3308. #define CACHE_ENTRY_EXEMPT_DELTA_FC 0x00000800
  3309.  
  3310.  
  3311. BOOLAPI
  3312. SetUrlCacheEntryInfoA(
  3313.     IN LPCSTR lpszUrlName,
  3314.     IN LPINTERNET_CACHE_ENTRY_INFOA lpCacheEntryInfo,
  3315.     IN DWORD dwFieldControl
  3316.     );
  3317. BOOLAPI
  3318. SetUrlCacheEntryInfoW(
  3319.     IN LPCWSTR lpszUrlName,
  3320.     IN LPINTERNET_CACHE_ENTRY_INFOW lpCacheEntryInfo,
  3321.     IN DWORD dwFieldControl
  3322.     );
  3323. #ifdef UNICODE
  3324. #define SetUrlCacheEntryInfo  SetUrlCacheEntryInfoW
  3325. #else
  3326. #define SetUrlCacheEntryInfo  SetUrlCacheEntryInfoA
  3327. #endif // !UNICODE
  3328.  
  3329. //
  3330. // Cache Group Functions
  3331. //
  3332.  
  3333.  
  3334. INTERNETAPI
  3335. GROUPID
  3336. WINAPI
  3337. CreateUrlCacheGroup(
  3338.     IN DWORD  dwFlags,
  3339.     IN LPVOID lpReserved  // must pass NULL
  3340.     );
  3341.  
  3342. BOOLAPI
  3343. DeleteUrlCacheGroup(
  3344.     IN  GROUPID GroupId,
  3345.     IN  DWORD   dwFlags,       // must pass 0
  3346.     IN  LPVOID  lpReserved     // must pass NULL
  3347.     );
  3348.  
  3349. // Flags for SetUrlCacheEntryGroup
  3350. #define INTERNET_CACHE_GROUP_ADD      0
  3351. #define INTERNET_CACHE_GROUP_REMOVE   1
  3352.  
  3353. BOOLAPI
  3354. SetUrlCacheEntryGroupA(
  3355.     IN LPCSTR   lpszUrlName,
  3356.     IN DWORD    dwFlags,
  3357.     IN GROUPID  GroupId,
  3358.     IN LPBYTE   pbGroupAttributes, // must pass NULL
  3359.     IN DWORD    cbGroupAttributes, // must pass 0
  3360.     IN LPVOID   lpReserved         // must pass NULL
  3361.     );
  3362.  
  3363. BOOLAPI
  3364. SetUrlCacheEntryGroupW(
  3365.     IN LPCWSTR   lpszUrlName,
  3366.     IN DWORD    dwFlags,
  3367.     IN GROUPID  GroupId,
  3368.     IN LPBYTE   pbGroupAttributes, // must pass NULL
  3369.     IN DWORD    cbGroupAttributes, // must pass 0
  3370.     IN LPVOID   lpReserved         // must pass NULL
  3371.     );
  3372.  
  3373. #ifdef UNICODE
  3374. #define SetUrlCacheEntryGroup  SetUrlCacheEntryGroupW
  3375. #else
  3376. #ifdef _WINX32_
  3377. #define SetUrlCacheEntryGroup  SetUrlCacheEntryGroupA
  3378. #else
  3379. BOOLAPI
  3380. SetUrlCacheEntryGroup(
  3381.     IN LPCSTR   lpszUrlName,
  3382.     IN DWORD    dwFlags,
  3383.     IN GROUPID  GroupId,
  3384.     IN LPBYTE   pbGroupAttributes, // must pass NULL
  3385.     IN DWORD    cbGroupAttributes, // must pass 0
  3386.     IN LPVOID   lpReserved         // must pass NULL
  3387.     );
  3388. #endif // _WINX32_
  3389. #endif // !UNICODE
  3390.  
  3391. INTERNETAPI
  3392. HANDLE
  3393. WINAPI
  3394. FindFirstUrlCacheEntryExA(
  3395.     IN     LPCSTR    lpszUrlSearchPattern,
  3396.     IN     DWORD     dwFlags,
  3397.     IN     DWORD     dwFilter,
  3398.     IN     GROUPID   GroupId,
  3399.     OUT    LPINTERNET_CACHE_ENTRY_INFOA lpFirstCacheEntryInfo,
  3400.     IN OUT LPDWORD   lpdwFirstCacheEntryInfoBufferSize,
  3401.     OUT    LPVOID    lpReserved,     // must pass NULL
  3402.     IN OUT LPDWORD   pcbReserved2,   // must pass NULL
  3403.     IN     LPVOID    lpReserved3     // must pass NULL
  3404.     );
  3405. INTERNETAPI
  3406. HANDLE
  3407. WINAPI
  3408. FindFirstUrlCacheEntryExW(
  3409.     IN     LPCWSTR    lpszUrlSearchPattern,
  3410.     IN     DWORD     dwFlags,
  3411.     IN     DWORD     dwFilter,
  3412.     IN     GROUPID   GroupId,
  3413.     OUT    LPINTERNET_CACHE_ENTRY_INFOW lpFirstCacheEntryInfo,
  3414.     IN OUT LPDWORD   lpdwFirstCacheEntryInfoBufferSize,
  3415.     OUT    LPVOID    lpReserved,     // must pass NULL
  3416.     IN OUT LPDWORD   pcbReserved2,   // must pass NULL
  3417.     IN     LPVOID    lpReserved3     // must pass NULL
  3418.     );
  3419. #ifdef UNICODE
  3420. #define FindFirstUrlCacheEntryEx  FindFirstUrlCacheEntryExW
  3421. #else
  3422. #define FindFirstUrlCacheEntryEx  FindFirstUrlCacheEntryExA
  3423. #endif // !UNICODE
  3424.  
  3425. BOOLAPI
  3426. FindNextUrlCacheEntryExA(
  3427.     IN     HANDLE    hEnumHandle,
  3428.     OUT    LPINTERNET_CACHE_ENTRY_INFOA lpFirstCacheEntryInfo,
  3429.     IN OUT LPDWORD   lpdwFirstCacheEntryInfoBufferSize,
  3430.     OUT    LPVOID    lpReserved,     // must pass NULL
  3431.     IN OUT LPDWORD   pcbReserved2,   // must pass NULL
  3432.     IN     LPVOID    lpReserved3     // must pass NULL
  3433.     );
  3434. BOOLAPI
  3435. FindNextUrlCacheEntryExW(
  3436.     IN     HANDLE    hEnumHandle,
  3437.     OUT    LPINTERNET_CACHE_ENTRY_INFOW lpFirstCacheEntryInfo,
  3438.     IN OUT LPDWORD   lpdwFirstCacheEntryInfoBufferSize,
  3439.     OUT    LPVOID    lpReserved,     // must pass NULL
  3440.     IN OUT LPDWORD   pcbReserved2,   // must pass NULL
  3441.     IN     LPVOID    lpReserved3     // must pass NULL
  3442.     );
  3443. #ifdef UNICODE
  3444. #define FindNextUrlCacheEntryEx  FindNextUrlCacheEntryExW
  3445. #else
  3446. #define FindNextUrlCacheEntryEx  FindNextUrlCacheEntryExA
  3447. #endif // !UNICODE
  3448.  
  3449. INTERNETAPI
  3450. HANDLE
  3451. WINAPI
  3452. FindFirstUrlCacheEntryA(
  3453.     IN LPCSTR lpszUrlSearchPattern,
  3454.     OUT LPINTERNET_CACHE_ENTRY_INFOA lpFirstCacheEntryInfo,
  3455.     IN OUT LPDWORD lpdwFirstCacheEntryInfoBufferSize
  3456.     );
  3457. INTERNETAPI
  3458. HANDLE
  3459. WINAPI
  3460. FindFirstUrlCacheEntryW(
  3461.     IN LPCWSTR lpszUrlSearchPattern,
  3462.     OUT LPINTERNET_CACHE_ENTRY_INFOW lpFirstCacheEntryInfo,
  3463.     IN OUT LPDWORD lpdwFirstCacheEntryInfoBufferSize
  3464.     );
  3465. #ifdef UNICODE
  3466. #define FindFirstUrlCacheEntry  FindFirstUrlCacheEntryW
  3467. #else
  3468. #define FindFirstUrlCacheEntry  FindFirstUrlCacheEntryA
  3469. #endif // !UNICODE
  3470.  
  3471. BOOLAPI
  3472. FindNextUrlCacheEntryA(
  3473.     IN HANDLE hEnumHandle,
  3474.     OUT LPINTERNET_CACHE_ENTRY_INFOA lpNextCacheEntryInfo,
  3475.     IN OUT LPDWORD lpdwNextCacheEntryInfoBufferSize
  3476.     );
  3477. BOOLAPI
  3478. FindNextUrlCacheEntryW(
  3479.     IN HANDLE hEnumHandle,
  3480.     OUT LPINTERNET_CACHE_ENTRY_INFOW lpNextCacheEntryInfo,
  3481.     IN OUT LPDWORD lpdwNextCacheEntryInfoBufferSize
  3482.     );
  3483. #ifdef UNICODE
  3484. #define FindNextUrlCacheEntry  FindNextUrlCacheEntryW
  3485. #else
  3486. #define FindNextUrlCacheEntry  FindNextUrlCacheEntryA
  3487. #endif // !UNICODE
  3488.  
  3489.  
  3490. BOOLAPI
  3491. FindCloseUrlCache(
  3492.     IN HANDLE hEnumHandle
  3493.     );
  3494.  
  3495. BOOLAPI
  3496. DeleteUrlCacheEntryA(
  3497.     IN LPCSTR lpszUrlName
  3498.     );
  3499.  
  3500. BOOLAPI
  3501. DeleteUrlCacheEntryW(
  3502.     IN LPCWSTR lpszUrlName
  3503.     );
  3504.  
  3505. #ifdef UNICODE
  3506. #define DeleteUrlCacheEntry  DeleteUrlCacheEntryW
  3507. #else
  3508. #ifdef _WINX32_
  3509. #define DeleteUrlCacheEntry  DeleteUrlCacheEntryA
  3510. #else
  3511. BOOLAPI
  3512. DeleteUrlCacheEntry(
  3513.     IN LPCSTR lpszUrlName
  3514.     );
  3515. #endif // _WINX32_
  3516. #endif // !UNICODE
  3517.  
  3518.  
  3519.  
  3520. //
  3521. // Autodial APIs
  3522. //
  3523.  
  3524. INTERNETAPI
  3525. DWORD
  3526. WINAPI
  3527. InternetDialA(
  3528.     IN HWND     hwndParent,
  3529.     IN LPSTR   lpszConnectoid,
  3530.     IN DWORD    dwFlags,
  3531.     OUT DWORD_PTR *lpdwConnection,
  3532.     IN DWORD    dwReserved
  3533.     );
  3534.  
  3535. INTERNETAPI
  3536. DWORD
  3537. WINAPI
  3538. InternetDialW(
  3539.     IN HWND     hwndParent,
  3540.     IN LPWSTR   lpszConnectoid,
  3541.     IN DWORD    dwFlags,
  3542.     OUT DWORD_PTR *lpdwConnection,
  3543.     IN DWORD    dwReserved
  3544.     );
  3545.  
  3546. #ifdef UNICODE
  3547. #define InternetDial  InternetDialW
  3548. #else
  3549. #ifdef _WINX32_
  3550. #define InternetDial  InternetDialA
  3551. #else
  3552. INTERNETAPI
  3553. DWORD
  3554. WINAPI
  3555. InternetDial(
  3556.     IN HWND     hwndParent,
  3557.     IN LPSTR   lpszConnectoid,
  3558.     IN DWORD    dwFlags,
  3559.     OUT LPDWORD lpdwConnection,
  3560.     IN DWORD    dwReserved
  3561.     );
  3562. #endif // _WINX32_
  3563. #endif // !UNICODE
  3564.  
  3565. // Flags for InternetDial - must not conflict with InternetAutodial flags
  3566. //                          as they are valid here also.
  3567. #define INTERNET_DIAL_FORCE_PROMPT     0x2000
  3568. #define INTERNET_DIAL_SHOW_OFFLINE     0x4000
  3569. #define INTERNET_DIAL_UNATTENDED       0x8000
  3570.  
  3571. INTERNETAPI
  3572. DWORD
  3573. WINAPI
  3574. InternetHangUp(
  3575.     IN DWORD    dwConnection,
  3576.     IN DWORD    dwReserved);
  3577.  
  3578. #define INTERENT_GOONLINE_REFRESH 0x00000001
  3579. #define INTERENT_GOONLINE_MASK 0x00000001
  3580.  
  3581. INTERNETAPI
  3582. BOOL
  3583. WINAPI
  3584. InternetGoOnlineA(
  3585.     IN LPSTR   lpszURL,
  3586.     IN HWND     hwndParent,
  3587.     IN DWORD    dwFlags
  3588.     );
  3589.  
  3590. INTERNETAPI
  3591. BOOL
  3592. WINAPI
  3593. InternetGoOnlineW(
  3594.     IN LPWSTR   lpszURL,
  3595.     IN HWND     hwndParent,
  3596.     IN DWORD    dwFlags
  3597.     );
  3598.  
  3599. #ifdef UNICODE
  3600. #define InternetGoOnline  InternetGoOnlineW
  3601. #else
  3602. #ifdef _WINX32_
  3603. #define InternetGoOnline  InternetGoOnlineA
  3604. #else
  3605. INTERNETAPI
  3606. BOOL
  3607. WINAPI
  3608. InternetGoOnline(
  3609.     IN LPSTR   lpszURL,
  3610.     IN HWND     hwndParent,
  3611.     IN DWORD    dwFlags
  3612.     );
  3613. #endif // _WINX32_
  3614. #endif // !UNICODE
  3615.  
  3616. INTERNETAPI
  3617. BOOL
  3618. WINAPI
  3619. InternetAutodial(
  3620.     IN DWORD    dwFlags,
  3621.     IN HWND     hwndParent);
  3622.  
  3623. // Flags for InternetAutodial
  3624. #define INTERNET_AUTODIAL_FORCE_ONLINE          1
  3625. #define INTERNET_AUTODIAL_FORCE_UNATTENDED      2
  3626. #define INTERNET_AUTODIAL_FAILIFSECURITYCHECK   4
  3627.  
  3628. #define INTERNET_AUTODIAL_FLAGS_MASK (INTERNET_AUTODIAL_FORCE_ONLINE | INTERNET_AUTODIAL_FORCE_UNATTENDED | INTERNET_AUTODIAL_FAILIFSECURITYCHECK)
  3629. INTERNETAPI
  3630. BOOL
  3631. WINAPI
  3632. InternetAutodialHangup(
  3633.     IN DWORD    dwReserved);
  3634.  
  3635. INTERNETAPI
  3636. BOOL
  3637. WINAPI
  3638. InternetGetConnectedState(
  3639.     OUT LPDWORD  lpdwFlags,
  3640.     IN DWORD    dwReserved);
  3641.  
  3642. INTERNETAPI
  3643. BOOL
  3644. WINAPI
  3645. InternetGetConnectedStateExA(
  3646.     OUT LPDWORD lpdwFlags,
  3647.     OUT LPSTR  lpszConnectionName,
  3648.     IN DWORD    dwNameLen,
  3649.     IN DWORD    dwReserved
  3650.     );
  3651.  
  3652. INTERNETAPI
  3653. BOOL
  3654. WINAPI
  3655. InternetGetConnectedStateExW(
  3656.     OUT LPDWORD lpdwFlags,
  3657.     OUT LPWSTR  lpszConnectionName,
  3658.     IN DWORD    dwNameLen,
  3659.     IN DWORD    dwReserved
  3660.     );
  3661.  
  3662. #ifdef UNUSED
  3663. INTERNETAPI
  3664. BOOL
  3665. WINAPI
  3666. InternetInitializeAutoProxyDll(
  3667.     DWORD dwReserved
  3668.     );
  3669. #endif
  3670.     
  3671. #ifdef UNICODE
  3672. #define InternetGetConnectedStateEx  InternetGetConnectedStateExW
  3673. #else
  3674. #ifdef _WINX32_
  3675. #define InternetGetConnectedStateEx  InternetGetConnectedStateExA
  3676. #else
  3677. INTERNETAPI
  3678. BOOL
  3679. WINAPI
  3680. InternetGetConnectedStateEx(
  3681.     OUT LPDWORD lpdwFlags,
  3682.     IN LPSTR  lpszConnectionName,
  3683.     IN DWORD    dwNameLen,
  3684.     IN DWORD    dwReserved
  3685.     );
  3686. #endif // _WINX32_
  3687. #endif // !UNICODE
  3688.  
  3689. // Flags for InternetGetConnectedState and Ex
  3690. #define INTERNET_CONNECTION_MODEM           0x01
  3691. #define INTERNET_CONNECTION_LAN             0x02
  3692. #define INTERNET_CONNECTION_PROXY           0x04
  3693. #define INTERNET_CONNECTION_MODEM_BUSY      0x08  /* no longer used */
  3694. #define INTERNET_RAS_INSTALLED              0x10
  3695. #define INTERNET_CONNECTION_OFFLINE         0x20
  3696. #define INTERNET_CONNECTION_CONFIGURED      0x40
  3697.  
  3698. //
  3699. // Custom dial handler functions
  3700. //
  3701.  
  3702. // Custom dial handler prototype
  3703. typedef DWORD (CALLBACK * PFN_DIAL_HANDLER) (HWND, LPCSTR, DWORD, LPDWORD);
  3704.  
  3705. // Flags for custom dial handler
  3706. #define INTERNET_CUSTOMDIAL_CONNECT         0
  3707. #define INTERNET_CUSTOMDIAL_UNATTENDED      1
  3708. #define INTERNET_CUSTOMDIAL_DISCONNECT      2
  3709. #define INTERNET_CUSTOMDIAL_SHOWOFFLINE     4
  3710.  
  3711. // Custom dial handler supported functionality flags
  3712. #define INTERNET_CUSTOMDIAL_SAFE_FOR_UNATTENDED 1
  3713. #define INTERNET_CUSTOMDIAL_WILL_SUPPLY_STATE   2
  3714. #define INTERNET_CUSTOMDIAL_CAN_HANGUP          4
  3715.  
  3716. INTERNETAPI
  3717. BOOL
  3718. WINAPI
  3719. InternetSetDialStateA(
  3720.     IN LPCSTR lpszConnectoid,
  3721.     IN DWORD    dwState,
  3722.     IN DWORD    dwReserved
  3723.     );
  3724.  
  3725. INTERNETAPI
  3726. BOOL
  3727. WINAPI
  3728. InternetSetDialStateW(
  3729.     IN LPCWSTR lpszConnectoid,
  3730.     IN DWORD    dwState,
  3731.     IN DWORD    dwReserved
  3732.     );
  3733.  
  3734. #ifdef UNICODE
  3735. #define InternetSetDialState  InternetSetDialStateW
  3736. #else
  3737. #ifdef _WINX32_
  3738. #define InternetSetDialState  InternetSetDialStateA
  3739. #else
  3740. INTERNETAPI
  3741. BOOL
  3742. WINAPI
  3743. InternetSetDialState(
  3744.     IN LPCSTR lpszConnectoid,
  3745.     IN DWORD    dwState,
  3746.     IN DWORD    dwReserved
  3747.     );
  3748. #endif // _WINX32_
  3749. #endif // !UNICODE
  3750.  
  3751. // States for InternetSetDialState
  3752. #define INTERNET_DIALSTATE_DISCONNECTED     1
  3753.  
  3754.  
  3755.  
  3756.  
  3757. #if defined(__cplusplus)
  3758. }
  3759. #endif
  3760.  
  3761.  
  3762. /*
  3763.  * Return packing to whatever it was before we
  3764.  * entered this file
  3765.  */
  3766. #include <poppack.h>
  3767.  
  3768.  
  3769. #pragma option pop /*P_O_Pop*/
  3770. #endif // !defined(_WININET_)
  3771.  
  3772.