📄 internet.c
字号:
lpwai->dwAccessType = INTERNET_OPEN_TYPE_PROXY;
lpwai->lpszProxy = szProxy;
TRACE("http proxy = %s\n", debugstr_w(lpwai->lpszProxy));
}
else
ERR("Couldn't read proxy server settings.\n");
}
else
TRACE("Proxy is not enabled.\n");
RegCloseKey(key);
return enabled;
}
/***********************************************************************
* dump_INTERNET_FLAGS
*
* Helper function to TRACE the internet flags.
*
* RETURNS
* None
*
*/
static void dump_INTERNET_FLAGS(DWORD dwFlags)
{
#define FE(x) { x, #x }
static const wininet_flag_info flag[] = {
FE(INTERNET_FLAG_RELOAD),
FE(INTERNET_FLAG_RAW_DATA),
FE(INTERNET_FLAG_EXISTING_CONNECT),
FE(INTERNET_FLAG_ASYNC),
FE(INTERNET_FLAG_PASSIVE),
FE(INTERNET_FLAG_NO_CACHE_WRITE),
FE(INTERNET_FLAG_MAKE_PERSISTENT),
FE(INTERNET_FLAG_FROM_CACHE),
FE(INTERNET_FLAG_SECURE),
FE(INTERNET_FLAG_KEEP_CONNECTION),
FE(INTERNET_FLAG_NO_AUTO_REDIRECT),
FE(INTERNET_FLAG_READ_PREFETCH),
FE(INTERNET_FLAG_NO_COOKIES),
FE(INTERNET_FLAG_NO_AUTH),
FE(INTERNET_FLAG_CACHE_IF_NET_FAIL),
FE(INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP),
FE(INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS),
FE(INTERNET_FLAG_IGNORE_CERT_DATE_INVALID),
FE(INTERNET_FLAG_IGNORE_CERT_CN_INVALID),
FE(INTERNET_FLAG_RESYNCHRONIZE),
FE(INTERNET_FLAG_HYPERLINK),
FE(INTERNET_FLAG_NO_UI),
FE(INTERNET_FLAG_PRAGMA_NOCACHE),
FE(INTERNET_FLAG_CACHE_ASYNC),
FE(INTERNET_FLAG_FORMS_SUBMIT),
FE(INTERNET_FLAG_NEED_FILE),
FE(INTERNET_FLAG_TRANSFER_ASCII),
FE(INTERNET_FLAG_TRANSFER_BINARY)
};
#undef FE
int i;
for (i = 0; i < (sizeof(flag) / sizeof(flag[0])); i++) {
if (flag[i].val & dwFlags) {
TRACE(" %s", flag[i].name);
dwFlags &= ~flag[i].val;
}
}
if (dwFlags)
TRACE(" Unknown flags (%08lx)\n", dwFlags);
else
TRACE("\n");
}
/***********************************************************************
* InternetOpenW (WININET.@)
*
* Per-application initialization of wininet
*
* RETURNS
* HINTERNET on success
* NULL on failure
*
*/
HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType,
LPCWSTR lpszProxy, LPCWSTR lpszProxyBypass, DWORD dwFlags)
{
LPWININETAPPINFOW lpwai = NULL;
HINTERNET handle = NULL;
if (TRACE_ON(wininet)) {
#define FE(x) { x, #x }
static const wininet_flag_info access_type[] = {
FE(INTERNET_OPEN_TYPE_PRECONFIG),
FE(INTERNET_OPEN_TYPE_DIRECT),
FE(INTERNET_OPEN_TYPE_PROXY),
FE(INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY)
};
#undef FE
DWORD i;
const char *access_type_str = "Unknown";
TRACE("(%s, %li, %s, %s, %li)\n", debugstr_w(lpszAgent), dwAccessType,
debugstr_w(lpszProxy), debugstr_w(lpszProxyBypass), dwFlags);
for (i = 0; i < (sizeof(access_type) / sizeof(access_type[0])); i++) {
if (access_type[i].val == dwAccessType) {
access_type_str = access_type[i].name;
break;
}
}
TRACE(" access type : %s\n", access_type_str);
TRACE(" flags :");
dump_INTERNET_FLAGS(dwFlags);
}
/* Clear any error information */
INTERNET_SetLastError(0);
lpwai = HeapAlloc(GetProcessHeap(), 0, sizeof(WININETAPPINFOW));
if (NULL == lpwai)
{
INTERNET_SetLastError(ERROR_OUTOFMEMORY);
goto lend;
}
memset(lpwai, 0, sizeof(WININETAPPINFOW));
lpwai->hdr.htype = WH_HINIT;
lpwai->hdr.lpwhparent = NULL;
lpwai->hdr.dwFlags = dwFlags;
lpwai->hdr.dwRefCount = 1;
lpwai->hdr.destroy = INTERNET_CloseHandle;
lpwai->dwAccessType = dwAccessType;
lpwai->lpszProxyUsername = NULL;
lpwai->lpszProxyPassword = NULL;
handle = WININET_AllocHandle( &lpwai->hdr );
if( !handle )
{
HeapFree( GetProcessHeap(), 0, lpwai );
INTERNET_SetLastError(ERROR_OUTOFMEMORY);
goto lend;
}
if (NULL != lpszAgent)
{
lpwai->lpszAgent = HeapAlloc( GetProcessHeap(),0,
(strlenW(lpszAgent)+1)*sizeof(WCHAR));
if (lpwai->lpszAgent)
lstrcpyW( lpwai->lpszAgent, lpszAgent );
}
if(dwAccessType == INTERNET_OPEN_TYPE_PRECONFIG)
INTERNET_ConfigureProxyFromReg( lpwai );
else if (NULL != lpszProxy)
{
lpwai->lpszProxy = HeapAlloc( GetProcessHeap(), 0,
(strlenW(lpszProxy)+1)*sizeof(WCHAR));
if (lpwai->lpszProxy)
lstrcpyW( lpwai->lpszProxy, lpszProxy );
}
if (NULL != lpszProxyBypass)
{
lpwai->lpszProxyBypass = HeapAlloc( GetProcessHeap(), 0,
(strlenW(lpszProxyBypass)+1)*sizeof(WCHAR));
if (lpwai->lpszProxyBypass)
lstrcpyW( lpwai->lpszProxyBypass, lpszProxyBypass );
}
lend:
if( lpwai )
WININET_Release( &lpwai->hdr );
TRACE("returning %p\n", lpwai);
return handle;
}
/***********************************************************************
* InternetOpenA (WININET.@)
*
* Per-application initialization of wininet
*
* RETURNS
* HINTERNET on success
* NULL on failure
*
*/
HINTERNET WINAPI InternetOpenA(LPCSTR lpszAgent, DWORD dwAccessType,
LPCSTR lpszProxy, LPCSTR lpszProxyBypass, DWORD dwFlags)
{
HINTERNET rc = (HINTERNET)NULL;
INT len;
WCHAR *szAgent = NULL, *szProxy = NULL, *szBypass = NULL;
TRACE("(%s, 0x%08lx, %s, %s, 0x%08lx)\n", debugstr_a(lpszAgent),
dwAccessType, debugstr_a(lpszProxy), debugstr_a(lpszProxyBypass), dwFlags);
if( lpszAgent )
{
len = MultiByteToWideChar(CP_ACP, 0, lpszAgent, -1, NULL, 0);
szAgent = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpszAgent, -1, szAgent, len);
}
if( lpszProxy )
{
len = MultiByteToWideChar(CP_ACP, 0, lpszProxy, -1, NULL, 0);
szProxy = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpszProxy, -1, szProxy, len);
}
if( lpszProxyBypass )
{
len = MultiByteToWideChar(CP_ACP, 0, lpszProxyBypass, -1, NULL, 0);
szBypass = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpszProxyBypass, -1, szBypass, len);
}
rc = InternetOpenW(szAgent, dwAccessType, szProxy, szBypass, dwFlags);
HeapFree(GetProcessHeap(), 0, szAgent);
HeapFree(GetProcessHeap(), 0, szProxy);
HeapFree(GetProcessHeap(), 0, szBypass);
return rc;
}
/***********************************************************************
* InternetGetLastResponseInfoA (WININET.@)
*
* Return last wininet error description on the calling thread
*
* RETURNS
* TRUE on success of writing to buffer
* FALSE on failure
*
*/
BOOL WINAPI InternetGetLastResponseInfoA(LPDWORD lpdwError,
LPSTR lpszBuffer, LPDWORD lpdwBufferLength)
{
LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
TRACE("\n");
*lpdwError = lpwite->dwError;
if (lpwite->dwError)
{
memcpy(lpszBuffer, lpwite->response, *lpdwBufferLength);
*lpdwBufferLength = strlen(lpszBuffer);
}
else
*lpdwBufferLength = 0;
return TRUE;
}
/***********************************************************************
* InternetGetLastResponseInfoW (WININET.@)
*
* Return last wininet error description on the calling thread
*
* RETURNS
* TRUE on success of writing to buffer
* FALSE on failure
*
*/
BOOL WINAPI InternetGetLastResponseInfoW(LPDWORD lpdwError,
LPWSTR lpszBuffer, LPDWORD lpdwBufferLength)
{
LPWITHREADERROR lpwite = (LPWITHREADERROR)TlsGetValue(g_dwTlsErrIndex);
TRACE("\n");
*lpdwError = lpwite->dwError;
if (lpwite->dwError)
{
memcpy(lpszBuffer, lpwite->response, *lpdwBufferLength);
*lpdwBufferLength = lstrlenW(lpszBuffer);
}
else
*lpdwBufferLength = 0;
return TRUE;
}
/***********************************************************************
* InternetGetConnectedState (WININET.@)
*
* Return connected state
*
* RETURNS
* TRUE if connected
* if lpdwStatus is not null, return the status (off line,
* modem, lan...) in it.
* FALSE if not connected
*/
BOOL WINAPI InternetGetConnectedState(LPDWORD lpdwStatus, DWORD dwReserved)
{
TRACE("(%p, 0x%08lx)\n", lpdwStatus, dwReserved);
if (lpdwStatus) {
FIXME("always returning LAN connection.\n");
*lpdwStatus = INTERNET_CONNECTION_LAN;
}
return TRUE;
}
/***********************************************************************
* InternetGetConnectedStateExW (WININET.@)
*
* Return connected state
*
* PARAMS
*
* lpdwStatus [O] Flags specifying the status of the internet connection.
* lpszConnectionName [O] Pointer to buffer to receive the friendly name of the internet connection.
* dwNameLen [I] Size of the buffer, in characters.
* dwReserved [I] Reserved. Must be set to 0.
*
* RETURNS
* TRUE if connected
* if lpdwStatus is not null, return the status (off line,
* modem, lan...) in it.
* FALSE if not connected
*
* NOTES
* If the system has no available network connections, an empty string is
* stored in lpszConnectionName. If there is a LAN connection, a localized
* "LAN Connection" string is stored. Presumably, if only a dial-up
* connection is available then the name of the dial-up connection is
* returned. Why any application, other than the "Internet Settings" CPL,
* would want to use this function instead of the simpler InternetGetConnectedStateW
* function is beyond me.
*/
BOOL WINAPI InternetGetConnectedStateExW(LPDWORD lpdwStatus, LPWSTR lpszConnectionName,
DWORD dwNameLen, DWORD dwReserved)
{
TRACE("(%p, %p, %ld, 0x%08lx)\n", lpdwStatus, lpszConnectionName, dwNameLen, dwReserved);
/* Must be zero */
if(dwReserved)
return FALSE;
if (lpdwStatus) {
FIXME("always returning LAN connection.\n");
*lpdwStatus = INTERNET_CONNECTION_LAN;
}
return LoadStringW(WININET_hModule, IDS_LANCONNECTION, lpszConnectionName, dwNameLen);
}
/***********************************************************************
* InternetGetConnectedStateExA (WININET.@)
*/
BOOL WINAPI InternetGetConnectedStateExA(LPDWORD lpdwStatus, LPSTR lpszConnectionName,
DWORD dwNameLen, DWORD dwReserved)
{
LPWSTR lpwszConnectionName = NULL;
BOOL rc;
TRACE("(%p, %p, %ld, 0x%08lx)\n", lpdwStatus, lpszConnectionName, dwNameLen, dwReserved);
if (lpszConnectionName && dwNameLen > 0)
lpwszConnectionName= HeapAlloc(GetProcessHeap(), 0, dwNameLen * sizeof(WCHAR));
rc = InternetGetConnectedStateExW(lpdwStatus,lpwszConnectionName, dwNameLen,
dwReserved);
if (rc && lpwszConnectionName)
{
WideCharToMultiByte(CP_ACP,0,lpwszConnectionName,-1,lpszConnectionName,
dwNameLen, NULL, NULL);
HeapFree(GetProcessHeap(),0,lpwszConnectionName);
}
return rc;
}
/***********************************************************************
* InternetConnectW (WININET.@)
*
* Open a ftp, gopher or http session
*
* RETURNS
* HINTERNET a session handle on success
* NULL on failure
*
*/
HINTERNET WINAPI InternetConnectW(HINTERNET hInternet,
LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
LPCWSTR lpszUserName, LPCWSTR lpszPassword,
DWORD dwService, DWORD dwFlags, DWORD dwContext)
{
LPWININETAPPINFOW hIC;
HINTERNET rc = (HINTERNET) NULL;
TRACE("(%p, %s, %i, %s, %s, %li, %li, %li)\n", hInternet, debugstr_w(lpszServerName),
nServerPort, debugstr_w(lpszUserName), debugstr_w(lpszPassword),
dwService, dwFlags, dwContext);
/* Clear any error information */
INTERNET_SetLastError(0);
hIC = (LPWININETAPPINFOW) WININET_GetObject( hInternet );
if ( (hIC == NULL) || (hIC->hdr.htype != WH_HINIT) )
goto lend;
switch (dwService)
{
case INTERNET_SERVICE_FTP:
rc = FTP_Connect(hIC, lpszServerName, nServerPort,
lpszUserName, lpszPassword, dwFlags, dwContext, 0);
break;
case INTERNET_SERVICE_HTTP:
rc = HTTP_Connect(hIC, lpszServerName, nServerPort,
lpszUserName, lpszPassword, dwFlags, dwContext, 0);
break;
case INTERNET_SERVICE_GOPHER:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -