mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[net] Check for application update (part 1)
* Switched from WinHTTP to WinInet and removed net.h * Added support for registry operations
This commit is contained in:
		
							parent
							
								
									66b1f8006e
								
							
						
					
					
						commit
						05d7b757e6
					
				
					 11 changed files with 518 additions and 770 deletions
				
			
		|  | @ -83,7 +83,7 @@ | ||||||
|       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> |       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> | ||||||
|       <GenerateDebugInformation>true</GenerateDebugInformation> |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|       <SubSystem>Windows</SubSystem> |       <SubSystem>Windows</SubSystem> | ||||||
|  | @ -106,7 +106,7 @@ | ||||||
|       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> |       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> |       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> | ||||||
|       <GenerateDebugInformation>true</GenerateDebugInformation> |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|       <SubSystem>Windows</SubSystem> |       <SubSystem>Windows</SubSystem> | ||||||
|  | @ -125,7 +125,7 @@ | ||||||
|       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> |       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> | ||||||
|       <GenerateDebugInformation>false</GenerateDebugInformation> |       <GenerateDebugInformation>false</GenerateDebugInformation> | ||||||
|       <SubSystem>Windows</SubSystem> |       <SubSystem>Windows</SubSystem> | ||||||
|  | @ -147,7 +147,7 @@ | ||||||
|       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |       <AdditionalIncludeDirectories>..\msvc-missing;..\ms-sys\inc;..\syslinux\libinstaller;..\syslinux\libfat;..\libcdio;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <AdditionalDependencies>setupapi.lib;comctl32.lib;%(AdditionalDependencies)</AdditionalDependencies> |       <AdditionalDependencies>setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||||
|       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> |       <UACExecutionLevel>HighestAvailable</UACExecutionLevel> | ||||||
|       <GenerateDebugInformation>false</GenerateDebugInformation> |       <GenerateDebugInformation>false</GenerateDebugInformation> | ||||||
|       <SubSystem>Windows</SubSystem> |       <SubSystem>Windows</SubSystem> | ||||||
|  | @ -181,7 +181,7 @@ | ||||||
|     <ClInclude Include="..\libcdio\cdio\udf.h" /> |     <ClInclude Include="..\libcdio\cdio\udf.h" /> | ||||||
|     <ClInclude Include="..\msapi_utf8.h" /> |     <ClInclude Include="..\msapi_utf8.h" /> | ||||||
|     <ClInclude Include="..\dos.h" /> |     <ClInclude Include="..\dos.h" /> | ||||||
|     <ClInclude Include="..\net.h" /> |     <ClInclude Include="..\registry.h" /> | ||||||
|     <ClInclude Include="..\resource.h" /> |     <ClInclude Include="..\resource.h" /> | ||||||
|     <ClInclude Include="..\rufus.h" /> |     <ClInclude Include="..\rufus.h" /> | ||||||
|     <ClInclude Include="..\license.h" /> |     <ClInclude Include="..\license.h" /> | ||||||
|  |  | ||||||
|  | @ -92,7 +92,7 @@ | ||||||
|     <ClInclude Include="..\libcdio\cdio\udf.h"> |     <ClInclude Include="..\libcdio\cdio\udf.h"> | ||||||
|       <Filter>Header Files</Filter> |       <Filter>Header Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|     <ClInclude Include="..\net.h"> |     <ClInclude Include="..\registry.h"> | ||||||
|       <Filter>Header Files</Filter> |       <Filter>Header Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  |  | ||||||
|  | @ -17,6 +17,7 @@ TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \ | ||||||
|            $(SDK_LIB_PATH)\ole32.lib \ |            $(SDK_LIB_PATH)\ole32.lib \ | ||||||
|            $(SDK_LIB_PATH)\uuid.lib \ |            $(SDK_LIB_PATH)\uuid.lib \ | ||||||
|            $(SDK_LIB_PATH)\shell32.lib \ |            $(SDK_LIB_PATH)\shell32.lib \ | ||||||
|  |            $(SDK_LIB_PATH)\wininet.lib \ | ||||||
|            .\ms-sys\ms-sys.lib \ |            .\ms-sys\ms-sys.lib \ | ||||||
|            .\syslinux\libfat\libfat.lib \ |            .\syslinux\libfat\libfat.lib \ | ||||||
|            .\syslinux\libinstaller\libinstaller.lib \ |            .\syslinux\libinstaller\libinstaller.lib \ | ||||||
|  |  | ||||||
|  | @ -13,4 +13,4 @@ rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks | ||||||
| rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | ||||||
| rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | ||||||
| rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \ | rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \ | ||||||
| 	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32  | 	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet | ||||||
|  |  | ||||||
|  | @ -187,7 +187,7 @@ rufus_SOURCES = drive.c icon.c parser.c iso.c net.c dos.c dos_locale.c badblocks | ||||||
| rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) | ||||||
| rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows | ||||||
| rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \
 | ||||||
| 	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32  | 	libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet | ||||||
| 
 | 
 | ||||||
| all: all-recursive | all: all-recursive | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										530
									
								
								src/net.c
									
										
									
									
									
								
							
							
						
						
									
										530
									
								
								src/net.c
									
										
									
									
									
								
							|  | @ -1,6 +1,6 @@ | ||||||
| /*
 | /*
 | ||||||
|  * Rufus: The Reliable USB Formatting Utility |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  * Networking functionality (web file download, etc.) |  * Networking functionality (web file download, check for update, etc.) | ||||||
|  * Copyright (c) 2012 Pete Batard <pete@akeo.ie> |  * Copyright (c) 2012 Pete Batard <pete@akeo.ie> | ||||||
|  * |  * | ||||||
|  * This program is free software: you can redistribute it and/or modify |  * This program is free software: you can redistribute it and/or modify | ||||||
|  | @ -24,169 +24,227 @@ | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include <windows.h> | #include <windows.h> | ||||||
|  | #include <wininet.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #include <malloc.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | #include <inttypes.h> | ||||||
| 
 | 
 | ||||||
| #include "msapi_utf8.h" | #include "msapi_utf8.h" | ||||||
| #include "rufus.h" | #include "rufus.h" | ||||||
|  | #include "registry.h" | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
| // winhttp.h is not available for WDK and MinGW32, so we have to use a replacement
 | 
 | ||||||
| #include "net.h" | /* Maximum download chunk size, in bytes */ | ||||||
|  | #define DOWNLOAD_BUFFER_SIZE    10240 | ||||||
|  | /* Default delay between update checks (1 day) */ | ||||||
|  | #define DEFAULT_UPDATE_INTERVAL (24*3600) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Globals */ | ||||||
|  | DWORD error_code; | ||||||
|  | 
 | ||||||
|  | /* MinGW is missing some of those */ | ||||||
|  | #if !defined(ERROR_INTERNET_DISCONNECTED) | ||||||
|  | #define ERROR_INTERNET_DISCONNECTED (INTERNET_ERROR_BASE + 163) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_SERVER_UNREACHABLE) | ||||||
|  | #define ERROR_INTERNET_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 164) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_PROXY_SERVER_UNREACHABLE) | ||||||
|  | #define ERROR_INTERNET_PROXY_SERVER_UNREACHABLE (INTERNET_ERROR_BASE + 165) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT) | ||||||
|  | #define ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT (INTERNET_ERROR_BASE + 166) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT) | ||||||
|  | #define ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT (INTERNET_ERROR_BASE + 167) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_FAILED_DUETOSECURITYCHECK) | ||||||
|  | #define ERROR_INTERNET_FAILED_DUETOSECURITYCHECK (INTERNET_ERROR_BASE + 171) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_NOT_INITIALIZED) | ||||||
|  | #define ERROR_INTERNET_NOT_INITIALIZED (INTERNET_ERROR_BASE + 172) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_NEED_MSN_SSPI_PKG) | ||||||
|  | #define ERROR_INTERNET_NEED_MSN_SSPI_PKG (INTERNET_ERROR_BASE + 173) | ||||||
|  | #endif | ||||||
|  | #if !defined(ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY) | ||||||
|  | #define ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY (INTERNET_ERROR_BASE + 174) | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * FormatMessage does not handle WinHTTP |  * FormatMessage does not handle internet errors | ||||||
|  |  * http://support.microsoft.com/kb/193625
 | ||||||
|  */ |  */ | ||||||
| const char* WinHTTPErrorString(void) | const char* WinInetErrorString(void) | ||||||
| { | { | ||||||
| 	static char err_string[34]; | 	static char error_string[256]; | ||||||
| 	DWORD error_code; | 	DWORD size = sizeof(error_string); | ||||||
| 
 | 
 | ||||||
| 	error_code = GetLastError(); | 	error_code = GetLastError(); | ||||||
| 
 | 
 | ||||||
| 	if ((error_code < WINHTTP_ERROR_BASE) || (error_code > WINHTTP_ERROR_LAST)) | 	if ((error_code < INTERNET_ERROR_BASE) || (error_code > INTERNET_ERROR_LAST)) | ||||||
| 		return WindowsErrorString(); | 		return WindowsErrorString(); | ||||||
| 
 | 
 | ||||||
| 	switch(error_code) { | 	switch(error_code) { | ||||||
| 	case ERROR_WINHTTP_OUT_OF_HANDLES: | 	case ERROR_INTERNET_OUT_OF_HANDLES: | ||||||
| 		return "No more handles could be generated at this time."; | 		return "No more handles could be generated at this time."; | ||||||
| 	case ERROR_WINHTTP_TIMEOUT: | 	case ERROR_INTERNET_TIMEOUT: | ||||||
| 		return "The request has timed out."; | 		return "The request has timed out."; | ||||||
| 	case ERROR_WINHTTP_INTERNAL_ERROR: | 	case ERROR_INTERNET_INTERNAL_ERROR: | ||||||
| 		return "An internal error has occurred."; | 		return "An internal error has occurred."; | ||||||
| 	case ERROR_WINHTTP_INVALID_URL: | 	case ERROR_INTERNET_INVALID_URL: | ||||||
| 		return "The URL is invalid."; | 		return "The URL is invalid."; | ||||||
| 	case ERROR_WINHTTP_UNRECOGNIZED_SCHEME: | 	case ERROR_INTERNET_UNRECOGNIZED_SCHEME: | ||||||
| 		return "The URL scheme could not be recognized or is not supported."; | 		return "The URL scheme could not be recognized or is not supported."; | ||||||
| 	case ERROR_WINHTTP_NAME_NOT_RESOLVED: | 	case ERROR_INTERNET_NAME_NOT_RESOLVED: | ||||||
| 		return "The server name could not be resolved."; | 		return "The server name could not be resolved."; | ||||||
| 	case ERROR_WINHTTP_INVALID_OPTION: | 	case ERROR_INTERNET_PROTOCOL_NOT_FOUND: | ||||||
| 		return "The request specified an invalid option value."; | 		return "The requested protocol could not be located."; | ||||||
| 	case ERROR_WINHTTP_OPTION_NOT_SETTABLE: | 	case ERROR_INTERNET_INVALID_OPTION: | ||||||
|  | 		return "A request specified an invalid option value."; | ||||||
|  | 	case ERROR_INTERNET_BAD_OPTION_LENGTH: | ||||||
|  | 		return "The length of an option supplied is incorrect for the type of option specified."; | ||||||
|  | 	case ERROR_INTERNET_OPTION_NOT_SETTABLE: | ||||||
| 		return "The request option cannot be set, only queried."; | 		return "The request option cannot be set, only queried."; | ||||||
| 	case ERROR_WINHTTP_SHUTDOWN: | 	case ERROR_INTERNET_SHUTDOWN: | ||||||
| 		return "The Win32 HTTP function support is being shut down or unloaded."; | 		return "The Win32 Internet function support is being shut down or unloaded."; | ||||||
| 	case ERROR_WINHTTP_LOGIN_FAILURE: | 	case ERROR_INTERNET_INCORRECT_USER_NAME: | ||||||
| 		return "The request to connect and log on to the server failed."; | 		return "The request to connect and log on to an FTP server could not be completed because the supplied user name is incorrect."; | ||||||
| 	case ERROR_WINHTTP_OPERATION_CANCELLED: | 	case ERROR_INTERNET_INCORRECT_PASSWORD: | ||||||
| 		return "The operation was canceled"; | 		return "The request to connect and log on to an FTP server could not be completed because the supplied password is incorrect."; | ||||||
| 	case ERROR_WINHTTP_INCORRECT_HANDLE_TYPE: | 	case ERROR_INTERNET_LOGIN_FAILURE: | ||||||
|  | 		return "The request to connect to and log on to an FTP server failed."; | ||||||
|  | 	case ERROR_INTERNET_INVALID_OPERATION: | ||||||
|  | 		return "The requested operation is invalid."; | ||||||
|  | 	case ERROR_INTERNET_OPERATION_CANCELLED: | ||||||
|  | 		return "The operation was canceled, usually because the handle on which the request was operating was closed before the operation completed."; | ||||||
|  | 	case ERROR_INTERNET_INCORRECT_HANDLE_TYPE: | ||||||
| 		return "The type of handle supplied is incorrect for this operation."; | 		return "The type of handle supplied is incorrect for this operation."; | ||||||
| 	case ERROR_WINHTTP_INCORRECT_HANDLE_STATE: | 	case ERROR_INTERNET_INCORRECT_HANDLE_STATE: | ||||||
| 		return "The requested operation cannot be carried out because the handle supplied is not in the correct state."; | 		return "The requested operation cannot be carried out because the handle supplied is not in the correct state."; | ||||||
| 	case ERROR_WINHTTP_CANNOT_CONNECT: | 	case ERROR_INTERNET_NOT_PROXY_REQUEST: | ||||||
|  | 		return "The request cannot be made via a proxy."; | ||||||
|  | 	case ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND: | ||||||
|  | 		return "A required registry value could not be located."; | ||||||
|  | 	case ERROR_INTERNET_BAD_REGISTRY_PARAMETER: | ||||||
|  | 		return "A required registry value was located but is an incorrect type or has an invalid value."; | ||||||
|  | 	case ERROR_INTERNET_NO_DIRECT_ACCESS: | ||||||
|  | 		return "Direct network access cannot be made at this time."; | ||||||
|  | 	case ERROR_INTERNET_NO_CONTEXT: | ||||||
|  | 		return "An asynchronous request could not be made because a zero context value was supplied."; | ||||||
|  | 	case ERROR_INTERNET_NO_CALLBACK: | ||||||
|  | 		return "An asynchronous request could not be made because a callback function has not been set."; | ||||||
|  | 	case ERROR_INTERNET_REQUEST_PENDING: | ||||||
|  | 		return "The required operation could not be completed because one or more requests are pending."; | ||||||
|  | 	case ERROR_INTERNET_INCORRECT_FORMAT: | ||||||
|  | 		return "The format of the request is invalid."; | ||||||
|  | 	case ERROR_INTERNET_ITEM_NOT_FOUND: | ||||||
|  | 		return "The requested item could not be located."; | ||||||
|  | 	case ERROR_INTERNET_CANNOT_CONNECT: | ||||||
| 		return "The attempt to connect to the server failed."; | 		return "The attempt to connect to the server failed."; | ||||||
| 	case ERROR_WINHTTP_CONNECTION_ERROR: | 	case ERROR_INTERNET_CONNECTION_ABORTED: | ||||||
| 		return "The connection with the server has been terminated."; | 		return "The connection with the server has been terminated."; | ||||||
| 	case ERROR_WINHTTP_RESEND_REQUEST: | 	case ERROR_INTERNET_CONNECTION_RESET: | ||||||
| 		return "The Win32 HTTP function needs to redo the request."; | 		return "The connection with the server has been reset."; | ||||||
| 	case ERROR_WINHTTP_SECURE_CERT_DATE_INVALID: | 	case ERROR_INTERNET_FORCE_RETRY: | ||||||
| 		return "SSL certificate date indicates that the certificate is expired."; | 		return "Calls for the Win32 Internet function to redo the request."; | ||||||
| 	case ERROR_WINHTTP_SECURE_CERT_CN_INVALID: | 	case ERROR_INTERNET_INVALID_PROXY_REQUEST: | ||||||
|  | 		return "The request to the proxy was invalid."; | ||||||
|  | 	case ERROR_INTERNET_HANDLE_EXISTS: | ||||||
|  | 		return "The request failed because the handle already exists."; | ||||||
|  | 	case ERROR_INTERNET_SEC_CERT_DATE_INVALID: | ||||||
|  | 		return "SSL certificate date that was received from the server is bad. The certificate is expired."; | ||||||
|  | 	case ERROR_INTERNET_SEC_CERT_CN_INVALID: | ||||||
| 		return "SSL certificate common name (host name field) is incorrect."; | 		return "SSL certificate common name (host name field) is incorrect."; | ||||||
| 	case ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED: | 	case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: | ||||||
|  | 		return "The application is moving from a non-SSL to an SSL connection because of a redirect."; | ||||||
|  | 	case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR: | ||||||
|  | 		return "The application is moving from an SSL to an non-SSL connection because of a redirect."; | ||||||
|  | 	case ERROR_INTERNET_MIXED_SECURITY: | ||||||
|  | 		return "Some of the content being viewed may have come from unsecured servers."; | ||||||
|  | 	case ERROR_INTERNET_CHG_POST_IS_NON_SECURE: | ||||||
|  | 		return "The application is posting and attempting to change multiple lines of text on a server that is not secure."; | ||||||
|  | 	case ERROR_INTERNET_POST_IS_NON_SECURE: | ||||||
|  | 		return "The application is posting data to a server that is not secure."; | ||||||
|  | 	case ERROR_FTP_TRANSFER_IN_PROGRESS: | ||||||
|  | 		return "The requested operation cannot be made on the FTP session handle because an operation is already in progress."; | ||||||
|  | 	case ERROR_FTP_DROPPED: | ||||||
|  | 		return "The FTP operation was not completed because the session was aborted."; | ||||||
|  | 	case ERROR_GOPHER_PROTOCOL_ERROR: | ||||||
|  | 	case ERROR_GOPHER_NOT_FILE: | ||||||
|  | 	case ERROR_GOPHER_DATA_ERROR: | ||||||
|  | 	case ERROR_GOPHER_END_OF_DATA: | ||||||
|  | 	case ERROR_GOPHER_INVALID_LOCATOR: | ||||||
|  | 	case ERROR_GOPHER_INCORRECT_LOCATOR_TYPE: | ||||||
|  | 	case ERROR_GOPHER_NOT_GOPHER_PLUS: | ||||||
|  | 	case ERROR_GOPHER_ATTRIBUTE_NOT_FOUND: | ||||||
|  | 	case ERROR_GOPHER_UNKNOWN_LOCATOR: | ||||||
|  | 		return "Gopher? Really??? What is this? 1994?"; | ||||||
|  | 	case ERROR_HTTP_HEADER_NOT_FOUND: | ||||||
|  | 		return "The requested header could not be located."; | ||||||
|  | 	case ERROR_HTTP_DOWNLEVEL_SERVER: | ||||||
|  | 		return "The server did not return any headers."; | ||||||
|  | 	case ERROR_HTTP_INVALID_SERVER_RESPONSE: | ||||||
|  | 		return "The server response could not be parsed."; | ||||||
|  | 	case ERROR_HTTP_INVALID_HEADER: | ||||||
|  | 		return "The supplied header is invalid."; | ||||||
|  | 	case ERROR_HTTP_INVALID_QUERY_REQUEST: | ||||||
|  | 		return "The request made to HttpQueryInfo is invalid."; | ||||||
|  | 	case ERROR_HTTP_HEADER_ALREADY_EXISTS: | ||||||
|  | 		return "The header could not be added because it already exists."; | ||||||
|  | 	case ERROR_HTTP_REDIRECT_FAILED: | ||||||
|  | 		return "The redirection failed because either the scheme changed or all attempts made to redirect failed."; | ||||||
|  | 	case ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED: | ||||||
| 		return "Client Authentication certificate needed"; | 		return "Client Authentication certificate needed"; | ||||||
| 	case ERROR_WINHTTP_SECURE_INVALID_CA: | 	case ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT: | ||||||
| 		return "SSL certificate has been issued by an invalid Certification Authority."; |  | ||||||
| 	case ERROR_WINHTTP_SECURE_CERT_REV_FAILED: |  | ||||||
| 		return "SSL certificate revocation check failed."; |  | ||||||
| 	case ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN: |  | ||||||
| 		return "Cannot use this call before WinHttpOpen"; |  | ||||||
| 	case ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND: |  | ||||||
| 		return "Cannot use this call before WinHttpSend"; |  | ||||||
| 	case ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND: |  | ||||||
| 		return "Cannot use this call after WinHttpSend"; |  | ||||||
| 	case ERROR_WINHTTP_CANNOT_CALL_AFTER_OPEN: |  | ||||||
| 		return "Cannot use this call after WinHttpOpen"; |  | ||||||
| 	case ERROR_WINHTTP_HEADER_NOT_FOUND: |  | ||||||
| 		return "HTTP header was not found."; |  | ||||||
| 	case ERROR_WINHTTP_INVALID_SERVER_RESPONSE: |  | ||||||
| 		return "Invalid HTTP server response."; |  | ||||||
| 	case ERROR_WINHTTP_INVALID_HEADER: |  | ||||||
| 		return "Invalid HTTP header."; |  | ||||||
| 	case ERROR_WINHTTP_INVALID_QUERY_REQUEST: |  | ||||||
| 		return "Invalid HTTP query request."; |  | ||||||
| 	case ERROR_WINHTTP_HEADER_ALREADY_EXISTS: |  | ||||||
| 		return "HTTP header already exists."; |  | ||||||
| 	case ERROR_WINHTTP_REDIRECT_FAILED: |  | ||||||
| 		return "HTTP redirect failed."; |  | ||||||
| 	case ERROR_WINHTTP_SECURE_CHANNEL_ERROR: |  | ||||||
| 		return "Unnable to establish secure HTTP channel."; |  | ||||||
| 	case ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT: |  | ||||||
| 		return "Bad auto proxy script."; | 		return "Bad auto proxy script."; | ||||||
| 	case ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT: | 	case ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT: | ||||||
| 		return "Unable to download script."; | 		return "Unable to download script."; | ||||||
| 	case ERROR_WINHTTP_SECURE_INVALID_CERT: | 	case ERROR_INTERNET_NOT_INITIALIZED: | ||||||
| 		return "SSL certificate is invalid."; | 		return "Internet has not be initialized."; | ||||||
| 	case ERROR_WINHTTP_SECURE_CERT_REVOKED: | 	case ERROR_INTERNET_UNABLE_TO_CACHE_FILE: | ||||||
| 		return "SSL certificate has been revoked."; | 		return "Unable to cache the file."; | ||||||
| 	case ERROR_WINHTTP_NOT_INITIALIZED: | 	case ERROR_INTERNET_TCPIP_NOT_INSTALLED: | ||||||
| 		return "WinHTTP has not be initialized."; | 		return "TPC/IP not installed."; | ||||||
| 	case ERROR_WINHTTP_SECURE_FAILURE: | 	case ERROR_INTERNET_DISCONNECTED: | ||||||
| 		return "SSL failure."; | 		return "Internet is disconnected."; | ||||||
| 	case ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR: | 	case ERROR_INTERNET_SERVER_UNREACHABLE: | ||||||
| 		return "Auto proxy service error."; | 		return "Server could not be reached."; | ||||||
| 	case ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE: | 	case ERROR_INTERNET_PROXY_SERVER_UNREACHABLE: | ||||||
| 		return "Wrong SSL certificate usage."; | 		return "Proxy server could not be reached."; | ||||||
| 	case ERROR_WINHTTP_AUTODETECTION_FAILED: | 	case ERROR_INTERNET_FAILED_DUETOSECURITYCHECK: | ||||||
| 		return "HTTP autodetection failed."; | 		return "A security check prevented internet connection."; | ||||||
| 	case ERROR_WINHTTP_HEADER_COUNT_EXCEEDED: | 	case ERROR_INTERNET_NEED_MSN_SSPI_PKG: | ||||||
| 		return "HTTP header count exceeded."; | 		return "This connection requires an MSN Security Support Provider Interface package."; | ||||||
| 	case ERROR_WINHTTP_HEADER_SIZE_OVERFLOW: | 	case ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY: | ||||||
| 		return "HTTP header size overflow."; | 		return "Please ask Microsoft about that one!"; | ||||||
| 	case ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW: | 	case ERROR_INTERNET_EXTENDED_ERROR: | ||||||
| 		return "Chunked encoding HTTP header size overflow."; | 		InternetGetLastResponseInfoA(&error_code, error_string, &size); | ||||||
| 	case ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW: | 		return error_string; | ||||||
| 		return "Response drain overflow."; |  | ||||||
| 	case ERROR_WINHTTP_CLIENT_CERT_NO_PRIVATE_KEY: |  | ||||||
| 		return "Certificate does not contain a private key."; |  | ||||||
| 	case ERROR_WINHTTP_CLIENT_CERT_NO_ACCESS_PRIVATE_KEY: |  | ||||||
| 		return "Unable to access client certificate's private key."; |  | ||||||
| 	default: | 	default: | ||||||
| 		safe_sprintf(err_string, sizeof(err_string), "WinHTTP unknown error 0x%08X", error_code); | 		safe_sprintf(error_string, sizeof(error_string), "Unknown internet error 0x%08X", error_code); | ||||||
| 		return err_string; | 		return error_string; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* 
 | /* 
 | ||||||
|  * Download a file from an URL |  * Download a file from an URL | ||||||
|  * Mostly taken from http://msdn.microsoft.com/en-us/library/aa384270.aspx
 |  * Mostly taken from http://support.microsoft.com/kb/234913
 | ||||||
|  */ |  */ | ||||||
| BOOL DownloadFile(const char* url, const char* file) | BOOL DownloadFile(const char* url, const char* file) | ||||||
| { | { | ||||||
| 	BOOL r=FALSE; | 	BOOL r = FALSE; | ||||||
| 	DWORD dwSize, dwDownloaded, dwTotalSize, dwReadSize, dwTotalSizeSize = sizeof(dwTotalSize); | 	DWORD dwFlags, dwSize, dwDownloaded, dwTotalSize, dwStatus; | ||||||
| 	FILE* fd = NULL; | 	FILE* fd = NULL;  | ||||||
| 	LONG progress_style; | 	LONG progress_style; | ||||||
| 	unsigned char* buf = NULL; | 	unsigned char buf[DOWNLOAD_BUFFER_SIZE]; | ||||||
| 	wchar_t wAgent[64], *wUrl = NULL, wHostName[64], wUrlPath[128]; | 	char agent[64], hostname[64], urlpath[128]; | ||||||
| 	HINTERNET hSession=NULL, hConnect=NULL, hRequest=NULL; | 	HINTERNET hSession = NULL, hConnection = NULL, hRequest = NULL; | ||||||
| 	URL_COMPONENTSW UrlParts = {sizeof(URL_COMPONENTSW), NULL, 1, (INTERNET_SCHEME)0, | 	URL_COMPONENTSA UrlParts = {sizeof(URL_COMPONENTSA), NULL, 1, (INTERNET_SCHEME)0, | ||||||
| 		wHostName, ARRAYSIZE(wHostName), INTERNET_DEFAULT_PORT, NULL, 1, wUrlPath, ARRAYSIZE(wUrlPath), NULL, 1}; | 		hostname, sizeof(hostname), 0, NULL, 1, urlpath, sizeof(urlpath), NULL, 1}; | ||||||
| 
 | 	int i; | ||||||
| 	PF_DECL(WinHttpCrackUrl); |  | ||||||
| 	PF_DECL(WinHttpOpen); |  | ||||||
| 	PF_DECL(WinHttpConnect); |  | ||||||
| 	PF_DECL(WinHttpOpenRequest); |  | ||||||
| 	PF_DECL(WinHttpSendRequest); |  | ||||||
| 	PF_DECL(WinHttpReceiveResponse); |  | ||||||
| 	PF_DECL(WinHttpQueryHeaders); |  | ||||||
| 	PF_DECL(WinHttpQueryDataAvailable); |  | ||||||
| 	PF_DECL(WinHttpReadData); |  | ||||||
| 	PF_DECL(WinHttpCloseHandle); |  | ||||||
| 
 |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpCrackUrl, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpOpen, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpConnect, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpOpenRequest, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpSendRequest, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpReceiveResponse, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpQueryHeaders, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpQueryDataAvailable, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpReadData, winhttp); |  | ||||||
| 	PF_INIT_OR_OUT(WinHttpCloseHandle, winhttp); |  | ||||||
| 
 |  | ||||||
| 	wUrl = utf8_to_wchar(url); |  | ||||||
| 	if (wUrl == NULL) goto out; |  | ||||||
| 
 | 
 | ||||||
| 	// We reuse the ISO progress dialog for download progress
 | 	// We reuse the ISO progress dialog for download progress
 | ||||||
| 	SetWindowTextU(hISOProgressDlg, "Downloading file..."); | 	SetWindowTextU(hISOProgressDlg, "Downloading file..."); | ||||||
|  | @ -200,111 +258,215 @@ BOOL DownloadFile(const char* url, const char* file) | ||||||
| 	PrintStatus(0, FALSE, "Downloading %s: Connecting...\n", file); | 	PrintStatus(0, FALSE, "Downloading %s: Connecting...\n", file); | ||||||
| 	uprintf("Downloading %s from %s\n", file, url); | 	uprintf("Downloading %s from %s\n", file, url); | ||||||
| 
 | 
 | ||||||
| 	if (!pfWinHttpCrackUrl(wUrl, 0, 0, &UrlParts)) { | 	if (!InternetCrackUrlA(url, safe_strlen(url), 0, &UrlParts)) { | ||||||
| 		uprintf("Unable to decode URL: %s\n", WinHTTPErrorString()); | 		uprintf("Unable to decode URL: %s\n", WindowsErrorString()); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	_snwprintf(wAgent, ARRAYSIZE(wAgent), L"Rufus/%d.%d.%d.%d", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | 	// Open an Internet session
 | ||||||
| 	// Use WinHttpOpen to obtain a session handle.
 | 	for (i=5; (i>0) && (!InternetGetConnectedState(&dwFlags, 0)); i--) { | ||||||
| 	hSession = pfWinHttpOpen(wAgent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); | 		Sleep(1000); | ||||||
| 	if (!hSession) { | 	} | ||||||
| 		uprintf("Could not open HTTP session: %s\n", WinHTTPErrorString()); | 	if (i <= 0) { | ||||||
|  | 		// http://msdn.microsoft.com/en-us/library/windows/desktop/aa384702.aspx is wrong...
 | ||||||
|  | 		SetLastError(ERROR_INTERNET_NOT_INITIALIZED); | ||||||
|  | 		uprintf("Network is unavailable: %s\n", WinInetErrorString()); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 	_snprintf(agent, ARRAYSIZE(agent), "Rufus/%d.%d.%d.%d", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | ||||||
|  | 	hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); | ||||||
|  | 	if (hSession == NULL) { | ||||||
|  | 		uprintf("Could not open internet session: %s\n", WinInetErrorString()); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Specify an HTTP server.
 | 	hConnection = InternetConnectA(hSession, UrlParts.lpszHostName, UrlParts.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, (DWORD_PTR)NULL); | ||||||
| 	hConnect = pfWinHttpConnect(hSession, UrlParts.lpszHostName, UrlParts.nPort, 0); | 	if (hConnection == NULL) { | ||||||
| 	if (!hConnect) { | 		uprintf("Could not connect to server %s:%d: %s\n", UrlParts.lpszHostName, UrlParts.nPort, WinInetErrorString()); | ||||||
| 		uprintf("Could not connect to HTTP server: %s\n", WinHTTPErrorString()); |  | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Create an HTTP request handle.
 | 	hRequest = HttpOpenRequestA(hConnection, "GET", UrlParts.lpszUrlPath, NULL, NULL, (const char**)"*/*\0", | ||||||
| 	hRequest = pfWinHttpOpenRequest(hConnect, L"GET", UrlParts.lpszUrlPath, | 		INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|INTERNET_FLAG_NO_COOKIES| | ||||||
| 		NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, | 		INTERNET_FLAG_NO_UI|INTERNET_FLAG_NO_CACHE_WRITE, (DWORD_PTR)NULL); | ||||||
| 		(UrlParts.nScheme == INTERNET_SCHEME_HTTPS)?WINHTTP_FLAG_SECURE:0); | 	if (hRequest == NULL) { | ||||||
| 	if (!hRequest) { | 		uprintf("Could not open url %s: %s\n", url, WindowsErrorString()); | ||||||
| 		uprintf("Could not create server request: %s\n", WinHTTPErrorString()); |  | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!pfWinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0 )) { | 	if (!HttpSendRequest(hRequest, NULL, 0, NULL, 0)) { | ||||||
| 		uprintf("Could not send server request: %s\n", WinHTTPErrorString()); | 		uprintf("Unable to send request: %s\n", WinInetErrorString()); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!pfWinHttpReceiveResponse(hRequest, NULL)) { | 	// Get the file size
 | ||||||
| 		uprintf("Failure to receive server response: %s\n", WinHTTPErrorString()); | 	dwSize = sizeof(dwStatus); | ||||||
|  | 	dwStatus = 404; | ||||||
|  | 	HttpQueryInfoA(hRequest, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwStatus, &dwSize, NULL); | ||||||
|  | 	if (dwStatus != 200) { | ||||||
|  | 		error_code = ERROR_INTERNET_ITEM_NOT_FOUND; | ||||||
|  | 		uprintf("Unable to acess file. Server status %d\n", dwStatus); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 	dwSize = sizeof(dwTotalSize); | ||||||
| 	if (!pfWinHttpQueryHeaders(hRequest, WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER, | 	if (!HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwTotalSize, &dwSize, NULL)) { | ||||||
| 		WINHTTP_HEADER_NAME_BY_INDEX, &dwTotalSize, &dwTotalSizeSize, WINHTTP_NO_HEADER_INDEX)) { | 		uprintf("Unable to retrieve file length: %s\n", WinInetErrorString()); | ||||||
| 		uprintf("Could not retreive file length: %s\n", WinHTTPErrorString()); |  | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 	uprintf("File length: %d bytes\n", dwTotalSize); | 	uprintf("File length: %d bytes\n", dwTotalSize); | ||||||
| 
 | 
 | ||||||
| 	fd = fopen(file, "wb"); | 	fd = fopen(file, "wb"); | ||||||
| 	if (fd == NULL) { | 	if (fd == NULL) { | ||||||
| 		uprintf("Unable to create file %s\n", file); | 		uprintf("Unable to create file %s: %s\n", file, WinInetErrorString()); | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Keep checking for data until there is nothing left.
 | 	// Keep checking for data until there is nothing left.
 | ||||||
| 	dwReadSize = 0; | 	dwSize = 0; | ||||||
| 	while(1) { | 	while (1) { | ||||||
| 		if (IS_ERROR(FormatStatus)) | 		if (IS_ERROR(FormatStatus)) | ||||||
| 			goto out; | 			goto out; | ||||||
| 
 | 
 | ||||||
| 		dwSize = 0; | 		if (!InternetReadFile(hRequest, buf, sizeof(buf), &dwDownloaded) || (dwDownloaded == 0)) | ||||||
| 		if (!pfWinHttpQueryDataAvailable(hRequest, &dwSize)) |  | ||||||
| 			uprintf("Error in WinHttpQueryDataAvailable: %s\n", WinHTTPErrorString()); |  | ||||||
| 		if (dwSize <= 0) |  | ||||||
| 			break; | 			break; | ||||||
| 
 | 		dwSize += dwDownloaded; | ||||||
| 		// Allocate space for the buffer.
 | 		SendMessage(hISOProgressBar, PBM_SETPOS, (WPARAM)(MAX_PROGRESS*((1.0f*dwSize)/(1.0f*dwTotalSize))), 0); | ||||||
| 		buf = (unsigned char*)malloc(dwSize+1); | 		PrintStatus(0, FALSE, "Downloading %s: %0.1f%%\n", file, (100.0f*dwSize)/(1.0f*dwTotalSize)); | ||||||
| 		if (buf == NULL) { | 		if (fwrite(buf, 1, dwDownloaded, fd) != dwDownloaded) { | ||||||
| 			uprintf("Could not allocate buffer for download.\n"); | 			uprintf("Error writing file %s: %s\n", file, WinInetErrorString()); | ||||||
| 			goto out; | 			goto out; | ||||||
| 		} | 		} | ||||||
| 		if (!pfWinHttpReadData(hRequest, (LPVOID)buf, dwSize, &dwDownloaded)) { |  | ||||||
| 			uprintf("Error in WinHttpReadData: %s\n", WinHTTPErrorString()); |  | ||||||
| 			goto out; |  | ||||||
| 		} |  | ||||||
| 		if (dwDownloaded != dwSize) { |  | ||||||
| 			uprintf("Error: expected %d bytes by received %d\n", dwSize, dwDownloaded); |  | ||||||
| 			goto out; |  | ||||||
| 		} |  | ||||||
| 		dwReadSize += dwDownloaded; |  | ||||||
| 		SendMessage(hISOProgressBar, PBM_SETPOS, (WPARAM)(MAX_PROGRESS*((1.0f*dwReadSize)/(1.0f*dwTotalSize))), 0); |  | ||||||
| 		PrintStatus(0, FALSE, "Downloading %s: %0.1f%%\n", file, (100.0f*dwReadSize)/(1.0f*dwTotalSize)); |  | ||||||
| 		if (fwrite(buf, 1, dwSize, fd) != dwSize) { |  | ||||||
| 			uprintf("Error writing file %s\n", file); |  | ||||||
| 			goto out; |  | ||||||
| 		} |  | ||||||
| 		safe_free(buf); |  | ||||||
| 	} | 	} | ||||||
| 	r = (dwReadSize == dwTotalSize); | 
 | ||||||
| 	if (r) | 	if (dwSize != dwTotalSize) { | ||||||
|  | 		uprintf("Could not download complete file - read: %d bytes, expected: %d bytes\n", dwSize, dwTotalSize); | ||||||
|  | 		FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; | ||||||
|  | 		goto out; | ||||||
|  | 	} else { | ||||||
|  | 		r = TRUE; | ||||||
| 		uprintf("Successfully downloaded %s\n", file); | 		uprintf("Successfully downloaded %s\n", file); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| out: | out: | ||||||
| 	ShowWindow(hISOProgressDlg, SW_HIDE); | 	ShowWindow(hISOProgressDlg, SW_HIDE); | ||||||
| 	safe_free(wUrl); |  | ||||||
| 	safe_free(buf); |  | ||||||
| 	if (fd != NULL) fclose(fd); | 	if (fd != NULL) fclose(fd); | ||||||
| 	if (!r) { | 	if (!r) { | ||||||
| 		_unlink(file); | 		_unlink(file); | ||||||
| 		PrintStatus(0, FALSE, "Failed to download file."); | 		PrintStatus(0, FALSE, "Failed to download file."); | ||||||
| 		MessageBoxA(hMainDialog, IS_ERROR(FormatStatus)?StrError(FormatStatus):WinHTTPErrorString(), | 		SetLastError(error_code); | ||||||
|  | 		MessageBoxA(hMainDialog, IS_ERROR(FormatStatus)?StrError(FormatStatus):WinInetErrorString(), | ||||||
| 		"File download", MB_OK|MB_ICONERROR); | 		"File download", MB_OK|MB_ICONERROR); | ||||||
| 	} | 	} | ||||||
| 	if (hRequest) pfWinHttpCloseHandle(hRequest); | 	if (hRequest) InternetCloseHandle(hRequest); | ||||||
| 	if (hConnect) pfWinHttpCloseHandle(hConnect); | 	if (hConnection) InternetCloseHandle(hConnection); | ||||||
| 	if (hSession) pfWinHttpCloseHandle(hSession); | 	if (hSession) InternetCloseHandle(hSession); | ||||||
| 
 | 
 | ||||||
| 	return r; | 	return r; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #define uuprintf if(verbose) uprintf | ||||||
|  | #define uuuprintf if(verbose>1) uprintf | ||||||
|  | // TODO: call this from a thread that will launch the download if successful
 | ||||||
|  | BOOL CheckForUpdates(const char* url) | ||||||
|  | { | ||||||
|  | 	BOOL r = FALSE; | ||||||
|  | 	int verbose = 2; | ||||||
|  | 	DWORD dwFlags, dwSize, dwDownloaded, dwTotalSize, dwStatus; | ||||||
|  | 	char* buf = NULL; | ||||||
|  | 	char agent[64], hostname[64], urlpath[128], mime[32]; | ||||||
|  | 	HINTERNET hSession = NULL, hConnection = NULL, hRequest = NULL; | ||||||
|  | 	URL_COMPONENTSA UrlParts = {sizeof(URL_COMPONENTSA), NULL, 1, (INTERNET_SCHEME)0, | ||||||
|  | 		hostname, sizeof(hostname), 0, NULL, 1, urlpath, sizeof(urlpath), NULL, 1}; | ||||||
|  | 	SYSTEMTIME ServerTime, LocalTime; | ||||||
|  | 	FILETIME FileTime; | ||||||
|  | 	int64_t local_time, reg_time, server_time, update_interval; | ||||||
|  | 
 | ||||||
|  | 	verbose = ReadRegistryKey32(REGKEY_VERBOSE_UPDATES); | ||||||
|  | 	if (GetRegistryKeyBool(REGKEY_DISABLE_UPDATES)) { | ||||||
|  | 		uuprintf("Check for updates disabled, as per registry settings.\n"); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 	reg_time = ReadRegistryKey64(REGKEY_LAST_UPDATE); | ||||||
|  | 	update_interval = (int64_t)ReadRegistryKey32(REGKEY_UPDATE_INTERVAL); | ||||||
|  | 	if (update_interval == 0) { | ||||||
|  | 		WriteRegistryKey32(REGKEY_UPDATE_INTERVAL, DEFAULT_UPDATE_INTERVAL); | ||||||
|  | 		update_interval = DEFAULT_UPDATE_INTERVAL; | ||||||
|  | 	} | ||||||
|  | 	GetSystemTime(&LocalTime); | ||||||
|  | 	if (!SystemTimeToFileTime(&LocalTime, &FileTime)) | ||||||
|  | 		goto out; | ||||||
|  | 	local_time = ((((int64_t)FileTime.dwHighDateTime)<<32) + FileTime.dwLowDateTime) / 10000000; | ||||||
|  | 	uuuprintf("Local time: %" PRId64 "\n", local_time); | ||||||
|  | 	if (local_time < reg_time + update_interval) { | ||||||
|  | 		uuprintf("Next update check in %" PRId64 " seconds.\n", reg_time + update_interval - local_time); | ||||||
|  | 		return FALSE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	PrintStatus(3000, FALSE, "Checking for Rufus updates...\n"); | ||||||
|  | 
 | ||||||
|  | 	if ((!InternetCrackUrlA(url, safe_strlen(url), 0, &UrlParts)) || (!InternetGetConnectedState(&dwFlags, 0))) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	_snprintf(agent, ARRAYSIZE(agent), "Rufus/%d.%d.%d.%d", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | ||||||
|  | 	hSession = InternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); | ||||||
|  | 	if (hSession == NULL) | ||||||
|  | 		goto out; | ||||||
|  | 	hConnection = InternetConnectA(hSession, UrlParts.lpszHostName, UrlParts.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, (DWORD_PTR)NULL); | ||||||
|  | 	if (hConnection == NULL) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	hRequest = HttpOpenRequestA(hConnection, "GET", UrlParts.lpszUrlPath, NULL, NULL, (const char**)"*/*\0", | ||||||
|  | 		INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP|INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|INTERNET_FLAG_NO_COOKIES| | ||||||
|  | 		INTERNET_FLAG_NO_UI|INTERNET_FLAG_NO_CACHE_WRITE, (DWORD_PTR)NULL); | ||||||
|  | 	if ((hRequest == NULL) || (!HttpSendRequest(hRequest, NULL, 0, NULL, 0))) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	// Ensure that we get a text file
 | ||||||
|  | 	dwSize = sizeof(dwStatus); | ||||||
|  | 	dwStatus = 404; | ||||||
|  | 	HttpQueryInfoA(hRequest, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwStatus, &dwSize, NULL); | ||||||
|  | 	if (dwStatus != 200) goto out; | ||||||
|  | 	dwSize = sizeof(mime); | ||||||
|  | 	HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, (LPVOID)&mime, &dwSize, NULL); | ||||||
|  | 	if (strcmp(mime, "text/plain") != 0) | ||||||
|  | 		goto out; | ||||||
|  | 	// We also get a date from Apache, which we'll use to avoid out of sync check,
 | ||||||
|  | 	// in case some set their clock way into the future and back.
 | ||||||
|  | 	// On the other hand, if local clock is set way back in the past, we will never check.
 | ||||||
|  | 	dwSize = sizeof(ServerTime); | ||||||
|  | 	// If we can't get a date we can trust, don't bother...
 | ||||||
|  | 	if ( (!HttpQueryInfoA(hRequest, HTTP_QUERY_DATE|HTTP_QUERY_FLAG_SYSTEMTIME, (LPVOID)&ServerTime, &dwSize, NULL)) | ||||||
|  | 	  || (!SystemTimeToFileTime(&ServerTime, &FileTime)) ) | ||||||
|  | 		goto out; | ||||||
|  | 	server_time = ((((int64_t)FileTime.dwHighDateTime)<<32) + FileTime.dwLowDateTime) / 10000000; | ||||||
|  | 	uuuprintf("Server time: %" PRId64 "\n", server_time); | ||||||
|  | 	// Always store the server response time - the only clock we trust!
 | ||||||
|  | 	WriteRegistryKey64(REGKEY_LAST_UPDATE, server_time); | ||||||
|  | 	// Might as well let the user know
 | ||||||
|  | 	if (local_time > server_time + 600) { | ||||||
|  | 		uprintf("Your local clock seems more than 10 minutes early - You probably want to fix that...\n"); | ||||||
|  | 	} | ||||||
|  | 	if (local_time < server_time - 600) { | ||||||
|  | 		uprintf("Your local clock seems more than 10 minutes late - you probably want to fix that...\n"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dwSize = sizeof(dwTotalSize); | ||||||
|  | 	if (!HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwTotalSize, &dwSize, NULL)) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	buf = (char*)calloc(dwTotalSize+1, 1); | ||||||
|  | 	// Our buffer is always supposed to be large enough, and our read is always supposed to be in one go
 | ||||||
|  | 	if (!InternetReadFile(hRequest, buf, dwTotalSize, &dwDownloaded) || (dwDownloaded != dwTotalSize)) | ||||||
|  | 		goto out; | ||||||
|  | 
 | ||||||
|  | 	uuprintf("Successfully downloaded version file %s (%d bytes)\n", url, dwTotalSize); | ||||||
|  | 	uuprintf("%s\n", buf); | ||||||
|  | 	r = TRUE; | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	safe_free(buf); | ||||||
|  | 	if (hRequest) InternetCloseHandle(hRequest); | ||||||
|  | 	if (hConnection) InternetCloseHandle(hConnection); | ||||||
|  | 	if (hSession) InternetCloseHandle(hSession); | ||||||
|  | 	return r; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										571
									
								
								src/net.h
									
										
									
									
									
								
							
							
						
						
									
										571
									
								
								src/net.h
									
										
									
									
									
								
							|  | @ -1,571 +0,0 @@ | ||||||
| /*
 |  | ||||||
|  * Rufus: The Reliable USB Formatting Utility |  | ||||||
|  * Networking functionality (web file download, etc.) |  | ||||||
|  * Copyright (c) 2012 Pete Batard <pete@akeo.ie> |  | ||||||
|  * based on winhttp.h from the Wine project |  | ||||||
|  * Copyright (C) 2007 Francois Gouget |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU General Public License as published by |  | ||||||
|  * the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  * (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU General Public License |  | ||||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| #include <windows.h> |  | ||||||
| 
 |  | ||||||
| #define WINHTTPAPI |  | ||||||
| #define BOOLAPI WINHTTPAPI BOOL WINAPI |  | ||||||
| 
 |  | ||||||
| typedef LPVOID HINTERNET; |  | ||||||
| typedef HINTERNET *LPHINTERNET; |  | ||||||
| 
 |  | ||||||
| #define INTERNET_DEFAULT_PORT           0 |  | ||||||
| #define INTERNET_DEFAULT_HTTP_PORT      80 |  | ||||||
| #define INTERNET_DEFAULT_HTTPS_PORT     443 |  | ||||||
| typedef WORD INTERNET_PORT; |  | ||||||
| typedef INTERNET_PORT *LPINTERNET_PORT; |  | ||||||
| 
 |  | ||||||
| #define INTERNET_SCHEME_HTTP            1 |  | ||||||
| #define INTERNET_SCHEME_HTTPS           2 |  | ||||||
| typedef int INTERNET_SCHEME, *LPINTERNET_SCHEME; |  | ||||||
| 
 |  | ||||||
| #define ICU_ESCAPE  0x80000000 |  | ||||||
| 
 |  | ||||||
| /* flags for WinHttpOpen */ |  | ||||||
| #define WINHTTP_FLAG_ASYNC                  0x10000000 |  | ||||||
| 
 |  | ||||||
| /* flags for WinHttpOpenRequest */ |  | ||||||
| #define WINHTTP_FLAG_ESCAPE_PERCENT         0x00000004 |  | ||||||
| #define WINHTTP_FLAG_NULL_CODEPAGE          0x00000008 |  | ||||||
| #define WINHTTP_FLAG_ESCAPE_DISABLE         0x00000040 |  | ||||||
| #define WINHTTP_FLAG_ESCAPE_DISABLE_QUERY   0x00000080 |  | ||||||
| #define WINHTTP_FLAG_BYPASS_PROXY_CACHE     0x00000100 |  | ||||||
| #define WINHTTP_FLAG_REFRESH                WINHTTP_FLAG_BYPASS_PROXY_CACHE |  | ||||||
| #define WINHTTP_FLAG_SECURE                 0x00800000 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_ACCESS_TYPE_DEFAULT_PROXY   0 |  | ||||||
| #define WINHTTP_ACCESS_TYPE_NO_PROXY        1 |  | ||||||
| #define WINHTTP_ACCESS_TYPE_NAMED_PROXY     3 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_NO_PROXY_NAME               NULL |  | ||||||
| #define WINHTTP_NO_PROXY_BYPASS             NULL |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_NO_REFERER                  NULL |  | ||||||
| #define WINHTTP_DEFAULT_ACCEPT_TYPES        NULL |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_NO_ADDITIONAL_HEADERS       NULL |  | ||||||
| #define WINHTTP_NO_REQUEST_DATA             NULL |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_HEADER_NAME_BY_INDEX        NULL |  | ||||||
| #define WINHTTP_NO_OUTPUT_BUFFER            NULL |  | ||||||
| #define WINHTTP_NO_HEADER_INDEX             NULL |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_ADDREQ_INDEX_MASK                    0x0000FFFF |  | ||||||
| #define WINHTTP_ADDREQ_FLAGS_MASK                    0xFFFF0000 |  | ||||||
| #define WINHTTP_ADDREQ_FLAG_ADD_IF_NEW               0x10000000 |  | ||||||
| #define WINHTTP_ADDREQ_FLAG_ADD                      0x20000000 |  | ||||||
| #define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA      0x40000000 |  | ||||||
| #define WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON  0x01000000 |  | ||||||
| #define WINHTTP_ADDREQ_FLAG_COALESCE                 WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA |  | ||||||
| #define WINHTTP_ADDREQ_FLAG_REPLACE                  0x80000000 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH 0 |  | ||||||
| 
 |  | ||||||
| /* flags for WinHttp{Set/Query}Options */ |  | ||||||
| #define WINHTTP_FIRST_OPTION                         WINHTTP_OPTION_CALLBACK |  | ||||||
| #define WINHTTP_OPTION_CALLBACK                       1 |  | ||||||
| #define WINHTTP_OPTION_RESOLVE_TIMEOUT                2 |  | ||||||
| #define WINHTTP_OPTION_CONNECT_TIMEOUT                3 |  | ||||||
| #define WINHTTP_OPTION_CONNECT_RETRIES                4 |  | ||||||
| #define WINHTTP_OPTION_SEND_TIMEOUT                   5 |  | ||||||
| #define WINHTTP_OPTION_RECEIVE_TIMEOUT                6 |  | ||||||
| #define WINHTTP_OPTION_RECEIVE_RESPONSE_TIMEOUT       7 |  | ||||||
| #define WINHTTP_OPTION_HANDLE_TYPE                    9 |  | ||||||
| #define WINHTTP_OPTION_READ_BUFFER_SIZE              12 |  | ||||||
| #define WINHTTP_OPTION_WRITE_BUFFER_SIZE             13 |  | ||||||
| #define WINHTTP_OPTION_PARENT_HANDLE                 21 |  | ||||||
| #define WINHTTP_OPTION_EXTENDED_ERROR                24 |  | ||||||
| #define WINHTTP_OPTION_SECURITY_FLAGS                31 |  | ||||||
| #define WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT   32 |  | ||||||
| #define WINHTTP_OPTION_URL                           34 |  | ||||||
| #define WINHTTP_OPTION_SECURITY_KEY_BITNESS          36 |  | ||||||
| #define WINHTTP_OPTION_PROXY                         38 |  | ||||||
| #define WINHTTP_OPTION_USER_AGENT                    41 |  | ||||||
| #define WINHTTP_OPTION_CONTEXT_VALUE                 45 |  | ||||||
| #define WINHTTP_OPTION_CLIENT_CERT_CONTEXT           47 |  | ||||||
| #define WINHTTP_OPTION_REQUEST_PRIORITY              58 |  | ||||||
| #define WINHTTP_OPTION_HTTP_VERSION                  59 |  | ||||||
| #define WINHTTP_OPTION_DISABLE_FEATURE               63 |  | ||||||
| #define WINHTTP_OPTION_CODEPAGE                      68 |  | ||||||
| #define WINHTTP_OPTION_MAX_CONNS_PER_SERVER          73 |  | ||||||
| #define WINHTTP_OPTION_MAX_CONNS_PER_1_0_SERVER      74 |  | ||||||
| #define WINHTTP_OPTION_AUTOLOGON_POLICY              77 |  | ||||||
| #define WINHTTP_OPTION_SERVER_CERT_CONTEXT           78 |  | ||||||
| #define WINHTTP_OPTION_ENABLE_FEATURE                79 |  | ||||||
| #define WINHTTP_OPTION_WORKER_THREAD_COUNT           80 |  | ||||||
| #define WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT      81 |  | ||||||
| #define WINHTTP_OPTION_PASSPORT_COBRANDING_URL       82 |  | ||||||
| #define WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH       83 |  | ||||||
| #define WINHTTP_OPTION_SECURE_PROTOCOLS              84 |  | ||||||
| #define WINHTTP_OPTION_ENABLETRACING                 85 |  | ||||||
| #define WINHTTP_OPTION_PASSPORT_SIGN_OUT             86 |  | ||||||
| #define WINHTTP_OPTION_PASSPORT_RETURN_URL           87 |  | ||||||
| #define WINHTTP_OPTION_REDIRECT_POLICY               88 |  | ||||||
| #define WINHTTP_OPTION_MAX_HTTP_AUTOMATIC_REDIRECTS  89 |  | ||||||
| #define WINHTTP_OPTION_MAX_HTTP_STATUS_CONTINUE      90 |  | ||||||
| #define WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE      91 |  | ||||||
| #define WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE       92 |  | ||||||
| #define WINHTTP_OPTION_CONNECTION_INFO               93 |  | ||||||
| #define WINHTTP_OPTION_CLIENT_CERT_ISSUER_LIST       94 |  | ||||||
| #define WINHTTP_OPTION_SPN                           96 |  | ||||||
| #define WINHTTP_OPTION_GLOBAL_PROXY_CREDS            97 |  | ||||||
| #define WINHTTP_OPTION_GLOBAL_SERVER_CREDS           98 |  | ||||||
| #define WINHTTP_OPTION_UNLOAD_NOTIFY_EVENT           99 |  | ||||||
| #define WINHTTP_OPTION_REJECT_USERPWD_IN_URL         100 |  | ||||||
| #define WINHTTP_OPTION_USE_GLOBAL_SERVER_CREDENTIALS 101 |  | ||||||
| #define WINHTTP_LAST_OPTION                          WINHTTP_OPTION_USE_GLOBAL_SERVER_CREDENTIALS |  | ||||||
| #define WINHTTP_OPTION_USERNAME                      0x1000 |  | ||||||
| #define WINHTTP_OPTION_PASSWORD                      0x1001 |  | ||||||
| #define WINHTTP_OPTION_PROXY_USERNAME                0x1002 |  | ||||||
| #define WINHTTP_OPTION_PROXY_PASSWORD                0x1003 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_CONNS_PER_SERVER_UNLIMITED 0xFFFFFFFF |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM   0 |  | ||||||
| #define WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW      1 |  | ||||||
| #define WINHTTP_AUTOLOGON_SECURITY_LEVEL_HIGH     2 |  | ||||||
| #define WINHTTP_AUTOLOGON_SECURITY_LEVEL_DEFAULT  WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_OPTION_REDIRECT_POLICY_NEVER                        0 |  | ||||||
| #define WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP       1 |  | ||||||
| #define WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS                       2 |  | ||||||
| #define WINHTTP_OPTION_REDIRECT_POLICY_LAST            WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS |  | ||||||
| #define WINHTTP_OPTION_REDIRECT_POLICY_DEFAULT         WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_DISABLE_PASSPORT_AUTH    0x00000000 |  | ||||||
| #define WINHTTP_ENABLE_PASSPORT_AUTH     0x10000000 |  | ||||||
| #define WINHTTP_DISABLE_PASSPORT_KEYRING 0x20000000 |  | ||||||
| #define WINHTTP_ENABLE_PASSPORT_KEYRING  0x40000000 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_DISABLE_COOKIES                   0x00000001 |  | ||||||
| #define WINHTTP_DISABLE_REDIRECTS                 0x00000002 |  | ||||||
| #define WINHTTP_DISABLE_AUTHENTICATION            0x00000004 |  | ||||||
| #define WINHTTP_DISABLE_KEEP_ALIVE                0x00000008 |  | ||||||
| #define WINHTTP_ENABLE_SSL_REVOCATION             0x00000001 |  | ||||||
| #define WINHTTP_ENABLE_SSL_REVERT_IMPERSONATION   0x00000002 |  | ||||||
| #define WINHTTP_DISABLE_SPN_SERVER_PORT           0x00000000 |  | ||||||
| #define WINHTTP_ENABLE_SPN_SERVER_PORT            0x00000001 |  | ||||||
| #define WINHTTP_OPTION_SPN_MASK                   WINHTTP_ENABLE_SPN_SERVER_PORT |  | ||||||
| 
 |  | ||||||
| /* Options for WinHttpOpenRequest */ |  | ||||||
| #define WINHTTP_NO_REFERER             NULL |  | ||||||
| #define WINHTTP_DEFAULT_ACCEPT_TYPES   NULL |  | ||||||
| 
 |  | ||||||
| /* Options for WinHttpSendRequest */ |  | ||||||
| #define WINHTTP_NO_ADDITIONAL_HEADERS   NULL |  | ||||||
| #define WINHTTP_NO_REQUEST_DATA         NULL |  | ||||||
| 
 |  | ||||||
| /* WinHTTP error codes */ |  | ||||||
| #define WINHTTP_ERROR_BASE                                  12000 |  | ||||||
| #define ERROR_WINHTTP_OUT_OF_HANDLES                        (WINHTTP_ERROR_BASE + 1) |  | ||||||
| #define ERROR_WINHTTP_TIMEOUT                               (WINHTTP_ERROR_BASE + 2) |  | ||||||
| #define ERROR_WINHTTP_INTERNAL_ERROR                        (WINHTTP_ERROR_BASE + 4) |  | ||||||
| #define ERROR_WINHTTP_INVALID_URL                           (WINHTTP_ERROR_BASE + 5) |  | ||||||
| #define ERROR_WINHTTP_UNRECOGNIZED_SCHEME                   (WINHTTP_ERROR_BASE + 6) |  | ||||||
| #define ERROR_WINHTTP_NAME_NOT_RESOLVED                     (WINHTTP_ERROR_BASE + 7) |  | ||||||
| #define ERROR_WINHTTP_INVALID_OPTION                        (WINHTTP_ERROR_BASE + 9) |  | ||||||
| #define ERROR_WINHTTP_OPTION_NOT_SETTABLE                   (WINHTTP_ERROR_BASE + 11) |  | ||||||
| #define ERROR_WINHTTP_SHUTDOWN                              (WINHTTP_ERROR_BASE + 12) |  | ||||||
| #define ERROR_WINHTTP_LOGIN_FAILURE                         (WINHTTP_ERROR_BASE + 15) |  | ||||||
| #define ERROR_WINHTTP_OPERATION_CANCELLED                   (WINHTTP_ERROR_BASE + 17) |  | ||||||
| #define ERROR_WINHTTP_INCORRECT_HANDLE_TYPE                 (WINHTTP_ERROR_BASE + 18) |  | ||||||
| #define ERROR_WINHTTP_INCORRECT_HANDLE_STATE                (WINHTTP_ERROR_BASE + 19) |  | ||||||
| #define ERROR_WINHTTP_CANNOT_CONNECT                        (WINHTTP_ERROR_BASE + 29) |  | ||||||
| #define ERROR_WINHTTP_CONNECTION_ERROR                      (WINHTTP_ERROR_BASE + 30) |  | ||||||
| #define ERROR_WINHTTP_RESEND_REQUEST                        (WINHTTP_ERROR_BASE + 32) |  | ||||||
| #define ERROR_WINHTTP_SECURE_CERT_DATE_INVALID              (WINHTTP_ERROR_BASE + 37) |  | ||||||
| #define ERROR_WINHTTP_SECURE_CERT_CN_INVALID                (WINHTTP_ERROR_BASE + 38) |  | ||||||
| #define ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED               (WINHTTP_ERROR_BASE + 44) |  | ||||||
| #define ERROR_WINHTTP_SECURE_INVALID_CA                     (WINHTTP_ERROR_BASE + 45) |  | ||||||
| #define ERROR_WINHTTP_SECURE_CERT_REV_FAILED                (WINHTTP_ERROR_BASE + 57) |  | ||||||
| #define ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN               (WINHTTP_ERROR_BASE + 100) |  | ||||||
| #define ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND               (WINHTTP_ERROR_BASE + 101) |  | ||||||
| #define ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND                (WINHTTP_ERROR_BASE + 102) |  | ||||||
| #define ERROR_WINHTTP_CANNOT_CALL_AFTER_OPEN                (WINHTTP_ERROR_BASE + 103) |  | ||||||
| #define ERROR_WINHTTP_HEADER_NOT_FOUND                      (WINHTTP_ERROR_BASE + 150) |  | ||||||
| #define ERROR_WINHTTP_INVALID_SERVER_RESPONSE               (WINHTTP_ERROR_BASE + 152) |  | ||||||
| #define ERROR_WINHTTP_INVALID_HEADER                        (WINHTTP_ERROR_BASE + 153) |  | ||||||
| #define ERROR_WINHTTP_INVALID_QUERY_REQUEST                 (WINHTTP_ERROR_BASE + 154) |  | ||||||
| #define ERROR_WINHTTP_HEADER_ALREADY_EXISTS                 (WINHTTP_ERROR_BASE + 155) |  | ||||||
| #define ERROR_WINHTTP_REDIRECT_FAILED                       (WINHTTP_ERROR_BASE + 156) |  | ||||||
| #define ERROR_WINHTTP_SECURE_CHANNEL_ERROR                  (WINHTTP_ERROR_BASE + 157) |  | ||||||
| #define ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT                 (WINHTTP_ERROR_BASE + 166) |  | ||||||
| #define ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT             (WINHTTP_ERROR_BASE + 167) |  | ||||||
| #define ERROR_WINHTTP_SECURE_INVALID_CERT                   (WINHTTP_ERROR_BASE + 169) |  | ||||||
| #define ERROR_WINHTTP_SECURE_CERT_REVOKED                   (WINHTTP_ERROR_BASE + 170) |  | ||||||
| #define ERROR_WINHTTP_NOT_INITIALIZED                       (WINHTTP_ERROR_BASE + 172) |  | ||||||
| #define ERROR_WINHTTP_SECURE_FAILURE                        (WINHTTP_ERROR_BASE + 175) |  | ||||||
| #define ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR              (WINHTTP_ERROR_BASE + 178) |  | ||||||
| #define ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE               (WINHTTP_ERROR_BASE + 179) |  | ||||||
| #define ERROR_WINHTTP_AUTODETECTION_FAILED                  (WINHTTP_ERROR_BASE + 180) |  | ||||||
| #define ERROR_WINHTTP_HEADER_COUNT_EXCEEDED                 (WINHTTP_ERROR_BASE + 181) |  | ||||||
| #define ERROR_WINHTTP_HEADER_SIZE_OVERFLOW                  (WINHTTP_ERROR_BASE + 182) |  | ||||||
| #define ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW (WINHTTP_ERROR_BASE + 183) |  | ||||||
| #define ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW               (WINHTTP_ERROR_BASE + 184) |  | ||||||
| #define ERROR_WINHTTP_CLIENT_CERT_NO_PRIVATE_KEY            (WINHTTP_ERROR_BASE + 185) |  | ||||||
| #define ERROR_WINHTTP_CLIENT_CERT_NO_ACCESS_PRIVATE_KEY     (WINHTTP_ERROR_BASE + 186) |  | ||||||
| #define WINHTTP_ERROR_LAST                                  (WINHTTP_ERROR_BASE + 186) |  | ||||||
| 
 |  | ||||||
| /* WinHttp status codes */ |  | ||||||
| #define HTTP_STATUS_CONTINUE            100 |  | ||||||
| #define HTTP_STATUS_SWITCH_PROTOCOLS    101 |  | ||||||
| #define HTTP_STATUS_OK                  200 |  | ||||||
| #define HTTP_STATUS_CREATED             201 |  | ||||||
| #define HTTP_STATUS_ACCEPTED            202 |  | ||||||
| #define HTTP_STATUS_PARTIAL             203 |  | ||||||
| #define HTTP_STATUS_NO_CONTENT          204 |  | ||||||
| #define HTTP_STATUS_RESET_CONTENT       205 |  | ||||||
| #define HTTP_STATUS_PARTIAL_CONTENT     206 |  | ||||||
| #define HTTP_STATUS_WEBDAV_MULTI_STATUS 207 |  | ||||||
| #define HTTP_STATUS_AMBIGUOUS           300 |  | ||||||
| #define HTTP_STATUS_MOVED               301 |  | ||||||
| #define HTTP_STATUS_REDIRECT            302 |  | ||||||
| #define HTTP_STATUS_REDIRECT_METHOD     303 |  | ||||||
| #define HTTP_STATUS_NOT_MODIFIED        304 |  | ||||||
| #define HTTP_STATUS_USE_PROXY           305 |  | ||||||
| #define HTTP_STATUS_REDIRECT_KEEP_VERB  307 |  | ||||||
| #define HTTP_STATUS_BAD_REQUEST         400 |  | ||||||
| #define HTTP_STATUS_DENIED              401 |  | ||||||
| #define HTTP_STATUS_PAYMENT_REQ         402 |  | ||||||
| #define HTTP_STATUS_FORBIDDEN           403 |  | ||||||
| #define HTTP_STATUS_NOT_FOUND           404 |  | ||||||
| #define HTTP_STATUS_BAD_METHOD          405 |  | ||||||
| #define HTTP_STATUS_NONE_ACCEPTABLE     406 |  | ||||||
| #define HTTP_STATUS_PROXY_AUTH_REQ      407 |  | ||||||
| #define HTTP_STATUS_REQUEST_TIMEOUT     408 |  | ||||||
| #define HTTP_STATUS_CONFLICT            409 |  | ||||||
| #define HTTP_STATUS_GONE                410 |  | ||||||
| #define HTTP_STATUS_LENGTH_REQUIRED     411 |  | ||||||
| #define HTTP_STATUS_PRECOND_FAILED      412 |  | ||||||
| #define HTTP_STATUS_REQUEST_TOO_LARGE   413 |  | ||||||
| #define HTTP_STATUS_URI_TOO_LONG        414 |  | ||||||
| #define HTTP_STATUS_UNSUPPORTED_MEDIA   415 |  | ||||||
| #define HTTP_STATUS_RETRY_WITH          449 |  | ||||||
| #define HTTP_STATUS_SERVER_ERROR        500 |  | ||||||
| #define HTTP_STATUS_NOT_SUPPORTED       501 |  | ||||||
| #define HTTP_STATUS_BAD_GATEWAY         502 |  | ||||||
| #define HTTP_STATUS_SERVICE_UNAVAIL     503 |  | ||||||
| #define HTTP_STATUS_GATEWAY_TIMEOUT     504 |  | ||||||
| #define HTTP_STATUS_VERSION_NOT_SUP     505 |  | ||||||
| #define HTTP_STATUS_FIRST               HTTP_STATUS_CONTINUE |  | ||||||
| #define HTTP_STATUS_LAST                HTTP_STATUS_VERSION_NOT_SUP |  | ||||||
| 
 |  | ||||||
| #define SECURITY_FLAG_IGNORE_UNKNOWN_CA         0x00000100 |  | ||||||
| #define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID  0x00002000 |  | ||||||
| #define SECURITY_FLAG_IGNORE_CERT_CN_INVALID    0x00001000 |  | ||||||
| #define SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE   0x00000200 |  | ||||||
| #define SECURITY_FLAG_SECURE                    0x00000001 |  | ||||||
| #define SECURITY_FLAG_STRENGTH_WEAK             0x10000000 |  | ||||||
| #define SECURITY_FLAG_STRENGTH_MEDIUM           0x40000000 |  | ||||||
| #define SECURITY_FLAG_STRENGTH_STRONG           0x20000000 |  | ||||||
| 
 |  | ||||||
| #define ICU_NO_ENCODE          0x20000000 |  | ||||||
| #define ICU_DECODE             0x10000000 |  | ||||||
| #define ICU_NO_META            0x08000000 |  | ||||||
| #define ICU_ENCODE_SPACES_ONLY 0x04000000 |  | ||||||
| #define ICU_BROWSER_MODE       0x02000000 |  | ||||||
| #define ICU_ENCODE_PERCENT     0x00001000 |  | ||||||
| 
 |  | ||||||
| /* Query flags */ |  | ||||||
| #define WINHTTP_QUERY_MIME_VERSION                 0 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_TYPE                 1 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_TRANSFER_ENCODING    2 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_ID                   3 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_DESCRIPTION          4 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_LENGTH               5 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_LANGUAGE             6 |  | ||||||
| #define WINHTTP_QUERY_ALLOW                        7 |  | ||||||
| #define WINHTTP_QUERY_PUBLIC                       8 |  | ||||||
| #define WINHTTP_QUERY_DATE                         9 |  | ||||||
| #define WINHTTP_QUERY_EXPIRES                      10 |  | ||||||
| #define WINHTTP_QUERY_LAST_MODIFIED                11 |  | ||||||
| #define WINHTTP_QUERY_MESSAGE_ID                   12 |  | ||||||
| #define WINHTTP_QUERY_URI                          13 |  | ||||||
| #define WINHTTP_QUERY_DERIVED_FROM                 14 |  | ||||||
| #define WINHTTP_QUERY_COST                         15 |  | ||||||
| #define WINHTTP_QUERY_LINK                         16 |  | ||||||
| #define WINHTTP_QUERY_PRAGMA                       17 |  | ||||||
| #define WINHTTP_QUERY_VERSION                      18 |  | ||||||
| #define WINHTTP_QUERY_STATUS_CODE                  19 |  | ||||||
| #define WINHTTP_QUERY_STATUS_TEXT                  20 |  | ||||||
| #define WINHTTP_QUERY_RAW_HEADERS                  21 |  | ||||||
| #define WINHTTP_QUERY_RAW_HEADERS_CRLF             22 |  | ||||||
| #define WINHTTP_QUERY_CONNECTION                   23 |  | ||||||
| #define WINHTTP_QUERY_ACCEPT                       24 |  | ||||||
| #define WINHTTP_QUERY_ACCEPT_CHARSET               25 |  | ||||||
| #define WINHTTP_QUERY_ACCEPT_ENCODING              26 |  | ||||||
| #define WINHTTP_QUERY_ACCEPT_LANGUAGE              27 |  | ||||||
| #define WINHTTP_QUERY_AUTHORIZATION                28 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_ENCODING             29 |  | ||||||
| #define WINHTTP_QUERY_FORWARDED                    30 |  | ||||||
| #define WINHTTP_QUERY_FROM                         31 |  | ||||||
| #define WINHTTP_QUERY_IF_MODIFIED_SINCE            32 |  | ||||||
| #define WINHTTP_QUERY_LOCATION                     33 |  | ||||||
| #define WINHTTP_QUERY_ORIG_URI                     34 |  | ||||||
| #define WINHTTP_QUERY_REFERER                      35 |  | ||||||
| #define WINHTTP_QUERY_RETRY_AFTER                  36 |  | ||||||
| #define WINHTTP_QUERY_SERVER                       37 |  | ||||||
| #define WINHTTP_QUERY_TITLE                        38 |  | ||||||
| #define WINHTTP_QUERY_USER_AGENT                   39 |  | ||||||
| #define WINHTTP_QUERY_WWW_AUTHENTICATE             40 |  | ||||||
| #define WINHTTP_QUERY_PROXY_AUTHENTICATE           41 |  | ||||||
| #define WINHTTP_QUERY_ACCEPT_RANGES                42 |  | ||||||
| #define WINHTTP_QUERY_SET_COOKIE                   43 |  | ||||||
| #define WINHTTP_QUERY_COOKIE                       44 |  | ||||||
| #define WINHTTP_QUERY_REQUEST_METHOD               45 |  | ||||||
| #define WINHTTP_QUERY_REFRESH                      46 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_DISPOSITION          47 |  | ||||||
| #define WINHTTP_QUERY_AGE                          48 |  | ||||||
| #define WINHTTP_QUERY_CACHE_CONTROL                49 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_BASE                 50 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_LOCATION             51 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_MD5                  52 |  | ||||||
| #define WINHTTP_QUERY_CONTENT_RANGE                53 |  | ||||||
| #define WINHTTP_QUERY_ETAG                         54 |  | ||||||
| #define WINHTTP_QUERY_HOST                         55 |  | ||||||
| #define WINHTTP_QUERY_IF_MATCH                     56 |  | ||||||
| #define WINHTTP_QUERY_IF_NONE_MATCH                57 |  | ||||||
| #define WINHTTP_QUERY_IF_RANGE                     58 |  | ||||||
| #define WINHTTP_QUERY_IF_UNMODIFIED_SINCE          59 |  | ||||||
| #define WINHTTP_QUERY_MAX_FORWARDS                 60 |  | ||||||
| #define WINHTTP_QUERY_PROXY_AUTHORIZATION          61 |  | ||||||
| #define WINHTTP_QUERY_RANGE                        62 |  | ||||||
| #define WINHTTP_QUERY_TRANSFER_ENCODING            63 |  | ||||||
| #define WINHTTP_QUERY_UPGRADE                      64 |  | ||||||
| #define WINHTTP_QUERY_VARY                         65 |  | ||||||
| #define WINHTTP_QUERY_VIA                          66 |  | ||||||
| #define WINHTTP_QUERY_WARNING                      67 |  | ||||||
| #define WINHTTP_QUERY_EXPECT                       68 |  | ||||||
| #define WINHTTP_QUERY_PROXY_CONNECTION             69 |  | ||||||
| #define WINHTTP_QUERY_UNLESS_MODIFIED_SINCE        70 |  | ||||||
| #define WINHTTP_QUERY_PROXY_SUPPORT                75 |  | ||||||
| #define WINHTTP_QUERY_AUTHENTICATION_INFO          76 |  | ||||||
| #define WINHTTP_QUERY_PASSPORT_URLS                77 |  | ||||||
| #define WINHTTP_QUERY_PASSPORT_CONFIG              78 |  | ||||||
| #define WINHTTP_QUERY_MAX                          78 |  | ||||||
| #define WINHTTP_QUERY_CUSTOM                       65535 |  | ||||||
| #define WINHTTP_QUERY_FLAG_REQUEST_HEADERS         0x80000000 |  | ||||||
| #define WINHTTP_QUERY_FLAG_SYSTEMTIME              0x40000000 |  | ||||||
| #define WINHTTP_QUERY_FLAG_NUMBER                  0x20000000 |  | ||||||
| 
 |  | ||||||
| /* Callback options */ |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_RESOLVING_NAME          0x00000001 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_NAME_RESOLVED           0x00000002 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER    0x00000004 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER     0x00000008 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_SENDING_REQUEST         0x00000010 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_REQUEST_SENT            0x00000020 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE      0x00000040 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED       0x00000080 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION      0x00000100 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED       0x00000200 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_HANDLE_CREATED          0x00000400 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING          0x00000800 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_DETECTING_PROXY         0x00001000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_REDIRECT                0x00004000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE   0x00008000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_SECURE_FAILURE          0x00010000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE       0x00020000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE          0x00040000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_READ_COMPLETE           0x00080000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE          0x00100000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_REQUEST_ERROR           0x00200000 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE    0x00400000 |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_RESOLVE_NAME              (WINHTTP_CALLBACK_STATUS_RESOLVING_NAME | WINHTTP_CALLBACK_STATUS_NAME_RESOLVED) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_CONNECT_TO_SERVER         (WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER | WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_SEND_REQUEST              (WINHTTP_CALLBACK_STATUS_SENDING_REQUEST | WINHTTP_CALLBACK_STATUS_REQUEST_SENT) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_RECEIVE_RESPONSE          (WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE | WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_CLOSE_CONNECTION          (WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION | WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_HANDLES                   (WINHTTP_CALLBACK_STATUS_HANDLE_CREATED | WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_DETECTING_PROXY           WINHTTP_CALLBACK_STATUS_DETECTING_PROXY |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_REDIRECT                  WINHTTP_CALLBACK_STATUS_REDIRECT |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_INTERMEDIATE_RESPONSE     WINHTTP_CALLBACK_STATUS_INTERMEDIATE_RESPONSE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_SECURE_FAILURE            WINHTTP_CALLBACK_STATUS_SECURE_FAILURE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_SENDREQUEST_COMPLETE      WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_HEADERS_AVAILABLE         WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_DATA_AVAILABLE            WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_READ_COMPLETE             WINHTTP_CALLBACK_STATUS_READ_COMPLETE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_WRITE_COMPLETE            WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_REQUEST_ERROR             WINHTTP_CALLBACK_STATUS_REQUEST_ERROR |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS           (WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE | WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE \ |  | ||||||
|                                                         | WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE | WINHTTP_CALLBACK_STATUS_READ_COMPLETE          \ |  | ||||||
|                                                         | WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE | WINHTTP_CALLBACK_STATUS_REQUEST_ERROR) |  | ||||||
| #define WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS         0xffffffff |  | ||||||
| #define WINHTTP_INVALID_STATUS_CALLBACK                 ((WINHTTP_STATUS_CALLBACK)(-1L)) |  | ||||||
| 
 |  | ||||||
| #define API_RECEIVE_RESPONSE          (1) |  | ||||||
| #define API_QUERY_DATA_AVAILABLE      (2) |  | ||||||
| #define API_READ_DATA                 (3) |  | ||||||
| #define API_WRITE_DATA                (4) |  | ||||||
| #define API_SEND_REQUEST              (5) |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_HANDLE_TYPE_SESSION                  1 |  | ||||||
| #define WINHTTP_HANDLE_TYPE_CONNECT                  2 |  | ||||||
| #define WINHTTP_HANDLE_TYPE_REQUEST                  3 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED         0x00000001 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT            0x00000002 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED            0x00000004 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA              0x00000008 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID         0x00000010 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID       0x00000020 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_CERT_WRONG_USAGE        0x00000040 |  | ||||||
| #define WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR  0x80000000 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_FLAG_SECURE_PROTOCOL_SSL2  0x00000008 |  | ||||||
| #define WINHTTP_FLAG_SECURE_PROTOCOL_SSL3  0x00000020 |  | ||||||
| #define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1  0x00000080 |  | ||||||
| #define WINHTTP_FLAG_SECURE_PROTOCOL_ALL   (WINHTTP_FLAG_SECURE_PROTOCOL_SSL2 | WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1) |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_AUTH_SCHEME_BASIC      0x00000001 |  | ||||||
| #define WINHTTP_AUTH_SCHEME_NTLM       0x00000002 |  | ||||||
| #define WINHTTP_AUTH_SCHEME_PASSPORT   0x00000004 |  | ||||||
| #define WINHTTP_AUTH_SCHEME_DIGEST     0x00000008 |  | ||||||
| #define WINHTTP_AUTH_SCHEME_NEGOTIATE  0x00000010 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_AUTH_TARGET_SERVER     0x00000000 |  | ||||||
| #define WINHTTP_AUTH_TARGET_PROXY      0x00000001 |  | ||||||
| 
 |  | ||||||
| #define WINHTTP_TIME_FORMAT_BUFSIZE    62 |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     DWORD   dwStructSize; |  | ||||||
|     LPWSTR  lpszScheme; |  | ||||||
|     DWORD   dwSchemeLength; |  | ||||||
|     INTERNET_SCHEME nScheme; |  | ||||||
|     LPWSTR  lpszHostName; |  | ||||||
|     DWORD   dwHostNameLength; |  | ||||||
|     INTERNET_PORT nPort; |  | ||||||
|     LPWSTR  lpszUserName; |  | ||||||
|     DWORD   dwUserNameLength; |  | ||||||
|     LPWSTR  lpszPassword; |  | ||||||
|     DWORD   dwPasswordLength; |  | ||||||
|     LPWSTR  lpszUrlPath; |  | ||||||
|     DWORD   dwUrlPathLength; |  | ||||||
|     LPWSTR  lpszExtraInfo; |  | ||||||
|     DWORD   dwExtraInfoLength; |  | ||||||
| } URL_COMPONENTS, *LPURL_COMPONENTS; |  | ||||||
| typedef URL_COMPONENTS URL_COMPONENTSW; |  | ||||||
| typedef LPURL_COMPONENTS LPURL_COMPONENTSW; |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     DWORD_PTR dwResult; |  | ||||||
|     DWORD dwError; |  | ||||||
| } WINHTTP_ASYNC_RESULT, *LPWINHTTP_ASYNC_RESULT; |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     FILETIME ftExpiry; |  | ||||||
|     FILETIME ftStart; |  | ||||||
|     LPWSTR lpszSubjectInfo; |  | ||||||
|     LPWSTR lpszIssuerInfo; |  | ||||||
|     LPWSTR lpszProtocolName; |  | ||||||
|     LPWSTR lpszSignatureAlgName; |  | ||||||
|     LPWSTR lpszEncryptionAlgName; |  | ||||||
|     DWORD dwKeySize; |  | ||||||
| } WINHTTP_CERTIFICATE_INFO; |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     DWORD dwAccessType; |  | ||||||
|     LPCWSTR lpszProxy; |  | ||||||
|     LPCWSTR lpszProxyBypass; |  | ||||||
| } WINHTTP_PROXY_INFO, *LPWINHTTP_PROXY_INFO; |  | ||||||
| typedef WINHTTP_PROXY_INFO WINHTTP_PROXY_INFOW; |  | ||||||
| typedef LPWINHTTP_PROXY_INFO LPWINHTTP_PROXY_INFOW; |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     BOOL   fAutoDetect; |  | ||||||
|     LPWSTR lpszAutoConfigUrl; |  | ||||||
|     LPWSTR lpszProxy; |  | ||||||
|     LPWSTR lpszProxyBypass; |  | ||||||
| } WINHTTP_CURRENT_USER_IE_PROXY_CONFIG; |  | ||||||
| 
 |  | ||||||
| typedef VOID (CALLBACK *WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD_PTR,DWORD,LPVOID,DWORD); |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     DWORD dwFlags; |  | ||||||
|     DWORD dwAutoDetectFlags; |  | ||||||
|     LPCWSTR lpszAutoConfigUrl; |  | ||||||
|     LPVOID lpvReserved; |  | ||||||
|     DWORD dwReserved; |  | ||||||
|     BOOL fAutoLogonIfChallenged; |  | ||||||
| } WINHTTP_AUTOPROXY_OPTIONS; |  | ||||||
| 
 |  | ||||||
| typedef struct |  | ||||||
| { |  | ||||||
|     DWORD dwMajorVersion; |  | ||||||
|     DWORD dwMinorVersion; |  | ||||||
| } HTTP_VERSION_INFO, *LPHTTP_VERSION_INFO; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| BOOL     WINAPI WinHttpAddRequestHeaders(HINTERNET,LPCWSTR,DWORD,DWORD); |  | ||||||
| BOOL     WINAPI WinHttpDetectAutoProxyConfigUrl(DWORD,LPWSTR*); |  | ||||||
| BOOL     WINAPI WinHttpCheckPlatform(void); |  | ||||||
| BOOL     WINAPI WinHttpCloseHandle(HINTERNET); |  | ||||||
| HINTERNET   WINAPI WinHttpConnect(HINTERNET,LPCWSTR,INTERNET_PORT,DWORD); |  | ||||||
| BOOL     WINAPI WinHttpCrackUrl(LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS); |  | ||||||
| BOOL     WINAPI WinHttpCreateUrl(LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD); |  | ||||||
| BOOL     WINAPI WinHttpGetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); |  | ||||||
| BOOL     WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG*); |  | ||||||
| BOOL     WINAPI WinHttpGetProxyForUrl(HINTERNET,LPCWSTR,WINHTTP_AUTOPROXY_OPTIONS*,WINHTTP_PROXY_INFO*); |  | ||||||
| HINTERNET   WINAPI WinHttpOpen(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD); |  | ||||||
| HINTERNET   WINAPI WinHttpOpenRequest(HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD); |  | ||||||
| BOOL     WINAPI WinHttpQueryAuthParams(HINTERNET,DWORD,LPVOID*); |  | ||||||
| BOOL     WINAPI WinHttpQueryAuthSchemes(HINTERNET,LPDWORD,LPDWORD,LPDWORD); |  | ||||||
| BOOL     WINAPI WinHttpQueryDataAvailable(HINTERNET,LPDWORD); |  | ||||||
| BOOL     WINAPI WinHttpQueryHeaders(HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD); |  | ||||||
| BOOL     WINAPI WinHttpQueryOption(HINTERNET,DWORD,LPVOID,LPDWORD); |  | ||||||
| BOOL     WINAPI WinHttpReadData(HINTERNET,LPVOID,DWORD,LPDWORD); |  | ||||||
| BOOL     WINAPI WinHttpReceiveResponse(HINTERNET,LPVOID); |  | ||||||
| BOOL     WINAPI WinHttpSendRequest(HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR); |  | ||||||
| BOOL     WINAPI WinHttpSetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); |  | ||||||
| BOOL     WINAPI WinHttpSetCredentials(HINTERNET,DWORD,DWORD,LPCWSTR,LPCWSTR,LPVOID); |  | ||||||
| BOOL     WINAPI WinHttpSetOption(HINTERNET,DWORD,LPVOID,DWORD); |  | ||||||
| WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET,WINHTTP_STATUS_CALLBACK,DWORD,DWORD_PTR); |  | ||||||
| BOOL     WINAPI WinHttpSetTimeouts(HINTERNET,int,int,int,int); |  | ||||||
| BOOL     WINAPI WinHttpTimeFromSystemTime(CONST SYSTEMTIME *,LPWSTR); |  | ||||||
| BOOL     WINAPI WinHttpTimeToSystemTime(LPCWSTR,SYSTEMTIME*); |  | ||||||
| BOOL     WINAPI WinHttpWriteData(HINTERNET,LPCVOID,DWORD,LPDWORD); |  | ||||||
| 
 |  | ||||||
| // These are the function calls we'll need for Rufus without going through an import lib
 |  | ||||||
| typedef BOOL (WINAPI *WinHttpCrackUrl_t)(LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS); |  | ||||||
| typedef HINTERNET (WINAPI *WinHttpOpen_t)(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD); |  | ||||||
| typedef HINTERNET (WINAPI *WinHttpConnect_t)(HINTERNET,LPCWSTR,INTERNET_PORT,DWORD); |  | ||||||
| typedef HINTERNET (WINAPI *WinHttpOpenRequest_t)(HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD); |  | ||||||
| typedef BOOL (WINAPI *WinHttpSendRequest_t)(HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR); |  | ||||||
| typedef BOOL (WINAPI *WinHttpReceiveResponse_t)(HINTERNET,LPVOID); |  | ||||||
| typedef BOOL (WINAPI *WinHttpQueryHeaders_t)(HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD); |  | ||||||
| typedef BOOL (WINAPI *WinHttpQueryDataAvailable_t)(HINTERNET,LPDWORD); |  | ||||||
| typedef BOOL (WINAPI *WinHttpReadData_t)(HINTERNET,LPVOID,DWORD,LPDWORD); |  | ||||||
| typedef BOOL (WINAPI *WinHttpCloseHandle_t)(HINTERNET); |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
							
								
								
									
										144
									
								
								src/registry.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								src/registry.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,144 @@ | ||||||
|  | /*
 | ||||||
|  |  * Rufus: The Reliable USB Formatting Utility | ||||||
|  |  * Registry access | ||||||
|  |  * Copyright (c) 2012 Pete Batard <pete@akeo.ie> | ||||||
|  |  * | ||||||
|  |  * This program is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License as published by | ||||||
|  |  * the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  * (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | #include <windows.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Application root subkey, under HKCU\Software | ||||||
|  |  * Typically "<Company Name>\<Application>" | ||||||
|  |  */ | ||||||
|  | #define REGKEY_APPLICATION          "Akeo Systems\\Rufus" | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * List of registry keys used by this application | ||||||
|  |  */ | ||||||
|  | // Dispa
 | ||||||
|  | #define REGKEY_VERBOSE_UPDATES      "VerboseUpdateCheck" | ||||||
|  | #define REGKEY_DISABLE_UPDATES      "DisableUpdateCheck" | ||||||
|  | #define REGKEY_LAST_UPDATE          "LastUpdateCheck" | ||||||
|  | #define REGKEY_UPDATE_INTERVAL      "UpdateCheckInterval" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /* Read a generic registry key value (create the app key if it doesn't exist) */ | ||||||
|  | static __inline BOOL _GetRegistryKey(const char* key_name, DWORD reg_type, LPBYTE dest, DWORD dest_size) | ||||||
|  | { | ||||||
|  | 	BOOL r = FALSE; | ||||||
|  | 	LONG s; | ||||||
|  | 	HKEY hSoftware = NULL, hApp = NULL; | ||||||
|  | 	DWORD dwDisp, dwType = -1, dwSize = dest_size; | ||||||
|  | 	memset(dest, 0, dest_size); | ||||||
|  | 
 | ||||||
|  | 	if ( (RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE", 0, KEY_READ|KEY_CREATE_SUB_KEY, &hSoftware) != ERROR_SUCCESS) | ||||||
|  | 	  || (RegCreateKeyExA(hSoftware, REGKEY_APPLICATION, 0, NULL, 0, | ||||||
|  | 		KEY_SET_VALUE|KEY_QUERY_VALUE|KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) ) { | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	s = RegQueryValueExA(hApp, key_name, NULL, &dwType, (LPBYTE)dest, &dwSize); | ||||||
|  | 	// No key means default value of 0 or empty string
 | ||||||
|  | 	if ((s == ERROR_FILE_NOT_FOUND) || ((s == ERROR_SUCCESS) && (dwType = reg_type) && (dwSize = dest_size))) { | ||||||
|  | 		r = TRUE; | ||||||
|  | 	} | ||||||
|  | out: | ||||||
|  | 	RegCloseKey(hSoftware); | ||||||
|  | 	RegCloseKey(hApp); | ||||||
|  | 	return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Write a generic registry key value (create the app if it doesn't exist) */ | ||||||
|  | static __inline BOOL _SetRegistryKey(const char* key_name, DWORD reg_type, LPBYTE src, DWORD src_size) | ||||||
|  | { | ||||||
|  | 	BOOL r = FALSE; | ||||||
|  | 	HKEY hSoftware = NULL, hApp = NULL; | ||||||
|  | 	DWORD dwDisp, dwType = reg_type; | ||||||
|  | 
 | ||||||
|  | 	if ( (RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE", 0, KEY_READ|KEY_CREATE_SUB_KEY, &hSoftware) != ERROR_SUCCESS) | ||||||
|  | 	  || (RegCreateKeyExA(hSoftware, REGKEY_APPLICATION, 0, NULL, 0, | ||||||
|  | 		KEY_SET_VALUE|KEY_QUERY_VALUE|KEY_CREATE_SUB_KEY, NULL, &hApp, &dwDisp) != ERROR_SUCCESS) ) { | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	r = (RegSetValueExA(hApp, key_name, 0, dwType, src, src_size) == ERROR_SUCCESS); | ||||||
|  | 
 | ||||||
|  | out: | ||||||
|  | 	RegCloseKey(hSoftware); | ||||||
|  | 	RegCloseKey(hApp); | ||||||
|  | 	return r; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Helpers for 64 bit registry operations */ | ||||||
|  | #define GetRegistryKey64(key, pval) _GetRegistryKey(key, REG_QWORD, (LPBYTE)pval, sizeof(LONGLONG)) | ||||||
|  | #define SetRegistryKey64(key, val) _SetRegistryKey(key, REG_QWORD, (LPBYTE)&val, sizeof(LONGLONG)) | ||||||
|  | // Check that a key is accessible for R/W (will create a key if not already existing)
 | ||||||
|  | static __inline BOOL CheckRegistryKey64(const char* key) { | ||||||
|  | 	LONGLONG val; | ||||||
|  | 	return GetRegistryKey64(key, &val); // && SetRegistryKey64(key, val));
 | ||||||
|  | } | ||||||
|  | static __inline int64_t ReadRegistryKey64(const char* key) { | ||||||
|  | 	LONGLONG val; | ||||||
|  | 	GetRegistryKey64(key, &val); | ||||||
|  | 	return (int64_t)val; | ||||||
|  | } | ||||||
|  | static __inline void WriteRegistryKey64(const char* key, int64_t val) { | ||||||
|  | 	LONGLONG tmp = (LONGLONG)val; | ||||||
|  | 	SetRegistryKey64(key, tmp); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Helpers for 32 bit registry operations */ | ||||||
|  | #define GetRegistryKey32(key, pval) _GetRegistryKey(key, REG_DWORD, (LPBYTE)pval, sizeof(DWORD)) | ||||||
|  | #define SetRegistryKey32(key, val) _SetRegistryKey(key, REG_DWORD, (LPBYTE)&val, sizeof(DWORD)) | ||||||
|  | static __inline BOOL CheckRegistryKey32(const char* key) { | ||||||
|  | 	DWORD val; | ||||||
|  | 	return (GetRegistryKey32(key, &val) && SetRegistryKey32(key, val)); | ||||||
|  | } | ||||||
|  | static __inline int32_t ReadRegistryKey32(const char* key) { | ||||||
|  | 	DWORD val; | ||||||
|  | 	GetRegistryKey32(key, &val); | ||||||
|  | 	return (int32_t)val; | ||||||
|  | } | ||||||
|  | static __inline void WriteRegistryKey32(const char* key, int32_t val) { | ||||||
|  | 	DWORD tmp = (DWORD)val; | ||||||
|  | 	SetRegistryKey32(key, tmp); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Helpers for boolean registry operations */ | ||||||
|  | #define GetRegistryKeyBool(key) (ReadRegistryKey32(key) != 0) | ||||||
|  | #define SetRegistryKeyBool(key) WriteRegistryKey32(key, 1) | ||||||
|  | #define CheckRegistryKeyBool CheckRegistryKey32 | ||||||
|  | 
 | ||||||
|  | /* Helpers for String registry operations */ | ||||||
|  | #define GetRegistryKeyStr(key, str, len) _GetRegistryKey(key, REG_SZ, (LPBYTE)str, (DWORD)len) | ||||||
|  | #define SetRegistryKeyStr(key, str) _SetRegistryKey(key, REG_SZ, (LPBYTE)str, safe_strlen(str)) | ||||||
|  | // Use a static buffer - don't allocate
 | ||||||
|  | static __inline char* ReadRegistryKeyStr(const char* key) { | ||||||
|  | 	static char str[512]; | ||||||
|  | 	_GetRegistryKey(key, REG_SZ, (LPBYTE)str, (DWORD)sizeof(str)-1); | ||||||
|  | 	return str; | ||||||
|  | } | ||||||
|  | #define WriteRegistryKeyStr SetRegistryKeyStr | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
							
								
								
									
										11
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -1625,6 +1625,17 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | ||||||
| 			break; | 			break; | ||||||
| #ifdef RUFUS_TEST | #ifdef RUFUS_TEST | ||||||
| 		case IDC_TEST: | 		case IDC_TEST: | ||||||
|  | 			CheckForUpdates("http://rufus.akeo.ie/rufus.ver"); | ||||||
|  | /*
 | ||||||
|  | 			InitProgress(); | ||||||
|  | 			if (!IsWindow(hISOProgressDlg)) {  | ||||||
|  | 				hISOProgressDlg = CreateDialogA(hMainInstance, MAKEINTRESOURCEA(IDD_ISO_EXTRACT), | ||||||
|  | 					hDlg, (DLGPROC)ISOProc);  | ||||||
|  | 				// The window is not visible by default but takes focus => restore it
 | ||||||
|  | 				SetFocus(hDlg); | ||||||
|  | 			}  | ||||||
|  | 			DownloadFile("http://cloud.github.com/downloads/pbatard/rufus/vesamenu.c32", "vesamenu.c32"); | ||||||
|  | */ | ||||||
| 			break; | 			break; | ||||||
| #endif | #endif | ||||||
| 		case IDC_ADVANCED: | 		case IDC_ADVANCED: | ||||||
|  |  | ||||||
|  | @ -24,7 +24,7 @@ | ||||||
| /* Program options */ | /* Program options */ | ||||||
| #define RUFUS_DEBUG                 // print debug info to Debug facility
 | #define RUFUS_DEBUG                 // print debug info to Debug facility
 | ||||||
| /* Features not ready for prime time and that may *DESTROY* your data - USE AT YOUR OWN RISKS! */ | /* Features not ready for prime time and that may *DESTROY* your data - USE AT YOUR OWN RISKS! */ | ||||||
| //#define RUFUS_TEST
 | #define RUFUS_TEST | ||||||
| 
 | 
 | ||||||
| #define STR_NO_LABEL                "NO_LABEL" | #define STR_NO_LABEL                "NO_LABEL" | ||||||
| #define RUFUS_CANCELBOX_TITLE       "Rufus - Cancellation" | #define RUFUS_CANCELBOX_TITLE       "Rufus - Cancellation" | ||||||
|  | @ -238,6 +238,7 @@ extern char* FileDialog(BOOL save, char* path, char* filename, char* ext, char* | ||||||
| extern BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size); | extern BOOL FileIO(BOOL save, char* path, char** buffer, DWORD* size); | ||||||
| extern LONG GetEntryWidth(HWND hDropDown, const char* entry); | extern LONG GetEntryWidth(HWND hDropDown, const char* entry); | ||||||
| extern BOOL DownloadFile(const char* url, const char* file); | extern BOOL DownloadFile(const char* url, const char* file); | ||||||
|  | extern BOOL CheckForUpdates(const char* url); | ||||||
| extern BOOL IsShown(HWND hDlg); | extern BOOL IsShown(HWND hDlg); | ||||||
| extern char* get_token_data(const char* filename, const char* token); | extern char* get_token_data(const char* filename, const char* token); | ||||||
| extern char* insert_section_data(const char* filename, const char* section, const char* data, BOOL dos2unix); | extern char* insert_section_data(const char* filename, const char* section, const char* data, BOOL dos2unix); | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 206, 316 | IDD_DIALOG DIALOGEX 12, 12, 206, 316 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_APPWINDOW | EXSTYLE WS_EX_APPWINDOW | ||||||
| CAPTION "Rufus v1.2.0.190" | CAPTION "Rufus v1.2.0.191" | ||||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||||
| BEGIN | BEGIN | ||||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,278,50,14 |     DEFPUSHBUTTON   "Start",IDC_START,94,278,50,14 | ||||||
|  | @ -77,7 +77,7 @@ BEGIN | ||||||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP |     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||||
|     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, |     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, | ||||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 |                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||||
|     LTEXT           "Version 1.2.0 (Build 190)",IDC_STATIC,46,19,78,8 |     LTEXT           "Version 1.2.0 (Build 191)",IDC_STATIC,46,19,78,8 | ||||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP |     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL |     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 |     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||||
|  | @ -237,8 +237,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,2,0,190 |  FILEVERSION 1,2,0,191 | ||||||
|  PRODUCTVERSION 1,2,0,190 |  PRODUCTVERSION 1,2,0,191 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -255,13 +255,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "akeo.ie" |             VALUE "CompanyName", "akeo.ie" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "1.2.0.190" |             VALUE "FileVersion", "1.2.0.191" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus.exe" |             VALUE "OriginalFilename", "rufus.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "1.2.0.190" |             VALUE "ProductVersion", "1.2.0.191" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue