From abb74bd965f90f5cebef98d89d9dbcc259299fd6 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 16 Mar 2013 21:35:48 +0000 Subject: [PATCH 01/74] [Win32k] - Fix window activation bug. Patch by Giannis Adamopoulos. See CORE-6889. svn path=/trunk/; revision=58528 --- reactos/win32ss/user/ntuser/winpos.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/reactos/win32ss/user/ntuser/winpos.c b/reactos/win32ss/user/ntuser/winpos.c index ba3fb0e3cb0..bb68c9fc6a7 100644 --- a/reactos/win32ss/user/ntuser/winpos.c +++ b/reactos/win32ss/user/ntuser/winpos.c @@ -2218,11 +2218,15 @@ co_WinPosShowWindow(PWND Wnd, INT Cmd) if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE)) { - if ( ( Wnd->spwndParent == UserGetDesktopWindow() && !ActivateOtherWindowMin(Wnd) ) || - // and Rule #1. - ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() ) ) + if ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() ) { - co_WinPosActivateOtherWindow(Wnd); + if ( Wnd->spwndParent == UserGetDesktopWindow()) + { + if(!ActivateOtherWindowMin(Wnd)) + co_WinPosActivateOtherWindow(Wnd); + } + else + co_WinPosActivateOtherWindow(Wnd); } /* Revert focus to parent */ From b4fb05e8a91f2f9be7128e9d752e754b6f1fa989 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 16 Mar 2013 23:28:27 +0000 Subject: [PATCH 02/74] [CMAKE] Do not compile KDBG by default when building release builds svn path=/trunk/; revision=58530 --- reactos/cmake/config.cmake | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/cmake/config.cmake b/reactos/cmake/config.cmake index d3a6f26b644..13a566a2229 100644 --- a/reactos/cmake/config.cmake +++ b/reactos/cmake/config.cmake @@ -46,10 +46,12 @@ if(MSVC) endif() else() - set(KDBG TRUE CACHE BOOL -"Whether to compile in the integrated kernel debugger.") - set(_WINKD_ FALSE CACHE BOOL -"Whether to compile with the KD protocol.") + if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(KDBG FALSE CACHE BOOL "Whether to compile in the integrated kernel debugger.") + else() + set(KDBG TRUE CACHE BOOL "Whether to compile in the integrated kernel debugger.") + endif() + set(_WINKD_ FALSE CACHE BOOL "Whether to compile with the KD protocol.") endif() set(_ELF_ FALSE CACHE BOOL From d518d25847541c54573b2f68874bbbe7e35685e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 17 Mar 2013 01:07:24 +0000 Subject: [PATCH 03/74] [GDI32] Remove some svn/cvs keywords svn path=/trunk/; revision=58531 --- reactos/win32ss/gdi/gdi32/main/dllmain.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/main/dllmain.c b/reactos/win32ss/gdi/gdi32/main/dllmain.c index 75aa812a886..c3a42a6746b 100644 --- a/reactos/win32ss/gdi/gdi32/main/dllmain.c +++ b/reactos/win32ss/gdi/gdi32/main/dllmain.c @@ -1,10 +1,5 @@ /* * dllmain.c - * - * $Revision: 1.11 $ - * $Author: akhaldi $ - * $Date: 2013-01-25 00:00:42 +0100 (ven. 25 janv. 2013) $ - * */ #include From 75d957b8e6247e1fc462a1780fc4212692e5349a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 17 Mar 2013 10:49:46 +0000 Subject: [PATCH 04/74] [LSASRV] - Implement LsaIFree_LSAPR_POLICY_INFORMATION, which will be used by msv1_0.dll. - Fix a potential compiler warning in LsapAddAuthPackage. - Remove an obsolete check from LsarSetAuditEvents. svn path=/trunk/; revision=58532 --- reactos/dll/win32/lsasrv/authpackage.c | 2 +- reactos/dll/win32/lsasrv/lsasrv.c | 107 +++++++++++++++++++++++++ reactos/dll/win32/lsasrv/lsasrv.spec | 3 +- reactos/dll/win32/lsasrv/policy.c | 3 +- 4 files changed, 110 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/lsasrv/authpackage.c b/reactos/dll/win32/lsasrv/authpackage.c index 62199b0e9aa..04a3c32f569 100644 --- a/reactos/dll/win32/lsasrv/authpackage.c +++ b/reactos/dll/win32/lsasrv/authpackage.c @@ -231,7 +231,7 @@ LsapAddAuthPackage(IN PWSTR ValueName, TRACE("Package Name: %s\n", Package->Name->Buffer); Package->Id = *Id; - *Id++; + (*Id)++; InsertTailList(&PackageListHead, &Package->Entry); diff --git a/reactos/dll/win32/lsasrv/lsasrv.c b/reactos/dll/win32/lsasrv/lsasrv.c index 53198aa06fc..15f16ce4c75 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.c +++ b/reactos/dll/win32/lsasrv/lsasrv.c @@ -15,6 +15,113 @@ WINE_DEFAULT_DEBUG_CHANNEL(lsasrv); /* FUNCTIONS ***************************************************************/ +VOID +NTAPI +LsaIFree_LSAPR_POLICY_INFORMATION(IN POLICY_INFORMATION_CLASS InformationClass, + IN PLSAPR_POLICY_INFORMATION PolicyInformation) +{ + if (PolicyInformation != NULL) + { + switch (InformationClass) + { + case PolicyAuditLogInformation: /* 1 */ + break; + + case PolicyAuditEventsInformation: /* 2 */ + if (PolicyInformation->PolicyAuditEventsInfo.EventAuditingOptions != NULL) + midl_user_free(PolicyInformation->PolicyAuditEventsInfo.EventAuditingOptions); + break; + + case PolicyPrimaryDomainInformation: /* 3 */ + if (PolicyInformation->PolicyPrimaryDomInfo.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyPrimaryDomInfo.Name.Buffer); + + if (PolicyInformation->PolicyPrimaryDomInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyPrimaryDomInfo.Sid); + break; + + case PolicyPdAccountInformation: /* 4 */ + if (PolicyInformation->PolicyPdAccountInfo.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyPdAccountInfo.Name.Buffer); + break; + + case PolicyAccountDomainInformation: /* 5 */ + if (PolicyInformation->PolicyAccountDomainInfo.DomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyAccountDomainInfo.DomainName.Buffer); + + if (PolicyInformation->PolicyAccountDomainInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyAccountDomainInfo.Sid); + break; + + case PolicyLsaServerRoleInformation: /* 6 */ + break; + + case PolicyReplicaSourceInformation: /* 7 */ + if (PolicyInformation->PolicyReplicaSourceInfo.ReplicaSource.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyReplicaSourceInfo.ReplicaSource.Buffer); + + if (PolicyInformation->PolicyReplicaSourceInfo.ReplicaAccountName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyReplicaSourceInfo.ReplicaAccountName.Buffer); + break; + + case PolicyDefaultQuotaInformation: /* 8 */ + break; + + case PolicyModificationInformation: /* 9 */ + break; + + case PolicyAuditFullSetInformation: /* 10 (0xA) */ + break; + + case PolicyAuditFullQueryInformation: /* 11 (0xB) */ + break; + + case PolicyDnsDomainInformation: /* 12 (0xC) */ + if (PolicyInformation->PolicyDnsDomainInfo.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.Name.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfo.DnsDomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.DnsDomainName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfo.DnsForestName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.DnsForestName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfo.Sid); + break; + + case PolicyDnsDomainInformationInt: /* 13 (0xD) */ + if (PolicyInformation->PolicyDnsDomainInfoInt.Name.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.Name.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfoInt.DnsDomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.DnsDomainName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfoInt.DnsForestName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.DnsForestName.Buffer); + + if (PolicyInformation->PolicyDnsDomainInfoInt.Sid != NULL) + midl_user_free(PolicyInformation->PolicyDnsDomainInfoInt.Sid); + break; + + case PolicyLocalAccountDomainInformation: /* 14 (0xE) */ + if (PolicyInformation->PolicyLocalAccountDomainInfo.DomainName.Buffer != NULL) + midl_user_free(PolicyInformation->PolicyLocalAccountDomainInfo.DomainName.Buffer); + + if (PolicyInformation->PolicyLocalAccountDomainInfo.Sid != NULL) + midl_user_free(PolicyInformation->PolicyLocalAccountDomainInfo.Sid); + break; + + default: + ERR("Invalid InformationClass: %lu\n", InformationClass); + break; + } + + midl_user_free(PolicyInformation); + } +} + + NTSTATUS WINAPI LsapInitLsa(VOID) { diff --git a/reactos/dll/win32/lsasrv/lsasrv.spec b/reactos/dll/win32/lsasrv/lsasrv.spec index a599b08b9cc..26bd0e7ae17 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.spec +++ b/reactos/dll/win32/lsasrv/lsasrv.spec @@ -1,4 +1,3 @@ - @ stub LsaIAuditNotifyPackageLoad @ stub LsaIAuditSamEvent @ stub LsaIEnumerateSecrets @@ -6,7 +5,7 @@ @ stub LsaIFree_LSAI_SECRET_ENUM_BUFFER @ stub LsaIFree_LSAPR_ACCOUNT_ENUM_BUFFER @ stub LsaIFree_LSAPR_CR_CIPHER_VALUE - @ stub LsaIFree_LSAPR_POLICY_INFORMATION + @ stdcall LsaIFree_LSAPR_POLICY_INFORMATION(long ptr) @ stub LsaIFree_LSAPR_PRIVILEGE_ENUM_BUFFER @ stub LsaIFree_LSAPR_PRIVILEGE_SET @ stub LsaIFree_LSAPR_REFERENCED_DOMAIN_LIST diff --git a/reactos/dll/win32/lsasrv/policy.c b/reactos/dll/win32/lsasrv/policy.c index af8d1ce0b86..394a8c668ad 100644 --- a/reactos/dll/win32/lsasrv/policy.c +++ b/reactos/dll/win32/lsasrv/policy.c @@ -824,8 +824,7 @@ LsarSetAuditEvents(PLSA_DB_OBJECT PolicyObject, AuditData, AttributeSize); - if (AuditData != NULL) - RtlFreeHeap(RtlGetProcessHeap(), 0, AuditData); + RtlFreeHeap(RtlGetProcessHeap(), 0, AuditData); return Status; } From c03ac4615ee4156c9ab9f981c306512d1b457dd0 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 17 Mar 2013 11:06:37 +0000 Subject: [PATCH 05/74] [CMD] Fix potential memory leaks svn path=/trunk/; revision=58533 --- reactos/base/shell/cmd/filecomp.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/base/shell/cmd/filecomp.c b/reactos/base/shell/cmd/filecomp.c index 42513c963a0..0243d1d5068 100644 --- a/reactos/base/shell/cmd/filecomp.c +++ b/reactos/base/shell/cmd/filecomp.c @@ -491,10 +491,16 @@ int __cdecl compare(const void *arg1,const void *arg2) INT ret; File1 = cmd_alloc(sizeof(FileName)); - File2 = cmd_alloc(sizeof(FileName)); - if(!File1 || !File2) + if (!File1) return 0; + File2 = cmd_alloc(sizeof(FileName)); + if(!File2) + { + cmd_free(File1); + return 0; + } + memcpy(File1,arg1,sizeof(FileName)); memcpy(File2,arg2,sizeof(FileName)); @@ -666,8 +672,8 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) /* Don't show files when they are doing 'cd' or 'rd' */ if(!ShowAll && - file.dwFileAttributes != 0xFFFFFFFF && - !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + file.dwFileAttributes != 0xFFFFFFFF && + !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { continue; } @@ -688,7 +694,7 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) } while(FindNextFile(hFile,&file)); - FindClose(hFile); + FindClose(hFile); /* Check the size of the list to see if we found any matches */ From db5a7755ce11431844dd6b484ac372f684ab992f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 17 Mar 2013 12:39:44 +0000 Subject: [PATCH 06/74] [SERVICES] - It seems (after testing) that services report now correctly their state to the SCM. So we can start them in SERVICE_START_PENDING state (see revisions r45626 and r45640). - Add some informative comments. - Use a helper function to create start events at initialization time. - When autostart services are up, signal an event. (see revisions r45633 and r45658). - Wait for LSASS just after having created the services database, and before calling ScmGetBootAndSystemDriverState (conform to Windows Internals 4th, page 224). --------- - When starting auto-start services, hold a lock during all the operation in such a way that, if an external program wants to start a service, it is obliged to wait till all the auto-start services have been started (usual service starting also uses that lock). CORE-7001 #resolve #comment Should be fixed by r58534. Do not hesitate to reopen this bug-report if the problem reappears. svn path=/trunk/; revision=58534 --- reactos/base/system/services/database.c | 124 +++++++++++++++----- reactos/base/system/services/rpcserver.c | 18 --- reactos/base/system/services/services.c | 142 +++++++++++++---------- reactos/base/system/services/services.h | 1 + 4 files changed, 177 insertions(+), 108 deletions(-) diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index 0c2a50d5e81..0714a56e573 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -19,9 +19,9 @@ /* * Uncomment the line below to start services - * using the SERVICE_START_PENDING state + * using the SERVICE_START_PENDING state. */ -// #define USE_SERVICE_START_PENDING +#define USE_SERVICE_START_PENDING /* * Uncomment the line below to use asynchronous IO operations @@ -38,6 +38,7 @@ LIST_ENTRY ServiceListHead; static RTL_RESOURCE DatabaseLock; static DWORD ResumeCount = 1; +/* The critical section synchronizes service controls commands */ static CRITICAL_SECTION ControlServiceCriticalSection; static DWORD PipeTimeout = 30000; /* 30 Seconds */ @@ -359,7 +360,7 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount) DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, - PSERVICE *lpServiceRecord) + PSERVICE* lpServiceRecord) { PSERVICE lpService = NULL; @@ -772,13 +773,11 @@ ScmCheckDriver(PSERVICE Service) if (Service->Status.dwServiceType == SERVICE_KERNEL_DRIVER) { - RtlInitUnicodeString(&DirName, - L"\\Driver"); + RtlInitUnicodeString(&DirName, L"\\Driver"); } - else + else // if (Service->Status.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER) { - RtlInitUnicodeString(&DirName, - L"\\FileSystem"); + RtlInitUnicodeString(&DirName, L"\\FileSystem"); } InitializeObjectAttributes(&ObjectAttributes, @@ -796,7 +795,7 @@ ScmCheckDriver(PSERVICE Service) } BufferLength = sizeof(OBJECT_DIRECTORY_INFORMATION) + - 2 * MAX_PATH * sizeof(WCHAR); + 2 * MAX_PATH * sizeof(WCHAR); DirInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, BufferLength); @@ -1096,7 +1095,7 @@ Done: static DWORD ScmSendStartCommand(PSERVICE Service, DWORD argc, - LPWSTR *argv) + LPWSTR* argv) { PSCM_CONTROL_PACKET ControlPacket; SCM_REPLY_PACKET ReplyPacket; @@ -1496,7 +1495,7 @@ ScmWaitForServiceConnect(PSERVICE Service) static DWORD ScmStartUserModeService(PSERVICE Service, DWORD argc, - LPWSTR *argv) + LPWSTR* argv) { PROCESS_INFORMATION ProcessInformation; STARTUPINFOW StartupInfo; @@ -1512,6 +1511,7 @@ ScmStartUserModeService(PSERVICE Service, return ScmSendStartCommand(Service, argc, argv); } + /* Otherwise start its process */ ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(StartupInfo); ZeroMemory(&ProcessInformation, sizeof(ProcessInformation)); @@ -1551,9 +1551,7 @@ ScmStartUserModeService(PSERVICE Service, if (dwError == ERROR_SUCCESS) { /* Send start command */ - dwError = ScmSendStartCommand(Service, - argc, - argv); + dwError = ScmSendStartCommand(Service, argc, argv); } else { @@ -1569,24 +1567,22 @@ ScmStartUserModeService(PSERVICE Service, } -DWORD -ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) +static DWORD +ScmLoadService(PSERVICE Service, + DWORD argc, + LPWSTR* argv) { PSERVICE_GROUP Group = Service->lpGroup; DWORD dwError = ERROR_SUCCESS; LPCWSTR ErrorLogStrings[2]; WCHAR szErrorBuffer[32]; - DPRINT("ScmStartService() called\n"); - + DPRINT("ScmLoadService() called\n"); DPRINT("Start Service %p (%S)\n", Service, Service->lpServiceName); - EnterCriticalSection(&ControlServiceCriticalSection); - if (Service->Status.dwCurrentState != SERVICE_STOPPED) { DPRINT("Service %S is already running!\n", Service->lpServiceName); - LeaveCriticalSection(&ControlServiceCriticalSection); return ERROR_SERVICE_ALREADY_RUNNING; } @@ -1602,7 +1598,7 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) Service->Status.dwCurrentState = SERVICE_RUNNING; } } - else + else // if (Service->Status.dwServiceType & (SERVICE_WIN32 | SERVICE_INTERACTIVE_PROCESS)) { /* Start user-mode service */ dwError = ScmCreateOrReferenceServiceImage(Service); @@ -1625,9 +1621,7 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) } } - LeaveCriticalSection(&ControlServiceCriticalSection); - - DPRINT("ScmStartService() done (Error %lu)\n", dwError); + DPRINT("ScmLoadService() done (Error %lu)\n", dwError); if (dwError == ERROR_SUCCESS) { @@ -1677,18 +1671,81 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) } +DWORD +ScmStartService(PSERVICE Service, + DWORD argc, + LPWSTR* argv) +{ + DWORD dwError = ERROR_SUCCESS; + SC_RPC_LOCK Lock = NULL; + + DPRINT("ScmStartService() called\n"); + DPRINT("Start Service %p (%S)\n", Service, Service->lpServiceName); + + /* Acquire the service control critical section, to synchronize starts */ + EnterCriticalSection(&ControlServiceCriticalSection); + + /* + * Acquire the user service start lock while the service is starting, if + * needed (i.e. if we are not starting it during the initialization phase). + * If we don't success, bail out. + */ + if (!ScmInitialize) + { + dwError = ScmAcquireServiceStartLock(TRUE, &Lock); + if (dwError != ERROR_SUCCESS) goto done; + } + + /* Really start the service */ + dwError = ScmLoadService(Service, argc, argv); + + /* Release the service start lock, if needed, and the critical section */ + if (Lock) ScmReleaseServiceStartLock(&Lock); + +done: + LeaveCriticalSection(&ControlServiceCriticalSection); + + DPRINT("ScmStartService() done (Error %lu)\n", dwError); + + return dwError; +} + + VOID ScmAutoStartServices(VOID) { + DWORD dwError = ERROR_SUCCESS; + SC_RPC_LOCK Lock = NULL; + PLIST_ENTRY GroupEntry; PLIST_ENTRY ServiceEntry; PSERVICE_GROUP CurrentGroup; PSERVICE CurrentService; WCHAR szSafeBootServicePath[MAX_PATH]; - DWORD dwError; HKEY hKey; ULONG i; + /* Acquire the service control critical section, to synchronize starts */ + EnterCriticalSection(&ControlServiceCriticalSection); + + /* + * Acquire the user service start lock while the service is starting, if + * needed (i.e. if we are not starting it during the initialization phase). + * If we don't success, bail out. + */ + if (!ScmInitialize) + { + /* + * Actually this code is never executed since we are called + * at initialization time, so that ScmInitialize == TRUE. + * But keep the code here if someday we are called later on + * for whatever reason... + */ + dwError = ScmAcquireServiceStartLock(TRUE, &Lock); + if (dwError != ERROR_SUCCESS) goto done; + } + + /* Clear 'ServiceVisited' flag (or set if not to start in Safe Mode) */ ServiceEntry = ServiceListHead.Flink; while (ServiceEntry != &ServiceListHead) @@ -1779,7 +1836,7 @@ ScmAutoStartServices(VOID) (CurrentService->dwTag == CurrentGroup->TagArray[i])) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1797,7 +1854,7 @@ ScmAutoStartServices(VOID) (CurrentService->ServiceVisited == FALSE)) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1817,7 +1874,7 @@ ScmAutoStartServices(VOID) (CurrentService->ServiceVisited == FALSE)) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1834,7 +1891,7 @@ ScmAutoStartServices(VOID) (CurrentService->ServiceVisited == FALSE)) { CurrentService->ServiceVisited = TRUE; - ScmStartService(CurrentService, 0, NULL); + ScmLoadService(CurrentService, 0, NULL); } ServiceEntry = ServiceEntry->Flink; @@ -1848,6 +1905,13 @@ ScmAutoStartServices(VOID) CurrentService->ServiceVisited = FALSE; ServiceEntry = ServiceEntry->Flink; } + + + /* Release the service start lock, if needed, and the critical section */ + if (Lock) ScmReleaseServiceStartLock(&Lock); + +done: + LeaveCriticalSection(&ControlServiceCriticalSection); } diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 4c877d27b00..110e55d2fa8 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -2895,7 +2895,6 @@ DWORD RStartServiceW( DWORD dwError = ERROR_SUCCESS; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; - SC_RPC_LOCK Lock = NULL; #ifndef NDEBUG DWORD i; @@ -2941,17 +2940,9 @@ DWORD RStartServiceW( if (lpService->bDeleted) return ERROR_SERVICE_MARKED_FOR_DELETE; - /* Acquire the service start lock until the service has been started */ - dwError = ScmAcquireServiceStartLock(TRUE, &Lock); - if (dwError != ERROR_SUCCESS) - return dwError; - /* Start the service */ dwError = ScmStartService(lpService, argc, (LPWSTR*)argv); - /* Release the service start lock */ - ScmReleaseServiceStartLock(&Lock); - return dwError; } @@ -4171,7 +4162,6 @@ DWORD RStartServiceA( DWORD dwError = ERROR_SUCCESS; PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; - SC_RPC_LOCK Lock = NULL; LPWSTR *lpVector = NULL; DWORD i; DWORD dwLength; @@ -4244,17 +4234,9 @@ DWORD RStartServiceA( } } - /* Acquire the service start lock until the service has been started */ - dwError = ScmAcquireServiceStartLock(TRUE, &Lock); - if (dwError != ERROR_SUCCESS) - goto done; - /* Start the service */ dwError = ScmStartService(lpService, argc, lpVector); - /* Release the service start lock */ - ScmReleaseServiceStartLock(&Lock); - done: /* Free the Unicode argument vector */ if (lpVector != NULL) diff --git a/reactos/base/system/services/services.c b/reactos/base/system/services/services.c index 2edb6e75887..5385a6beb9f 100644 --- a/reactos/base/system/services/services.c +++ b/reactos/base/system/services/services.c @@ -22,6 +22,12 @@ int WINAPI RegisterServicesProcess(DWORD ServicesProcessId); #define PIPE_BUFSIZE 1024 #define PIPE_TIMEOUT 1000 +/* Defined in include/reactos/services/services.h */ +// #define SCM_START_EVENT L"SvcctrlStartEvent_A3752DX" +#define SCM_AUTOSTARTCOMPLETE_EVENT L"SC_AutoStartComplete" +#define LSA_RPC_SERVER_ACTIVE L"LSA_RPC_SERVER_ACTIVE" + +BOOL ScmInitialize = FALSE; BOOL ScmShutdown = FALSE; static HANDLE hScmShutdownEvent = NULL; @@ -77,35 +83,38 @@ ScmLogError(DWORD dwEventId, BOOL -ScmCreateStartEvent(PHANDLE StartEvent) +ScmCreateControlEvent(PHANDLE Event, + LPCWSTR Name, + DWORD dwDesiredAccess) { + /* + * This function creates a generic non-inheritable event + * and return a handle to the caller. The caller must + * close this handle afterwards. + */ + HANDLE hEvent; - hEvent = CreateEventW(NULL, - TRUE, - FALSE, - L"SvcctrlStartEvent_A3752DX"); + hEvent = CreateEventW(NULL, TRUE, FALSE, Name); if (hEvent == NULL) { if (GetLastError() == ERROR_ALREADY_EXISTS) { - hEvent = OpenEventW(EVENT_ALL_ACCESS, - FALSE, - L"SvcctrlStartEvent_A3752DX"); - if (hEvent == NULL) - { - return FALSE; - } - } - else - { - return FALSE; + hEvent = OpenEventW(dwDesiredAccess, FALSE, Name); } } - *StartEvent = hEvent; - - return TRUE; + if (hEvent) + { + DPRINT("SERVICES: Created event %S with handle %x\n", Name, hEvent); + *Event = hEvent; + return TRUE; + } + else + { + DPRINT1("SERVICES: Failed to create event %S (Error %lu)\n", Name, GetLastError()); + return FALSE; + } } @@ -113,35 +122,21 @@ VOID ScmWaitForLsa(VOID) { HANDLE hEvent; - DWORD dwError; - hEvent = CreateEventW(NULL, - TRUE, - FALSE, - L"LSA_RPC_SERVER_ACTIVE"); - if (hEvent == NULL) + if (!ScmCreateControlEvent(&hEvent, + LSA_RPC_SERVER_ACTIVE, + SYNCHRONIZE)) { - dwError = GetLastError(); - DPRINT1("Failed to create the notication event (Error %lu)\n", dwError); - - if (dwError == ERROR_ALREADY_EXISTS) - { - hEvent = OpenEventW(SYNCHRONIZE, - FALSE, - L"LSA_RPC_SERVER_ACTIVE"); - if (hEvent == NULL) - { - DPRINT1("Could not open the notification event (Error %lu)\n", GetLastError()); - return; - } - } + DPRINT1("Failed to create the notification event (Error %lu)\n", GetLastError()); } + else + { + DPRINT("Wait for the LSA server!\n"); + WaitForSingleObject(hEvent, INFINITE); + DPRINT("LSA server running!\n"); - DPRINT("Wait for the LSA server!\n"); - WaitForSingleObject(hEvent, INFINITE); - DPRINT("LSA server running!\n"); - - CloseHandle(hEvent); + CloseHandle(hEvent); + } DPRINT("ScmWaitForLsa() done\n"); } @@ -351,23 +346,38 @@ wWinMain(HINSTANCE hInstance, int nShowCmd) { HANDLE hScmStartEvent = NULL; + HANDLE hScmAutoStartCompleteEvent = NULL; SC_RPC_LOCK Lock = NULL; BOOL bCanDeleteNamedPipeCriticalSection = FALSE; DWORD dwError; DPRINT("SERVICES: Service Control Manager\n"); - /* Create start event */ - if (!ScmCreateStartEvent(&hScmStartEvent)) + /* We are initializing ourselves */ + ScmInitialize = TRUE; + + /* Create the start event */ + if (!ScmCreateControlEvent(&hScmStartEvent, + SCM_START_EVENT, + EVENT_ALL_ACCESS)) { - DPRINT1("SERVICES: Failed to create start event\n"); + DPRINT1("SERVICES: Failed to create the start event\n"); goto done; } + DPRINT("SERVICES: Created start event with handle %p.\n", hScmStartEvent); - DPRINT("SERVICES: created start event with handle %p.\n", hScmStartEvent); + /* Create the auto-start complete event */ + if (!ScmCreateControlEvent(&hScmAutoStartCompleteEvent, + SCM_AUTOSTARTCOMPLETE_EVENT, + EVENT_ALL_ACCESS)) + { + DPRINT1("SERVICES: Failed to create the auto-start complete event\n"); + goto done; + } + DPRINT("SERVICES: created auto-start complete event with handle %p.\n", hScmAutoStartCompleteEvent); /* Create the shutdown event */ - hScmShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + hScmShutdownEvent = CreateEventW(NULL, TRUE, FALSE, NULL); if (hScmShutdownEvent == NULL) { DPRINT1("SERVICES: Failed to create shutdown event\n"); @@ -385,7 +395,7 @@ wWinMain(HINSTANCE hInstance, /* Read the control set values */ if (!ScmGetControlSetValues()) { - DPRINT1("SERVICES: failed to read the control set values\n"); + DPRINT1("SERVICES: Failed to read the control set values\n"); goto done; } @@ -393,50 +403,59 @@ wWinMain(HINSTANCE hInstance, dwError = ScmCreateServiceDatabase(); if (dwError != ERROR_SUCCESS) { - DPRINT1("SERVICES: failed to create SCM database (Error %lu)\n", dwError); + DPRINT1("SERVICES: Failed to create SCM database (Error %lu)\n", dwError); goto done; } + /* Wait for the LSA server */ + ScmWaitForLsa(); + /* Update the services database */ ScmGetBootAndSystemDriverState(); - /* Register the Service Control Manager process with CSRSS */ + /* Register the Service Control Manager process with the ReactOS Subsystem */ if (!RegisterServicesProcess(GetCurrentProcessId())) { DPRINT1("SERVICES: Could not register SCM process\n"); goto done; } - /* Acquire the service start lock until autostart services have been started */ + /* + * Acquire the user service start lock until + * auto-start services have been started. + */ dwError = ScmAcquireServiceStartLock(TRUE, &Lock); if (dwError != ERROR_SUCCESS) { - DPRINT1("SERVICES: failed to acquire the service start lock (Error %lu)\n", dwError); + DPRINT1("SERVICES: Failed to acquire the service start lock (Error %lu)\n", dwError); goto done; } /* Start the RPC server */ ScmStartRpcServer(); - DPRINT("SERVICES: Initialized.\n"); - /* Signal start event */ SetEvent(hScmStartEvent); + DPRINT("SERVICES: Initialized.\n"); + /* Register event handler (used for system shutdown) */ SetConsoleCtrlHandler(ShutdownHandlerRoutine, TRUE); - /* Wait for the LSA server */ - ScmWaitForLsa(); - /* Start auto-start services */ ScmAutoStartServices(); + /* Signal auto-start complete event */ + SetEvent(hScmAutoStartCompleteEvent); + /* FIXME: more to do ? */ /* Release the service start lock */ ScmReleaseServiceStartLock(&Lock); + /* Initialization finished */ + ScmInitialize = FALSE; + DPRINT("SERVICES: Running.\n"); /* Wait until the shutdown event gets signaled */ @@ -451,6 +470,10 @@ done: if (hScmShutdownEvent != NULL) CloseHandle(hScmShutdownEvent); + /* Close the auto-start complete event */ + if (hScmAutoStartCompleteEvent != NULL) + CloseHandle(hScmAutoStartCompleteEvent); + /* Close the start event */ if (hScmStartEvent != NULL) CloseHandle(hScmStartEvent); @@ -458,7 +481,6 @@ done: DPRINT("SERVICES: Finished.\n"); ExitThread(0); - return 0; } diff --git a/reactos/base/system/services/services.h b/reactos/base/system/services/services.h index 8e13a3e342a..20afb30c08d 100644 --- a/reactos/base/system/services/services.h +++ b/reactos/base/system/services/services.h @@ -86,6 +86,7 @@ typedef struct _START_LOCK extern LIST_ENTRY ServiceListHead; extern LIST_ENTRY GroupListHead; extern LIST_ENTRY ImageListHead; +extern BOOL ScmInitialize; extern BOOL ScmShutdown; From 58a33cba17642370be91190c6912e1356590384c Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 17 Mar 2013 12:58:53 +0000 Subject: [PATCH 07/74] [CMD] Don't leak memory on realloc failure svn path=/trunk/; revision=58535 --- reactos/base/shell/cmd/copy.c | 4 ++++ reactos/base/shell/cmd/filecomp.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/reactos/base/shell/cmd/copy.c b/reactos/base/shell/cmd/copy.c index e39bcde2e5f..c558a4f673f 100644 --- a/reactos/base/shell/cmd/copy.c +++ b/reactos/base/shell/cmd/copy.c @@ -377,11 +377,15 @@ INT cmd_copy(LPTSTR param) if (size > 512) { + TCHAR *old_evar = evar; evar = cmd_realloc(evar,size * sizeof(TCHAR) ); if (evar!=NULL) size = GetEnvironmentVariable (_T("COPYCMD"), evar, size); else + { size=0; + evar = old_evar; + } } /* check see if we did get any env variable */ diff --git a/reactos/base/shell/cmd/filecomp.c b/reactos/base/shell/cmd/filecomp.c index 0243d1d5068..4015dcf43b4 100644 --- a/reactos/base/shell/cmd/filecomp.c +++ b/reactos/base/shell/cmd/filecomp.c @@ -666,6 +666,8 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) /* aseemble a list of all files names */ do { + FileName * oldFileList = FileList; + if(!_tcscmp (file.cFileName, _T(".")) || !_tcscmp (file.cFileName, _T(".."))) continue; @@ -683,6 +685,8 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) if(FileList == NULL) { + /* Don't leak old buffer */ + cmd_free(oldFileList); /* Assemble the orginal string and return */ _tcscpy(strOut,szOrginal); FindClose(hFile); From 30c46c7dc93417b60d0ab849f2bc54a0045be877 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 17 Mar 2013 13:35:17 +0000 Subject: [PATCH 08/74] [KSPROXY] Efficiently check for vector emptyness svn path=/trunk/; revision=58536 --- reactos/dll/directx/ksproxy/output_pin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/directx/ksproxy/output_pin.cpp b/reactos/dll/directx/ksproxy/output_pin.cpp index a272542be52..79a4b04498b 100644 --- a/reactos/dll/directx/ksproxy/output_pin.cpp +++ b/reactos/dll/directx/ksproxy/output_pin.cpp @@ -1676,7 +1676,7 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) assert(m_hPin != INVALID_HANDLE_VALUE); // get all supported sets - if (m_Plugins.size() == 0) + if (m_Plugins.empty()) { if (GetSupportedSets(&pGuid, &NumGuids)) { From e2af519ad3e1de2eaa92cb920b532fab55f60835 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 17 Mar 2013 13:55:51 +0000 Subject: [PATCH 09/74] [MSV1_0] - Add LsaApLogonUserEx and LsaApLogonUserEx2 stubs. - Delay import samsrv and lsasrv import libs. - Start the implementation of the logon process. svn path=/trunk/; revision=58537 --- reactos/dll/win32/msv1_0/CMakeLists.txt | 1 + reactos/dll/win32/msv1_0/msv1_0.c | 232 ++++++++++++++++++++++++ reactos/dll/win32/msv1_0/msv1_0.h | 138 ++++++++++++++ reactos/dll/win32/msv1_0/msv1_0.spec | 4 +- 4 files changed, 373 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/msv1_0/CMakeLists.txt b/reactos/dll/win32/msv1_0/CMakeLists.txt index b98a4792ceb..2d504c0cf0a 100644 --- a/reactos/dll/win32/msv1_0/CMakeLists.txt +++ b/reactos/dll/win32/msv1_0/CMakeLists.txt @@ -13,6 +13,7 @@ list(APPEND SOURCE add_library(msv1_0 SHARED ${SOURCE}) set_module_type(msv1_0 win32dll UNICODE ENTRYPOINT 0) target_link_libraries(msv1_0 wine ${PSEH_LIB}) +add_delay_importlibs(msv1_0 samsrv lsasrv) add_importlibs(msv1_0 kernel32 ntdll) add_pch(msv1_0 msv1_0.h) add_dependencies(msv1_0 psdk) diff --git a/reactos/dll/win32/msv1_0/msv1_0.c b/reactos/dll/win32/msv1_0/msv1_0.c index 84f1b43da2d..4878e28ec3f 100644 --- a/reactos/dll/win32/msv1_0/msv1_0.c +++ b/reactos/dll/win32/msv1_0/msv1_0.c @@ -20,6 +20,55 @@ LSA_DISPATCH_TABLE DispatchTable; /* FUNCTIONS ***************************************************************/ +static +NTSTATUS +GetDomainSid(PRPC_SID *Sid) +{ + LSAPR_HANDLE PolicyHandle = NULL; + PLSAPR_POLICY_INFORMATION PolicyInfo = NULL; + ULONG Length = 0; + NTSTATUS Status; + + Status = LsaIOpenPolicyTrusted(&PolicyHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("LsaIOpenPolicyTrusted() failed (Status 0x%08lx)\n", Status); + return Status; + } + + Status = LsarQueryInformationPolicy(PolicyHandle, + PolicyAccountDomainInformation, + &PolicyInfo); + if (!NT_SUCCESS(Status)) + { + TRACE("LsarQueryInformationPolicy() failed (Status 0x%08lx)\n", Status); + goto done; + } + + Length = RtlLengthSid(PolicyInfo->PolicyAccountDomainInfo.Sid); + + *Sid = RtlAllocateHeap(RtlGetProcessHeap(), 0, Length); + if (*Sid == NULL) + { + ERR("Failed to allocate SID\n"); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + memcpy(*Sid, PolicyInfo->PolicyAccountDomainInfo.Sid, Length); + +done: + if (PolicyInfo != NULL) + LsaIFree_LSAPR_POLICY_INFORMATION(PolicyAccountDomainInformation, + PolicyInfo); + + if (PolicyHandle != NULL) + LsarClose(&PolicyHandle); + + return Status; +} + + /* * @unimplemented */ @@ -95,6 +144,10 @@ LsaApInitializePackage(IN ULONG AuthenticationPackageId, /* Get the dispatch table entries */ DispatchTable.AllocateLsaHeap = LsaDispatchTable->AllocateLsaHeap; DispatchTable.FreeLsaHeap = LsaDispatchTable->FreeLsaHeap; + DispatchTable.AllocateClientBuffer = LsaDispatchTable->AllocateClientBuffer; + DispatchTable.FreeClientBuffer = LsaDispatchTable->FreeClientBuffer; + DispatchTable.CopyToClientBuffer = LsaDispatchTable->CopyToClientBuffer; + DispatchTable.CopyFromClientBuffer = LsaDispatchTable->CopyFromClientBuffer; /* Return the package name */ @@ -149,7 +202,186 @@ LsaApLogonUser(IN PLSA_CLIENT_REQUEST ClientRequest, OUT PLSA_UNICODE_STRING *AccountName, OUT PLSA_UNICODE_STRING *AuthenticatingAuthority) { + PMSV1_0_INTERACTIVE_LOGON LogonInfo; + + SAMPR_HANDLE ServerHandle = NULL; + SAMPR_HANDLE DomainHandle = NULL; + PRPC_SID AccountDomainSid = NULL; + RPC_UNICODE_STRING Names[1]; + SAMPR_ULONG_ARRAY RelativeIds = {0, NULL}; + SAMPR_ULONG_ARRAY Use = {0, NULL}; + NTSTATUS Status; + TRACE("()\n"); + + TRACE("LogonType: %lu\n", LogonType); + TRACE("AuthenticationInformation: %p\n", AuthenticationInformation); + TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength); + + + *ProfileBuffer = NULL; + *ProfileBufferLength = 0; + *SubStatus = STATUS_SUCCESS; + + if (LogonType == Interactive || + LogonType == Batch || + LogonType == Service) + { + ULONG_PTR PtrOffset; + + LogonInfo = (PMSV1_0_INTERACTIVE_LOGON)AuthenticationInformation; + + /* Fix-up pointers in the authentication info */ + PtrOffset = (ULONG_PTR)AuthenticationInformation - (ULONG_PTR)ClientAuthenticationBase; + + LogonInfo->LogonDomainName.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->LogonDomainName.Buffer + PtrOffset); + LogonInfo->UserName.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->UserName.Buffer + PtrOffset); + LogonInfo->Password.Buffer = (PWSTR)((ULONG_PTR)LogonInfo->Password.Buffer + PtrOffset); + + TRACE("Domain: %S\n", LogonInfo->LogonDomainName.Buffer); + TRACE("User: %S\n", LogonInfo->UserName.Buffer); + TRACE("Password: %S\n", LogonInfo->Password.Buffer); + } + else + { + FIXME("LogonType %lu is not supported yet!\n", LogonType); + return STATUS_NOT_IMPLEMENTED; + } + + Status = GetDomainSid(&AccountDomainSid); + if (!NT_SUCCESS(Status)) + { + TRACE("GetDomainSid() failed (Status 0x%08lx)\n", Status); + return Status; + } + + /* Connect to the SAM server */ + Status = SamIConnect(NULL, + &ServerHandle, + SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN, + TRUE); + if (!NT_SUCCESS(Status)) + { + TRACE("SamIConnect() failed (Status 0x%08lx)\n", Status); + goto done; + } + + /* Open the account domain */ + Status = SamrOpenDomain(ServerHandle, + DOMAIN_LOOKUP, + AccountDomainSid, + &DomainHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrOpenDomain failed (Status %08lx)\n", Status); + goto done; + } + + Names[0].Length = LogonInfo->UserName.Length; + Names[0].MaximumLength = LogonInfo->UserName.MaximumLength; + Names[0].Buffer = LogonInfo->UserName.Buffer; + + /* Try to get the RID for the user name */ + Status = SamrLookupNamesInDomain(DomainHandle, + 1, + Names, + &RelativeIds, + &Use); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrLookupNamesInDomain failed (Status %08lx)\n", Status); + Status = STATUS_NO_SUCH_USER; + goto done; + } + + /* Fail, if it is not a user account */ + if (Use.Element[0] != SidTypeUser) + { + TRACE("Account is not a user account!\n"); + Status = STATUS_NO_SUCH_USER; + goto done; + } + + + +done: + SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds); + SamIFree_SAMPR_ULONG_ARRAY(&Use); + + if (DomainHandle != NULL) + SamrCloseHandle(&DomainHandle); + + if (ServerHandle != NULL) + SamrCloseHandle(&ServerHandle); + + if (AccountDomainSid != NULL) + RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid); + + TRACE("LsaApLogonUser done (Status %08lx)\n", Status); + + return Status; +} + + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +LsaApLogonUserEx(IN PLSA_CLIENT_REQUEST ClientRequest, + IN SECURITY_LOGON_TYPE LogonType, + IN PVOID AuthenticationInformation, + IN PVOID ClientAuthenticationBase, + IN ULONG AuthenticationInformationLength, + OUT PVOID *ProfileBuffer, + OUT PULONG ProfileBufferLength, + OUT PLUID LogonId, + OUT PNTSTATUS SubStatus, + OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType, + OUT PVOID *TokenInformation, + OUT PUNICODE_STRING *AccountName, + OUT PUNICODE_STRING *AuthenticatingAuthority, + OUT PUNICODE_STRING *MachineName) +{ + TRACE("()\n"); + + TRACE("LogonType: %lu\n", LogonType); + TRACE("AuthenticationInformation: %p\n", AuthenticationInformation); + TRACE("AuthenticationInformationLength: %lu\n", AuthenticationInformationLength); + + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +LsaApLogonUserEx2(IN PLSA_CLIENT_REQUEST ClientRequest, + IN SECURITY_LOGON_TYPE LogonType, + IN PVOID ProtocolSubmitBuffer, + IN PVOID ClientBufferBase, + IN ULONG SubmitBufferSize, + OUT PVOID *ProfileBuffer, + OUT PULONG ProfileBufferSize, + OUT PLUID LogonId, + OUT PNTSTATUS SubStatus, + OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType, + OUT PVOID *TokenInformation, + OUT PUNICODE_STRING *AccountName, + OUT PUNICODE_STRING *AuthenticatingAuthority, + OUT PUNICODE_STRING *MachineName, + OUT PSECPKG_PRIMARY_CRED PrimaryCredentials, + OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY *SupplementalCredentials) +{ + TRACE("()\n"); + + TRACE("LogonType: %lu\n", LogonType); + TRACE("ProtocolSubmitBuffer: %p\n", ProtocolSubmitBuffer); + TRACE("SubmitBufferSize: %lu\n", SubmitBufferSize); + + return STATUS_NOT_IMPLEMENTED; } diff --git a/reactos/dll/win32/msv1_0/msv1_0.h b/reactos/dll/win32/msv1_0/msv1_0.h index 4c9c9181cbc..ee9f5008cda 100644 --- a/reactos/dll/win32/msv1_0/msv1_0.h +++ b/reactos/dll/win32/msv1_0/msv1_0.h @@ -27,7 +27,145 @@ #include #include #include +#include +#include + +#include +//#include #include +typedef struct _RPC_SID +{ + UCHAR Revision; + UCHAR SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + DWORD SubAuthority[]; +} RPC_SID, *PRPC_SID; + +typedef struct _RPC_UNICODE_STRING +{ + unsigned short Length; + unsigned short MaximumLength; + wchar_t *Buffer; +} RPC_UNICODE_STRING, *PRPC_UNICODE_STRING; + +typedef wchar_t *PSAMPR_SERVER_NAME; +typedef void *SAMPR_HANDLE; + +typedef struct _SAMPR_ULONG_ARRAY +{ + ULONG Count; + PULONG Element; +} SAMPR_ULONG_ARRAY, *PSAMPR_ULONG_ARRAY; + +NTSTATUS +NTAPI +SamIConnect(IN PSAMPR_SERVER_NAME ServerName, + OUT SAMPR_HANDLE *ServerHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN Trusted); + +VOID +NTAPI +SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr); + +NTSTATUS +NTAPI +SamrCloseHandle(IN OUT SAMPR_HANDLE *SamHandle); + +NTSTATUS +NTAPI +SamrOpenDomain(IN SAMPR_HANDLE ServerHandle, + IN ACCESS_MASK DesiredAccess, + IN PRPC_SID DomainId, + OUT SAMPR_HANDLE *DomainHandle); + +NTSTATUS +NTAPI +SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle, + IN ULONG Count, + IN RPC_UNICODE_STRING Names[], + OUT PSAMPR_ULONG_ARRAY RelativeIds, + OUT PSAMPR_ULONG_ARRAY Use); + +typedef PVOID LSAPR_HANDLE; + +typedef struct _LSAPR_POLICY_AUDIT_EVENTS_INFO +{ + BOOLEAN AuditingMode; + DWORD *EventAuditingOptions; + DWORD MaximumAuditEventCount; +} LSAPR_POLICY_AUDIT_EVENTS_INFO, *PLSAPR_POLICY_AUDIT_EVENTS_INFO; + +typedef struct _LSAPR_POLICY_PRIMARY_DOM_INFO +{ + RPC_UNICODE_STRING Name; + PRPC_SID Sid; +} LSAPR_POLICY_PRIMARY_DOM_INFO, *PLSAPR_POLICY_PRIMARY_DOM_INFO; + +typedef struct _LSAPR_POLICY_ACCOUNT_DOM_INFO +{ + RPC_UNICODE_STRING DomainName; + PRPC_SID Sid; +} LSAPR_POLICY_ACCOUNT_DOM_INFO, *PLSAPR_POLICY_ACCOUNT_DOM_INFO; + +typedef struct _LSAPR_POLICY_PD_ACCOUNT_INFO +{ + RPC_UNICODE_STRING Name; +} LSAPR_POLICY_PD_ACCOUNT_INFO, *PLSAPR_POLICY_PD_ACCOUNT_INFO; + +typedef struct _POLICY_LSA_REPLICA_SRCE_INFO +{ + RPC_UNICODE_STRING ReplicaSource; + RPC_UNICODE_STRING ReplicaAccountName; +} POLICY_LSA_REPLICA_SRCE_INFO, *PPOLICY_LSA_REPLICA_SRCE_INFO; + +typedef struct _LSAPR_POLICY_DNS_DOMAIN_INFO +{ + RPC_UNICODE_STRING Name; + RPC_UNICODE_STRING DnsDomainName; + RPC_UNICODE_STRING DnsForestName; + GUID DomainGuid; + PRPC_SID Sid; +} LSAPR_POLICY_DNS_DOMAIN_INFO, *PLSAPR_POLICY_DNS_DOMAIN_INFO; + +typedef union _LSAPR_POLICY_INFORMATION +{ + POLICY_AUDIT_LOG_INFO PolicyAuditLogInfo; + LSAPR_POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo; + LSAPR_POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo; + LSAPR_POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo; + LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo; + POLICY_LSA_SERVER_ROLE_INFO PolicyServerRoleInfo; + POLICY_LSA_REPLICA_SRCE_INFO PolicyReplicaSourceInfo; + POLICY_DEFAULT_QUOTA_INFO PolicyDefaultQuotaInfo; + POLICY_MODIFICATION_INFO PolicyModificationInfo; + POLICY_AUDIT_FULL_SET_INFO PolicyAuditFullSetInfo; + POLICY_AUDIT_FULL_QUERY_INFO PolicyAuditFullQueryInfo; + LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfo; + LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt; + LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyLocalAccountDomainInfo; +} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION; + +VOID +NTAPI +LsaIFree_LSAPR_POLICY_INFORMATION(IN POLICY_INFORMATION_CLASS InformationClass, + IN PLSAPR_POLICY_INFORMATION PolicyInformation); + +NTSTATUS +WINAPI +LsaIOpenPolicyTrusted(OUT LSAPR_HANDLE *PolicyHandle); + +NTSTATUS +WINAPI +LsarClose(IN OUT LSAPR_HANDLE *ObjectHandle); + +NTSTATUS +WINAPI +LsarQueryInformationPolicy(IN LSAPR_HANDLE PolicyHandle, + IN POLICY_INFORMATION_CLASS InformationClass, + OUT PLSAPR_POLICY_INFORMATION *PolicyInformation); + + /* EOF */ diff --git a/reactos/dll/win32/msv1_0/msv1_0.spec b/reactos/dll/win32/msv1_0/msv1_0.spec index 31a19adf71e..ea061763b8c 100644 --- a/reactos/dll/win32/msv1_0/msv1_0.spec +++ b/reactos/dll/win32/msv1_0/msv1_0.spec @@ -4,8 +4,8 @@ @ stdcall LsaApInitializePackage(long ptr ptr ptr ptr) @ stdcall LsaApLogonTerminated(ptr) @ stdcall LsaApLogonUser(ptr long ptr ptr long ptr ptr ptr ptr ptr ptr ptr ptr) -@ stub LsaApLogonUserEx -@ stub LsaApLogonUserEx2 +#@ stdcall LsaApLogonUserEx(ptr long ptr ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) +#@ stdcall LsaApLogonUserEx2(ptr long ptr ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) @ stub Msv1_0ExportSubAuthenticationRoutine @ stub Msv1_0SubAuthenticationPresent @ stub MsvGetLogonAttemptCount From eef0ea6fe2ef49031339e55f2870001dbdc1cc64 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 14:58:07 +0000 Subject: [PATCH 10/74] [SAL] * Add _Outptr_result_bytebuffer_maybenull_ and _Readable_elements_ annotations. svn path=/trunk/; revision=58538 --- reactos/include/psdk/sal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/psdk/sal.h b/reactos/include/psdk/sal.h index 8f0ed8f4b5a..36facf4ea67 100644 --- a/reactos/include/psdk/sal.h +++ b/reactos/include/psdk/sal.h @@ -832,7 +832,7 @@ enum __SAL_YesNo {_SAL_notpresent, _SAL_no, _SAL_maybe, _SAL_yes, _SAL_default}; #define _Outptr_result_bytebuffer_(size) _SAL2_NAME(_Outptr_result_bytebuffer_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_No,Notref=1,WritableBytes="\n" _SA_SPECSTRIZE(size))]) //#define _Outptr_result_bytebuffer_all_(size) //#define _Outptr_result_bytebuffer_all_maybenull_(size) -//#define _Outptr_result_bytebuffer_maybenull_(size) +#define _Outptr_result_bytebuffer_maybenull_(size) _SAL2_NAME(_Outptr_result_bytebuffer_maybenull_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_Maybe,Notref=1,WritableBytes="\n" _SA_SPECSTRIZE(size))]) #define _Outptr_result_bytebuffer_to_(size, count) _SAL2_NAME(_Outptr_result_bytebuffer_to_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_No,Notref=1,WritableBytes="\n" _SA_SPECSTRIZE(size), ValidBytes="\n" _SA_SPECSTRIZE(count))]) //#define _Outptr_result_bytebuffer_to_maybenull_(size, count) #define _Outptr_result_maybenull_ _SAL2_NAME(_Outptr_result_maybenull_) _Group_([SA_Pre(Null=SA_No,Notref=1)] [SA_Pre(WritableElementsConst=1,Notref=1)] [SA_Post(Valid=SA_Yes)] [SA_Post(Deref=1,Null=SA_Maybe,Notref=1,ValidElements="\n""1")] ) @@ -980,7 +980,7 @@ enum __SAL_YesNo {_SAL_notpresent, _SAL_no, _SAL_maybe, _SAL_yes, _SAL_default}; //#define _Raises_SEH_exception_ #define _Maybe_raises_SEH_exception_ #define _Readable_bytes_(size) _SAL2_NAME(_Readable_bytes_) _Group_(_SA_annotes1(SAL_readableTo, byteCount(size))) -//#define _Readable_elements_(size) +#define _Readable_elements_(size) _SAL2_NAME(_Readable_elements_) _Group_([SAL_annotes(Name="SAL_readableTo", p1="elementCount(size)")]) #define _Reserved_ _SAL2_NAME(_Reserved_) _Group_([SA_Pre(Null=SA_Yes)]) //#define _Result_nullonfailure_ //#define _Result_zeroonfailure_ From 90376d03981f2738495a53570bcfe71ccb55cd4c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 15:11:05 +0000 Subject: [PATCH 11/74] [LIBUSB] * Fix some format specifiers. svn path=/trunk/; revision=58539 --- reactos/lib/drivers/libusb/hcd_controller.cpp | 8 ++++---- reactos/lib/drivers/libusb/hub_controller.cpp | 14 +++++++------- reactos/lib/drivers/libusb/usb_device.cpp | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/reactos/lib/drivers/libusb/hcd_controller.cpp b/reactos/lib/drivers/libusb/hcd_controller.cpp index ef6b4175a4c..aa6bac984be 100644 --- a/reactos/lib/drivers/libusb/hcd_controller.cpp +++ b/reactos/lib/drivers/libusb/hcd_controller.cpp @@ -635,7 +635,7 @@ CHCDController::CreateFDO( // // construct device name // - swprintf(CharDeviceName, L"\\Device\\USBFDO-%d", UsbDeviceNumber); + swprintf(CharDeviceName, L"\\Device\\USBFDO-%lu", UsbDeviceNumber); // // initialize device name @@ -706,8 +706,8 @@ CHCDController::SetSymbolicLink( // // create legacy link // - swprintf(LinkName, L"\\DosDevices\\HCD%d", m_FDODeviceNumber); - swprintf(FDOName, L"\\Device\\USBFDO-%d", m_FDODeviceNumber); + swprintf(LinkName, L"\\DosDevices\\HCD%lu", m_FDODeviceNumber); + swprintf(FDOName, L"\\Device\\USBFDO-%lu", m_FDODeviceNumber); RtlInitUnicodeString(&Link, LinkName); RtlInitUnicodeString(&FDO, FDOName); @@ -729,7 +729,7 @@ CHCDController::SetSymbolicLink( // // create legacy link // - swprintf(LinkName, L"\\DosDevices\\HCD%d", m_FDODeviceNumber); + swprintf(LinkName, L"\\DosDevices\\HCD%lu", m_FDODeviceNumber); RtlInitUnicodeString(&Link, LinkName); // diff --git a/reactos/lib/drivers/libusb/hub_controller.cpp b/reactos/lib/drivers/libusb/hub_controller.cpp index 5b70f034380..520d56ac590 100644 --- a/reactos/lib/drivers/libusb/hub_controller.cpp +++ b/reactos/lib/drivers/libusb/hub_controller.cpp @@ -321,7 +321,7 @@ CHubController::QueryStatusChageEndpoint( { m_Hardware->GetPortStatus(PortId, &PortStatus, &PortChange); - DPRINT1("[%S] Port %d: Status %x, Change %x\n", m_USBType, PortId, PortStatus, PortChange); + DPRINT1("[%S] Port %lu: Status %x, Change %x\n", m_USBType, PortId, PortStatus, PortChange); // @@ -329,7 +329,7 @@ CHubController::QueryStatusChageEndpoint( // if (PortChange != 0) { - DPRINT1("[%S] Change state on port %d\n", m_USBType, PortId); + DPRINT1("[%S] Change state on port %lu\n", m_USBType, PortId); // Set the value for the port number *TransferBuffer = 1 << ((PortId + 1) & 7); Changed = TRUE; @@ -1798,8 +1798,8 @@ CHubController::HandleClassEndpoint( DPRINT1("URB_FUNCTION_CLASS_ENDPOINT\n"); DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); - DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); - DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); + DPRINT1("TransferBuffer %p\n", Urb->UrbControlVendorClassRequest.TransferBuffer); + DPRINT1("TransferBufferMDL %p\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); @@ -2141,8 +2141,8 @@ CHubController::HandleClassInterface( DPRINT1("URB_FUNCTION_CLASS_INTERFACE\n"); DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags); DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); - DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer); - DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); + DPRINT1("TransferBuffer %p\n", Urb->UrbControlVendorClassRequest.TransferBuffer); + DPRINT1("TransferBufferMDL %p\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL); DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits); DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request); DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value); @@ -3853,7 +3853,7 @@ CHubController::CreatePDO( // // construct device name // - swprintf(CharDeviceName, L"\\Device\\USBPDO-%d", UsbDeviceNumber); + swprintf(CharDeviceName, L"\\Device\\USBPDO-%lu", UsbDeviceNumber); // // initialize device name diff --git a/reactos/lib/drivers/libusb/usb_device.cpp b/reactos/lib/drivers/libusb/usb_device.cpp index c9795d186b4..3615863c241 100644 --- a/reactos/lib/drivers/libusb/usb_device.cpp +++ b/reactos/lib/drivers/libusb/usb_device.cpp @@ -844,7 +844,7 @@ CUSBDevice::GetConfigurationDescriptorsLength() VOID CUSBDevice::DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) { - DPRINT1("Dumping Device Descriptor %x\n", DeviceDescriptor); + DPRINT1("Dumping Device Descriptor %p\n", DeviceDescriptor); DPRINT1("bLength %x\n", DeviceDescriptor->bLength); DPRINT1("bDescriptorType %x\n", DeviceDescriptor->bDescriptorType); DPRINT1("bcdUSB %x\n", DeviceDescriptor->bcdUSB); @@ -865,7 +865,7 @@ CUSBDevice::DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) VOID CUSBDevice::DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor) { - DPRINT1("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor); + DPRINT1("Dumping ConfigurationDescriptor %p\n", ConfigurationDescriptor); DPRINT1("bLength %x\n", ConfigurationDescriptor->bLength); DPRINT1("bDescriptorType %x\n", ConfigurationDescriptor->bDescriptorType); DPRINT1("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength); @@ -1247,10 +1247,10 @@ CUSBDevice::SelectInterface( // copy pipe handle DPRINT1("PipeIndex %lu\n", PipeIndex); DPRINT1("EndpointAddress %x\n", InterfaceInfo->Pipes[PipeIndex].EndpointAddress); - DPRINT1("Interval %d\n", InterfaceInfo->Pipes[PipeIndex].Interval); - DPRINT1("MaximumPacketSize %d\n", InterfaceInfo->Pipes[PipeIndex].MaximumPacketSize); - DPRINT1("MaximumTransferSize %d\n", InterfaceInfo->Pipes[PipeIndex].MaximumTransferSize); - DPRINT1("PipeFlags %d\n", InterfaceInfo->Pipes[PipeIndex].PipeFlags); + DPRINT1("Interval %c\n", InterfaceInfo->Pipes[PipeIndex].Interval); + DPRINT1("MaximumPacketSize %hu\n", InterfaceInfo->Pipes[PipeIndex].MaximumPacketSize); + DPRINT1("MaximumTransferSize %lu\n", InterfaceInfo->Pipes[PipeIndex].MaximumTransferSize); + DPRINT1("PipeFlags %lu\n", InterfaceInfo->Pipes[PipeIndex].PipeFlags); DPRINT1("PipeType %d\n", InterfaceInfo->Pipes[PipeIndex].PipeType); DPRINT1("UsbEndPoint %x\n", InterfaceInfo->Pipes[PipeIndex].EndpointAddress); From 41d46eca5cc992e4b120504ac38aa9674c565521 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 15:11:55 +0000 Subject: [PATCH 12/74] [DDK] * Annotate ntstrsafe.h. svn path=/trunk/; revision=58540 --- reactos/include/ddk/ntstrsafe.h | 896 +++++++++++++++++++++++++++----- 1 file changed, 763 insertions(+), 133 deletions(-) diff --git a/reactos/include/ddk/ntstrsafe.h b/reactos/include/ddk/ntstrsafe.h index b44910b7db8..b2a199cec47 100644 --- a/reactos/include/ddk/ntstrsafe.h +++ b/reactos/include/ddk/ntstrsafe.h @@ -59,6 +59,11 @@ typedef const char *STRSAFE_LPCSTR; typedef wchar_t *STRSAFE_LPWSTR; typedef const wchar_t *STRSAFE_LPCWSTR; +typedef _Null_terminated_ char *NTSTRSAFE_PSTR; +typedef _Null_terminated_ const char *NTSTRSAFE_PCSTR; +typedef _Null_terminated_ wchar_t *NTSTRSAFE_PWSTR; +typedef _Null_terminated_ const wchar_t *NTSTRSAFE_PCWSTR; + typedef ULONG STRSAFE_DWORD; NTSTRSAFEAPI RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); @@ -81,38 +86,79 @@ NTSTRSAFEAPI RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAF NTSTRSAFEAPI RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList); NTSTRSAFEAPI RtlStringVPrintfExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); NTSTRSAFEAPI RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength); -NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringLengthWorkerA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength); +NTSTRSAFEAPI +RtlStringLengthWorkerW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCopyA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc); + +NTSTRSAFEAPI +RtlStringCchCopyW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); + +NTSTRSAFEAPI +RtlStringCchCopyA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { return (cchDest > NTSTRSAFE_MAX_CCH ? STATUS_INVALID_PARAMETER : RtlStringCopyWorkerA(pszDest,cchDest,pszSrc)); } -NTSTRSAFEAPI RtlStringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCopyW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCbCopyA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringCbCopyW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); - -NTSTRSAFEAPI RtlStringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCopyA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyWorkerA(pszDest,cbDest,pszSrc); } -NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCopyW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { size_t cchDest = cbDest / sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -120,19 +166,46 @@ NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWS return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCchCopyExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCopyExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { size_t cbDest; if (cchDest > NTSTRSAFE_MAX_CCH) @@ -141,12 +214,32 @@ NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_L return RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCopyExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCopyExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -161,7 +254,14 @@ NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCS return Status; } -NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest = cbDest / sizeof(wchar_t); @@ -178,38 +278,77 @@ NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } +NTSTRSAFEAPI +RtlStringCchCopyNA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy); -NTSTRSAFEAPI RtlStringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy); -NTSTRSAFEAPI RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy); +NTSTRSAFEAPI +RtlStringCchCopyNW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy); -NTSTRSAFEAPI RtlStringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy) +NTSTRSAFEAPI +RtlStringCchCopyNA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy) { if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy); } -NTSTRSAFEAPI RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy) +NTSTRSAFEAPI +RtlStringCchCopyNW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy) { if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); } +NTSTRSAFEAPI +RtlStringCbCopyNA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy); -NTSTRSAFEAPI RtlStringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy); -NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy); +NTSTRSAFEAPI +RtlStringCbCopyNW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy); - -NTSTRSAFEAPI RtlStringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy) +NTSTRSAFEAPI +RtlStringCbCopyNA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy) { if (cbDest > NTSTRSAFE_MAX_CCH || cbToCopy > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNWorkerA(pszDest,cbDest,pszSrc,cbToCopy); } -NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy) +NTSTRSAFEAPI +RtlStringCbCopyNW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy) { size_t cchDest = cbDest / sizeof(wchar_t); size_t cchToCopy = cbToCopy / sizeof(wchar_t); @@ -218,31 +357,85 @@ NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCW return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); } +NTSTRSAFEAPI +RtlStringCchCopyNExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCopyNExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyNExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCopyNExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToCopy, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCopyNExWorkerW(pszDest,cchDest,cchDest * sizeof(wchar_t),pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCopyNExA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCopyNExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyNExA( + _Out_writes_bytes_(cbDest) STRSAFE_LPSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -255,7 +448,15 @@ NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } -NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCopyNExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToCopy, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest; @@ -272,38 +473,68 @@ NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LP return Status; } +NTSTRSAFEAPI +RtlStringCchCatA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc); -NTSTRSAFEAPI RtlStringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringCchCatW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); - -NTSTRSAFEAPI RtlStringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCatA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatWorkerA(pszDest,cchDest,pszSrc); } -NTSTRSAFEAPI RtlStringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCchCatW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCbCatA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc); -NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc); +NTSTRSAFEAPI +RtlStringCbCatW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc); - -NTSTRSAFEAPI RtlStringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCatA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatWorkerA(pszDest,cbDest,pszSrc); } -NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc) +NTSTRSAFEAPI +RtlStringCbCatW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc) { size_t cchDest = cbDest / sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -311,19 +542,46 @@ NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWST return RtlStringCatWorkerW(pszDest,cchDest,pszSrc); } +NTSTRSAFEAPI +RtlStringCchCatExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCatExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { size_t cbDest = cchDest*sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -331,12 +589,32 @@ NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LP return RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCatExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCatExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -349,7 +627,14 @@ NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCST return Status; } -NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ NTSTRSAFE_PCWSTR pszSrc, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest = cbDest / sizeof(wchar_t); @@ -364,38 +649,76 @@ NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCW return Status; } +NTSTRSAFEAPI +RtlStringCchCatNA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend); -NTSTRSAFEAPI RtlStringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend); -NTSTRSAFEAPI RtlStringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend); +NTSTRSAFEAPI +RtlStringCchCatNW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend); - -NTSTRSAFEAPI RtlStringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend) +NTSTRSAFEAPI +RtlStringCchCatNA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend); } -NTSTRSAFEAPI RtlStringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend) +NTSTRSAFEAPI +RtlStringCchCatNW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); } +NTSTRSAFEAPI +RtlStringCbCatNA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend); -NTSTRSAFEAPI RtlStringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend); -NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend); +NTSTRSAFEAPI +RtlStringCbCatNW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend); - -NTSTRSAFEAPI RtlStringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend) +NTSTRSAFEAPI +RtlStringCbCatNA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNWorkerA(pszDest,cbDest,pszSrc,cbToAppend); } -NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend) +NTSTRSAFEAPI +RtlStringCbCatNW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend) { size_t cchDest = cbDest / sizeof(wchar_t); size_t cchToAppend = cbToAppend / sizeof(wchar_t); @@ -405,31 +728,85 @@ NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWS return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); } +NTSTRSAFEAPI +RtlStringCchCatNExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCchCatNExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatNExA( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); } -NTSTRSAFEAPI RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCchCatNExW( + _Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cchToAppend, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringCatNExWorkerW(pszDest,cchDest,(cchDest*sizeof(wchar_t)),pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); } +NTSTRSAFEAPI +RtlStringCbCatNExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); -NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags); +NTSTRSAFEAPI +RtlStringCbCatNExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags); - -NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatNExA( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchRemaining = 0; @@ -442,7 +819,15 @@ NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCS return Status; } -NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags) +NTSTRSAFEAPI +RtlStringCbCatNExW( + _Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc, + _In_ size_t cbToAppend, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags) { NTSTATUS Status; size_t cchDest = cbDest / sizeof(wchar_t); @@ -457,38 +842,76 @@ NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } +NTSTRSAFEAPI +RtlStringCchVPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCchVPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); } -NTSTRSAFEAPI RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { if (cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); } +NTSTRSAFEAPI +RtlStringCbVPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCbVPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { if (cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; return RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList); } -NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { size_t cchDest = cbDest / sizeof(wchar_t); if (cchDest > NTSTRSAFE_MAX_CCH) @@ -496,12 +919,26 @@ NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LP return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); } +NTSTRSAFEAPI +RtlStringCchPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCchPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -513,7 +950,12 @@ NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LP return Status; } -NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -525,12 +967,26 @@ NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_L return Status; } +NTSTRSAFEAPI +RtlStringCbPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCbPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -542,7 +998,12 @@ NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCS return Status; } -NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -555,12 +1016,35 @@ NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPC return Status; } +NTSTRSAFEAPI +RtlStringCchPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCchPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; va_list argList; @@ -572,7 +1056,15 @@ NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_ return Status; } -NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCchPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; size_t cbDest = cchDest * sizeof(wchar_t); @@ -585,12 +1077,35 @@ NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE return Status; } +NTSTRSAFEAPI +RtlStringCbPrintfExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...); -NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...); -NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...); +NTSTRSAFEAPI +RtlStringCbPrintfExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...); - -NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfExA( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + ...) { NTSTATUS Status; size_t cchDest; @@ -615,7 +1130,15 @@ NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LP return Status; } -NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...) +NTSTRSAFEAPI +RtlStringCbPrintfExW( + _Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + ...) { NTSTATUS Status; size_t cchDest; @@ -640,12 +1163,35 @@ NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_L return Status; } +NTSTRSAFEAPI +RtlStringCchVPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCchVPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfExA( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; if (cchDest > NTSTRSAFE_MAX_CCH) @@ -659,7 +1205,15 @@ NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE return Status; } -NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCchVPrintfExW( + _Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cchDest, + _Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcchRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; if (cchDest > NTSTRSAFE_MAX_CCH) @@ -673,12 +1227,35 @@ NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAF return Status; } +NTSTRSAFEAPI +RtlStringCbVPrintfExA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); -NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); +NTSTRSAFEAPI +RtlStringCbVPrintfExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList); - -NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfExA( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; size_t cchDest; @@ -698,7 +1275,15 @@ NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_L return Status; } -NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) +NTSTRSAFEAPI +RtlStringCbVPrintfExW( + _Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, + _In_ size_t cbDest, + _Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd, + _Out_opt_ size_t *pcbRemaining, + _In_ STRSAFE_DWORD dwFlags, + _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat, + _In_ va_list argList) { NTSTATUS Status; size_t cchDest; @@ -719,11 +1304,26 @@ NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_ } -NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength); +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength); +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength); -NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength) { NTSTATUS Status; if (!psz || (cchMax > NTSTRSAFE_MAX_CCH)) @@ -737,7 +1337,12 @@ NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLe return Status; } -NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCchLengthW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength) { NTSTATUS Status; if (!psz || (cchMax > NTSTRSAFE_MAX_CCH)) @@ -751,12 +1356,26 @@ NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchL return Status; } +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthA( + _In_reads_or_z_(cbMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax) size_t *pcbLength); -NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength); -NTSTRSAFEAPI RtlStringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength); +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthW( + _In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t *pcbLength); - -NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthA( + _In_reads_or_z_(cbMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax) size_t *pcbLength) { NTSTATUS Status; size_t cchMax; @@ -780,7 +1399,12 @@ NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLengt return Status; } -NTSTRSAFEAPI RtlStringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength) +_Must_inspect_result_ +NTSTRSAFEAPI +RtlStringCbLengthW( + _In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_LPCWSTR psz, + _In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax, + _Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t *pcbLength) { NTSTATUS Status; size_t cchMax; @@ -2004,7 +2628,11 @@ NTSTRSAFEAPI RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,siz return Status; } -NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength) +NTSTRSAFEAPI +RtlStringLengthWorkerA( + _In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength) { NTSTATUS Status = STATUS_SUCCESS; size_t cchMaxPrev = cchMax; @@ -2025,7 +2653,11 @@ NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcc return Status; } -NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength) +NTSTRSAFEAPI +RtlStringLengthWorkerW( + _In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz, + _In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax, + _Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength) { NTSTATUS Status = STATUS_SUCCESS; size_t cchMaxPrev = cchMax; @@ -2046,8 +2678,6 @@ NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pc return Status; } - - #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA; #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW; #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA; From 54934bd809ae6f27cb7615851c94a9631b78ca80 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 15:18:15 +0000 Subject: [PATCH 13/74] [USBSTOR] * Fix some format specifiers. svn path=/trunk/; revision=58541 --- reactos/drivers/usb/usbstor/descriptor.c | 4 ++-- reactos/drivers/usb/usbstor/error.c | 4 ++-- reactos/drivers/usb/usbstor/fdo.c | 2 +- reactos/drivers/usb/usbstor/pdo.c | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/usb/usbstor/descriptor.c b/reactos/drivers/usb/usbstor/descriptor.c index 28b7ead3332..4728c6249ee 100644 --- a/reactos/drivers/usb/usbstor/descriptor.c +++ b/reactos/drivers/usb/usbstor/descriptor.c @@ -331,7 +331,7 @@ USBSTOR_ScanConfigurationDescriptor( VOID DumpConfigurationDescriptor(PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor) { - DPRINT1("Dumping ConfigurationDescriptor %x\n", ConfigurationDescriptor); + DPRINT1("Dumping ConfigurationDescriptor %p\n", ConfigurationDescriptor); DPRINT1("bLength %x\n", ConfigurationDescriptor->bLength); DPRINT1("bDescriptorType %x\n", ConfigurationDescriptor->bDescriptorType); DPRINT1("wTotalLength %x\n", ConfigurationDescriptor->wTotalLength); @@ -535,7 +535,7 @@ USBSTOR_GetPipeHandles( // // WTF? usb port driver does not give us bulk pipe access // - DPRINT1("USBSTOR_GetPipeHandles> BulkInFound %d BulkOutFound %d missing!!!\n", BulkInFound, BulkOutFound); + DPRINT1("USBSTOR_GetPipeHandles> BulkInFound %c BulkOutFound %c missing!!!\n", BulkInFound, BulkOutFound); return STATUS_DEVICE_CONFIGURATION_ERROR; } diff --git a/reactos/drivers/usb/usbstor/error.c b/reactos/drivers/usb/usbstor/error.c index 3ed594932cd..0d80946edf7 100644 --- a/reactos/drivers/usb/usbstor/error.c +++ b/reactos/drivers/usb/usbstor/error.c @@ -42,7 +42,7 @@ USBSTOR_GetEndpointStatus( // // send the request // - DPRINT1("Sending Request DeviceObject %x, Urb %x\n", DeviceObject, Urb); + DPRINT1("Sending Request DeviceObject %p, Urb %p\n", DeviceObject, Urb); Status = USBSTOR_SyncUrbRequest(DeviceObject, Urb); // @@ -90,7 +90,7 @@ USBSTOR_ResetPipeWithHandle( // // send the request // - DPRINT1("Sending Request DeviceObject %x, Urb %x\n", DeviceObject, Urb); + DPRINT1("Sending Request DeviceObject %p, Urb %p\n", DeviceObject, Urb); Status = USBSTOR_SyncUrbRequest(DeviceObject, Urb); // diff --git a/reactos/drivers/usb/usbstor/fdo.c b/reactos/drivers/usb/usbstor/fdo.c index a9f408da099..83f9c939089 100644 --- a/reactos/drivers/usb/usbstor/fdo.c +++ b/reactos/drivers/usb/usbstor/fdo.c @@ -14,7 +14,7 @@ VOID USBSTOR_DumpDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) { - DPRINT1("Dumping Device Descriptor %x\n", DeviceDescriptor); + DPRINT1("Dumping Device Descriptor %p\n", DeviceDescriptor); DPRINT1("bLength %x\n", DeviceDescriptor->bLength); DPRINT1("bDescriptorType %x\n", DeviceDescriptor->bDescriptorType); DPRINT1("bcdUSB %x\n", DeviceDescriptor->bcdUSB); diff --git a/reactos/drivers/usb/usbstor/pdo.c b/reactos/drivers/usb/usbstor/pdo.c index f7a2a654789..2c70f435f40 100644 --- a/reactos/drivers/usb/usbstor/pdo.c +++ b/reactos/drivers/usb/usbstor/pdo.c @@ -671,14 +671,14 @@ USBSTOR_PdoHandleQueryInstanceId( // // using serial number from device // - swprintf(Buffer, L"%s&%d", FDODeviceExtension->SerialNumber->bString, PDODeviceExtension->LUN); + swprintf(Buffer, L"%s&%c", FDODeviceExtension->SerialNumber->bString, PDODeviceExtension->LUN); } else { // // use instance count and LUN // - swprintf(Buffer, L"%04d&%d", FDODeviceExtension->InstanceCount, PDODeviceExtension->LUN); + swprintf(Buffer, L"%04lu&%c", FDODeviceExtension->InstanceCount, PDODeviceExtension->LUN); } // @@ -1203,7 +1203,7 @@ USBSTOR_SendInquiryIrp( DPRINT1("Version %x\n", Response->Version); DPRINT1("Format %x\n", Response->Format); DPRINT1("Length %x\n", Response->Length); - DPRINT1("Reserved %x\n", Response->Reserved); + DPRINT1("Reserved %p\n", Response->Reserved); DPRINT1("Vendor %c%c%c%c%c%c%c%c\n", Response->Vendor[0], Response->Vendor[1], Response->Vendor[2], Response->Vendor[3], Response->Vendor[4], Response->Vendor[5], Response->Vendor[6], Response->Vendor[7]); DPRINT1("Product %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", Response->Product[0], Response->Product[1], Response->Product[2], Response->Product[3], Response->Product[4], Response->Product[5], Response->Product[6], Response->Product[7], From 3eaa9e9dd9052e27ad29be2a0ff61785d0865164 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 15:27:52 +0000 Subject: [PATCH 14/74] [USBEHCI] * Fix some format specifiers. svn path=/trunk/; revision=58542 --- reactos/drivers/usb/usbehci/hardware.cpp | 24 +++++++++++------------ reactos/drivers/usb/usbehci/usb_queue.cpp | 8 ++++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/reactos/drivers/usb/usbehci/hardware.cpp b/reactos/drivers/usb/usbehci/hardware.cpp index 96e59b36fdb..ad7c2a4e071 100644 --- a/reactos/drivers/usb/usbehci/hardware.cpp +++ b/reactos/drivers/usb/usbehci/hardware.cpp @@ -252,9 +252,9 @@ CUSBHardwareDevice::PrintCapabilities() DPRINT1("Controler EHCI has Port Power Control\n"); } - DPRINT1("Controller Port Routing Rules %d\n", m_Capabilities.HCSParams.PortRouteRules); - DPRINT1("Number of Ports per Companion Controller %d\n", m_Capabilities.HCSParams.PortPerCHC); - DPRINT1("Number of Companion Controller %d\n", m_Capabilities.HCSParams.CHCCount); + DPRINT1("Controller Port Routing Rules %lu\n", m_Capabilities.HCSParams.PortRouteRules); + DPRINT1("Number of Ports per Companion Controller %lu\n", m_Capabilities.HCSParams.PortPerCHC); + DPRINT1("Number of Companion Controller %lu\n", m_Capabilities.HCSParams.CHCCount); if (m_Capabilities.HCSParams.PortIndicator) { @@ -363,11 +363,11 @@ CUSBHardwareDevice::PnpStart( m_Capabilities.HCSParamsLong = READ_REGISTER_ULONG((PULONG)((ULONG)ResourceBase + EHCI_HCSPARAMS)); m_Capabilities.HCCParamsLong = READ_REGISTER_ULONG((PULONG)((ULONG)ResourceBase + EHCI_HCCPARAMS)); - DPRINT1("Controller has %d Length\n", m_Capabilities.Length); + DPRINT1("Controller has %c Length\n", m_Capabilities.Length); DPRINT1("Controller EHCI Version %x\n", m_Capabilities.HCIVersion); DPRINT1("Controller EHCI Caps HCSParamsLong %x\n", m_Capabilities.HCSParamsLong); DPRINT1("Controller EHCI Caps HCCParamsLong %x\n", m_Capabilities.HCCParamsLong); - DPRINT1("Controller has %d Ports\n", m_Capabilities.HCSParams.PortCount); + DPRINT1("Controller has %lu Ports\n", m_Capabilities.HCSParams.PortCount); // // print capabilities @@ -597,7 +597,7 @@ CUSBHardwareDevice::StartController(void) // lets wait a bit // Timeout.QuadPart = 50; - DPRINT1("Waiting %d milliseconds for port reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -915,7 +915,7 @@ CUSBHardwareDevice::ResetPort( // delay is 50 ms for port reset as per USB 2.0 spec // Timeout.QuadPart = 50; - DPRINT1("Waiting %d milliseconds for port reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1047,7 +1047,7 @@ CUSBHardwareDevice::ClearPortStatus( // delay is 50 ms // Timeout.QuadPart = 50; - DPRINT1("Waiting %d milliseconds for port to recover after reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port to recover after reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1100,7 +1100,7 @@ CUSBHardwareDevice::ClearPortStatus( // delay is 100 ms // Timeout.QuadPart = 100; - DPRINT1("Waiting %d milliseconds for port to stabilize after connection\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port to stabilize after connection\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1180,7 +1180,7 @@ CUSBHardwareDevice::SetPortFeature( // delay is 20 ms // Timeout.QuadPart = 20; - DPRINT1("Waiting %d milliseconds for port power up\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port power up\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1394,7 +1394,7 @@ EhciDefferedRoutine( { if (PortStatus & EHCI_PRT_CONNECTED) { - DPRINT1("Device connected on port %d\n", i); + DPRINT1("Device connected on port %lu\n", i); if (This->m_Capabilities.HCSParams.CHCCount) { @@ -1418,7 +1418,7 @@ EhciDefferedRoutine( } else { - DPRINT1("Device disconnected on port %d\n", i); + DPRINT1("Device disconnected on port %lu\n", i); // // work to do diff --git a/reactos/drivers/usb/usbehci/usb_queue.cpp b/reactos/drivers/usb/usbehci/usb_queue.cpp index ba2a3f34be5..0d61ea52ca6 100644 --- a/reactos/drivers/usb/usbehci/usb_queue.cpp +++ b/reactos/drivers/usb/usbehci/usb_queue.cpp @@ -610,7 +610,7 @@ CUSBQueue::UnlinkQueueHeadChain( if (Entry == &HeadQueueHead->LinkedQueueHeads) { - DPRINT1("Warnnig; Only %d QueueHeads in HeadQueueHead\n", Index); + DPRINT1("Warnnig; Only %lu QueueHeads in HeadQueueHead\n", Index); Count = Index + 1; break; } @@ -684,7 +684,7 @@ CUSBQueue::QueueHeadInterruptCompletion( LastQueueHead->HorizontalLinkPointer = QueueHead->HorizontalLinkPointer; LastQueueHead->NextQueueHead = QueueHead->NextQueueHead; - DPRINT1("Periodic QueueHead %p Addr $x unlinked\n", QueueHead, QueueHead->PhysicalAddr); + DPRINT1("Periodic QueueHead %p Addr %x unlinked\n", QueueHead, QueueHead->PhysicalAddr); // insert into completed list InsertTailList(&m_CompletedRequestAsyncList, &QueueHead->LinkedQueueHeads); @@ -765,7 +765,7 @@ CUSBQueue::ProcessPeriodicSchedule( // IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead); - DPRINT("Request %p QueueHead %p Complete %d\n", Request, QueueHead, IsQueueHeadComplete); + DPRINT("Request %p QueueHead %p Complete %c\n", Request, QueueHead, IsQueueHeadComplete); // // check if queue head is complete @@ -841,7 +841,7 @@ CUSBQueue::ProcessAsyncList( // IsQueueHeadComplete = Request->IsQueueHeadComplete(QueueHead); - DPRINT("Request %p QueueHead %p Complete %d\n", Request, QueueHead, IsQueueHeadComplete); + DPRINT("Request %p QueueHead %p Complete %c\n", Request, QueueHead, IsQueueHeadComplete); // // check if queue head is complete From be5be6d4486ac3e0b64d1ef38c2fafd1679d5777 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 15:33:47 +0000 Subject: [PATCH 15/74] [USBOHCI] * Fix some format specifiers. svn path=/trunk/; revision=58543 --- reactos/drivers/usb/usbohci/hardware.cpp | 10 +++++----- reactos/drivers/usb/usbohci/usb_request.cpp | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/drivers/usb/usbohci/hardware.cpp b/reactos/drivers/usb/usbohci/hardware.cpp index b707ac5438c..87bf03e541b 100644 --- a/reactos/drivers/usb/usbohci/hardware.cpp +++ b/reactos/drivers/usb/usbohci/hardware.cpp @@ -553,7 +553,7 @@ retry: // delay is 100 ms // Timeout.QuadPart = WaitInMs; - DPRINT1("Waiting %d milliseconds for controller to transition state\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for controller to transition state\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1133,7 +1133,7 @@ CUSBHardwareDevice::ClearPortStatus( // delay is 100 ms // Timeout.QuadPart = 100; - DPRINT1("Waiting %d milliseconds for port to stabilize after connection\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port to stabilize after connection\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1204,7 +1204,7 @@ CUSBHardwareDevice::SetPortFeature( // delay is multiplied by 2 ms // Timeout.QuadPart *= 2; - DPRINT1("Waiting %d milliseconds for port power up\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port power up\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -1472,7 +1472,7 @@ OhciDefferedRoutine( // // device connected // - DPRINT1("New device arrival at Port %d LowSpeed %x\n", Index, (PortStatus & OHCI_RH_PORTSTATUS_LSDA)); + DPRINT1("New device arrival at Port %lu LowSpeed %x\n", Index, (PortStatus & OHCI_RH_PORTSTATUS_LSDA)); // // enable port @@ -1509,7 +1509,7 @@ OhciDefferedRoutine( // // This is a port reset complete interrupt // - DPRINT1("Port %d completed reset\n", Index); + DPRINT1("Port %lu completed reset\n", Index); // // Queue a work item diff --git a/reactos/drivers/usb/usbohci/usb_request.cpp b/reactos/drivers/usb/usbohci/usb_request.cpp index 3e1eeaf2a4c..ae5a53c05ca 100644 --- a/reactos/drivers/usb/usbohci/usb_request.cpp +++ b/reactos/drivers/usb/usbohci/usb_request.cpp @@ -1348,7 +1348,7 @@ CUSBRequest::DumpEndpointDescriptor( DPRINT1("EndpointDescriptor %p Addr %x\n", Descriptor, Descriptor->PhysicalAddress.LowPart); DPRINT1("EndpointDescriptor HeadPhysicalDescriptor %x HeadLogicalDescriptor %p\n", Descriptor->HeadPhysicalDescriptor, Descriptor->HeadLogicalDescriptor); DPRINT1("EndpointDescriptor TailPhysicalDescriptor %x\n", Descriptor->TailPhysicalDescriptor); - DPRINT1("EndpointDescriptor NextDescriptor %x\n", Descriptor->NextDescriptor); + DPRINT1("EndpointDescriptor NextDescriptor %p\n", Descriptor->NextDescriptor); DPRINT1("EndpointDescriptor NextPhysicalEndpoint %x\n", Descriptor->NextPhysicalEndpoint); DPRINT1("EndpointDescriptor Flags %x\n", Descriptor->Flags); @@ -1356,12 +1356,12 @@ CUSBRequest::DumpEndpointDescriptor( GeneralDescriptor = (POHCI_GENERAL_TD)Descriptor->HeadLogicalDescriptor; while(GeneralDescriptor) { - DPRINT1("Descriptor %d Address %p Addr %x\n", Count, GeneralDescriptor, GeneralDescriptor->PhysicalAddress); - DPRINT1("Descriptor %d BufferLogical %p BufferPhysical %x\n", Count, GeneralDescriptor->BufferLogical, GeneralDescriptor->BufferPhysical); - DPRINT1("Descriptor %d BufferSize %d\n", Count, GeneralDescriptor->BufferSize); - DPRINT1("Descriptor %d LastPhysicalByteAddress %x\n", Count, GeneralDescriptor->LastPhysicalByteAddress); - DPRINT1("Descriptor %d Flags %x\n", Count, GeneralDescriptor->Flags); - DPRINT1("Descriptor %d NextLogicalDescriptor %p NextPhysicalDescriptor %x\n", Count, GeneralDescriptor->NextLogicalDescriptor, GeneralDescriptor->NextPhysicalDescriptor); + DPRINT1("Descriptor %lu Address %p Addr %x\n", Count, GeneralDescriptor, GeneralDescriptor->PhysicalAddress); + DPRINT1("Descriptor %lu BufferLogical %p BufferPhysical %x\n", Count, GeneralDescriptor->BufferLogical, GeneralDescriptor->BufferPhysical); + DPRINT1("Descriptor %lu BufferSize %lu\n", Count, GeneralDescriptor->BufferSize); + DPRINT1("Descriptor %lu LastPhysicalByteAddress %x\n", Count, GeneralDescriptor->LastPhysicalByteAddress); + DPRINT1("Descriptor %lu Flags %x\n", Count, GeneralDescriptor->Flags); + DPRINT1("Descriptor %lu NextLogicalDescriptor %p NextPhysicalDescriptor %x\n", Count, GeneralDescriptor->NextLogicalDescriptor, GeneralDescriptor->NextPhysicalDescriptor); Count++; GeneralDescriptor = (POHCI_GENERAL_TD)GeneralDescriptor->NextLogicalDescriptor; From 8e49af3e1cdfba2657131868cc901684374f9a1e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 15:39:41 +0000 Subject: [PATCH 16/74] [USBUHCI] * Fix some format specifiers. svn path=/trunk/; revision=58544 --- reactos/drivers/usb/usbuhci/hardware.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/usb/usbuhci/hardware.cpp b/reactos/drivers/usb/usbuhci/hardware.cpp index fbfe446aff0..da33667a0d3 100644 --- a/reactos/drivers/usb/usbuhci/hardware.cpp +++ b/reactos/drivers/usb/usbuhci/hardware.cpp @@ -569,7 +569,7 @@ CUSBHardwareDevice::GlobalReset() // delay is 10 ms // Timeout.QuadPart = 10; - DPRINT1("Waiting %d milliseconds for global reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for global reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) @@ -723,7 +723,7 @@ CUSBHardwareDevice::InitializeController() } } - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 0, m_QueueHead[0], m_QueueHead[0]->LinkPhysical, @@ -731,7 +731,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[0]->PhysicalAddress, m_QueueHead[0]->Request, m_QueueHead[0]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 1, m_QueueHead[1], m_QueueHead[1]->LinkPhysical, @@ -740,7 +740,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[1]->Request, m_QueueHead[1]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 2, m_QueueHead[2], m_QueueHead[2]->LinkPhysical, @@ -748,7 +748,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[2]->PhysicalAddress, m_QueueHead[2]->Request, m_QueueHead[2]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 3, m_QueueHead[3], m_QueueHead[3]->LinkPhysical, @@ -756,7 +756,7 @@ CUSBHardwareDevice::InitializeController() m_QueueHead[3]->PhysicalAddress, m_QueueHead[3]->Request, m_QueueHead[3]->NextElementDescriptor); - DPRINT1("Index %lu QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %x NextElementDescriptor %x\n", + DPRINT1("Index %d QueueHead %p LinkPhysical %x ElementPhysical %x PhysicalAddress %x Request %p NextElementDescriptor %p\n", 4, m_QueueHead[4], m_QueueHead[4]->LinkPhysical, @@ -934,7 +934,7 @@ CUSBHardwareDevice::ResetPort( // delay is 20 ms for port reset // Timeout.QuadPart = 20; - DPRINT1("Waiting %d milliseconds for port reset\n", Timeout.LowPart); + DPRINT1("Waiting %lu milliseconds for port reset\n", Timeout.LowPart); // // convert to 100 ns units (absolute) From 8f17d7337611275c575c366cdc0a530ede17dc58 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sun, 17 Mar 2013 17:13:48 +0000 Subject: [PATCH 17/74] Fix typo. svn path=/trunk/; revision=58545 --- reactos/drivers/usb/usbehci/usb_queue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/usb/usbehci/usb_queue.cpp b/reactos/drivers/usb/usbehci/usb_queue.cpp index 0d61ea52ca6..8b501b699a4 100644 --- a/reactos/drivers/usb/usbehci/usb_queue.cpp +++ b/reactos/drivers/usb/usbehci/usb_queue.cpp @@ -610,7 +610,7 @@ CUSBQueue::UnlinkQueueHeadChain( if (Entry == &HeadQueueHead->LinkedQueueHeads) { - DPRINT1("Warnnig; Only %lu QueueHeads in HeadQueueHead\n", Index); + DPRINT1("Warning; Only %lu QueueHeads in HeadQueueHead\n", Index); Count = Index + 1; break; } From ce91cf897243f645e74251796416e5971a333c2e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Mar 2013 19:38:49 +0000 Subject: [PATCH 18/74] * Set the desktop icons' horizontal and vertical spacing values to 75 for compatibility with Windows. Spotted by Giannis Adamopoulos aka Smiley. CORE-7012 #resolve #comment Fixed in r58546. Thanks for reporting this ;) svn path=/trunk/; revision=58546 --- reactos/boot/bootdata/hivedef.inf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/boot/bootdata/hivedef.inf b/reactos/boot/bootdata/hivedef.inf index a44aed14023..72932b61c22 100644 --- a/reactos/boot/bootdata/hivedef.inf +++ b/reactos/boot/bootdata/hivedef.inf @@ -124,6 +124,8 @@ HKCU,"Control Panel\Desktop\WindowMetrics","MenuWidth",2,"18" HKCU,"Control Panel\Desktop\WindowMetrics","MenuHeight",2,"18" HKCU,"Control Panel\Desktop\WindowMetrics","BorderWidth",2,"1" HKCU,"Control Panel\Desktop\WindowMetrics","Shell Icon Size",2,"32" +HKCU,"Control Panel\Desktop\WindowMetrics","IconSpacing",2,"75" +HKCU,"Control Panel\Desktop\WindowMetrics","IconVerticalspacing",2,"75" HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ 00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ 00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ From 777fb8e63ab1297f88f979dc5069cae8a1a4f439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 17 Mar 2013 20:58:41 +0000 Subject: [PATCH 19/74] [RTL-NTDLL] Export (and declare) the existing function RtlFreeActivationContextStack. svn path=/trunk/; revision=58547 --- reactos/dll/ntdll/def/ntdll.spec | 4 ++-- reactos/include/ndk/rtlfuncs.h | 9 ++++++++- reactos/lib/rtl/actctx.c | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/reactos/dll/ntdll/def/ntdll.spec b/reactos/dll/ntdll/def/ntdll.spec index b9d3a3016aa..d212ecffc45 100644 --- a/reactos/dll/ntdll/def/ntdll.spec +++ b/reactos/dll/ntdll/def/ntdll.spec @@ -442,7 +442,7 @@ @ stdcall RtlAddVectoredExceptionHandler(long ptr) ;@ stdcall RtlAddressInSectionTable @ stdcall RtlAdjustPrivilege(long long long ptr) -@ stdcall RtlAllocateActivationContextStack(ptr) ; CHEKME +@ stdcall RtlAllocateActivationContextStack(ptr) ; CHECKME @ stdcall RtlAllocateAndInitializeSid(ptr long long long long long long long long long ptr) @ stdcall RtlAllocateHandle(ptr ptr) @ stdcall RtlAllocateHeap(ptr long ptr) @@ -635,7 +635,7 @@ @ stdcall RtlFormatCurrentUserKeyPath(ptr) @ stdcall RtlFormatMessage(ptr long long long long ptr ptr long) ;@ stdcall RtlFormatMessageEx -;@ stdcall RtlFreeActivationContextStack +@ stdcall RtlFreeActivationContextStack(ptr) @ stdcall RtlFreeAnsiString(long) @ stdcall RtlFreeHandle(ptr ptr) @ stdcall RtlFreeHeap(long long long) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 46e180e2669..cf2ee8541cc 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -3539,7 +3539,14 @@ RtlDeactivateActivationContext( NTSYSAPI VOID NTAPI -RtlFreeThreadActivationContextStack(void); +RtlFreeActivationContextStack( + _In_ PACTIVATION_CONTEXT_STACK Stack +); + +NTSYSAPI +VOID +NTAPI +RtlFreeThreadActivationContextStack(VOID); NTSYSAPI PRTL_ACTIVATION_CONTEXT_STACK_FRAME diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index e08034aa5be..bdd371e63df 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -2459,7 +2459,7 @@ RtlFreeActivationContextStack(PACTIVATION_CONTEXT_STACK Stack) } VOID -NTAPI RtlFreeThreadActivationContextStack(void) +NTAPI RtlFreeThreadActivationContextStack(VOID) { RtlFreeActivationContextStack(NtCurrentTeb()->ActivationContextStackPointer); NtCurrentTeb()->ActivationContextStackPointer = NULL; From b24c620ea33ebfb6f19447447ad7aed39c62a617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 17 Mar 2013 22:31:40 +0000 Subject: [PATCH 20/74] [NDK-RTL] The parameter of RtlAllocateActivationContextStack is of type PACTIVATION_CONTEXT_STACK*. svn path=/trunk/; revision=58548 --- reactos/dll/ntdll/ldr/ldrinit.c | 4 ++-- reactos/include/asm/genincdata.c | 4 ++-- reactos/include/ndk/rtlfuncs.h | 2 +- reactos/lib/rtl/actctx.c | 10 +++++----- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/dll/ntdll/ldr/ldrinit.c b/reactos/dll/ntdll/ldr/ldrinit.c index 8b6540242ac..5e222532ce6 100644 --- a/reactos/dll/ntdll/ldr/ldrinit.c +++ b/reactos/dll/ntdll/ldr/ldrinit.c @@ -508,7 +508,7 @@ LdrpInitializeThread(IN PCONTEXT Context) /* Allocate an Activation Context Stack */ DPRINT("ActivationContextStack %p\n", NtCurrentTeb()->ActivationContextStackPointer); - Status = RtlAllocateActivationContextStack((PVOID*)&NtCurrentTeb()->ActivationContextStackPointer); + Status = RtlAllocateActivationContextStack(&NtCurrentTeb()->ActivationContextStackPointer); if (!NT_SUCCESS(Status)) { DPRINT1("Warning: Unable to allocate ActivationContextStack\n"); @@ -1709,7 +1709,7 @@ LdrpInitializeProcess(IN PCONTEXT Context, } /* Allocate an Activation Context Stack */ - Status = RtlAllocateActivationContextStack((PVOID *)&Teb->ActivationContextStackPointer); + Status = RtlAllocateActivationContextStack(&Teb->ActivationContextStackPointer); if (!NT_SUCCESS(Status)) return Status; // FIXME: Loader private heap is missing diff --git a/reactos/include/asm/genincdata.c b/reactos/include/asm/genincdata.c index 2f55a40efd9..bfd99090104 100644 --- a/reactos/include/asm/genincdata.c +++ b/reactos/include/asm/genincdata.c @@ -31,14 +31,14 @@ typedef struct _FIBER /* Field offsets: */ { /* 32 bit 64 bit */ /* this must be the first field */ PVOID Parameter; /* 0x00 0x00 */ - struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList; /* 0x04 0x08 */ + PEXCEPTION_REGISTRATION_RECORD ExceptionList; /* 0x04 0x08 */ PVOID StackBase; /* 0x08 0x10 */ PVOID StackLimit; /* 0x0C 0x18 */ PVOID DeallocationStack; /* 0x10 0x20 */ CONTEXT Context; /* 0x14 0x28 */ ULONG GuaranteedStackBytes; /* 0x2E0 */ PVOID FlsData; /* 0x2E4 */ - PVOID ActivationContextStack; /* 0x2E8 */ + PVOID /* PACTIVATION_CONTEXT_STACK */ ActivationContextStack; /* 0x2E8 */ } FIBER, *PFIBER; typedef struct diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index cf2ee8541cc..ac709780f02 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -3503,7 +3503,7 @@ NTSYSAPI NTSTATUS NTAPI RtlAllocateActivationContextStack( - _In_ PVOID *Context + _In_ PACTIVATION_CONTEXT_STACK *Stack ); NTSYSAPI diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index bdd371e63df..8c696f893c2 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -2429,7 +2429,7 @@ RtlDeactivateActivationContext( ULONG flags, ULONG_PTR cookie ) VOID NTAPI -RtlFreeActivationContextStack(PACTIVATION_CONTEXT_STACK Stack) +RtlFreeActivationContextStack(IN PACTIVATION_CONTEXT_STACK Stack) { PRTL_ACTIVATION_CONTEXT_STACK_FRAME ActiveFrame, PrevFrame; @@ -2775,15 +2775,15 @@ RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG sect NTSTATUS NTAPI -RtlAllocateActivationContextStack(IN PVOID *Context) +RtlAllocateActivationContextStack(IN PACTIVATION_CONTEXT_STACK *Stack) { PACTIVATION_CONTEXT_STACK ContextStack; /* Check if it's already allocated */ - if (*Context) return STATUS_SUCCESS; + if (*Stack) return STATUS_SUCCESS; /* Allocate space for the context stack */ - ContextStack = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (ACTIVATION_CONTEXT_STACK) ); + ContextStack = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ACTIVATION_CONTEXT_STACK)); if (!ContextStack) { return STATUS_NO_MEMORY; @@ -2796,7 +2796,7 @@ RtlAllocateActivationContextStack(IN PVOID *Context) ContextStack->NextCookieSequenceNumber = 1; ContextStack->StackId = 1; //TODO: Timer-based - *Context = ContextStack; + *Stack = ContextStack; return STATUS_SUCCESS; } From b0ef5a574c19ff8b02cc7b380bf981e59117ab42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 17 Mar 2013 22:50:51 +0000 Subject: [PATCH 21/74] [KERNEL32] - We can now free the fiber activation context stack since RtlFreeActivationContextStack is implemented. - Free the thread activation context stack if we fail at creating a remote thread. svn path=/trunk/; revision=58549 --- reactos/dll/win32/kernel32/client/fiber.c | 24 ++++++++++------------ reactos/dll/win32/kernel32/client/thread.c | 17 +++++++++++---- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/fiber.c b/reactos/dll/win32/kernel32/client/fiber.c index 338c9b7f9e5..2f7b901d50d 100644 --- a/reactos/dll/win32/kernel32/client/fiber.c +++ b/reactos/dll/win32/kernel32/client/fiber.c @@ -15,15 +15,15 @@ typedef struct _FIBER /* Field offsets: */ { /* 32 bit 64 bit */ /* this must be the first field */ - LPVOID Parameter; /* 0x00 0x00 */ - struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList; /* 0x04 0x08 */ - LPVOID StackBase; /* 0x08 0x10 */ - LPVOID StackLimit; /* 0x0C 0x18 */ - LPVOID DeallocationStack; /* 0x10 0x20 */ + PVOID Parameter; /* 0x00 0x00 */ + PEXCEPTION_REGISTRATION_RECORD ExceptionList; /* 0x04 0x08 */ + PVOID StackBase; /* 0x08 0x10 */ + PVOID StackLimit; /* 0x0C 0x18 */ + PVOID DeallocationStack; /* 0x10 0x20 */ CONTEXT Context; /* 0x14 0x28 */ ULONG GuaranteedStackBytes; /* 0x2E0 */ PVOID FlsData; /* 0x2E4 */ - PVOID ActivationContextStack; /* 0x2E8 */ + PACTIVATION_CONTEXT_STACK ActivationContextStack; /* 0x2E8 */ } FIBER, *PFIBER; /* PRIVATE FUNCTIONS **********************************************************/ @@ -171,7 +171,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize, PFIBER Fiber; NTSTATUS Status; INITIAL_TEB InitialTeb; - PVOID ActivationContextStack = NULL; + PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL; DPRINT("Creating Fiber\n"); /* Check for invalid flags */ @@ -210,9 +210,8 @@ CreateFiberEx(SIZE_T dwStackCommitSize, /* Free the fiber */ RtlFreeHeap(GetProcessHeap(), 0, Fiber); - /* Free the activation context */ - DPRINT1("Leaking activation stack because nobody implemented free"); - //RtlFreeActivationContextStack(&ActivationContextStack); + /* Free the activation context stack */ + RtlFreeActivationContextStack(ActivationContextStack); /* Failure */ BaseSetLastNTError(Status); @@ -271,9 +270,8 @@ DeleteFiber(LPVOID lpFiber) /* Get rid of FLS */ if (Fiber->FlsData) BaseRundownFls(Fiber->FlsData); - /* Get rid of the activation stack */ - DPRINT1("Leaking activation stack because nobody implemented free"); - //RtlFreeActivationContextStack(Fiber->ActivationContextStack); + /* Get rid of the activation context stack */ + RtlFreeActivationContextStack(Fiber->ActivationContextStack); /* Free the fiber data */ RtlFreeHeap(GetProcessHeap(), 0, lpFiber); diff --git a/reactos/dll/win32/kernel32/client/thread.c b/reactos/dll/win32/kernel32/client/thread.c index 56da4337949..504c0356b2b 100644 --- a/reactos/dll/win32/kernel32/client/thread.c +++ b/reactos/dll/win32/kernel32/client/thread.c @@ -171,7 +171,7 @@ CreateRemoteThread(IN HANDLE hProcess, ULONG Dummy; PTEB Teb; THREAD_BASIC_INFORMATION ThreadBasicInfo; - PVOID ActivationContextStack = NULL; + PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL; ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo; ULONG_PTR Cookie; ULONG ReturnLength; @@ -191,7 +191,7 @@ CreateRemoteThread(IN HANDLE hProcess, dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION ? dwStackSize : 0, &InitialTeb); - if(!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { BaseSetLastNTError(Status); return NULL; @@ -260,7 +260,7 @@ CreateRemoteThread(IN HANDLE hProcess, Teb->ActivationContextStackPointer = ActivationContextStack; /* Query the Context */ - // WARNING!!! THIS IS USING THE WIN32 FLAG BECAUSE REACTOS CONTINUES TO BE A POS!!! /// + // WARNING!!! THIS IS USING THE WIN32 FLAG BECAUSE REACTOS CONTINUES TO BE A POS!!! /// Status = RtlQueryInformationActivationContext(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX, NULL, 0, @@ -274,6 +274,11 @@ CreateRemoteThread(IN HANDLE hProcess, ERROR_DBGBREAK("SXS: %s - Failing thread create because " "RtlQueryInformationActivationContext() failed with status %08lx\n", __FUNCTION__, Status); + + /* Free the activation context stack */ + // RtlFreeThreadActivationContextStack(); + RtlFreeActivationContextStack(Teb->ActivationContextStackPointer); + return NULL; } @@ -291,6 +296,11 @@ CreateRemoteThread(IN HANDLE hProcess, ERROR_DBGBREAK("SXS: %s - Failing thread create because " "RtlActivateActivationContextEx() failed with status %08lx\n", __FUNCTION__, Status); + + /* Free the activation context stack */ + // RtlFreeThreadActivationContextStack(); + RtlFreeActivationContextStack(Teb->ActivationContextStackPointer); + return NULL; } } @@ -299,7 +309,6 @@ CreateRemoteThread(IN HANDLE hProcess, /* Notify CSR */ if (!BaseRunningInServerProcess) { - /* Notify CSR */ Status = BasepNotifyCsrOfThread(hThread, &ClientId); ASSERT(NT_SUCCESS(Status)); } From 040316d9fc0534b2e4b8715a53827422f633fe52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 17 Mar 2013 22:56:49 +0000 Subject: [PATCH 22/74] [KERNEL32] Fix a memory leak svn path=/trunk/; revision=58550 --- reactos/dll/win32/kernel32/client/fiber.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/dll/win32/kernel32/client/fiber.c b/reactos/dll/win32/kernel32/client/fiber.c index 2f7b901d50d..22ece1be4e6 100644 --- a/reactos/dll/win32/kernel32/client/fiber.c +++ b/reactos/dll/win32/kernel32/client/fiber.c @@ -195,6 +195,9 @@ CreateFiberEx(SIZE_T dwStackCommitSize, Fiber = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(FIBER)); if (!Fiber) { + /* Free the activation context stack */ + RtlFreeActivationContextStack(ActivationContextStack); + /* Fail */ SetLastError(ERROR_NOT_ENOUGH_MEMORY); return NULL; From 6d47681d32eda4bc9314578d01b89513234c8348 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 18 Mar 2013 15:12:30 +0000 Subject: [PATCH 23/74] [SAMSRV] Implement SamrQueryInformationUser.UserAllInformation. svn path=/trunk/; revision=58551 --- reactos/dll/win32/samsrv/samrpc.c | 256 +++++++++++++++++++++++++++++- 1 file changed, 255 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/samsrv/samrpc.c b/reactos/dll/win32/samsrv/samrpc.c index 24892e596aa..2471f01b69c 100644 --- a/reactos/dll/win32/samsrv/samrpc.c +++ b/reactos/dll/win32/samsrv/samrpc.c @@ -6179,6 +6179,255 @@ done: } +static NTSTATUS +SampQueryUserAll(PSAM_DB_OBJECT UserObject, + PSAMPR_USER_INFO_BUFFER *Buffer) +{ + PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL; + SAM_USER_FIXED_DATA FixedData; + ULONG Length = 0; + NTSTATUS Status; + + *Buffer = NULL; + + InfoBuffer = midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER)); + if (InfoBuffer == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + Length = sizeof(SAM_USER_FIXED_DATA); + Status = SampGetObjectAttribute(UserObject, + L"F", + NULL, + (PVOID)&FixedData, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + if (UserObject->Access & USER_READ_GENERAL) + { + /* Get the Name string */ + Status = SampGetObjectAttributeString(UserObject, + L"Name", + &InfoBuffer->All.UserName); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the FullName string */ + Status = SampGetObjectAttributeString(UserObject, + L"FullName", + &InfoBuffer->All.FullName); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the user ID*/ + InfoBuffer->All.UserId = FixedData.UserId; + + /* Get the primary group ID */ + InfoBuffer->All.PrimaryGroupId = FixedData.PrimaryGroupId; + + /* Get the AdminComment string */ + Status = SampGetObjectAttributeString(UserObject, + L"AdminComment", + &InfoBuffer->All.AdminComment); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the UserComment string */ + Status = SampGetObjectAttributeString(UserObject, + L"UserComment", + &InfoBuffer->All.UserComment); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + InfoBuffer->All.WhichFields |= USER_ALL_READ_GENERAL_MASK; +// USER_ALL_USERNAME | +// USER_ALL_FULLNAME | +// USER_ALL_USERID | +// USER_ALL_PRIMARYGROUPID | +// USER_ALL_ADMINCOMMENT | +// USER_ALL_USERCOMMENT; + } + + if (UserObject->Access & USER_READ_LOGON) + { + /* Get the HomeDirectory string */ + Status = SampGetObjectAttributeString(UserObject, + L"HomeDirectory", + &InfoBuffer->All.HomeDirectory); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the HomeDirectoryDrive string */ + Status = SampGetObjectAttributeString(UserObject, + L"HomeDirectoryDrive", + &InfoBuffer->Home.HomeDirectoryDrive); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the ScriptPath string */ + Status = SampGetObjectAttributeString(UserObject, + L"ScriptPath", + &InfoBuffer->All.ScriptPath); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the ProfilePath string */ + Status = SampGetObjectAttributeString(UserObject, + L"ProfilePath", + &InfoBuffer->All.ProfilePath); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + /* Get the WorkStations string */ + Status = SampGetObjectAttributeString(UserObject, + L"WorkStations", + &InfoBuffer->All.WorkStations); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + InfoBuffer->All.LastLogon.LowPart = FixedData.LastLogon.LowPart; + InfoBuffer->All.LastLogon.HighPart = FixedData.LastLogon.HighPart; + + InfoBuffer->All.LastLogoff.LowPart = FixedData.LastLogoff.LowPart; + InfoBuffer->All.LastLogoff.HighPart = FixedData.LastLogoff.HighPart; + +// USER_ALL_LOGONHOURS + + InfoBuffer->All.BadPasswordCount = FixedData.BadPasswordCount; + + InfoBuffer->All.LogonCount = FixedData.LogonCount; + +// USER_ALL_PASSWORDCANCHANGE +// USER_ALL_PASSWORDMUSTCHANGE + + InfoBuffer->All. WhichFields |= /* USER_ALL_READ_LOGON_MASK; */ + USER_ALL_HOMEDIRECTORY | + USER_ALL_HOMEDIRECTORYDRIVE | + USER_ALL_SCRIPTPATH | + USER_ALL_PROFILEPATH | + USER_ALL_WORKSTATIONS | + USER_ALL_LASTLOGON | + USER_ALL_LASTLOGOFF | +// USER_ALL_LOGONHOURS | + USER_ALL_BADPASSWORDCOUNT | + USER_ALL_LOGONCOUNT; +// USER_ALL_PASSWORDCANCHANGE | +// USER_ALL_PASSWORDMUSTCHANGE; + } + + if (UserObject->Access & USER_READ_ACCOUNT) + { + InfoBuffer->All.PasswordLastSet.LowPart = FixedData.PasswordLastSet.LowPart; + InfoBuffer->All.PasswordLastSet.HighPart = FixedData.PasswordLastSet.HighPart; + + InfoBuffer->All.AccountExpires.LowPart = FixedData.AccountExpires.LowPart; + InfoBuffer->All.AccountExpires.HighPart = FixedData.AccountExpires.HighPart; + + InfoBuffer->All.UserAccountControl = FixedData.UserAccountControl; + + /* Get the Parameters string */ + Status = SampGetObjectAttributeString(UserObject, + L"Parameters", + &InfoBuffer->All.Parameters); + if (!NT_SUCCESS(Status)) + { + TRACE("Status 0x%08lx\n", Status); + goto done; + } + + InfoBuffer->All. WhichFields |= USER_ALL_READ_ACCOUNT_MASK; +// USER_ALL_PASSWORDLASTSET | +// USER_ALL_ACCOUNTEXPIRES | +// USER_ALL_USERACCOUNTCONTROL | +// USER_ALL_PARAMETERS; + } + + if (UserObject->Access & USER_READ_PREFERENCES) + { + InfoBuffer->All.CountryCode = FixedData.CountryCode; + + InfoBuffer->All.CodePage = FixedData.CodePage; + + InfoBuffer->All. WhichFields |= USER_ALL_READ_PREFERENCES_MASK; +// USER_ALL_COUNTRYCODE | +// USER_ALL_CODEPAGE; + } + + *Buffer = InfoBuffer; + +done: + if (!NT_SUCCESS(Status)) + { + if (InfoBuffer != NULL) + { + if (InfoBuffer->All.UserName.Buffer != NULL) + midl_user_free(InfoBuffer->All.UserName.Buffer); + + if (InfoBuffer->All.FullName.Buffer != NULL) + midl_user_free(InfoBuffer->All.FullName.Buffer); + + if (InfoBuffer->All.AdminComment.Buffer != NULL) + midl_user_free(InfoBuffer->All.AdminComment.Buffer); + + if (InfoBuffer->All.UserComment.Buffer != NULL) + midl_user_free(InfoBuffer->All.UserComment.Buffer); + + if (InfoBuffer->All.HomeDirectory.Buffer != NULL) + midl_user_free(InfoBuffer->All.HomeDirectory.Buffer); + + if (InfoBuffer->All.HomeDirectoryDrive.Buffer != NULL) + midl_user_free(InfoBuffer->All.HomeDirectoryDrive.Buffer); + + if (InfoBuffer->All.ScriptPath.Buffer != NULL) + midl_user_free(InfoBuffer->All.ScriptPath.Buffer); + + if (InfoBuffer->All.ProfilePath.Buffer != NULL) + midl_user_free(InfoBuffer->All.ProfilePath.Buffer); + + if (InfoBuffer->All.WorkStations.Buffer != NULL) + midl_user_free(InfoBuffer->All.WorkStations.Buffer); + + if (InfoBuffer->All.LogonHours.LogonHours != NULL) + midl_user_free(InfoBuffer->All.LogonHours.LogonHours); + + if (InfoBuffer->All.Parameters.Buffer != NULL) + midl_user_free(InfoBuffer->All.Parameters.Buffer); + + midl_user_free(InfoBuffer); + } + } + + return Status; +} + + /* Function 36 */ NTSTATUS NTAPI @@ -6232,6 +6481,7 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle, break; case UserInternal1Information: + case UserAllInformation: DesiredAccess = 0; break; @@ -6341,7 +6591,11 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle, Buffer); break; -// case UserAllInformation: + case UserAllInformation: + Status = SampQueryUserAll(UserObject, + Buffer); + break; + // case UserInternal4Information: // case UserInternal5Information: // case UserInternal4InformationNew: From 392f0d06bf878e8afecb321f353fa6b717c5392b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 18 Mar 2013 15:16:10 +0000 Subject: [PATCH 24/74] [SAMSRV] - Add missing flags for SamrQueryInformationUser.UserAllInformation. svn path=/trunk/; revision=58552 --- reactos/include/ddk/ntsam.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reactos/include/ddk/ntsam.h b/reactos/include/ddk/ntsam.h index 16883866db6..79e4f84fdcc 100644 --- a/reactos/include/ddk/ntsam.h +++ b/reactos/include/ddk/ntsam.h @@ -225,6 +225,19 @@ extern "C" { #define USER_ALL_OWFPASSWORD 0x20000000 #define USER_ALL_UNDEFINED_MASK 0xC0000000 +#define USER_ALL_READ_GENERAL_MASK 0x0000003F +#define USER_ALL_READ_LOGON_MASK 0x0003FFC0 +#define USER_ALL_READ_ACCOUNT_MASK 0x003C0000 +#define USER_ALL_READ_PREFERENCES_MASK 0x00C00000 +#define USER_ALL_READ_TRUSTED_MASK 0x1F000000 +#define USER_ALL_READ_CANT_MASK 0xC0000000 + +#define USER_ALL_WRITE_ACCOUNT_MASK 0x003827DB +#define USER_ALL_WRITE_PREFERENCES_MASK 0x00C00020 +#define USER_ALL_WRITE_FORCE_PASSWORD_CHANGE_MASK 0x0B000000 +#define USER_ALL_WRITE_TRUSTED_MASK 0x1404D800 +#define USER_ALL_WRITE_CANT_MASK 0xC0030004 + /* Values used by USER_PWD_CHANGE_FAILURE_INFORMATION.ExtendedFailureReason */ #define SAM_PWD_CHANGE_NO_ERROR 0 #define SAM_PWD_CHANGE_PASSWORD_TOO_SHORT 1 From b87a8c0e69ba1297ac8e190a43b5df3db3d3b119 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 18 Mar 2013 21:23:35 +0000 Subject: [PATCH 25/74] [CMD] - Victor Martinez: ECHO command should write CRLF. Fixes regressions in several apps that depend on console output. CORE-6916 #resolve #comment Committed in r58553. svn path=/trunk/; revision=58553 --- reactos/base/shell/cmd/echo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/shell/cmd/echo.c b/reactos/base/shell/cmd/echo.c index 272dba95995..5cf90fd1ce0 100644 --- a/reactos/base/shell/cmd/echo.c +++ b/reactos/base/shell/cmd/echo.c @@ -83,7 +83,7 @@ INT CommandEcho (LPTSTR param) { /* skip the first character */ ConOutPuts(param + 1); - ConOutPuts(_T("\n")); + ConOutPuts(_T("\r\n")); } return 0; } From eb4a8b88185df44b89f689b64139a46807ee0676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Tue, 19 Mar 2013 01:28:50 +0000 Subject: [PATCH 26/74] [WIN32SS] "Internal Message!" : this is just an informative message, not an error. svn path=/trunk/; revision=58554 --- reactos/win32ss/user/ntuser/message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/win32ss/user/ntuser/message.c b/reactos/win32ss/user/ntuser/message.c index ba4fd3a26f0..1f689c002d0 100644 --- a/reactos/win32ss/user/ntuser/message.c +++ b/reactos/win32ss/user/ntuser/message.c @@ -1557,7 +1557,7 @@ co_IntSendMessageWithCallBack( HWND hWnd, { if (Win32Thread->TIF_flags & TIF_INCLEANUP) RETURN( FALSE); - ERR("SMWCB: Internal Message!\n"); + TRACE("SMWCB: Internal Message!\n"); Result = (ULONG_PTR)handle_internal_message( Window, Msg, wParam, lParam ); if (uResult) *uResult = Result; RETURN( TRUE); From 56fc5e23cca1824d7f34757a3d45b3e2049ee30d Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 20 Mar 2013 14:28:34 +0000 Subject: [PATCH 27/74] [TRANSLATION] Remove extra space characters produced by replacing backslash with space for Shift_JIS backslash problem. Patch by me, reviewed by Katayama Hirofumi MZ. Fixes bug CORE-6990. svn path=/trunk/; revision=58558 --- reactos/base/applications/cacls/lang/ja-JP.rc | 2 +- .../games/solitaire/lang/ja-JP.rc | 8 +- .../applications/games/spider/lang/ja-JP.rc | 2 +- .../base/applications/logoff/lang/ja-JP.rc | 4 +- .../mscutils/devmgmt/lang/ja-JP.rc | 12 +-- .../mscutils/eventvwr/lang/ja-JP.rc | 6 +- .../mscutils/servman/lang/ja-JP.rc | 20 ++-- .../base/applications/mspaint/lang/ja-JP.rc | 18 ++-- reactos/base/applications/mstsc/lang/ja-JP.rc | 6 +- .../base/applications/notepad/lang/ja-JP.rc | 4 +- .../base/applications/regedit/lang/ja-JP.rc | 2 +- .../base/applications/sndvol32/lang/ja-JP.rc | 2 +- .../base/applications/taskmgr/lang/ja-JP.rc | 96 +++++++++---------- reactos/base/system/regsvr32/lang/ja-JP.rc | 8 +- reactos/dll/cpl/access/lang/ja-JP.rc | 24 ++--- reactos/dll/cpl/sysdm/lang/ja-JP.rc | 14 +-- reactos/dll/cpl/telephon/lang/ja-JP.rc | 2 +- reactos/dll/win32/netcfgx/lang/ja-JP.rc | 2 +- reactos/dll/win32/netid/lang/ja-JP.rc | 2 +- reactos/dll/win32/newdev/lang/ja-JP.rc | 6 +- reactos/dll/win32/syssetup/lang/ja-JP.rc | 22 ++--- 21 files changed, 131 insertions(+), 131 deletions(-) diff --git a/reactos/base/applications/cacls/lang/ja-JP.rc b/reactos/base/applications/cacls/lang/ja-JP.rc index 868f05df891..edc48166f0b 100644 --- a/reactos/base/applications/cacls/lang/ja-JP.rc +++ b/reactos/base/applications/cacls/lang/ja-JP.rc @@ -3,7 +3,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN -IDS_HELP, "ファイルã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãƒªã‚¹ãƒˆ(ACL) を表 示ã¾ãŸã¯å¤‰æ›´ã—ã¾ã™ã€‚n\n\ +IDS_HELP, "ファイルã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãƒªã‚¹ãƒˆ(ACL) を表示ã¾ãŸã¯å¤‰æ›´ã—ã¾ã™ã€‚\n\n\ CACLS ファイルå [/T] [/E] [/C] [/G ユーザーå:アクセス権]\n\ [/R ユーザーå [...]] [/P ユーザーå:アクセス権 [...]]\n\ [/D ユーザーå [...]]\n\ diff --git a/reactos/base/applications/games/solitaire/lang/ja-JP.rc b/reactos/base/applications/games/solitaire/lang/ja-JP.rc index d54843a60a9..3dce23a7492 100644 --- a/reactos/base/applications/games/solitaire/lang/ja-JP.rc +++ b/reactos/base/applications/games/solitaire/lang/ja-JP.rc @@ -19,8 +19,8 @@ BEGIN AUTORADIOBUTTON "1 æžšãšã¤å–ã‚‹(&O)", IDC_OPT_DRAWONE, 14, 19, 70, 10, WS_GROUP | WS_TABSTOP AUTORADIOBUTTON "3 æžšãšã¤å–ã‚‹(&T)", IDC_OPT_DRAWTHREE, 14, 32, 70, 10 - AUTOCHECKBOX "時間を表 示ã™ã‚‹(&S)", IDC_OPT_SHOWTIME, 7 ,51 ,65 ,10, WS_TABSTOP | WS_DISABLED - AUTOCHECKBOX "ステータスãƒãƒ¼ã‚’表 示ã™ã‚‹(&T)", IDC_OPT_STATUSBAR, 7, 66, 64, 10, WS_TABSTOP + AUTOCHECKBOX "時間を表示ã™ã‚‹(&S)", IDC_OPT_SHOWTIME, 7 ,51 ,65 ,10, WS_TABSTOP | WS_DISABLED + AUTOCHECKBOX "ステータスãƒãƒ¼ã‚’表示ã™ã‚‹(&T)", IDC_OPT_STATUSBAR, 7, 66, 64, 10, WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 35, 97, 50, 14 PUSHBUTTON "キャンセル", IDCANCEL, 101, 97, 50, 14 @@ -53,8 +53,8 @@ END STRINGTABLE BEGIN - IDS_SOL_NAME "ソ リティア" - IDS_SOL_ABOUT "J Brown ã«ã‚ˆã‚‹ã‚½ リティア\n\nCardLib ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.0。" + IDS_SOL_NAME "ソリティア" + IDS_SOL_ABOUT "J Brown ã«ã‚ˆã‚‹ã‚½ãƒªãƒ†ã‚£ã‚¢\n\nCardLib ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.0。" IDS_SOL_QUIT "ç¾åœ¨ã®ã‚²ãƒ¼ãƒ ã‚’終了ã—ã¾ã™ã‹?" IDS_SOL_WIN "ãŠã‚ã§ã¨ã†ã€ã‚ãªãŸã®å‹ã¡ã§ã™!" IDS_SOL_DEAL "ã‚‚ã†ä¸€åº¦ã‚«ãƒ¼ãƒ‰ã‚’é…りã¾ã™ã‹?" diff --git a/reactos/base/applications/games/spider/lang/ja-JP.rc b/reactos/base/applications/games/spider/lang/ja-JP.rc index 882bcc3c26f..8a52a17d6e6 100644 --- a/reactos/base/applications/games/spider/lang/ja-JP.rc +++ b/reactos/base/applications/games/spider/lang/ja-JP.rc @@ -49,7 +49,7 @@ END STRINGTABLE BEGIN IDS_SPI_NAME "スパイダ" - IDS_SPI_ABOUT "Gregor Schneider ã«ã‚ˆã‚‹ã‚¹ãƒ‘イダ ソ リティア\n\nCardLib ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.0" + IDS_SPI_ABOUT "Gregor Schneider ã«ã‚ˆã‚‹ã‚¹ãƒ‘イダ ソリティア\n\nCardLib ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.0" IDS_SPI_QUIT "ç¾åœ¨ã®ã‚²ãƒ¼ãƒ ã‚’終了ã—ã¾ã™ã‹?" IDS_SPI_WIN "ãŠã‚ã§ã¨ã†ã€ã‚ãªãŸã®å‹ã¡ã§ã™!" IDS_SPI_DEAL "ã‚‚ã†ä¸€åº¦ã‚«ãƒ¼ãƒ‰ã‚’é…りã¾ã™ã‹?" diff --git a/reactos/base/applications/logoff/lang/ja-JP.rc b/reactos/base/applications/logoff/lang/ja-JP.rc index 945d0572c27..28e99e0d683 100644 --- a/reactos/base/applications/logoff/lang/ja-JP.rc +++ b/reactos/base/applications/logoff/lang/ja-JP.rc @@ -4,8 +4,8 @@ STRINGTABLE DISCARDABLE BEGIN IDS_USAGE, "セッションを終了ã—ã¾ã™ã€‚\n\n\ - /v\t\t実行中ã«è©³ç´°æƒ…報を表 示ã—ã¾ã™ã€‚\n\ - /?\t\tã“ã®æƒ…報を表 示ã—ã¾ã™ã€‚\n\n" + /v\t\t実行中ã«è©³ç´°æƒ…報を表示ã—ã¾ã™ã€‚\n\ + /?\t\tã“ã®æƒ…報を表示ã—ã¾ã™ã€‚\n\n" IDS_LOGOFF_REMOTE, "リモート マシンã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’終了ã—ã¦ã„ã¾ã™ã€‚" IDS_LOGOFF_LOCAL, "ã“ã®ãƒžã‚·ãƒ³ã®ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’終了ã—ã¦ã„ã¾ã™ã€‚" diff --git a/reactos/base/applications/mscutils/devmgmt/lang/ja-JP.rc b/reactos/base/applications/mscutils/devmgmt/lang/ja-JP.rc index 77c2c389acf..213a8205a0e 100644 --- a/reactos/base/applications/mscutils/devmgmt/lang/ja-JP.rc +++ b/reactos/base/applications/mscutils/devmgmt/lang/ja-JP.rc @@ -1,4 +1,4 @@ -LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT IDR_MAINMENU MENU BEGIN @@ -14,12 +14,12 @@ BEGIN MENUITEM SEPARATOR MENUITEM "ヘルプ", IDC_PROGHELP, GRAYED END - POPUP "表 示" + POPUP "表示" BEGIN MENUITEM "デãƒã‚¤ã‚¹ (種類別)", IDC_DEVBYTYPE MENUITEM "デãƒã‚¤ã‚¹ (接続別)", IDC_DEVBYCONN - MENUITEM "リソ ース (種類別)", IDC_RESBYTYPE, GRAYED - MENUITEM "リソ ース (接続別)", IDC_RESBYCONN, GRAYED + MENUITEM "リソース (種類別)", IDC_RESBYTYPE, GRAYED + MENUITEM "リソース (接続別)", IDC_RESBYCONN, GRAYED MENUITEM SEPARATOR MENUITEM "Show hidden devices", IDC_SHOWHIDDEN END @@ -72,8 +72,8 @@ BEGIN IDS_HINT_EXIT " ã“ã®ãƒ—ログラムを終了ã—ã¾ã™ã€‚" IDS_HINT_REFRESH " サービスã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°ã—ã¾ã™ã€‚" IDS_HINT_PROP " ç¾åœ¨é¸æŠžã•れã¦ã„るシートã®ãƒ—ロパティを開ãã¾ã™ã€‚" - IDS_HINT_HELP " ヘルプ ウィンドウを表 示ã—ã¾ã™ã€‚" - IDS_HINT_ABOUT " ReactOS デãƒã‚¤ã‚¹ マãƒãƒ¼ã‚¸ãƒ£ã«ã¤ã„ã¦è¡¨ 示ã—ã¾ã™ã€‚" + IDS_HINT_HELP " ヘルプ ウィンドウを表示ã—ã¾ã™ã€‚" + IDS_HINT_ABOUT " ReactOS デãƒã‚¤ã‚¹ マãƒãƒ¼ã‚¸ãƒ£ã«ã¤ã„ã¦è¡¨ç¤ºã—ã¾ã™ã€‚" IDS_HINT_SYS_RESTORE " ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’通常ã®å¤§ãã•ã«å¾©å…ƒã—ã¾ã™ã€‚" IDS_HINT_SYS_MOVE " ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’移動ã—ã¾ã™ã€‚" diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc index 66d123d0f5b..88f0588c53a 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc @@ -18,7 +18,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "終了(&X)", IDM_EXIT END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "æ›´æ–°(&R)", IDM_REFRESH END @@ -78,7 +78,7 @@ BEGIN LTEXT "Static",IDC_EVENTCOMPUTERSTATIC,56,54,72,8 LTEXT "イベントID:",IDC_STATIC,133,15,36,8 LTEXT "Static",IDC_EVENTIDSTATIC,175,15,87,8 - LTEXT "ソ ース:",IDC_STATIC,133,28,36,8 + LTEXT "ソース:",IDC_STATIC,133,28,36,8 LTEXT "Static",IDC_EVENTSOURCESTATIC,175,28,87,8 LTEXT "種類:",IDC_STATIC,133,42,36,8 LTEXT "Static",IDC_EVENTTYPESTATIC,175,42,87,8 @@ -93,7 +93,7 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "イベント ビューア" - IDS_EVENTSTRINGIDNOTFOUND "イベント ID (%lu) (ソ ース %s 内) ã«é–¢ã™ã‚‹èª¬æ˜ŽãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ リモート コンピュータã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表 示ã™ã‚‹ãŸã‚ã«å¿…è¦ãªãƒ¬ã‚¸ã‚¹ãƒˆãƒªæƒ…å ±ã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ DLL ファイルãŒãƒ­ãƒ¼ã‚«ãƒ« コンピュータã«ãªã„å¯èƒ½ 性ãŒã‚りã¾ã™ã€‚" + IDS_EVENTSTRINGIDNOTFOUND "イベント ID (%lu) (ソース %s 内) ã«é–¢ã™ã‚‹èª¬æ˜ŽãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ リモート コンピュータã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ãŸã‚ã«å¿…è¦ãªãƒ¬ã‚¸ã‚¹ãƒˆãƒªæƒ…å ±ã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ DLL ファイルãŒãƒ­ãƒ¼ã‚«ãƒ« コンピュータã«ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" IDS_EVENTLOG_ERROR_TYPE "エラー" IDS_EVENTLOG_WARNING_TYPE "警告" IDS_EVENTLOG_INFORMATION_TYPE "情報" diff --git a/reactos/base/applications/mscutils/servman/lang/ja-JP.rc b/reactos/base/applications/mscutils/servman/lang/ja-JP.rc index c749d90a176..d035e73fda6 100644 --- a/reactos/base/applications/mscutils/servman/lang/ja-JP.rc +++ b/reactos/base/applications/mscutils/servman/lang/ja-JP.rc @@ -26,7 +26,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "プロパティ...", ID_PROP, GRAYED END - POPUP "表 示" + POPUP "表示" BEGIN MENUITEM "大ãã„アイコン", ID_VIEW_LARGE MENUITEM "å°ã•ã„アイコン", ID_VIEW_SMALL @@ -89,7 +89,7 @@ BEGIN PUSHBUTTON "ä¸€æ™‚åœæ­¢", IDC_PAUSE , 130, 155, 54, 15, WS_DISABLED PUSHBUTTON "å†é–‹", IDC_RESUME, 192, 155, 54, 15, WS_DISABLED LTEXT "サービスå:", IDC_STATIC, 4, 11, 53, 11 - LTEXT "表 示å:", IDC_STATIC, 4, 29, 53, 11 + LTEXT "表示å:", IDC_STATIC, 4, 29, 53, 11 LTEXT "説明:", IDC_STATIC, 4, 51, 53, 11 LTEXT "実行ファイルã®ãƒ‘ス:", IDC_STATIC, 6, 73, 82, 9 LTEXT "スタートアップã®ç¨®é¡ž:", IDC_STATIC, 6, 108, 53, 11 @@ -124,7 +124,7 @@ BEGIN EDITTEXT IDC_CREATE_DESC, 10, 97, 210, 48, WS_CHILD | WS_VISIBLE EDITTEXT IDC_CREATE_OPTIONS, 10, 162, 210, 13, WS_CHILD | WS_VISIBLE LTEXT "*サービスå :", IDC_STATIC, 12, 12, 54, 9 - LTEXT "*表 示å :", IDC_STATIC, 12, 33, 54, 9 + LTEXT "*表示å :", IDC_STATIC, 12, 33, 54, 9 LTEXT "*実行ファイルã®ãƒ‘ス :", IDC_STATIC, 10, 51, 68, 9 LTEXT "説明 :", IDC_STATIC, 12, 86, 44, 9 PUSHBUTTON "OK", IDOK, 126, 192, 44, 13 @@ -258,14 +258,14 @@ BEGIN IDS_HINT_DELETE " é¸æŠžã—ãŸã‚µãƒ¼ãƒ“スを削除ã—ã¾ã™ã€‚" IDS_HINT_PROP " ç¾åœ¨é¸æŠžã•れã¦ã„ã‚‹é …ç›®ã®ãƒ—ロパティ シートを開ãã¾ã™ã€‚" - IDS_HINT_LARGE " アイテムを大ãã„アイコンã§è¡¨ 示ã—ã¾ã™ã€‚" - IDS_HINT_SMALL " アイテムをå°ã•ã„アイコンã§è¡¨ 示ã—ã¾ã™ã€‚" - IDS_HINT_LIST " アイテムを一覧ã§è¡¨ 示ã—ã¾ã™ã€‚" - IDS_HINT_DETAILS " å„ã‚¢ã‚¤ãƒ†ãƒ ã®æƒ…報をウィンドウã«è¡¨ 示ã—ã¾ã™ã€‚" - IDS_HINT_CUST " 表 示をカスタマイズã—ã¾ã™ã€‚" + IDS_HINT_LARGE " アイテムを大ãã„アイコンã§è¡¨ç¤ºã—ã¾ã™ã€‚" + IDS_HINT_SMALL " アイテムをå°ã•ã„アイコンã§è¡¨ç¤ºã—ã¾ã™ã€‚" + IDS_HINT_LIST " アイテムを一覧ã§è¡¨ç¤ºã—ã¾ã™ã€‚" + IDS_HINT_DETAILS " å„ã‚¢ã‚¤ãƒ†ãƒ ã®æƒ…報をウィンドウã«è¡¨ç¤ºã—ã¾ã™ã€‚" + IDS_HINT_CUST " 表示をカスタマイズã—ã¾ã™ã€‚" - IDS_HINT_HELP " ヘルプ ウィンドウを表 示ã—ã¾ã™ã€‚" - IDS_HINT_ABOUT " ReactOS サービス マãƒãƒ¼ã‚¸ãƒ£ã«ã¤ã„ã¦è¡¨ 示ã—ã¾ã™ã€‚" + IDS_HINT_HELP " ヘルプ ウィンドウを表示ã—ã¾ã™ã€‚" + IDS_HINT_ABOUT " ReactOS サービス マãƒãƒ¼ã‚¸ãƒ£ã«ã¤ã„ã¦è¡¨ç¤ºã—ã¾ã™ã€‚" IDS_HINT_SYS_RESTORE " ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’通常ã®å¤§ãã•ã«å¾©å…ƒã—ã¾ã™ã€‚" IDS_HINT_SYS_MOVE " ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’移動ã—ã¾ã™ã€‚" diff --git a/reactos/base/applications/mspaint/lang/ja-JP.rc b/reactos/base/applications/mspaint/lang/ja-JP.rc index 37a8b4b18fe..4da051d1ac3 100644 --- a/reactos/base/applications/mspaint/lang/ja-JP.rc +++ b/reactos/base/applications/mspaint/lang/ja-JP.rc @@ -17,8 +17,8 @@ BEGIN MENUITEM "上書ãä¿å­˜(&S)\tCtrl+S", IDM_FILESAVE MENUITEM "åå‰ã‚’付ã‘ã¦ä¿å­˜(&A)...", IDM_FILESAVEAS MENUITEM SEPARATOR - MENUITEM "背景ã«è¨­å®š (並ã¹ã¦è¡¨ 示)", IDM_FILEASWALLPAPERPLANE - MENUITEM "背景ã«è¨­å®š (中央ã«è¡¨ 示)", IDM_FILEASWALLPAPERCENTERED + MENUITEM "背景ã«è¨­å®š (並ã¹ã¦è¡¨ç¤º)", IDM_FILEASWALLPAPERPLANE + MENUITEM "背景ã«è¨­å®š (中央ã«è¡¨ç¤º)", IDM_FILEASWALLPAPERCENTERED MENUITEM "背景ã«è¨­å®š (拡大)", IDM_FILEASWALLPAPERSTRETCHED MENUITEM SEPARATOR MENUITEM "ペイントã®çµ‚了(&Q)\tAlt+F4", IDM_FILEEXIT @@ -31,16 +31,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "切りå–り\tCtrl+X", IDM_EDITCUT MENUITEM "コピー\tCtrl+C", IDM_EDITCOPY - MENUITEM "è²¼ り付ã‘\tCtrl+V", IDM_EDITPASTE + MENUITEM "貼り付ã‘\tCtrl+V", IDM_EDITPASTE MENUITEM "é¸æŠžç¯„å›²ã®å‰Šé™¤\tDel", IDM_EDITDELETESELECTION MENUITEM "é¸æŠžç¯„å›²ã®æŒ¿å…¥", IDM_EDITINVERTSELECTION MENUITEM "ã™ã¹ã¦é¸æŠž\tCtrl+A", IDM_EDITSELECTALL MENUITEM SEPARATOR MENUITEM "ファイルã¸ã‚³ãƒ”ー", IDM_EDITCOPYTO - MENUITEM "ファイルã‹ã‚‰è²¼ り付ã‘", IDM_EDITPASTEFROM + MENUITEM "ファイルã‹ã‚‰è²¼ã‚Šä»˜ã‘", IDM_EDITPASTEFROM END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "ツール ボックス\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED MENUITEM "カラー パレット\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED @@ -60,10 +60,10 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "グリッドを表 示\tCtrl+G", IDM_VIEWSHOWGRID - MENUITEM "実寸表 示", IDM_VIEWSHOWMINIATURE + MENUITEM "グリッドを表示\tCtrl+G", IDM_VIEWSHOWGRID + MENUITEM "実寸表示", IDM_VIEWSHOWMINIATURE END - MENUITEM "全画é¢è¡¨ 示\tCtrl+F", IDM_VIEWFULLSCREEN + MENUITEM "全画é¢è¡¨ç¤º\tCtrl+F", IDM_VIEWFULLSCREEN END POPUP "ç”»åƒ(&I)" @@ -179,7 +179,7 @@ BEGIN IDS_PROGRAMNAME, "ペイント" IDS_WINDOWTITLE, "%s - ペイント" IDS_INFOTITLE, "ReactOS ペイント" - IDS_INFOTEXT, "ReactOS ペイント㯠GNU Lesser General Public License (LGPL) version 3 (詳細㯠www.gnu.org)ã®ä¸‹ã§åˆ©ç”¨å¯èƒ½ ã§ã™ã€‚" + IDS_INFOTEXT, "ReactOS ペイント㯠GNU Lesser General Public License (LGPL) version 3 (詳細㯠www.gnu.org)ã®ä¸‹ã§åˆ©ç”¨å¯èƒ½ã§ã™ã€‚" IDS_SAVEPROMPTTEXT, "%s ã®å¤‰æ›´å†…容をä¿å­˜ã—ã¾ã™ã‹?" IDS_DEFAULTFILENAME, "無題.bmp" IDS_MINIATURETITLE, "縮å°å›³" diff --git a/reactos/base/applications/mstsc/lang/ja-JP.rc b/reactos/base/applications/mstsc/lang/ja-JP.rc index f0c0ac9070b..3704c795a40 100644 --- a/reactos/base/applications/mstsc/lang/ja-JP.rc +++ b/reactos/base/applications/mstsc/lang/ja-JP.rc @@ -27,11 +27,11 @@ BEGIN GROUPBOX "色",IDC_STATIC,7,83,228,85 ICON "", IDC_REMICON, 15,19,20,20 ICON "", IDC_COLORSICON, 15,98,20,20 - LTEXT "リモート デスクトップã®ç”»é¢ã‚µã‚¤ã‚ºã‚’設定ã—ã¦ãã ã•ã„。スライダã®ã¤ã¾ã¿ã‚’å³ç«¯ã«å‹•ã‹ã™ã¨ã€å…¨ç”»é¢è¡¨ 示ã«ãªã‚Šã¾ã™",IDC_STATIC,53,22,175,21 + LTEXT "リモート デスクトップã®ç”»é¢ã‚µã‚¤ã‚ºã‚’設定ã—ã¦ãã ã•ã„。スライダã®ã¤ã¾ã¿ã‚’å³ç«¯ã«å‹•ã‹ã™ã¨ã€å…¨ç”»é¢è¡¨ç¤ºã«ãªã‚Šã¾ã™",IDC_STATIC,53,22,175,21 CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17 COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10 - LTEXT "注æ„: ã“ã®è¨­å®šã¯ãƒªãƒ¢ãƒ¼ãƒˆ コンピュータã®è¨­å®šã§ä¸Šæ›¸ãã•れるå¯èƒ½ 性ãŒã‚りã¾ã™ã€‚",IDC_STATIC,56,143,165,18 + LTEXT "注æ„: ã“ã®è¨­å®šã¯ãƒªãƒ¢ãƒ¼ãƒˆ コンピュータã®è¨­å®šã§ä¸Šæ›¸ãã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚",IDC_STATIC,56,143,165,18 LTEXT "å°",IDC_STATIC,35,42,15,8 LTEXT "大",IDC_STATIC,189,42,17,8 LTEXT "", IDC_SETTINGS_RESOLUTION_TEXT, 56, 62, 120, 10, SS_CENTER @@ -57,7 +57,7 @@ BEGIN IDS_HIGHCOLOR16 "65,536 色 (16 ビット)" IDS_HIGHCOLOR24 "16,777,216 色 (24 ビット)" IDS_PIXEL "%lu x %lu ピクセル" - IDS_FULLSCREEN "全画é¢è¡¨ 示" + IDS_FULLSCREEN "全画é¢è¡¨ç¤º" IDS_BROWSESERVER "<å‚ç…§...>" IDS_HEADERTEXT1 "リモート デスクトップ" IDS_HEADERTEXT2 "接続" diff --git a/reactos/base/applications/notepad/lang/ja-JP.rc b/reactos/base/applications/notepad/lang/ja-JP.rc index 6e043b96ed7..a193df514c7 100644 --- a/reactos/base/applications/notepad/lang/ja-JP.rc +++ b/reactos/base/applications/notepad/lang/ja-JP.rc @@ -61,7 +61,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "切りå–り(&T)\tCtrl+X", CMD_CUT MENUITEM "コピー(&C)\tCtrl+C", CMD_COPY - MENUITEM "è²¼ り付ã‘(&P)\tCtrl+V", CMD_PASTE + MENUITEM "貼り付ã‘(&P)\tCtrl+V", CMD_PASTE MENUITEM "削除(&D)\tDel", CMD_DELETE MENUITEM SEPARATOR MENUITEM "検索(&F)...\tCtrl+F", CMD_SEARCH @@ -77,7 +77,7 @@ BEGIN MENUITEM "å³ç«¯ã§æŠ˜ã‚Šè¿”ã™(&W)", CMD_WRAP MENUITEM "フォント(&F)...", CMD_FONT END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "ステータス ãƒãƒ¼(&B)", CMD_STATUSBAR END diff --git a/reactos/base/applications/regedit/lang/ja-JP.rc b/reactos/base/applications/regedit/lang/ja-JP.rc index 7e2fb12ba1a..49390f63c5f 100644 --- a/reactos/base/applications/regedit/lang/ja-JP.rc +++ b/reactos/base/applications/regedit/lang/ja-JP.rc @@ -164,7 +164,7 @@ BEGIN BEGIN MENUITEM "切りå–り(&C)", ID_HEXEDIT_CUT MENUITEM "コピー(&C)", ID_HEXEDIT_COPY - MENUITEM "è²¼ り付ã‘(&P)", ID_HEXEDIT_PASTE + MENUITEM "貼り付ã‘(&P)", ID_HEXEDIT_PASTE MENUITEM "削除(&D)", ID_HEXEDIT_DELETE MENUITEM SEPARATOR MENUITEM "ã™ã¹ã¦é¸æŠž(&A)", ID_HEXEDIT_SELECT_ALL diff --git a/reactos/base/applications/sndvol32/lang/ja-JP.rc b/reactos/base/applications/sndvol32/lang/ja-JP.rc index 33f3f48d21f..4d6d248874d 100644 --- a/reactos/base/applications/sndvol32/lang/ja-JP.rc +++ b/reactos/base/applications/sndvol32/lang/ja-JP.rc @@ -35,7 +35,7 @@ BEGIN PUSHBUTTON "録音(&R)", IDC_RECORDING, 13,61,47,8, BS_AUTORADIOBUTTON PUSHBUTTON "ãã®ä»–(&O):", IDC_OTHER, 13,80,42,8, BS_AUTORADIOBUTTON | WS_DISABLED COMBOBOX IDC_LINE, 55,80,155,50, CBS_DROPDOWNLIST | WS_TABSTOP | WS_DISABLED - LTEXT "表 示ã™ã‚‹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«:", IDC_LABELCONTROLS, 7, 109, 162, 8 + LTEXT "表示ã™ã‚‹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«:", IDC_LABELCONTROLS, 7, 109, 162, 8 CONTROL "", IDC_CONTROLS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | WS_TABSTOP | WS_BORDER, 7, 122, 211, 96 PUSHBUTTON "OK", IDOK, 114,226,50,14 diff --git a/reactos/base/applications/taskmgr/lang/ja-JP.rc b/reactos/base/applications/taskmgr/lang/ja-JP.rc index 119d399e3f0..69b13de1654 100644 --- a/reactos/base/applications/taskmgr/lang/ja-JP.rc +++ b/reactos/base/applications/taskmgr/lang/ja-JP.rc @@ -10,16 +10,16 @@ BEGIN END POPUP "オプション(&O)" BEGIN - MENUITEM "å¸¸ã«æ‰‹å‰ã«è¡¨ 示(&A)", ID_OPTIONS_ALWAYSONTOP + MENUITEM "å¸¸ã«æ‰‹å‰ã«è¡¨ç¤º(&A)", ID_OPTIONS_ALWAYSONTOP , CHECKED MENUITEM "æœªä½¿ç”¨æ™‚ã«æœ€å°åŒ–(&M)", ID_OPTIONS_MINIMIZEONUSE , CHECKED MENUITEM "最å°åŒ–時ã«éš ã™(&H)", ID_OPTIONS_HIDEWHENMINIMIZED , CHECKED - MENUITEM "16 ビット タスクã®è¡¨ 示(&S)", ID_OPTIONS_SHOW16BITTASKS + MENUITEM "16 ビット タスクã®è¡¨ç¤º(&S)", ID_OPTIONS_SHOW16BITTASKS , CHECKED END - POPUP "表 示(&V)" + POPUP "表示(&V)" BEGIN MENUITEM "最新ã®çŠ¶æ…‹ã«æ›´æ–°(&R)", ID_VIEW_REFRESH POPUP "æ›´æ–°ã®é »åº¦(&U)" @@ -43,16 +43,16 @@ BEGIN MENUITEM "CPU ã”ã¨ã« 1 グラフ(&P)", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU , CHECKED END - MENUITEM "カーãƒãƒ«æ™‚間を表 示ã™ã‚‹(&S)", ID_VIEW_SHOWKERNELTIMES + MENUITEM "カーãƒãƒ«æ™‚間を表示ã™ã‚‹(&S)", ID_VIEW_SHOWKERNELTIMES END POPUP "ウィンドウ(&W)" BEGIN - MENUITEM "上下ã«ä¸¦ã¹ã¦è¡¨ 示(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "å·¦å³ã«ä¸¦ã¹ã¦è¡¨ 示(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "上下ã«ä¸¦ã¹ã¦è¡¨ç¤º(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "å·¦å³ã«ä¸¦ã¹ã¦è¡¨ç¤º(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "最å°åŒ–(&M)", ID_WINDOWS_MINIMIZE MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "é‡ã­ã¦è¡¨ 示(&C)", ID_WINDOWS_CASCADE - MENUITEM "手å‰ã«è¡¨ 示(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "é‡ã­ã¦è¡¨ç¤º(&C)", ID_WINDOWS_CASCADE + MENUITEM "手å‰ã«è¡¨ç¤º(&B)", ID_WINDOWS_BRINGTOFRONT END POPUP "ヘルプ(&H)" BEGIN @@ -64,12 +64,12 @@ END IDR_WINDOWSMENU MENU DISCARDABLE BEGIN - MENUITEM "上下ã«ä¸¦ã¹ã¦è¡¨ 示(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "å·¦å³ã«ä¸¦ã¹ã¦è¡¨ 示(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "上下ã«ä¸¦ã¹ã¦è¡¨ç¤º(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "å·¦å³ã«ä¸¦ã¹ã¦è¡¨ç¤º(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "最å°åŒ–(&M)", ID_WINDOWS_MINIMIZE MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "é‡ã­ã¦è¡¨ 示(&C)", ID_WINDOWS_CASCADE - MENUITEM "手å‰ã«è¡¨ 示(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "é‡ã­ã¦è¡¨ç¤º(&C)", ID_WINDOWS_CASCADE + MENUITEM "手å‰ã«è¡¨ç¤º(&B)", ID_WINDOWS_BRINGTOFRONT END IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE @@ -89,16 +89,16 @@ BEGIN POPUP "DUMMY" BEGIN MENUITEM "切り替ãˆ(&S)", ID_APPLICATION_PAGE_SWITCHTO - MENUITEM "手å‰ã«è¡¨ 示(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "手å‰ã«è¡¨ç¤º(&B)", ID_WINDOWS_BRINGTOFRONT MENUITEM SEPARATOR - MENUITEM "上下ã«ä¸¦ã¹ã¦è¡¨ 示(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "å·¦å³ã«ä¸¦ã¹ã¦è¡¨ 示(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "上下ã«ä¸¦ã¹ã¦è¡¨ç¤º(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "å·¦å³ã«ä¸¦ã¹ã¦è¡¨ç¤º(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "最å°åŒ–(&M)", ID_WINDOWS_MINIMIZE MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "é‡ã­ã¦è¡¨ 示(&C)", ID_WINDOWS_CASCADE + MENUITEM "é‡ã­ã¦è¡¨ç¤º(&C)", ID_WINDOWS_CASCADE MENUITEM SEPARATOR MENUITEM "タスクã®çµ‚了(&E)", ID_APPLICATION_PAGE_ENDTASK - MENUITEM "プロセスã®è¡¨ 示(&G)", ID_APPLICATION_PAGE_GOTOPROCESS + MENUITEM "プロセスã®è¡¨ç¤º(&G)", ID_APPLICATION_PAGE_GOTOPROCESS END END @@ -110,7 +110,7 @@ BEGIN MENUITEM "å…ƒã®ã‚µã‚¤ã‚ºã«æˆ»ã™(&R)", ID_RESTORE MENUITEM "é–‰ã˜ã‚‹(&C)", ID_FILE_EXIT MENUITEM SEPARATOR - MENUITEM "å¸¸ã«æ‰‹å‰ã«è¡¨ 示(&A)", ID_OPTIONS_ALWAYSONTOP + MENUITEM "å¸¸ã«æ‰‹å‰ã«è¡¨ç¤º(&A)", ID_OPTIONS_ALWAYSONTOP END END @@ -180,7 +180,7 @@ BEGIN LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "プロセスã®çµ‚了(&E)",IDC_ENDPROCESS,171,189,69,14 - CONTROL "全ユーザーã®ãƒ—ロセスを表 示ã™ã‚‹(&S)",IDC_SHOWALLPROCESSES, + CONTROL "全ユーザーã®ãƒ—ロセスを表示ã™ã‚‹(&S)",IDC_SHOWALLPROCESSES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10 END @@ -233,8 +233,8 @@ BEGIN ES_READONLY | ES_NUMBER | NOT WS_BORDER | NOT WS_TABSTOP GROUPBOX "CPU 使用率ã®å±¥æ­´",IDC_CPU_USAGE_HISTORY_FRAME,74,5,168,54,0,WS_EX_TRANSPARENT GROUPBOX "メモリ使用é‡ã®å±¥æ­´",IDC_MEMORY_USAGE_HISTORY_FRAME,74,63,168,54,0,WS_EX_TRANSPARENT - PUSHBUTTON "CPU 使用率ã®è¡¨ 示",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE - PUSHBUTTON "メモリ使用é‡ã®è¡¨ 示",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "CPU 使用率ã®è¡¨ç¤º",IDC_CPU_USAGE_GRAPH,12,17,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE + PUSHBUTTON "メモリ使用é‡ã®è¡¨ç¤º",IDC_MEM_USAGE_GRAPH,12,75,47,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE PUSHBUTTON "CPU 使用率ã®å±¥æ­´",IDC_CPU_USAGE_HISTORY_GRAPH,81,17, 153,37,NOT WS_TABSTOP,WS_EX_CLIENTEDGE PUSHBUTTON "メモリ使用é‡ã®å±¥æ­´",IDC_MEM_USAGE_HISTORY_GRAPH,81,75, @@ -334,7 +334,7 @@ FONT 9, "MS UI Gothic" BEGIN DEFPUSHBUTTON "OK",IDOK,84,178,50,14 PUSHBUTTON "キャンセル",IDCANCEL,138,178,50,14 - LTEXT "タスク マãƒãƒ¼ã‚¸ãƒ£ã® [プロセス] ページã«è¡¨ 示ã™ã‚‹åˆ—ã‚’é¸æŠžã—ã¾ã™ã€‚", + LTEXT "タスク マãƒãƒ¼ã‚¸ãƒ£ã® [プロセス] ページã«è¡¨ç¤ºã™ã‚‹åˆ—ã‚’é¸æŠžã—ã¾ã™ã€‚", IDC_STATIC,7,7,181,17 CONTROL "イメージå(&I)",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,28,56,10 @@ -517,41 +517,41 @@ END STRINGTABLE DISCARDABLE BEGIN ID_FILE_NEW "æ–°ã—ã„プログラムを実行ã—ã¾ã™" - ID_OPTIONS_ALWAYSONTOP "最å°åŒ–ã•れãªã„é™ã‚Šã€å¸¸ã«ã‚¿ã‚¹ã‚¯ マãƒãƒ¼ã‚¸ãƒ£ãŒã»ã‹ã®ã™ã¹ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚ˆã‚Šã‚‚手å‰ã«è¡¨ 示ã•れã¾ã™" + ID_OPTIONS_ALWAYSONTOP "最å°åŒ–ã•れãªã„é™ã‚Šã€å¸¸ã«ã‚¿ã‚¹ã‚¯ マãƒãƒ¼ã‚¸ãƒ£ãŒã»ã‹ã®ã™ã¹ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚ˆã‚Šã‚‚手å‰ã«è¡¨ç¤ºã•れã¾ã™" ID_OPTIONS_MINIMIZEONUSE "[切り替ãˆ] æ“作を実行ã™ã‚‹ã¨ã€ã‚¿ã‚¹ã‚¯ マãƒãƒ¼ã‚¸ãƒ£ãŒæœ€å°åŒ–ã•れã¾ã™" ID_OPTIONS_HIDEWHENMINIMIZED "最å°åŒ–ã•れãŸã¨ãã«ã€ã‚¿ã‚¹ã‚¯ マãƒãƒ¼ã‚¸ãƒ£ã‚’éš ã—ã¾ã™" ID_VIEW_REFRESH "[æ›´æ–°ã®é »åº¦] ã®è¨­å®šã«ã‹ã‹ã‚らãšã€ä»Šã™ãタスク マãƒãƒ¼ã‚¸ãƒ£ã‚’æ›´æ–°ã—ã¾ã™" - ID_VIEW_LARGE "大ãã„アイコンを使ã£ã¦ã‚¿ã‚¹ã‚¯ã‚’表 示ã—ã¾ã™" - ID_VIEW_SMALL "å°ã•ã„アイコンを使ã£ã¦ã‚¿ã‚¹ã‚¯ã‚’表 示ã—ã¾ã™" - ID_VIEW_DETAILS "å„ã‚¿ã‚¹ã‚¯ã®æƒ…報を表 示ã—ã¾ã™" - ID_VIEW_UPDATESPEED_HIGH "毎秒 2 回表 示を更新ã—ã¾ã™" - ID_VIEW_UPDATESPEED_NORMAL "2 ç§’ã« 1 回表 示を更新ã—ã¾ã™" - ID_VIEW_UPDATESPEED_LOW "4 ç§’ã« 1 回表 示を更新ã—ã¾ã™" + ID_VIEW_LARGE "大ãã„アイコンを使ã£ã¦ã‚¿ã‚¹ã‚¯ã‚’表示ã—ã¾ã™" + ID_VIEW_SMALL "å°ã•ã„アイコンを使ã£ã¦ã‚¿ã‚¹ã‚¯ã‚’表示ã—ã¾ã™" + ID_VIEW_DETAILS "å„ã‚¿ã‚¹ã‚¯ã®æƒ…報を表示ã—ã¾ã™" + ID_VIEW_UPDATESPEED_HIGH "毎秒 2 回表示を更新ã—ã¾ã™" + ID_VIEW_UPDATESPEED_NORMAL "2 ç§’ã« 1 回表示を更新ã—ã¾ã™" + ID_VIEW_UPDATESPEED_LOW "4 ç§’ã« 1 回表示を更新ã—ã¾ã™" END STRINGTABLE DISCARDABLE BEGIN - ID_VIEW_UPDATESPEED_PAUSED "表 ç¤ºã‚’è‡ªå‹•çš„ã«æ›´æ–°ã—ã¾ã›ã‚“" + ID_VIEW_UPDATESPEED_PAUSED "è¡¨ç¤ºã‚’è‡ªå‹•çš„ã«æ›´æ–°ã—ã¾ã›ã‚“" ID_WINDOWS_TILEHORIZONTALLY - "デスクトップ上ã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é‡ãªã‚‰ãªã„よã†ã«ä¸Šä¸‹ã«ä¸¦ã¹ã¦è¡¨ 示ã—ã¾ã™" - ID_WINDOWS_TILEVERTICALLY "デスクトップ上ã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é‡ãªã‚‰ãªã„よã†ã«å·¦å³ã«ä¸¦ã¹ã¦è¡¨ 示ã—ã¾ã™" + "デスクトップ上ã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é‡ãªã‚‰ãªã„よã†ã«ä¸Šä¸‹ã«ä¸¦ã¹ã¦è¡¨ç¤ºã—ã¾ã™" + ID_WINDOWS_TILEVERTICALLY "デスクトップ上ã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é‡ãªã‚‰ãªã„よã†ã«å·¦å³ã«ä¸¦ã¹ã¦è¡¨ç¤ºã—ã¾ã™" ID_WINDOWS_MINIMIZE "ウィンドウを最å°åŒ–ã—ã¾ã™" ID_WINDOWS_MAXIMIZE "ウィンドウを最大化ã—ã¾ã™" - ID_WINDOWS_CASCADE "デスクトップ上ã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é‡ã­ã¦è¡¨ 示ã—ã¾ã™" - ID_WINDOWS_BRINGTOFRONT "ウィンドウを手å‰ã«è¡¨ 示ã—ã¾ã™ãŒã€åˆ‡ã‚Šæ›¿ãˆã¾ã›ã‚“。" - ID_HELP_TOPICS "タスク マãƒãƒ¼ã‚¸ãƒ£ã®ãƒ˜ãƒ«ãƒ— トピックを表 示ã—ã¾ã™" - ID_HELP_ABOUT "プログラム情報ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã€è‘—作権を表 示ã—ã¾ã™" + ID_WINDOWS_CASCADE "デスクトップ上ã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é‡ã­ã¦è¡¨ç¤ºã—ã¾ã™" + ID_WINDOWS_BRINGTOFRONT "ウィンドウを手å‰ã«è¡¨ç¤ºã—ã¾ã™ãŒã€åˆ‡ã‚Šæ›¿ãˆã¾ã›ã‚“。" + ID_HELP_TOPICS "タスク マãƒãƒ¼ã‚¸ãƒ£ã®ãƒ˜ãƒ«ãƒ— トピックを表示ã—ã¾ã™" + ID_HELP_ABOUT "プログラム情報ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã€è‘—作権を表示ã—ã¾ã™" ID_FILE_EXIT "タスク マãƒãƒ¼ã‚¸ãƒ£ アプリケーションを終了ã—ã¾ã™" ID_OPTIONS_SHOW16BITTASKS - "16 ビット タスクをã€é–¢é€£ä»˜ã‘られ㟠ntvdm.exe ã®ä¸‹ã«è¡¨ 示ã—ã¾ã™" - ID_VIEW_SELECTCOLUMNS "[プロセス] ページã«è¡¨ 示ã™ã‚‹åˆ—ã‚’é¸æŠžã—ã¾ã™" - ID_VIEW_SHOWKERNELTIMES "カーãƒãƒ«æ™‚間をパフォーマンス グラフ上ã«è¡¨ 示ã—ã¾ã™" + "16 ビット タスクをã€é–¢é€£ä»˜ã‘られ㟠ntvdm.exe ã®ä¸‹ã«è¡¨ç¤ºã—ã¾ã™" + ID_VIEW_SELECTCOLUMNS "[プロセス] ページã«è¡¨ç¤ºã™ã‚‹åˆ—ã‚’é¸æŠžã—ã¾ã™" + ID_VIEW_SHOWKERNELTIMES "カーãƒãƒ«æ™‚間をパフォーマンス グラフ上ã«è¡¨ç¤ºã—ã¾ã™" ID_VIEW_CPUHISTORY_ONEGRAPHALL - "1 ã¤ã®å±¥æ­´ã‚°ãƒ©ãƒ•ã§ CPU 使用率ã®åˆè¨ˆã‚’表 示ã—ã¾ã™" - ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "CPU 使用率ã®å±¥æ­´ã‚’ CPU ã”ã¨ã«ã‚°ãƒ©ãƒ•ã§è¡¨ 示ã—ã¾ã™" + "1 ã¤ã®å±¥æ­´ã‚°ãƒ©ãƒ•ã§ CPU 使用率ã®åˆè¨ˆã‚’表示ã—ã¾ã™" + ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "CPU 使用率ã®å±¥æ­´ã‚’ CPU ã”ã¨ã«ã‚°ãƒ©ãƒ•ã§è¡¨ç¤ºã—ã¾ã™" ID_APPLICATION_PAGE_SWITCHTO - "タスクを手å‰ã«è¡¨ 示ã—ã€ãƒ•ォーカスを切り替ãˆã¾ã™" + "タスクを手å‰ã«è¡¨ç¤ºã—ã€ãƒ•ォーカスを切り替ãˆã¾ã™" END STRINGTABLE DISCARDABLE @@ -611,7 +611,7 @@ BEGIN IDS_TAB_IOWRITESBYTES "I/O 書ãè¾¼ã¿ãƒã‚¤ãƒˆæ•°" IDS_TAB_IOOTHERBYTES "I/O ãã®ä»–ã®ãƒã‚¤ãƒˆæ•°" IDS_MENU_SELECTCOLUMNS "列ã®é¸æŠž(&S)..." - IDS_MENU_16BITTASK "16 ビット タスクã®è¡¨ 示(&S)" + IDS_MENU_16BITTASK "16 ビット タスクã®è¡¨ç¤º(&S)" IDS_MENU_WINDOWS "ウィンドウ(&W)" IDS_MENU_LARGEICONS "大ãã„アイコン(&G)" IDS_MENU_SMALLICONS "å°ã•ã„アイコン(&M)" @@ -619,19 +619,19 @@ BEGIN IDS_MENU_ONEGRAPHALLCPUS "ã™ã¹ã¦ã® CPU ã§ 1 グラフ(&O)" IDS_MENU_ONEGRAPHPERCPU "CPU ã”ã¨ã« 1 グラフ(&P)" IDS_MENU_CPUHISTORY "CPU 履歴(&C)" - IDS_MENU_SHOWKERNELTIMES "カーãƒãƒ«æ™‚間を表 示ã™ã‚‹(&S)" + IDS_MENU_SHOWKERNELTIMES "カーãƒãƒ«æ™‚間を表示ã™ã‚‹(&S)" IDS_CREATENEWTASK "æ–°ã—ã„タスクã®ä½œæˆ" - IDS_CREATENEWTASK_DESC "実行ã™ã‚‹ãƒ—ログラムåã€ã¾ãŸã¯é–‹ãフォルダやドキュメントåã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆ リソ ースåを入力ã—ã¦ãã ã•ã„。" + IDS_CREATENEWTASK_DESC "実行ã™ã‚‹ãƒ—ログラムåã€ã¾ãŸã¯é–‹ãフォルダやドキュメントåã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆ リソースåを入力ã—ã¦ãã ã•ã„。" IDS_MSG_ACCESSPROCESSAFF "プロセスã®é–¢ä¿‚ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¾ãŸã¯è¨­å®šãŒã§ãã¾ã›ã‚“" IDS_MSG_PROCESSONEPRO "プロセスã¯ã€å°‘ãªãã¨ã‚‚ 1 ã¤ã®ãƒ—ロセッサã¨é–¢ä¿‚ã‚’æŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“。" IDS_MSG_INVALIDOPTION "無効ãªã‚ªãƒ—ション" IDS_MSG_UNABLEDEBUGPROCESS "デãƒãƒƒã‚¬ã‚’添付ã§ãã¾ã›ã‚“" - IDS_MSG_WARNINGDEBUG "警告: ã“ã®ãƒ—ロセスをデãƒãƒƒã‚°ã™ã‚‹ã¨ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½ 性ãŒã‚りã¾ã™ã€‚\nデãƒãƒƒã‚¬ã‚’添付ã—ã¾ã™ã‹?" + IDS_MSG_WARNINGDEBUG "警告: ã“ã®ãƒ—ロセスをデãƒãƒƒã‚°ã™ã‚‹ã¨ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚\nデãƒãƒƒã‚¬ã‚’添付ã—ã¾ã™ã‹?" IDS_MSG_TASKMGRWARNING "タスク マãƒãƒ¼ã‚¸ãƒ£ã®è­¦å‘Š" - IDS_MSG_WARNINGTERMINATING "警告: プロセスを終了ã™ã‚‹ã¨ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れãŸã‚Šã€ã‚·ã‚¹ãƒ†ãƒ ãŒ\nä¸å®‰å®šã«ãªã£ãŸã‚Šã™ã‚‹ãªã©ã®ã€äºˆ 期ã—ãªã„çµæžœã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚\nプロセスを終了ã™ã‚‹å‰ã«ã€çŠ¶æ…‹ã¾ãŸã¯ãƒ‡ãƒ¼ã‚¿ã‚’ä¿å­˜ã™ã‚‹ã‹ã©ã†ã‹ã®\n確èªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ 示ã•れã¾ã›ã‚“。プロセスを終了ã—ã¾ã™ã‹?" + IDS_MSG_WARNINGTERMINATING "警告: プロセスを終了ã™ã‚‹ã¨ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れãŸã‚Šã€ã‚·ã‚¹ãƒ†ãƒ ãŒ\nä¸å®‰å®šã«ãªã£ãŸã‚Šã™ã‚‹ãªã©ã®ã€äºˆæœŸã—ãªã„çµæžœã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚\nプロセスを終了ã™ã‚‹å‰ã«ã€çŠ¶æ…‹ã¾ãŸã¯ãƒ‡ãƒ¼ã‚¿ã‚’ä¿å­˜ã™ã‚‹ã‹ã©ã†ã‹ã®\n確èªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。プロセスを終了ã—ã¾ã™ã‹?" IDS_MSG_UNABLETERMINATEPRO "プロセスを終了ã§ãã¾ã›ã‚“" IDS_MSG_UNABLECHANGEPRIORITY "優先度を変更ã§ãã¾ã›ã‚“" - IDS_MSG_WARNINGCHANGEPRIORITY "警告: ã“ã®ãƒ—ロセスã®å„ªå…ˆåº¦ã‚¯ãƒ©ã‚¹ã‚’変更ã™ã‚‹ã¨ã€ã‚·ã‚¹ãƒ†ãƒ ãŒä¸å®‰å®šã«\nãªã‚‹ãªã©ã€äºˆ 期ã—ãªã„çµæžœã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚\n優先度クラスを変更ã—ã¾ã™ã‹?" + IDS_MSG_WARNINGCHANGEPRIORITY "警告: ã“ã®ãƒ—ロセスã®å„ªå…ˆåº¦ã‚¯ãƒ©ã‚¹ã‚’変更ã™ã‚‹ã¨ã€ã‚·ã‚¹ãƒ†ãƒ ãŒä¸å®‰å®šã«\nãªã‚‹ãªã©ã€äºˆæœŸã—ãªã„çµæžœã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚\n優先度クラスを変更ã—ã¾ã™ã‹?" IDS_MSG_TRAYICONCPUUSAGE "CPU 使用率: %d%%" IDS_STATUS_MEMUSAGE "メモリ使用é‡: %dKB / %dKB" IDS_STATUS_CPUUSAGE "CPU 使用率: %3d%%" diff --git a/reactos/base/system/regsvr32/lang/ja-JP.rc b/reactos/base/system/regsvr32/lang/ja-JP.rc index 368c8a0e9c0..3ee41f26d1e 100644 --- a/reactos/base/system/regsvr32/lang/ja-JP.rc +++ b/reactos/base/system/regsvr32/lang/ja-JP.rc @@ -4,9 +4,9 @@ BEGIN IDS_UsageMessage, "%s\n\n使用法: regsvr32 [/u] [/s] [/c] [/n] [/i[:コマンド ライン]] DLLå\n\ /u - サーãƒãƒ¼ã‚’登録解除ã™ã‚‹\n\ -/s - サイレント; メッセージ ボックスを表 示ã—ãªã„\n\ -/c - コンソ ール出力\n\ -/i - çœç•¥å¯èƒ½ 㪠[コマンド ライン] を引数ã¨ã—㦠DllInstall を呼ã³å‡ºã™; /u ã¨ä½µç”¨ã—ãŸå ´åˆã¯ dll uninstall を呼ã³å‡ºã™\n\ +/s - サイレント; メッセージ ボックスを表示ã—ãªã„\n\ +/c - コンソール出力\n\ +/i - çœç•¥å¯èƒ½ãª [コマンド ライン] を引数ã¨ã—㦠DllInstall を呼ã³å‡ºã™; /u ã¨ä½µç”¨ã—ãŸå ´åˆã¯ dll uninstall を呼ã³å‡ºã™\n\ /n - DllRegisterServer を呼ã³å‡ºã•ãªã„; ã“ã®ã‚ªãƒ—ション㯠/i ã¨ä½µç”¨ã™ã‚‹å¿…è¦ãŒã‚ã‚‹" IDS_NoDllSpecified, "DLL åãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。" @@ -18,7 +18,7 @@ IDS_SwitchN_NoI, "フラグをèªè­˜ã§ãã¾ã›ã‚“: /n を指定ã™ã‚‹å ´ IDS_DllNotLoaded, "LoadLibrary('%s') ã«å¤±æ•—ã—ã¾ã—ãŸã€‚\nGetLastError 㯠0x%08x ã‚’è¿”ã—ã¾ã—ãŸã€‚" IDS_MissingEntry, "%s を読ã¿è¾¼ã¿ã¾ã—ãŸãŒã€%s エントリ ãƒã‚¤ãƒ³ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚\n\n\ -%s ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã‹ã€%s ã®ä¸æ­£ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒãƒ¡ãƒ¢ãƒªä¸Šã«ã‚ã‚‹å¯èƒ½ 性ãŒã‚りã¾ã™ã€‚検出や削除をã™ã‚‹ãŸã‚ã€PView ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。" +%s ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã‹ã€%s ã®ä¸æ­£ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒãƒ¡ãƒ¢ãƒªä¸Šã«ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚検出や削除をã™ã‚‹ãŸã‚ã€PView ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。" IDS_FailureMessage, "%s (%s ã®) ã«å¤±æ•—ã—ã¾ã—ãŸã€‚\nè¿”ã£ã¦ããŸã‚³ãƒ¼ãƒ‰: 0x%08x" diff --git a/reactos/dll/cpl/access/lang/ja-JP.rc b/reactos/dll/cpl/access/lang/ja-JP.rc index 32cd78797db..adf3ed105f7 100644 --- a/reactos/dll/cpl/access/lang/ja-JP.rc +++ b/reactos/dll/cpl/access/lang/ja-JP.rc @@ -7,21 +7,21 @@ CAPTION "キーボード" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "固定キー機能",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "固定キー機能 を使ã†ã¨ã€ã‚­ãƒ¼ã‚’åŒæ™‚ã«æŠ¼ã•ãªãã¦ã‚‚ã€Shiftã€Ctrlã€Alt ã‚­ãƒ¼ã®æ©Ÿèƒ½ ãŒä½¿ãˆã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) - AUTOCHECKBOX "固定キー機能 を使ã†(&U)",IDC_STICKY_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "固定キー機能を使ã†ã¨ã€ã‚­ãƒ¼ã‚’åŒæ™‚ã«æŠ¼ã•ãªãã¦ã‚‚ã€Shiftã€Ctrlã€Alt ã‚­ãƒ¼ã®æ©Ÿèƒ½ãŒä½¿ãˆã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + AUTOCHECKBOX "固定キー機能を使ã†(&U)",IDC_STICKY_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&S)",IDC_STICKY_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 GROUPBOX "フィルタ キー機能",-1,PROPSHEETPADDING(1),LABELLINE(8)+5,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(7)+2 - LTEXT "フィルタ キー機能 を使ã†ã¨ã€é€Ÿã„キー入力や繰り返ã•れãŸã‚­ãƒ¼å…¥åŠ›ã‚’ç„¡è¦–ã—ãŸã‚Šã€ç¹°ã‚Šè¿”ã—入力ã®é–“隔を長ãã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(10)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) - AUTOCHECKBOX "フィルタ キー機能 を使ã†(&F)",IDC_FILTER_BOX,PROPSHEETPADDING(2),LABELLINE(13)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "フィルタ キー機能を使ã†ã¨ã€é€Ÿã„キー入力や繰り返ã•れãŸã‚­ãƒ¼å…¥åŠ›ã‚’ç„¡è¦–ã—ãŸã‚Šã€ç¹°ã‚Šè¿”ã—入力ã®é–“隔を長ãã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(10)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + AUTOCHECKBOX "フィルタ キー機能を使ã†(&F)",IDC_FILTER_BOX,PROPSHEETPADDING(2),LABELLINE(13)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&E)",IDC_FILTER_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(13)+2,PROPSHEETPADDING(15),14 GROUPBOX "切り替ãˆã‚­ãƒ¼æ©Ÿèƒ½",-1,PROPSHEETPADDING(1),LABELLINE(16)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "切り替ãˆã‚­ãƒ¼æ©Ÿèƒ½ を使ã†ã¨ã€CapsLockã€NumLockã€ScrollLock キーを押ã—ãŸã¨ãã«éŸ³ã‚’鳴らã—ã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(18)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) - AUTOCHECKBOX "切り替ãˆã‚­ãƒ¼æ©Ÿèƒ½ を使ã†(&T)",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "切り替ãˆã‚­ãƒ¼æ©Ÿèƒ½ã‚’使ã†ã¨ã€CapsLockã€NumLockã€ScrollLock キーを押ã—ãŸã¨ãã«éŸ³ã‚’鳴らã—ã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(18)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) + AUTOCHECKBOX "切り替ãˆã‚­ãƒ¼æ©Ÿèƒ½ã‚’使ã†(&T)",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&N)",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(20)+2,PROPSHEETPADDING(15),14 - AUTOCHECKBOX "プログラムã§è¿½åŠ ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ ヘルプを表 示ã™ã‚‹(&W)",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 + AUTOCHECKBOX "プログラムã§è¿½åŠ ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ ヘルプを表示ã™ã‚‹(&W)",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 END @@ -37,7 +37,7 @@ BEGIN COMBOBOX IDC_SENTRY_COMBO, PROPSHEETPADDING(2), LABELLINE(9), PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6), CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP GROUPBOX "サウンド解説",-1,PROPSHEETPADDING(1),LABELLINE(12)+5,PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(7)+2 - LTEXT "プログラムãŒéŸ³ã‚’鳴らã™ã¨ãã€é³´ã‚‰ã™éŸ³ã«ã¤ã„ã¦è§£èª¬ã‚’表 示ã—ã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(14)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "プログラムãŒéŸ³ã‚’鳴らã™ã¨ãã€é³´ã‚‰ã™éŸ³ã«ã¤ã„ã¦è§£èª¬ã‚’表示ã—ã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(14)-3,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "サウンド解説(&H)",IDC_SSHOW_BOX,PROPSHEETPADDING(2),LABELLINE(16)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 END @@ -48,7 +48,7 @@ CAPTION "ç”»é¢" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "ãƒã‚¤ã‚³ãƒ³ãƒˆãƒ©ã‚¹ãƒˆ",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "ã“ã®æ©Ÿèƒ½ を使ã†ã¨ã€ç”»é¢è¡¨ 示ã«èª­ã¿ã‚„ã™ã„é…色ã¨ãƒ•ォントを使ã„ã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€ç”»é¢è¡¨ç¤ºã«èª­ã¿ã‚„ã™ã„é…色ã¨ãƒ•ォントを使ã„ã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "ãƒã‚¤ã‚³ãƒ³ãƒˆãƒ©ã‚¹ãƒˆã‚’使ã†(&U)",IDC_CONTRAST_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&S)",IDC_CONTRAST_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 @@ -72,8 +72,8 @@ CAPTION "マウス" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "マウス キー機能",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "マウス キー機能 を使ã†ã¨ã€ãƒ†ãƒ³ã‚­ãƒ¼ã‚’使ã£ã¦ãƒžã‚¦ã‚¹ ãƒã‚¤ãƒ³ã‚¿ã‚’æ“作ã§ãã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) - AUTOCHECKBOX "マウス キー機能 (&M)",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 + LTEXT "マウス キー機能を使ã†ã¨ã€ãƒ†ãƒ³ã‚­ãƒ¼ã‚’使ã£ã¦ãƒžã‚¦ã‚¹ ãƒã‚¤ãƒ³ã‚¿ã‚’æ“作ã§ãã¾ã™ã€‚",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + AUTOCHECKBOX "マウス キー機能(&M)",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "設定(&S)",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 END @@ -292,7 +292,7 @@ END STRINGTABLE BEGIN IDS_CPLSYSTEMNAME "ユーザー補助" - IDS_CPLSYSTEMDESCRIPTION "視覚ã€è´è¦šã€å››è‚¢ã®çŠ¶æ…‹ã«åˆã‚ã›ã¦ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’補助ã™ã‚‹æ©Ÿèƒ½ を調整ã—ã¾ã™ã€‚" + IDS_CPLSYSTEMDESCRIPTION "視覚ã€è´è¦šã€å››è‚¢ã®çŠ¶æ…‹ã«åˆã‚ã›ã¦ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’補助ã™ã‚‹æ©Ÿèƒ½ã‚’調整ã—ã¾ã™ã€‚" IDS_SENTRY_NONE "[None]" IDS_SENTRY_TITLE "Flash the titlebar" diff --git a/reactos/dll/cpl/sysdm/lang/ja-JP.rc b/reactos/dll/cpl/sysdm/lang/ja-JP.rc index 0aa1b3f7981..1ea54056856 100644 --- a/reactos/dll/cpl/sysdm/lang/ja-JP.rc +++ b/reactos/dll/cpl/sysdm/lang/ja-JP.rc @@ -18,7 +18,7 @@ BEGIN LTEXT "", IDC_MACHINELINE4, 130, 171, 118, 9 LTEXT "", IDC_MACHINELINE5, 130, 180, 118, 9 CONTROL "ReactOS ホームページã¸è¡Œã", IDC_ROSHOMEPAGE_LINK, "SysLink", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 200, 140, 10 - PUSHBUTTON "ライセンスを表 示(&L)...", IDC_LICENCE, 170, 199, 78, 13 + PUSHBUTTON "ライセンスを表示(&L)...", IDC_LICENCE, 170, 199, 78, 13 END @@ -29,7 +29,7 @@ FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN GROUPBOX "デãƒã‚¤ã‚¹ マãƒãƒ¼ã‚¸ãƒ£", IDC_STATIC, 6, 7, 244, 61 ICON IDI_DEVMGR, IDC_STATIC, 12, 18, 23, 21, SS_ICON - LTEXT "デãƒã‚¤ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã¯ã‚³ãƒ³ãƒ”ュータã«è£…ç€ã•れã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’表 示 ã—ã¾ã™ã€‚å„デãƒã‚¤ã‚¹ã®ãƒ—ロパティを変更ã™ã‚‹ã«ã¯ãƒ‡ãƒã‚¤ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã‚’使用 ã—ã¦ãã ã•ã„。", IDC_STATIC, 42, 18, 204, 24 + LTEXT "デãƒã‚¤ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã¯ã‚³ãƒ³ãƒ”ュータã«è£…ç€ã•れã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’表示 ã—ã¾ã™ã€‚å„デãƒã‚¤ã‚¹ã®ãƒ—ロパティを変更ã™ã‚‹ã«ã¯ãƒ‡ãƒã‚¤ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã‚’使用 ã—ã¦ãã ã•ã„。", IDC_STATIC, 42, 18, 204, 24 PUSHBUTTON "デãƒã‚¤ã‚¹ マãƒãƒ¼ã‚¸ãƒ£(&D)...", IDC_HARDWARE_DEVICE_MANAGER, 154, 48, 90, 15 GROUPBOX "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ ウィザード", IDC_STATIC, 6, 79, 244, 61 @@ -39,7 +39,7 @@ BEGIN GROUPBOX "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイル", IDC_STATIC, 6, 149, 244, 61 ICON IDI_HARDPROF, IDC_STATIC, 12, 160, 23, 21, SS_ICON - LTEXT "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ—ロファイルã¯åˆ¥ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ§‹ æˆã‚’設定ã—ã€æ ¼ç´ã™ã‚‹æ–¹æ³•ã‚’ æä¾›ã—ã¾ã™ã€‚", IDC_STATIC, 42, 160, 204, 24 + LTEXT "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒ—ロファイルã¯åˆ¥ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ§‹æˆã‚’設定ã—ã€æ ¼ç´ã™ã‚‹æ–¹æ³•ã‚’ æä¾›ã—ã¾ã™ã€‚", IDC_STATIC, 42, 160, 204, 24 PUSHBUTTON "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイル(&W)...", IDC_HARDWARE_PROFILE, 154, 190, 90, 15 END @@ -86,8 +86,8 @@ CAPTION "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイル" FONT 9, "MS UI Gothic" BEGIN ICON IDI_HARDPROF, IDC_STATIC, 8, 11, 18, 20, SS_ICON - LTEXT "ç•°ãªã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢æ§‹ æˆã«åˆã‚ã›ãŸãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイルをセットアップã§ãã¾ã™ã€‚ 起動時ã«ä½¿ç”¨ã™ã‚‹ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã§ãã¾ã™ã€‚", IDC_STATIC, 46, 11, 188, 25 - LTEXT "利用å¯èƒ½ ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイル:", IDC_STATIC, 8, 41, 120, 8 + LTEXT "ç•°ãªã‚‹ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢æ§‹æˆã«åˆã‚ã›ãŸãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイルをセットアップã§ãã¾ã™ã€‚ 起動時ã«ä½¿ç”¨ã™ã‚‹ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã§ãã¾ã™ã€‚", IDC_STATIC, 46, 11, 188, 25 + LTEXT "利用å¯èƒ½ãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ プロファイル:", IDC_STATIC, 8, 41, 120, 8 LISTBOX IDC_HRDPROFLSTBOX, 8, 52, 215, 54, LBS_NOTIFY PUSHBUTTON "", IDC_HRDPROFUP, 232, 59, 15, 14, BS_ICON | WS_DISABLED PUSHBUTTON "", IDC_HRDPROFDWN, 232, 79, 15, 14, BS_ICON | WS_DISABLED @@ -169,11 +169,11 @@ BEGIN GROUPBOX "システムã®èµ·å‹•", IDC_STATIC, 7, 12, 238, 95 LTEXT "既定ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚° システム(&S):", IDC_STATIC, 14, 26, 100, 8 COMBOBOX IDC_STRECOSCOMBO, 14, 37, 224, 46, CBS_DROPDOWNLIST - AUTOCHECKBOX "オペレーティング システムã®ä¸€è¦§ã‚’表 示ã™ã‚‹æ™‚é–“(&T):", IDC_STRECLIST, 14, 56, 160, 8 + AUTOCHECKBOX "オペレーティング システムã®ä¸€è¦§ã‚’表示ã™ã‚‹æ™‚é–“(&T):", IDC_STRECLIST, 14, 56, 160, 8 EDITTEXT IDC_STRRECLISTEDIT, 185, 54, 30, 12, ES_NUMBER CONTROL "", IDC_STRRECLISTUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13 LTEXT "ç§’", IDC_STATIC, 223, 56, 18, 8 - AUTOCHECKBOX "å¿…è¦ãªã¨ãã«ä¿®å¾©ã‚ªãƒ—ションを表 示ã™ã‚‹æ™‚é–“(&D):", IDC_STRRECREC, 14, 70, 170, 8 + AUTOCHECKBOX "å¿…è¦ãªã¨ãã«ä¿®å¾©ã‚ªãƒ—ションを表示ã™ã‚‹æ™‚é–“(&D):", IDC_STRRECREC, 14, 70, 170, 8 EDITTEXT IDC_STRRECRECEDIT, 185, 68, 30, 12, ES_NUMBER CONTROL "", IDC_STRRECRECUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13 LTEXT "ç§’", IDC_STATIC, 223, 70, 18, 8 diff --git a/reactos/dll/cpl/telephon/lang/ja-JP.rc b/reactos/dll/cpl/telephon/lang/ja-JP.rc index 356fc2117a2..4f715db656a 100644 --- a/reactos/dll/cpl/telephon/lang/ja-JP.rc +++ b/reactos/dll/cpl/telephon/lang/ja-JP.rc @@ -3,5 +3,5 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_CPLSYSTEMNAME "電話ã¨ãƒ¢ãƒ‡ãƒ ã®ã‚ªãƒ—ション" - IDS_CPLSYSTEMDESCRIPTION "電話ã®ãƒ€ã‚¤ãƒ¤ãƒ«æƒ…å ±ã¨ãƒ¢ãƒ‡ãƒ ã®ãƒ—ロパティを構 æˆã—ã¾ã™ã€‚" + IDS_CPLSYSTEMDESCRIPTION "電話ã®ãƒ€ã‚¤ãƒ¤ãƒ«æƒ…å ±ã¨ãƒ¢ãƒ‡ãƒ ã®ãƒ—ロパティを構æˆã—ã¾ã™ã€‚" END diff --git a/reactos/dll/win32/netcfgx/lang/ja-JP.rc b/reactos/dll/win32/netcfgx/lang/ja-JP.rc index a0785a6c6e7..567846f1dbc 100644 --- a/reactos/dll/win32/netcfgx/lang/ja-JP.rc +++ b/reactos/dll/win32/netcfgx/lang/ja-JP.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "全般" FONT 9, "MS UI Gothic" BEGIN - LTEXT "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã“ã®æ©Ÿèƒ½ ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã‚‹å ´åˆã¯ã€IP 設定を自動的ã«å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚サãƒãƒ¼ãƒˆã•れã¦ã„ãªã„å ´åˆã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã«é©åˆ‡ãª IP 設定をå•ã„åˆã‚ã›ã¦ãã ã•ã„。", -1, 9, 9, 228, 27 + LTEXT "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã“ã®æ©Ÿèƒ½ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã‚‹å ´åˆã¯ã€IP 設定を自動的ã«å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚サãƒãƒ¼ãƒˆã•れã¦ã„ãªã„å ´åˆã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç®¡ç†è€…ã«é©åˆ‡ãª IP 設定をå•ã„åˆã‚ã›ã¦ãã ã•ã„。", -1, 9, 9, 228, 27 CONTROL "IP アドレスを自動的ã«å–å¾—ã™ã‚‹", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP, 14, 43, 210, 12 GROUPBOX "", -1, 9, 61, 228, 70, BS_GROUPBOX CONTROL "次㮠IP アドレスを使ã†(&U):", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON, 14, 59, 105, 12 diff --git a/reactos/dll/win32/netid/lang/ja-JP.rc b/reactos/dll/win32/netid/lang/ja-JP.rc index 5af13ab938a..7aa1923efb1 100644 --- a/reactos/dll/win32/netid/lang/ja-JP.rc +++ b/reactos/dll/win32/netid/lang/ja-JP.rc @@ -67,7 +67,7 @@ BEGIN 22 "%1 ワークグループã¸ã‚ˆã†ã“ã。" 23 "%1 ドメインã¸ã‚ˆã†ã“ã。" 24 "変更を有効ã«ã™ã‚‹ã«ã¯ã€ã‚³ãƒ³ãƒ”ュータをå†èµ·å‹•ã—ã¦ãã ã•ã„。" - 25 "ã“ã®ã‚³ãƒ³ãƒ”ュータã®åå‰ã¨ãƒ¡ãƒ³ãƒã‚·ãƒƒãƒ—を変更ã§ãã¾ã™ã€‚変更ã™ã‚‹ã¨ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ リソ ースã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«å½±éŸ¿ã™ã‚‹å¯èƒ½ 性ãŒã‚りã¾ã™ã€‚" + 25 "ã“ã®ã‚³ãƒ³ãƒ”ュータã®åå‰ã¨ãƒ¡ãƒ³ãƒã‚·ãƒƒãƒ—を変更ã§ãã¾ã™ã€‚変更ã™ã‚‹ã¨ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ リソースã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«å½±éŸ¿ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" 1021 "注æ„: ã“ã®ã‚³ãƒ³ãƒ”ュータ㮠ID を変更ã§ãã‚‹ã®ã¯ç®¡ç†è€…ã®ã¿ã§ã™ã€‚" 1022 "注æ„: 次ã®ç†ç”±ã«ã‚ˆã‚Šã€ã“ã®ã‚³ãƒ³ãƒ”ュータ㮠ID を変更ã§ãã¾ã›ã‚“:" 1030 "æ–°ã—ã„コンピュータå ""%s"" ã«ã¯ã€ä½¿ç”¨ã§ããªã„ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚使用ã§ããªã„文字㯠` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' "" , . < > / ? ã§ã™ã€‚" diff --git a/reactos/dll/win32/newdev/lang/ja-JP.rc b/reactos/dll/win32/newdev/lang/ja-JP.rc index 7b625783bf5..f9849dd38e5 100644 --- a/reactos/dll/win32/newdev/lang/ja-JP.rc +++ b/reactos/dll/win32/newdev/lang/ja-JP.rc @@ -11,7 +11,7 @@ BEGIN IDC_STATIC,120,21,195,30 LTEXT "続行ã™ã‚‹ã«ã¯ã€[次ã¸] をクリックã—ã¦ãã ã•ã„。",IDC_STATIC,120,169,195,17 LTEXT "䏿˜Žãªãƒ‡ãƒã‚¤ã‚¹",IDC_DEVICE,134,52,164,11 - LTEXT "警告! カスタム デãƒã‚¤ã‚¹ã‚’インストールã™ã‚‹ã¨ã€ã‚³ãƒ³ãƒ”ュータãŒãƒ•リーズã—ãŸã‚Šã€èµ·å‹•ä¸èƒ½ ã«ãªã‚‹å¯èƒ½ 性ãŒã‚りã¾ã™!",IDC_STATIC,120,67,195,34 + LTEXT "警告! カスタム デãƒã‚¤ã‚¹ã‚’インストールã™ã‚‹ã¨ã€ã‚³ãƒ³ãƒ”ュータãŒãƒ•リーズã—ãŸã‚Šã€èµ·å‹•ä¸èƒ½ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™!",IDC_STATIC,120,67,195,34 CONTROL "ドライãƒã‚’自動的ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹",IDC_RADIO_AUTO,"Button", BS_AUTORADIOBUTTON,120,112,178,13 CONTROL "ドライãƒã‚’特定ã®å ´æ‰€ã‹ã‚‰ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹",IDC_RADIO_MANUAL, @@ -29,7 +29,7 @@ BEGIN IDC_STATIC,120,40,195,19 LTEXT "ドライãƒã®ãƒ‡ã‚£ã‚¹ã‚¯ã‚’æŒã£ã¦ã„ãŸã‚Šã€ãƒ‰ãƒ©ã‚¤ãƒã¸ã®ãƒ‘スを知ã£ã¦ã„ã‚‹å ´åˆã¯ã€[戻る] をクリックã—ã¦ãã ã•ã„。", IDC_STATIC,120,98,181,24 - CONTROL "ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’今後表 示ã—ãªã„",IDC_DONOTSHOWDLG,"Button", + CONTROL "ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’今後表示ã—ãªã„",IDC_DONOTSHOWDLG,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,120,170,180,11 END @@ -40,7 +40,7 @@ CAPTION "デãƒã‚¤ã‚¹ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" FONT 9, "MS UI Gothic" BEGIN LTEXT "インストール失敗",IDC_FINISHTITLE,120,8,195,24 - LTEXT "予 期ã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒ‡ãƒã‚¤ã‚¹ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã›ã‚“ã§ã—ãŸã€‚", + LTEXT "予期ã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒ‡ãƒã‚¤ã‚¹ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã›ã‚“ã§ã—ãŸã€‚", IDC_STATIC,120,40,195,19 LTEXT "䏿˜Žãªãƒ‡ãƒã‚¤ã‚¹",IDC_DEVICE,134,55,164,11 END diff --git a/reactos/dll/win32/syssetup/lang/ja-JP.rc b/reactos/dll/win32/syssetup/lang/ja-JP.rc index 29012aca6cf..5bbc7b4469a 100644 --- a/reactos/dll/win32/syssetup/lang/ja-JP.rc +++ b/reactos/dll/win32/syssetup/lang/ja-JP.rc @@ -36,13 +36,13 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS CAPTION "ReactOS セットアップ" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN - LTEXT "ReactOSã®é–‹ç™ºè€…よりã€ä¸‹è¨˜ã®ã‚ªãƒ¼ãƒ—ンソ ース ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã«æ„Ÿè¬ã®æ„を表 明ã—ã¾ã™ã€‚ ã“れらã®ã™ã¹ã¦ã¾ãŸã¯ä¸€éƒ¨ã¯ReactOSã®é–‹ç™ºã«åˆ©ç”¨ã•れã¾ã—ãŸã€‚", + LTEXT "ReactOSã®é–‹ç™ºè€…よりã€ä¸‹è¨˜ã®ã‚ªãƒ¼ãƒ—ンソース ãƒ—ãƒ­ã‚¸ã‚§ã‚¯ãƒˆã«æ„Ÿè¬ã®æ„を表明ã—ã¾ã™ã€‚ ã“れらã®ã™ã¹ã¦ã¾ãŸã¯ä¸€éƒ¨ã¯ReactOSã®é–‹ç™ºã«åˆ©ç”¨ã•れã¾ã—ãŸã€‚", IDC_STATIC,15,7,286,19 LISTBOX IDC_PROJECTS,15,30,286,75,LBS_NOSEL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL LTEXT "ReactOSã¯GPLã®ä¸‹ã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã•れã¦ãŠã‚Šã€ã™ã¹ã¦ã¾ãŸã¯ä¸€éƒ¨ã‚’å†åˆ©ç”¨ã€ å†é…布ã™ã‚‹å ´åˆã¯GPLã«å¾“ã†å¿…è¦ãŒã‚りã¾ã™ã€‚", IDC_STATIC,15,110,227,19 - PUSHBUTTON "GPLを表 示(&V)...",IDC_VIEWGPL,251,110,50,19 + PUSHBUTTON "GPLを表示(&V)...",IDC_VIEWGPL,251,110,50,19 LTEXT "セットアップを続行ã™ã‚‹ã«ã¯ [次ã¸] をクリックã—ã¦ãã ã•ã„。",IDC_STATIC,15,136, 195,17 END @@ -91,7 +91,7 @@ CAPTION "ReactOS セットアップ" FONT 9, "MS UI Gothic" BEGIN ICON IDI_ICON4, IDC_STATIC, 21, 7, 20, 20 - LTEXT "システムã®ãƒ­ã‚±ãƒ¼ãƒ«ã‚’ã€ã‚¢ãƒ—リケーションã§ä½¿ç”¨ã—ãŸã„言語ã«è¨­å®šã—ã¦ãã ã•ã„。 ユーザーロケールã¯ã€æ•°å€¤ã€é€šè²¨ã€æ—¥ä»˜ã®è¡¨ 示方法を制御ã—ã¾ã™ã€‚ ", IDC_STATIC, 53, 7, 253, 20 + LTEXT "システムã®ãƒ­ã‚±ãƒ¼ãƒ«ã‚’ã€ã‚¢ãƒ—リケーションã§ä½¿ç”¨ã—ãŸã„言語ã«è¨­å®šã—ã¦ãã ã•ã„。 ユーザーロケールã¯ã€æ•°å€¤ã€é€šè²¨ã€æ—¥ä»˜ã®è¡¨ç¤ºæ–¹æ³•を制御ã—ã¾ã™ã€‚ ", IDC_STATIC, 53, 7, 253, 20 LTEXT "", IDC_LOCALETEXT, 53, 29, 250, 16 LTEXT "システムã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ­ã‚±ãƒ¼ãƒ«è¨­å®šå¤‰æ›´ã«ã¯[カスタマイズ]をクリックã—ã¾ã™ã€‚", IDC_STATIC, 53, 50, 166, 25 @@ -172,7 +172,7 @@ STRINGTABLE BEGIN IDS_ACKTITLE "承èª" IDS_ACKSUBTITLE "ReactOS ãŒåˆ©ç”¨ã—ã¦ã„るプロジェクトã¨ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«é–¢ã™ã‚‹æƒ…å ±" - IDS_OWNERTITLE "ソ フトウェアã®å€‹äººç”¨è¨­å®š" + IDS_OWNERTITLE "ソフトウェアã®å€‹äººç”¨è¨­å®š" IDS_OWNERSUBTITLE "ã“ã®æƒ…å ±ã¯ã€ReactOS ã®å€‹äººç”¨è¨­å®šã«ç”¨ã„られã¾ã™ã€‚" IDS_COMPUTERTITLE "コンピュータå㨠Administrator パスワード" IDS_COMPUTERSUBTITLE "コンピュータå㨠Administrator パスワードを入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" @@ -197,7 +197,7 @@ BEGIN IDS_CMT_DEVMGMT "デãƒã‚¤ã‚¹ マãƒãƒ¼ã‚¸ãƒ£ã‚’èµ·å‹•ã—ã¾ã™" IDS_CMT_EVENTVIEW "イベント ビューアを起動ã—ã¾ã™" IDS_CMT_EXPLORER "エクスプローラを起動ã—ã¾ã™" - IDS_CMT_MSCONFIG "ã‚·ã‚¹ãƒ†ãƒ ã®æ§‹ æˆãƒ—ログラムを開ãã¾ã™" + IDS_CMT_MSCONFIG "ã‚·ã‚¹ãƒ†ãƒ ã®æ§‹æˆãƒ—ログラムを開ãã¾ã™" IDS_CMT_NOTEPAD "テキストエディタを起動ã—ã¾ã™" IDS_CMT_RDESKTOP "リモート デスクトップを起動ã—ã¾ã™" IDS_CMT_REGEDIT "レジストリ エディタを起動ã—ã¾ã™" @@ -210,9 +210,9 @@ END STRINGTABLE BEGIN IDS_GAMES "ゲーム" - IDS_CMT_SOLITAIRE "ソ リティア" + IDS_CMT_SOLITAIRE "ソリティア" IDS_CMT_WINEMINE "WineMine" - IDS_CMT_SPIDER "スパイダ ソ リティア" + IDS_CMT_SPIDER "スパイダ ソリティア" END STRINGTABLE @@ -253,7 +253,7 @@ END STRINGTABLE BEGIN IDS_SHORT_CALC "é›»å“.lnk" - IDS_SHORT_CHARMAP "文字コード表 .lnk" + IDS_SHORT_CHARMAP "文字コード表.lnk" IDS_SHORT_CMD "コマンド プロンプト.lnk" IDS_SHORT_DEVICE "デãƒã‚¤ã‚¹ マãƒãƒ¼ã‚¸ãƒ£.lnk" IDS_SHORT_DOWNLOADER "ReactOS アプリケーション マãƒãƒ¼ã‚¸ãƒ£.lnk" @@ -263,7 +263,7 @@ BEGIN IDS_SHORT_KBSWITCH "キーボード レイアウト 切替器.lnk" IDS_SHORT_MAGNIFY "拡大é¡.lnk" IDS_SHORT_MPLAY32 "マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ プレーヤ.lnk" - IDS_SHORT_MSCONFIG "ã‚·ã‚¹ãƒ†ãƒ ã®æ§‹ æˆ.lnk" + IDS_SHORT_MSCONFIG "ã‚·ã‚¹ãƒ†ãƒ ã®æ§‹æˆ.lnk" IDS_SHORT_NOTEPAD "メモ帳.lnk" IDS_SHORT_RDESKTOP "リモート デスクトップ接続.lnk" IDS_SHORT_REGEDIT "レジストリ エディタ.lnk" @@ -271,11 +271,11 @@ BEGIN IDS_SHORT_SNAP "スナップショット.lnk" IDS_SHORT_SNDVOL32 "ボリューム コントロール.lnk" IDS_SHORT_SNDREC32 "オーディオレコーダ.lnk" - IDS_SHORT_SOLITAIRE "ソ リティア.lnk" + IDS_SHORT_SOLITAIRE "ソリティア.lnk" IDS_SHORT_WINEMINE "WineMine.lnk" IDS_SHORT_WORDPAD "ワードパッド.lnk" IDS_SHORT_PAINT "ペイント.lnk" - IDS_SHORT_SPIDER "スパイダ ソ リティア.lnk" + IDS_SHORT_SPIDER "スパイダ ソリティア.lnk" END STRINGTABLE From cbfb30da1ceff26cac4b4e7604e2aac89debf84a Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Wed, 20 Mar 2013 15:50:52 +0000 Subject: [PATCH 28/74] [UUID] Remove IID_IDeskBarClient. It is already in shlguid.h. svn path=/trunk/; revision=58559 --- reactos/lib/sdk/uuid/otherguids.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/lib/sdk/uuid/otherguids.c b/reactos/lib/sdk/uuid/otherguids.c index 986a42ca409..69361d1af89 100644 --- a/reactos/lib/sdk/uuid/otherguids.c +++ b/reactos/lib/sdk/uuid/otherguids.c @@ -48,7 +48,6 @@ DEFINE_GUID(GUID_COMPARTMENT_TIPUISTATUS, 0x148ca3ec,0x0366,0x401c,0x8 DEFINE_GUID(IID_IDsObjectPicker, 0x0c87e64e, 0x3b7a, 0x11d2, 0x00b9, 0xe0,0x00,0xc0,0x4f,0xd8,0xdb,0xf7); DEFINE_GUID(CLSID_DsObjectPicker, 0x17d6ccd8, 0x3b7b, 0x11d2, 0x00b9, 0xe0,0x00,0xc0,0x4f,0xd8,0xdb,0xf7); -DEFINE_GUID(IID_IDeskBarClient, 0xEB0FE175, 0x1A3A, 0x11D0, 0x89,0xB3, 0x00,0xA0,0xC9,0x0A,0x90,0xAC); DEFINE_GUID(CLSID_StdPicture, 0x0BE35204, 0x8F91, 0x11CE, 0x9D,0xE3, 0x00,0xAA,0x00,0x4B,0xB8,0x51); DEFINE_GUID(CLSID_StdFont, 0x0BE35203, 0x8F91, 0x11CE, 0x9D,0xE3, 0x00,0xAA,0x00,0x4B,0xB8,0x51); From 936f15a924439ef8fad3a0e4f67c71e36e9afa8b Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 20 Mar 2013 20:52:59 +0000 Subject: [PATCH 29/74] [SAMSRV] Calculate PasswordCanChange and PasswordMustChange time for SamQueryInformationUser.UserLogonInformation and SamQueryInformationUser.UserAllInformation. svn path=/trunk/; revision=58560 --- reactos/dll/win32/samsrv/samrpc.c | 70 ++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/samsrv/samrpc.c b/reactos/dll/win32/samsrv/samrpc.c index 2471f01b69c..fd1d4f34684 100644 --- a/reactos/dll/win32/samsrv/samrpc.c +++ b/reactos/dll/win32/samsrv/samrpc.c @@ -62,6 +62,22 @@ PGENERIC_MAPPING pServerMapping = &ServerMapping; /* FUNCTIONS *****************************************************************/ +static +LARGE_INTEGER +SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime, + IN LARGE_INTEGER RelativeTime) +{ + LARGE_INTEGER NewTime; + + NewTime.QuadPart = AbsoluteTime.QuadPart - RelativeTime.QuadPart; + + if (NewTime.QuadPart < 0) + NewTime.QuadPart = 0; + + return NewTime; +} + + VOID SampStartRpcServer(VOID) { @@ -5269,7 +5285,10 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject, PSAMPR_USER_INFO_BUFFER *Buffer) { PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL; + SAM_DOMAIN_FIXED_DATA DomainFixedData; SAM_USER_FIXED_DATA FixedData; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; ULONG Length = 0; NTSTATUS Status; @@ -5279,6 +5298,17 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject, if (InfoBuffer == NULL) return STATUS_INSUFFICIENT_RESOURCES; + /* Get the fixed size domain data */ + Length = sizeof(SAM_DOMAIN_FIXED_DATA); + Status = SampGetObjectAttribute(UserObject->ParentObject, + L"F", + NULL, + (PVOID)&DomainFixedData, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + /* Get the fixed size user data */ Length = sizeof(SAM_USER_FIXED_DATA); Status = SampGetObjectAttribute(UserObject, L"F", @@ -5300,8 +5330,15 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject, InfoBuffer->Logon.LogonCount = FixedData.LogonCount; InfoBuffer->Logon.UserAccountControl = FixedData.UserAccountControl; -// OLD_LARGE_INTEGER PasswordCanChange; -// OLD_LARGE_INTEGER PasswordMustChange; + PasswordCanChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MinPasswordAge); + InfoBuffer->Logon.PasswordCanChange.LowPart = PasswordCanChange.LowPart; + InfoBuffer->Logon.PasswordCanChange.HighPart = PasswordCanChange.HighPart; + + PasswordMustChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MaxPasswordAge); + InfoBuffer->Logon.PasswordMustChange.LowPart = PasswordMustChange.LowPart; + InfoBuffer->Logon.PasswordMustChange.HighPart = PasswordMustChange.HighPart; /* Get the Name string */ Status = SampGetObjectAttributeString(UserObject, @@ -6184,7 +6221,10 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject, PSAMPR_USER_INFO_BUFFER *Buffer) { PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL; + SAM_DOMAIN_FIXED_DATA DomainFixedData; SAM_USER_FIXED_DATA FixedData; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; ULONG Length = 0; NTSTATUS Status; @@ -6194,6 +6234,17 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject, if (InfoBuffer == NULL) return STATUS_INSUFFICIENT_RESOURCES; + /* Get the fixed size domain data */ + Length = sizeof(SAM_DOMAIN_FIXED_DATA); + Status = SampGetObjectAttribute(UserObject->ParentObject, + L"F", + NULL, + (PVOID)&DomainFixedData, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + /* Get the fixed size user data */ Length = sizeof(SAM_USER_FIXED_DATA); Status = SampGetObjectAttribute(UserObject, L"F", @@ -6324,8 +6375,15 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject, InfoBuffer->All.LogonCount = FixedData.LogonCount; -// USER_ALL_PASSWORDCANCHANGE -// USER_ALL_PASSWORDMUSTCHANGE + PasswordCanChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MinPasswordAge); + InfoBuffer->All.PasswordCanChange.LowPart = PasswordCanChange.LowPart; + InfoBuffer->All.PasswordCanChange.HighPart = PasswordCanChange.HighPart; + + PasswordMustChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet, + DomainFixedData.MaxPasswordAge); + InfoBuffer->All.PasswordMustChange.LowPart = PasswordMustChange.LowPart; + InfoBuffer->All.PasswordMustChange.HighPart = PasswordMustChange.HighPart; InfoBuffer->All. WhichFields |= /* USER_ALL_READ_LOGON_MASK; */ USER_ALL_HOMEDIRECTORY | @@ -6338,8 +6396,8 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject, // USER_ALL_LOGONHOURS | USER_ALL_BADPASSWORDCOUNT | USER_ALL_LOGONCOUNT; -// USER_ALL_PASSWORDCANCHANGE | -// USER_ALL_PASSWORDMUSTCHANGE; + USER_ALL_PASSWORDCANCHANGE | + USER_ALL_PASSWORDMUSTCHANGE; } if (UserObject->Access & USER_READ_ACCOUNT) From 57c1f4904ad9693b3dcd7b445e5af073b16a15e1 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 20 Mar 2013 21:23:19 +0000 Subject: [PATCH 30/74] [newdev] - Dialog procs should return FALSE instead of calling DefWindowProc. Fixes mouse activation of the window when the user clicks in the client area svn path=/trunk/; revision=58561 --- reactos/dll/win32/newdev/wizard.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/newdev/wizard.c b/reactos/dll/win32/newdev/wizard.c index 658d71da5af..44813f71649 100644 --- a/reactos/dll/win32/newdev/wizard.c +++ b/reactos/dll/win32/newdev/wizard.c @@ -493,7 +493,7 @@ WelcomeDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static void @@ -656,7 +656,7 @@ CHSourceDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -751,7 +751,7 @@ SearchDrvDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -857,7 +857,7 @@ InstallDrvDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -972,7 +972,7 @@ NoDriverDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -1051,7 +1051,7 @@ InstallFailedDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -1130,7 +1130,7 @@ NeedRebootDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static INT_PTR CALLBACK @@ -1209,7 +1209,7 @@ FinishDlgProc( break; } - return DefWindowProc(hwndDlg, uMsg, wParam, lParam); + return FALSE; } static HFONT From 5301efbae624a7a09f4a37b2e0b5adef0171a7a9 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 20 Mar 2013 22:31:42 +0000 Subject: [PATCH 31/74] [Win32k|User32] - Use set foreground instead of setting active during a mouse click. Add support hack since this should be handled on server side. - This is an ATI patch fix. svn path=/trunk/; revision=58562 --- reactos/win32ss/user/ntuser/focus.c | 11 +++++++++++ reactos/win32ss/user/ntuser/focus.h | 1 + reactos/win32ss/user/ntuser/simplecall.c | 6 ++++++ reactos/win32ss/user/user32/windows/nonclient.c | 3 ++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/reactos/win32ss/user/ntuser/focus.c b/reactos/win32ss/user/ntuser/focus.c index 45025e92bc1..de9e3a3bb1d 100644 --- a/reactos/win32ss/user/ntuser/focus.c +++ b/reactos/win32ss/user/ntuser/focus.c @@ -862,6 +862,17 @@ co_IntSetForegroundWindow(PWND Window) return co_IntSetForegroundAndFocusWindow(Window, FALSE); } +/* + API Call +*/ +BOOL FASTCALL +co_IntSetForegroundWindowMouse(PWND Window) +{ + if (Window) ASSERT_REFS_CO(Window); + + return co_IntSetForegroundAndFocusWindow(Window, TRUE); +} + /* API Call */ diff --git a/reactos/win32ss/user/ntuser/focus.h b/reactos/win32ss/user/ntuser/focus.h index e2fc7ad0253..48ac7efacd1 100644 --- a/reactos/win32ss/user/ntuser/focus.h +++ b/reactos/win32ss/user/ntuser/focus.h @@ -19,5 +19,6 @@ HWND FASTCALL UserGetActiveWindow(VOID); BOOL FASTCALL co_IntMouseActivateWindow(PWND Window); BOOL FASTCALL co_IntSetForegroundWindow(PWND Window); BOOL FASTCALL co_IntSetActiveWindow(PWND,HWND *,BOOL,BOOL,BOOL); +BOOL FASTCALL co_IntSetForegroundWindowMouse(PWND Window); BOOL FASTCALL IntLockSetForegroundWindow(UINT uLockCode); BOOL FASTCALL IntAllowSetForegroundWindow(DWORD dwProcessId); diff --git a/reactos/win32ss/user/ntuser/simplecall.c b/reactos/win32ss/user/ntuser/simplecall.c index 42eb59150b2..7309ab450d0 100644 --- a/reactos/win32ss/user/ntuser/simplecall.c +++ b/reactos/win32ss/user/ntuser/simplecall.c @@ -577,6 +577,12 @@ NtUserCallHwndLock( TRACE("co_IntSetForegroundWindow 2 \n"); break; + case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE: + TRACE("co_IntSetForegroundWindow 1 0x%p\n",hWnd); + Ret = co_IntSetForegroundWindowMouse(Window); + TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd); + break; + case HWNDLOCK_ROUTINE_UPDATEWINDOW: Ret = co_UserRedrawWindow( Window, NULL, 0, RDW_UPDATENOW | RDW_ALLCHILDREN); break; diff --git a/reactos/win32ss/user/user32/windows/nonclient.c b/reactos/win32ss/user/user32/windows/nonclient.c index 01e8c8e98f9..713e2c00d0c 100644 --- a/reactos/win32ss/user/user32/windows/nonclient.c +++ b/reactos/win32ss/user/user32/windows/nonclient.c @@ -987,7 +987,8 @@ DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) case HTCAPTION: { HWND hTopWnd = GetAncestor(hWnd, GA_ROOT); - if (SetActiveWindow(hTopWnd) || GetActiveWindow() == hTopWnd) + if ( NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) || + GetActiveWindow() == hTopWnd) { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam); } From ff1c3bc21e7f47d9a8bc96fdd82f5b71d3e32754 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 20 Mar 2013 22:34:48 +0000 Subject: [PATCH 32/74] - Add missing file for revision 58562. svn path=/trunk/; revision=58563 --- reactos/win32ss/include/ntuser.h | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/win32ss/include/ntuser.h b/reactos/win32ss/include/ntuser.h index c123cc79b6b..c345006020e 100644 --- a/reactos/win32ss/include/ntuser.h +++ b/reactos/win32ss/include/ntuser.h @@ -3310,6 +3310,7 @@ typedef struct tagKMDDELPARAM #define TWOPARAM_ROUTINE_SETMENUBARHEIGHT 0xfffd0050 #define TWOPARAM_ROUTINE_EXITREACTOS 0xfffd0051 #define TWOPARAM_ROUTINE_SETGUITHRDHANDLE 0xfffd0052 +#define HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE 0xfffd0053 #define MSQ_STATE_CAPTURE 0x1 #define MSQ_STATE_ACTIVE 0x2 #define MSQ_STATE_FOCUS 0x3 From 42599af22ded63e6af3b8946bb690f1e4fbba78d Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Thu, 21 Mar 2013 00:10:58 +0000 Subject: [PATCH 33/74] [HIVES] No need for NAME_ON_CD anymore since the multi arch hive files implementation. (r58271) svn path=/trunk/; revision=58564 --- reactos/boot/bootdata/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/boot/bootdata/CMakeLists.txt b/reactos/boot/bootdata/CMakeLists.txt index 3d03e9ba622..611d1a079b4 100644 --- a/reactos/boot/bootdata/CMakeLists.txt +++ b/reactos/boot/bootdata/CMakeLists.txt @@ -3,10 +3,10 @@ add_subdirectory(packages) #common hives add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/txtsetup.sif DESTINATION reactos NO_CAB FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivecls.inf DESTINATION reactos NO_CAB NAME_ON_CD hivecls.inf FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivedef.inf DESTINATION reactos NO_CAB NAME_ON_CD hivedef.inf FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesft.inf DESTINATION reactos NO_CAB NAME_ON_CD hivesft.inf FOR bootcd regtest) -add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesys.inf DESTINATION reactos NO_CAB NAME_ON_CD hivesys.inf FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivecls.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivedef.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesft.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/hivesys.inf DESTINATION reactos NO_CAB FOR bootcd regtest) # livecd hives list(APPEND CD_HIVES From 62c507de132095cd0c66c5f2fca2472a7b5e5205 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 12:00:26 +0000 Subject: [PATCH 34/74] [CRT] * Annotate mbstring.h. svn path=/trunk/; revision=58565 --- reactos/include/crt/mbstring.h | 1331 ++++++++++++++++++++++++++++---- 1 file changed, 1182 insertions(+), 149 deletions(-) diff --git a/reactos/include/crt/mbstring.h b/reactos/include/crt/mbstring.h index cbcff718617..87ec6e397f0 100644 --- a/reactos/include/crt/mbstring.h +++ b/reactos/include/crt/mbstring.h @@ -31,100 +31,791 @@ extern "C" { #ifndef _MBSTRING_DEFINED #define _MBSTRING_DEFINED - _CRTIMP unsigned char *__cdecl _mbsdup(const unsigned char *_Str); - _CRTIMP unsigned int __cdecl _mbbtombc(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbbtombc_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _mbbtype(unsigned char _Ch,int _CType); - _CRTIMP int __cdecl _mbbtype_l(unsigned char _Ch,int _CType,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctombb(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctombb_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _mbsbtype(const unsigned char *_Str,size_t _Pos); - _CRTIMP int __cdecl _mbsbtype_l(const unsigned char *_Str,size_t _Pos,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbscat(unsigned char *_Dest,const unsigned char *_Source); - _CRTIMP unsigned char *_mbscat_l(unsigned char *_Dest,const unsigned char *_Source,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr(const unsigned char *_Str,unsigned int _Ch); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbschr_l(const unsigned char *_Str,unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _mbscmp(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbscmp_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP int __cdecl _mbscoll(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbscoll_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbscpy(unsigned char *_Dest,const unsigned char *_Source); - _CRTIMP unsigned char *_mbscpy_l(unsigned char *_Dest,const unsigned char *_Source,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbscspn(const unsigned char *_Str,const unsigned char *_Control); - _CRTIMP size_t __cdecl _mbscspn_l(const unsigned char *_Str,const unsigned char *_Control,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsdec(const unsigned char *_Start,const unsigned char *_Pos); - _CRTIMP unsigned char *__cdecl _mbsdec_l(const unsigned char *_Start,const unsigned char *_Pos,_locale_t _Locale); - _CRTIMP int __cdecl _mbsicmp(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbsicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP int __cdecl _mbsicoll(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP int __cdecl _mbsicoll_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsinc(const unsigned char *_Ptr); - _CRTIMP unsigned char *__cdecl _mbsinc_l(const unsigned char *_Ptr,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbslen(const unsigned char *_Str); - _CRTIMP size_t __cdecl _mbslen_l(const unsigned char *_Str,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsnlen(const unsigned char *_Str,size_t _MaxCount); - _CRTIMP size_t __cdecl _mbsnlen_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbslwr(unsigned char *_String); - _CRTIMP unsigned char *_mbslwr_l(unsigned char *_String,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnbcat(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsnbcat_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbcmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbcmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbcoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbcoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsnbcnt(const unsigned char *_Str,size_t _MaxCount); - _CRTIMP size_t __cdecl _mbsnbcnt_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnbcpy(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP int __cdecl _mbsnbcpy_s(unsigned char* dst, size_t size, const unsigned char* src, size_t n); - _CRTIMP unsigned char *__cdecl _mbsnbcpy_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbicmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnbicoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnbicoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnbset(unsigned char *_Str,unsigned int _Ch,size_t _MaxCount); - _CRTIMP unsigned char *__cdecl _mbsnbset_l(unsigned char *_Str,unsigned int _Ch,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsncat(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsncat_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsnccnt(const unsigned char *_Str,size_t _MaxCount); - _CRTIMP size_t __cdecl _mbsnccnt_l(const unsigned char *_Str,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsncmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsncmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsncoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsncoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsncpy(unsigned char *_Dest,const unsigned char *_Source,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsncpy_l(unsigned char *_Dest,const unsigned char *_Source,size_t _Count,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbsnextc (const unsigned char *_Str); - _CRTIMP unsigned int __cdecl _mbsnextc_l(const unsigned char *_Str,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnicmp(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnicmp_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP int __cdecl _mbsnicoll(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount); - _CRTIMP int __cdecl _mbsnicoll_l(const unsigned char *_Str1,const unsigned char *_Str2,size_t _MaxCount,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsninc(const unsigned char *_Str,size_t _Count); - _CRTIMP unsigned char *__cdecl _mbsninc_l(const unsigned char *_Str,size_t _Count,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsnset(unsigned char *_Dst,unsigned int _Val,size_t _MaxCount); - _CRTIMP unsigned char *__cdecl _mbsnset_l(unsigned char *_Dst,unsigned int _Val,size_t _MaxCount,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbspbrk(const unsigned char *_Str,const unsigned char *_Control); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbspbrk_l(const unsigned char *_Str,const unsigned char *_Control,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsrchr(const unsigned char *_Str,unsigned int _Ch); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsrchr_l(const unsigned char *_Str,unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsrev(unsigned char *_Str); - _CRTIMP unsigned char *__cdecl _mbsrev_l(unsigned char *_Str,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsset(unsigned char *_Str,unsigned int _Val); - _CRTIMP unsigned char *__cdecl _mbsset_l(unsigned char *_Str,unsigned int _Val,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbsspn(const unsigned char *_Str,const unsigned char *_Control); - _CRTIMP size_t __cdecl _mbsspn_l(const unsigned char *_Str,const unsigned char *_Control,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsspnp(const unsigned char *_Str1,const unsigned char *_Str2); - _CRTIMP unsigned char *__cdecl _mbsspnp_l(const unsigned char *_Str1,const unsigned char *_Str2,_locale_t _Locale); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsstr(const unsigned char *_Str,const unsigned char *_Substr); - _CRTIMP _CONST_RETURN unsigned char *__cdecl _mbsstr_l(const unsigned char *_Str,const unsigned char *_Substr,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbstok(unsigned char *_Str,const unsigned char *_Delim); - _CRTIMP unsigned char *__cdecl _mbstok_l(unsigned char *_Str,const unsigned char *_Delim,_locale_t _Locale); - _CRTIMP unsigned char *__cdecl _mbsupr(unsigned char *_String); - _CRTIMP unsigned char *_mbsupr_l(unsigned char *_String,_locale_t _Locale); - _CRTIMP size_t __cdecl _mbclen(const unsigned char *_Str); - _CRTIMP size_t __cdecl _mbclen_l(const unsigned char *_Str,_locale_t _Locale); - _CRTIMP void __cdecl _mbccpy(unsigned char *_Dst,const unsigned char *_Src); - _CRTIMP void __cdecl _mbccpy_l(unsigned char *_Dst,const unsigned char *_Src,_locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsdup( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbbtombc( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbbtombc_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbbtype( + _In_ unsigned char _Ch, + _In_ int _CType); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbbtype_l( + _In_ unsigned char _Ch, + _In_ int _CType, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctombb( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctombb_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _CRTIMP + int + __cdecl + _mbsbtype( + _In_reads_bytes_(_Pos) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Pos); + + _CRTIMP + int + __cdecl + _mbsbtype_l( + _In_reads_bytes_(_Pos) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Pos, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbscat( + _Inout_updates_z_(_String_length_(_Curr_) + _String_length_(_Source) + 1) unsigned char *_Dest, + _In_z_ const unsigned char *_Source); + + _CRTIMP + unsigned char* + _mbscat_l( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbschr( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbschr_l( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbscoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbscpy( + _Out_writes_z_(_String_length_(_Source) + 1) unsigned char *_Dest, + _In_z_ const unsigned char *_Source); + + _CRTIMP + unsigned char* + _mbscpy_l( + _Pre_notnull_ _Post_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbscspn( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbscspn_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsdec( + _In_reads_z_(_Pos-_Start + 1) const unsigned char *_Start, + _In_z_ const unsigned char *_Pos); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsdec_l( + _In_reads_z_(_Pos-_Start + 1) const unsigned char *_Start, + _In_z_ const unsigned char *_Pos, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsicoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsinc( + _In_z_ const unsigned char *_Ptr); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsinc_l( + _In_z_ const unsigned char *_Ptr, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbslen( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbslen_l( + _In_z_ const unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnlen( + _In_z_ const unsigned char *_Str, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnlen_l( + _In_z_ const unsigned char *_Str, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbslwr( + _Inout_z_ unsigned char *_String); + + _CRTIMP + unsigned char* + _mbslwr_l( + _Inout_z_ unsigned char *_String, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcat( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcat_l( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbcoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnbcnt( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnbcnt_l( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcpy( + _Out_writes_(_Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + int + __cdecl + _mbsnbcpy_s( + _Out_writes_z_(size) unsigned char* dst, + _In_ size_t size, + _In_z_ const unsigned char* src, + _In_ size_t n); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbcpy_l( + _Out_writes_(_Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnbicoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbset( + _Inout_updates_z_(_MaxCount) unsigned char *_Str, + _In_ unsigned int _Ch, + _In_ size_t _MaxCount); + + _CRTIMP + unsigned char* + __cdecl + _mbsnbset_l( + _Inout_updates_z_(_MaxCount) unsigned char *_Str, + _In_ unsigned int _Ch, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsncat( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + unsigned char* + __cdecl + _mbsncat_l( + _Inout_z_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnccnt( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsnccnt_l( + _In_reads_bytes_(_MaxCount) _Pre_z_ const unsigned char *_Str, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsncoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsncpy( + _Pre_notnull_ _Out_writes_(2 * _Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count); + + _CRTIMP + unsigned char* + __cdecl + _mbsncpy_l( + _Out_writes_(_Count) _Post_maybez_ unsigned char *_Dest, + _In_z_ const unsigned char *_Source, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbsnextc( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbsnextc_l( + _In_z_ const unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicmp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicmp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicoll( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount); + + _Check_return_ + _CRTIMP + int + __cdecl + _mbsnicoll_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsninc( + _In_reads_bytes_(_Count) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Count); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsninc_l( + _In_reads_bytes_(_Count) _Pre_z_ const unsigned char *_Str, + _In_ size_t _Count, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsnset( + _Inout_updates_z_(_MaxCount) unsigned char *_Dst, + _In_ unsigned int _Val, + _In_ size_t _MaxCount); + + _CRTIMP + unsigned char* + __cdecl + _mbsnset_l( + _Inout_updates_z_(_MaxCount) unsigned char *_Dst, + _In_ unsigned int _Val, + _In_ size_t _MaxCount, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbspbrk( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbspbrk_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsrchr( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsrchr_l( + _In_z_ const unsigned char *_Str, + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsrev( + _Inout_z_ unsigned char *_Str); + + _CRTIMP + unsigned char* + __cdecl + _mbsrev_l( + _Inout_z_ unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsset( + _Inout_z_ unsigned char *_Str, + _In_ unsigned int _Val); + + _CRTIMP + unsigned char* + __cdecl + _mbsset_l( + _Inout_z_ unsigned char *_Str, + _In_ unsigned int _Val, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsspn( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbsspn_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Control, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsspnp( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbsspnp_l( + _In_z_ const unsigned char *_Str1, + _In_z_ const unsigned char *_Str2, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsstr( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Substr); + + _Check_return_ + _CRTIMP + _CONST_RETURN + unsigned char* + __cdecl + _mbsstr_l( + _In_z_ const unsigned char *_Str, + _In_z_ const unsigned char *_Substr, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbstok( + _Inout_opt_z_ unsigned char *_Str, + _In_z_ const unsigned char *_Delim); + + _Check_return_ + _CRTIMP + unsigned char* + __cdecl + _mbstok_l( + _Inout_opt_z_ unsigned char *_Str, + _In_z_ const unsigned char *_Delim, + _In_opt_ _locale_t _Locale); + + _CRTIMP + unsigned char* + __cdecl + _mbsupr( + _Inout_z_ unsigned char *_String); + + _CRTIMP + unsigned char* + _mbsupr_l( + _Inout_z_ unsigned char *_String, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbclen( + _In_z_ const unsigned char *_Str); + + _Check_return_ + _CRTIMP + size_t + __cdecl + _mbclen_l( + _In_z_ const unsigned char *_Str, + _In_opt_ _locale_t _Locale); + + _CRTIMP + void + __cdecl + _mbccpy( + _Out_writes_bytes_(2) unsigned char *_Dst, + _In_z_ const unsigned char *_Src); + + _CRTIMP + void + __cdecl + _mbccpy_l( + _Out_writes_bytes_(2) unsigned char *_Dst, + _In_z_ const unsigned char *_Src, + _In_opt_ _locale_t _Locale); + #define _mbccmp(_cpc1,_cpc2) _mbsncmp((_cpc1),(_cpc2),1) #ifdef __cplusplus @@ -143,64 +834,406 @@ extern "C" { #endif #endif - _CRTIMP int __cdecl _ismbcalnum(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcalnum_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcalpha(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcalpha_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcdigit(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcdigit_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcgraph(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcgraph_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbclegal(unsigned int _Ch); - _CRTIMP int __cdecl _ismbclegal_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbclower(unsigned int _Ch); - _CRTIMP int __cdecl _ismbclower_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcprint(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcprint_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcpunct(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcpunct_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcspace(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcspace_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcupper(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcupper_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctolower(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctolower_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctoupper(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctoupper_l(unsigned int _Ch,_locale_t _Locale); -#endif + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalnum( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalnum_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalpha( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcalpha_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcdigit( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcdigit_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcgraph( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcgraph_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclegal( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclegal_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclower( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbclower_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcprint( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcprint_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcpunct( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcpunct_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcspace( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcspace_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcupper( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + __cdecl _ismbcupper_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctolower( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctolower_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctoupper( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctoupper_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + +#endif /* _MBSTRING_DEFINED */ #ifndef _MBLEADTRAIL_DEFINED #define _MBLEADTRAIL_DEFINED - _CRTIMP int __cdecl _ismbblead(unsigned int _Ch); - _CRTIMP int __cdecl _ismbblead_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbbtrail(unsigned int _Ch); - _CRTIMP int __cdecl _ismbbtrail_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbslead(const unsigned char *_Str,const unsigned char *_Pos); - _CRTIMP int __cdecl _ismbslead_l(const unsigned char *_Str,const unsigned char *_Pos,_locale_t _Locale); - _CRTIMP int __cdecl _ismbstrail(const unsigned char *_Str,const unsigned char *_Pos); - _CRTIMP int __cdecl _ismbstrail_l(const unsigned char *_Str,const unsigned char *_Pos,_locale_t _Locale); -#endif - _CRTIMP int __cdecl _ismbchira(unsigned int _Ch); - _CRTIMP int __cdecl _ismbchira_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbckata(unsigned int _Ch); - _CRTIMP int __cdecl _ismbckata_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcsymbol(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcsymbol_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcl0(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcl0_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcl1(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcl1_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP int __cdecl _ismbcl2(unsigned int _Ch); - _CRTIMP int __cdecl _ismbcl2_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbcjistojms(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbcjistojms_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbcjmstojis(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbcjmstojis_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctohira(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctohira_l(unsigned int _Ch,_locale_t _Locale); - _CRTIMP unsigned int __cdecl _mbctokata(unsigned int _Ch); - _CRTIMP unsigned int __cdecl _mbctokata_l(unsigned int _Ch,_locale_t _Locale); + _Check_return_ + _CRTIMP + int + __cdecl + _ismbblead( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbblead_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbbtrail( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbbtrail_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbslead( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbslead_l( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbstrail( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbstrail_l( + _In_reads_z_(_Pos - _Str + 1) const unsigned char *_Str, + _In_z_ const unsigned char *_Pos, + _In_opt_ _locale_t _Locale); + +#endif /* _MBLEADTRAIL_DEFINED */ + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbchira( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbchira_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbckata( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbckata_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcsymbol( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcsymbol_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl0( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl0_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl1( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl1_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl2( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + int + __cdecl + _ismbcl2_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjistojms( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjistojms_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjmstojis( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbcjmstojis_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctohira( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctohira_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctokata( + _In_ unsigned int _Ch); + + _Check_return_ + _CRTIMP + unsigned int + __cdecl + _mbctokata_l( + _In_ unsigned int _Ch, + _In_opt_ _locale_t _Locale); #ifdef __cplusplus } @@ -210,4 +1243,4 @@ extern "C" { #include -#endif +#endif /* _INC_MBSTRING */ From 539c2e45ec105c640ad23e904d02614080b3b8ce Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 12:02:09 +0000 Subject: [PATCH 35/74] [PSDK] * Update propvarutil.h. svn path=/trunk/; revision=58566 --- reactos/include/psdk/propvarutil.h | 79 +++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/reactos/include/psdk/propvarutil.h b/reactos/include/psdk/propvarutil.h index 2573d38d1a1..4791543b01e 100644 --- a/reactos/include/psdk/propvarutil.h +++ b/reactos/include/psdk/propvarutil.h @@ -19,7 +19,6 @@ #ifndef __WINE_PROPVARUTIL_H #define __WINE_PROPVARUTIL_H -#include #include #include @@ -35,7 +34,85 @@ enum tagPROPVAR_CHANGE_FLAGS typedef int PROPVAR_CHANGE_FLAGS; +enum tagPROPVAR_COMPARE_UNIT +{ + PVCU_DEFAULT = 0x00000000, + PVCU_SECOND = 0x00000001, + PVCU_MINUTE = 0x00000002, + PVCU_HOUR = 0x00000003, + PVCU_DAY = 0x00000004, + PVCU_MONTH = 0x00000005, + PVCU_YEAR = 0x00000006, +}; + +typedef int PROPVAR_COMPARE_UNIT; + +enum tagPROPVAR_COMPARE_FLAGS +{ + PVCF_DEFAULT = 0x00000000, + PVCF_TREATEMPTYASGREATERTHAN = 0x00000001, + PVCF_USESTRCMP = 0x00000002, + PVCF_USESTRCMPC = 0x00000004, + PVCF_USESTRCMPI = 0x00000008, + PVCF_USESTRCMPIC = 0x00000010, +}; + +typedef int PROPVAR_COMPARE_FLAGS; + HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt); +HRESULT WINAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar); +HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar); +HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar); +HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar); +HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid); +HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid); +INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, + PROPVAR_COMPARE_UNIT uint, PROPVAR_COMPARE_FLAGS flags); + +HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret); +HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret); +HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret); +HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret); +HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret); +HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret); + +#ifdef __cplusplus + +HRESULT InitPropVariantFromBoolean(BOOL fVal, PROPVARIANT *ppropvar); +HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar); +HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar); + +#ifndef NO_PROPVAR_INLINES + +inline HRESULT InitPropVariantFromBoolean(BOOL fVal, PROPVARIANT *ppropvar) +{ + ppropvar->vt = VT_BOOL; + ppropvar->boolVal = fVal ? VARIANT_TRUE : VARIANT_FALSE; + return S_OK; +} + +inline HRESULT InitPropVariantFromString(PCWSTR psz, PROPVARIANT *ppropvar) +{ + HRESULT hres; + + hres = SHStrDupW(psz, &ppropvar->pwszVal); + if(SUCCEEDED(hres)) + ppropvar->vt = VT_LPWSTR; + else + PropVariantInit(ppropvar); + + return hres; +} + +inline HRESULT InitPropVariantFromInt64(LONGLONG llVal, PROPVARIANT *ppropvar) +{ + ppropvar->vt = VT_I8; + ppropvar->hVal.QuadPart = llVal; + return S_OK; +} + +#endif +#endif #endif /* __WINE_PROPVARUTIL_H */ From 7b8f48d8963ef54f8c549f23bb84c7e3a9b7423e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 12:08:04 +0000 Subject: [PATCH 36/74] [PROPSYS] * Import from Wine 1.5.26. svn path=/trunk/; revision=58567 --- reactos/dll/win32/CMakeLists.txt | 1 + reactos/dll/win32/propsys/CMakeLists.txt | 20 + reactos/dll/win32/propsys/propstore.c | 481 ++++++++++++++ reactos/dll/win32/propsys/propsys.rc | 1 + reactos/dll/win32/propsys/propsys.spec | 210 ++++++ reactos/dll/win32/propsys/propsys_classes.idl | 26 + reactos/dll/win32/propsys/propsys_classes.rgs | 13 + reactos/dll/win32/propsys/propsys_main.c | 404 ++++++++++++ reactos/dll/win32/propsys/propsys_private.h | 21 + reactos/dll/win32/propsys/propvar.c | 603 ++++++++++++++++++ reactos/media/doc/README.WINE | 1 + 11 files changed, 1781 insertions(+) create mode 100644 reactos/dll/win32/propsys/CMakeLists.txt create mode 100644 reactos/dll/win32/propsys/propstore.c create mode 100644 reactos/dll/win32/propsys/propsys.rc create mode 100644 reactos/dll/win32/propsys/propsys.spec create mode 100644 reactos/dll/win32/propsys/propsys_classes.idl create mode 100644 reactos/dll/win32/propsys/propsys_classes.rgs create mode 100644 reactos/dll/win32/propsys/propsys_main.c create mode 100644 reactos/dll/win32/propsys/propsys_private.h create mode 100644 reactos/dll/win32/propsys/propvar.c diff --git a/reactos/dll/win32/CMakeLists.txt b/reactos/dll/win32/CMakeLists.txt index 48680a6b427..50ce0462e55 100644 --- a/reactos/dll/win32/CMakeLists.txt +++ b/reactos/dll/win32/CMakeLists.txt @@ -145,6 +145,7 @@ add_subdirectory(pdh) add_subdirectory(pidgen) add_subdirectory(powrprof) add_subdirectory(printui) +add_subdirectory(propsys) add_subdirectory(psapi) add_subdirectory(pstorec) add_subdirectory(qmgr) diff --git a/reactos/dll/win32/propsys/CMakeLists.txt b/reactos/dll/win32/propsys/CMakeLists.txt new file mode 100644 index 00000000000..14f3ab39362 --- /dev/null +++ b/reactos/dll/win32/propsys/CMakeLists.txt @@ -0,0 +1,20 @@ + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +add_definitions(-D__WINESRC__) + +spec2def(propsys.dll propsys.spec ADD_IMPORTLIB) + +list(APPEND SOURCE + propstore.c + propsys_main.c + propvar.c + propsys.rc + ${CMAKE_CURRENT_BINARY_DIR}/propsys_stubs.c + ${CMAKE_CURRENT_BINARY_DIR}/propsys.def) + +add_library(propsys SHARED ${SOURCE}) +set_module_type(propsys win32dll) +target_link_libraries(propsys uuid wine) +add_importlibs(propsys ole32 oleaut32 msvcrt kernel32 ntdll) +add_dependencies(propsys psdk) +add_cd_file(TARGET propsys DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/propsys/propstore.c b/reactos/dll/win32/propsys/propstore.c new file mode 100644 index 00000000000..7bb6de25290 --- /dev/null +++ b/reactos/dll/win32/propsys/propstore.c @@ -0,0 +1,481 @@ +/* + * standard IPropertyStore implementation + * + * Copyright 2012 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#include + +#include + +#include +#include +#include +//#include "rpcproxy.h" +#include +#include +//#include "wine/unicode.h" +#include + +#include +//#include "propsys_private.h" + +DEFINE_GUID(FMTID_NamedProperties, 0xd5cdd505, 0x2e9c, 0x101b, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae); + +WINE_DEFAULT_DEBUG_CHANNEL(propsys); + +typedef struct { + struct list entry; + DWORD pid; + PROPVARIANT propvar; + PSC_STATE state; +} propstore_value; + +typedef struct { + struct list entry; + GUID fmtid; + struct list values; /* list of struct propstore_value */ + DWORD count; +} propstore_format; + +typedef struct { + IPropertyStoreCache IPropertyStoreCache_iface; + LONG ref; + CRITICAL_SECTION lock; + struct list formats; /* list of struct propstore_format */ +} PropertyStore; + +static inline PropertyStore *impl_from_IPropertyStoreCache(IPropertyStoreCache *iface) +{ + return CONTAINING_RECORD(iface, PropertyStore, IPropertyStoreCache_iface); +} + +static HRESULT WINAPI PropertyStore_QueryInterface(IPropertyStoreCache *iface, REFIID iid, + void **ppv) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IPropertyStore, iid) || + IsEqualIID(&IID_IPropertyStoreCache, iid)) + { + *ppv = &This->IPropertyStoreCache_iface; + } + else + { + FIXME("No interface for %s\n", debugstr_guid(iid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI PropertyStore_AddRef(IPropertyStoreCache *iface) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static void destroy_format(propstore_format *format) +{ + propstore_value *cursor, *cursor2; + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &format->values, propstore_value, entry) + { + PropVariantClear(&cursor->propvar); + HeapFree(GetProcessHeap(), 0, cursor); + } + HeapFree(GetProcessHeap(), 0, format); +} + +static ULONG WINAPI PropertyStore_Release(IPropertyStoreCache *iface) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + propstore_format *cursor, *cursor2; + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &This->formats, propstore_format, entry) + destroy_format(cursor); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI PropertyStore_GetCount(IPropertyStoreCache *iface, + DWORD *cProps) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_format *format; + + TRACE("%p,%p\n", iface, cProps); + + if (!cProps) + return E_POINTER; + + *cProps = 0; + + EnterCriticalSection(&This->lock); + + LIST_FOR_EACH_ENTRY(format, &This->formats, propstore_format, entry) + *cProps += format->count; + + LeaveCriticalSection(&This->lock); + + return S_OK; +} + +static HRESULT WINAPI PropertyStore_GetAt(IPropertyStoreCache *iface, + DWORD iProp, PROPERTYKEY *pkey) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_format *format=NULL, *format_candidate; + propstore_value *value; + HRESULT hr; + + TRACE("%p,%d,%p\n", iface, iProp, pkey); + + if (!pkey) + return E_POINTER; + + EnterCriticalSection(&This->lock); + + LIST_FOR_EACH_ENTRY(format_candidate, &This->formats, propstore_format, entry) + { + if (format_candidate->count > iProp) + { + format = format_candidate; + pkey->fmtid = format->fmtid; + break; + } + + iProp -= format_candidate->count; + } + + if (format) + { + LIST_FOR_EACH_ENTRY(value, &format->values, propstore_value, entry) + { + if (iProp == 0) + { + pkey->pid = value->pid; + break; + } + + iProp--; + } + + hr = S_OK; + } + else + hr = E_INVALIDARG; + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT PropertyStore_LookupValue(PropertyStore *This, REFPROPERTYKEY key, + int insert, propstore_value **result) +{ + propstore_format *format=NULL, *format_candidate; + propstore_value *value=NULL, *value_candidate; + + if (IsEqualGUID(&key->fmtid, &FMTID_NamedProperties)) + { + /* This is used in the property store format [MS-PROPSTORE] + * for named values and probably gets special treatment. */ + ERR("don't know how to handle FMTID_NamedProperties\n"); + return E_FAIL; + } + + LIST_FOR_EACH_ENTRY(format_candidate, &This->formats, propstore_format, entry) + { + if (IsEqualGUID(&format_candidate->fmtid, &key->fmtid)) + { + format = format_candidate; + break; + } + } + + if (!format) + { + if (!insert) + return TYPE_E_ELEMENTNOTFOUND; + + format = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*format)); + if (!format) + return E_OUTOFMEMORY; + + format->fmtid = key->fmtid; + list_init(&format->values); + list_add_tail(&This->formats, &format->entry); + } + + LIST_FOR_EACH_ENTRY(value_candidate, &format->values, propstore_value, entry) + { + if (value_candidate->pid == key->pid) + { + value = value_candidate; + break; + } + } + + if (!value) + { + if (!insert) + return TYPE_E_ELEMENTNOTFOUND; + + value = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*value)); + if (!value) + return E_OUTOFMEMORY; + + value->pid = key->pid; + list_add_tail(&format->values, &value->entry); + format->count++; + } + + *result = value; + + return S_OK; +} + +static HRESULT WINAPI PropertyStore_GetValue(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PROPVARIANT *pv) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p\n", iface, key, pv); + + if (!pv) + return E_POINTER; + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(pv, &value->propvar); + else if (hr == TYPE_E_ELEMENTNOTFOUND) + { + PropVariantInit(pv); + hr = S_OK; + } + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT WINAPI PropertyStore_SetValue(IPropertyStoreCache *iface, + REFPROPERTYKEY key, REFPROPVARIANT propvar) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + PROPVARIANT temp; + + TRACE("%p,%p,%p\n", iface, key, propvar); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 1, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(&temp, propvar); + + if (SUCCEEDED(hr)) + { + PropVariantClear(&value->propvar); + value->propvar = temp; + } + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT WINAPI PropertyStore_Commit(IPropertyStoreCache *iface) +{ + FIXME("%p: stub\n", iface); + return S_OK; +} + +static HRESULT WINAPI PropertyStore_GetState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PSC_STATE *pstate) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p\n", iface, key, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + *pstate = value->state; + + LeaveCriticalSection(&This->lock); + + if (FAILED(hr)) + *pstate = PSC_NORMAL; + + return hr; +} + +static HRESULT WINAPI PropertyStore_GetValueAndState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PROPVARIANT *ppropvar, PSC_STATE *pstate) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%p,%p\n", iface, key, ppropvar, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(ppropvar, &value->propvar); + + if (SUCCEEDED(hr)) + *pstate = value->state; + + LeaveCriticalSection(&This->lock); + + if (FAILED(hr)) + { + PropVariantInit(ppropvar); + *pstate = PSC_NORMAL; + } + + return hr; +} + +static HRESULT WINAPI PropertyStore_SetState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, PSC_STATE pstate) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + + TRACE("%p,%p,%d\n", iface, key, pstate); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 0, &value); + + if (SUCCEEDED(hr)) + value->state = pstate; + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static HRESULT WINAPI PropertyStore_SetValueAndState(IPropertyStoreCache *iface, + REFPROPERTYKEY key, const PROPVARIANT *ppropvar, PSC_STATE state) +{ + PropertyStore *This = impl_from_IPropertyStoreCache(iface); + propstore_value *value; + HRESULT hr; + PROPVARIANT temp; + + TRACE("%p,%p,%p,%d\n", iface, key, ppropvar, state); + + EnterCriticalSection(&This->lock); + + hr = PropertyStore_LookupValue(This, key, 1, &value); + + if (SUCCEEDED(hr)) + hr = PropVariantCopy(&temp, ppropvar); + + if (SUCCEEDED(hr)) + { + PropVariantClear(&value->propvar); + value->propvar = temp; + value->state = state; + } + + LeaveCriticalSection(&This->lock); + + return hr; +} + +static const IPropertyStoreCacheVtbl PropertyStore_Vtbl = { + PropertyStore_QueryInterface, + PropertyStore_AddRef, + PropertyStore_Release, + PropertyStore_GetCount, + PropertyStore_GetAt, + PropertyStore_GetValue, + PropertyStore_SetValue, + PropertyStore_Commit, + PropertyStore_GetState, + PropertyStore_GetValueAndState, + PropertyStore_SetState, + PropertyStore_SetValueAndState +}; + +HRESULT PropertyStore_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + PropertyStore *This; + HRESULT ret; + + TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); + + *ppv = NULL; + + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(PropertyStore)); + if (!This) return E_OUTOFMEMORY; + + This->IPropertyStoreCache_iface.lpVtbl = &PropertyStore_Vtbl; + This->ref = 1; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PropertyStore.lock"); + list_init(&This->formats); + + ret = IPropertyStoreCache_QueryInterface(&This->IPropertyStoreCache_iface, iid, ppv); + IPropertyStoreCache_Release(&This->IPropertyStoreCache_iface); + + return ret; +} diff --git a/reactos/dll/win32/propsys/propsys.rc b/reactos/dll/win32/propsys/propsys.rc new file mode 100644 index 00000000000..95ee7a90e61 --- /dev/null +++ b/reactos/dll/win32/propsys/propsys.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY propsys_classes.rgs diff --git a/reactos/dll/win32/propsys/propsys.spec b/reactos/dll/win32/propsys/propsys.spec new file mode 100644 index 00000000000..26bdc0b4768 --- /dev/null +++ b/reactos/dll/win32/propsys/propsys.spec @@ -0,0 +1,210 @@ + 3 stub GetProxyDllInfo + +400 stub PROPSYS_400 +402 stub PROPSYS_402 +403 stub PROPSYS_403 +404 stub PROPSYS_404 +405 stub PROPSYS_405 +406 stub PROPSYS_406 +407 stub PROPSYS_407 +408 stub PROPSYS_408 +409 stub PROPSYS_409 +410 stub PROPSYS_410 +411 stub PROPSYS_411 +412 stub PROPSYS_412 +413 stub PROPSYS_413 +414 stub PROPSYS_414 +415 stub PROPSYS_415 +416 stub PROPSYS_416 +417 stub PROPSYS_417 +418 stub PROPSYS_418 +420 stub PROPSYS_420 +421 stub PROPSYS_421 +422 stub PROPSYS_422 + +@ stub ClearPropVariantArray +@ stub ClearVariantArray +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() +@ stub InitPropVariantFromBooleanVector +@ stdcall InitPropVariantFromBuffer(ptr long ptr) +@ stub InitPropVariantFromCLSID +@ stub InitPropVariantFromDoubleVector +@ stub InitPropVariantFromFileTime +@ stub InitPropVariantFromFileTimeVector +@ stdcall InitPropVariantFromGUIDAsString(ptr ptr) +@ stub InitPropVariantFromInt16Vector +@ stub InitPropVariantFromInt32Vector +@ stub InitPropVariantFromInt64Vector +@ stub InitPropVariantFromPropVariantVectorElem +@ stub InitPropVariantFromResource +@ stub InitPropVariantFromStrRet +@ stub InitPropVariantFromStringAsVector +@ stub InitPropVariantFromStringVector +@ stub InitPropVariantFromUInt16Vector +@ stub InitPropVariantFromUInt32Vector +@ stub InitPropVariantFromUInt64Vector +@ stub InitPropVariantVectorFromPropVariant +@ stub InitVariantFromBooleanArray +@ stdcall InitVariantFromBuffer(ptr long ptr) +@ stub InitVariantFromDoubleArray +@ stub InitVariantFromFileTime +@ stub InitVariantFromFileTimeArray +@ stdcall InitVariantFromGUIDAsString(ptr ptr) +@ stub InitVariantFromInt16Array +@ stub InitVariantFromInt32Array +@ stub InitVariantFromInt64Array +@ stub InitVariantFromResource +@ stub InitVariantFromStrRet +@ stub InitVariantFromStringArray +@ stub InitVariantFromUInt16Array +@ stub InitVariantFromUInt32Array +@ stub InitVariantFromUInt64Array +@ stub InitVariantFromVariantArrayElem +@ stub PSCoerceToCanonicalValue +@ stub PSCreateAdapterFromPropertyStore +@ stub PSCreateDelayedMultiplexPropertyStore +@ stub PSCreateMemoryPropertyStore +@ stub PSCreateMultiplexPropertyStore +@ stub PSCreatePropertyChangeArray +@ stub PSCreatePropertyStoreFromObject +@ stub PSCreatePropertyStoreFromPropertySetStorage +@ stub PSCreateSimplePropertyChange +@ stub PSEnumeratePropertyDescriptions +@ stub PSFormatForDisplay +@ stub PSFormatForDisplayAlloc +@ stub PSFormatPropertyValue +@ stub PSGetItemPropertyHandler +@ stub PSGetItemPropertyHandlerWithCreateObject +@ stub PSGetNameFromPropertyKey +@ stub PSGetNamedPropertyFromPropertyStorage +@ stdcall PSGetPropertyDescription(ptr ptr ptr) +@ stub PSGetPropertyDescriptionByName +@ stub PSGetPropertyDescriptionListFromString +@ stub PSGetPropertyFromPropertyStorage +@ stub PSGetPropertyKeyFromName +@ stub PSGetPropertySystem +@ stub PSGetPropertyValue +@ stub PSLookupPropertyHandlerCLSID +@ stdcall PSPropertyKeyFromString(wstr ptr) +@ stdcall PSRefreshPropertySchema() +@ stdcall PSRegisterPropertySchema(wstr) +@ stub PSSetPropertyValue +@ stdcall PSStringFromPropertyKey(ptr ptr long) +@ stdcall PSUnregisterPropertySchema(wstr) +@ stdcall PropVariantChangeType(ptr ptr long long) +@ stdcall PropVariantCompareEx(ptr ptr long long) +@ stub PropVariantGetBooleanElem +@ stub PropVariantGetDoubleElem +@ stub PropVariantGetElementCount +@ stub PropVariantGetFileTimeElem +@ stub PropVariantGetInt16Elem +@ stub PropVariantGetInt32Elem +@ stub PropVariantGetInt64Elem +@ stub PropVariantGetStringElem +@ stub PropVariantGetUInt16Elem +@ stub PropVariantGetUInt32Elem +@ stub PropVariantGetUInt64Elem +@ stub PropVariantToBSTR +@ stub PropVariantToBoolean +@ stub PropVariantToBooleanVector +@ stub PropVariantToBooleanVectorAlloc +@ stub PropVariantToBooleanWithDefault +@ stub PropVariantToBuffer +@ stub PropVariantToDouble +@ stub PropVariantToDoubleVector +@ stub PropVariantToDoubleVectorAlloc +@ stub PropVariantToDoubleWithDefault +@ stub PropVariantToFileTime +@ stub PropVariantToFileTimeVector +@ stub PropVariantToFileTimeVectorAlloc +@ stdcall PropVariantToGUID(ptr ptr) +@ stdcall PropVariantToInt16(ptr ptr) +@ stub PropVariantToInt16Vector +@ stub PropVariantToInt16VectorAlloc +@ stub PropVariantToInt16WithDefault +@ stdcall PropVariantToInt32(ptr ptr) +@ stub PropVariantToInt32Vector +@ stub PropVariantToInt32VectorAlloc +@ stub PropVariantToInt32WithDefault +@ stdcall PropVariantToInt64(ptr ptr) +@ stub PropVariantToInt64Vector +@ stub PropVariantToInt64VectorAlloc +@ stub PropVariantToInt64WithDefault +@ stub PropVariantToStrRet +@ stub PropVariantToString +@ stub PropVariantToStringAlloc +@ stub PropVariantToStringVector +@ stub PropVariantToStringVectorAlloc +@ stub PropVariantToStringWithDefault +@ stdcall PropVariantToUInt16(ptr ptr) +@ stub PropVariantToUInt16Vector +@ stub PropVariantToUInt16VectorAlloc +@ stub PropVariantToUInt16WithDefault +@ stdcall PropVariantToUInt32(ptr ptr) +@ stub PropVariantToUInt32Vector +@ stub PropVariantToUInt32VectorAlloc +@ stub PropVariantToUInt32WithDefault +@ stdcall PropVariantToUInt64(ptr ptr) +@ stub PropVariantToUInt64Vector +@ stub PropVariantToUInt64VectorAlloc +@ stub PropVariantToUInt64WithDefault +@ stub PropVariantToVariant +@ stub StgDeserializePropVariant +@ stub StgSerializePropVariant +@ stub VariantCompare +@ stub VariantGetBooleanElem +@ stub VariantGetDoubleElem +@ stub VariantGetElementCount +@ stub VariantGetInt16Elem +@ stub VariantGetInt32Elem +@ stub VariantGetInt64Elem +@ stub VariantGetStringElem +@ stub VariantGetUInt16Elem +@ stub VariantGetUInt32Elem +@ stub VariantGetUInt64Elem +@ stub VariantToBoolean +@ stub VariantToBooleanArray +@ stub VariantToBooleanArrayAlloc +@ stub VariantToBooleanWithDefault +@ stub VariantToBuffer +@ stub VariantToDosDateTime +@ stub VariantToDouble +@ stub VariantToDoubleArray +@ stub VariantToDoubleArrayAlloc +@ stub VariantToDoubleWithDefault +@ stub VariantToFileTime +@ stdcall VariantToGUID(ptr ptr) +@ stub VariantToInt16 +@ stub VariantToInt16Array +@ stub VariantToInt16ArrayAlloc +@ stub VariantToInt16WithDefault +@ stub VariantToInt32 +@ stub VariantToInt32Array +@ stub VariantToInt32ArrayAlloc +@ stub VariantToInt32WithDefault +@ stub VariantToInt64 +@ stub VariantToInt64Array +@ stub VariantToInt64ArrayAlloc +@ stub VariantToInt64WithDefault +@ stub VariantToPropVariant +@ stub VariantToStrRet +@ stub VariantToString +@ stub VariantToStringAlloc +@ stub VariantToStringArray +@ stub VariantToStringArrayAlloc +@ stub VariantToStringWithDefault +@ stub VariantToUInt16 +@ stub VariantToUInt16Array +@ stub VariantToUInt16ArrayAlloc +@ stub VariantToUInt16WithDefault +@ stub VariantToUInt32 +@ stub VariantToUInt32Array +@ stub VariantToUInt32ArrayAlloc +@ stub VariantToUInt32WithDefault +@ stub VariantToUInt64 +@ stub VariantToUInt64Array +@ stub VariantToUInt64ArrayAlloc +@ stub VariantToUInt64WithDefault diff --git a/reactos/dll/win32/propsys/propsys_classes.idl b/reactos/dll/win32/propsys/propsys_classes.idl new file mode 100644 index 00000000000..28c23f22cf8 --- /dev/null +++ b/reactos/dll/win32/propsys/propsys_classes.idl @@ -0,0 +1,26 @@ +/* + * Coclasses for propsys + * + * Copyright 2012 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + helpstring("Packed Property Storage Object"), + threading(both), + uuid(9a02e012-6303-4e1e-b9a1-630f802592c5) +] +coclass InMemoryPropertyStore { interface IPropertyStoreCache; } diff --git a/reactos/dll/win32/propsys/propsys_classes.rgs b/reactos/dll/win32/propsys/propsys_classes.rgs new file mode 100644 index 00000000000..d8391782781 --- /dev/null +++ b/reactos/dll/win32/propsys/propsys_classes.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{9A02E012-6303-4E1E-B9A1-630F802592C5}' = s 'Packed Property Storage Object' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/win32/propsys/propsys_main.c b/reactos/dll/win32/propsys/propsys_main.c new file mode 100644 index 00000000000..c3294caad9c --- /dev/null +++ b/reactos/dll/win32/propsys/propsys_main.c @@ -0,0 +1,404 @@ +/* + * propsys main + * + * Copyright 1997, 2002 Alexandre Julliard + * Copyright 2008 James Hawkins + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "propsys_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(propsys); + +static HINSTANCE propsys_hInstance; + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); + + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + propsys_hInstance = hinstDLL; + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + default: + break; + } + + return TRUE; +} + +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( propsys_hInstance ); +} + +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( propsys_hInstance ); +} + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); + *ppv = iface; + }else if(IsEqualGUID(&IID_IClassFactory, riid)) { + TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); + *ppv = iface; + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + TRACE("(%p)\n", iface); + return 2; +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + TRACE("(%p)\n", iface); + return 1; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + TRACE("(%p)->(%x)\n", iface, fLock); + + return S_OK; +} + +static HRESULT WINAPI InMemoryPropertyStoreFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, + REFIID riid, void **ppv) +{ + TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv); + + return PropertyStore_CreateInstance(outer, riid, ppv); +} + +static const IClassFactoryVtbl InMemoryPropertyStoreFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + InMemoryPropertyStoreFactory_CreateInstance, + ClassFactory_LockServer +}; + +static IClassFactory InMemoryPropertyStoreFactory = { &InMemoryPropertyStoreFactoryVtbl }; + +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + if(IsEqualGUID(&CLSID_InMemoryPropertyStore, rclsid)) { + TRACE("(CLSID_InMemoryPropertyStore %s %p)\n", debugstr_guid(riid), ppv); + return IClassFactory_QueryInterface(&InMemoryPropertyStoreFactory, riid, ppv); + } + + FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI DllCanUnloadNow(void) +{ + return S_FALSE; +} + +HRESULT WINAPI PSRegisterPropertySchema(PCWSTR path) +{ + FIXME("%s stub\n", debugstr_w(path)); + + return S_OK; +} + +HRESULT WINAPI PSUnregisterPropertySchema(PCWSTR path) +{ + FIXME("%s stub\n", debugstr_w(path)); + + return E_NOTIMPL; +} + +HRESULT WINAPI PSGetPropertyDescription(REFPROPERTYKEY propkey, REFIID riid, void **ppv) +{ + FIXME("%p, %p, %p\n", propkey, riid, ppv); + return E_NOTIMPL; +} + +HRESULT WINAPI PSRefreshPropertySchema(void) +{ + FIXME("\n"); + return S_OK; +} + +HRESULT WINAPI PSStringFromPropertyKey(REFPROPERTYKEY pkey, LPWSTR psz, UINT cch) +{ + static const WCHAR guid_fmtW[] = {'{','%','0','8','X','-','%','0','4','X','-', + '%','0','4','X','-','%','0','2','X','%','0','2','X','-', + '%','0','2','X','%','0','2','X','%','0','2','X', + '%','0','2','X','%','0','2','X','%','0','2','X','}',0}; + static const WCHAR pid_fmtW[] = {'%','u',0}; + + WCHAR pidW[PKEY_PIDSTR_MAX + 1]; + LPWSTR p = psz; + int len; + + TRACE("(%p, %p, %u)\n", pkey, psz, cch); + + if (!psz) + return E_POINTER; + + /* GUIDSTRING_MAX accounts for null terminator, +1 for space character. */ + if (cch <= GUIDSTRING_MAX + 1) + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + + if (!pkey) + { + psz[0] = '\0'; + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + sprintfW(psz, guid_fmtW, pkey->fmtid.Data1, pkey->fmtid.Data2, + pkey->fmtid.Data3, pkey->fmtid.Data4[0], pkey->fmtid.Data4[1], + pkey->fmtid.Data4[2], pkey->fmtid.Data4[3], pkey->fmtid.Data4[4], + pkey->fmtid.Data4[5], pkey->fmtid.Data4[6], pkey->fmtid.Data4[7]); + + /* Overwrite the null terminator with the space character. */ + p += GUIDSTRING_MAX - 1; + *p++ = ' '; + cch -= GUIDSTRING_MAX - 1 + 1; + + len = sprintfW(pidW, pid_fmtW, pkey->pid); + + if (cch >= len + 1) + { + strcpyW(p, pidW); + return S_OK; + } + else + { + WCHAR *ptr = pidW + len - 1; + + psz[0] = '\0'; + *p++ = '\0'; + cch--; + + /* Replicate a quirk of the native implementation where the contents + * of the property ID string are written backwards to the output + * buffer, skipping the rightmost digit. */ + if (cch) + { + ptr--; + while (cch--) + *p++ = *ptr--; + } + + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } +} + +static const BYTE hex2bin[] = +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x00 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x10 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x20 */ + 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, /* 0x30 */ + 0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0, /* 0x40 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x50 */ + 0,10,11,12,13,14,15 /* 0x60 */ +}; + +static BOOL validate_indices(LPCWSTR s, int min, int max) +{ + int i; + + for (i = min; i <= max; i++) + { + if (!s[i]) + return FALSE; + + if (i == 0) + { + if (s[i] != '{') + return FALSE; + } + else if (i == 9 || i == 14 || i == 19 || i == 24) + { + if (s[i] != '-') + return FALSE; + } + else if (i == 37) + { + if (s[i] != '}') + return FALSE; + } + else + { + if (s[i] > 'f' || (!hex2bin[s[i]] && s[i] != '0')) + return FALSE; + } + } + + return TRUE; +} + +/* Adapted from CLSIDFromString helper in dlls/ole32/compobj.c and + * UuidFromString in dlls/rpcrt4/rpcrt4_main.c. */ +static BOOL string_to_guid(LPCWSTR s, LPGUID id) +{ + /* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */ + + if (!validate_indices(s, 0, 8)) return FALSE; + id->Data1 = (hex2bin[s[1]] << 28 | hex2bin[s[2]] << 24 | hex2bin[s[3]] << 20 | hex2bin[s[4]] << 16 | + hex2bin[s[5]] << 12 | hex2bin[s[6]] << 8 | hex2bin[s[7]] << 4 | hex2bin[s[8]]); + if (!validate_indices(s, 9, 14)) return FALSE; + id->Data2 = hex2bin[s[10]] << 12 | hex2bin[s[11]] << 8 | hex2bin[s[12]] << 4 | hex2bin[s[13]]; + if (!validate_indices(s, 15, 19)) return FALSE; + id->Data3 = hex2bin[s[15]] << 12 | hex2bin[s[16]] << 8 | hex2bin[s[17]] << 4 | hex2bin[s[18]]; + + /* these are just sequential bytes */ + + if (!validate_indices(s, 20, 21)) return FALSE; + id->Data4[0] = hex2bin[s[20]] << 4 | hex2bin[s[21]]; + if (!validate_indices(s, 22, 24)) return FALSE; + id->Data4[1] = hex2bin[s[22]] << 4 | hex2bin[s[23]]; + + if (!validate_indices(s, 25, 26)) return FALSE; + id->Data4[2] = hex2bin[s[25]] << 4 | hex2bin[s[26]]; + if (!validate_indices(s, 27, 28)) return FALSE; + id->Data4[3] = hex2bin[s[27]] << 4 | hex2bin[s[28]]; + if (!validate_indices(s, 29, 30)) return FALSE; + id->Data4[4] = hex2bin[s[29]] << 4 | hex2bin[s[30]]; + if (!validate_indices(s, 31, 32)) return FALSE; + id->Data4[5] = hex2bin[s[31]] << 4 | hex2bin[s[32]]; + if (!validate_indices(s, 33, 34)) return FALSE; + id->Data4[6] = hex2bin[s[33]] << 4 | hex2bin[s[34]]; + if (!validate_indices(s, 35, 37)) return FALSE; + id->Data4[7] = hex2bin[s[35]] << 4 | hex2bin[s[36]]; + + return TRUE; +} + +HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey) +{ + int has_minus = 0, has_comma = 0; + + TRACE("(%s, %p)\n", debugstr_w(pszString), pkey); + + if (!pszString || !pkey) + return E_POINTER; + + memset(pkey, 0, sizeof(PROPERTYKEY)); + + if (!string_to_guid(pszString, &pkey->fmtid)) + return E_INVALIDARG; + + pszString += GUIDSTRING_MAX - 1; + + if (!*pszString) + return E_INVALIDARG; + + /* Only the space seems to be recognized as whitespace. The comma is only + * recognized once and processing terminates if another comma is found. */ + while (*pszString == ' ' || *pszString == ',') + { + if (*pszString == ',') + { + if (has_comma) + return S_OK; + else + has_comma = 1; + } + pszString++; + } + + if (!*pszString) + return E_INVALIDARG; + + /* Only two minus signs are recognized if no comma is detected. The first + * sign is ignored, and the second is interpreted. If a comma is detected + * before the minus sign, then only one minus sign counts, and property ID + * interpretation begins with the next character. */ + if (has_comma) + { + if (*pszString == '-') + { + has_minus = 1; + pszString++; + } + } + else + { + if (*pszString == '-') + pszString++; + + /* Skip any intermediate spaces after the first minus sign. */ + while (*pszString == ' ') + pszString++; + + if (*pszString == '-') + { + has_minus = 1; + pszString++; + } + + /* Skip any remaining spaces after minus sign. */ + while (*pszString == ' ') + pszString++; + } + + /* Overflow is not checked. */ + while (isdigitW(*pszString)) + { + pkey->pid *= 10; + pkey->pid += (*pszString - '0'); + pszString++; + } + + if (has_minus) + pkey->pid = ~pkey->pid + 1; + + return S_OK; +} diff --git a/reactos/dll/win32/propsys/propsys_private.h b/reactos/dll/win32/propsys/propsys_private.h new file mode 100644 index 00000000000..35bbb4d5a36 --- /dev/null +++ b/reactos/dll/win32/propsys/propsys_private.h @@ -0,0 +1,21 @@ +/* + * propsys private definitions + * + * Copyright 2012 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +HRESULT PropertyStore_CreateInstance(IUnknown *outer, REFIID riid, void **ppv) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/propsys/propvar.c b/reactos/dll/win32/propsys/propvar.c new file mode 100644 index 00000000000..117d7f54f2a --- /dev/null +++ b/reactos/dll/win32/propsys/propvar.c @@ -0,0 +1,603 @@ +/* + * PropVariant implementation + * + * Copyright 2008 James Hawkins for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include +#include + +#define NONAMELESSUNION + +#include +#include +//#include "winerror.h" +#include +//#include "winuser.h" +#include +#include + +#include +#include + +WINE_DEFAULT_DEBUG_CHANNEL(propsys); + +static HRESULT PROPVAR_ConvertFILETIME(PROPVARIANT *ppropvarDest, + REFPROPVARIANT propvarSrc, VARTYPE vt) +{ + SYSTEMTIME time; + + FileTimeToSystemTime(&propvarSrc->u.filetime, &time); + + switch (vt) + { + case VT_LPSTR: + { + static const char format[] = "%04d/%02d/%02d:%02d:%02d:%02d.%03d"; + + ppropvarDest->u.pszVal = HeapAlloc(GetProcessHeap(), 0, + lstrlenA(format) + 1); + if (!ppropvarDest->u.pszVal) + return E_OUTOFMEMORY; + + sprintf(ppropvarDest->u.pszVal, format, time.wYear, time.wMonth, + time.wDay, time.wHour, time.wMinute, + time.wSecond, time.wMilliseconds); + + return S_OK; + } + + default: + FIXME("Unhandled target type: %d\n", vt); + } + + return E_FAIL; +} + +static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, + int dest_signed, LONGLONG *res) +{ + int src_signed; + + switch (pv->vt) + { + case VT_I1: + src_signed = 1; + *res = pv->u.cVal; + break; + case VT_UI1: + src_signed = 0; + *res = pv->u.bVal; + break; + case VT_I2: + src_signed = 1; + *res = pv->u.iVal; + break; + case VT_UI2: + src_signed = 0; + *res = pv->u.uiVal; + break; + case VT_I4: + src_signed = 1; + *res = pv->u.lVal; + break; + case VT_UI4: + src_signed = 0; + *res = pv->u.ulVal; + break; + case VT_I8: + src_signed = 1; + *res = pv->u.hVal.QuadPart; + break; + case VT_UI8: + src_signed = 0; + *res = pv->u.uhVal.QuadPart; + break; + case VT_EMPTY: + src_signed = 0; + *res = 0; + break; + default: + FIXME("unhandled vt %d\n", pv->vt); + return E_NOTIMPL; + } + + if (*res < 0 && src_signed != dest_signed) + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + + if (dest_bits < 64) + { + if (dest_signed) + { + if (*res >= ((LONGLONG)1 << (dest_bits-1)) || + *res < ((LONGLONG)-1 << (dest_bits-1))) + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } + else + { + if ((ULONGLONG)(*res) >= ((ULONGLONG)1 << dest_bits)) + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } + } + + return S_OK; +} + +HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 16, 1, &res); + if (SUCCEEDED(hr)) *ret = (SHORT)res; + return hr; +} + +HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 32, 1, &res); + if (SUCCEEDED(hr)) *ret = (LONG)res; + return hr; +} + +HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 64, 1, &res); + if (SUCCEEDED(hr)) *ret = (LONGLONG)res; + return hr; +} + +HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 16, 0, &res); + if (SUCCEEDED(hr)) *ret = (USHORT)res; + return hr; +} + +HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 32, 0, &res); + if (SUCCEEDED(hr)) *ret = (ULONG)res; + return hr; +} + +HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret) +{ + LONGLONG res; + HRESULT hr; + + TRACE("%p,%p\n", propvarIn, ret); + + hr = PROPVAR_ConvertNumber(propvarIn, 64, 0, &res); + if (SUCCEEDED(hr)) *ret = (ULONGLONG)res; + return hr; +} + +/****************************************************************** + * PropVariantChangeType (PROPSYS.@) + */ +HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, + PROPVAR_CHANGE_FLAGS flags, VARTYPE vt) +{ + HRESULT hr; + + FIXME("(%p, %p, %d, %d, %d): semi-stub!\n", ppropvarDest, propvarSrc, + propvarSrc->vt, flags, vt); + + switch (vt) + { + case VT_I2: + { + SHORT res; + hr = PropVariantToInt16(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_I2; + ppropvarDest->u.iVal = res; + } + return hr; + } + case VT_UI2: + { + USHORT res; + hr = PropVariantToUInt16(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_UI2; + ppropvarDest->u.uiVal = res; + } + return hr; + } + case VT_I4: + { + LONG res; + hr = PropVariantToInt32(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_I4; + ppropvarDest->u.lVal = res; + } + return hr; + } + case VT_UI4: + { + ULONG res; + hr = PropVariantToUInt32(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_UI4; + ppropvarDest->u.ulVal = res; + } + return hr; + } + case VT_I8: + { + LONGLONG res; + hr = PropVariantToInt64(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_I8; + ppropvarDest->u.hVal.QuadPart = res; + } + return hr; + } + case VT_UI8: + { + ULONGLONG res; + hr = PropVariantToUInt64(propvarSrc, &res); + if (SUCCEEDED(hr)) + { + ppropvarDest->vt = VT_UI8; + ppropvarDest->u.uhVal.QuadPart = res; + } + return hr; + } + } + + switch (propvarSrc->vt) + { + case VT_FILETIME: + return PROPVAR_ConvertFILETIME(ppropvarDest, propvarSrc, vt); + default: + FIXME("Unhandled source type: %d\n", propvarSrc->vt); + } + + return E_FAIL; +} + +static void PROPVAR_GUIDToWSTR(REFGUID guid, WCHAR *str) +{ + static const WCHAR format[] = {'{','%','0','8','X','-','%','0','4','X','-','%','0','4','X', + '-','%','0','2','X','%','0','2','X','-','%','0','2','X','%','0','2','X','%','0','2','X', + '%','0','2','X','%','0','2','X','%','0','2','X','}',0}; + + sprintfW(str, format, guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); +} + +HRESULT WINAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar) +{ + TRACE("(%p %p)\n", guid, ppropvar); + + if(!guid) + return E_FAIL; + + ppropvar->vt = VT_LPWSTR; + ppropvar->u.pwszVal = CoTaskMemAlloc(39*sizeof(WCHAR)); + if(!ppropvar->u.pwszVal) + return E_OUTOFMEMORY; + + PROPVAR_GUIDToWSTR(guid, ppropvar->u.pwszVal); + return S_OK; +} + +HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar) +{ + TRACE("(%p %p)\n", guid, pvar); + + if(!guid) { + FIXME("guid == NULL\n"); + return E_FAIL; + } + + V_VT(pvar) = VT_BSTR; + V_BSTR(pvar) = SysAllocStringLen(NULL, 38); + if(!V_BSTR(pvar)) + return E_OUTOFMEMORY; + + PROPVAR_GUIDToWSTR(guid, V_BSTR(pvar)); + return S_OK; +} + +HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar) +{ + TRACE("(%p %u %p)\n", pv, cb, ppropvar); + + ppropvar->u.caub.pElems = CoTaskMemAlloc(cb); + if(!ppropvar->u.caub.pElems) + return E_OUTOFMEMORY; + + ppropvar->vt = VT_VECTOR|VT_UI1; + ppropvar->u.caub.cElems = cb; + memcpy(ppropvar->u.caub.pElems, pv, cb); + return S_OK; +} + +HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar) +{ + SAFEARRAY *arr; + void *data; + HRESULT hres; + + TRACE("(%p %u %p)\n", pv, cb, pvar); + + arr = SafeArrayCreateVector(VT_UI1, 0, cb); + if(!arr) + return E_OUTOFMEMORY; + + hres = SafeArrayAccessData(arr, &data); + if(FAILED(hres)) { + SafeArrayDestroy(arr); + return hres; + } + + memcpy(data, pv, cb); + + hres = SafeArrayUnaccessData(arr); + if(FAILED(hres)) { + SafeArrayDestroy(arr); + return hres; + } + + V_VT(pvar) = VT_ARRAY|VT_UI1; + V_ARRAY(pvar) = arr; + return S_OK; +} + +static inline DWORD PROPVAR_HexToNum(const WCHAR *hex) +{ + DWORD ret; + + if(hex[0]>='0' && hex[0]<='9') + ret = hex[0]-'0'; + else if(hex[0]>='a' && hex[0]<='f') + ret = hex[0]-'a'+10; + else if(hex[0]>='A' && hex[0]<='F') + ret = hex[0]-'A'+10; + else + return -1; + + ret <<= 4; + if(hex[1]>='0' && hex[1]<='9') + return ret + hex[1]-'0'; + else if(hex[1]>='a' && hex[1]<='f') + return ret + hex[1]-'a'+10; + else if(hex[1]>='A' && hex[1]<='F') + return ret + hex[1]-'A'+10; + else + return -1; +} + +static inline HRESULT PROPVAR_WCHARToGUID(const WCHAR *str, int len, GUID *guid) +{ + DWORD i, val=0; + const WCHAR *p; + + memset(guid, 0, sizeof(GUID)); + + if(len!=38 || str[0]!='{' || str[9]!='-' || str[14]!='-' + || str[19]!='-' || str[24]!='-' || str[37]!='}') { + WARN("Error parsing %s\n", debugstr_w(str)); + return E_INVALIDARG; + } + + p = str+1; + for(i=0; i<4 && val!=-1; i++) { + val = PROPVAR_HexToNum(p); + guid->Data1 = (guid->Data1<<8) + val; + p += 2; + } + p++; + for(i=0; i<2 && val!=-1; i++) { + val = PROPVAR_HexToNum(p); + guid->Data2 = (guid->Data2<<8) + val; + p += 2; + } + p++; + for(i=0; i<2 && val!=-1; i++) { + val = PROPVAR_HexToNum(p); + guid->Data3 = (guid->Data3<<8) + val; + p += 2; + } + p++; + for(i=0; i<8 && val!=-1; i++) { + if(i == 2) + p++; + + val = guid->Data4[i] = PROPVAR_HexToNum(p); + p += 2; + } + + if(val == -1) { + WARN("Error parsing %s\n", debugstr_w(str)); + memset(guid, 0, sizeof(GUID)); + return E_INVALIDARG; + } + return S_OK; +} + +HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid) +{ + TRACE("%p %p)\n", ppropvar, guid); + + switch(ppropvar->vt) { + case VT_BSTR: + return PROPVAR_WCHARToGUID(ppropvar->u.bstrVal, SysStringLen(ppropvar->u.bstrVal), guid); + case VT_LPWSTR: + return PROPVAR_WCHARToGUID(ppropvar->u.pwszVal, strlenW(ppropvar->u.pwszVal), guid); + + default: + FIXME("unsupported vt: %d\n", ppropvar->vt); + return E_NOTIMPL; + } +} + +HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid) +{ + TRACE("(%p %p)\n", pvar, guid); + + switch(V_VT(pvar)) { + case VT_BSTR: { + HRESULT hres = PROPVAR_WCHARToGUID(V_BSTR(pvar), SysStringLen(V_BSTR(pvar)), guid); + if(hres == E_INVALIDARG) + return E_FAIL; + return hres; + } + + default: + FIXME("unsupported vt: %d\n", V_VT(pvar)); + return E_NOTIMPL; + } +} + +static int isemptyornull(const PROPVARIANT *propvar) +{ + if (propvar->vt == VT_EMPTY || propvar->vt == VT_NULL) + return 1; + if ((propvar->vt & VT_ARRAY) == VT_ARRAY) + { + int i; + for (i=0; iu.parray->cDims; i++) + { + if (propvar->u.parray->rgsabound[i].cElements != 0) + break; + } + return i == propvar->u.parray->cDims; + } + /* FIXME: vectors, byrefs, errors? */ + return 0; +} + +INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, + PROPVAR_COMPARE_UNIT unit, PROPVAR_COMPARE_FLAGS flags) +{ + const PROPVARIANT *propvar2_converted; + PROPVARIANT propvar2_static; + HRESULT hr; + INT res=-1; + + TRACE("%p,%p,%x,%x\n", propvar1, propvar2, unit, flags); + + if (isemptyornull(propvar1)) + { + if (isemptyornull(propvar2)) + return 0; + return (flags & PVCF_TREATEMPTYASGREATERTHAN) ? 1 : -1; + } + + if (isemptyornull(propvar2)) + return (flags & PVCF_TREATEMPTYASGREATERTHAN) ? -1 : 1; + + if (propvar1->vt != propvar2->vt) + { + hr = PropVariantChangeType(&propvar2_static, propvar2, 0, propvar1->vt); + + if (FAILED(hr)) + return -1; + + propvar2_converted = &propvar2_static; + } + else + propvar2_converted = propvar2; + +#define CMP_INT_VALUE(var) do { \ + if (propvar1->u.var > propvar2_converted->u.var) \ + res = 1; \ + else if (propvar1->u.var < propvar2_converted->u.var) \ + res = -1; \ + else \ + res = 0; \ + } while (0) + + switch (propvar1->vt) + { + case VT_I1: + CMP_INT_VALUE(cVal); + break; + case VT_UI1: + CMP_INT_VALUE(bVal); + break; + case VT_I2: + CMP_INT_VALUE(iVal); + break; + case VT_UI2: + CMP_INT_VALUE(uiVal); + break; + case VT_I4: + CMP_INT_VALUE(lVal); + break; + case VT_UI4: + CMP_INT_VALUE(uiVal); + break; + case VT_I8: + CMP_INT_VALUE(hVal.QuadPart); + break; + case VT_UI8: + CMP_INT_VALUE(uhVal.QuadPart); + break; + case VT_BSTR: + /* FIXME: Use string flags. */ + res = lstrcmpW(propvar1->u.bstrVal, propvar2->u.bstrVal); + break; + default: + FIXME("vartype %d not handled\n", propvar1->vt); + res = -1; + break; + } + + if (propvar2_converted == &propvar2_static) + PropVariantClear(&propvar2_static); + + return res; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f1b19369251..cd767d4038b 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -142,6 +142,7 @@ reactos/dll/win32/pdh # Autosync reactos/dll/win32/pidgen # Synced to Wine-1.5.19 reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 reactos/dll/win32/printui # Synced to Wine-1.5.4 +reactos/dll/win32/propsys # Synced to Wine-1.5.26 reactos/dll/win32/pstorec # Synced to Wine-1.5.4 reactos/dll/win32/qmgr # Synced to Wine-1.2-rc5? reactos/dll/win32/qmgrprxy # Synced to Wine-1.14? From a1407ecabc4e6cdbdc36e222a96023fc0f384ba8 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 12:08:15 +0000 Subject: [PATCH 37/74] [PROPSYS_WINETEST] * Import from Wine 1.5.26. svn path=/trunk/; revision=58568 --- rostests/winetests/CMakeLists.txt | 1 + rostests/winetests/propsys/CMakeLists.txt | 7 + rostests/winetests/propsys/propstore.c | 263 +++++++ rostests/winetests/propsys/propsys.c | 905 ++++++++++++++++++++++ rostests/winetests/propsys/testlist.c | 14 + 5 files changed, 1190 insertions(+) create mode 100644 rostests/winetests/propsys/CMakeLists.txt create mode 100644 rostests/winetests/propsys/propstore.c create mode 100644 rostests/winetests/propsys/propsys.c create mode 100644 rostests/winetests/propsys/testlist.c diff --git a/rostests/winetests/CMakeLists.txt b/rostests/winetests/CMakeLists.txt index 95275caf08b..2b0870bce4e 100644 --- a/rostests/winetests/CMakeLists.txt +++ b/rostests/winetests/CMakeLists.txt @@ -58,6 +58,7 @@ add_subdirectory(oleacc) add_subdirectory(oleaut32) add_subdirectory(opengl32) add_subdirectory(pdh) +add_subdirectory(propsys) add_subdirectory(psapi) add_subdirectory(qmgr) add_subdirectory(quartz) diff --git a/rostests/winetests/propsys/CMakeLists.txt b/rostests/winetests/propsys/CMakeLists.txt new file mode 100644 index 00000000000..cdd0824979c --- /dev/null +++ b/rostests/winetests/propsys/CMakeLists.txt @@ -0,0 +1,7 @@ + +add_definitions(-D__ROS_LONG64__) +add_executable(propsys_winetest propstore.c propsys.c testlist.c) +target_link_libraries(propsys_winetest wine) +set_module_type(propsys_winetest win32cui) +add_importlibs(propsys_winetest propsys ole32 oleaut32 msvcrt kernel32 ntdll) +add_cd_file(TARGET propsys_winetest DESTINATION reactos/bin FOR all) diff --git a/rostests/winetests/propsys/propstore.c b/rostests/winetests/propsys/propstore.c new file mode 100644 index 00000000000..78c1979bffb --- /dev/null +++ b/rostests/winetests/propsys/propstore.c @@ -0,0 +1,263 @@ +/* + * Unit tests for IPropertyStore and related interfaces + * + * Copyright 2012 Vincent Povirk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS + +#include +//#include + +#define NONAMELESSUNION + +#include +#include +#include +#include +#include + +#include + +DEFINE_GUID(PKEY_WineTest, 0x7b317433, 0xdfa3, 0x4c44, 0xad, 0x3e, 0x2f, 0x80, 0x4b, 0x90, 0xdb, 0xf4); + +static void test_inmemorystore(void) +{ + IPropertyStoreCache *propcache; + HRESULT hr; + PROPERTYKEY pkey; + PROPVARIANT propvar; + DWORD count; + PSC_STATE state; + + hr = CoCreateInstance(&CLSID_InMemoryPropertyStore, NULL, CLSCTX_INPROC_SERVER, + &IID_IPropertyStoreCache, (void**)&propcache); + ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr); + + if (FAILED(hr)) + { + skip("CLSID_InMemoryPropertyStore not supported\n"); + return; + } + + hr = IPropertyStoreCache_GetCount(propcache, NULL); + ok(hr == E_POINTER, "GetCount failed, hr=%x\n", hr); + + hr = IPropertyStoreCache_GetCount(propcache, &count); + ok(hr == S_OK, "GetCount failed, hr=%x\n", hr); + ok(count == 0, "GetCount returned %i, expected 0\n", count); + + hr = IPropertyStoreCache_Commit(propcache); + ok(hr == S_OK, "Commit failed, hr=%x\n", hr); + + hr = IPropertyStoreCache_Commit(propcache); + ok(hr == S_OK, "Commit failed, hr=%x\n", hr); + + hr = IPropertyStoreCache_GetAt(propcache, 0, &pkey); + ok(hr == E_INVALIDARG, "GetAt failed, hr=%x\n", hr); + + pkey.fmtid = PKEY_WineTest; + pkey.pid = 4; + + memset(&propvar, 0, sizeof(propvar)); + propvar.vt = VT_I4; + propvar.u.lVal = 12345; + + if (0) + { + /* Crashes on Windows 7 */ + hr = IPropertyStoreCache_SetValue(propcache, NULL, &propvar); + ok(hr == E_POINTER, "SetValue failed, hr=%x\n", hr); + + hr = IPropertyStoreCache_SetValue(propcache, &pkey, NULL); + ok(hr == E_POINTER, "SetValue failed, hr=%x\n", hr); + } + + hr = IPropertyStoreCache_SetValue(propcache, &pkey, &propvar); + ok(hr == S_OK, "SetValue failed, hr=%x\n", hr); + + hr = IPropertyStoreCache_GetCount(propcache, &count); + ok(hr == S_OK, "GetCount failed, hr=%x\n", hr); + ok(count == 1, "GetCount returned %i, expected 0\n", count); + + memset(&pkey, 0, sizeof(pkey)); + + hr = IPropertyStoreCache_GetAt(propcache, 0, &pkey); + ok(hr == S_OK, "GetAt failed, hr=%x\n", hr); + ok(IsEqualGUID(&pkey.fmtid, &PKEY_WineTest), "got wrong pkey\n"); + ok(pkey.pid == 4, "got pid of %i, expected 4\n", pkey.pid); + + pkey.fmtid = PKEY_WineTest; + pkey.pid = 4; + + memset(&propvar, 0, sizeof(propvar)); + + if (0) + { + /* Crashes on Windows 7 */ + hr = IPropertyStoreCache_GetValue(propcache, NULL, &propvar); + ok(hr == E_POINTER, "GetValue failed, hr=%x\n", hr); + } + + hr = IPropertyStoreCache_GetValue(propcache, &pkey, NULL); + ok(hr == E_POINTER, "GetValue failed, hr=%x\n", hr); + + hr = IPropertyStoreCache_GetValue(propcache, &pkey, &propvar); + ok(hr == S_OK, "GetValue failed, hr=%x\n", hr); + ok(propvar.vt == VT_I4, "expected VT_I4, got %d\n", propvar.vt); + ok(propvar.u.lVal == 12345, "expected 12345, got %d\n", propvar.u.lVal); + + pkey.fmtid = PKEY_WineTest; + pkey.pid = 10; + + /* Get information for field that isn't set yet */ + propvar.vt = VT_I2; + hr = IPropertyStoreCache_GetValue(propcache, &pkey, &propvar); + ok(hr == S_OK, "GetValue failed, hr=%x\n", hr); + ok(propvar.vt == VT_EMPTY, "expected VT_EMPTY, got %d\n", propvar.vt); + + state = 0xdeadbeef; + hr = IPropertyStoreCache_GetState(propcache, &pkey, &state); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetState failed, hr=%x\n", hr); + ok(state == PSC_NORMAL, "expected PSC_NORMAL, got %d\n", state); + + propvar.vt = VT_I2; + state = 0xdeadbeef; + hr = IPropertyStoreCache_GetValueAndState(propcache, &pkey, &propvar, &state); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetValueAndState failed, hr=%x\n", hr); + ok(propvar.vt == VT_EMPTY, "expected VT_EMPTY, got %d\n", propvar.vt); + ok(state == PSC_NORMAL, "expected PSC_NORMAL, got %d\n", state); + + /* Set state on an unset field */ + hr = IPropertyStoreCache_SetState(propcache, &pkey, PSC_NORMAL); + ok(hr == TYPE_E_ELEMENTNOTFOUND, "SetState failed, hr=%x\n", hr); + + /* Manipulate state on already set field */ + pkey.fmtid = PKEY_WineTest; + pkey.pid = 4; + + state = 0xdeadbeef; + hr = IPropertyStoreCache_GetState(propcache, &pkey, &state); + ok(hr == S_OK, "GetState failed, hr=%x\n", hr); + ok(state == PSC_NORMAL, "expected PSC_NORMAL, got %d\n", state); + + hr = IPropertyStoreCache_SetState(propcache, &pkey, 10); + ok(hr == S_OK, "SetState failed, hr=%x\n", hr); + + state = 0xdeadbeef; + hr = IPropertyStoreCache_GetState(propcache, &pkey, &state); + ok(hr == S_OK, "GetState failed, hr=%x\n", hr); + ok(state == 10, "expected 10, got %d\n", state); + + propvar.vt = VT_I4; + propvar.u.lVal = 12346; + hr = IPropertyStoreCache_SetValueAndState(propcache, &pkey, &propvar, 5); + ok(hr == S_OK, "SetValueAndState failed, hr=%x\n", hr); + + memset(&propvar, 0, sizeof(propvar)); + state = 0xdeadbeef; + hr = IPropertyStoreCache_GetValueAndState(propcache, &pkey, &propvar, &state); + ok(hr == S_OK, "GetValueAndState failed, hr=%x\n", hr); + ok(propvar.vt == VT_I4, "expected VT_I4, got %d\n", propvar.vt); + ok(propvar.u.lVal == 12346, "expected 12346, got %d\n", propvar.vt); + ok(state == 5, "expected 5, got %d\n", state); + + /* Set new field with state */ + pkey.fmtid = PKEY_WineTest; + pkey.pid = 8; + + propvar.vt = VT_I4; + propvar.u.lVal = 12347; + hr = IPropertyStoreCache_SetValueAndState(propcache, &pkey, &propvar, PSC_DIRTY); + ok(hr == S_OK, "SetValueAndState failed, hr=%x\n", hr); + + memset(&propvar, 0, sizeof(propvar)); + state = 0xdeadbeef; + hr = IPropertyStoreCache_GetValueAndState(propcache, &pkey, &propvar, &state); + ok(hr == S_OK, "GetValueAndState failed, hr=%x\n", hr); + ok(propvar.vt == VT_I4, "expected VT_I4, got %d\n", propvar.vt); + ok(propvar.u.lVal == 12347, "expected 12347, got %d\n", propvar.vt); + ok(state == PSC_DIRTY, "expected PSC_DIRTY, got %d\n", state); + + IPropertyStoreCache_Release(propcache); +} + +static void test_persistserialized(void) +{ + IPropertyStore *propstore; + IPersistSerializedPropStorage *serialized; + HRESULT hr; + SERIALIZEDPROPSTORAGE *result; + DWORD result_size; + + hr = CoCreateInstance(&CLSID_InMemoryPropertyStore, NULL, CLSCTX_INPROC_SERVER, + &IID_IPropertyStore, (void**)&propstore); + ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr); + + hr = IPropertyStore_QueryInterface(propstore, &IID_IPersistSerializedPropStorage, + (void**)&serialized); + todo_wine ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr); + + if (FAILED(hr)) + { + skip("IPersistSerializedPropStorage not supported\n"); + return; + } + + hr = IPersistSerializedPropStorage_GetPropertyStorage(serialized, NULL, &result_size); + ok(hr == E_POINTER, "GetPropertyStorage failed, hr=%x\n", hr); + + hr = IPersistSerializedPropStorage_GetPropertyStorage(serialized, &result, NULL); + ok(hr == E_POINTER, "GetPropertyStorage failed, hr=%x\n", hr); + + hr = IPersistSerializedPropStorage_GetPropertyStorage(serialized, &result, &result_size); + ok(hr == S_OK, "GetPropertyStorage failed, hr=%x\n", hr); + + if (SUCCEEDED(hr)) + { + ok(result_size == 0, "expected 0 bytes, got %i\n", result_size); + + CoTaskMemFree(result); + } + + hr = IPersistSerializedPropStorage_SetPropertyStorage(serialized, NULL, 4); + ok(hr == E_POINTER, "SetPropertyStorage failed, hr=%x\n", hr); + + hr = IPersistSerializedPropStorage_SetPropertyStorage(serialized, NULL, 0); + ok(hr == S_OK, "SetPropertyStorage failed, hr=%x\n", hr); + + hr = IPropertyStore_GetCount(propstore, &result_size); + ok(hr == S_OK, "GetCount failed, hr=%x\n", hr); + ok(result_size == 0, "expecting 0, got %d\n", result_size); + + IPropertyStore_Release(propstore); + IPersistSerializedPropStorage_Release(serialized); +} + +START_TEST(propstore) +{ + CoInitialize(NULL); + + test_inmemorystore(); + test_persistserialized(); + + CoUninitialize(); +} diff --git a/rostests/winetests/propsys/propsys.c b/rostests/winetests/propsys/propsys.c new file mode 100644 index 00000000000..878cd985fe6 --- /dev/null +++ b/rostests/winetests/propsys/propsys.c @@ -0,0 +1,905 @@ +/* + * Unit tests for Windows property system + * + * Copyright 2006 Paul Vriens + * Copyright 2010 Andrew Nguyen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS + +//#include +#include + +#define NONAMELESSUNION + +#include +#include +#include +#include +//#include "objbase.h" +#include +#include +#include +#include +#include + +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(dummy_guid, 0xdeadbeef, 0xdead, 0xbeef, 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe); +DEFINE_GUID(expect_guid, 0x12345678, 0x1234, 0x1234, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12); + +#define GUID_MEMBERS(g) {(g).Data1, (g).Data2, (g).Data3, {(g).Data4[0], (g).Data4[1], (g).Data4[2], (g).Data4[3], (g).Data4[4], (g).Data4[5], (g).Data4[6], (g).Data4[7]}} + +static char *show_guid(const GUID *guid, char *buf) +{ + static char static_buf[40]; + + if(!buf) + buf = static_buf; + + sprintf(buf, + "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + guid->Data1, guid->Data2, guid->Data3, + guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], + guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] ); + + return buf; +} + +static int strcmp_wa(LPCWSTR strw, const char *stra) +{ + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + return lstrcmpA(stra, buf); +} + +static void test_PSStringFromPropertyKey(void) +{ + static const WCHAR fillerW[] = {'X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'X','X','X','X','X','X','X','X','X','X'}; + static const WCHAR zero_fillerW[] = {'\0','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X', + 'X','X','X','X','X','X','X','X','X','X','X','X','X','X'}; + static const WCHAR zero_truncatedW[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0', + '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0', + '0','0','0','}',' ','\0','9','X','X','X','X','X','X','X','X','X'}; + static const WCHAR zero_truncated2W[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0', + '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0', + '0','0','0','}',' ','\0','9','2','7','6','9','4','9','2','X','X'}; + static const WCHAR zero_truncated3W[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0', + '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0', + '0','0','0','}',' ','\0','9','2','7','6','9','4','9','2','4','X'}; + static const WCHAR zero_truncated4W[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0', + '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0', + '0','0','0','}',' ','\0','7','X','X','X','X','X','X','X','X','X'}; + static const WCHAR truncatedW[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','\0','9','X','X','X','X','X','X','X','X','X'}; + static const WCHAR truncated2W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','\0','9','2','7','6','9','4','9','2','X','X'}; + static const WCHAR truncated3W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','\0','9','2','7','6','9','4','9','2','4','X'}; + static const WCHAR truncated4W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','\0','7','X','X','X','X','X','X','X','X','X'}; + static const WCHAR expectedW[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','4','2','9','4','9','6','7','2','9','5',0}; + static const WCHAR expected2W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','1','3','5','7','9','\0','X','X','X','X','X'}; + static const WCHAR expected3W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0', + '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0', + '0','}',' ','0','\0','X','X','X','X','X','X','X','X','X'}; + PROPERTYKEY prop = {GUID_MEMBERS(GUID_NULL), ~0U}; + PROPERTYKEY prop2 = {GUID_MEMBERS(GUID_NULL), 13579}; + PROPERTYKEY prop3 = {GUID_MEMBERS(GUID_NULL), 0}; + WCHAR out[PKEYSTR_MAX]; + HRESULT ret; + + const struct + { + REFPROPERTYKEY pkey; + LPWSTR psz; + UINT cch; + HRESULT hr_expect; + const WCHAR *buf_expect; + int hr_broken; + HRESULT hr2; + int buf_broken; + const WCHAR *buf2; + } testcases[] = + { + {NULL, NULL, 0, E_POINTER}, + {&prop, NULL, 0, E_POINTER}, + {&prop, NULL, PKEYSTR_MAX, E_POINTER}, + {NULL, out, 0, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), fillerW}, + {NULL, out, PKEYSTR_MAX, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), zero_fillerW, 0, 0, 1, fillerW}, + {&prop, out, 0, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), fillerW}, + {&prop, out, GUIDSTRING_MAX, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), fillerW}, + {&prop, out, GUIDSTRING_MAX + 1, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), fillerW}, + {&prop, out, GUIDSTRING_MAX + 2, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), zero_truncatedW, 1, S_OK, 1, truncatedW}, + {&prop, out, PKEYSTR_MAX - 2, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), zero_truncated2W, 1, S_OK, 1, truncated2W}, + {&prop, out, PKEYSTR_MAX - 1, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), zero_truncated3W, 1, S_OK, 1, truncated3W}, + {&prop, out, PKEYSTR_MAX, S_OK, expectedW}, + {&prop2, out, GUIDSTRING_MAX + 2, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), zero_truncated4W, 1, S_OK, 1, truncated4W}, + {&prop2, out, GUIDSTRING_MAX + 6, S_OK, expected2W}, + {&prop2, out, PKEYSTR_MAX, S_OK, expected2W}, + {&prop3, out, GUIDSTRING_MAX + 1, HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), fillerW}, + {&prop3, out, GUIDSTRING_MAX + 2, S_OK, expected3W}, + {&prop3, out, PKEYSTR_MAX, S_OK, expected3W}, + }; + + int i; + + for (i = 0; i < sizeof(testcases)/sizeof(testcases[0]); i++) + { + if (testcases[i].psz) + memcpy(testcases[i].psz, fillerW, PKEYSTR_MAX * sizeof(WCHAR)); + + ret = PSStringFromPropertyKey(testcases[i].pkey, + testcases[i].psz, + testcases[i].cch); + ok(ret == testcases[i].hr_expect || + broken(testcases[i].hr_broken && ret == testcases[i].hr2), /* Vista/Win2k8 */ + "[%d] Expected PSStringFromPropertyKey to return 0x%08x, got 0x%08x\n", + i, testcases[i].hr_expect, ret); + + if (testcases[i].psz) + ok(!memcmp(testcases[i].psz, testcases[i].buf_expect, PKEYSTR_MAX * sizeof(WCHAR)) || + broken(testcases[i].buf_broken && + !memcmp(testcases[i].psz, testcases[i].buf2, PKEYSTR_MAX * sizeof(WCHAR))), /* Vista/Win2k8 */ + "[%d] Unexpected output contents\n", i); + } +} + +static void test_PSPropertyKeyFromString(void) +{ + static const WCHAR emptyW[] = {0}; + static const WCHAR fmtid_clsidW[] = {'S','t','d','F','o','n','t',' ','1',0}; + static const WCHAR fmtid_truncatedW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-',0}; + static const WCHAR fmtid_nobracketsW[] = {'1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2',0}; + static const WCHAR fmtid_badbracketW[] = {'X','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badcharW[] = {'{','X','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar2W[] = {'{','1','2','3','4','5','6','7','X','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_baddashW[] = {'{','1','2','3','4','5','6','7','8','X','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar3W[] = {'{','1','2','3','4','5','6','7','8','-','X','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar4W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','X','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_baddash2W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','X', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar5W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + 'X','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar6W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','X','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_baddash3W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','X','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar7W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','X','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar8W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','X','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_baddash4W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','X', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar9W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + 'X','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar9_adjW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','X','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar10W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','X','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar11W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','X','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar12W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','X','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badchar13W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','X','0','1','2','}',0}; + static const WCHAR fmtid_badchar14W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','X','2','}',0}; + static const WCHAR fmtid_badbracket2W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','X',0}; + static const WCHAR fmtid_spaceW[] = {' ','{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_spaceendW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',0}; + static const WCHAR fmtid_spacesendW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',' ',' ',0}; + static const WCHAR fmtid_nopidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',0}; + static const WCHAR fmtid_badpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','D','E','A','D',0}; + static const WCHAR fmtid_adjpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}','1','3','5','7','9',0}; + static const WCHAR fmtid_spacespidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',' ',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_negpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_negnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-','-','1','3','5','7','9',0}; + static const WCHAR fmtid_negnegnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-','-','-','1','3','5','7','9',0}; + static const WCHAR fmtid_negspacepidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_negspacenegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_negspacespidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-',' ','-',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_pospidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','+','1','3','5','7','9',0}; + static const WCHAR fmtid_posnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','+','-','+','-','1','3','5','7','9',0}; + static const WCHAR fmtid_symbolpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','+','/','$','-','1','3','5','7','9',0}; + static const WCHAR fmtid_letterpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','A','B','C','D','1','3','5','7','9',0}; + static const WCHAR fmtid_spacepadpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','3','5','7','9',' ',' ',' ',0}; + static const WCHAR fmtid_spacemixpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1',' ','3',' ','5','7','9',' ',' ',' ',0}; + static const WCHAR fmtid_tabpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}','\t','1','3','5','7','9',0}; + static const WCHAR fmtid_hexpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','0','x','D','E','A','D',0}; + static const WCHAR fmtid_mixedpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','A','9','B','5','C','3','D','1',0}; + static const WCHAR fmtid_overflowpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','2','3','4','5','6','7','8','9','0','1',0}; + static const WCHAR fmtid_commapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',','1','3','5','7','9',0}; + static const WCHAR fmtid_commaspidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',',',',',','1','3','5','7','9',0}; + static const WCHAR fmtid_commaspacepidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_spacecommapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',','1','3','5','7','9',0}; + static const WCHAR fmtid_spccommaspcpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_spacescommaspidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ',',','1','3','5','7','9',0}; + static const WCHAR fmtid_commanegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',','-','1','3','5','7','9',0}; + static const WCHAR fmtid_spccommanegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',','-','1','3','5','7','9',0}; + static const WCHAR fmtid_commaspcnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_spccommaspcnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ','-','1','3','5','7','9',0}; + static const WCHAR fmtid_commanegspcpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',',','-',' ','1','3','5','7','9',0}; + static const WCHAR fmtid_negcommapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}','-',',','1','3','5','7','9',0}; + static const WCHAR fmtid_normalpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-', + '1','2','3','4','-','1','2','3','4','-', + '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','3','5','7','9',0}; + PROPERTYKEY out_init = {GUID_MEMBERS(dummy_guid), 0xdeadbeef}; + PROPERTYKEY out; + HRESULT ret; + char guid_buf[40], guid_buf2[40]; + + const struct + { + LPCWSTR pwzString; + PROPERTYKEY *pkey; + HRESULT hr_expect; + PROPERTYKEY pkey_expect; + } testcases[] = + { + {NULL, NULL, E_POINTER}, + {NULL, &out, E_POINTER, {GUID_MEMBERS(dummy_guid), 0xdeadbeef}}, + {emptyW, NULL, E_POINTER}, + {emptyW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}}, + {fmtid_clsidW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}}, + {fmtid_truncatedW, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_nobracketsW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}}, + {fmtid_badbracketW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}}, + {fmtid_badcharW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}}, + {fmtid_badchar2W, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}}, + {fmtid_baddashW, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar3W, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar4W, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_baddash2W, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar5W, &out, E_INVALIDARG, { {0x12345678,0x1234,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar6W, &out, E_INVALIDARG, { {0x12345678,0x1234,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_baddash3W, &out, E_INVALIDARG, { {0x12345678,0x1234,0,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar7W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar8W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0,0,0,0,0,0,0}}, 0}}, + {fmtid_baddash4W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar9W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar9_adjW, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0,0,0,0,0,0}}, 0}}, + {fmtid_badchar10W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0,0,0,0,0}}, 0}}, + {fmtid_badchar11W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0,0,0,0}}, 0}}, + {fmtid_badchar12W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0,0,0}}, 0}}, + {fmtid_badchar13W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0,0}}, 0}}, + {fmtid_badchar14W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x90,0}}, 0}}, + {fmtid_badbracket2W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x00}}, 0 }}, + {fmtid_spaceW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0 }}, + {fmtid_spaceendW, &out, E_INVALIDARG, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_spacesendW, &out, E_INVALIDARG, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_nopidW, &out, E_INVALIDARG, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_badpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_adjpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_spacespidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_negpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_negnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}}, + {fmtid_negnegnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_negspacepidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_negspacenegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}}, + {fmtid_negspacespidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_pospidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_posnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_symbolpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_letterpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_spacepadpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_spacemixpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 1}}, + {fmtid_tabpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_hexpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_mixedpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_overflowpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 3755744309U}}, + {fmtid_commapidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_commaspidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_commaspacepidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_spacecommapidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_spccommaspcpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + {fmtid_spacescommaspidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_commanegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}}, + {fmtid_spccommanegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}}, + {fmtid_commaspcnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}}, + {fmtid_spccommaspcnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}}, + {fmtid_commanegspcpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0U}}, + {fmtid_negcommapidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}}, + {fmtid_normalpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}}, + }; + + int i; + + for (i = 0; i < sizeof(testcases)/sizeof(testcases[0]); i++) + { + if (testcases[i].pkey) + *testcases[i].pkey = out_init; + + ret = PSPropertyKeyFromString(testcases[i].pwzString, testcases[i].pkey); + ok(ret == testcases[i].hr_expect, + "[%d] Expected PSPropertyKeyFromString to return 0x%08x, got 0x%08x\n", + i, testcases[i].hr_expect, ret); + + if (testcases[i].pkey) + { + ok(IsEqualGUID(&testcases[i].pkey->fmtid, &testcases[i].pkey_expect.fmtid), + "[%d] Expected GUID %s, got %s\n", + i, show_guid(&testcases[i].pkey_expect.fmtid, guid_buf), show_guid(&testcases[i].pkey->fmtid, guid_buf2)); + ok(testcases[i].pkey->pid == testcases[i].pkey_expect.pid, + "[%d] Expected property ID %u, got %u\n", + i, testcases[i].pkey_expect.pid, testcases[i].pkey->pid); + } + } +} + +static void test_PSRefreshPropertySchema(void) +{ + HRESULT ret; + + ret = PSRefreshPropertySchema(); + todo_wine + ok(ret == CO_E_NOTINITIALIZED, + "Expected PSRefreshPropertySchema to return CO_E_NOTINITIALIZED, got 0x%08x\n", ret); + + CoInitialize(NULL); + + ret = PSRefreshPropertySchema(); + ok(ret == S_OK, + "Expected PSRefreshPropertySchema to return S_OK, got 0x%08x\n", ret); + + CoUninitialize(); +} + +static void test_InitPropVariantFromGUIDAsString(void) +{ + PROPVARIANT propvar; + VARIANT var; + HRESULT hres; + int i; + + const struct { + REFGUID guid; + const char *str; + } testcases[] = { + {&IID_NULL, "{00000000-0000-0000-0000-000000000000}" }, + {&dummy_guid, "{DEADBEEF-DEAD-BEEF-DEAD-BEEFCAFEBABE}" }, + }; + + hres = InitPropVariantFromGUIDAsString(NULL, &propvar); + ok(hres == E_FAIL, "InitPropVariantFromGUIDAsString returned %x\n", hres); + + if(0) { + /* Returns strange data on Win7, crashes on older systems */ + InitVariantFromGUIDAsString(NULL, &var); + + /* Crashes on windows */ + InitPropVariantFromGUIDAsString(&IID_NULL, NULL); + InitVariantFromGUIDAsString(&IID_NULL, NULL); + } + + for(i=0; i sizeof(unsigned long) && ll >> 32) + sprintf(string, "%lx%08lx", (unsigned long)(ll >> 32), (unsigned long)ll); + else + sprintf(string, "%lx", (unsigned long)ll); + return string; +} + +static void test_intconversions(void) +{ + PROPVARIANT propvar; + SHORT sval; + USHORT usval; + LONG lval; + ULONG ulval; + LONGLONG llval; + ULONGLONG ullval; + HRESULT hr; + + propvar.vt = 0xdead; + hr = PropVariantClear(&propvar); + ok (FAILED(hr), "PropVariantClear fails on invalid vt.\n"); + + propvar.vt = VT_I8; + PropVariantClear(&propvar); + + propvar.vt = VT_I8; + propvar.u.hVal.QuadPart = (LONGLONG)1 << 63; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == (LONGLONG)1 << 63, "got wrong value %s\n", debugstr_longlong(llval)); + + hr = PropVariantToUInt64(&propvar, &ullval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + hr = PropVariantToInt32(&propvar, &lval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + hr = PropVariantToUInt32(&propvar, &ulval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + hr = PropVariantToInt16(&propvar, &sval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + hr = PropVariantToUInt16(&propvar, &usval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + propvar.vt = VT_UI8; + propvar.u.uhVal.QuadPart = 5; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == 5, "got wrong value %s\n", debugstr_longlong(llval)); + + hr = PropVariantToUInt64(&propvar, &ullval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(ullval == 5, "got wrong value %s\n", debugstr_longlong(ullval)); + + hr = PropVariantToInt32(&propvar, &lval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(lval == 5, "got wrong value %d\n", lval); + + hr = PropVariantToUInt32(&propvar, &ulval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(ulval == 5, "got wrong value %d\n", ulval); + + hr = PropVariantToInt16(&propvar, &sval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(sval == 5, "got wrong value %d\n", sval); + + hr = PropVariantToUInt16(&propvar, &usval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(usval == 5, "got wrong value %d\n", usval); + + propvar.vt = VT_I8; + propvar.u.hVal.QuadPart = -5; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == -5, "got wrong value %s\n", debugstr_longlong(llval)); + + hr = PropVariantToUInt64(&propvar, &ullval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + hr = PropVariantToInt32(&propvar, &lval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(lval == -5, "got wrong value %d\n", lval); + + hr = PropVariantToUInt32(&propvar, &ulval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + hr = PropVariantToInt16(&propvar, &sval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(sval == -5, "got wrong value %d\n", sval); + + hr = PropVariantToUInt16(&propvar, &usval); + ok(hr == HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW), "hr=%x\n", hr); + + propvar.vt = VT_UI4; + propvar.u.ulVal = 6; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == 6, "got wrong value %s\n", debugstr_longlong(llval)); + + propvar.vt = VT_I4; + propvar.u.lVal = -6; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == -6, "got wrong value %s\n", debugstr_longlong(llval)); + + propvar.vt = VT_UI2; + propvar.u.uiVal = 7; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == 7, "got wrong value %s\n", debugstr_longlong(llval)); + + propvar.vt = VT_I2; + propvar.u.iVal = -7; + + hr = PropVariantToInt64(&propvar, &llval); + ok(hr == S_OK, "hr=%x\n", hr); + ok(llval == -7, "got wrong value %s\n", debugstr_longlong(llval)); +} + +START_TEST(propsys) +{ + test_PSStringFromPropertyKey(); + test_PSPropertyKeyFromString(); + test_PSRefreshPropertySchema(); + test_InitPropVariantFromGUIDAsString(); + test_InitPropVariantFromBuffer(); + test_PropVariantToGUID(); + test_PropVariantCompare(); + test_intconversions(); +} diff --git a/rostests/winetests/propsys/testlist.c b/rostests/winetests/propsys/testlist.c new file mode 100644 index 00000000000..3773d6ad652 --- /dev/null +++ b/rostests/winetests/propsys/testlist.c @@ -0,0 +1,14 @@ +/* Automatically generated file; DO NOT EDIT!! */ + +#define STANDALONE +#include + +extern void func_propstore(void); +extern void func_propsys(void); + +const struct test winetest_testlist[] = +{ + { "propstore", func_propstore }, + { "propsys", func_propsys }, + { 0, 0 } +}; From 1516b0c82dd59bc03895df27984af86e9d1de238 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 14:29:11 +0000 Subject: [PATCH 38/74] [URLMON] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58569 --- reactos/dll/win32/urlmon/CMakeLists.txt | 41 +- reactos/dll/win32/urlmon/axinstall.c | 525 ++++++++ reactos/dll/win32/urlmon/bindctx.c | 132 +- reactos/dll/win32/urlmon/binding.c | 62 +- reactos/dll/win32/urlmon/bindprot.c | 473 ++++--- reactos/dll/win32/urlmon/download.c | 84 +- reactos/dll/win32/urlmon/file.c | 13 +- reactos/dll/win32/urlmon/ftp.c | 2 +- reactos/dll/win32/urlmon/http.c | 127 +- reactos/dll/win32/urlmon/internet.c | 140 +- reactos/dll/win32/urlmon/mk.c | 2 +- reactos/dll/win32/urlmon/protocol.c | 158 ++- reactos/dll/win32/urlmon/resource.h | 26 + reactos/dll/win32/urlmon/sec_mgr.c | 578 ++++++--- reactos/dll/win32/urlmon/session.c | 200 +-- reactos/dll/win32/urlmon/umon.c | 296 +++-- reactos/dll/win32/urlmon/umstream.c | 2 +- reactos/dll/win32/urlmon/uri.c | 1345 ++++++++++++++------ reactos/dll/win32/urlmon/urlmon.rc | 67 + reactos/dll/win32/urlmon/urlmon.spec | 27 +- reactos/dll/win32/urlmon/urlmon_main.c | 364 +++++- reactos/dll/win32/urlmon/urlmon_main.h | 51 +- reactos/dll/win32/urlmon/urlmon_urlmon.idl | 17 +- reactos/dll/win32/urlmon/urlmon_urlmon.rgs | 141 ++ reactos/dll/win32/urlmon/usrmarshal.c | 30 +- reactos/include/psdk/urlmon.idl | 150 ++- reactos/media/doc/README.WINE | 2 +- 27 files changed, 3777 insertions(+), 1278 deletions(-) create mode 100644 reactos/dll/win32/urlmon/axinstall.c create mode 100644 reactos/dll/win32/urlmon/resource.h create mode 100644 reactos/dll/win32/urlmon/urlmon.rc create mode 100644 reactos/dll/win32/urlmon/urlmon_urlmon.rgs diff --git a/reactos/dll/win32/urlmon/CMakeLists.txt b/reactos/dll/win32/urlmon/CMakeLists.txt index 6f56eb87dc1..2821e68701d 100644 --- a/reactos/dll/win32/urlmon/CMakeLists.txt +++ b/reactos/dll/win32/urlmon/CMakeLists.txt @@ -1,5 +1,11 @@ -add_definitions(-D__WINESRC__) +add_definitions( + -D__WINESRC__ + -D_URLMON_ + -DENTRY_PREFIX=URLMON_ + -DPROXY_DELEGATION + -DWINE_REGISTER_DLL + -DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}") remove_definitions(-D_WIN32_WINNT=0x502) add_definitions(-D_WIN32_WINNT=0x600) @@ -11,6 +17,7 @@ spec2def(urlmon.dll urlmon.spec ADD_IMPORTLIB) add_rpcproxy_files(urlmon_urlmon.idl) list(APPEND SOURCE + axinstall.c bindctx.c binding.c bindprot.c @@ -24,7 +31,6 @@ list(APPEND SOURCE mimefilter.c mk.c protocol.c - protproxy.c sec_mgr.c session.c umon.c @@ -32,40 +38,15 @@ list(APPEND SOURCE uri.c urlmon_main.c usrmarshal.c - rsrc.rc + urlmon.rc ${CMAKE_CURRENT_BINARY_DIR}/proxy.dlldata.c ${CMAKE_CURRENT_BINARY_DIR}/urlmon_urlmon_p.c ${CMAKE_CURRENT_BINARY_DIR}/urlmon_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/urlmon.def) add_library(urlmon SHARED ${SOURCE}) - set_module_type(urlmon win32dll) - -target_link_libraries(urlmon - uuid - wine - ${PSEH_LIB}) - -add_importlibs(urlmon - rpcrt4 - ole32 - oleaut32 - shlwapi - shell32 - wininet - user32 - advapi32 - msvcrt - kernel32 - ntdll) - -add_definitions( - -DENTRY_PREFIX=URLMON_ - -DPROXY_DELEGATION - -DWINE_REGISTER_DLL - -D_URLMON_) - +target_link_libraries(urlmon uuid wine ${PSEH_LIB}) +add_importlibs(urlmon rpcrt4 propsys ole32 oleaut32 shlwapi shell32 wininet user32 advapi32 advpack msvcrt kernel32 ntdll) add_pch(urlmon urlmon_main.h) -add_definitions(-DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}") add_cd_file(TARGET urlmon DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/urlmon/axinstall.c b/reactos/dll/win32/urlmon/axinstall.c new file mode 100644 index 00000000000..ca1aef682cc --- /dev/null +++ b/reactos/dll/win32/urlmon/axinstall.c @@ -0,0 +1,525 @@ +/* + * Copyright 2012 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define OEMRESOURCE + +#include + +#include "urlmon_main.h" +#include "resource.h" + +#include "advpub.h" +#include "fdi.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(urlmon); + +static const WCHAR ctxW[] = {'c','t','x',0}; +static const WCHAR cab_extW[] = {'.','c','a','b',0}; +static const WCHAR infW[] = {'i','n','f',0}; +static const WCHAR dllW[] = {'d','l','l',0}; +static const WCHAR ocxW[] = {'o','c','x',0}; + +enum install_type { + INSTALL_UNKNOWN, + INSTALL_DLL, + INSTALL_INF +}; + +typedef struct { + IUri *uri; + IBindStatusCallback *callback; + BOOL release_on_stop; + BOOL cancel; + WCHAR *install_file; + const WCHAR *cache_file; + const WCHAR *tmp_dir; + const WCHAR *file_name; + enum install_type install_type; + HWND hwnd; + int counter; + INT_PTR timer; +} install_ctx_t; + +static void release_install_ctx(install_ctx_t *ctx) +{ + if(ctx->uri) + IUri_Release(ctx->uri); + if(ctx->callback) + IBindStatusCallback_Release(ctx->callback); + heap_free(ctx->install_file); + heap_free(ctx); +} + +static inline BOOL file_exists(const WCHAR *file_name) +{ + return GetFileAttributesW(file_name) != INVALID_FILE_ATTRIBUTES; +} + +static HRESULT extract_cab_file(install_ctx_t *ctx) +{ + size_t path_len, file_len; + WCHAR *ptr; + HRESULT hres; + + hres = ExtractFilesW(ctx->cache_file, ctx->tmp_dir, 0, NULL, NULL, 0); + if(FAILED(hres)) { + WARN("ExtractFilesW failed: %08x\n", hres); + return hres; + } + + path_len = strlenW(ctx->tmp_dir); + file_len = strlenW(ctx->file_name); + ctx->install_file = heap_alloc((path_len+file_len+2)*sizeof(WCHAR)); + if(!ctx->install_file) + return E_OUTOFMEMORY; + + memcpy(ctx->install_file, ctx->tmp_dir, path_len*sizeof(WCHAR)); + ctx->install_file[path_len] = '\\'; + memcpy(ctx->install_file+path_len+1, ctx->file_name, (file_len+1)*sizeof(WCHAR)); + + /* NOTE: Assume that file_name contains ".cab" extension */ + ptr = ctx->install_file+path_len+1+file_len-3; + + memcpy(ptr, infW, sizeof(infW)); + if(file_exists(ctx->install_file)) { + ctx->install_type = INSTALL_INF; + return S_OK; + } + + memcpy(ptr, dllW, sizeof(dllW)); + if(file_exists(ctx->install_file)) { + ctx->install_type = INSTALL_DLL; + return S_OK; + } + + memcpy(ptr, ocxW, sizeof(ocxW)); + if(file_exists(ctx->install_file)) { + ctx->install_type = INSTALL_DLL; + return S_OK; + } + + FIXME("No known install file\n"); + return E_NOTIMPL; +} + +static HRESULT setup_dll(install_ctx_t *ctx) +{ + HMODULE module; + HRESULT hres; + + HRESULT (WINAPI *reg_func)(void); + + module = LoadLibraryW(ctx->install_file); + if(!module) + return E_FAIL; + + reg_func = (void*)GetProcAddress(module, "DllRegisterServer"); + if(reg_func) { + hres = reg_func(); + }else { + WARN("no DllRegisterServer function\n"); + hres = E_FAIL; + } + + FreeLibrary(module); + return hres; +} + +static void expand_command(install_ctx_t *ctx, const WCHAR *cmd, WCHAR *buf, size_t *size) +{ + const WCHAR *ptr = cmd, *prev_ptr = cmd; + size_t len = 0, len2; + + static const WCHAR expand_dirW[] = {'%','E','X','T','R','A','C','T','_','D','I','R','%'}; + + while((ptr = strchrW(ptr, '%'))) { + if(buf) + memcpy(buf+len, prev_ptr, ptr-prev_ptr); + len += ptr-prev_ptr; + + if(!strncmpiW(ptr, expand_dirW, sizeof(expand_dirW)/sizeof(WCHAR))) { + len2 = strlenW(ctx->tmp_dir); + if(buf) + memcpy(buf+len, ctx->tmp_dir, len2*sizeof(WCHAR)); + len += len2; + ptr += sizeof(expand_dirW)/sizeof(WCHAR); + }else { + FIXME("Can't expand %s\n", debugstr_w(ptr)); + if(buf) + buf[len] = '%'; + len++; + ptr++; + } + + prev_ptr = ptr; + } + + if(buf) + strcpyW(buf+len, prev_ptr); + *size = len + strlenW(prev_ptr) + 1; +} + +static HRESULT process_hook_section(install_ctx_t *ctx, const WCHAR *sect_name) +{ + WCHAR buf[2048], val[2*MAX_PATH]; + const WCHAR *key; + DWORD len; + HRESULT hres; + + static const WCHAR runW[] = {'r','u','n',0}; + + len = GetPrivateProfileStringW(sect_name, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file); + if(!len) + return S_OK; + + for(key = buf; *key; key += strlenW(key)+1) { + if(!strcmpiW(key, runW)) { + WCHAR *cmd; + size_t size; + + len = GetPrivateProfileStringW(sect_name, runW, NULL, val, sizeof(val)/sizeof(*val), ctx->install_file); + + TRACE("Run %s\n", debugstr_w(val)); + + expand_command(ctx, val, NULL, &size); + + cmd = heap_alloc(size*sizeof(WCHAR)); + if(!cmd) + heap_free(cmd); + + expand_command(ctx, val, cmd, &size); + hres = RunSetupCommandW(ctx->hwnd, cmd, NULL, ctx->tmp_dir, NULL, NULL, 0, NULL); + heap_free(cmd); + if(FAILED(hres)) + return hres; + }else { + FIXME("Unsupported hook %s\n", debugstr_w(key)); + return E_NOTIMPL; + } + } + + return S_OK; +} + +static HRESULT install_inf_file(install_ctx_t *ctx) +{ + WCHAR buf[2048], sect_name[128]; + BOOL default_install = TRUE; + const WCHAR *key; + DWORD len; + HRESULT hres; + + static const WCHAR setup_hooksW[] = {'S','e','t','u','p',' ','H','o','o','k','s',0}; + static const WCHAR add_codeW[] = {'A','d','d','.','C','o','d','e',0}; + + len = GetPrivateProfileStringW(setup_hooksW, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file); + if(len) { + default_install = FALSE; + + for(key = buf; *key; key += strlenW(key)+1) { + TRACE("[Setup Hooks] key: %s\n", debugstr_w(key)); + + len = GetPrivateProfileStringW(setup_hooksW, key, NULL, sect_name, sizeof(sect_name)/sizeof(*sect_name), + ctx->install_file); + if(!len) { + WARN("Could not get key value\n"); + return E_FAIL; + } + + hres = process_hook_section(ctx, sect_name); + if(FAILED(hres)) + return hres; + } + } + + len = GetPrivateProfileStringW(add_codeW, NULL, NULL, buf, sizeof(buf)/sizeof(*buf), ctx->install_file); + if(len) { + FIXME("[Add.Code] section not supported\n"); + + /* Don't throw an error if we successfully ran setup hooks; + installation is likely to be complete enough */ + if(default_install) + return E_NOTIMPL; + } + + if(default_install) { + hres = RunSetupCommandW(ctx->hwnd, ctx->install_file, NULL, ctx->tmp_dir, NULL, NULL, RSC_FLAG_INF, NULL); + if(FAILED(hres)) { + WARN("RunSetupCommandW failed: %08x\n", hres); + return hres; + } + } + + return S_OK; +} + +static HRESULT install_cab_file(install_ctx_t *ctx) +{ + WCHAR tmp_path[MAX_PATH], tmp_dir[MAX_PATH]; + BOOL res = FALSE, leave_temp = FALSE; + DWORD i; + HRESULT hres; + + GetTempPathW(sizeof(tmp_path)/sizeof(WCHAR), tmp_path); + + for(i=0; !res && i < 100; i++) { + GetTempFileNameW(tmp_path, NULL, GetTickCount() + i*17037, tmp_dir); + res = CreateDirectoryW(tmp_dir, NULL); + } + if(!res) + return E_FAIL; + + ctx->tmp_dir = tmp_dir; + + TRACE("Using temporary directory %s\n", debugstr_w(tmp_dir)); + + hres = extract_cab_file(ctx); + if(SUCCEEDED(hres)) { + if(ctx->callback) + IBindStatusCallback_OnProgress(ctx->callback, 0, 0, BINDSTATUS_INSTALLINGCOMPONENTS, ctx->install_file); + + switch(ctx->install_type) { + case INSTALL_INF: + hres = install_inf_file(ctx); + break; + case INSTALL_DLL: + FIXME("Installing DLL, registering in temporary location\n"); + hres = setup_dll(ctx); + if(SUCCEEDED(hres)) + leave_temp = TRUE; + break; + default: + assert(0); + } + } + + if(!leave_temp) + RemoveDirectoryW(ctx->tmp_dir); + return hres; +} + +static void update_counter(install_ctx_t *ctx, HWND hwnd) +{ + WCHAR text[100]; + + if(--ctx->counter <= 0) { + HWND button_hwnd; + + KillTimer(hwnd, ctx->timer); + LoadStringW(urlmon_instance, IDS_AXINSTALL_INSTALL, text, sizeof(text)/sizeof(WCHAR)); + + button_hwnd = GetDlgItem(hwnd, ID_AXINSTALL_INSTALL_BTN); + EnableWindow(button_hwnd, TRUE); + }else { + WCHAR buf[100]; + LoadStringW(urlmon_instance, IDS_AXINSTALL_INSTALLN, buf, sizeof(buf)/sizeof(WCHAR)); + sprintfW(text, buf, ctx->counter); + } + + SetDlgItemTextW(hwnd, ID_AXINSTALL_INSTALL_BTN, text); +} + +static BOOL init_warning_dialog(HWND hwnd, install_ctx_t *ctx) +{ + BSTR display_uri; + HRESULT hres; + + if(!SetPropW(hwnd, ctxW, ctx)) + return FALSE; + + hres = IUri_GetDisplayUri(ctx->uri, &display_uri); + if(FAILED(hres)) + return FALSE; + + SetDlgItemTextW(hwnd, ID_AXINSTALL_LOCATION, display_uri); + SysFreeString(display_uri); + + SendDlgItemMessageW(hwnd, ID_AXINSTALL_ICON, STM_SETICON, + (WPARAM)LoadIconW(0, (const WCHAR*)OIC_WARNING), 0); + + ctx->counter = 4; + update_counter(ctx, hwnd); + ctx->timer = SetTimer(hwnd, 1, 1000, NULL); + return TRUE; +} + +static INT_PTR WINAPI warning_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch(msg) { + case WM_INITDIALOG: { + if(!init_warning_dialog(hwnd, (install_ctx_t*)lparam)) + EndDialog(hwnd, 0); + return TRUE; + } + case WM_COMMAND: + switch(wparam) { + case ID_AXINSTALL_INSTALL_BTN: { + install_ctx_t *ctx = GetPropW(hwnd, ctxW); + if(ctx) + ctx->cancel = FALSE; + EndDialog(hwnd, 0); + return FALSE; + } + case IDCANCEL: + EndDialog(hwnd, 0); + return FALSE; + } + case WM_TIMER: + update_counter(GetPropW(hwnd, ctxW), hwnd); + return TRUE; + } + + return FALSE; +} + +static BOOL install_warning(install_ctx_t *ctx) +{ + IWindowForBindingUI *window_iface; + HWND parent_hwnd = NULL; + HRESULT hres; + + if(!ctx->callback) { + FIXME("no callback\n"); + return FALSE; + } + + hres = IBindStatusCallback_QueryInterface(ctx->callback, &IID_IWindowForBindingUI, (void**)&window_iface); + if(FAILED(hres)) + return FALSE; + + hres = IWindowForBindingUI_GetWindow(window_iface, &IID_ICodeInstall, &ctx->hwnd); + IWindowForBindingUI_Release(window_iface); + if(FAILED(hres)) + return FALSE; + + ctx->cancel = TRUE; + DialogBoxParamW(urlmon_instance, MAKEINTRESOURCEW(ID_AXINSTALL_WARNING_DLG), parent_hwnd, warning_proc, (LPARAM)ctx); + return !ctx->cancel; +} + +static HRESULT install_file(install_ctx_t *ctx, const WCHAR *cache_file) +{ + BSTR path; + HRESULT hres; + + TRACE("%s\n", debugstr_w(cache_file)); + + ctx->cache_file = cache_file; + + if(!install_warning(ctx)) { + TRACE("Installation cancelled\n"); + return S_OK; + } + + hres = IUri_GetPath(ctx->uri, &path); + if(SUCCEEDED(hres)) { + const WCHAR *ptr, *ptr2, *ext; + + ptr = strrchrW(path, '/'); + if(!ptr) + ptr = path; + else + ptr++; + + ptr2 = strrchrW(ptr, '\\'); + if(ptr2) + ptr = ptr2+1; + + ctx->file_name = ptr; + ext = strrchrW(ptr, '.'); + if(!ext) + ext = ptr; + + if(!strcmpW(ext, cab_extW)) { + hres = install_cab_file(ctx); + }else { + FIXME("Unsupported extension %s\n", debugstr_w(ext)); + hres = E_NOTIMPL; + } + SysFreeString(path); + } + + return hres; +} + +static void failure_msgbox(install_ctx_t *ctx, HRESULT hres) +{ + WCHAR buf[1024], fmt[1024]; + + LoadStringW(urlmon_instance, IDS_AXINSTALL_FAILURE, fmt, sizeof(fmt)/sizeof(WCHAR)); + sprintfW(buf, fmt, hres); + MessageBoxW(ctx->hwnd, buf, NULL, MB_OK); +} + +static HRESULT distunit_on_stop(void *ctx, const WCHAR *cache_file, HRESULT hresult, const WCHAR *error_str) +{ + install_ctx_t *install_ctx = ctx; + + TRACE("(%p %s %08x %s)\n", ctx, debugstr_w(cache_file), hresult, debugstr_w(error_str)); + + if(hresult == S_OK) { + hresult = install_file(install_ctx, cache_file); + if(FAILED(hresult)) + failure_msgbox(ctx, hresult); + } + + if(install_ctx->callback) + IBindStatusCallback_OnStopBinding(install_ctx->callback, hresult, error_str); + + if(install_ctx->release_on_stop) + release_install_ctx(install_ctx); + return S_OK; +} + +/*********************************************************************** + * AsyncInstallDistributionUnit (URLMON.@) + */ +HRESULT WINAPI AsyncInstallDistributionUnit(const WCHAR *szDistUnit, const WCHAR *szTYPE, const WCHAR *szExt, + DWORD dwFileVersionMS, DWORD dwFileVersionLS, const WCHAR *szURL, IBindCtx *pbc, void *pvReserved, DWORD flags) +{ + install_ctx_t *ctx; + HRESULT hres; + + TRACE("(%s %s %s %x %x %s %p %p %x)\n", debugstr_w(szDistUnit), debugstr_w(szTYPE), debugstr_w(szExt), + dwFileVersionMS, dwFileVersionLS, debugstr_w(szURL), pbc, pvReserved, flags); + + if(szDistUnit || szTYPE || szExt) + FIXME("Unsupported arguments\n"); + + ctx = heap_alloc_zero(sizeof(*ctx)); + if(!ctx) + return E_OUTOFMEMORY; + + hres = CreateUri(szURL, 0, 0, &ctx->uri); + if(FAILED(hres)) { + heap_free(ctx); + return E_OUTOFMEMORY; + } + + ctx->callback = bsc_from_bctx(pbc); + + hres = download_to_cache(ctx->uri, distunit_on_stop, ctx, ctx->callback); + if(hres == MK_S_ASYNCHRONOUS) + ctx->release_on_stop = TRUE; + else + release_install_ctx(ctx); + + return hres; +} diff --git a/reactos/dll/win32/urlmon/bindctx.c b/reactos/dll/win32/urlmon/bindctx.c index c7bd4e45d1f..c017e8f26f7 100644 --- a/reactos/dll/win32/urlmon/bindctx.c +++ b/reactos/dll/win32/urlmon/bindctx.c @@ -23,7 +23,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); -static WCHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 }; +static WCHAR bscb_holderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 }; extern IID IID_IBindStatusCallbackHolder; @@ -51,6 +51,45 @@ static void *get_callback_iface(BindStatusCallback *This, REFIID riid) return SUCCEEDED(hres) ? ret : NULL; } +static IBindStatusCallback *bsch_from_bctx(IBindCtx *bctx) +{ + IBindStatusCallback *bsc; + IUnknown *unk; + HRESULT hres; + + hres = IBindCtx_GetObjectParam(bctx, bscb_holderW, &unk); + if(FAILED(hres)) + return NULL; + + hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc); + IUnknown_Release(unk); + return SUCCEEDED(hres) ? bsc : NULL; +} + +IBindStatusCallback *bsc_from_bctx(IBindCtx *bctx) +{ + BindStatusCallback *holder; + IBindStatusCallback *bsc; + HRESULT hres; + + bsc = bsch_from_bctx(bctx); + if(!bsc) + return NULL; + + hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder); + if(FAILED(hres)) + return bsc; + + if(holder->callback) { + IBindStatusCallback_Release(bsc); + bsc = holder->callback; + IBindStatusCallback_AddRef(bsc); + } + + IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface); + return bsc; +} + static inline BindStatusCallback *impl_from_IBindStatusCallbackEx(IBindStatusCallbackEx *iface) { return CONTAINING_RECORD(iface, BindStatusCallback, IBindStatusCallbackEx_iface); @@ -90,7 +129,7 @@ static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallbackEx *i } if(*ppv) { - IBindStatusCallback_AddRef((IUnknown*)*ppv); + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } @@ -158,7 +197,7 @@ static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallbackEx *iface { BindStatusCallback *This = impl_from_IBindStatusCallbackEx(iface); - TRACE("%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode, + TRACE("%p)->(%u %u %s %s)\n", This, ulProgress, ulProgressMax, debugstr_bindstatus(ulStatusCode), debugstr_w(szStatusText)); return IBindStatusCallback_OnProgress(This->callback, ulProgress, @@ -261,19 +300,19 @@ static HRESULT WINAPI BSCServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv) { BindStatusCallback *This = impl_from_IServiceProvider(iface); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } static ULONG WINAPI BSCServiceProvider_AddRef(IServiceProvider *iface) { BindStatusCallback *This = impl_from_IServiceProvider(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface); } static ULONG WINAPI BSCServiceProvider_Release(IServiceProvider *iface) { BindStatusCallback *This = impl_from_IServiceProvider(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); } static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface, @@ -284,17 +323,17 @@ static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface, if(IsEqualGUID(&IID_IHttpNegotiate, guidService)) { TRACE("(%p)->(IID_IHttpNegotiate %s %p)\n", This, debugstr_guid(riid), ppv); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } if(IsEqualGUID(&IID_IHttpNegotiate2, guidService)) { TRACE("(%p)->(IID_IHttpNegotiate2 %s %p)\n", This, debugstr_guid(riid), ppv); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } if(IsEqualGUID(&IID_IAuthenticate, guidService)) { TRACE("(%p)->(IID_IAuthenticate %s %p)\n", This, debugstr_guid(riid), ppv); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); @@ -328,19 +367,19 @@ static HRESULT WINAPI BSCHttpNegotiate_QueryInterface(IHttpNegotiate2 *iface, REFIID riid, void **ppv) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } static ULONG WINAPI BSCHttpNegotiate_AddRef(IHttpNegotiate2 *iface) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface); } static ULONG WINAPI BSCHttpNegotiate_Release(IHttpNegotiate2 *iface) { BindStatusCallback *This = impl_from_IHttpNegotiate2(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); } static HRESULT WINAPI BSCHttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface, @@ -428,19 +467,19 @@ static inline BindStatusCallback *impl_from_IAuthenticate(IAuthenticate *iface) static HRESULT WINAPI BSCAuthenticate_QueryInterface(IAuthenticate *iface, REFIID riid, void **ppv) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - return IBindStatusCallback_QueryInterface(&This->IAuthenticate_iface, riid, ppv); + return IBindStatusCallbackEx_QueryInterface(&This->IBindStatusCallbackEx_iface, riid, ppv); } static ULONG WINAPI BSCAuthenticate_AddRef(IAuthenticate *iface) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_AddRef(&This->IBindStatusCallbackEx_iface); } static ULONG WINAPI BSCAuthenticate_Release(IAuthenticate *iface) { BindStatusCallback *This = impl_from_IAuthenticate(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallbackEx_iface); + return IBindStatusCallbackEx_Release(&This->IBindStatusCallbackEx_iface); } static HRESULT WINAPI BSCAuthenticate_Authenticate(IAuthenticate *iface, @@ -516,7 +555,6 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb { BindStatusCallback *holder; IBindStatusCallback *bsc, *prev = NULL; - IUnknown *unk; HRESULT hres; TRACE("(%p %p %p %x)\n", pbc, pbsc, ppbscPrevious, dwReserved); @@ -524,34 +562,30 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb if (!pbc || !pbsc) return E_INVALIDARG; - hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk); - if(SUCCEEDED(hres)) { - hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&bsc); - IUnknown_Release(unk); + bsc = bsch_from_bctx(pbc); + if(bsc) { + hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder); if(SUCCEEDED(hres)) { - hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackHolder, (void**)&holder); - if(SUCCEEDED(hres)) { - if(ppbscPrevious) { - IBindStatusCallback_AddRef(holder->callback); - *ppbscPrevious = holder->callback; - } - - set_callback(holder, pbsc); - - IBindStatusCallback_Release(bsc); - IBindStatusCallback_Release(&holder->IBindStatusCallbackEx_iface); - return S_OK; - }else { - prev = bsc; + if(ppbscPrevious) { + IBindStatusCallback_AddRef(holder->callback); + *ppbscPrevious = holder->callback; } + + set_callback(holder, pbsc); + + IBindStatusCallback_Release(bsc); + IBindStatusCallbackEx_Release(&holder->IBindStatusCallbackEx_iface); + return S_OK; + }else { + prev = bsc; } - IBindCtx_RevokeObjectParam(pbc, BSCBHolder); + IBindCtx_RevokeObjectParam(pbc, bscb_holderW); } hres = wrap_callback(pbsc, &bsc); if(SUCCEEDED(hres)) { - hres = IBindCtx_RegisterObjectParam(pbc, BSCBHolder, (IUnknown*)bsc); + hres = IBindCtx_RegisterObjectParam(pbc, bscb_holderW, (IUnknown*)bsc); IBindStatusCallback_Release(bsc); } if(FAILED(hres)) { @@ -579,39 +613,21 @@ HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pb */ HRESULT WINAPI RevokeBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc) { - BindStatusCallback *holder; IBindStatusCallback *callback; - IUnknown *unk; - BOOL dorevoke = FALSE; - HRESULT hres; TRACE("(%p %p)\n", pbc, pbsc); if (!pbc || !pbsc) return E_INVALIDARG; - hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk); - if(FAILED(hres)) + callback = bsc_from_bctx(pbc); + if(!callback) return S_OK; - hres = IUnknown_QueryInterface(unk, &IID_IBindStatusCallback, (void**)&callback); - IUnknown_Release(unk); - if(FAILED(hres)) - return S_OK; + if(callback == pbsc) + IBindCtx_RevokeObjectParam(pbc, bscb_holderW); - hres = IBindStatusCallback_QueryInterface(callback, &IID_IBindStatusCallbackHolder, (void**)&holder); - if(SUCCEEDED(hres)) { - if(pbsc == holder->callback) - dorevoke = TRUE; - IBindStatusCallback_Release(&holder->IBindStatusCallbackEx_iface); - }else if(pbsc == callback) { - dorevoke = TRUE; - } IBindStatusCallback_Release(callback); - - if(dorevoke) - IBindCtx_RevokeObjectParam(pbc, BSCBHolder); - return S_OK; } diff --git a/reactos/dll/win32/urlmon/binding.c b/reactos/dll/win32/urlmon/binding.c index 1eb4bf7e86b..6f287511599 100644 --- a/reactos/dll/win32/urlmon/binding.c +++ b/reactos/dll/win32/urlmon/binding.c @@ -92,6 +92,7 @@ typedef struct { BOOL use_cache_file; DWORD state; HRESULT hres; + CLSID clsid; download_state_t download_state; IUnknown *obj; IMoniker *mon; @@ -107,7 +108,7 @@ static void read_protocol_data(stgmed_buf_t *stgmed_buf) DWORD read; HRESULT hres; - do hres = IInternetProtocol_Read(stgmed_buf->protocol, buf, sizeof(buf), &read); + do hres = IInternetProtocolEx_Read(stgmed_buf->protocol, buf, sizeof(buf), &read); while(hres == S_OK); } @@ -178,8 +179,8 @@ static void stop_binding(Binding *binding, HRESULT hres, LPCWSTR str) if(!(binding->state & BINDING_STOPPED)) { binding->state |= BINDING_STOPPED; - IBindStatusCallback_OnStopBinding(binding->callback, hres, str); binding->hres = hres; + IBindStatusCallback_OnStopBinding(binding->callback, hres, str); } } @@ -310,6 +311,7 @@ static void create_object(Binding *binding) heap_free(clsid_str); IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_ENDSYNCOPERATION, NULL); + binding->clsid = CLSID_NULL; stop_binding(binding, hres, NULL); if(FAILED(hres)) @@ -372,7 +374,7 @@ static ULONG WINAPI StgMedUnk_Release(IUnknown *iface) if(!ref) { if(This->file != INVALID_HANDLE_VALUE) CloseHandle(This->file); - IInternetProtocol_Release(This->protocol); + IInternetProtocolEx_Release(This->protocol); heap_free(This->cache_file); heap_free(This); @@ -398,7 +400,7 @@ static stgmed_buf_t *create_stgmed_buf(IInternetProtocolEx *protocol) ret->hres = S_OK; ret->cache_file = NULL; - IInternetProtocol_AddRef(protocol); + IInternetProtocolEx_AddRef(protocol); ret->protocol = protocol; URLMON_LockModule(); @@ -484,7 +486,7 @@ static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv, TRACE("(%p)->(%p %d %p)\n", This, pv, cb, pcbRead); if(This->buf->file == INVALID_HANDLE_VALUE) { - hres = This->buf->hres = IInternetProtocol_Read(This->buf->protocol, (PBYTE)pv, cb, &read); + hres = This->buf->hres = IInternetProtocolEx_Read(This->buf->protocol, (PBYTE)pv, cb, &read); }else { hres = ReadFile(This->buf->file, pv, cb, &read, NULL) ? S_OK : INET_E_DOWNLOAD_FAILURE; } @@ -881,8 +883,23 @@ static HRESULT WINAPI Binding_GetBindResult(IBinding *iface, CLSID *pclsidProtoc DWORD *pdwResult, LPOLESTR *pszResult, DWORD *pdwReserved) { Binding *This = impl_from_IBinding(iface); - FIXME("(%p)->(%p %p %p %p)\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved); - return E_NOTIMPL; + + TRACE("(%p)->(%p %p %p %p)\n", This, pclsidProtocol, pdwResult, pszResult, pdwReserved); + + if(!pdwResult || !pszResult || pdwReserved) + return E_INVALIDARG; + + if(!(This->state & BINDING_STOPPED)) { + *pclsidProtocol = CLSID_NULL; + *pdwResult = 0; + *pszResult = NULL; + return S_OK; + } + + *pclsidProtocol = This->hres==S_OK ? CLSID_NULL : This->clsid; + *pdwResult = This->hres; + *pszResult = NULL; + return S_OK; } static const IBindingVtbl BindingVtbl = { @@ -963,7 +980,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink { Binding *This = impl_from_IInternetProtocolSink(iface); - TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); + TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(ulStatusCode), debugstr_w(szStatusText)); switch(ulStatusCode) { case BINDSTATUS_FINDINGRESOURCE: @@ -983,6 +1000,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink on_progress(This, 0, 0, BINDSTATUS_SENDINGREQUEST, szStatusText); break; case BINDSTATUS_PROTOCOLCLASSID: + CLSIDFromString(szStatusText, &This->clsid); break; case BINDSTATUS_MIMETYPEAVAILABLE: case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: @@ -1077,8 +1095,19 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres formatetc.tymed = stgmed.tymed; formatetc.cfFormat = This->clipboard_format; - IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress, + hres = IBindStatusCallback_OnDataAvailable(This->callback, bscf, progress, &formatetc, &stgmed); + if(hres != S_OK) { + if(This->download_state != END_DOWNLOAD) { + This->download_state = END_DOWNLOAD; + IBindStatusCallback_OnProgress(This->callback, progress, progress_max, + BINDSTATUS_ENDDOWNLOADDATA, This->url); + } + + WARN("OnDataAvailable returned %x\n", hres); + stop_binding(This, hres, NULL); + return; + } if(This->download_state == END_DOWNLOAD) stop_binding(This, S_OK, NULL); @@ -1104,6 +1133,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportResult(IInternetProtocolSink *i TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); stop_binding(This, hrResult, szResult); + IInternetProtocolEx_Terminate(&This->protocol->IInternetProtocolEx_iface, 0); return S_OK; } @@ -1150,19 +1180,7 @@ static HRESULT WINAPI InternetBindInfo_GetBindInfo(IInternetBindInfo *iface, TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); *grfBINDF = This->bindf; - - *pbindinfo = This->bindinfo; - - if(pbindinfo->szExtraInfo || pbindinfo->szCustomVerb) - FIXME("copy strings\n"); - - if(pbindinfo->stgmedData.pUnkForRelease) - IUnknown_AddRef(pbindinfo->stgmedData.pUnkForRelease); - - if(pbindinfo->pUnk) - IUnknown_AddRef(pbindinfo->pUnk); - - return S_OK; + return CopyBindInfo(&This->bindinfo, pbindinfo); } static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, diff --git a/reactos/dll/win32/urlmon/bindprot.c b/reactos/dll/win32/urlmon/bindprot.c index ed8c5f4a733..7326e761fc7 100644 --- a/reactos/dll/win32/urlmon/bindprot.c +++ b/reactos/dll/win32/urlmon/bindprot.c @@ -34,32 +34,38 @@ struct _task_header_t { #define WM_MK_CONTINUE (WM_USER+101) #define WM_MK_RELEASE (WM_USER+102) +static void process_tasks(BindProtocol *This) +{ + task_header_t *task; + + while(1) { + EnterCriticalSection(&This->section); + + task = This->task_queue_head; + if(task) { + This->task_queue_head = task->next; + if(!This->task_queue_head) + This->task_queue_tail = NULL; + } + + LeaveCriticalSection(&This->section); + + if(!task) + break; + + This->continue_call++; + task->proc(This, task); + This->continue_call--; + } +} + static LRESULT WINAPI notif_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_MK_CONTINUE: { BindProtocol *This = (BindProtocol*)lParam; - task_header_t *task; - while(1) { - EnterCriticalSection(&This->section); - - task = This->task_queue_head; - if(task) { - This->task_queue_head = task->next; - if(!This->task_queue_head) - This->task_queue_tail = NULL; - } - - LeaveCriticalSection(&This->section); - - if(!task) - break; - - This->continue_call++; - task->proc(This, task); - This->continue_call--; - } + process_tasks(This); IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface); return 0; @@ -165,48 +171,45 @@ static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc) } } -static inline BOOL do_direct_notif(BindProtocol *This) +static inline BOOL is_apartment_thread(BindProtocol *This) { - return !(This->pi & PI_APARTMENTTHREADED) || (This->apartment_thread == GetCurrentThreadId() && !This->continue_call); + return This->apartment_thread == GetCurrentThreadId(); } -static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter, LPCWSTR mime) +static inline BOOL do_direct_notif(BindProtocol *This) +{ + return !(This->pi & PI_APARTMENTTHREADED) || (is_apartment_thread(This) && !This->continue_call); +} + +static HRESULT handle_mime_filter(BindProtocol *This, IInternetProtocol *mime_filter) { PROTOCOLFILTERDATA filter_data = { sizeof(PROTOCOLFILTERDATA), NULL, NULL, NULL, 0 }; - IInternetProtocolSink *protocol_sink, *old_sink; - ProtocolProxy *filter_proxy; HRESULT hres; - hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&protocol_sink); - if(FAILED(hres)) - return hres; - - hres = create_protocol_proxy(&This->default_protocol_handler.IInternetProtocol_iface, This->protocol_sink, &filter_proxy); + hres = IInternetProtocol_QueryInterface(mime_filter, &IID_IInternetProtocolSink, (void**)&This->protocol_sink_handler); if(FAILED(hres)) { - IInternetProtocolSink_Release(protocol_sink); + This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; return hres; } - old_sink = This->protocol_sink; - This->protocol_sink = protocol_sink; - This->filter_proxy = filter_proxy; - IInternetProtocol_AddRef(mime_filter); This->protocol_handler = mime_filter; - filter_data.pProtocol = &filter_proxy->IInternetProtocol_iface; - hres = IInternetProtocol_Start(mime_filter, mime, &filter_proxy->IInternetProtocolSink_iface, + filter_data.pProtocol = &This->default_protocol_handler.IInternetProtocol_iface; + hres = IInternetProtocol_Start(mime_filter, This->mime, &This->default_protocol_handler.IInternetProtocolSink_iface, &This->IInternetBindInfo_iface, PI_FILTER_MODE|PI_FORCE_ASYNC, (HANDLE_PTR)&filter_data); if(FAILED(hres)) { - IInternetProtocolSink_Release(old_sink); + IInternetProtocolSink_Release(This->protocol_sink_handler); + IInternetProtocol_Release(This->protocol_handler); + This->protocol_sink_handler = &This->default_protocol_handler.IInternetProtocolSink_iface; + This->protocol_handler = &This->default_protocol_handler.IInternetProtocol_iface; return hres; } - IInternetProtocolSink_ReportProgress(old_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL); - IInternetProtocolSink_Release(old_sink); + /* NOTE: IE9 calls it on the new protocol_sink. It doesn't make sense to is seems to be a bug there. */ + IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_LOADINGMIMEHANDLER, NULL); - This->pi &= ~PI_MIMEVERIFICATION; /* FIXME: more tests */ return S_OK; } @@ -216,25 +219,21 @@ static void mime_available(BindProtocol *This, LPCWSTR mime, BOOL verified) HRESULT hres; heap_free(This->mime); - This->mime = NULL; + This->mime = heap_strdupW(mime); - mime_filter = get_mime_filter(mime); - if(mime_filter) { + if(This->protocol_handler==&This->default_protocol_handler.IInternetProtocol_iface + && (mime_filter = get_mime_filter(mime))) { TRACE("Got mime filter for %s\n", debugstr_w(mime)); - hres = handle_mime_filter(This, mime_filter, mime); + hres = handle_mime_filter(This, mime_filter); IInternetProtocol_Release(mime_filter); if(FAILED(hres)) FIXME("MIME filter failed: %08x\n", hres); - }else { - This->mime = heap_strdupW(mime); + } - if(verified || !(This->pi & PI_MIMEVERIFICATION)) { - This->reported_mime = TRUE; - - if(This->protocol_sink) - IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, mime); - } + if(This->reported_mime || verified || !(This->pi & PI_MIMEVERIFICATION)) { + This->reported_mime = TRUE; + IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, mime); } } @@ -337,15 +336,18 @@ static ULONG WINAPI BindProtocol_Release(IInternetProtocolEx *iface) IInternetBindInfo_Release(This->bind_info); if(This->protocol_handler && This->protocol_handler != &This->default_protocol_handler.IInternetProtocol_iface) IInternetProtocol_Release(This->protocol_handler); - if(This->filter_proxy) - IInternetProtocol_Release(&This->filter_proxy->IInternetProtocol_iface); + if(This->protocol_sink_handler && + This->protocol_sink_handler != &This->default_protocol_handler.IInternetProtocolSink_iface) + IInternetProtocolSink_Release(This->protocol_sink_handler); if(This->uri) IUri_Release(This->uri); + SysFreeString(This->display_uri); set_binding_sink(This, NULL, NULL); if(This->notif_hwnd) release_notif_hwnd(This->notif_hwnd); + This->section.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->section); heap_free(This->mime); @@ -544,17 +546,16 @@ static HRESULT WINAPI BindProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr &This->IInternetBindInfo_iface, 0, NULL); IInternetProtocolEx_Release(protocolex); }else { - BSTR display_uri; - - hres = IUri_GetDisplayUri(pUri, &display_uri); + hres = IUri_GetDisplayUri(pUri, &This->display_uri); if(FAILED(hres)) return hres; - hres = IInternetProtocol_Start(protocol, display_uri, &This->IInternetProtocolSink_iface, + hres = IInternetProtocol_Start(protocol, This->display_uri, &This->IInternetProtocolSink_iface, &This->IInternetBindInfo_iface, 0, 0); - SysFreeString(display_uri); } + if(SUCCEEDED(hres)) + process_tasks(This); return hres; } @@ -606,7 +607,29 @@ static inline BindProtocol *impl_from_IInternetProtocol(IInternetProtocol *iface static HRESULT WINAPI ProtocolHandler_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { - ERR("should not be called\n"); + BindProtocol *This = impl_from_IInternetProtocol(iface); + + *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocol_iface; + }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { + TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocol_iface; + }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { + TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocol_iface; + }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { + TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); + *ppv = &This->default_protocol_handler.IInternetProtocolSink_iface; + } + + if(*ppv) { + IInternetProtocol_AddRef(iface); + return S_OK; + } + + WARN("not supported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } @@ -667,11 +690,6 @@ static HRESULT WINAPI ProtocolHandler_Terminate(IInternetProtocol *iface, DWORD IInternetProtocol_Terminate(This->protocol, 0); - if(This->filter_proxy) { - IInternetProtocol_Release(&This->filter_proxy->IInternetProtocol_iface); - This->filter_proxy = NULL; - } - set_binding_sink(This, NULL, NULL); if(This->bind_info) { @@ -722,7 +740,11 @@ static HRESULT WINAPI ProtocolHandler_Read(IInternetProtocol *iface, void *pv, if(read < cb) { ULONG cread = 0; + if(is_apartment_thread(This)) + This->continue_call++; hres = IInternetProtocol_Read(This->protocol, (BYTE*)pv+read, cb-read, &cread); + if(is_apartment_thread(This)) + This->continue_call--; read += cread; } @@ -772,6 +794,188 @@ static const IInternetProtocolVtbl InternetProtocolHandlerVtbl = { ProtocolHandler_UnlockRequest }; +static inline BindProtocol *impl_from_IInternetProtocolSinkHandler(IInternetProtocolSink *iface) +{ + return CONTAINING_RECORD(iface, BindProtocol, default_protocol_handler.IInternetProtocolSink_iface); +} + +static HRESULT WINAPI ProtocolSinkHandler_QueryInterface(IInternetProtocolSink *iface, + REFIID riid, void **ppvObject) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + return IInternetProtocol_QueryInterface(&This->default_protocol_handler.IInternetProtocol_iface, + riid, ppvObject); +} + +static ULONG WINAPI ProtocolSinkHandler_AddRef(IInternetProtocolSink *iface) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + return IInternetProtocolEx_AddRef(&This->IInternetProtocolEx_iface); +} + +static ULONG WINAPI ProtocolSinkHandler_Release(IInternetProtocolSink *iface) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + return IInternetProtocolEx_Release(&This->IInternetProtocolEx_iface); +} + +static HRESULT WINAPI ProtocolSinkHandler_Switch(IInternetProtocolSink *iface, + PROTOCOLDATA *pProtocolData) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%p)\n", This, pProtocolData); + + if(!This->protocol_sink) { + IInternetProtocol_Continue(This->protocol_handler, pProtocolData); + return S_OK; + } + + return IInternetProtocolSink_Switch(This->protocol_sink, pProtocolData); +} + +static HRESULT WINAPI ProtocolSinkHandler_ReportProgress(IInternetProtocolSink *iface, + ULONG status_code, LPCWSTR status_text) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%s %s)\n", This, debugstr_bindstatus(status_code), debugstr_w(status_text)); + + if(!This->protocol_sink) + return S_OK; + + switch(status_code) { + case BINDSTATUS_FINDINGRESOURCE: + case BINDSTATUS_CONNECTING: + case BINDSTATUS_REDIRECTING: + case BINDSTATUS_SENDINGREQUEST: + case BINDSTATUS_CACHEFILENAMEAVAILABLE: + case BINDSTATUS_DIRECTBIND: + case BINDSTATUS_ACCEPTRANGES: + case BINDSTATUS_DECODING: + IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text); + break; + + case BINDSTATUS_BEGINDOWNLOADDATA: + IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max); + break; + + case BINDSTATUS_MIMETYPEAVAILABLE: + mime_available(This, status_text, FALSE); + break; + + case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: + mime_available(This, status_text, TRUE); + break; + + default: + FIXME("unsupported ulStatusCode %u\n", status_code); + } + + return S_OK; +} + +static HRESULT WINAPI ProtocolSinkHandler_ReportData(IInternetProtocolSink *iface, + DWORD bscf, ULONG progress, ULONG progress_max) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%x %u %u)\n", This, bscf, progress, progress_max); + + This->bscf = bscf; + This->progress = progress; + This->progress_max = progress_max; + + if(!This->protocol_sink) + return S_OK; + + if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) { + BYTE buf[BUFFER_SIZE]; + DWORD read = 0; + LPWSTR mime; + HRESULT hres; + + do { + read = 0; + hres = IInternetProtocol_Read(This->protocol, buf, + sizeof(buf)-This->buf_size, &read); + if(FAILED(hres) && hres != E_PENDING) + return hres; + + if(!This->buf) { + This->buf = heap_alloc(BUFFER_SIZE); + if(!This->buf) + return E_OUTOFMEMORY; + }else if(read + This->buf_size > BUFFER_SIZE) { + BYTE *tmp; + + tmp = heap_realloc(This->buf, read+This->buf_size); + if(!tmp) + return E_OUTOFMEMORY; + This->buf = tmp; + } + + memcpy(This->buf+This->buf_size, buf, read); + This->buf_size += read; + }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK); + + if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE) + return S_OK; + + bscf = BSCF_FIRSTDATANOTIFICATION; + if(hres == S_FALSE) + bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE; + + if(!This->reported_mime) { + BSTR raw_uri; + + hres = IUri_GetRawUri(This->uri, &raw_uri); + if(FAILED(hres)) + return hres; + + hres = FindMimeFromData(NULL, raw_uri, This->buf, min(This->buf_size, MIME_TEST_SIZE), + This->mime, 0, &mime, 0); + SysFreeString(raw_uri); + if(FAILED(hres)) + return hres; + + heap_free(This->mime); + This->mime = heap_strdupW(mime); + CoTaskMemFree(mime); + This->reported_mime = TRUE; + if(This->protocol_sink) + IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, This->mime); + } + } + + if(!This->protocol_sink) + return S_OK; + + return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max); +} + +static HRESULT WINAPI ProtocolSinkHandler_ReportResult(IInternetProtocolSink *iface, + HRESULT hrResult, DWORD dwError, LPCWSTR szResult) +{ + BindProtocol *This = impl_from_IInternetProtocolSinkHandler(iface); + + TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); + + if(This->protocol_sink) + return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); + return S_OK; +} + +static const IInternetProtocolSinkVtbl InternetProtocolSinkHandlerVtbl = { + ProtocolSinkHandler_QueryInterface, + ProtocolSinkHandler_AddRef, + ProtocolSinkHandler_Release, + ProtocolSinkHandler_Switch, + ProtocolSinkHandler_ReportProgress, + ProtocolSinkHandler_ReportData, + ProtocolSinkHandler_ReportResult +}; + static inline BindProtocol *impl_from_IInternetBindInfo(IInternetBindInfo *iface) { return CONTAINING_RECORD(iface, BindProtocol, IInternetBindInfo_iface); @@ -939,12 +1143,16 @@ static HRESULT WINAPI BPInternetProtocolSink_Switch(IInternetProtocolSink *iface return E_OUTOFMEMORY; memcpy(data, pProtocolData, sizeof(PROTOCOLDATA)); - if(!do_direct_notif(This)) { + if((This->pi&PI_APARTMENTTHREADED && pProtocolData->grfFlags&PI_FORCE_ASYNC) + || !do_direct_notif(This)) { switch_task_t *task; task = heap_alloc(sizeof(switch_task_t)); if(!task) + { + heap_free(data); return E_OUTOFMEMORY; + } task->data = data; @@ -952,44 +1160,7 @@ static HRESULT WINAPI BPInternetProtocolSink_Switch(IInternetProtocolSink *iface return S_OK; } - if(!This->protocol_sink) { - IInternetProtocol_Continue(This->protocol_handler, data); - return S_OK; - } - - return IInternetProtocolSink_Switch(This->protocol_sink, data); -} - -static void report_progress(BindProtocol *This, ULONG status_code, LPCWSTR status_text) -{ - switch(status_code) { - case BINDSTATUS_FINDINGRESOURCE: - case BINDSTATUS_CONNECTING: - case BINDSTATUS_REDIRECTING: - case BINDSTATUS_SENDINGREQUEST: - case BINDSTATUS_CACHEFILENAMEAVAILABLE: - case BINDSTATUS_DIRECTBIND: - case BINDSTATUS_ACCEPTRANGES: - if(This->protocol_sink) - IInternetProtocolSink_ReportProgress(This->protocol_sink, status_code, status_text); - break; - - case BINDSTATUS_BEGINDOWNLOADDATA: - if(This->protocol_sink) - IInternetProtocolSink_ReportData(This->protocol_sink, This->bscf, This->progress, This->progress_max); - break; - - case BINDSTATUS_MIMETYPEAVAILABLE: - mime_available(This, status_text, FALSE); - break; - - case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: - mime_available(This, status_text, TRUE); - break; - - default: - FIXME("unsupported ulStatusCode %u\n", status_code); - } + return IInternetProtocolSink_Switch(This->protocol_sink_handler, data); } typedef struct { @@ -1003,7 +1174,7 @@ static void on_progress_proc(BindProtocol *This, task_header_t *t) { on_progress_task_t *task = (on_progress_task_t*)t; - report_progress(This, task->status_code, task->status_text); + IInternetProtocolSink_ReportProgress(This->protocol_sink_handler, task->status_code, task->status_text); heap_free(task->status_text); heap_free(task); @@ -1017,7 +1188,7 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSin TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); if(do_direct_notif(This)) { - report_progress(This, ulStatusCode, szStatusText); + IInternetProtocolSink_ReportProgress(This->protocol_sink_handler, ulStatusCode, szStatusText); }else { on_progress_task_t *task; @@ -1032,76 +1203,6 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportProgress(IInternetProtocolSin return S_OK; } -static HRESULT report_data(BindProtocol *This, DWORD bscf, ULONG progress, ULONG progress_max) -{ - This->bscf = bscf; - This->progress = progress; - This->progress_max = progress_max; - - if(!This->protocol_sink) - return S_OK; - - if((This->pi & PI_MIMEVERIFICATION) && !This->reported_mime) { - BYTE buf[BUFFER_SIZE]; - DWORD read = 0; - LPWSTR mime; - HRESULT hres; - - do { - read = 0; - hres = IInternetProtocol_Read(This->protocol, buf, - sizeof(buf)-This->buf_size, &read); - if(FAILED(hres) && hres != E_PENDING) - return hres; - - if(!This->buf) { - This->buf = heap_alloc(BUFFER_SIZE); - if(!This->buf) - return E_OUTOFMEMORY; - }else if(read + This->buf_size > BUFFER_SIZE) { - BYTE *tmp; - - tmp = heap_realloc(This->buf, read+This->buf_size); - if(!tmp) - return E_OUTOFMEMORY; - This->buf = tmp; - } - - memcpy(This->buf+This->buf_size, buf, read); - This->buf_size += read; - }while(This->buf_size < MIME_TEST_SIZE && hres == S_OK); - - if(This->buf_size < MIME_TEST_SIZE && hres != S_FALSE) - return S_OK; - - bscf = BSCF_FIRSTDATANOTIFICATION; - if(hres == S_FALSE) - bscf |= BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE; - - if(!This->reported_mime) { - BSTR raw_uri; - - hres = IUri_GetRawUri(This->uri, &raw_uri); - if(FAILED(hres)) - return hres; - - hres = FindMimeFromData(NULL, raw_uri, This->buf, min(This->buf_size, MIME_TEST_SIZE), - This->mime, 0, &mime, 0); - SysFreeString(raw_uri); - if(FAILED(hres)) - return hres; - - mime_available(This, mime, TRUE); - CoTaskMemFree(mime); - } - } - - if(!This->protocol_sink) - return S_OK; - - return IInternetProtocolSink_ReportData(This->protocol_sink, bscf, progress, progress_max); -} - typedef struct { task_header_t header; DWORD bscf; @@ -1113,7 +1214,9 @@ static void report_data_proc(BindProtocol *This, task_header_t *t) { report_data_task_t *task = (report_data_task_t*)t; - report_data(This, task->bscf, task->progress, task->progress_max); + IInternetProtocolSink_ReportData(This->protocol_sink_handler, + task->bscf, task->progress, task->progress_max); + heap_free(task); } @@ -1122,7 +1225,7 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportData(IInternetProtocolSink *i { BindProtocol *This = impl_from_IInternetProtocolSink(iface); - TRACE("(%p)->(%d %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); + TRACE("(%p)->(%x %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); if(!This->protocol_sink) return S_OK; @@ -1142,7 +1245,8 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportData(IInternetProtocolSink *i return S_OK; } - return report_data(This, grfBSCF, ulProgress, ulProgressMax); + return IInternetProtocolSink_ReportData(This->protocol_sink_handler, + grfBSCF, ulProgress, ulProgressMax); } typedef struct { @@ -1157,8 +1261,7 @@ static void report_result_proc(BindProtocol *This, task_header_t *t) { report_result_task_t *task = (report_result_task_t*)t; - if(This->protocol_sink) - IInternetProtocolSink_ReportResult(This->protocol_sink, task->hres, task->err, task->str); + IInternetProtocolSink_ReportResult(This->protocol_sink_handler, task->hres, task->err, task->str); heap_free(task->str); heap_free(task); @@ -1173,7 +1276,6 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportResult(IInternetProtocolSink if(!This->protocol_sink) return E_FAIL; - This->reported_result = TRUE; if(!do_direct_notif(This)) { @@ -1191,7 +1293,7 @@ static HRESULT WINAPI BPInternetProtocolSink_ReportResult(IInternetProtocolSink return S_OK; } - return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); + return IInternetProtocolSink_ReportResult(This->protocol_sink_handler, hrResult, dwError, szResult); } static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = { @@ -1307,13 +1409,16 @@ HRESULT create_binding_protocol(BOOL from_urlmon, BindProtocol **protocol) ret->IWinInetHttpInfo_iface.lpVtbl = &WinInetHttpInfoVtbl; ret->default_protocol_handler.IInternetProtocol_iface.lpVtbl = &InternetProtocolHandlerVtbl; + ret->default_protocol_handler.IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkHandlerVtbl; ret->ref = 1; ret->from_urlmon = from_urlmon; ret->apartment_thread = GetCurrentThreadId(); ret->notif_hwnd = get_notif_hwnd(); ret->protocol_handler = &ret->default_protocol_handler.IInternetProtocol_iface; + ret->protocol_sink_handler = &ret->default_protocol_handler.IInternetProtocolSink_iface; InitializeCriticalSection(&ret->section); + ret->section.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BindProtocol.section"); URLMON_LockModule(); diff --git a/reactos/dll/win32/urlmon/download.c b/reactos/dll/win32/urlmon/download.c index e86ad93defc..d83bc287d9b 100644 --- a/reactos/dll/win32/urlmon/download.c +++ b/reactos/dll/win32/urlmon/download.c @@ -31,6 +31,10 @@ typedef struct { IBinding *binding; LPWSTR file_name; LPWSTR cache_file; + DWORD bindf; + + stop_cache_binding_proc_t onstop_proc; + void *ctx; } DownloadBSC; static inline DownloadBSC *impl_from_IBindStatusCallback(IBindStatusCallback *iface) @@ -62,7 +66,7 @@ static HRESULT WINAPI DownloadBSC_QueryInterface(IBindStatusCallback *iface, } if(*ppv) { - IBindStatusCallback_AddRef((IUnknown*)*ppv); + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } @@ -189,6 +193,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError) { DownloadBSC *This = impl_from_IBindStatusCallback(iface); + HRESULT hres = S_OK; TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError)); @@ -204,7 +209,9 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, } } - if(This->callback) + if(This->onstop_proc) + hres = This->onstop_proc(This->ctx, This->cache_file, hresult, szError); + else if(This->callback) IBindStatusCallback_OnStopBinding(This->callback, hresult, szError); if(This->binding) { @@ -212,7 +219,7 @@ static HRESULT WINAPI DownloadBSC_OnStopBinding(IBindStatusCallback *iface, This->binding = NULL; } - return S_OK; + return hres; } static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface, @@ -235,7 +242,7 @@ static HRESULT WINAPI DownloadBSC_GetBindInfo(IBindStatusCallback *iface, ReleaseBindInfo(&bindinfo); } - *grfBINDF = BINDF_PULLDATA | BINDF_NEEDFILE | (bindf & BINDF_ENFORCERESTRICTED); + *grfBINDF = BINDF_PULLDATA | BINDF_NEEDFILE | (bindf & BINDF_ENFORCERESTRICTED) | This->bindf; return S_OK; } @@ -323,39 +330,84 @@ static const IServiceProviderVtbl ServiceProviderVtbl = { DwlServiceProvider_QueryService }; -static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, IBindStatusCallback **ret_callback) +static HRESULT DownloadBSC_Create(IBindStatusCallback *callback, LPCWSTR file_name, DownloadBSC **ret_callback) { - DownloadBSC *ret = heap_alloc(sizeof(*ret)); + DownloadBSC *ret; + + ret = heap_alloc_zero(sizeof(*ret)); + if(!ret) + return E_OUTOFMEMORY; ret->IBindStatusCallback_iface.lpVtbl = &BindStatusCallbackVtbl; ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; ret->ref = 1; - ret->file_name = heap_strdupW(file_name); - ret->cache_file = NULL; - ret->binding = NULL; + + if(file_name) { + ret->file_name = heap_strdupW(file_name); + if(!ret->file_name) { + heap_free(ret); + return E_OUTOFMEMORY; + } + } if(callback) IBindStatusCallback_AddRef(callback); ret->callback = callback; - *ret_callback = &ret->IBindStatusCallback_iface; + *ret_callback = ret; return S_OK; } HRESULT create_default_callback(IBindStatusCallback **ret) { - IBindStatusCallback *callback; + DownloadBSC *callback; HRESULT hres; hres = DownloadBSC_Create(NULL, NULL, &callback); if(FAILED(hres)) return hres; - hres = wrap_callback(callback, ret); - IBindStatusCallback_Release(callback); + hres = wrap_callback(&callback->IBindStatusCallback_iface, ret); + IBindStatusCallback_Release(&callback->IBindStatusCallback_iface); return hres; } +HRESULT download_to_cache(IUri *uri, stop_cache_binding_proc_t proc, void *ctx, IBindStatusCallback *callback) +{ + DownloadBSC *dwl_bsc; + IBindCtx *bindctx; + IMoniker *mon; + IUnknown *unk; + HRESULT hres; + + hres = DownloadBSC_Create(callback, NULL, &dwl_bsc); + if(FAILED(hres)) + return hres; + + dwl_bsc->onstop_proc = proc; + dwl_bsc->ctx = ctx; + dwl_bsc->bindf = BINDF_ASYNCHRONOUS; + + hres = CreateAsyncBindCtx(0, &dwl_bsc->IBindStatusCallback_iface, NULL, &bindctx); + IBindStatusCallback_Release(&dwl_bsc->IBindStatusCallback_iface); + if(FAILED(hres)) + return hres; + + hres = CreateURLMonikerEx2(NULL, uri, &mon, 0); + if(FAILED(hres)) { + IBindCtx_Release(bindctx); + return hres; + } + + hres = IMoniker_BindToStorage(mon, bindctx, NULL, &IID_IUnknown, (void**)&unk); + IMoniker_Release(mon); + IBindCtx_Release(bindctx); + if(SUCCEEDED(hres) && unk) + IUnknown_Release(unk); + return hres; + +} + /*********************************************************************** * URLDownloadToFileW (URLMON.@) * @@ -375,7 +427,7 @@ HRESULT create_default_callback(IBindStatusCallback **ret) HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFileName, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB) { - IBindStatusCallback *callback; + DownloadBSC *callback; IUnknown *unk; IMoniker *mon; IBindCtx *bindctx; @@ -390,8 +442,8 @@ HRESULT WINAPI URLDownloadToFileW(LPUNKNOWN pCaller, LPCWSTR szURL, LPCWSTR szFi if(FAILED(hres)) return hres; - hres = CreateAsyncBindCtx(0, callback, NULL, &bindctx); - IBindStatusCallback_Release(callback); + hres = CreateAsyncBindCtx(0, &callback->IBindStatusCallback_iface, NULL, &bindctx); + IBindStatusCallback_Release(&callback->IBindStatusCallback_iface); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/urlmon/file.c b/reactos/dll/win32/urlmon/file.c index bab87fe994b..4bb366a2ff9 100644 --- a/reactos/dll/win32/urlmon/file.c +++ b/reactos/dll/win32/urlmon/file.c @@ -68,7 +68,7 @@ static HRESULT WINAPI FileProtocol_QueryInterface(IInternetProtocolEx *iface, RE } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } @@ -245,12 +245,13 @@ static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr DWORD grfPI, HANDLE *dwReserved) { FileProtocol *This = impl_from_IInternetProtocolEx(iface); + WCHAR path[MAX_PATH]; BINDINFO bindinfo; DWORD grfBINDF = 0; - DWORD scheme; + DWORD scheme, size; LPWSTR mime = NULL; WCHAR null_char = 0; - BSTR path, url; + BSTR url; HRESULT hres; TRACE("(%p)->(%p %p %p %08x %p)\n", This, pUri, pOIProtSink, @@ -288,14 +289,14 @@ static HRESULT WINAPI FileProtocol_StartEx(IInternetProtocolEx *iface, IUri *pUr IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char); - hres = IUri_GetPath(pUri, &path); + size = 0; + hres = CoInternetParseIUri(pUri, PARSE_PATH_FROM_URL, 0, path, sizeof(path)/sizeof(WCHAR), &size, 0); if(FAILED(hres)) { - ERR("GetPath failed: %08x\n", hres); + WARN("CoInternetParseIUri failed: %08x\n", hres); return report_result(pOIProtSink, hres, 0); } hres = open_file(This, path, pOIProtSink); - SysFreeString(path); if(FAILED(hres)) return hres; diff --git a/reactos/dll/win32/urlmon/ftp.c b/reactos/dll/win32/urlmon/ftp.c index 5a69bba99b9..ec6b9d34d53 100644 --- a/reactos/dll/win32/urlmon/ftp.c +++ b/reactos/dll/win32/urlmon/ftp.c @@ -144,7 +144,7 @@ static HRESULT WINAPI FtpProtocol_QueryInterface(IInternetProtocolEx *iface, REF } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } diff --git a/reactos/dll/win32/urlmon/http.c b/reactos/dll/win32/urlmon/http.c index 0f781f0a7ad..c859a8c8b12 100644 --- a/reactos/dll/win32/urlmon/http.c +++ b/reactos/dll/win32/urlmon/http.c @@ -79,18 +79,13 @@ static LPWSTR query_http_info(HttpProtocol *This, DWORD option) return ret; } -static inline BOOL set_security_flag(HttpProtocol *This, DWORD new_flag) +static inline BOOL set_security_flag(HttpProtocol *This, DWORD flags) { - DWORD flags, size = sizeof(flags); BOOL res; - res = InternetQueryOptionW(This->base.request, INTERNET_OPTION_SECURITY_FLAGS, &flags, &size); - if(res) { - flags |= new_flag; - res = InternetSetOptionW(This->base.request, INTERNET_OPTION_SECURITY_FLAGS, &flags, size); - } + res = InternetSetOptionW(This->base.request, INTERNET_OPTION_SECURITY_FLAGS, &flags, sizeof(flags)); if(!res) - ERR("Failed to set security flag(s): %x\n", new_flag); + ERR("Failed to set security flags: %x\n", flags); return res; } @@ -103,6 +98,11 @@ static inline HRESULT internet_error_to_hres(DWORD error) case ERROR_INTERNET_SEC_CERT_CN_INVALID: case ERROR_INTERNET_INVALID_CA: case ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED: + case ERROR_INTERNET_SEC_INVALID_CERT: + case ERROR_INTERNET_SEC_CERT_ERRORS: + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + case ERROR_INTERNET_SEC_CERT_NO_REV: + case ERROR_INTERNET_SEC_CERT_REVOKED: return INET_E_INVALID_CERTIFICATE; case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR: @@ -119,16 +119,26 @@ static HRESULT handle_http_error(HttpProtocol *This, DWORD error) IWindowForBindingUI *wfb_ui; IHttpSecurity *http_security; BOOL security_problem; + DWORD dlg_flags; + HWND hwnd; + DWORD res; HRESULT hres; + TRACE("(%p %u)\n", This, error); + switch(error) { case ERROR_INTERNET_SEC_CERT_DATE_INVALID: case ERROR_INTERNET_SEC_CERT_CN_INVALID: case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR: case ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR: - case ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION: case ERROR_INTERNET_INVALID_CA: case ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED: + case ERROR_INTERNET_SEC_INVALID_CERT: + case ERROR_INTERNET_SEC_CERT_ERRORS: + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + case ERROR_INTERNET_SEC_CERT_NO_REV: + case ERROR_INTERNET_SEC_CERT_REVOKED: + case ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION: security_problem = TRUE; break; default: @@ -149,6 +159,8 @@ static HRESULT handle_http_error(HttpProtocol *This, DWORD error) hres = IHttpSecurity_OnSecurityProblem(http_security, error); IHttpSecurity_Release(http_security); + TRACE("OnSecurityProblem returned %08x\n", hres); + if(hres != S_FALSE) { BOOL res = FALSE; @@ -180,42 +192,43 @@ static HRESULT handle_http_error(HttpProtocol *This, DWORD error) } } - hres = IServiceProvider_QueryService(serv_prov, &IID_IWindowForBindingUI, &IID_IWindowForBindingUI, - (void**)&wfb_ui); - if(SUCCEEDED(hres)) { - HWND hwnd; - const IID *iid_reason; - - if(security_problem) - iid_reason = &IID_IHttpSecurity; - else if(error == ERROR_INTERNET_INCORRECT_PASSWORD) - iid_reason = &IID_IAuthenticate; - else - iid_reason = &IID_IWindowForBindingUI; - - hres = IWindowForBindingUI_GetWindow(wfb_ui, iid_reason, &hwnd); - if(SUCCEEDED(hres) && hwnd) - { - DWORD res; - - res = InternetErrorDlg(hwnd, This->base.request, error, - FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, - NULL); - - if(res == ERROR_INTERNET_FORCE_RETRY || res == ERROR_SUCCESS) - hres = RPC_E_RETRY; - else - hres = E_FAIL; + switch(error) { + case ERROR_INTERNET_SEC_CERT_REV_FAILED: + if(hres != S_FALSE) { + /* Silently ignore the error. We will get more detailed error from wininet anyway. */ + set_security_flag(This, SECURITY_FLAG_IGNORE_REVOCATION); + hres = RPC_E_RETRY; + break; } - IWindowForBindingUI_Release(wfb_ui); + /* fallthrough */ + default: + hres = IServiceProvider_QueryService(serv_prov, &IID_IWindowForBindingUI, &IID_IWindowForBindingUI, (void**)&wfb_ui); + if(SUCCEEDED(hres)) { + const IID *iid_reason; + + if(security_problem) + iid_reason = &IID_IHttpSecurity; + else if(error == ERROR_INTERNET_INCORRECT_PASSWORD) + iid_reason = &IID_IAuthenticate; + else + iid_reason = &IID_IWindowForBindingUI; + + hres = IWindowForBindingUI_GetWindow(wfb_ui, iid_reason, &hwnd); + IWindowForBindingUI_Release(wfb_ui); + } + + if(FAILED(hres)) hwnd = NULL; + + dlg_flags = FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA; + if(This->base.bindf & BINDF_NO_UI) + dlg_flags |= FLAGS_ERROR_UI_FLAGS_NO_UI; + + res = InternetErrorDlg(hwnd, This->base.request, error, dlg_flags, NULL); + hres = res == ERROR_INTERNET_FORCE_RETRY || res == ERROR_SUCCESS ? RPC_E_RETRY : internet_error_to_hres(error); } IServiceProvider_Release(serv_prov); - - if(hres == RPC_E_RETRY) - return hres; - - return internet_error_to_hres(error); + return hres; } static ULONG send_http_request(HttpProtocol *This) @@ -276,7 +289,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques LPOLESTR accept_mimes[257]; const WCHAR **accept_types; BYTE security_id[512]; - DWORD len, port; + DWORD len, port, flags; ULONG num, error; BOOL res, b; HRESULT hres; @@ -419,19 +432,31 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, IUri *uri, DWORD reques } } + flags = INTERNET_ERROR_MASK_COMBINED_SEC_CERT; + res = InternetSetOptionW(This->base.request, INTERNET_OPTION_ERROR_MASK, &flags, sizeof(flags)); + if(!res) + WARN("InternetSetOption(INTERNET_OPTION_ERROR_MASK) failed: %u\n", GetLastError()); + b = TRUE; res = InternetSetOptionW(This->base.request, INTERNET_OPTION_HTTP_DECODING, &b, sizeof(b)); if(!res) - WARN("InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %08x\n", GetLastError()); + WARN("InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %u\n", GetLastError()); do { error = send_http_request(This); - if(error == ERROR_IO_PENDING || error == ERROR_SUCCESS) + switch(error) { + case ERROR_IO_PENDING: return S_OK; - - hres = handle_http_error(This, error); - + case ERROR_SUCCESS: + /* + * If sending response ended synchronously, it means that we have the whole data + * available locally (most likely in cache). + */ + return protocol_syncbinding(&This->base); + default: + hres = handle_http_error(This, error); + } } while(hres == RPC_E_RETRY); WARN("HttpSendRequest failed: %d\n", error); @@ -528,10 +553,8 @@ static void HttpProtocol_close_connection(Protocol *prot) This->http_negotiate = NULL; } - if(This->full_header) { - heap_free(This->full_header); - This->full_header = NULL; - } + heap_free(This->full_header); + This->full_header = NULL; } static void HttpProtocol_on_error(Protocol *prot, DWORD error) @@ -595,7 +618,7 @@ static HRESULT WINAPI HttpProtocol_QueryInterface(IInternetProtocolEx *iface, RE } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } diff --git a/reactos/dll/win32/urlmon/internet.c b/reactos/dll/win32/urlmon/internet.c index 8955524151f..63503b0010f 100644 --- a/reactos/dll/win32/urlmon/internet.c +++ b/reactos/dll/win32/urlmon/internet.c @@ -549,39 +549,34 @@ static HRESULT set_internet_feature(INTERNETFEATURELIST feature, DWORD flags, BO static BOOL get_feature_from_reg(HKEY feature_control, LPCWSTR feature_name, LPCWSTR process_name, BOOL *enabled) { - BOOL ret = FALSE; + DWORD type, value, size; HKEY feature; DWORD res; static const WCHAR wildcardW[] = {'*',0}; res = RegOpenKeyW(feature_control, feature_name, &feature); - if(res == ERROR_SUCCESS) { - DWORD type, value, size; + if(res != ERROR_SUCCESS) + return FALSE; + size = sizeof(DWORD); + res = RegQueryValueExW(feature, process_name, NULL, &type, (BYTE*)&value, &size); + if(res != ERROR_SUCCESS || type != REG_DWORD) { size = sizeof(DWORD); - res = RegQueryValueExW(feature, process_name, NULL, &type, (BYTE*)&value, &size); - if(type != REG_DWORD) - WARN("Unexpected registry value type %d (expected REG_DWORD) for %s\n", type, debugstr_w(process_name)); - - if(res == ERROR_SUCCESS && type == REG_DWORD) { - *enabled = value == 1; - ret = TRUE; - } else { - size = sizeof(DWORD); - res = RegQueryValueExW(feature, wildcardW, NULL, &type, (BYTE*)&value, &size); - if(type != REG_DWORD) - WARN("Unexpected registry value type %d (expected REG_DWORD) for %s\n", type, debugstr_w(wildcardW)); - - if(res == ERROR_SUCCESS && type == REG_DWORD) { - *enabled = value == 1; - ret = TRUE; - } - } - RegCloseKey(feature); + res = RegQueryValueExW(feature, wildcardW, NULL, &type, (BYTE*)&value, &size); } - return ret; + RegCloseKey(feature); + if(res != ERROR_SUCCESS) + return FALSE; + + if(type != REG_DWORD) { + WARN("Unexpected registry value type %d (expected REG_DWORD) for %s\n", type, debugstr_w(wildcardW)); + return FALSE; + } + + *enabled = value == 1; + return TRUE; } /* Assumes 'process_features_cs' is held. */ @@ -698,3 +693,102 @@ HRESULT WINAPI CoInternetIsFeatureEnabled(INTERNETFEATURELIST FeatureEntry, DWOR TRACE("(%d, %08x)\n", FeatureEntry, dwFlags); return get_internet_feature(FeatureEntry, dwFlags); } + +/*********************************************************************** + * CoInternetIsFeatureEnabledForUrl (URLMON.@) + */ +HRESULT WINAPI CoInternetIsFeatureEnabledForUrl(INTERNETFEATURELIST FeatureEntry, DWORD dwFlags, LPCWSTR szURL, + IInternetSecurityManager *pSecMgr) +{ + DWORD urlaction = 0; + HRESULT hres; + + TRACE("(%d %08x %s %p)\n", FeatureEntry, dwFlags, debugstr_w(szURL), pSecMgr); + + if(FeatureEntry == FEATURE_MIME_SNIFFING) + urlaction = URLACTION_FEATURE_MIME_SNIFFING; + else if(FeatureEntry == FEATURE_WINDOW_RESTRICTIONS) + urlaction = URLACTION_FEATURE_WINDOW_RESTRICTIONS; + else if(FeatureEntry == FEATURE_ZONE_ELEVATION) + urlaction = URLACTION_FEATURE_ZONE_ELEVATION; + + if(!szURL || !urlaction || !pSecMgr) + return CoInternetIsFeatureEnabled(FeatureEntry, dwFlags); + + switch(dwFlags) { + case GET_FEATURE_FROM_THREAD: + case GET_FEATURE_FROM_THREAD_LOCALMACHINE: + case GET_FEATURE_FROM_THREAD_INTRANET: + case GET_FEATURE_FROM_THREAD_TRUSTED: + case GET_FEATURE_FROM_THREAD_INTERNET: + case GET_FEATURE_FROM_THREAD_RESTRICTED: + FIXME("unsupported flags %x\n", dwFlags); + return E_NOTIMPL; + + case GET_FEATURE_FROM_PROCESS: + hres = CoInternetIsFeatureEnabled(FeatureEntry, dwFlags); + if(hres != S_OK) + return hres; + /* fall through */ + + default: { + DWORD policy = URLPOLICY_DISALLOW; + + hres = IInternetSecurityManager_ProcessUrlAction(pSecMgr, szURL, urlaction, + (BYTE*)&policy, sizeof(DWORD), NULL, 0, PUAF_NOUI, 0); + if(hres!=S_OK || policy!=URLPOLICY_ALLOW) + return S_OK; + return S_FALSE; + } + } +} + +/*********************************************************************** + * CoInternetIsFeatureZoneElevationEnabled (URLMON.@) + */ +HRESULT WINAPI CoInternetIsFeatureZoneElevationEnabled(LPCWSTR szFromURL, LPCWSTR szToURL, + IInternetSecurityManager *pSecMgr, DWORD dwFlags) +{ + HRESULT hres; + + TRACE("(%s %s %p %x)\n", debugstr_w(szFromURL), debugstr_w(szToURL), pSecMgr, dwFlags); + + if(!pSecMgr || !szToURL) + return CoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, dwFlags); + + switch(dwFlags) { + case GET_FEATURE_FROM_THREAD: + case GET_FEATURE_FROM_THREAD_LOCALMACHINE: + case GET_FEATURE_FROM_THREAD_INTRANET: + case GET_FEATURE_FROM_THREAD_TRUSTED: + case GET_FEATURE_FROM_THREAD_INTERNET: + case GET_FEATURE_FROM_THREAD_RESTRICTED: + FIXME("unsupported flags %x\n", dwFlags); + return E_NOTIMPL; + + case GET_FEATURE_FROM_PROCESS: + hres = CoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, dwFlags); + if(hres != S_OK) + return hres; + /* fall through */ + + default: { + DWORD policy = URLPOLICY_DISALLOW; + + hres = IInternetSecurityManager_ProcessUrlAction(pSecMgr, szToURL, + URLACTION_FEATURE_ZONE_ELEVATION, (BYTE*)&policy, sizeof(DWORD), + NULL, 0, PUAF_NOUI, 0); + if(FAILED(hres)) + return S_OK; + + switch(policy) { + case URLPOLICY_ALLOW: + return S_FALSE; + case URLPOLICY_QUERY: + FIXME("Ask user dialog not implemented\n"); + default: + return S_OK; + } + } + } +} diff --git a/reactos/dll/win32/urlmon/mk.c b/reactos/dll/win32/urlmon/mk.c index 82f0604b601..28dfebfcb98 100644 --- a/reactos/dll/win32/urlmon/mk.c +++ b/reactos/dll/win32/urlmon/mk.c @@ -57,7 +57,7 @@ static HRESULT WINAPI MkProtocol_QueryInterface(IInternetProtocolEx *iface, REFI } if(*ppv) { - IInternetProtocol_AddRef(iface); + IInternetProtocolEx_AddRef(iface); return S_OK; } diff --git a/reactos/dll/win32/urlmon/protocol.c b/reactos/dll/win32/urlmon/protocol.c index 9108f24e1c3..be88614cd3c 100644 --- a/reactos/dll/win32/urlmon/protocol.c +++ b/reactos/dll/win32/urlmon/protocol.c @@ -70,6 +70,55 @@ static void all_data_read(Protocol *protocol) report_result(protocol, S_OK); } +static HRESULT start_downloading(Protocol *protocol) +{ + HRESULT hres; + + hres = protocol->vtbl->start_downloading(protocol); + if(FAILED(hres)) { + protocol_close_connection(protocol); + report_result(protocol, hres); + return S_OK; + } + + if(protocol->bindf & BINDF_NEEDFILE) { + WCHAR cache_file[MAX_PATH]; + DWORD buflen = sizeof(cache_file); + + if(InternetQueryOptionW(protocol->request, INTERNET_OPTION_DATAFILE_NAME, cache_file, &buflen)) { + report_progress(protocol, BINDSTATUS_CACHEFILENAMEAVAILABLE, cache_file); + }else { + FIXME("Could not get cache file\n"); + } + } + + protocol->flags |= FLAG_FIRST_CONTINUE_COMPLETE; + return S_OK; +} + +HRESULT protocol_syncbinding(Protocol *protocol) +{ + BOOL res; + HRESULT hres; + + protocol->flags |= FLAG_SYNC_READ; + + hres = start_downloading(protocol); + if(FAILED(hres)) + return hres; + + res = InternetQueryDataAvailable(protocol->request, &protocol->query_available, 0, 0); + if(res) + protocol->available_bytes = protocol->query_available; + else + WARN("InternetQueryDataAvailable failed: %u\n", GetLastError()); + + protocol->flags |= FLAG_FIRST_DATA_REPORTED|FLAG_LAST_DATA_REPORTED; + IInternetProtocolSink_ReportData(protocol->protocol_sink, BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE, + protocol->available_bytes, protocol->content_length); + return S_OK; +} + static void request_complete(Protocol *protocol, INTERNET_ASYNC_RESULT *ar) { PROTOCOLDATA data; @@ -89,13 +138,13 @@ static void request_complete(Protocol *protocol, INTERNET_ASYNC_RESULT *ar) } if(protocol->flags & FLAG_FIRST_CONTINUE_COMPLETE) - data.pData = (LPVOID)BINDSTATUS_ENDDOWNLOADCOMPONENTS; + data.pData = UlongToPtr(BINDSTATUS_ENDDOWNLOADCOMPONENTS); else - data.pData = (LPVOID)BINDSTATUS_DOWNLOADINGDATA; + data.pData = UlongToPtr(BINDSTATUS_DOWNLOADINGDATA); }else { protocol->flags |= FLAG_ERROR; - data.pData = (LPVOID)ar->dwError; + data.pData = UlongToPtr(ar->dwError); } if (protocol->bindf & BINDF_FROMURLMON) @@ -115,10 +164,19 @@ static void WINAPI internet_status_callback(HINTERNET internet, DWORD_PTR contex report_progress(protocol, BINDSTATUS_FINDINGRESOURCE, (LPWSTR)status_info); break; - case INTERNET_STATUS_CONNECTING_TO_SERVER: - TRACE("%p INTERNET_STATUS_CONNECTING_TO_SERVER\n", protocol); - report_progress(protocol, BINDSTATUS_CONNECTING, (LPWSTR)status_info); + case INTERNET_STATUS_CONNECTING_TO_SERVER: { + WCHAR *info; + + TRACE("%p INTERNET_STATUS_CONNECTING_TO_SERVER %s\n", protocol, (const char*)status_info); + + info = heap_strdupAtoW(status_info); + if(!info) + return; + + report_progress(protocol, BINDSTATUS_CONNECTING, info); + heap_free(info); break; + } case INTERNET_STATUS_SENDING_REQUEST: TRACE("%p INTERNET_STATUS_SENDING_REQUEST\n", protocol); @@ -286,12 +344,10 @@ HRESULT protocol_start(Protocol *protocol, IInternetProtocol *prot, IUri *uri, HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data) { + BOOL is_start; HRESULT hres; - if (!data) { - WARN("Expected pProtocolData to be non-NULL\n"); - return S_OK; - } + is_start = !data || data->pData == UlongToPtr(BINDSTATUS_DOWNLOADINGDATA); if(!protocol->request) { WARN("Expected request to be non-NULL\n"); @@ -305,52 +361,56 @@ HRESULT protocol_continue(Protocol *protocol, PROTOCOLDATA *data) if(protocol->flags & FLAG_ERROR) { protocol->flags &= ~FLAG_ERROR; - protocol->vtbl->on_error(protocol, (DWORD)data->pData); + protocol->vtbl->on_error(protocol, PtrToUlong(data->pData)); return S_OK; } if(protocol->post_stream) return write_post_stream(protocol); - if(data->pData == (LPVOID)BINDSTATUS_DOWNLOADINGDATA) { - hres = protocol->vtbl->start_downloading(protocol); - if(FAILED(hres)) { - protocol_close_connection(protocol); - report_result(protocol, hres); + if(is_start) { + hres = start_downloading(protocol); + if(FAILED(hres)) return S_OK; - } - - if(protocol->bindf & BINDF_NEEDFILE) { - WCHAR cache_file[MAX_PATH]; - DWORD buflen = sizeof(cache_file); - - if(InternetQueryOptionW(protocol->request, INTERNET_OPTION_DATAFILE_NAME, - cache_file, &buflen)) { - report_progress(protocol, BINDSTATUS_CACHEFILENAMEAVAILABLE, cache_file); - }else { - FIXME("Could not get cache file\n"); - } - } - - protocol->flags |= FLAG_FIRST_CONTINUE_COMPLETE; } - if(data->pData >= (LPVOID)BINDSTATUS_DOWNLOADINGDATA && !protocol->available_bytes) { - BOOL res; + if(!data || data->pData >= UlongToPtr(BINDSTATUS_DOWNLOADINGDATA)) { + if(!protocol->available_bytes) { + if(protocol->query_available) { + protocol->available_bytes = protocol->query_available; + }else { + BOOL res; + + /* InternetQueryDataAvailable may immediately fork and perform its asynchronous + * read, so clear the flag _before_ calling so it does not incorrectly get cleared + * after the status callback is called */ + protocol->flags &= ~FLAG_REQUEST_COMPLETE; + res = InternetQueryDataAvailable(protocol->request, &protocol->query_available, 0, 0); + if(res) { + TRACE("available %u bytes\n", protocol->query_available); + if(!protocol->query_available) { + if(is_start) { + TRACE("empty file\n"); + all_data_read(protocol); + }else { + WARN("unexpected end of file?\n"); + report_result(protocol, INET_E_DOWNLOAD_FAILURE); + } + return S_OK; + } + protocol->available_bytes = protocol->query_available; + }else if(GetLastError() != ERROR_IO_PENDING) { + protocol->flags |= FLAG_REQUEST_COMPLETE; + WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); + report_result(protocol, INET_E_DATA_NOT_AVAILABLE); + return S_OK; + } + } - /* InternetQueryDataAvailable may immediately fork and perform its asynchronous - * read, so clear the flag _before_ calling so it does not incorrectly get cleared - * after the status callback is called */ - protocol->flags &= ~FLAG_REQUEST_COMPLETE; - res = InternetQueryDataAvailable(protocol->request, &protocol->available_bytes, 0, 0); - if(res) { protocol->flags |= FLAG_REQUEST_COMPLETE; - report_data(protocol); - }else if(GetLastError() != ERROR_IO_PENDING) { - protocol->flags |= FLAG_REQUEST_COMPLETE; - WARN("InternetQueryDataAvailable failed: %d\n", GetLastError()); - report_result(protocol, INET_E_DATA_NOT_AVAILABLE); } + + report_data(protocol); } return S_OK; @@ -367,7 +427,7 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret return S_FALSE; } - if(!(protocol->flags & FLAG_REQUEST_COMPLETE) || !protocol->available_bytes) { + if(!(protocol->flags & FLAG_SYNC_READ) && (!(protocol->flags & FLAG_REQUEST_COMPLETE) || !protocol->available_bytes)) { *read_ret = 0; return E_PENDING; } @@ -393,12 +453,14 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret protocol->current_position += len; protocol->available_bytes -= len; + TRACE("current_position %d, available_bytes %d\n", protocol->current_position, protocol->available_bytes); + if(!protocol->available_bytes) { /* InternetQueryDataAvailable may immediately fork and perform its asynchronous * read, so clear the flag _before_ calling so it does not incorrectly get cleared * after the status callback is called */ protocol->flags &= ~FLAG_REQUEST_COMPLETE; - res = InternetQueryDataAvailable(protocol->request, &protocol->available_bytes, 0, 0); + res = InternetQueryDataAvailable(protocol->request, &protocol->query_available, 0, 0); if(!res) { if (GetLastError() == ERROR_IO_PENDING) { hres = E_PENDING; @@ -410,10 +472,12 @@ HRESULT protocol_read(Protocol *protocol, void *buf, ULONG size, ULONG *read_ret break; } - if(!protocol->available_bytes) { + if(!protocol->query_available) { all_data_read(protocol); break; } + + protocol->available_bytes = protocol->query_available; } } diff --git a/reactos/dll/win32/urlmon/resource.h b/reactos/dll/win32/urlmon/resource.h new file mode 100644 index 00000000000..3ff2ac690a5 --- /dev/null +++ b/reactos/dll/win32/urlmon/resource.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define ID_AXINSTALL_WARNING_DLG 1000 +#define ID_AXINSTALL_LOCATION 1001 +#define ID_AXINSTALL_INSTALL_BTN 1002 +#define ID_AXINSTALL_ICON 1003 + +#define IDS_AXINSTALL_FAILURE 1100 +#define IDS_AXINSTALL_INSTALLN 1101 +#define IDS_AXINSTALL_INSTALL 1102 diff --git a/reactos/dll/win32/urlmon/sec_mgr.c b/reactos/dll/win32/urlmon/sec_mgr.c index b5901c175bf..9bccc0a3437 100644 --- a/reactos/dll/win32/urlmon/sec_mgr.c +++ b/reactos/dll/win32/urlmon/sec_mgr.c @@ -57,6 +57,20 @@ static const WCHAR wszZoneMapDomainsKey[] = {'S','o','f','t','w','a','r','e','\\ 'Z','o','n','e','M','a','p','\\', 'D','o','m','a','i','n','s',0}; +static inline BOOL is_drive_path(const WCHAR *path) +{ + return isalphaW(*path) && *(path+1) == ':'; +} + +/* List of schemes types Windows seems to expect to be hierarchical. */ +static inline BOOL is_hierarchical_scheme(URL_SCHEME type) { + return(type == URL_SCHEME_HTTP || type == URL_SCHEME_FTP || + type == URL_SCHEME_GOPHER || type == URL_SCHEME_NNTP || + type == URL_SCHEME_TELNET || type == URL_SCHEME_WAIS || + type == URL_SCHEME_FILE || type == URL_SCHEME_HTTPS || + type == URL_SCHEME_RES); +} + /******************************************************************** * get_string_from_reg [internal] * @@ -256,18 +270,24 @@ static BOOL get_zone_for_scheme(HKEY key, LPCWSTR schema, DWORD *zone) /* See if the key contains a value for the scheme first. */ res = RegQueryValueExW(key, schema, NULL, &type, (BYTE*)zone, &size); - if(type != REG_DWORD) + if(res == ERROR_SUCCESS) { + if(type == REG_DWORD) + return TRUE; WARN("Unexpected value type %d for value %s, expected REG_DWORD\n", type, debugstr_w(schema)); - - if(res != ERROR_SUCCESS || type != REG_DWORD) { - /* Try to get the zone for the wildcard scheme. */ - size = sizeof(DWORD); - res = RegQueryValueExW(key, wildcardW, NULL, &type, (BYTE*)zone, &size); - if(type != REG_DWORD) - WARN("Unexpected value type %d for value %s, expected REG_DWORD\n", type, debugstr_w(wildcardW)); } - return res == ERROR_SUCCESS && type == REG_DWORD; + /* Try to get the zone for the wildcard scheme. */ + size = sizeof(DWORD); + res = RegQueryValueExW(key, wildcardW, NULL, &type, (BYTE*)zone, &size); + if(res != ERROR_SUCCESS) + return FALSE; + + if(type != REG_DWORD) { + WARN("Unexpected value type %d for value %s, expected REG_DWORD\n", type, debugstr_w(wildcardW)); + return FALSE; + } + + return TRUE; } /******************************************************************** @@ -433,50 +453,51 @@ static HRESULT search_for_domain_mapping(HKEY domains, LPCWSTR schema, LPCWSTR h return hres; } -static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone) +static HRESULT get_zone_from_domains(IUri *uri, DWORD *zone) { HRESULT hres; - WCHAR *host_name; - DWORD host_len = lstrlenW(url)+1; + BSTR host, scheme; DWORD res; HKEY domains; + DWORD scheme_type; - host_name = heap_alloc(host_len*sizeof(WCHAR)); - if(!host_name) - return E_OUTOFMEMORY; - - hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, host_name, host_len, &host_len, 0); - if(hres == S_FALSE) { - WCHAR *tmp = heap_realloc(host_name, (host_len+1)*sizeof(WCHAR)); - if(!tmp) { - heap_free(host_name); - return E_OUTOFMEMORY; - } - - host_name = tmp; - hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, host_name, host_len+1, &host_len, 0); - } + hres = IUri_GetScheme(uri, &scheme_type); + if(FAILED(hres)) + return hres; /* Windows doesn't play nice with unknown scheme types when it tries * to check if a host name maps into any domains. - * - * The reason is with how CoInternetParseUrl handles unknown scheme types - * when it's parsing the domain of a URL (IE it always returns E_FAIL). - * - * Windows doesn't compenstate for this and simply doesn't check if - * the URL maps into any domains. */ - if(hres != S_OK) { - heap_free(host_name); - if(hres == E_FAIL) - return S_FALSE; + if(scheme_type == URL_SCHEME_UNKNOWN) + return S_FALSE; + + hres = IUri_GetHost(uri, &host); + if(FAILED(hres)) + return hres; + + /* Known hierarchical scheme types must have a host. If they don't Windows + * assigns URLZONE_INVALID to the zone. + */ + if((scheme_type != URL_SCHEME_UNKNOWN && scheme_type != URL_SCHEME_FILE) + && is_hierarchical_scheme(scheme_type) && !*host) { + *zone = URLZONE_INVALID; + + SysFreeString(host); + + /* The MapUrlToZone functions return S_OK when this condition occurs. */ + return S_OK; + } + + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) { + SysFreeString(host); return hres; } /* First try CURRENT_USER. */ res = RegOpenKeyW(HKEY_CURRENT_USER, wszZoneMapDomainsKey, &domains); if(res == ERROR_SUCCESS) { - hres = search_for_domain_mapping(domains, schema, host_name, host_len, zone); + hres = search_for_domain_mapping(domains, scheme, host, SysStringLen(host), zone); RegCloseKey(domains); } else WARN("Failed to open HKCU's %s key\n", debugstr_w(wszZoneMapDomainsKey)); @@ -485,55 +506,48 @@ static HRESULT get_zone_from_domains(LPCWSTR url, LPCWSTR schema, DWORD *zone) if(hres == S_FALSE) { res = RegOpenKeyW(HKEY_LOCAL_MACHINE, wszZoneMapDomainsKey, &domains); if(res == ERROR_SUCCESS) { - hres = search_for_domain_mapping(domains, schema, host_name, host_len, zone); + hres = search_for_domain_mapping(domains, scheme, host, SysStringLen(host), zone); RegCloseKey(domains); } else WARN("Failed to open HKLM's %s key\n", debugstr_w(wszZoneMapDomainsKey)); } - heap_free(host_name); + SysFreeString(host); + SysFreeString(scheme); return hres; } -static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url) +static HRESULT map_security_uri_to_zone(IUri *uri, DWORD *zone) { - LPWSTR secur_url; - WCHAR schema[64]; - DWORD size=0; HRESULT hres; + BSTR scheme; *zone = URLZONE_INVALID; - hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0); - if(hres != S_OK) { - size = strlenW(url)*sizeof(WCHAR); + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) + return hres; - secur_url = heap_alloc(size); - if(!secur_url) - return E_OUTOFMEMORY; + if(!strcmpiW(scheme, fileW)) { + BSTR path; + WCHAR *ptr, *path_start, root[20]; - memcpy(secur_url, url, size); - } + hres = IUri_GetPath(uri, &path); + if(FAILED(hres)) { + SysFreeString(scheme); + return hres; + } - hres = CoInternetParseUrl(secur_url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(WCHAR), &size, 0); - if(FAILED(hres) || !*schema) { - heap_free(secur_url); - return E_INVALIDARG; - } + if(*path == '/' && is_drive_path(path+1)) + path_start = path+1; + else + path_start = path; - /* file protocol is a special case */ - if(!strcmpW(schema, fileW)) { - WCHAR path[MAX_PATH], root[20]; - WCHAR *ptr; - - hres = CoInternetParseUrl(secur_url, PARSE_PATH_FROM_URL, 0, path, - sizeof(path)/sizeof(WCHAR), &size, 0); - - if(SUCCEEDED(hres) && (ptr = strchrW(path, '\\')) && ptr-path < sizeof(root)/sizeof(WCHAR)) { + if((ptr = strchrW(path_start, ':')) && ptr-path_start+1 < sizeof(root)/sizeof(WCHAR)) { UINT type; - memcpy(root, path, (ptr-path)*sizeof(WCHAR)); - root[ptr-path] = 0; + memcpy(root, path_start, (ptr-path_start+1)*sizeof(WCHAR)); + root[ptr-path_start+1] = 0; type = GetDriveTypeW(root); @@ -556,22 +570,73 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url) FIXME("unsupported drive type %d\n", type); } } + SysFreeString(path); } if(*zone == URLZONE_INVALID) { - hres = get_zone_from_domains(secur_url, schema, zone); + hres = get_zone_from_domains(uri, zone); if(hres == S_FALSE) - hres = get_zone_from_reg(schema, zone); + hres = get_zone_from_reg(scheme, zone); } + SysFreeString(scheme); + return hres; +} + +static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url) +{ + IUri *secur_uri; + LPWSTR secur_url; + HRESULT hres; + + *zone = URLZONE_INVALID; + + hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0); + if(hres != S_OK) { + DWORD size = strlenW(url)*sizeof(WCHAR); + + secur_url = CoTaskMemAlloc(size); + if(!secur_url) + return E_OUTOFMEMORY; + + memcpy(secur_url, url, size); + } + + hres = CreateUri(secur_url, Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, &secur_uri); + if(FAILED(hres)) { + CoTaskMemFree(secur_url); + return hres; + } + + hres = map_security_uri_to_zone(secur_uri, zone); + IUri_Release(secur_uri); + if(FAILED(hres) || !ret_url) - heap_free(secur_url); + CoTaskMemFree(secur_url); else *ret_url = secur_url; return hres; } +static HRESULT map_uri_to_zone(IUri *uri, DWORD *zone, IUri **ret_uri) +{ + HRESULT hres; + IUri *secur_uri; + + hres = CoInternetGetSecurityUrlEx(uri, &secur_uri, PSU_SECURITY_URL_ONLY, 0); + if(FAILED(hres)) + return hres; + + hres = map_security_uri_to_zone(secur_uri, zone); + if(FAILED(hres) || !ret_uri) + IUri_Release(secur_uri); + else + *ret_uri = secur_uri; + + return hres; +} + static HRESULT open_zone_key(HKEY parent_key, DWORD zone, HKEY *hkey) { static const WCHAR wszFormat[] = {'%','s','%','u',0}; @@ -646,12 +711,133 @@ static HRESULT get_action_policy(DWORD zone, DWORD action, BYTE *policy, DWORD s return hres; } +static HRESULT generate_security_id(IUri *uri, BYTE *secid, DWORD *secid_len, DWORD zone) +{ + DWORD len; + HRESULT hres; + DWORD scheme_type; + + if(zone == URLZONE_INVALID) + return E_INVALIDARG; + + hres = IUri_GetScheme(uri, &scheme_type); + if(FAILED(hres)) + return hres; + + /* Windows handles opaque URLs differently then hierarchical ones. */ + if(!is_hierarchical_scheme(scheme_type) && scheme_type != URL_SCHEME_WILDCARD) { + BSTR display_uri; + + hres = IUri_GetDisplayUri(uri, &display_uri); + if(FAILED(hres)) + return hres; + + len = WideCharToMultiByte(CP_ACP, 0, display_uri, -1, NULL, 0, NULL, NULL)-1; + + if(len+sizeof(DWORD) > *secid_len) { + SysFreeString(display_uri); + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + WideCharToMultiByte(CP_ACP, 0, display_uri, -1, (LPSTR)secid, len, NULL, NULL); + SysFreeString(display_uri); + + *(DWORD*)(secid+len) = zone; + } else { + BSTR host, scheme; + DWORD host_len, scheme_len; + BYTE *ptr; + + hres = IUri_GetHost(uri, &host); + if(FAILED(hres)) + return hres; + + /* The host can't be empty for Wildcard URIs. */ + if(scheme_type == URL_SCHEME_WILDCARD && !*host) { + SysFreeString(host); + return E_INVALIDARG; + } + + hres = IUri_GetSchemeName(uri, &scheme); + if(FAILED(hres)) { + SysFreeString(host); + return hres; + } + + host_len = WideCharToMultiByte(CP_ACP, 0, host, -1, NULL, 0, NULL, NULL)-1; + scheme_len = WideCharToMultiByte(CP_ACP, 0, scheme, -1, NULL, 0, NULL, NULL)-1; + + len = host_len+scheme_len+sizeof(BYTE); + + if(len+sizeof(DWORD) > *secid_len) { + SysFreeString(host); + SysFreeString(scheme); + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + WideCharToMultiByte(CP_ACP, 0, scheme, -1, (LPSTR)secid, len, NULL, NULL); + SysFreeString(scheme); + + ptr = secid+scheme_len; + *ptr++ = ':'; + + WideCharToMultiByte(CP_ACP, 0, host, -1, (LPSTR)ptr, host_len, NULL, NULL); + SysFreeString(host); + + ptr += host_len; + + *(DWORD*)ptr = zone; + } + + *secid_len = len+sizeof(DWORD); + + return S_OK; +} + +static HRESULT get_security_id_for_url(LPCWSTR url, BYTE *secid, DWORD *secid_len) +{ + HRESULT hres; + DWORD zone = URLZONE_INVALID; + LPWSTR secur_url = NULL; + IUri *uri; + + hres = map_url_to_zone(url, &zone, &secur_url); + if(FAILED(hres)) + return hres == 0x80041001 ? E_INVALIDARG : hres; + + hres = CreateUri(secur_url, Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, &uri); + CoTaskMemFree(secur_url); + if(FAILED(hres)) + return hres; + + hres = generate_security_id(uri, secid, secid_len, zone); + IUri_Release(uri); + + return hres; +} + +static HRESULT get_security_id_for_uri(IUri *uri, BYTE *secid, DWORD *secid_len) +{ + HRESULT hres; + IUri *secur_uri; + DWORD zone = URLZONE_INVALID; + + hres = map_uri_to_zone(uri, &zone, &secur_uri); + if(FAILED(hres)) + return hres; + + hres = generate_security_id(secur_uri, secid, secid_len, zone); + IUri_Release(secur_uri); + + return hres; +} + /*********************************************************************** * InternetSecurityManager implementation * */ typedef struct { - IInternetSecurityManager IInternetSecurityManager_iface; + IInternetSecurityManagerEx2 IInternetSecurityManagerEx2_iface; LONG ref; @@ -659,44 +845,38 @@ typedef struct { IInternetSecurityManager *custom_manager; } SecManagerImpl; -static inline SecManagerImpl *impl_from_IInternetSecurityManager(IInternetSecurityManager *iface) +static inline SecManagerImpl *impl_from_IInternetSecurityManagerEx2(IInternetSecurityManagerEx2 *iface) { - return CONTAINING_RECORD(iface, SecManagerImpl, IInternetSecurityManager_iface); + return CONTAINING_RECORD(iface, SecManagerImpl, IInternetSecurityManagerEx2_iface); } -static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject) +static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManagerEx2* iface,REFIID riid,void** ppvObject) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvObject); + TRACE("(%p)->(%s %p)\n",This,debugstr_guid(riid),ppvObject); - /* Perform a sanity check on the parameters.*/ - if ( (This==0) || (ppvObject==0) ) + if(!ppvObject) return E_INVALIDARG; - /* Initialize the return parameter */ - *ppvObject = 0; - - /* Compare the riid with the interface IDs implemented by this object.*/ - if (IsEqualIID(&IID_IUnknown, riid) || - IsEqualIID(&IID_IInternetSecurityManager, riid)) + if(IsEqualIID(&IID_IUnknown, riid) || + IsEqualIID(&IID_IInternetSecurityManager, riid) || + IsEqualIID(&IID_IInternetSecurityManagerEx, riid) || + IsEqualIID(&IID_IInternetSecurityManagerEx2, riid)) { *ppvObject = iface; - - /* Check that we obtained an interface.*/ - if (!*ppvObject) { + } else { WARN("not supported interface %s\n", debugstr_guid(riid)); + *ppvObject = NULL; return E_NOINTERFACE; } - /* Query Interface always increases the reference count by one when it is successful */ - IInternetSecurityManager_AddRef(iface); - + IInternetSecurityManagerEx2_AddRef(iface); return S_OK; } -static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface) +static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManagerEx2* iface) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%u\n", This, refCount); @@ -704,9 +884,9 @@ static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface) return refCount; } -static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface) +static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManagerEx2* iface) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%u\n", This, refCount); @@ -726,10 +906,10 @@ static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface) return refCount; } -static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManagerEx2 *iface, IInternetSecurityMgrSite *pSite) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); TRACE("(%p)->(%p)\n", This, pSite); @@ -761,10 +941,10 @@ static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *i return S_OK; } -static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManagerEx2 *iface, IInternetSecurityMgrSite **ppSite) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); TRACE("(%p)->(%p)\n", This, ppSite); @@ -778,11 +958,11 @@ static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *i return S_OK; } -static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, DWORD *pdwZone, DWORD dwFlags) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%s %p %08x)\n", iface, debugstr_w(pwszUrl), pdwZone, dwFlags); @@ -805,20 +985,17 @@ static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *ifac return map_url_to_zone(pwszUrl, pdwZone, NULL); } -static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); - LPWSTR url, ptr, ptr2; - DWORD zone, len; - HRESULT hres; - - static const WCHAR wszFile[] = {'f','i','l','e',':'}; + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); TRACE("(%p)->(%s %p %p %08lx)\n", iface, debugstr_w(pwszUrl), pbSecurityId, pcbSecurityId, dwReserved); if(This->custom_manager) { + HRESULT hres; + hres = IInternetSecurityManager_GetSecurityId(This->custom_manager, pwszUrl, pbSecurityId, pcbSecurityId, dwReserved); if(hres != INET_E_DEFAULT_ACTION) @@ -831,64 +1008,17 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa if(dwReserved) FIXME("dwReserved is not supported\n"); - hres = map_url_to_zone(pwszUrl, &zone, &url); - if(FAILED(hres)) - return hres == 0x80041001 ? E_INVALIDARG : hres; - - /* file protocol is a special case */ - if(strlenW(url) >= sizeof(wszFile)/sizeof(WCHAR) - && !memcmp(url, wszFile, sizeof(wszFile)) && strchrW(url, '\\')) { - - static const BYTE secidFile[] = {'f','i','l','e',':'}; - - heap_free(url); - - if(*pcbSecurityId < sizeof(secidFile)+sizeof(zone)) - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - - memcpy(pbSecurityId, secidFile, sizeof(secidFile)); - *(DWORD*)(pbSecurityId+sizeof(secidFile)) = zone; - - *pcbSecurityId = sizeof(secidFile)+sizeof(zone); - return S_OK; - } - - ptr = strchrW(url, ':'); - ptr2 = ++ptr; - while(*ptr2 == '/') - ptr2++; - if(ptr2 != ptr) - memmove(ptr, ptr2, (strlenW(ptr2)+1)*sizeof(WCHAR)); - - ptr = strchrW(ptr, '/'); - if(ptr) - *ptr = 0; - - len = WideCharToMultiByte(CP_ACP, 0, url, -1, NULL, 0, NULL, NULL)-1; - - if(len+sizeof(DWORD) > *pcbSecurityId) { - heap_free(url); - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - } - - WideCharToMultiByte(CP_ACP, 0, url, -1, (LPSTR)pbSecurityId, len, NULL, NULL); - heap_free(url); - - *(DWORD*)(pbSecurityId+len) = zone; - - *pcbSecurityId = len+sizeof(DWORD); - - return S_OK; + return get_security_id_for_url(pwszUrl, pbSecurityId, pcbSecurityId); } -static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); DWORD zone, policy; HRESULT hres; @@ -937,13 +1067,13 @@ static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager * } -static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManagerEx2 *iface, LPCWSTR pwszUrl, REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%s %s %p %p %p %08x %08x )\n", iface, debugstr_w(pwszUrl), debugstr_guid(guidKey), @@ -960,10 +1090,10 @@ static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager return HRESULT_FROM_WIN32(ERROR_NOT_FOUND); } -static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManagerEx2 *iface, DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%08x %s %08x)\n", iface, dwZone, debugstr_w(pwszPattern),dwFlags); @@ -979,10 +1109,10 @@ static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *if return E_NOTIMPL; } -static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface, +static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManagerEx2 *iface, DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags) { - SecManagerImpl *This = impl_from_IInternetSecurityManager(iface); + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); HRESULT hres; TRACE("(%p)->(%08x %p %08x)\n", iface, dwZone, ppenumString,dwFlags); @@ -998,7 +1128,97 @@ static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *i return E_NOTIMPL; } -static const IInternetSecurityManagerVtbl VT_SecManagerImpl = +static HRESULT WINAPI SecManagerImpl_ProcessUrlActionEx(IInternetSecurityManagerEx2 *iface, + LPCWSTR pwszUrl, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, + DWORD dwFlags, DWORD dwReserved, DWORD *pdwOutFlags) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + FIXME("(%p)->(%s %08x %p %d %p %d %08x %08x %p) stub\n", This, debugstr_w(pwszUrl), dwAction, pPolicy, cbPolicy, + pContext, cbContext, dwFlags, dwReserved, pdwOutFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_MapUrlToZoneEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, DWORD *pdwZone, DWORD dwFlags, LPWSTR *ppwszMappedUrl, DWORD *pdwOutFlags) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + + TRACE("(%p)->(%p %p %08x %p %p)\n", This, pUri, pdwZone, dwFlags, ppwszMappedUrl, pdwOutFlags); + + if(This->custom_manager) { + HRESULT hres; + IInternetSecurityManagerEx2 *sec_mgr2; + + hres = IInternetSecurityManager_QueryInterface(This->custom_manager, &IID_IInternetSecurityManagerEx2, + (void**)&sec_mgr2); + if(SUCCEEDED(hres)) { + hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, pUri, pdwZone, dwFlags, ppwszMappedUrl, pdwOutFlags); + IInternetSecurityManagerEx2_Release(sec_mgr2); + } else { + BSTR url; + + hres = IUri_GetDisplayUri(pUri, &url); + if(FAILED(hres)) + return hres; + + hres = IInternetSecurityManager_MapUrlToZone(This->custom_manager, url, pdwZone, dwFlags); + SysFreeString(url); + } + + if(hres != INET_E_DEFAULT_ACTION) + return hres; + } + + if(!pdwZone) + return E_INVALIDARG; + + if(!pUri) { + *pdwZone = URLZONE_INVALID; + return E_INVALIDARG; + } + + if(dwFlags) + FIXME("Unsupported flags: %08x\n", dwFlags); + + return map_uri_to_zone(pUri, pdwZone, NULL); +} + +static HRESULT WINAPI SecManagerImpl_ProcessUrlActionEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, + DWORD dwFlags, DWORD_PTR dwReserved, DWORD *pdwOutFlags) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + FIXME("(%p)->(%p %08x %p %d %p %d %08x %08x %p) stub\n", This, pUri, dwAction, pPolicy, + cbPolicy, pContext, cbContext, dwFlags, (DWORD)dwReserved, pdwOutFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecManagerImpl_GetSecurityIdEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + TRACE("(%p)->(%p %p %p %08x) stub\n", This, pUri, pbSecurityId, pcbSecurityId, (DWORD)dwReserved); + + if(dwReserved) + FIXME("dwReserved is not supported yet\n"); + + if(!pUri || !pcbSecurityId || !pbSecurityId) + return E_INVALIDARG; + + return get_security_id_for_uri(pUri, pbSecurityId, pcbSecurityId); +} + +static HRESULT WINAPI SecManagerImpl_QueryCustomPolicyEx2(IInternetSecurityManagerEx2 *iface, + IUri *pUri, REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, + DWORD cbContext, DWORD_PTR dwReserved) +{ + SecManagerImpl *This = impl_from_IInternetSecurityManagerEx2(iface); + FIXME("(%p)->(%p %s %p %p %p %d %08x) stub\n", This, pUri, debugstr_guid(guidKey), ppPolicy, pcbPolicy, + pContext, cbContext, (DWORD)dwReserved); + return E_NOTIMPL; +} + +static const IInternetSecurityManagerEx2Vtbl VT_SecManagerImpl = { SecManagerImpl_QueryInterface, SecManagerImpl_AddRef, @@ -1010,7 +1230,12 @@ static const IInternetSecurityManagerVtbl VT_SecManagerImpl = SecManagerImpl_ProcessUrlAction, SecManagerImpl_QueryCustomPolicy, SecManagerImpl_SetZoneMapping, - SecManagerImpl_GetZoneMappings + SecManagerImpl_GetZoneMappings, + SecManagerImpl_ProcessUrlActionEx, + SecManagerImpl_MapUrlToZoneEx2, + SecManagerImpl_ProcessUrlActionEx2, + SecManagerImpl_GetSecurityIdEx2, + SecManagerImpl_QueryCustomPolicyEx2 }; HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) @@ -1021,7 +1246,7 @@ HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) This = heap_alloc(sizeof(*This)); /* Initialize the virtual function table. */ - This->IInternetSecurityManager_iface.lpVtbl = &VT_SecManagerImpl; + This->IInternetSecurityManagerEx2_iface.lpVtbl = &VT_SecManagerImpl; This->ref = 1; This->mgrsite = NULL; @@ -1138,7 +1363,7 @@ static HRESULT WINAPI ZoneMgrImpl_QueryInterface(IInternetZoneManagerEx2* iface, } *ppvObject = iface; - IInternetZoneManager_AddRef(iface); + IInternetZoneManagerEx2_AddRef(iface); return S_OK; } @@ -1512,7 +1737,7 @@ static HRESULT WINAPI ZoneMgrImpl_GetZoneAttributesEx(IInternetZoneManagerEx2* i if (dwFlags) FIXME("dwFlags 0x%x ignored\n", dwFlags); - return IInternetZoneManager_GetZoneAttributes(iface, dwZone, pZoneAttributes); + return IInternetZoneManagerEx2_GetZoneAttributes(iface, dwZone, pZoneAttributes); } @@ -1817,12 +2042,6 @@ HRESULT WINAPI CoInternetGetSecurityUrlEx(IUri *pUri, IUri **ppSecUri, PSUACTION if(FAILED(hres)) return hres; - hres = CreateUri(ret_url, Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, 0, ppSecUri); - if(FAILED(hres)) { - CoTaskMemFree(ret_url); - return hres; - } - /* File URIs have to hierarchical. */ hres = IUri_GetScheme(pUri, (DWORD*)&scheme_type); if(SUCCEEDED(hres) && scheme_type == URL_SCHEME_FILE) { @@ -1839,3 +2058,12 @@ HRESULT WINAPI CoInternetGetSecurityUrlEx(IUri *pUri, IUri **ppSecUri, PSUACTION CoTaskMemFree(ret_url); return hres; } + +/******************************************************************** + * CompareSecurityIds (URLMON.@) + */ +HRESULT WINAPI CompareSecurityIds(BYTE *secid1, DWORD size1, BYTE *secid2, DWORD size2, DWORD reserved) +{ + FIXME("(%p %d %p %d %x)\n", secid1, size1, secid2, size2, reserved); + return E_NOTIMPL; +} diff --git a/reactos/dll/win32/urlmon/session.c b/reactos/dll/win32/urlmon/session.c index c92549eeec8..7d8b40b20bb 100644 --- a/reactos/dll/win32/urlmon/session.c +++ b/reactos/dll/win32/urlmon/session.c @@ -23,25 +23,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); -typedef struct name_space { +typedef struct { LPWSTR protocol; IClassFactory *cf; CLSID clsid; BOOL urlmon; - struct name_space *next; + struct list entry; } name_space; -typedef struct mime_filter { +typedef struct { IClassFactory *cf; CLSID clsid; LPWSTR mime; - struct mime_filter *next; + struct list entry; } mime_filter; -static name_space *name_space_list = NULL; -static mime_filter *mime_filter_list = NULL; +static struct list name_space_list = LIST_INIT(name_space_list); +static struct list mime_filter_list = LIST_INIT(mime_filter_list); static CRITICAL_SECTION session_cs; static CRITICAL_SECTION_DEBUG session_cs_dbg = @@ -63,8 +63,8 @@ static name_space *find_name_space(LPCWSTR protocol) { name_space *iter; - for(iter = name_space_list; iter; iter = iter->next) { - if(!strcmpW(iter->protocol, protocol)) + LIST_FOR_EACH_ENTRY(iter, &name_space_list, name_space, entry) { + if(!strcmpiW(iter->protocol, protocol)) return iter; } @@ -119,7 +119,7 @@ static HRESULT get_protocol_cf(LPCWSTR schema, DWORD schema_len, CLSID *pclsid, return SUCCEEDED(hres) ? S_OK : MK_E_SYNTAX; } -static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol) +HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL urlmon_protocol) { name_space *new_name_space; @@ -134,8 +134,7 @@ static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR proto EnterCriticalSection(&session_cs); - new_name_space->next = name_space_list; - name_space_list = new_name_space; + list_add_head(&name_space_list, &new_name_space->entry); LeaveCriticalSection(&session_cs); @@ -144,44 +143,28 @@ static HRESULT register_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR proto static HRESULT unregister_namespace(IClassFactory *cf, LPCWSTR protocol) { - name_space *iter, *last = NULL; + name_space *iter; EnterCriticalSection(&session_cs); - for(iter = name_space_list; iter; iter = iter->next) { - if(iter->cf == cf && !strcmpW(iter->protocol, protocol)) - break; - last = iter; - } + LIST_FOR_EACH_ENTRY(iter, &name_space_list, name_space, entry) { + if(iter->cf == cf && !strcmpiW(iter->protocol, protocol)) { + list_remove(&iter->entry); - if(iter) { - if(last) - last->next = iter->next; - else - name_space_list = iter->next; + LeaveCriticalSection(&session_cs); + + if(!iter->urlmon) + IClassFactory_Release(iter->cf); + heap_free(iter->protocol); + heap_free(iter); + return S_OK; + } } LeaveCriticalSection(&session_cs); - - if(iter) { - if(!iter->urlmon) - IClassFactory_Release(iter->cf); - heap_free(iter->protocol); - heap_free(iter); - } - return S_OK; } - -void register_urlmon_namespace(IClassFactory *cf, REFIID clsid, LPCWSTR protocol, BOOL do_register) -{ - if(do_register) - register_namespace(cf, clsid, protocol, TRUE); - else - unregister_namespace(cf, protocol); -} - BOOL is_registered_protocol(LPCWSTR url) { DWORD schema_len; @@ -277,14 +260,22 @@ HRESULT get_protocol_handler(IUri *uri, CLSID *clsid, BOOL *urlmon_protocol, ICl IInternetProtocol *get_mime_filter(LPCWSTR mime) { + static const WCHAR filtersW[] = {'P','r','o','t','o','c','o','l','s', + '\\','F','i','l','t','e','r',0 }; + static const WCHAR CLSIDW[] = {'C','L','S','I','D',0}; + IClassFactory *cf = NULL; IInternetProtocol *ret; mime_filter *iter; + HKEY hlist, hfilter; + WCHAR clsidw[64]; + CLSID clsid; + DWORD res, type, size; HRESULT hres; EnterCriticalSection(&session_cs); - for(iter = mime_filter_list; iter; iter = iter->next) { + LIST_FOR_EACH_ENTRY(iter, &mime_filter_list, mime_filter, entry) { if(!strcmpW(iter->mime, mime)) { cf = iter->cf; break; @@ -293,12 +284,44 @@ IInternetProtocol *get_mime_filter(LPCWSTR mime) LeaveCriticalSection(&session_cs); - if(!cf) + if(cf) { + hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&ret); + if(FAILED(hres)) { + WARN("CreateInstance failed: %08x\n", hres); + return NULL; + } + + return ret; + } + + res = RegOpenKeyW(HKEY_CLASSES_ROOT, filtersW, &hlist); + if(res != ERROR_SUCCESS) { + TRACE("Could not open MIME filters key\n"); + return NULL; + } + + res = RegOpenKeyW(hlist, mime, &hfilter); + CloseHandle(hlist); + if(res != ERROR_SUCCESS) return NULL; - hres = IClassFactory_CreateInstance(cf, NULL, &IID_IInternetProtocol, (void**)&ret); + size = sizeof(clsidw); + res = RegQueryValueExW(hfilter, CLSIDW, NULL, &type, (LPBYTE)clsidw, &size); + CloseHandle(hfilter); + if(res!=ERROR_SUCCESS || type!=REG_SZ) { + WARN("Could not get filter CLSID for %s\n", debugstr_w(mime)); + return NULL; + } + + hres = CLSIDFromString(clsidw, &clsid); if(FAILED(hres)) { - WARN("CreateInstance failed: %08x\n", hres); + WARN("CLSIDFromString failed for %s (%x)\n", debugstr_w(mime), hres); + return NULL; + } + + hres = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IInternetProtocol, (void**)&ret); + if(FAILED(hres)) { + WARN("CoCreateInstance failed: %08x\n", hres); return NULL; } @@ -379,8 +402,7 @@ static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface EnterCriticalSection(&session_cs); - filter->next = mime_filter_list; - mime_filter_list = filter; + list_add_head(&mime_filter_list, &filter->entry); LeaveCriticalSection(&session_cs); @@ -390,33 +412,26 @@ static HRESULT WINAPI InternetSession_RegisterMimeFilter(IInternetSession *iface static HRESULT WINAPI InternetSession_UnregisterMimeFilter(IInternetSession *iface, IClassFactory *pCF, LPCWSTR pwzType) { - mime_filter *iter, *prev = NULL; + mime_filter *iter; TRACE("(%p %s)\n", pCF, debugstr_w(pwzType)); EnterCriticalSection(&session_cs); - for(iter = mime_filter_list; iter; iter = iter->next) { - if(iter->cf == pCF && !strcmpW(iter->mime, pwzType)) - break; - prev = iter; - } + LIST_FOR_EACH_ENTRY(iter, &mime_filter_list, mime_filter, entry) { + if(iter->cf == pCF && !strcmpW(iter->mime, pwzType)) { + list_remove(&iter->entry); - if(iter) { - if(prev) - prev->next = iter->next; - else - mime_filter_list = iter->next; + LeaveCriticalSection(&session_cs); + + IClassFactory_Release(iter->cf); + heap_free(iter->mime); + heap_free(iter); + return S_OK; + } } LeaveCriticalSection(&session_cs); - - if(iter) { - IClassFactory_Release(iter->cf); - heap_free(iter->mime); - heap_free(iter); - } - return S_OK; } @@ -517,31 +532,38 @@ static LPWSTR user_agent; static void ensure_useragent(void) { - DWORD size = sizeof(DWORD), res, type; - HKEY hkey; + OSVERSIONINFOW info = {sizeof(info)}; + const WCHAR *os_type, *is_nt; + WCHAR buf[512]; + BOOL is_wow; - static const WCHAR user_agentW[] = {'U','s','e','r',' ','A','g','e','n','t',0}; + static const WCHAR formatW[] = + {'M','o','z','i','l','l','a','/','4','.','0', + ' ','(','c','o','m','p','a','t','i','b','l','e',';', + ' ','M','S','I','E',' ','8','.','0',';', + ' ','W','i','n','d','o','w','s',' ','%','s','%','d','.','%','d',';', + ' ','%','s',';',' ','T','r','i','d','e','n','t','/','5','.','0',')',0}; + static const WCHAR ntW[] = {'N','T',' ',0}; + static const WCHAR win32W[] = {'W','i','n','3','2',0}; + static const WCHAR win64W[] = {'W','i','n','6','4',0}; + static const WCHAR wow64W[] = {'W','O','W','6','4',0}; + static const WCHAR emptyW[] = {0}; if(user_agent) return; - res = RegOpenKeyW(HKEY_CURRENT_USER, internet_settings_keyW, &hkey); - if(res != ERROR_SUCCESS) - return; + GetVersionExW(&info); + is_nt = info.dwPlatformId == VER_PLATFORM_WIN32_NT ? ntW : emptyW; - res = RegQueryValueExW(hkey, user_agentW, NULL, &type, NULL, &size); - if(res == ERROR_SUCCESS && type == REG_SZ) { - user_agent = heap_alloc(size); - res = RegQueryValueExW(hkey, user_agentW, NULL, &type, (LPBYTE)user_agent, &size); - if(res != ERROR_SUCCESS) { - heap_free(user_agent); - user_agent = NULL; - } - }else { - WARN("Could not find User Agent value: %u\n", res); - } + if(sizeof(void*) == 8) + os_type = win64W; + else if(IsWow64Process(GetCurrentProcess(), &is_wow) && is_wow) + os_type = wow64W; + else + os_type = win32W; - RegCloseKey(hkey); + sprintfW(buf, formatW, is_nt, info.dwMajorVersion, info.dwMinorVersion, os_type); + user_agent = heap_strdupW(buf); } LPWSTR get_useragent(void) @@ -691,5 +713,21 @@ HRESULT WINAPI ObtainUserAgentString(DWORD dwOption, LPSTR pcszUAOut, DWORD *cbS void free_session(void) { + name_space *ns_iter, *ns_last; + mime_filter *mf_iter, *mf_last; + + LIST_FOR_EACH_ENTRY_SAFE(ns_iter, ns_last, &name_space_list, name_space, entry) { + if(!ns_iter->urlmon) + IClassFactory_Release(ns_iter->cf); + heap_free(ns_iter->protocol); + heap_free(ns_iter); + } + + LIST_FOR_EACH_ENTRY_SAFE(mf_iter, mf_last, &mime_filter_list, mime_filter, entry) { + IClassFactory_Release(mf_iter->cf); + heap_free(mf_iter->mime); + heap_free(mf_iter); + } + heap_free(user_agent); } diff --git a/reactos/dll/win32/urlmon/umon.c b/reactos/dll/win32/urlmon/umon.c index 7594fa7dff9..926fb7a66bf 100644 --- a/reactos/dll/win32/urlmon/umon.c +++ b/reactos/dll/win32/urlmon/umon.c @@ -37,7 +37,8 @@ typedef struct { LONG ref; - LPOLESTR URLName; /* URL string identified by this URLmoniker */ + IUri *uri; + BSTR URLName; } URLMoniker; static inline URLMoniker *impl_from_IMoniker(IMoniker *iface) @@ -76,7 +77,7 @@ static HRESULT WINAPI URLMoniker_QueryInterface(IMoniker *iface, REFIID riid, vo return E_NOINTERFACE; } - IMoniker_AddRef((IUnknown*)*ppv); + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } @@ -98,7 +99,9 @@ static ULONG WINAPI URLMoniker_Release(IMoniker *iface) TRACE("(%p) ref=%u\n",This, refCount); if (!refCount) { - heap_free(This->URLName); + if(This->uri) + IUri_Release(This->uri); + SysFreeString(This->URLName); heap_free(This); URLMON_UnlockModule(); @@ -136,9 +139,12 @@ static HRESULT WINAPI URLMoniker_IsDirty(IMoniker *iface) static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm) { URLMoniker *This = impl_from_IMoniker(iface); - HRESULT res; + WCHAR *new_uri_str; + IUri *new_uri; + BSTR new_url; ULONG size; ULONG got; + HRESULT hres; TRACE("(%p,%p)\n",This,pStm); @@ -150,23 +156,37 @@ static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm) * Writes a ULONG containing length of unicode string, followed * by that many unicode characters */ - res = IStream_Read(pStm, &size, sizeof(ULONG), &got); - if(SUCCEEDED(res)) { - if(got == sizeof(ULONG)) { - heap_free(This->URLName); - This->URLName = heap_alloc(size); - if(!This->URLName) - res = E_OUTOFMEMORY; - else { - res = IStream_Read(pStm, This->URLName, size, NULL); - This->URLName[size/sizeof(WCHAR) - 1] = 0; - } - } - else - res = E_FAIL; + hres = IStream_Read(pStm, &size, sizeof(ULONG), &got); + if(FAILED(hres)) + return hres; + if(got != sizeof(ULONG)) + return E_FAIL; + + new_uri_str = heap_alloc(size+sizeof(WCHAR)); + if(!new_uri_str) + return E_OUTOFMEMORY; + + hres = IStream_Read(pStm, new_uri_str, size, NULL); + new_uri_str[size/sizeof(WCHAR)] = 0; + if(SUCCEEDED(hres)) + hres = CreateUri(new_uri_str, 0, 0, &new_uri); + heap_free(new_uri_str); + if(FAILED(hres)) + return hres; + + hres = IUri_GetDisplayUri(new_uri, &new_url); + if(FAILED(hres)) { + IUri_Release(new_uri); + return hres; } - return res; + SysFreeString(This->URLName); + if(This->uri) + IUri_Release(This->uri); + + This->uri = new_uri; + This->URLName = new_url; + return S_OK; } static HRESULT WINAPI URLMoniker_Save(IMoniker *iface, IStream* pStm, BOOL fClearDirty) @@ -180,7 +200,7 @@ static HRESULT WINAPI URLMoniker_Save(IMoniker *iface, IStream* pStm, BOOL fClea if(!pStm) return E_INVALIDARG; - size = (strlenW(This->URLName) + 1)*sizeof(WCHAR); + size = (SysStringLen(This->URLName) + 1)*sizeof(WCHAR); res=IStream_Write(pStm,&size,sizeof(ULONG),NULL); if(SUCCEEDED(res)) res=IStream_Write(pStm,This->URLName,size,NULL); @@ -198,7 +218,7 @@ static HRESULT WINAPI URLMoniker_GetSizeMax(IMoniker* iface, ULARGE_INTEGER *pcb if(!pcbSize) return E_INVALIDARG; - pcbSize->QuadPart = sizeof(ULONG) + ((strlenW(This->URLName)+1) * sizeof(WCHAR)); + pcbSize->QuadPart = sizeof(ULONG) + ((SysStringLen(This->URLName)+1) * sizeof(WCHAR)); return S_OK; } @@ -207,10 +227,9 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM { URLMoniker *This = impl_from_IMoniker(iface); IRunningObjectTable *obj_tbl; - IUri *uri; HRESULT hres; - TRACE("(%p)->(%p,%p,%s,%p): stub\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv); + TRACE("(%p)->(%p,%p,%s,%p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv); hres = IBindCtx_GetRunningObjectTable(pbc, &obj_tbl); if(SUCCEEDED(hres)) { @@ -218,22 +237,18 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM IRunningObjectTable_Release(obj_tbl); } - hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); - if(FAILED(hres)) - return hres; + if(!This->uri) { + *ppv = NULL; + return MK_E_SYNTAX; + } - hres = bind_to_object(iface, uri, pbc, riid, ppv); - - IUri_Release(uri); - return hres; + return bind_to_object(&This->IMoniker_iface, This->uri, pbc, riid, ppv); } static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, void **ppvObject) { URLMoniker *This = impl_from_IMoniker(iface); - IUri *uri; - HRESULT hres; TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObject); @@ -244,14 +259,10 @@ static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc, if(pmkToLeft) FIXME("Unsupported pmkToLeft\n"); - hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); - if(FAILED(hres)) - return hres; + if(!This->uri) + return MK_E_SYNTAX; - hres = bind_to_storage(uri, pbc, riid, ppvObject); - - IUri_Release(uri); - return hres; + return bind_to_storage(This->uri, pbc, riid, ppvObject); } static HRESULT WINAPI URLMoniker_Reduce(IMoniker *iface, IBindCtx *pbc, @@ -320,7 +331,7 @@ static HRESULT WINAPI URLMoniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoni if(result == 0) res = S_OK; } - IUnknown_Release(bind); + IBindCtx_Release(bind); return res; } @@ -409,7 +420,7 @@ static HRESULT WINAPI URLMoniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, /* FIXME: If this is a partial URL, try and get a URL moniker from SZ_URLCONTEXT in the bind context, then look at pmkToLeft to try and complete the URL */ - len = lstrlenW(This->URLName)+1; + len = SysStringLen(This->URLName)+1; *ppszDisplayName = CoTaskMemAlloc(len*sizeof(WCHAR)); if(!*ppszDisplayName) return E_OUTOFMEMORY; @@ -492,10 +503,16 @@ static HRESULT WINAPI UriContainer_GetIUri(IUriContainer *iface, IUri **ppIUri) { URLMoniker *This = impl_from_IUriContainer(iface); - FIXME("(%p)->(%p)\n", This, ppIUri); + TRACE("(%p)->(%p)\n", This, ppIUri); - *ppIUri = NULL; - return S_FALSE; + if(!This->uri) { + *ppIUri = NULL; + return S_FALSE; + } + + IUri_AddRef(This->uri); + *ppIUri = This->uri; + return S_OK; } static const IUriContainerVtbl UriContainerVtbl = { @@ -505,61 +522,66 @@ static const IUriContainerVtbl UriContainerVtbl = { UriContainer_GetIUri }; -static URLMoniker *alloc_moniker(void) -{ - URLMoniker *ret; - - ret = heap_alloc(sizeof(URLMoniker)); - if(!ret) - return NULL; - - ret->IMoniker_iface.lpVtbl = &URLMonikerVtbl; - ret->IUriContainer_iface.lpVtbl = &UriContainerVtbl; - ret->ref = 1; - ret->URLName = NULL; - - return ret; -} - -static HRESULT URLMoniker_Init(URLMoniker *This, LPCOLESTR lpszLeftURLName, LPCOLESTR lpszURLName) +static HRESULT create_moniker(IUri *uri, URLMoniker **ret) { + URLMoniker *mon; HRESULT hres; - DWORD sizeStr = 0; - TRACE("(%p,%s,%s)\n",This,debugstr_w(lpszLeftURLName),debugstr_w(lpszURLName)); + mon = heap_alloc(sizeof(*mon)); + if(!mon) + return E_OUTOFMEMORY; - This->URLName = heap_alloc(INTERNET_MAX_URL_LENGTH*sizeof(WCHAR)); + mon->IMoniker_iface.lpVtbl = &URLMonikerVtbl; + mon->IUriContainer_iface.lpVtbl = &UriContainerVtbl; + mon->ref = 1; - if(lpszLeftURLName) - hres = CoInternetCombineUrl(lpszLeftURLName, lpszURLName, URL_FILE_USE_PATHURL, - This->URLName, INTERNET_MAX_URL_LENGTH, &sizeStr, 0); - else - hres = CoInternetParseUrl(lpszURLName, PARSE_CANONICALIZE, URL_FILE_USE_PATHURL, - This->URLName, INTERNET_MAX_URL_LENGTH, &sizeStr, 0); + if(uri) { + /* FIXME: try to avoid it */ + hres = IUri_GetDisplayUri(uri, &mon->URLName); + if(FAILED(hres)) { + heap_free(mon); + return hres; + } - if(FAILED(hres)) { - heap_free(This->URLName); - return hres; + IUri_AddRef(uri); + mon->uri = uri; + }else { + mon->URLName = NULL; + mon->uri = NULL; } URLMON_LockModule(); - - if(sizeStr != INTERNET_MAX_URL_LENGTH) - This->URLName = heap_realloc(This->URLName, (sizeStr+1)*sizeof(WCHAR)); - - TRACE("URLName = %s\n", debugstr_w(This->URLName)); - + *ret = mon; return S_OK; } HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv) { + URLMoniker *mon; + HRESULT hres; + TRACE("(%p %p)\n", outer, ppv); - *ppv = alloc_moniker(); - return *ppv ? S_OK : E_OUTOFMEMORY; + hres = create_moniker(NULL, &mon); + if(FAILED(hres)) + return hres; + + *ppv = &mon->IMoniker_iface; + return S_OK; } +static const DWORD create_flags_map[3] = { + Uri_CREATE_FILE_USE_DOS_PATH, /* URL_MK_LEGACY */ + 0, /* URL_MK_UNIFORM */ + Uri_CREATE_NO_CANONICALIZE /* URL_MK_NO_CANONICALIZE */ +}; + +static const DWORD combine_flags_map[3] = { + URL_FILE_USE_PATHURL, /* URL_MK_LEGACY */ + 0, /* URL_MK_UNIFORM */ + URL_DONT_SIMPLIFY /* URL_MK_NO_CANONICALIZE */ +}; + /*********************************************************************** * CreateURLMonikerEx (URLMON.@) * @@ -578,9 +600,9 @@ HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv) */ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk, DWORD dwFlags) { + IUri *uri, *base_uri = NULL; URLMoniker *obj; HRESULT hres; - LPOLESTR lefturl = NULL; TRACE("(%p, %s, %p, %08x)\n", pmkContext, debugstr_w(szURL), ppmk, dwFlags); @@ -590,28 +612,91 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker if (!szURL || !ppmk) return E_INVALIDARG; - if (dwFlags & URL_MK_UNIFORM) FIXME("ignoring flag URL_MK_UNIFORM\n"); - - if(!(obj = alloc_moniker())) - return E_OUTOFMEMORY; + if(dwFlags >= sizeof(create_flags_map)/sizeof(*create_flags_map)) { + FIXME("Unsupported flags %x\n", dwFlags); + return E_INVALIDARG; + } if(pmkContext) { - IBindCtx* bind; - DWORD dwMksys = 0; - IMoniker_IsSystemMoniker(pmkContext, &dwMksys); - if(dwMksys == MKSYS_URLMONIKER && SUCCEEDED(CreateBindCtx(0, &bind))) { - IMoniker_GetDisplayName(pmkContext, bind, NULL, &lefturl); - TRACE("lefturl = %s\n", debugstr_w(lefturl)); - IBindCtx_Release(bind); + IUriContainer *uri_container; + + hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container); + if(SUCCEEDED(hres)) { + hres = IUriContainer_GetIUri(uri_container, &base_uri); + IUriContainer_Release(uri_container); + if(FAILED(hres)) + return hres; } } - - hres = URLMoniker_Init(obj, lefturl, szURL); - CoTaskMemFree(lefturl); - if(SUCCEEDED(hres)) - hres = URLMoniker_QueryInterface(&obj->IMoniker_iface, &IID_IMoniker, (void**)ppmk); - IMoniker_Release(&obj->IMoniker_iface); - return hres; + + if(base_uri) { + hres = CoInternetCombineUrlEx(base_uri, szURL, combine_flags_map[dwFlags], &uri, 0); + IUri_Release(base_uri); + }else { + hres = CreateUri(szURL, Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME|create_flags_map[dwFlags], 0, &uri); + } + if(FAILED(hres)) + return hres; + + hres = create_moniker(uri, &obj); + IUri_Release(uri); + if(FAILED(hres)) + return hres; + + *ppmk = &obj->IMoniker_iface; + return S_OK; +} + +/*********************************************************************** + * CreateURLMonikerEx2 (URLMON.@) + */ +HRESULT WINAPI CreateURLMonikerEx2(IMoniker *pmkContext, IUri *pUri, IMoniker **ppmk, DWORD dwFlags) +{ + IUri *context_uri = NULL, *uri; + IUriContainer *uri_container; + URLMoniker *ret; + HRESULT hres; + + TRACE("(%p %p %p %x)\n", pmkContext, pUri, ppmk, dwFlags); + + if (ppmk) + *ppmk = NULL; + + if (!pUri || !ppmk) + return E_INVALIDARG; + + if(dwFlags >= sizeof(create_flags_map)/sizeof(*create_flags_map)) { + FIXME("Unsupported flags %x\n", dwFlags); + return E_INVALIDARG; + } + + if(pmkContext) { + hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container); + if(SUCCEEDED(hres)) { + hres = IUriContainer_GetIUri(uri_container, &context_uri); + if(FAILED(hres)) + context_uri = NULL; + IUriContainer_Release(uri_container); + } + } + + if(context_uri) { + hres = CoInternetCombineIUri(context_uri, pUri, combine_flags_map[dwFlags], &uri, 0); + IUri_Release(context_uri); + if(FAILED(hres)) + return hres; + }else { + uri = pUri; + IUri_AddRef(uri); + } + + hres = create_moniker(uri, &ret); + IUri_Release(uri); + if(FAILED(hres)) + return hres; + + *ppmk = &ret->IMoniker_iface; + return S_OK; } /********************************************************************** @@ -865,14 +950,3 @@ HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi ) FIXME("%s %p\n", debugstr_w(szDistUnit), psdi ); return E_FAIL; } - -/*********************************************************************** - * AsyncInstallDistributionUnit (URLMON.@) - */ -HRESULT WINAPI AsyncInstallDistributionUnit( LPCWSTR szDistUnit, LPCWSTR szTYPE, - LPCWSTR szExt, DWORD dwFileVersionMS, DWORD dwFileVersionLS, - LPCWSTR szURL, IBindCtx *pbc, LPVOID pvReserved, DWORD flags ) -{ - FIXME(": stub\n"); - return E_NOTIMPL; -} diff --git a/reactos/dll/win32/urlmon/umstream.c b/reactos/dll/win32/urlmon/umstream.c index bb9e4db6488..5f48bb4f514 100644 --- a/reactos/dll/win32/urlmon/umstream.c +++ b/reactos/dll/win32/urlmon/umstream.c @@ -48,7 +48,7 @@ static HRESULT WINAPI ProxyBindStatusCallback_QueryInterface(IBindStatusCallback IsEqualGUID(&IID_IUnknown, riid)) { *ppv = iface; - IUnknown_AddRef(iface); + IBindStatusCallback_AddRef(iface); return S_OK; } diff --git a/reactos/dll/win32/urlmon/uri.c b/reactos/dll/win32/urlmon/uri.c index 510ff0df233..3f3b19c0257 100644 --- a/reactos/dll/win32/urlmon/uri.c +++ b/reactos/dll/win32/urlmon/uri.c @@ -17,6 +17,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +//#include + #include "urlmon_main.h" #include @@ -25,9 +27,6 @@ #include -#define UINT_MAX 0xffffffff -#define USHORT_MAX 0xffff - #define URI_DISPLAY_NO_ABSOLUTE_URI 0x1 #define URI_DISPLAY_NO_DEFAULT_PORT_AUTH 0x2 @@ -50,6 +49,8 @@ static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x typedef struct { IUri IUri_iface; IUriBuilderFactory IUriBuilderFactory_iface; + IPersistStream IPersistStream_iface; + IMarshal IMarshal_iface; LONG ref; @@ -155,6 +156,7 @@ typedef struct { BOOL has_implicit_scheme; BOOL has_implicit_ip; UINT implicit_ipv4; + BOOL must_have_path; const WCHAR *scheme; DWORD scheme_len; @@ -233,7 +235,7 @@ static const struct { {URL_SCHEME_HTTPS, 443}, }; -/* List of 3 character top level domain names Windows seems to recognize. +/* List of 3-character top level domain names Windows seems to recognize. * There might be more, but, these are the only ones I've found so far. */ static const struct { @@ -270,7 +272,7 @@ static inline BOOL is_drive_path(const WCHAR *str) { } static inline BOOL is_unc_path(const WCHAR *str) { - return (str[0] == '\\' && str[0] == '\\'); + return (str[0] == '\\' && str[1] == '\\'); } static inline BOOL is_forbidden_dos_path_char(WCHAR val) { @@ -278,7 +280,7 @@ static inline BOOL is_forbidden_dos_path_char(WCHAR val) { } /* A URI is implicitly a file path if it begins with - * a drive letter (eg X:) or starts with "\\" (UNC path). + * a drive letter (e.g. X:) or starts with "\\" (UNC path). */ static inline BOOL is_implicit_file_path(const WCHAR *str) { return (is_unc_path(str) || (is_alpha(str[0]) && str[1] == ':')); @@ -328,7 +330,7 @@ static inline BOOL is_gendelim(WCHAR val) { /* Characters that delimit the end of the authority * section of a URI. Sometimes a '\\' is considered - * an authority delimeter. + * an authority delimiter. */ static inline BOOL is_auth_delim(WCHAR val, BOOL acceptSlash) { return (val == '#' || val == '/' || val == '?' || @@ -403,12 +405,12 @@ static void apply_default_flags(DWORD *flags) { /* Determines if the URI is hierarchical using the information already parsed into * data and using the current location of parsing in the URI string. * - * Windows considers a URI hierarchical if on of the following is true: + * Windows considers a URI hierarchical if one of the following is true: * A.) It's a wildcard scheme. * B.) It's an implicit file scheme. * C.) It's a known hierarchical scheme and it has two '\\' after the scheme name. * (the '\\' will be converted into "//" during canonicalization). - * D.) It's not a relative URI and "//" appears after the scheme name. + * D.) "//" appears after the scheme name (or at the beginning if no scheme is given). */ static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data) { const WCHAR *start = *ptr; @@ -420,114 +422,16 @@ static inline BOOL is_hierarchical_uri(const WCHAR **ptr, const parse_data *data else if(is_hierarchical_scheme(data->scheme_type) && (*ptr)[0] == '\\' && (*ptr)[1] == '\\') { *ptr += 2; return TRUE; - } else if(!data->is_relative && check_hierarchical(ptr)) + } else if(check_hierarchical(ptr)) return TRUE; *ptr = start; return FALSE; } -/* Checks if the two Uri's are logically equivalent. It's a simple - * comparison, since they are both of type Uri, and it can access - * the properties of each Uri directly without the need to go - * through the "IUri_Get*" interface calls. - */ -static BOOL are_equal_simple(const Uri *a, const Uri *b) { - if(a->scheme_type == b->scheme_type) { - const BOOL known_scheme = a->scheme_type != URL_SCHEME_UNKNOWN; - const BOOL are_hierarchical = - (a->authority_start > -1 && b->authority_start > -1); - - if(a->scheme_type == URL_SCHEME_FILE) { - if(a->canon_len == b->canon_len) - return !StrCmpIW(a->canon_uri, b->canon_uri); - } - - /* Only compare the scheme names (if any) if their unknown scheme types. */ - if(!known_scheme) { - if((a->scheme_start > -1 && b->scheme_start > -1) && - (a->scheme_len == b->scheme_len)) { - /* Make sure the schemes are the same. */ - if(StrCmpNW(a->canon_uri+a->scheme_start, b->canon_uri+b->scheme_start, a->scheme_len)) - return FALSE; - } else if(a->scheme_len != b->scheme_len) - /* One of the Uri's has a scheme name, while the other doesn't. */ - return FALSE; - } - - /* If they have a userinfo component, perform case sensitive compare. */ - if((a->userinfo_start > -1 && b->userinfo_start > -1) && - (a->userinfo_len == b->userinfo_len)) { - if(StrCmpNW(a->canon_uri+a->userinfo_start, b->canon_uri+b->userinfo_start, a->userinfo_len)) - return FALSE; - } else if(a->userinfo_len != b->userinfo_len) - /* One of the Uri's had a userinfo, while the other one doesn't. */ - return FALSE; - - /* Check if they have a host name. */ - if((a->host_start > -1 && b->host_start > -1) && - (a->host_len == b->host_len)) { - /* Perform a case insensitive compare if they are a known scheme type. */ - if(known_scheme) { - if(StrCmpNIW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) - return FALSE; - } else if(StrCmpNW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) - return FALSE; - } else if(a->host_len != b->host_len) - /* One of the Uri's had a host, while the other one didn't. */ - return FALSE; - - if(a->has_port && b->has_port) { - if(a->port != b->port) - return FALSE; - } else if(a->has_port || b->has_port) - /* One had a port, while the other one didn't. */ - return FALSE; - - /* Windows is weird with how it handles paths. For example - * One URI could be "http://google.com" (after canonicalization) - * and one could be "http://google.com/" and the IsEqual function - * would still evaluate to TRUE, but, only if they are both hierarchical - * URIs. - */ - if((a->path_start > -1 && b->path_start > -1) && - (a->path_len == b->path_len)) { - if(StrCmpNW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) - return FALSE; - } else if(are_hierarchical && a->path_len == -1 && b->path_len == 0) { - if(*(a->canon_uri+a->path_start) != '/') - return FALSE; - } else if(are_hierarchical && b->path_len == 1 && a->path_len == 0) { - if(*(b->canon_uri+b->path_start) != '/') - return FALSE; - } else if(a->path_len != b->path_len) - return FALSE; - - /* Compare the query strings of the two URIs. */ - if((a->query_start > -1 && b->query_start > -1) && - (a->query_len == b->query_len)) { - if(StrCmpNW(a->canon_uri+a->query_start, b->canon_uri+b->query_start, a->query_len)) - return FALSE; - } else if(a->query_len != b->query_len) - return FALSE; - - if((a->fragment_start > -1 && b->fragment_start > -1) && - (a->fragment_len == b->fragment_len)) { - if(StrCmpNW(a->canon_uri+a->fragment_start, b->canon_uri+b->fragment_start, a->fragment_len)) - return FALSE; - } else if(a->fragment_len != b->fragment_len) - return FALSE; - - /* If we get here, the two URIs are equivalent. */ - return TRUE; - } - - return FALSE; -} - /* Computes the size of the given IPv6 address. - * Each h16 component is 16bits, if there is an IPv4 address, it's - * 32bits. If there's an elision it can be 16bits to 128bits, depending + * Each h16 component is 16 bits. If there is an IPv4 address, it's + * 32 bits. If there's an elision it can be 16 to 128 bits, depending * on the number of other components. * * Modeled after google-url's CheckIPv6ComponentsSize function @@ -541,7 +445,7 @@ static void compute_ipv6_comps_size(ipv6_address *address) { if(address->elision) { /* An elision can be anywhere from 2 bytes up to 16 bytes. - * It size depends on the size of the h16 and IPv4 components. + * Its size depends on the size of the h16 and IPv4 components. */ address->elision_size = 16 - address->components_size; if(address->elision_size < 2) @@ -567,7 +471,7 @@ static int hex_to_int(WCHAR val) { * the two characters following the '%' aren't valid hex values then * this function returns the NULL character. * - * Eg. + * E.g. * "%2E" will result in '.' being returned by this function. */ static WCHAR decode_pct_val(const WCHAR *ptr) { @@ -616,7 +520,7 @@ void find_domain_name(const WCHAR *host, DWORD host_len, *domain_start = -1; /* There has to be at least enough room for a '.' followed by a - * 3 character TLD for a domain to even exist in the host name. + * 3-character TLD for a domain to even exist in the host name. */ if(host_len < 4) return; @@ -640,7 +544,7 @@ void find_domain_name(const WCHAR *host, DWORD host_len, } else if(last_tld-host == 3) { DWORD i; - /* If there's three characters in front of last_tld and + /* If there are three characters in front of last_tld and * they are on the list of recognized TLDs, then this * host doesn't have a domain (since the host only contains * a TLD name. @@ -789,12 +693,12 @@ static INT find_file_extension(const WCHAR *path, DWORD path_len) { /* Computes the location where the elision should occur in the IPv6 * address using the numerical values of each component stored in * 'values'. If the address shouldn't contain an elision then 'index' - * is assigned -1 as it's value. Otherwise 'index' will contain the + * is assigned -1 as its value. Otherwise 'index' will contain the * starting index (into values) where the elision should be, and 'count' * will contain the number of cells the elision covers. * * NOTES: - * Windows will expand an elision if the elision only represents 1 h16 + * Windows will expand an elision if the elision only represents one h16 * component of the address. * * Ex: [1::2:3:4:5:6:7] -> [1:0:2:3:4:5:6:7] @@ -857,35 +761,35 @@ static void compute_elision_location(const ipv6_address *address, const USHORT v * characters inside of the URI string. */ static BSTR pre_process_uri(LPCWSTR uri) { - BSTR ret; + const WCHAR *start, *end, *ptr; + WCHAR *ptr2; DWORD len; - const WCHAR *start, *end; - WCHAR *buf, *ptr; - - len = lstrlenW(uri); + BSTR ret; start = uri; /* Skip leading controls and whitespace. */ - while(iscntrlW(*start) || isspaceW(*start)) ++start; + while(*start && (iscntrlW(*start) || isspaceW(*start))) ++start; - end = uri+len-1; - if(start == end) - /* URI consisted only of control/whitespace. */ - ret = SysAllocStringLen(NULL, 0); - else { - while(iscntrlW(*end) || isspaceW(*end)) --end; + /* URI consisted only of control/whitespace. */ + if(!*start) + return SysAllocStringLen(NULL, 0); - buf = heap_alloc(((end+1)-start)*sizeof(WCHAR)); - if(!buf) - return NULL; + end = start + strlenW(start); + while(--end > start && (iscntrlW(*end) || isspaceW(*end))); - for(ptr = buf; start < end+1; ++start) { - if(!iscntrlW(*start)) - *ptr++ = *start; - } + len = ++end - start; + for(ptr = start; ptr < end; ptr++) { + if(iscntrlW(*ptr)) + len--; + } - ret = SysAllocStringLen(buf, ptr-buf); - heap_free(buf); + ret = SysAllocStringLen(NULL, len); + if(!ret) + return NULL; + + for(ptr = start, ptr2=ret; ptr < end; ptr++) { + if(!iscntrlW(*ptr)) + *ptr2++ = *ptr; } return ret; @@ -915,7 +819,7 @@ static UINT ipv4toui(const WCHAR *ip, DWORD len) { return ret; } -/* Converts an IPv4 address in numerical form into it's fully qualified +/* Converts an IPv4 address in numerical form into its fully qualified * string form. This function returns the number of characters written * to 'dest'. If 'dest' is NULL this function will return the number of * characters that would have been written. @@ -956,7 +860,7 @@ static DWORD ui2str(WCHAR *dest, UINT value) { return ret; } -/* Converts an h16 component (from an IPv6 address) into it's +/* Converts a h16 component (from an IPv6 address) into its * numerical value. * * This function assumes that the h16 component has already been validated. @@ -987,7 +891,7 @@ static BOOL ipv6_to_number(const ipv6_address *address, USHORT number[8]) { /* Means we just passed the elision and need to add its values to * 'number' before we do anything else. */ - DWORD j = 0; + INT j; for(j = 0; j < address->elision_size; j+=2) number[cur_component++] = 0; @@ -1000,7 +904,8 @@ static BOOL ipv6_to_number(const ipv6_address *address, USHORT number[8]) { /* Case when the elision appears after the h16 components. */ if(!already_passed_elision && address->elision) { - for(i = 0; i < address->elision_size; i+=2) + INT j; + for(j = 0; j < address->elision_size; j+=2) number[cur_component++] = 0; } @@ -1063,7 +968,7 @@ static BOOL check_dec_octet(const WCHAR **ptr) { ++(*ptr); c2 = *ptr; - /* Since the 1 digit requirment was meet, it doesn't + /* Since the 1-digit requirement was met, it doesn't * matter if this is a DIGIT value, it's considered a * dec-octet. */ @@ -1270,7 +1175,7 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD TRACE("(%p %p %x): URI is an implicit file path.\n", ptr, data, flags); } else { - /* Window's does not consider anything that can implicitly be a file + /* Windows does not consider anything that can implicitly be a file * path to be a valid URI if the ALLOW_IMPLICIT_FILE_SCHEME flag is not set... */ TRACE("(%p %p %x): URI is implicitly a file path, but, the ALLOW_IMPLICIT_FILE_SCHEME flag wasn't set.\n", @@ -1278,10 +1183,10 @@ static BOOL parse_scheme(const WCHAR **ptr, parse_data *data, DWORD flags, DWORD return FALSE; } } else if(!parse_scheme_name(ptr, data, extras)) { - /* No Scheme was found, this means it could be: + /* No scheme was found, this means it could be: * a) an implicit Wildcard scheme * b) a relative URI - * c) a invalid URI. + * c) an invalid URI. */ if(flags & Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME) { data->scheme = wildcardW; @@ -1379,10 +1284,10 @@ static BOOL parse_password(const WCHAR **ptr, parse_data *data, DWORD flags, DWO * ex: * ftp://user:pass:word@winehq.org * - * Would yield, "user" as the username and "pass:word" as the password. + * would yield "user" as the username and "pass:word" as the password. * * 2) Windows allows any character to appear in the "userinfo" part of - * a URI, as long as it's not an authority delimeter character set. + * a URI, as long as it's not an authority delimiter character set. */ static void parse_userinfo(const WCHAR **ptr, parse_data *data, DWORD flags) { const WCHAR *start = *ptr; @@ -1446,7 +1351,7 @@ static BOOL parse_port(const WCHAR **ptr, parse_data *data, DWORD flags) { port = port*10 + (**ptr-'0'); - if(port > USHORT_MAX) { + if(port > USHRT_MAX) { *ptr = data->port; data->port = NULL; return FALSE; @@ -1467,7 +1372,7 @@ static BOOL parse_port(const WCHAR **ptr, parse_data *data, DWORD flags) { /* Attempts to parse a IPv4 address from the URI. * * NOTES: - * Window's normalizes IPv4 addresses, This means there's three + * Windows normalizes IPv4 addresses, This means there are three * possibilities for the URI to contain an IPv4 address. * 1) A well formed address (ex. 192.2.2.2). * 2) A partially formed address. For example "192.0" would @@ -1493,6 +1398,9 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) data->has_implicit_ip = TRUE; } + data->host_len = *ptr - data->host; + data->host_type = Uri_HOST_IPV4; + /* Check if what we found is the only part of the host name (if it isn't * we don't have an IPv4 address). */ @@ -1504,16 +1412,13 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) return FALSE; } } else if(!is_auth_delim(**ptr, !is_unknown)) { - /* Found more data which belongs the host, so this isn't an IPv4. */ + /* Found more data which belongs to the host, so this isn't an IPv4. */ *ptr = data->host; data->host = NULL; data->has_implicit_ip = FALSE; return FALSE; } - data->host_len = *ptr - data->host; - data->host_type = Uri_HOST_IPV4; - TRACE("(%p %p %x): IPv4 address found. host=%s host_len=%d host_type=%d\n", ptr, data, flags, debugstr_wn(data->host, data->host_len), data->host_len, data->host_type); @@ -1535,8 +1440,8 @@ static BOOL parse_ipv4address(const WCHAR **ptr, parse_data *data, DWORD flags) * Windows doesn't like host names which start with '[' and end with ']' * and don't contain a valid IP literal address in between them. * - * On Windows if an '[' is encountered in the host name the ':' no longer - * counts as a delimiter until you reach the next ']' or an "authority delimeter". + * On Windows if a '[' is encountered in the host name the ':' no longer + * counts as a delimiter until you reach the next ']' or an "authority delimiter". * * A reg-name CAN be empty. */ @@ -1557,7 +1462,7 @@ static BOOL parse_reg_name(const WCHAR **ptr, parse_data *data, DWORD flags, DWO * path can also have a '|' instead of a ':' after the drive letter. */ if(is_drive_path(*ptr)) { - /* Regular old drive paths don't have a host type (or host name). */ + /* Regular old drive paths have no host type (or host name). */ data->host_type = Uri_HOST_UNKNOWN; data->host = *ptr; data->host_len = 0; @@ -1589,7 +1494,7 @@ static BOOL parse_reg_name(const WCHAR **ptr, parse_data *data, DWORD flags, DWO return FALSE; } else /* Windows gives up on trying to parse a port when it - * encounters 1 invalid port. + * encounters an invalid port. */ ignore_col = TRUE; } else { @@ -1781,7 +1686,7 @@ static BOOL parse_ipv6address(const WCHAR **ptr, parse_data *data, DWORD flags) if(ip.elision_size == 2) { /* For some reason on Windows if an elision that represents - * only 1 h16 component is encountered at the very begin or + * only one h16 component is encountered at the very begin or * end of an IPv6 address, Windows does not consider it a * valid IPv6 address. * @@ -1938,10 +1843,7 @@ static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD f const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; if(is_path_delim(**ptr)) { - if(data->scheme_type == URL_SCHEME_WILDCARD) { - /* Wildcard schemes don't get a '/' attached if their path is - * empty. - */ + if(data->scheme_type == URL_SCHEME_WILDCARD && !data->must_have_path) { data->path = NULL; data->path_len = 0; } else if(!(flags & Uri_CREATE_NO_CANONICALIZE)) { @@ -2002,7 +1904,7 @@ static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD f return TRUE; } -/* Parses the path of a opaque URI (much less strict then the parser +/* Parses the path of an opaque URI (much less strict then the parser * for a hierarchical URI). * * NOTE: @@ -2044,7 +1946,7 @@ static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) /* Determines how the URI should be parsed after the scheme information. * - * If the scheme is followed, by "//" then, it is treated as an hierarchical URI + * If the scheme is followed by "//", then it is treated as a hierarchical URI * which then the authority and path information will be parsed out. Otherwise, the * URI will be treated as an opaque URI which the authority information is not parsed * out. @@ -2062,12 +1964,23 @@ static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) * NOTES: * If the URI is of an unknown scheme type and has a "//" following the scheme then it * is treated as a hierarchical URI, but, if the CREATE_NO_CRACK_UNKNOWN_SCHEMES flag is - * set then it is considered an opaque URI reguardless of what follows the scheme information + * set then it is considered an opaque URI regardless of what follows the scheme information * (per MSDN documentation). */ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { const WCHAR *start = *ptr; + data->must_have_path = FALSE; + + /* For javascript: URIs, simply set everything as a path */ + if(data->scheme_type == URL_SCHEME_JAVASCRIPT) { + data->path = *ptr; + data->path_len = strlenW(*ptr); + data->is_opaque = TRUE; + *ptr += data->path_len; + return TRUE; + } + /* Checks if the authority information needs to be parsed. */ if(is_hierarchical_uri(ptr, data)) { /* Only treat it as a hierarchical URI if the scheme_type is known or @@ -2078,13 +1991,20 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { TRACE("(%p %p %x): Treating URI as an hierarchical URI.\n", ptr, data, flags); data->is_opaque = FALSE; + if(data->scheme_type == URL_SCHEME_WILDCARD && !data->has_implicit_scheme) { + if(**ptr == '/' && *(*ptr+1) == '/') { + data->must_have_path = TRUE; + *ptr += 2; + } + } + /* TODO: Handle hierarchical URI's, parse authority then parse the path. */ if(!parse_authority(ptr, data, flags)) return FALSE; return parse_path_hierarchical(ptr, data, flags); } else - /* Reset ptr to it's starting position so opaque path parsing + /* Reset ptr to its starting position so opaque path parsing * begins at the correct location. */ *ptr = start; @@ -2107,8 +2027,8 @@ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { * * NOTES: * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded - * data is allowed appear in the query string. For unknown scheme types - * invalid percent encoded data is allowed to appear reguardless. + * data is allowed to appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear regardless. */ static BOOL parse_query(const WCHAR **ptr, parse_data *data, DWORD flags) { const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; @@ -2146,8 +2066,8 @@ static BOOL parse_query(const WCHAR **ptr, parse_data *data, DWORD flags) { * * NOTES: * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded - * data is allowed appear in the query string. For unknown scheme types - * invalid percent encoded data is allowed to appear reguardless. + * data is allowed to appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear regardless. */ static BOOL parse_fragment(const WCHAR **ptr, parse_data *data, DWORD flags) { const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; @@ -2224,7 +2144,7 @@ static BOOL canonicalize_username(const parse_data *data, Uri *uri, DWORD flags, if(*ptr == '%') { /* Only decode % encoded values for known scheme types. */ if(data->scheme_type != URL_SCHEME_UNKNOWN) { - /* See if the value really needs decoded. */ + /* See if the value really needs decoding. */ WCHAR val = decode_pct_val(ptr); if(is_unreserved(val)) { if(!computeOnly) @@ -2282,7 +2202,7 @@ static BOOL canonicalize_password(const parse_data *data, Uri *uri, DWORD flags, if(*ptr == '%') { /* Only decode % encoded values for known scheme types. */ if(data->scheme_type != URL_SCHEME_UNKNOWN) { - /* See if the value really needs decoded. */ + /* See if the value really needs decoding. */ WCHAR val = decode_pct_val(ptr); if(is_unreserved(val)) { if(!computeOnly) @@ -2358,7 +2278,7 @@ static BOOL canonicalize_userinfo(const parse_data *data, Uri *uri, DWORD flags, * Things that happen: * 1) If Uri_CREATE_NO_CANONICALIZE flag is not set, then the reg_name is * lower cased. Unless it's an unknown scheme type, which case it's - * no lower cased reguardless. + * no lower cased regardless. * * 2) Unreserved % encoded characters are decoded for known * scheme types. @@ -2404,7 +2324,7 @@ static BOOL canonicalize_reg_name(const parse_data *data, Uri *uri, if(*ptr == '%' && known_scheme) { WCHAR val = decode_pct_val(ptr); if(is_unreserved(val)) { - /* If NO_CANONICALZE is not set, then windows lower cases the + /* If NO_CANONICALIZE is not set, then windows lower cases the * decoded value. */ if(!(flags & Uri_CREATE_NO_CANONICALIZE) && isupperW(val)) { @@ -2474,8 +2394,8 @@ static BOOL canonicalize_implicit_ipv4address(const parse_data *data, Uri *uri, uri->host_start = uri->canon_len; TRACE("%u\n", data->implicit_ipv4); - /* For unknown scheme types Window's doesn't convert - * the value into an IP address, but, it still considers + /* For unknown scheme types Windows doesn't convert + * the value into an IP address, but it still considers * it an IPv4 address. */ if(data->scheme_type == URL_SCHEME_UNKNOWN) { @@ -2506,7 +2426,7 @@ static BOOL canonicalize_implicit_ipv4address(const parse_data *data, Uri *uri, * If the parse_data represents a URI that has an implicit IPv4 address * (ex. http://256/, this function will convert 256 into 0.0.1.0). If * the implicit IP address exceeds the value of UINT_MAX (maximum value - * for an IPv4 address) it's canonicalized as if were a reg-name. + * for an IPv4 address) it's canonicalized as if it were a reg-name. * * If the parse_data contains a partial or full IPv4 address it normalizes it. * A partial IPv4 address is something like "192.0" and would be normalized to @@ -2514,7 +2434,7 @@ static BOOL canonicalize_implicit_ipv4address(const parse_data *data, Uri *uri, * be normalized to "192.2.1.3". * * NOTES: - * Window's ONLY normalizes IPv4 address for known scheme types (one that isn't + * Windows ONLY normalizes IPv4 address for known scheme types (one that isn't * URL_SCHEME_UNKNOWN). For unknown scheme types, it simply copies the data from * the original URI into the canonicalized URI, but, it still recognizes URI's * host type as HOST_IPV4. @@ -2596,11 +2516,11 @@ static BOOL canonicalize_ipv4address(const parse_data *data, Uri *uri, DWORD fla /* Attempts to canonicalize the IPv6 address of the URI. * * Multiple things happen during the canonicalization of an IPv6 address: - * 1) Any leading zero's in an h16 component are removed. + * 1) Any leading zero's in a h16 component are removed. * Ex: [0001:0022::] -> [1:22::] * * 2) The longest sequence of zero h16 components are compressed - * into a "::" (elision). If there's a tie, the first is choosen. + * into a "::" (elision). If there's a tie, the first is chosen. * * Ex: [0:0:0:0:1:6:7:8] -> [::1:6:7:8] * [0:0:0:0:1:2::] -> [::1:2:0:0] @@ -2610,7 +2530,7 @@ static BOOL canonicalize_ipv4address(const parse_data *data, Uri *uri, DWORD fla * also normalized. * Ex: [::001.002.022.000] -> [::1.2.22.0] * - * 4) If an elision is present, but, only represents 1 h16 component + * 4) If an elision is present, but, only represents one h16 component * it's expanded. * * Ex: [1::2:3:4:5:6:7] -> [1:0:2:3:4:5:6:7] @@ -2886,7 +2806,7 @@ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags * Things that happen: * 1). Forbidden characters are percent encoded, unless the NO_ENCODE_FORBIDDEN * flag is set or it's a file URI. Forbidden characters are always encoded - * for file schemes reguardless and forbidden characters are never encoded + * for file schemes regardless and forbidden characters are never encoded * for unknown scheme types. * * 2). For known scheme types '\\' are changed to '/'. @@ -2910,142 +2830,131 @@ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags * file:///c:/test%20test -> file:///c:/test%20test * file:///c:/test%test -> file:///c:/test%25test */ -static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri, - DWORD flags, BOOL computeOnly) { +static DWORD canonicalize_path_hierarchical(const WCHAR *path, DWORD path_len, URL_SCHEME scheme_type, BOOL has_host, DWORD flags, + WCHAR *ret_path) { + const BOOL known_scheme = scheme_type != URL_SCHEME_UNKNOWN; + const BOOL is_file = scheme_type == URL_SCHEME_FILE; + const BOOL is_res = scheme_type == URL_SCHEME_RES; const WCHAR *ptr; - const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; - const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; - const BOOL is_res = data->scheme_type == URL_SCHEME_RES; - BOOL escape_pct = FALSE; + DWORD len = 0; - if(!data->path) { - uri->path_start = -1; - uri->path_len = 0; - return TRUE; - } + if(!path) + return 0; - uri->path_start = uri->canon_len; - ptr = data->path; + ptr = path; - if(is_file && uri->host_start == -1) { + if(is_file && !has_host) { /* Check if a '/' needs to be appended for the file scheme. */ - if(data->path_len > 1 && is_drive_path(ptr) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - uri->canon_len++; + if(path_len > 1 && is_drive_path(ptr) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + if(ret_path) + ret_path[len] = '/'; + len++; escape_pct = TRUE; } else if(*ptr == '/') { if(!(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { /* Copy the extra '/' over. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '/'; + len++; } ++ptr; } if(is_drive_path(ptr)) { - if(!computeOnly) { - uri->canon_uri[uri->canon_len] = *ptr; - /* If theres a '|' after the drive letter, convert it to a ':'. */ - uri->canon_uri[uri->canon_len+1] = ':'; + if(ret_path) { + ret_path[len] = *ptr; + /* If there's a '|' after the drive letter, convert it to a ':'. */ + ret_path[len+1] = ':'; } ptr += 2; - uri->canon_len += 2; + len += 2; } } - if(!is_file && *(data->path) && *(data->path) != '/') { + if(!is_file && *path && *path != '/') { /* Prepend a '/' to the path if it doesn't have one. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '/'; + len++; } - for(; ptr < data->path+data->path_len; ++ptr) { + for(; ptr < path+path_len; ++ptr) { BOOL do_default_action = TRUE; if(*ptr == '%' && !is_res) { const WCHAR *tmp = ptr; WCHAR val; - /* Check if the % represents a valid encoded char, or if it needs encoded. */ + /* Check if the % represents a valid encoded char, or if it needs encoding. */ BOOL force_encode = !check_pct_encoded(&tmp) && is_file && !(flags&Uri_CREATE_FILE_USE_DOS_PATH); val = decode_pct_val(ptr); if(force_encode || escape_pct) { /* Escape the percent sign in the file URI. */ - if(!computeOnly) - pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); - uri->canon_len += 3; + if(ret_path) + pct_encode_val(*ptr, ret_path+len); + len += 3; do_default_action = FALSE; } else if((is_unreserved(val) && known_scheme) || (is_file && (is_unreserved(val) || is_reserved(val) || (val && flags&Uri_CREATE_FILE_USE_DOS_PATH && !is_forbidden_dos_path_char(val))))) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = val; - ++uri->canon_len; + if(ret_path) + ret_path[len] = val; + len++; ptr += 2; continue; } } else if(*ptr == '/' && is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) { /* Convert the '/' back to a '\\'. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '\\'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '\\'; + len++; do_default_action = FALSE; } else if(*ptr == '\\' && known_scheme) { if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) { /* Convert '\\' into a '/'. */ - if(!computeOnly) - uri->canon_uri[uri->canon_len] = '/'; - ++uri->canon_len; + if(ret_path) + ret_path[len] = '/'; + len++; do_default_action = FALSE; } } else if(known_scheme && !is_res && !is_unreserved(*ptr) && !is_reserved(*ptr) && (!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) || is_file)) { if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) { /* Escape the forbidden character. */ - if(!computeOnly) - pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); - uri->canon_len += 3; + if(ret_path) + pct_encode_val(*ptr, ret_path+len); + len += 3; do_default_action = FALSE; } } if(do_default_action) { - if(!computeOnly) - uri->canon_uri[uri->canon_len] = *ptr; - ++uri->canon_len; + if(ret_path) + ret_path[len] = *ptr; + len++; } } - uri->path_len = uri->canon_len - uri->path_start; - /* Removing the dot segments only happens when it's not in * computeOnly mode and it's not a wildcard scheme. File schemes * with USE_DOS_PATH set don't get dot segments removed. */ if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH)) && - data->scheme_type != URL_SCHEME_WILDCARD) { - if(!(flags & Uri_CREATE_NO_CANONICALIZE) && !computeOnly) { + scheme_type != URL_SCHEME_WILDCARD) { + if(!(flags & Uri_CREATE_NO_CANONICALIZE) && ret_path) { /* Remove the dot segments (if any) and reset everything to the new * correct length. */ - DWORD new_len = remove_dot_segments(uri->canon_uri+uri->path_start, uri->path_len); - uri->canon_len -= uri->path_len-new_len; - uri->path_len = new_len; + len = remove_dot_segments(ret_path, len); } } - if(!computeOnly) - TRACE("Canonicalized path %s len=%d\n", - debugstr_wn(uri->canon_uri+uri->path_start, uri->path_len), - uri->path_len); - - return TRUE; + if(ret_path) + TRACE("Canonicalized path %s len=%d\n", debugstr_wn(ret_path, len), len); + return len; } /* Attempts to canonicalize the path for an opaque URI. @@ -3070,6 +2979,7 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla const WCHAR *ptr; const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + const BOOL is_mk = data->scheme_type == URL_SCHEME_MK; if(!data->path) { uri->path_start = -1; @@ -3079,6 +2989,21 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla uri->path_start = uri->canon_len; + if(is_mk){ + /* hijack this flag for SCHEME_MK to tell the function when to start + * converting slashes */ + flags |= Uri_CREATE_FILE_USE_DOS_PATH; + } + + /* For javascript: URIs, simply copy path part without any canonicalization */ + if(data->scheme_type == URL_SCHEME_JAVASCRIPT) { + if(!computeOnly) + memcpy(uri->canon_uri+uri->canon_len, data->path, data->path_len*sizeof(WCHAR)); + uri->path_len = data->path_len; + uri->canon_len += data->path_len; + return TRUE; + } + /* Windows doesn't allow a "//" to appear after the scheme * of a URI, if it's an opaque URI. */ @@ -3112,13 +3037,15 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla ++uri->canon_len; do_default_action = FALSE; } else if(*ptr == '\\') { - if(is_file && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { + if((data->is_relative || is_mk || is_file) && !(flags & Uri_CREATE_FILE_USE_DOS_PATH)) { /* Convert to a '/'. */ if(!computeOnly) uri->canon_uri[uri->canon_len] = '/'; ++uri->canon_len; do_default_action = FALSE; } + } else if(is_mk && *ptr == ':' && ptr + 1 < data->path + data->path_len && *(ptr + 1) == ':') { + flags &= ~Uri_CREATE_FILE_USE_DOS_PATH; } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) && !(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { if(!(is_file && (flags & Uri_CREATE_FILE_USE_DOS_PATH))) { @@ -3136,7 +3063,7 @@ static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD fla } } - if(data->scheme_type == URL_SCHEME_MK && !computeOnly && !(flags & Uri_CREATE_NO_CANONICALIZE)) { + if(is_mk && !computeOnly && !(flags & Uri_CREATE_NO_CANONICALIZE)) { DWORD new_len = remove_dot_segments(uri->canon_uri + uri->path_start, uri->canon_len - uri->path_start); uri->canon_len = uri->path_start + new_len; @@ -3166,6 +3093,9 @@ static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, */ if((data->is_relative && (data->host || data->has_port)) || (!data->is_relative && data->scheme_type != URL_SCHEME_WILDCARD)) { + if(data->scheme_type == URL_SCHEME_WILDCARD) + FIXME("Here\n"); + if(!computeOnly) { INT pos = uri->canon_len; @@ -3182,8 +3112,13 @@ static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, if(!canonicalize_path_opaque(data, uri, flags, computeOnly)) return FALSE; } else { - if(!canonicalize_path_hierarchical(data, uri, flags, computeOnly)) - return FALSE; + if(!computeOnly) + uri->path_start = uri->canon_len; + uri->path_len = canonicalize_path_hierarchical(data->path, data->path_len, data->scheme_type, data->host_len != 0, + flags, computeOnly ? NULL : uri->canon_uri+uri->canon_len); + uri->canon_len += uri->path_len; + if(!computeOnly && !uri->path_len) + uri->path_start = -1; } } else { /* Opaque URI's don't have an authority. */ @@ -3367,7 +3302,7 @@ static BOOL canonicalize_scheme(const parse_data *data, Uri *uri, DWORD flags, B uri->scheme_start = pos; TRACE("(%p %p %x): Canonicalized scheme=%s, len=%d.\n", data, uri, flags, - debugstr_wn(uri->canon_uri, uri->scheme_len), data->scheme_len); + debugstr_wn(uri->canon_uri+uri->scheme_start, data->scheme_len), data->scheme_len); } /* This happens in both computation modes. */ @@ -3377,7 +3312,7 @@ static BOOL canonicalize_scheme(const parse_data *data, Uri *uri, DWORD flags, B return TRUE; } -/* Compute's what the length of the URI specified by the parse_data will be +/* Computes what the length of the URI specified by the parse_data will be * after canonicalization occurs using the specified flags. * * This function will return a non-zero value indicating the length of the canonicalized @@ -3417,11 +3352,11 @@ static int compute_canonicalized_length(const parse_data *data, DWORD flags) { } /* Canonicalizes the URI data specified in the parse_data, using the given flags. If the - * canonicalization succeededs it will store all the canonicalization information + * canonicalization succeeds it will store all the canonicalization information * in the pointer to the Uri. * * To canonicalize a URI this function first computes what the length of the URI - * specified by the parse_data will be. Once this is done it will then perfom the actual + * specified by the parse_data will be. Once this is done it will then perform the actual * canonicalization of the URI. */ static HRESULT canonicalize_uri(const parse_data *data, Uri *uri, DWORD flags) { @@ -3473,7 +3408,7 @@ static HRESULT canonicalize_uri(const parse_data *data, Uri *uri, DWORD flags) { */ if(uri->canon_len < uri->canon_size) { /* This happens if the URI is hierarchical and dot - * segments were removed from it's path. + * segments were removed from its path. */ WCHAR *tmp = heap_realloc(uri->canon_uri, (uri->canon_len+1)*sizeof(WCHAR)); if(!tmp) @@ -3785,6 +3720,7 @@ static HRESULT validate_path(const UriBuilder *builder, parse_data *data, DWORD static const WCHAR nullW[] = {0}; ptr = nullW; check_len = FALSE; + expected_len = -1; } component = ptr; @@ -3798,7 +3734,7 @@ static HRESULT validate_path(const UriBuilder *builder, parse_data *data, DWORD if(!valid || (check_len && expected_len != data->path_len)) { TRACE("(%p %p %x): Invalid path component %s.\n", builder, data, flags, - debugstr_wn(component, check_len ? expected_len : -1) ); + debugstr_wn(component, expected_len) ); return INET_E_INVALID_URL; } @@ -3903,7 +3839,8 @@ static HRESULT validate_components(const UriBuilder *builder, parse_data *data, /* The URI is opaque if it doesn't have an authority component. */ if(!data->is_relative) - data->is_opaque = !data->username && !data->password && !data->host && !data->has_port; + data->is_opaque = !data->username && !data->password && !data->host && !data->has_port + && data->scheme_type != URL_SCHEME_FILE; else data->is_opaque = !data->host && !data->has_port; @@ -3924,6 +3861,150 @@ static HRESULT validate_components(const UriBuilder *builder, parse_data *data, return S_OK; } +static HRESULT compare_file_paths(const Uri *a, const Uri *b, BOOL *ret) +{ + WCHAR *canon_path_a, *canon_path_b; + DWORD len_a, len_b; + + if(!a->path_len) { + *ret = !b->path_len; + return S_OK; + } + + if(!b->path_len) { + *ret = FALSE; + return S_OK; + } + + /* Fast path */ + if(a->path_len == b->path_len && !memicmpW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) { + *ret = TRUE; + return S_OK; + } + + len_a = canonicalize_path_hierarchical(a->canon_uri+a->path_start, a->path_len, a->scheme_type, FALSE, 0, NULL); + len_b = canonicalize_path_hierarchical(b->canon_uri+b->path_start, b->path_len, b->scheme_type, FALSE, 0, NULL); + + canon_path_a = heap_alloc(len_a*sizeof(WCHAR)); + if(!canon_path_a) + return E_OUTOFMEMORY; + canon_path_b = heap_alloc(len_b*sizeof(WCHAR)); + if(!canon_path_b) { + heap_free(canon_path_a); + return E_OUTOFMEMORY; + } + + len_a = canonicalize_path_hierarchical(a->canon_uri+a->path_start, a->path_len, a->scheme_type, FALSE, 0, canon_path_a); + len_b = canonicalize_path_hierarchical(b->canon_uri+b->path_start, b->path_len, b->scheme_type, FALSE, 0, canon_path_b); + + *ret = len_a == len_b && !memicmpW(canon_path_a, canon_path_b, len_a); + + heap_free(canon_path_a); + heap_free(canon_path_b); + return S_OK; +} + +/* Checks if the two Uri's are logically equivalent. It's a simple + * comparison, since they are both of type Uri, and it can access + * the properties of each Uri directly without the need to go + * through the "IUri_Get*" interface calls. + */ +static HRESULT compare_uris(const Uri *a, const Uri *b, BOOL *ret) { + const BOOL known_scheme = a->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL are_hierarchical = a->authority_start > -1 && b->authority_start > -1; + HRESULT hres; + + *ret = FALSE; + + if(a->scheme_type != b->scheme_type) + return S_OK; + + /* Only compare the scheme names (if any) if their unknown scheme types. */ + if(!known_scheme) { + if((a->scheme_start > -1 && b->scheme_start > -1) && + (a->scheme_len == b->scheme_len)) { + /* Make sure the schemes are the same. */ + if(StrCmpNW(a->canon_uri+a->scheme_start, b->canon_uri+b->scheme_start, a->scheme_len)) + return S_OK; + } else if(a->scheme_len != b->scheme_len) + /* One of the Uri's has a scheme name, while the other doesn't. */ + return S_OK; + } + + /* If they have a userinfo component, perform case sensitive compare. */ + if((a->userinfo_start > -1 && b->userinfo_start > -1) && + (a->userinfo_len == b->userinfo_len)) { + if(StrCmpNW(a->canon_uri+a->userinfo_start, b->canon_uri+b->userinfo_start, a->userinfo_len)) + return S_OK; + } else if(a->userinfo_len != b->userinfo_len) + /* One of the Uri's had a userinfo, while the other one doesn't. */ + return S_OK; + + /* Check if they have a host name. */ + if((a->host_start > -1 && b->host_start > -1) && + (a->host_len == b->host_len)) { + /* Perform a case insensitive compare if they are a known scheme type. */ + if(known_scheme) { + if(StrCmpNIW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return S_OK; + } else if(StrCmpNW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return S_OK; + } else if(a->host_len != b->host_len) + /* One of the Uri's had a host, while the other one didn't. */ + return S_OK; + + if(a->has_port && b->has_port) { + if(a->port != b->port) + return S_OK; + } else if(a->has_port || b->has_port) + /* One had a port, while the other one didn't. */ + return S_OK; + + /* Windows is weird with how it handles paths. For example + * One URI could be "http://google.com" (after canonicalization) + * and one could be "http://google.com/" and the IsEqual function + * would still evaluate to TRUE, but, only if they are both hierarchical + * URIs. + */ + if(a->scheme_type == URL_SCHEME_FILE) { + BOOL cmp; + + hres = compare_file_paths(a, b, &cmp); + if(FAILED(hres) || !cmp) + return hres; + } else if((a->path_start > -1 && b->path_start > -1) && + (a->path_len == b->path_len)) { + if(StrCmpNW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) + return S_OK; + } else if(are_hierarchical && a->path_len == -1 && b->path_len == 0) { + if(*(a->canon_uri+a->path_start) != '/') + return S_OK; + } else if(are_hierarchical && b->path_len == 1 && a->path_len == 0) { + if(*(b->canon_uri+b->path_start) != '/') + return S_OK; + } else if(a->path_len != b->path_len) + return S_OK; + + /* Compare the query strings of the two URIs. */ + if((a->query_start > -1 && b->query_start > -1) && + (a->query_len == b->query_len)) { + if(StrCmpNW(a->canon_uri+a->query_start, b->canon_uri+b->query_start, a->query_len)) + return S_OK; + } else if(a->query_len != b->query_len) + return S_OK; + + if((a->fragment_start > -1 && b->fragment_start > -1) && + (a->fragment_len == b->fragment_len)) { + if(StrCmpNW(a->canon_uri+a->fragment_start, b->canon_uri+b->fragment_start, a->fragment_len)) + return S_OK; + } else if(a->fragment_len != b->fragment_len) + return S_OK; + + /* If we get here, the two URIs are equivalent. */ + *ret = TRUE; + return S_OK; +} + static void convert_to_dos_path(const WCHAR *path, DWORD path_len, WCHAR *output, DWORD *output_len) { @@ -4116,7 +4197,7 @@ static inline Uri* impl_from_IUri(IUri *iface) return CONTAINING_RECORD(iface, Uri, IUri_iface); } -static inline void destory_uri_obj(Uri *This) +static inline void destroy_uri_obj(Uri *This) { SysFreeString(This->raw_uri); heap_free(This->canon_uri); @@ -4134,8 +4215,14 @@ static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv) TRACE("(%p)->(IID_IUri %p)\n", This, ppv); *ppv = &This->IUri_iface; }else if(IsEqualGUID(&IID_IUriBuilderFactory, riid)) { - TRACE("(%p)->(IID_IUriBuilderFactory %p)\n", This, riid); + TRACE("(%p)->(IID_IUriBuilderFactory %p)\n", This, ppv); *ppv = &This->IUriBuilderFactory_iface; + }else if(IsEqualGUID(&IID_IPersistStream, riid)) { + TRACE("(%p)->(IID_IPersistStream %p)\n", This, ppv); + *ppv = &This->IPersistStream_iface; + }else if(IsEqualGUID(&IID_IMarshal, riid)) { + TRACE("(%p)->(IID_IMarshal %p)\n", This, ppv); + *ppv = &This->IMarshal_iface; }else if(IsEqualGUID(&IID_IUriObj, riid)) { TRACE("(%p)->(IID_IUriObj %p)\n", This, ppv); *ppv = This; @@ -4168,7 +4255,7 @@ static ULONG WINAPI Uri_Release(IUri *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) - destory_uri_obj(This); + destroy_uri_obj(This); return ref; } @@ -4177,8 +4264,10 @@ static HRESULT WINAPI Uri_GetPropertyBSTR(IUri *iface, Uri_PROPERTY uriProp, BST { Uri *This = impl_from_IUri(iface); HRESULT hres; - TRACE("(%p)->(%d %p %x)\n", This, uriProp, pbstrProperty, dwFlags); + TRACE("(%p %s)->(%d %p %x)\n", This, debugstr_w(This->canon_uri), uriProp, pbstrProperty, dwFlags); + if(!This->create_flags) + return E_UNEXPECTED; if(!pbstrProperty) return E_POINTER; @@ -4467,8 +4556,10 @@ static HRESULT WINAPI Uri_GetPropertyLength(IUri *iface, Uri_PROPERTY uriProp, D { Uri *This = impl_from_IUri(iface); HRESULT hres; - TRACE("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags); + TRACE("(%p %s)->(%d %p %x)\n", This, debugstr_w(This->canon_uri), uriProp, pcchProperty, dwFlags); + if(!This->create_flags) + return E_UNEXPECTED; if(!pcchProperty) return E_INVALIDARG; @@ -4602,8 +4693,10 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW Uri *This = impl_from_IUri(iface); HRESULT hres; - TRACE("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags); + TRACE("(%p %s)->(%d %p %x)\n", This, debugstr_w(This->canon_uri), uriProp, pcchProperty, dwFlags); + if(!This->create_flags) + return E_UNEXPECTED; if(!pcchProperty) return E_INVALIDARG; @@ -4652,7 +4745,8 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW static HRESULT WINAPI Uri_HasProperty(IUri *iface, Uri_PROPERTY uriProp, BOOL *pfHasProperty) { Uri *This = impl_from_IUri(iface); - TRACE("(%p)->(%d %p)\n", This, uriProp, pfHasProperty); + + TRACE("(%p %s)->(%d %p)\n", This, debugstr_w(This->canon_uri), uriProp, pfHasProperty); if(!pfHasProperty) return E_INVALIDARG; @@ -4843,8 +4937,10 @@ static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone) static HRESULT WINAPI Uri_GetProperties(IUri *iface, DWORD *pdwProperties) { Uri *This = impl_from_IUri(iface); - TRACE("(%p)->(%p)\n", This, pdwProperties); + TRACE("(%p %s)->(%p)\n", This, debugstr_w(This->canon_uri), pdwProperties); + if(!This->create_flags) + return E_UNEXPECTED; if(!pdwProperties) return E_INVALIDARG; @@ -4893,8 +4989,10 @@ static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) Uri *This = impl_from_IUri(iface); Uri *other; - TRACE("(%p)->(%p %p)\n", This, pUri, pfEqual); + TRACE("(%p %s)->(%p %p)\n", This, debugstr_w(This->canon_uri), pUri, pfEqual); + if(!This->create_flags) + return E_UNEXPECTED; if(!pfEqual) return E_POINTER; @@ -4906,15 +5004,13 @@ static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) } /* Try to convert it to a Uri (allows for a more simple comparison). */ - if((other = get_uri_obj(pUri))) - *pfEqual = are_equal_simple(This, other); - else { - /* Do it the hard way. */ + if(!(other = get_uri_obj(pUri))) { FIXME("(%p)->(%p %p) No support for unknown IUri's yet.\n", iface, pUri, pfEqual); return E_NOTIMPL; } - return S_OK; + TRACE("comparing to %s\n", debugstr_w(other->canon_uri)); + return compare_uris(This, other, pfEqual); } static const IUriVtbl UriVtbl = { @@ -4956,47 +5052,19 @@ static inline Uri* impl_from_IUriBuilderFactory(IUriBuilderFactory *iface) static HRESULT WINAPI UriBuilderFactory_QueryInterface(IUriBuilderFactory *iface, REFIID riid, void **ppv) { Uri *This = impl_from_IUriBuilderFactory(iface); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IUriBuilderFactory_iface; - }else if(IsEqualGUID(&IID_IUriBuilderFactory, riid)) { - TRACE("(%p)->(IID_IUriBuilderFactory %p)\n", This, ppv); - *ppv = &This->IUriBuilderFactory_iface; - }else if(IsEqualGUID(&IID_IUri, riid)) { - TRACE("(%p)->(IID_IUri %p)\n", This, ppv); - *ppv = &This->IUri_iface; - }else { - TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return IUri_QueryInterface(&This->IUri_iface, riid, ppv); } static ULONG WINAPI UriBuilderFactory_AddRef(IUriBuilderFactory *iface) { Uri *This = impl_from_IUriBuilderFactory(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - return ref; + return IUri_AddRef(&This->IUri_iface); } static ULONG WINAPI UriBuilderFactory_Release(IUriBuilderFactory *iface) { Uri *This = impl_from_IUriBuilderFactory(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - if(!ref) - destory_uri_obj(This); - - return ref; + return IUri_Release(&This->IUri_iface); } static HRESULT WINAPI UriBuilderFactory_CreateIUriBuilder(IUriBuilderFactory *iface, @@ -5045,15 +5113,553 @@ static const IUriBuilderFactoryVtbl UriBuilderFactoryVtbl = { UriBuilderFactory_CreateInitializedIUriBuilder }; -static Uri* create_uri_obj(void) { - Uri *ret = heap_alloc_zero(sizeof(Uri)); - if(ret) { - ret->IUri_iface.lpVtbl = &UriVtbl; - ret->IUriBuilderFactory_iface.lpVtbl = &UriBuilderFactoryVtbl; - ret->ref = 1; +static inline Uri* impl_from_IPersistStream(IPersistStream *iface) +{ + return CONTAINING_RECORD(iface, Uri, IPersistStream_iface); +} + +static HRESULT WINAPI PersistStream_QueryInterface(IPersistStream *iface, REFIID riid, void **ppvObject) +{ + Uri *This = impl_from_IPersistStream(iface); + return IUri_QueryInterface(&This->IUri_iface, riid, ppvObject); +} + +static ULONG WINAPI PersistStream_AddRef(IPersistStream *iface) +{ + Uri *This = impl_from_IPersistStream(iface); + return IUri_AddRef(&This->IUri_iface); +} + +static ULONG WINAPI PersistStream_Release(IPersistStream *iface) +{ + Uri *This = impl_from_IPersistStream(iface); + return IUri_Release(&This->IUri_iface); +} + +static HRESULT WINAPI PersistStream_GetClassID(IPersistStream *iface, CLSID *pClassID) +{ + Uri *This = impl_from_IPersistStream(iface); + TRACE("(%p)->(%p)\n", This, pClassID); + + if(!pClassID) + return E_INVALIDARG; + + *pClassID = CLSID_CUri; + return S_OK; +} + +static HRESULT WINAPI PersistStream_IsDirty(IPersistStream *iface) +{ + Uri *This = impl_from_IPersistStream(iface); + TRACE("(%p)\n", This); + return S_FALSE; +} + +struct persist_uri { + DWORD size; + DWORD unk1[2]; + DWORD create_flags; + DWORD unk2[3]; + DWORD fields_no; + BYTE data[1]; +}; + +static HRESULT WINAPI PersistStream_Load(IPersistStream *iface, IStream *pStm) +{ + Uri *This = impl_from_IPersistStream(iface); + struct persist_uri *data; + parse_data parse; + DWORD size; + HRESULT hr; + + TRACE("(%p)->(%p)\n", This, pStm); + + if(This->create_flags) + return E_UNEXPECTED; + if(!pStm) + return E_INVALIDARG; + + hr = IStream_Read(pStm, &size, sizeof(DWORD), NULL); + if(FAILED(hr)) + return hr; + data = heap_alloc(size); + if(!data) + return E_OUTOFMEMORY; + hr = IStream_Read(pStm, data->unk1, size-sizeof(DWORD)-2, NULL); + if(FAILED(hr)) { + heap_free(data); + return hr; } - return ret; + if(size < sizeof(struct persist_uri)) { + heap_free(data); + return S_OK; + } + + if(*(DWORD*)data->data != Uri_PROPERTY_RAW_URI) { + heap_free(data); + ERR("Can't find raw_uri\n"); + return E_UNEXPECTED; + } + + This->raw_uri = SysAllocString((WCHAR*)(data->data+sizeof(DWORD)*2)); + if(!This->raw_uri) { + heap_free(data); + return E_OUTOFMEMORY; + } + This->create_flags = data->create_flags; + heap_free(data); + TRACE("%x %s\n", This->create_flags, debugstr_w(This->raw_uri)); + + memset(&parse, 0, sizeof(parse_data)); + parse.uri = This->raw_uri; + if(!parse_uri(&parse, This->create_flags)) { + SysFreeString(This->raw_uri); + This->create_flags = 0; + return E_UNEXPECTED; + } + + hr = canonicalize_uri(&parse, This, This->create_flags); + if(FAILED(hr)) { + SysFreeString(This->raw_uri); + This->create_flags = 0; + return hr; + } + + return S_OK; +} + +static inline BYTE* persist_stream_add_strprop(Uri *This, BYTE *p, DWORD type, DWORD len, WCHAR *data) +{ + len *= sizeof(WCHAR); + *(DWORD*)p = type; + p += sizeof(DWORD); + *(DWORD*)p = len+sizeof(WCHAR); + p += sizeof(DWORD); + memcpy(p, data, len); + p += len; + *(WCHAR*)p = 0; + return p+sizeof(WCHAR); +} + +static inline void persist_stream_save(Uri *This, IStream *pStm, BOOL marshal, struct persist_uri *data) +{ + BYTE *p = NULL; + + data->create_flags = This->create_flags; + + if(This->create_flags) { + data->fields_no = 1; + p = persist_stream_add_strprop(This, data->data, Uri_PROPERTY_RAW_URI, + SysStringLen(This->raw_uri), This->raw_uri); + } + if(This->scheme_type!=URL_SCHEME_HTTP && This->scheme_type!=URL_SCHEME_HTTPS + && This->scheme_type!=URL_SCHEME_FTP) + return; + + if(This->fragment_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_FRAGMENT, + This->fragment_len, This->canon_uri+This->fragment_start); + } + + if(This->host_len) { + data->fields_no++; + if(This->host_type == Uri_HOST_IPV6) + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_HOST, + This->host_len-2, This->canon_uri+This->host_start+1); + else + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_HOST, + This->host_len, This->canon_uri+This->host_start); + } + + if(This->userinfo_split > -1) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_PASSWORD, + This->userinfo_len-This->userinfo_split-1, + This->canon_uri+This->userinfo_start+This->userinfo_split+1); + } + + if(This->path_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_PATH, + This->path_len, This->canon_uri+This->path_start); + } else if(marshal) { + WCHAR no_path = '/'; + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_PATH, 1, &no_path); + } + + if(This->has_port) { + data->fields_no++; + *(DWORD*)p = Uri_PROPERTY_PORT; + p += sizeof(DWORD); + *(DWORD*)p = sizeof(DWORD); + p += sizeof(DWORD); + *(DWORD*)p = This->port; + p += sizeof(DWORD); + } + + if(This->query_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_QUERY, + This->query_len, This->canon_uri+This->query_start); + } + + if(This->scheme_len) { + data->fields_no++; + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_SCHEME_NAME, + This->scheme_len, This->canon_uri+This->scheme_start); + } + + if(This->userinfo_start>-1 && This->userinfo_split!=0) { + data->fields_no++; + if(This->userinfo_split > -1) + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_USER_NAME, + This->userinfo_split, This->canon_uri+This->userinfo_start); + else + p = persist_stream_add_strprop(This, p, Uri_PROPERTY_USER_NAME, + This->userinfo_len, This->canon_uri+This->userinfo_start); + } +} + +static HRESULT WINAPI PersistStream_Save(IPersistStream *iface, IStream *pStm, BOOL fClearDirty) +{ + Uri *This = impl_from_IPersistStream(iface); + struct persist_uri *data; + ULARGE_INTEGER size; + HRESULT hres; + + TRACE("(%p)->(%p %x)\n", This, pStm, fClearDirty); + + if(!pStm) + return E_INVALIDARG; + + hres = IPersistStream_GetSizeMax(&This->IPersistStream_iface, &size); + if(FAILED(hres)) + return hres; + + data = heap_alloc_zero(size.u.LowPart); + if(!data) + return E_OUTOFMEMORY; + data->size = size.u.LowPart; + persist_stream_save(This, pStm, FALSE, data); + + hres = IStream_Write(pStm, data, data->size-2, NULL); + heap_free(data); + return hres; +} + +static HRESULT WINAPI PersistStream_GetSizeMax(IPersistStream *iface, ULARGE_INTEGER *pcbSize) +{ + Uri *This = impl_from_IPersistStream(iface); + TRACE("(%p)->(%p)\n", This, pcbSize); + + if(!pcbSize) + return E_INVALIDARG; + + pcbSize->u.LowPart = 2+sizeof(struct persist_uri); + pcbSize->u.HighPart = 0; + if(This->create_flags) + pcbSize->u.LowPart += (SysStringLen(This->raw_uri)+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + else /* there's no place for fields no */ + pcbSize->u.LowPart -= sizeof(DWORD); + if(This->scheme_type!=URL_SCHEME_HTTP && This->scheme_type!=URL_SCHEME_HTTPS + && This->scheme_type!=URL_SCHEME_FTP) + return S_OK; + + if(This->fragment_len) + pcbSize->u.LowPart += (This->fragment_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->host_len) { + if(This->host_type == Uri_HOST_IPV6) + pcbSize->u.LowPart += (This->host_len-1)*sizeof(WCHAR) + 2*sizeof(DWORD); + else + pcbSize->u.LowPart += (This->host_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + } + if(This->userinfo_split > -1) + pcbSize->u.LowPart += (This->userinfo_len-This->userinfo_split)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->path_len) + pcbSize->u.LowPart += (This->path_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->has_port) + pcbSize->u.LowPart += 3*sizeof(DWORD); + if(This->query_len) + pcbSize->u.LowPart += (This->query_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->scheme_len) + pcbSize->u.LowPart += (This->scheme_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + if(This->userinfo_start>-1 && This->userinfo_split!=0) { + if(This->userinfo_split > -1) + pcbSize->u.LowPart += (This->userinfo_split+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + else + pcbSize->u.LowPart += (This->userinfo_len+1)*sizeof(WCHAR) + 2*sizeof(DWORD); + } + return S_OK; +} + +static const IPersistStreamVtbl PersistStreamVtbl = { + PersistStream_QueryInterface, + PersistStream_AddRef, + PersistStream_Release, + PersistStream_GetClassID, + PersistStream_IsDirty, + PersistStream_Load, + PersistStream_Save, + PersistStream_GetSizeMax +}; + +static inline Uri* impl_from_IMarshal(IMarshal *iface) +{ + return CONTAINING_RECORD(iface, Uri, IMarshal_iface); +} + +static HRESULT WINAPI Marshal_QueryInterface(IMarshal *iface, REFIID riid, void **ppvObject) +{ + Uri *This = impl_from_IMarshal(iface); + return IUri_QueryInterface(&This->IUri_iface, riid, ppvObject); +} + +static ULONG WINAPI Marshal_AddRef(IMarshal *iface) +{ + Uri *This = impl_from_IMarshal(iface); + return IUri_AddRef(&This->IUri_iface); +} + +static ULONG WINAPI Marshal_Release(IMarshal *iface) +{ + Uri *This = impl_from_IMarshal(iface); + return IUri_Release(&This->IUri_iface); +} + +static HRESULT WINAPI Marshal_GetUnmarshalClass(IMarshal *iface, REFIID riid, void *pv, + DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *pCid) +{ + Uri *This = impl_from_IMarshal(iface); + TRACE("(%p)->(%s %p %x %p %x %p)\n", This, debugstr_guid(riid), pv, + dwDestContext, pvDestContext, mshlflags, pCid); + + if(!pCid || (dwDestContext!=MSHCTX_LOCAL && dwDestContext!=MSHCTX_NOSHAREDMEM + && dwDestContext!=MSHCTX_INPROC)) + return E_INVALIDARG; + + *pCid = CLSID_CUri; + return S_OK; +} + +struct inproc_marshal_uri { + DWORD size; + DWORD mshlflags; + DWORD unk[4]; /* process identifier? */ + Uri *uri; +}; + +static HRESULT WINAPI Marshal_GetMarshalSizeMax(IMarshal *iface, REFIID riid, void *pv, + DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *pSize) +{ + Uri *This = impl_from_IMarshal(iface); + ULARGE_INTEGER size; + HRESULT hres; + TRACE("(%p)->(%s %p %x %p %x %p)\n", This, debugstr_guid(riid), pv, + dwDestContext, pvDestContext, mshlflags, pSize); + + if(!pSize || (dwDestContext!=MSHCTX_LOCAL && dwDestContext!=MSHCTX_NOSHAREDMEM + && dwDestContext!=MSHCTX_INPROC)) + return E_INVALIDARG; + + if(dwDestContext == MSHCTX_INPROC) { + *pSize = sizeof(struct inproc_marshal_uri); + return S_OK; + } + + hres = IPersistStream_GetSizeMax(&This->IPersistStream_iface, &size); + if(FAILED(hres)) + return hres; + if(!This->path_len && (This->scheme_type==URL_SCHEME_HTTP + || This->scheme_type==URL_SCHEME_HTTPS + || This->scheme_type==URL_SCHEME_FTP)) + size.u.LowPart += 3*sizeof(DWORD); + *pSize = size.u.LowPart+2*sizeof(DWORD); + return S_OK; +} + +static HRESULT WINAPI Marshal_MarshalInterface(IMarshal *iface, IStream *pStm, REFIID riid, + void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags) +{ + Uri *This = impl_from_IMarshal(iface); + DWORD *data; + DWORD size; + HRESULT hres; + + TRACE("(%p)->(%p %s %p %x %p %x)\n", This, pStm, debugstr_guid(riid), pv, + dwDestContext, pvDestContext, mshlflags); + + if(!pStm || mshlflags!=MSHLFLAGS_NORMAL || (dwDestContext!=MSHCTX_LOCAL + && dwDestContext!=MSHCTX_NOSHAREDMEM && dwDestContext!=MSHCTX_INPROC)) + return E_INVALIDARG; + + if(dwDestContext == MSHCTX_INPROC) { + struct inproc_marshal_uri data; + + data.size = sizeof(data); + data.mshlflags = MSHCTX_INPROC; + data.unk[0] = 0; + data.unk[1] = 0; + data.unk[2] = 0; + data.unk[3] = 0; + data.uri = This; + + hres = IStream_Write(pStm, &data, data.size, NULL); + if(FAILED(hres)) + return hres; + + IUri_AddRef(&This->IUri_iface); + return S_OK; + } + + hres = IMarshal_GetMarshalSizeMax(iface, riid, pv, dwDestContext, + pvDestContext, mshlflags, &size); + if(FAILED(hres)) + return hres; + + data = heap_alloc_zero(size); + if(!data) + return E_OUTOFMEMORY; + + data[0] = size; + data[1] = dwDestContext; + data[2] = size-2*sizeof(DWORD); + persist_stream_save(This, pStm, TRUE, (struct persist_uri*)(data+2)); + + hres = IStream_Write(pStm, data, data[0]-2, NULL); + heap_free(data); + return hres; +} + +static HRESULT WINAPI Marshal_UnmarshalInterface(IMarshal *iface, + IStream *pStm, REFIID riid, void **ppv) +{ + Uri *This = impl_from_IMarshal(iface); + DWORD header[2]; + HRESULT hres; + + TRACE("(%p)->(%p %s %p)\n", This, pStm, debugstr_guid(riid), ppv); + + if(This->create_flags) + return E_UNEXPECTED; + if(!pStm || !riid || !ppv) + return E_INVALIDARG; + + hres = IStream_Read(pStm, header, sizeof(header), NULL); + if(FAILED(hres)) + return hres; + + if(header[1]!=MSHCTX_LOCAL && header[1]!=MSHCTX_NOSHAREDMEM + && header[1]!=MSHCTX_INPROC) + return E_UNEXPECTED; + + if(header[1] == MSHCTX_INPROC) { + struct inproc_marshal_uri data; + parse_data parse; + + hres = IStream_Read(pStm, data.unk, sizeof(data)-2*sizeof(DWORD), NULL); + if(FAILED(hres)) + return hres; + + This->raw_uri = SysAllocString(data.uri->raw_uri); + if(!This->raw_uri) { + return E_OUTOFMEMORY; + } + + memset(&parse, 0, sizeof(parse_data)); + parse.uri = This->raw_uri; + + if(!parse_uri(&parse, data.uri->create_flags)) + return E_INVALIDARG; + + hres = canonicalize_uri(&parse, This, data.uri->create_flags); + if(FAILED(hres)) + return hres; + + This->create_flags = data.uri->create_flags; + IUri_Release(&data.uri->IUri_iface); + + return IUri_QueryInterface(&This->IUri_iface, riid, ppv); + } + + hres = IPersistStream_Load(&This->IPersistStream_iface, pStm); + if(FAILED(hres)) + return hres; + + return IUri_QueryInterface(&This->IUri_iface, riid, ppv); +} + +static HRESULT WINAPI Marshal_ReleaseMarshalData(IMarshal *iface, IStream *pStm) +{ + Uri *This = impl_from_IMarshal(iface); + LARGE_INTEGER off; + DWORD header[2]; + HRESULT hres; + + TRACE("(%p)->(%p)\n", This, pStm); + + if(!pStm) + return E_INVALIDARG; + + hres = IStream_Read(pStm, header, 2*sizeof(DWORD), NULL); + if(FAILED(hres)) + return hres; + + if(header[1] == MSHCTX_INPROC) { + struct inproc_marshal_uri data; + + hres = IStream_Read(pStm, data.unk, sizeof(data)-2*sizeof(DWORD), NULL); + if(FAILED(hres)) + return hres; + + IUri_Release(&data.uri->IUri_iface); + return S_OK; + } + + off.u.LowPart = header[0]-sizeof(header)-2; + off.u.HighPart = 0; + return IStream_Seek(pStm, off, STREAM_SEEK_CUR, NULL); +} + +static HRESULT WINAPI Marshal_DisconnectObject(IMarshal *iface, DWORD dwReserved) +{ + Uri *This = impl_from_IMarshal(iface); + TRACE("(%p)->(%x)\n", This, dwReserved); + return S_OK; +} + +static const IMarshalVtbl MarshalVtbl = { + Marshal_QueryInterface, + Marshal_AddRef, + Marshal_Release, + Marshal_GetUnmarshalClass, + Marshal_GetMarshalSizeMax, + Marshal_MarshalInterface, + Marshal_UnmarshalInterface, + Marshal_ReleaseMarshalData, + Marshal_DisconnectObject +}; + +HRESULT Uri_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) +{ + Uri *ret = heap_alloc_zero(sizeof(Uri)); + + TRACE("(%p %p)\n", pUnkOuter, ppobj); + + *ppobj = ret; + if(!ret) + return E_OUTOFMEMORY; + + ret->IUri_iface.lpVtbl = &UriVtbl; + ret->IUriBuilderFactory_iface.lpVtbl = &UriBuilderFactoryVtbl; + ret->IPersistStream_iface.lpVtbl = &PersistStreamVtbl; + ret->IMarshal_iface.lpVtbl = &MarshalVtbl; + ret->ref = 1; + + *ppobj = &ret->IUri_iface; + return S_OK; } /*********************************************************************** @@ -5071,8 +5677,8 @@ static Uri* create_uri_obj(void) { * * RETURNS * Success: Returns S_OK. ppURI contains the pointer to the newly allocated IUri. - * Failure: E_INVALIDARG if there's invalid flag combinations in dwFlags, or an - * invalid parameters, or pwzURI doesn't represnt a valid URI. + * Failure: E_INVALIDARG if there are invalid flag combinations in dwFlags, or an + * invalid parameter, or pwzURI doesn't represent a valid URI. * E_OUTOFMEMORY if any memory allocation fails. * * NOTES @@ -5096,7 +5702,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU if(!ppURI) return E_INVALIDARG; - if(!pwzURI || !*pwzURI) { + if(!pwzURI) { *ppURI = NULL; return E_INVALIDARG; } @@ -5111,10 +5717,10 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU if(dwFlags & ~supported_flags) FIXME("Ignoring unsupported flag(s) %x\n", dwFlags & ~supported_flags); - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { *ppURI = NULL; - return E_OUTOFMEMORY; + return hr; } /* Explicitly set the default flags if it doesn't cause a flag conflict. */ @@ -5134,7 +5740,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU memset(&data, 0, sizeof(parse_data)); data.uri = ret->raw_uri; - /* Validate and parse the URI into it's components. */ + /* Validate and parse the URI into its components. */ if(!parse_uri(&data, dwFlags)) { /* Encountered an unsupported or invalid URI */ IUri_Release(&ret->IUri_iface); @@ -5164,7 +5770,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU * * PARAMS * pwzURI [I] The URI to parse and perform canonicalization on. - * pwzFragment [I] The explict fragment string which should be added to pwzURI. + * pwzFragment [I] The explicit fragment string which should be added to pwzURI. * dwFlags [I] The flags which will be passed to CreateUri. * dwReserved [I] Reserved (not used). * ppURI [O] The resulting IUri after parsing/canonicalization. @@ -5173,7 +5779,7 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU * Success: S_OK. ppURI contains the pointer to the newly allocated IUri. * Failure: E_INVALIDARG if pwzURI already contains a fragment and pwzFragment * isn't NULL. Will also return E_INVALIDARG for the same reasons as - * CreateUri will. E_OUTOFMEMORY if any allocations fail. + * CreateUri will. E_OUTOFMEMORY if any allocation fails. */ HRESULT WINAPI CreateUriWithFragment(LPCWSTR pwzURI, LPCWSTR pwzFragment, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI) @@ -5271,10 +5877,10 @@ static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_fla return hr; } - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { *uri = NULL; - return E_OUTOFMEMORY; + return hr; } hr = generate_uri(builder, &data, ret, create_flags); @@ -5753,6 +6359,10 @@ HRESULT WINAPI CreateIUriBuilder(IUri *pIUri, DWORD dwFlags, DWORD_PTR dwReserve Uri *uri; if((uri = get_uri_obj(pIUri))) { + if(!uri->create_flags) { + heap_free(ret); + return E_UNEXPECTED; + } IUri_AddRef(pIUri); ret->uri = uri; @@ -5784,13 +6394,25 @@ static HRESULT merge_paths(parse_data *data, const WCHAR *base, DWORD base_len, WCHAR *ptr; if(base_len) { - /* Find the characters the will be copied over from - * the base path. - */ - end = memrchrW(base, '/', base_len); - if(!end && data->scheme_type == URL_SCHEME_FILE) - /* Try looking for a '\\'. */ - end = memrchrW(base, '\\', base_len); + if(data->scheme_type == URL_SCHEME_MK && *relative == '/') { + /* Find '::' segment */ + for(end = base; end < base+base_len-1; end++) { + if(end[0] == ':' && end[1] == ':') { + end++; + break; + } + } + + /* If not found, try finding the end of @xxx: */ + if(end == base+base_len-1) + end = *base == '@' ? memchr(base, ':', base_len) : NULL; + }else { + /* Find the characters that will be copied over from the base path. */ + end = memrchrW(base, '/', base_len); + if(!end && data->scheme_type == URL_SCHEME_FILE) + /* Try looking for a '\\'. */ + end = memrchrW(base, '\\', base_len); + } } if(end) { @@ -5815,6 +6437,7 @@ static HRESULT merge_paths(parse_data *data, const WCHAR *base, DWORD base_len, *ptr = '\0'; *result_len = (ptr-*result); + TRACE("ret %s\n", debugstr_wn(*result, *result_len)); return S_OK; } @@ -5822,6 +6445,7 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, Uri *ret; HRESULT hr; parse_data data; + Uri *proc_uri = base; DWORD create_flags = 0, len = 0; memset(&data, 0, sizeof(parse_data)); @@ -5839,10 +6463,10 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, parse_uri(&data, 0); - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { *result = NULL; - return E_OUTOFMEMORY; + return hr; } if(extras & COMBINE_URI_FORCE_FLAG_USE) { @@ -5878,35 +6502,38 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, create_flags |= Uri_CREATE_ALLOW_RELATIVE; } - if(base->authority_start > -1) { - if(base->userinfo_start > -1 && base->userinfo_split != 0) { - data.username = base->canon_uri+base->userinfo_start; - data.username_len = (base->userinfo_split > -1) ? base->userinfo_split : base->userinfo_len; + if(relative->authority_start > -1) + proc_uri = relative; + + if(proc_uri->authority_start > -1) { + if(proc_uri->userinfo_start > -1 && proc_uri->userinfo_split != 0) { + data.username = proc_uri->canon_uri+proc_uri->userinfo_start; + data.username_len = (proc_uri->userinfo_split > -1) ? proc_uri->userinfo_split : proc_uri->userinfo_len; } - if(base->userinfo_split > -1) { - data.password = base->canon_uri+base->userinfo_start+base->userinfo_split+1; - data.password_len = base->userinfo_len-base->userinfo_split-1; + if(proc_uri->userinfo_split > -1) { + data.password = proc_uri->canon_uri+proc_uri->userinfo_start+proc_uri->userinfo_split+1; + data.password_len = proc_uri->userinfo_len-proc_uri->userinfo_split-1; } - if(base->host_start > -1) { - data.host = base->canon_uri+base->host_start; - data.host_len = base->host_len; - data.host_type = base->host_type; + if(proc_uri->host_start > -1) { + data.host = proc_uri->canon_uri+proc_uri->host_start; + data.host_len = proc_uri->host_len; + data.host_type = proc_uri->host_type; } - if(base->has_port) { + if(proc_uri->has_port) { data.has_port = TRUE; - data.port_value = base->port; + data.port_value = proc_uri->port; } } else if(base->scheme_type != URL_SCHEME_FILE) data.is_opaque = TRUE; - if(relative->path_start == -1 || !relative->path_len) { - if(base->path_start > -1) { - data.path = base->canon_uri+base->path_start; - data.path_len = base->path_len; - } else if((base->path_start == -1 || !base->path_len) && !data.is_opaque) { + if(proc_uri == relative || relative->path_start == -1 || !relative->path_len) { + if(proc_uri->path_start > -1) { + data.path = proc_uri->canon_uri+proc_uri->path_start; + data.path_len = proc_uri->path_len; + } else if(!data.is_opaque) { /* Just set the path as a '/' if the base didn't have * one and if it's an hierarchical URI. */ @@ -5915,12 +6542,12 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, data.path_len = 1; } - if(relative->query_start > -1) { - data.query = relative->canon_uri+relative->query_start; - data.query_len = relative->query_len; - } else if(base->query_start > -1) { - data.query = base->canon_uri+base->query_start; - data.query_len = base->query_len; + if(relative->query_start > -1) + proc_uri = relative; + + if(proc_uri->query_start > -1) { + data.query = proc_uri->canon_uri+proc_uri->query_start; + data.query_len = proc_uri->query_len; } } else { const WCHAR *ptr, **pptr; @@ -5932,7 +6559,7 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, * relative path doesn't begin with a '/' then the base path and relative * path are merged together. */ - if(relative->path_len && *(relative->canon_uri+relative->path_start) == '/') { + if(relative->path_len && *(relative->canon_uri+relative->path_start) == '/' && data.scheme_type != URL_SCHEME_MK) { WCHAR *tmp = NULL; BOOL copy_drive_path = FALSE; @@ -6043,12 +6670,12 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result, generate_raw_uri(&data, data.uri, raw_flags); - ret = create_uri_obj(); - if(!ret) { + hr = Uri_Construct(NULL, (void**)&ret); + if(FAILED(hr)) { SysFreeString(data.uri); heap_free(path); *result = NULL; - return E_OUTOFMEMORY; + return hr; } if(flags & URL_DONT_SIMPLIFY) @@ -6279,7 +6906,7 @@ static HRESULT parse_canonicalize(const Uri *uri, DWORD flags, LPWSTR output, buffer[len++] = 0; - /* The null terminator isn't included the length. */ + /* The null terminator isn't included in the length. */ *result_len = len-1; if(len > output_len) return STRSAFE_E_INSUFFICIENT_BUFFER; diff --git a/reactos/dll/win32/urlmon/urlmon.rc b/reactos/dll/win32/urlmon/urlmon.rc new file mode 100644 index 00000000000..21492b614f7 --- /dev/null +++ b/reactos/dll/win32/urlmon/urlmon.rc @@ -0,0 +1,67 @@ +/* + * Copyright 2005 Jacek Caban + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include + +#include "resource.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +ID_AXINSTALL_WARNING_DLG DIALOG 0, 0, 260, 115 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Security Warning" +FONT 8, "MS Shell Dlg" +{ + CONTROL "Do you want to install this software?", + 100, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 10, 240, 23 + CONTROL "Location:", 101, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 10, 26, 40, 13 + CONTROL "", ID_AXINSTALL_LOCATION, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 50, 26, 200, 13 + DEFPUSHBUTTON "Don't install", IDCANCEL, 200, 48, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "", ID_AXINSTALL_INSTALL_BTN, 144, 48, 50, 14, WS_GROUP | WS_TABSTOP | WS_DISABLED + CONTROL "", 102, "static", SS_ETCHEDHORZ, 10, 70, 240, 1 + ICON "", ID_AXINSTALL_ICON, 10, 82, 32, 32, WS_CHILD | WS_VISIBLE + CONTROL "When installed, an ActiveX component has full access to your computer. Do not click install unless you have absolute trust in the above source.", + 22002, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 46, 80, 194, 23 +} + +STRINGTABLE +{ + IDS_AXINSTALL_FAILURE "Installation of component failed: %08x" + IDS_AXINSTALL_INSTALLN "Install (%d)" + IDS_AXINSTALL_INSTALL "Install" +} + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* @makedep: urlmon.rgs */ +1 WINE_REGISTRY urlmon.rgs + +2 WINE_REGISTRY urlmon_urlmon.rgs + +/* @makedep: urlmon.inf */ +REGINST REGINST urlmon.inf + +#define WINE_FILENAME_STR "urlmon.dll" +#define WINE_FILEVERSION 6,0,2800,1485 +#define WINE_FILEVERSION_STR "6.0.2800.1485" +#define WINE_PRODUCTVERSION 6,0,2800,1485 +#define WINE_PRODUCTVERSION_STR "6.0.2800.1485" + +#include "wine/wine_common_ver.rc" diff --git a/reactos/dll/win32/urlmon/urlmon.spec b/reactos/dll/win32/urlmon/urlmon.spec index 58b3f330f59..e66fff786f3 100644 --- a/reactos/dll/win32/urlmon/urlmon.spec +++ b/reactos/dll/win32/urlmon/urlmon.spec @@ -10,7 +10,7 @@ @ stdcall BindAsyncMoniker(ptr long ptr ptr ptr) @ stdcall CoGetClassObjectFromURL(ptr wstr long long wstr ptr long ptr ptr ptr) @ stub CoInstall -@ stdcall CoInternetCombineUrl(wstr wstr long wstr long ptr long) +@ stdcall CoInternetCombineUrl(wstr wstr long ptr long ptr long) @ stdcall CoInternetCombineUrlEx(ptr wstr long ptr long) @ stdcall CoInternetCompareUrl(wstr wstr long) @ stdcall CoInternetCombineIUri(ptr ptr long ptr long) @@ -21,12 +21,14 @@ @ stdcall CoInternetGetSecurityUrlEx(ptr ptr long long) @ stdcall CoInternetGetSession(long ptr long) @ stdcall CoInternetIsFeatureEnabled(long long) +@ stdcall CoInternetIsFeatureEnabledForUrl(long long wstr ptr) +@ stdcall CoInternetIsFeatureZoneElevationEnabled(wstr wstr ptr long) @ stdcall CoInternetParseUrl(wstr long long wstr long ptr long) @ stdcall CoInternetParseIUri(ptr long long wstr long ptr long) @ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long) @ stdcall CoInternetSetFeatureEnabled(long long long) -@ stub CompareSecurityIds -@ stub CopyBindInfo +@ stdcall CompareSecurityIds(ptr long ptr long long) +@ stdcall CopyBindInfo(ptr ptr) @ stdcall CopyStgMedium(ptr ptr) @ stdcall CreateAsyncBindCtx(long ptr ptr ptr) @ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long) @@ -36,6 +38,7 @@ @ stdcall CreateUriWithFragment(wstr wstr long long ptr) @ stdcall CreateURLMoniker(ptr wstr ptr) @ stdcall CreateURLMonikerEx(ptr wstr ptr long) +@ stdcall CreateURLMonikerEx2(ptr ptr ptr long) @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllInstall(long wstr) @@ -69,7 +72,7 @@ @ stdcall RegisterBindStatusCallback(ptr ptr ptr long) @ stdcall RegisterFormatEnumerator(ptr ptr long) @ stub RegisterMediaTypeClass -@ stub RegisterMediaTypes +@ stdcall RegisterMediaTypes(long ptr ptr) @ stdcall ReleaseBindInfo(ptr) @ stdcall RevokeBindStatusCallback(ptr ptr) @ stdcall RevokeFormatEnumerator(ptr ptr) @@ -92,5 +95,17 @@ @ stub WriteHitLogging @ stub ZonesReInit -410 stdcall @(long long) URLMON_410 -423 stdcall @(long long long long) URLMON_423 +111 stdcall @(wstr) IsProtectedModeURL +328 stdcall @(ptr ptr) propsys.VariantCompare +329 stdcall @(ptr ptr) propsys.VariantToGUID +331 stdcall @(ptr long ptr) propsys.InitPropVariantFromBuffer +335 stdcall @(ptr long ptr) propsys.InitVariantFromBuffer +350 stdcall @(ptr ptr) propsys.PropVariantToGUID +362 stdcall @(ptr ptr) propsys.InitVariantFromGUIDAsString +363 stdcall @(long long ptr) propsys.InitVariantFromResource +387 stdcall @(ptr long) propsys.VariantToUInt32WithDefault +410 stdcall @(long long) LogSqmBits +423 stdcall @(long long long long) LogSqmUXCommandOffsetInternal +444 stdcall @(long long long) MapUriToBrowserEmulationState +445 stdcall @(long long) MapBrowserEmulationModeToUserAgent +455 stdcall @() FlushUrlmonZonesCache diff --git a/reactos/dll/win32/urlmon/urlmon_main.c b/reactos/dll/win32/urlmon/urlmon_main.c index af5d87a4991..4a81d13ab9a 100644 --- a/reactos/dll/win32/urlmon/urlmon_main.c +++ b/reactos/dll/win32/urlmon/urlmon_main.c @@ -27,19 +27,23 @@ #define NO_SHLWAPI_REG //#include "shlwapi.h" #include +#include #include -//#include "urlmon.h" +#include "urlmon.h" WINE_DEFAULT_DEBUG_CHANNEL(urlmon); +DEFINE_GUID(CLSID_CUri, 0xDF2FCE13, 0x25EC, 0x45BB, 0x9D,0x4C, 0xCE,0xCD,0x47,0xC2,0x43,0x0C); + LONG URLMON_refCount = 0; +HINSTANCE urlmon_instance; static HMODULE hCabinet = NULL; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; -static void init_session(BOOL); +static void init_session(void); static struct list tls_list = LIST_INIT(tls_list); @@ -133,7 +137,6 @@ static void process_detach(void) if (hCabinet) FreeLibrary(hCabinet); - init_session(FALSE); free_session(); free_tls_list(); } @@ -149,11 +152,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) switch(fdwReason) { case DLL_PROCESS_ATTACH: - init_session(TRUE); + urlmon_instance = hinstDLL; + init_session(); break; case DLL_PROCESS_DETACH: process_detach(); + DeleteCriticalSection(&tls_cs); break; case DLL_THREAD_DETACH: @@ -163,6 +168,67 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) return TRUE; } +const char *debugstr_bindstatus(ULONG status) +{ + switch(status) { +#define X(x) case x: return #x + X(BINDSTATUS_FINDINGRESOURCE); + X(BINDSTATUS_CONNECTING); + X(BINDSTATUS_REDIRECTING); + X(BINDSTATUS_BEGINDOWNLOADDATA); + X(BINDSTATUS_DOWNLOADINGDATA); + X(BINDSTATUS_ENDDOWNLOADDATA); + X(BINDSTATUS_BEGINDOWNLOADCOMPONENTS); + X(BINDSTATUS_INSTALLINGCOMPONENTS); + X(BINDSTATUS_ENDDOWNLOADCOMPONENTS); + X(BINDSTATUS_USINGCACHEDCOPY); + X(BINDSTATUS_SENDINGREQUEST); + X(BINDSTATUS_CLASSIDAVAILABLE); + X(BINDSTATUS_MIMETYPEAVAILABLE); + X(BINDSTATUS_CACHEFILENAMEAVAILABLE); + X(BINDSTATUS_BEGINSYNCOPERATION); + X(BINDSTATUS_ENDSYNCOPERATION); + X(BINDSTATUS_BEGINUPLOADDATA); + X(BINDSTATUS_UPLOADINGDATA); + X(BINDSTATUS_ENDUPLOADINGDATA); + X(BINDSTATUS_PROTOCOLCLASSID); + X(BINDSTATUS_ENCODING); + X(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE); + X(BINDSTATUS_CLASSINSTALLLOCATION); + X(BINDSTATUS_DECODING); + X(BINDSTATUS_LOADINGMIMEHANDLER); + X(BINDSTATUS_CONTENTDISPOSITIONATTACH); + X(BINDSTATUS_FILTERREPORTMIMETYPE); + X(BINDSTATUS_CLSIDCANINSTANTIATE); + X(BINDSTATUS_IUNKNOWNAVAILABLE); + X(BINDSTATUS_DIRECTBIND); + X(BINDSTATUS_RAWMIMETYPE); + X(BINDSTATUS_PROXYDETECTING); + X(BINDSTATUS_ACCEPTRANGES); + X(BINDSTATUS_COOKIE_SENT); + X(BINDSTATUS_COMPACT_POLICY_RECEIVED); + X(BINDSTATUS_COOKIE_SUPPRESSED); + X(BINDSTATUS_COOKIE_STATE_UNKNOWN); + X(BINDSTATUS_COOKIE_STATE_ACCEPT); + X(BINDSTATUS_COOKIE_STATE_REJECT); + X(BINDSTATUS_COOKIE_STATE_PROMPT); + X(BINDSTATUS_COOKIE_STATE_LEASH); + X(BINDSTATUS_COOKIE_STATE_DOWNGRADE); + X(BINDSTATUS_POLICY_HREF); + X(BINDSTATUS_P3P_HEADER); + X(BINDSTATUS_SESSION_COOKIE_RECEIVED); + X(BINDSTATUS_PERSISTENT_COOKIE_RECEIVED); + X(BINDSTATUS_SESSION_COOKIES_ALLOWED); + X(BINDSTATUS_CACHECONTROL); + X(BINDSTATUS_CONTENTDISPOSITIONFILENAME); + X(BINDSTATUS_MIMETEXTPLAINMISMATCH); + X(BINDSTATUS_PUBLISHERAVAILABLE); + X(BINDSTATUS_DISPLAYNAMEAVAILABLE); +#undef X + default: + return wine_dbg_sprintf("(invalid status %u)", status); + } +} /*********************************************************************** * DllInstall (URLMON.@) @@ -291,6 +357,8 @@ static ClassFactory StdURLMonikerCF = { { &ClassFactoryVtbl }, StdURLMoniker_Construct}; static ClassFactory MimeFilterCF = { { &ClassFactoryVtbl }, MimeFilter_Construct}; +static ClassFactory CUriCF = + { { &ClassFactoryVtbl }, Uri_Construct}; struct object_creation_info { @@ -317,18 +385,18 @@ static const struct object_creation_info object_creation[] = { &CLSID_InternetSecurityManager, &SecurityManagerCF.IClassFactory_iface, NULL }, { &CLSID_InternetZoneManager, &ZoneManagerCF.IClassFactory_iface, NULL }, { &CLSID_StdURLMoniker, &StdURLMonikerCF.IClassFactory_iface, NULL }, - { &CLSID_DeCompMimeFilter, &MimeFilterCF.IClassFactory_iface, NULL } + { &CLSID_DeCompMimeFilter, &MimeFilterCF.IClassFactory_iface, NULL }, + { &CLSID_CUri, &CUriCF.IClassFactory_iface, NULL } }; -static void init_session(BOOL init) +static void init_session(void) { unsigned int i; for(i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++) { - if(object_creation[i].protocol) - register_urlmon_namespace(object_creation[i].cf, object_creation[i].clsid, - object_creation[i].protocol, init); + register_namespace(object_creation[i].cf, object_creation[i].clsid, + object_creation[i].protocol, TRUE); } } @@ -526,6 +594,8 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) if(src->u.lpszFileName && !src->pUnkForRelease) { DWORD size = (strlenW(src->u.lpszFileName)+1)*sizeof(WCHAR); dst->u.lpszFileName = CoTaskMemAlloc(size); + if(!dst->u.lpszFileName) + return E_OUTOFMEMORY; memcpy(dst->u.lpszFileName, src->u.lpszFileName, size); } break; @@ -537,6 +607,21 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) if(dst->u.pstg) IStorage_AddRef(dst->u.pstg); break; + case TYMED_HGLOBAL: + if(dst->u.hGlobal) { + SIZE_T size = GlobalSize(src->u.hGlobal); + char *src_ptr, *dst_ptr; + + dst->u.hGlobal = GlobalAlloc(GMEM_FIXED, size); + if(!dst->u.hGlobal) + return E_OUTOFMEMORY; + dst_ptr = GlobalLock(dst->u.hGlobal); + src_ptr = GlobalLock(src->u.hGlobal); + memcpy(dst_ptr, src_ptr, size); + GlobalUnlock(src_ptr); + GlobalUnlock(dst_ptr); + } + break; default: FIXME("Unimplemented tymed %d\n", src->tymed); } @@ -547,6 +632,70 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) return S_OK; } +/*********************************************************************** + * CopyBindInfo (URLMON.@) + */ +HRESULT WINAPI CopyBindInfo(const BINDINFO *pcbiSrc, BINDINFO *pcbiDest) +{ + DWORD size; + HRESULT hres; + + TRACE("(%p %p)\n", pcbiSrc, pcbiDest); + + if(!pcbiSrc || !pcbiDest) + return E_POINTER; + if(!pcbiSrc->cbSize || !pcbiDest->cbSize) + return E_INVALIDARG; + + size = pcbiDest->cbSize; + if(size > pcbiSrc->cbSize) { + memcpy(pcbiDest, pcbiSrc, pcbiSrc->cbSize); + memset((char*)pcbiDest+pcbiSrc->cbSize, 0, size-pcbiSrc->cbSize); + } else { + memcpy(pcbiDest, pcbiSrc, size); + } + pcbiDest->cbSize = size; + + size = FIELD_OFFSET(BINDINFO, szExtraInfo)+sizeof(void*); + if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size && pcbiSrc->szExtraInfo) { + size = (strlenW(pcbiSrc->szExtraInfo)+1)*sizeof(WCHAR); + pcbiDest->szExtraInfo = CoTaskMemAlloc(size); + if(!pcbiDest->szExtraInfo) + return E_OUTOFMEMORY; + memcpy(pcbiDest->szExtraInfo, pcbiSrc->szExtraInfo, size); + } + + size = FIELD_OFFSET(BINDINFO, stgmedData)+sizeof(STGMEDIUM); + if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size) { + hres = CopyStgMedium(&pcbiSrc->stgmedData, &pcbiDest->stgmedData); + if(FAILED(hres)) { + CoTaskMemFree(pcbiDest->szExtraInfo); + return hres; + } + } + + size = FIELD_OFFSET(BINDINFO, szCustomVerb)+sizeof(void*); + if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size && pcbiSrc->szCustomVerb) { + size = (strlenW(pcbiSrc->szCustomVerb)+1)*sizeof(WCHAR); + pcbiDest->szCustomVerb = CoTaskMemAlloc(size); + if(!pcbiDest->szCustomVerb) { + CoTaskMemFree(pcbiDest->szExtraInfo); + ReleaseStgMedium(&pcbiDest->stgmedData); + return E_OUTOFMEMORY; + } + memcpy(pcbiDest->szCustomVerb, pcbiSrc->szCustomVerb, size); + } + + size = FIELD_OFFSET(BINDINFO, securityAttributes)+sizeof(SECURITY_ATTRIBUTES); + if(pcbiDest->cbSize >= size) + memset(&pcbiDest->securityAttributes, 0, sizeof(SECURITY_ATTRIBUTES)); + + if(pcbiSrc->pUnk) + IUnknown_AddRef(pcbiDest->pUnk); + + return S_OK; +} + static BOOL text_richtext_filter(const BYTE *b, DWORD size) { return size > 5 && !memcmp(b, "{\\rtf", 5); @@ -554,19 +703,33 @@ static BOOL text_richtext_filter(const BYTE *b, DWORD size) static BOOL text_html_filter(const BYTE *b, DWORD size) { - DWORD i; - - if(size < 5) + if(size < 6) return FALSE; - for(i=0; i < size-5; i++) { - if(b[i] == '<' - && (b[i+1] == 'h' || b[i+1] == 'H') - && (b[i+2] == 't' || b[i+2] == 'T') - && (b[i+3] == 'm' || b[i+3] == 'M') - && (b[i+4] == 'l' || b[i+4] == 'L')) - return TRUE; - } + if((b[0] == '<' + && (b[1] == 'h' || b[1] == 'H') + && (b[2] == 't' || b[2] == 'T') + && (b[3] == 'm' || b[3] == 'M') + && (b[4] == 'l' || b[4] == 'L')) + || (b[0] == '<' + && (b[1] == 'h' || b[1] == 'H') + && (b[2] == 'e' || b[2] == 'E') + && (b[3] == 'a' || b[3] == 'A') + && (b[4] == 'd' || b[4] == 'D'))) return TRUE; + + return FALSE; +} + +static BOOL text_xml_filter(const BYTE *b, DWORD size) +{ + if(size < 7) + return FALSE; + + if(b[0] == '<' && b[1] == '?' + && (b[2] == 'x' || b[2] == 'X') + && (b[3] == 'm' || b[3] == 'M') + && (b[4] == 'l' || b[4] == 'L') + && b[5] == ' ') return TRUE; return FALSE; } @@ -602,7 +765,10 @@ static BOOL image_pjpeg_filter(const BYTE *b, DWORD size) static BOOL image_tiff_filter(const BYTE *b, DWORD size) { - return size > 2 && b[0] == 0x4d && b[1] == 0x4d; + static const BYTE magic1[] = {0x4d,0x4d,0x00,0x2a}; + static const BYTE magic2[] = {0x49,0x49,0x2a,0xff}; + + return size >= 4 && (!memcmp(b, magic1, 4) || !memcmp(b, magic2, 4)); } static BOOL image_xpng_filter(const BYTE *b, DWORD size) @@ -662,12 +828,19 @@ static BOOL application_xmsdownload(const BYTE *b, DWORD size) return size > 2 && b[0] == 'M' && b[1] == 'Z'; } +static inline BOOL is_text_plain_char(BYTE b) +{ + if(b < 0x20 && b != '\n' && b != '\r' && b != '\t') + return FALSE; + return TRUE; +} + static BOOL text_plain_filter(const BYTE *b, DWORD size) { const BYTE *ptr; for(ptr = b; ptr < b+size-1; ptr++) { - if(*ptr < 0x20 && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') + if(!is_text_plain_char(*ptr)) return FALSE; } @@ -682,10 +855,11 @@ static BOOL application_octet_stream_filter(const BYTE *b, DWORD size) static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *proposed_mime, WCHAR **ret_mime) { LPCWSTR ret = NULL; - DWORD len, i; + int len, i, any_pos_mime = -1; static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0}; static const WCHAR text_richtextW[] = {'t','e','x','t','/','r','i','c','h','t','e','x','t',0}; + static const WCHAR text_xmlW[] = {'t','e','x','t','/','x','m','l',0}; static const WCHAR audio_basicW[] = {'a','u','d','i','o','/','b','a','s','i','c',0}; static const WCHAR audio_wavW[] = {'a','u','d','i','o','/','w','a','v',0}; static const WCHAR image_gifW[] = {'i','m','a','g','e','/','g','i','f',0}; @@ -713,8 +887,10 @@ static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *p static const struct { LPCWSTR mime; BOOL (*filter)(const BYTE *,DWORD); - } mime_filters[] = { + } mime_filters_any_pos[] = { {text_htmlW, text_html_filter}, + {text_xmlW, text_xml_filter} + }, mime_filters[] = { {text_richtextW, text_richtext_filter}, /* {audio_xaiffW, audio_xaiff_filter}, */ {audio_basicW, audio_basic_filter}, @@ -756,20 +932,47 @@ static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *p return S_OK; } - if(proposed_mime && strcmpW(proposed_mime, app_octetstreamW)) { - for(i=0; i < sizeof(mime_filters)/sizeof(*mime_filters); i++) { - if(!strcmpW(proposed_mime, mime_filters[i].mime)) + if(proposed_mime && (!strcmpW(proposed_mime, app_octetstreamW) + || !strcmpW(proposed_mime, text_plainW))) + proposed_mime = NULL; + + if(proposed_mime) { + ret = proposed_mime; + + for(i=0; i < sizeof(mime_filters_any_pos)/sizeof(*mime_filters_any_pos); i++) { + if(!strcmpW(proposed_mime, mime_filters_any_pos[i].mime)) { + any_pos_mime = i; + for(len=size; len>0; len--) { + if(mime_filters_any_pos[i].filter(buf+size-len, len)) + break; + } + if(!len) + ret = NULL; break; + } } - if(i == sizeof(mime_filters)/sizeof(*mime_filters) || mime_filters[i].filter(buf, size)) { - len = strlenW(proposed_mime)+1; - *ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR)); - if(!*ret_mime) - return E_OUTOFMEMORY; + if(i == sizeof(mime_filters_any_pos)/sizeof(*mime_filters_any_pos)) { + for(i=0; i < sizeof(mime_filters)/sizeof(*mime_filters); i++) { + if(!strcmpW(proposed_mime, mime_filters[i].mime)) { + if(!mime_filters[i].filter(buf, size)) + ret = NULL; + break; + } + } + } + } - memcpy(*ret_mime, proposed_mime, len*sizeof(WCHAR)); - return S_OK; + /* Looks like a bug in native implementation, html and xml mimes + * are not looked for if none of them was proposed */ + if(!proposed_mime || any_pos_mime!=-1) { + for(len=size; !ret && len>0; len--) { + for(i=0; i0; len--) { + if(!is_text_plain_char(buf[size-len])) + break; + for(i=0; i Date: Fri, 22 Mar 2013 14:29:24 +0000 Subject: [PATCH 39/74] [URLMON_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58570 --- rostests/winetests/urlmon/CMakeLists.txt | 6 +- rostests/winetests/urlmon/generated.c | 13 +- rostests/winetests/urlmon/misc.c | 473 +++++-- rostests/winetests/urlmon/protocol.c | 416 +++++- rostests/winetests/urlmon/sec_mgr.c | 415 +++++- rostests/winetests/urlmon/stream.c | 19 +- rostests/winetests/urlmon/testlist.c | 5 +- rostests/winetests/urlmon/uri.c | 1526 ++++++++++++++++++++-- rostests/winetests/urlmon/url.c | 422 ++++-- 9 files changed, 2841 insertions(+), 454 deletions(-) diff --git a/rostests/winetests/urlmon/CMakeLists.txt b/rostests/winetests/urlmon/CMakeLists.txt index 609a9aae811..540a7c71ea2 100644 --- a/rostests/winetests/urlmon/CMakeLists.txt +++ b/rostests/winetests/urlmon/CMakeLists.txt @@ -1,9 +1,7 @@ remove_definitions(-DWINVER=0x502 -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x502) -add_definitions( - -D__ROS_LONG64__ - -D_DLL -D__USE_CRTIMP) +add_definitions(-D__ROS_LONG64__) list(APPEND SOURCE generated.c @@ -18,5 +16,5 @@ list(APPEND SOURCE add_executable(urlmon_winetest ${SOURCE}) target_link_libraries(urlmon_winetest wine uuid) set_module_type(urlmon_winetest win32cui) -add_importlibs(urlmon_winetest urlmon ole32 oleaut32 user32 advapi32 msvcrt kernel32 ntdll) +add_importlibs(urlmon_winetest urlmon wininet ole32 oleaut32 user32 advapi32 msvcrt kernel32 ntdll) add_cd_file(TARGET urlmon_winetest DESTINATION reactos/bin FOR all) diff --git a/rostests/winetests/urlmon/generated.c b/rostests/winetests/urlmon/generated.c index 63e892bc543..138935072ef 100644 --- a/rostests/winetests/urlmon/generated.c +++ b/rostests/winetests/urlmon/generated.c @@ -5,6 +5,10 @@ * Unit tests for data structure packing */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define WINVER 0x0501 #define _WIN32_IE 0x0501 #define _WIN32_WINNT 0x0501 @@ -12,11 +16,12 @@ #define WINE_NOWINSOCK #include -#include "windef.h" -#include "winbase.h" -#include "urlmon.h" +#include +#include +#include +#include -#include "wine/test.h" +#include /*********************************************************************** * Compatibility macros diff --git a/rostests/winetests/urlmon/misc.c b/rostests/winetests/urlmon/misc.c index e4dc20094d4..04a7de066ef 100644 --- a/rostests/winetests/urlmon/misc.c +++ b/rostests/winetests/urlmon/misc.c @@ -16,20 +16,25 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #define NONAMELESSUNION #include -#include -#include +//#include +//#include -#include "windef.h" -#include "winbase.h" -#include "ole2.h" -#include "urlmon.h" +//#include "windef.h" +//#include "winbase.h" +#include +#include +//#include "urlmon.h" -#include "initguid.h" +#include DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B); @@ -69,6 +74,7 @@ static HRESULT (WINAPI *pCoInternetGetSession)(DWORD, IInternetSession **, DWORD static HRESULT (WINAPI *pCoInternetParseUrl)(LPCWSTR, PARSEACTION, DWORD, LPWSTR, DWORD, DWORD *, DWORD); static HRESULT (WINAPI *pCoInternetQueryInfo)(LPCWSTR, QUERYOPTION, DWORD, LPVOID, DWORD, DWORD *, DWORD); static HRESULT (WINAPI *pCopyStgMedium)(const STGMEDIUM *, STGMEDIUM *); +static HRESULT (WINAPI *pCopyBindInfo)(const BINDINFO *, BINDINFO *); static HRESULT (WINAPI *pFindMimeFromData)(LPBC, LPCWSTR, LPVOID, DWORD, LPCWSTR, DWORD, LPWSTR*, DWORD); static HRESULT (WINAPI *pObtainUserAgentString)(DWORD, LPSTR, DWORD*); @@ -439,6 +445,7 @@ static void test_CoInternetQueryInfo(void) static const WCHAR mimeTextHtml[] = {'t','e','x','t','/','h','t','m','l',0}; static const WCHAR mimeTextPlain[] = {'t','e','x','t','/','p','l','a','i','n',0}; static const WCHAR mimeTextRichtext[] = {'t','e','x','t','/','r','i','c','h','t','e','x','t',0}; +static const WCHAR mimeTextXml[] = {'t','e','x','t','/','x','m','l',0}; static const WCHAR mimeAppOctetStream[] = {'a','p','p','l','i','c','a','t','i','o','n','/', 'o','c','t','e','t','-','s','t','r','e','a','m',0}; static const WCHAR mimeImagePjpeg[] = {'i','m','a','g','e','/','p','j','p','e','g',0}; @@ -515,7 +522,7 @@ static BYTE data35[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'x','x','x','x',0}; static BYTE data36[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,'x','x'}; static BYTE data37[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'<','h','t','m','l','>'}; static BYTE data38[] = {0x00,0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'x'}; -static BYTE data39[] = {0x4d,0x4d,0x00,0x2a}; +static BYTE data39[] = {0x4d,0x4d,0x00,0x2a,0xff}; static BYTE data40[] = {0x4d,0x4d,0x00,0x2a,'<','h','t','m','l','>',0}; static BYTE data41[] = {0x4d,0x4d,0xff}; static BYTE data42[] = {0x4d,0x4d}; @@ -562,103 +569,126 @@ static BYTE data82[] = {'.','s','n','d',0}; static BYTE data83[] = {'.','s','n','d'}; static BYTE data84[] = {'.','s','n','d',0,'<','h','t','m','l','>',1,1}; static BYTE data85[] = {'.','S','N','D',0}; +static BYTE data86[] = {0x49,0x49,0x2a,0xff}; +static BYTE data87[] = {' ','<','h','e','a','d'}; +static BYTE data88[] = {' ','<','h','e','a','d','>'}; +static BYTE data89[] = {'\t','\r','<','h','e','a','d','>'}; +static BYTE data90[] = {'<','H','e','A','d',' '}; +static BYTE data91[] = {'<','?','x','m','l',' ',0}; +static BYTE data92[] = {'a','b','c','<','?','x','m','l',' ',' '}; +static BYTE data93[] = {'<','?','x','m','l',' ',' ','<','h','t','m','l','>'}; +static BYTE data94[] = {'<','h','t','m','l','>','<','?','x','m','l',' ',' '}; +static BYTE data95[] = {'{','\\','r','t','f','<','?','x','m','l',' ',' '}; +static BYTE data96[] = {'<','?','x','m','l',' '}; static const struct { BYTE *data; DWORD size; - LPCWSTR mime, mime_alt; + LPCWSTR mime, mime_pjpeg, broken_mime; } mime_tests2[] = { - {data1, sizeof(data1), mimeTextPlain}, - {data2, sizeof(data2), mimeAppOctetStream}, - {data3, sizeof(data3), mimeAppOctetStream}, - {data4, sizeof(data4), mimeAppOctetStream}, - {data5, sizeof(data5), mimeTextPlain}, - {data6, sizeof(data6), mimeTextPlain}, - {data7, sizeof(data7), mimeTextHtml, mimeTextPlain /* IE8 */}, - {data8, sizeof(data8), mimeTextHtml, mimeTextPlain /* IE8 */}, - {data9, sizeof(data9), mimeTextHtml, mimeImagePjpeg /* IE8 */}, - {data10, sizeof(data10), mimeTextHtml, mimeTextPlain /* IE8 */}, - {data11, sizeof(data11), mimeTextHtml, mimeTextPlain /* IE8 */}, - {data12, sizeof(data12), mimeTextHtml, mimeTextPlain /* IE8 */}, - {data13, sizeof(data13), mimeTextPlain}, - {data14, sizeof(data14), mimeTextPlain}, - {data15, sizeof(data15), mimeTextPlain}, - {data16, sizeof(data16), mimeImagePjpeg}, - {data17, sizeof(data17), mimeAppOctetStream}, - {data18, sizeof(data18), mimeTextHtml}, - {data19, sizeof(data19), mimeImageGif}, - {data20, sizeof(data20), mimeImageGif}, - {data21, sizeof(data21), mimeTextPlain}, - {data22, sizeof(data22), mimeImageGif}, - {data23, sizeof(data23), mimeTextPlain}, - {data24, sizeof(data24), mimeImageGif}, - {data25, sizeof(data25), mimeImageGif}, - {data26, sizeof(data26), mimeTextHtml, mimeImageGif /* IE8 */}, - {data27, sizeof(data27), mimeTextPlain}, - {data28, sizeof(data28), mimeImageBmp}, - {data29, sizeof(data29), mimeImageBmp}, - {data30, sizeof(data30), mimeAppOctetStream}, - {data31, sizeof(data31), mimeTextHtml, mimeImageBmp /* IE8 */}, - {data32, sizeof(data32), mimeAppOctetStream}, - {data33, sizeof(data33), mimeAppOctetStream}, - {data34, sizeof(data34), mimeImageXPng}, - {data35, sizeof(data35), mimeImageXPng}, - {data36, sizeof(data36), mimeAppOctetStream}, - {data37, sizeof(data37), mimeTextHtml, mimeImageXPng /* IE8 */}, - {data38, sizeof(data38), mimeAppOctetStream}, - {data39, sizeof(data39), mimeImageTiff}, - {data40, sizeof(data40), mimeTextHtml, mimeImageTiff /* IE8 */}, - {data41, sizeof(data41), mimeImageTiff}, - {data42, sizeof(data42), mimeTextPlain}, - {data43, sizeof(data43), mimeAppOctetStream}, - {data44, sizeof(data44), mimeVideoAvi}, - {data45, sizeof(data45), mimeTextPlain}, - {data46, sizeof(data46), mimeTextPlain}, - {data47, sizeof(data47), mimeTextPlain}, - {data48, sizeof(data48), mimeTextHtml, mimeVideoAvi /* IE8 */}, - {data49, sizeof(data49), mimeVideoAvi}, - {data50, sizeof(data50), mimeVideoMpeg}, - {data51, sizeof(data51), mimeVideoMpeg}, - {data52, sizeof(data52), mimeAppOctetStream}, - {data53, sizeof(data53), mimeAppOctetStream}, - {data54, sizeof(data54), mimeTextHtml, mimeVideoMpeg /* IE8 */}, - {data55, sizeof(data55), mimeAppXGzip}, - {data56, sizeof(data56), mimeTextPlain}, - {data57, sizeof(data57), mimeTextHtml, mimeAppXGzip /* IE8 */}, - {data58, sizeof(data58), mimeAppOctetStream}, - {data59, sizeof(data59), mimeAppXZip}, - {data60, sizeof(data60), mimeTextPlain}, - {data61, sizeof(data61), mimeTextHtml, mimeAppXZip /* IE8 */}, - {data62, sizeof(data62), mimeAppJava}, - {data63, sizeof(data63), mimeTextPlain}, - {data64, sizeof(data64), mimeTextHtml, mimeAppJava /* IE8 */}, - {data65, sizeof(data65), mimeAppPdf}, - {data66, sizeof(data66), mimeTextPlain}, - {data67, sizeof(data67), mimeTextHtml, mimeAppPdf /* IE8 */}, - {data68, sizeof(data68), mimeAppXMSDownload}, - {data69, sizeof(data69), mimeTextPlain}, - {data70, sizeof(data70), mimeTextHtml, mimeAppXMSDownload /* IE8 */}, - {data71, sizeof(data71), mimeTextRichtext}, - {data72, sizeof(data72), mimeTextPlain}, - {data73, sizeof(data73), mimeTextPlain}, - {data74, sizeof(data74), mimeTextHtml, mimeTextRichtext /* IE8 */}, - {data75, sizeof(data75), mimeAudioWav}, - {data76, sizeof(data76), mimeTextPlain}, - {data77, sizeof(data77), mimeTextPlain}, - {data78, sizeof(data78), mimeTextHtml, mimeTextPlain /* IE8 */}, - {data79, sizeof(data79), mimeAppPostscript}, - {data80, sizeof(data80), mimeTextPlain}, - {data81, sizeof(data81), mimeTextHtml, mimeAppPostscript /* IE8 */}, - {data82, sizeof(data82), mimeAudioBasic}, - {data83, sizeof(data83), mimeTextPlain}, - {data84, sizeof(data84), mimeTextHtml, mimeAudioBasic /* IE8 */}, - {data85, sizeof(data85), mimeTextPlain} + {data1, sizeof(data1), mimeTextPlain, mimeTextPlain}, + {data2, sizeof(data2), mimeAppOctetStream, mimeImagePjpeg}, + {data3, sizeof(data3), mimeAppOctetStream, mimeImagePjpeg}, + {data4, sizeof(data4), mimeAppOctetStream, mimeImagePjpeg}, + {data5, sizeof(data5), mimeTextPlain, mimeTextPlain}, + {data6, sizeof(data6), mimeTextPlain, mimeTextPlain}, + {data7, sizeof(data7), mimeTextHtml, mimeTextPlain}, + {data8, sizeof(data8), mimeTextHtml, mimeTextPlain}, + {data9, sizeof(data9), mimeTextHtml, mimeImagePjpeg}, + {data10, sizeof(data10), mimeTextHtml, mimeTextPlain}, + {data11, sizeof(data11), mimeTextHtml, mimeTextPlain}, + {data12, sizeof(data12), mimeTextHtml, mimeTextPlain}, + {data13, sizeof(data13), mimeTextPlain, mimeTextPlain}, + {data14, sizeof(data14), mimeTextPlain, mimeTextPlain}, + {data15, sizeof(data15), mimeTextPlain, mimeTextPlain}, + {data16, sizeof(data16), mimeImagePjpeg, mimeImagePjpeg}, + {data17, sizeof(data17), mimeAppOctetStream, mimeImagePjpeg}, + {data18, sizeof(data18), mimeTextHtml, mimeImagePjpeg}, + {data19, sizeof(data19), mimeImageGif, mimeImageGif}, + {data20, sizeof(data20), mimeImageGif, mimeImageGif}, + {data21, sizeof(data21), mimeTextPlain, mimeTextPlain}, + {data22, sizeof(data22), mimeImageGif, mimeImageGif}, + {data23, sizeof(data23), mimeTextPlain, mimeTextPlain}, + {data24, sizeof(data24), mimeImageGif, mimeImageGif}, + {data25, sizeof(data25), mimeImageGif, mimeImageGif}, + {data26, sizeof(data26), mimeTextHtml, mimeImageGif}, + {data27, sizeof(data27), mimeTextPlain, mimeTextPlain}, + {data28, sizeof(data28), mimeImageBmp, mimeImageBmp}, + {data29, sizeof(data29), mimeImageBmp, mimeImageBmp}, + {data30, sizeof(data30), mimeAppOctetStream, mimeImagePjpeg}, + {data31, sizeof(data31), mimeTextHtml, mimeImageBmp}, + {data32, sizeof(data32), mimeAppOctetStream, mimeImagePjpeg}, + {data33, sizeof(data33), mimeAppOctetStream, mimeImagePjpeg}, + {data34, sizeof(data34), mimeImageXPng, mimeImageXPng}, + {data35, sizeof(data35), mimeImageXPng, mimeImageXPng}, + {data36, sizeof(data36), mimeAppOctetStream, mimeImagePjpeg}, + {data37, sizeof(data37), mimeTextHtml, mimeImageXPng}, + {data38, sizeof(data38), mimeAppOctetStream, mimeImagePjpeg}, + {data39, sizeof(data39), mimeImageTiff, mimeImageTiff}, + {data40, sizeof(data40), mimeTextHtml, mimeImageTiff}, + {data41, sizeof(data41), mimeTextPlain, mimeTextPlain, mimeImageTiff}, + {data42, sizeof(data42), mimeTextPlain, mimeTextPlain}, + {data43, sizeof(data43), mimeAppOctetStream, mimeImagePjpeg}, + {data44, sizeof(data44), mimeVideoAvi, mimeVideoAvi}, + {data45, sizeof(data45), mimeTextPlain, mimeTextPlain}, + {data46, sizeof(data46), mimeTextPlain, mimeTextPlain}, + {data47, sizeof(data47), mimeTextPlain, mimeTextPlain}, + {data48, sizeof(data48), mimeTextHtml, mimeVideoAvi}, + {data49, sizeof(data49), mimeVideoAvi, mimeVideoAvi}, + {data50, sizeof(data50), mimeVideoMpeg, mimeVideoMpeg}, + {data51, sizeof(data51), mimeVideoMpeg, mimeVideoMpeg}, + {data52, sizeof(data52), mimeAppOctetStream, mimeImagePjpeg}, + {data53, sizeof(data53), mimeAppOctetStream, mimeImagePjpeg}, + {data54, sizeof(data54), mimeTextHtml, mimeVideoMpeg}, + {data55, sizeof(data55), mimeAppXGzip, mimeAppXGzip}, + {data56, sizeof(data56), mimeTextPlain, mimeTextPlain}, + {data57, sizeof(data57), mimeTextHtml, mimeAppXGzip}, + {data58, sizeof(data58), mimeAppOctetStream, mimeImagePjpeg}, + {data59, sizeof(data59), mimeAppXZip, mimeAppXZip}, + {data60, sizeof(data60), mimeTextPlain, mimeTextPlain}, + {data61, sizeof(data61), mimeTextHtml, mimeAppXZip}, + {data62, sizeof(data62), mimeAppJava, mimeAppJava}, + {data63, sizeof(data63), mimeTextPlain, mimeTextPlain}, + {data64, sizeof(data64), mimeTextHtml, mimeAppJava}, + {data65, sizeof(data65), mimeAppPdf, mimeAppPdf}, + {data66, sizeof(data66), mimeTextPlain, mimeTextPlain}, + {data67, sizeof(data67), mimeTextHtml, mimeAppPdf}, + {data68, sizeof(data68), mimeAppXMSDownload, mimeAppXMSDownload}, + {data69, sizeof(data69), mimeTextPlain, mimeTextPlain}, + {data70, sizeof(data70), mimeTextHtml, mimeAppXMSDownload}, + {data71, sizeof(data71), mimeTextRichtext, mimeTextRichtext}, + {data72, sizeof(data72), mimeTextPlain, mimeTextPlain}, + {data73, sizeof(data73), mimeTextPlain, mimeTextPlain}, + {data74, sizeof(data74), mimeTextHtml, mimeTextRichtext}, + {data75, sizeof(data75), mimeAudioWav, mimeAudioWav}, + {data76, sizeof(data76), mimeTextPlain, mimeTextPlain}, + {data77, sizeof(data77), mimeTextPlain, mimeTextPlain}, + {data78, sizeof(data78), mimeTextHtml, mimeTextPlain}, + {data79, sizeof(data79), mimeAppPostscript, mimeAppPostscript}, + {data80, sizeof(data80), mimeTextPlain, mimeTextPlain}, + {data81, sizeof(data81), mimeTextHtml, mimeAppPostscript}, + {data82, sizeof(data82), mimeAudioBasic, mimeAudioBasic}, + {data83, sizeof(data83), mimeTextPlain, mimeTextPlain}, + {data84, sizeof(data84), mimeTextHtml, mimeAudioBasic}, + {data85, sizeof(data85), mimeTextPlain, mimeTextPlain}, + {data86, sizeof(data86), mimeImageTiff, mimeImageTiff, mimeTextPlain}, + {data87, sizeof(data87), mimeTextPlain, mimeTextPlain}, + {data88, sizeof(data88), mimeTextHtml, mimeTextPlain}, + {data89, sizeof(data89), mimeTextHtml, mimeTextPlain}, + {data90, sizeof(data90), mimeTextHtml, mimeTextPlain}, + {data91, sizeof(data91), mimeTextXml, mimeTextPlain}, + {data92, sizeof(data92), mimeTextXml, mimeTextPlain}, + {data93, sizeof(data93), mimeTextXml, mimeTextPlain}, + {data94, sizeof(data94), mimeTextHtml, mimeTextPlain}, + {data95, sizeof(data95), mimeTextXml, mimeTextRichtext}, + {data96, sizeof(data96), mimeTextPlain, mimeTextPlain} }; static void test_FindMimeFromData(void) { HRESULT hres; LPWSTR mime; + BYTE b; int i; for(i=0; i -#include +//#include #include -#include "windef.h" -#include "winbase.h" -#include "ole2.h" -#include "urlmon.h" -#include "wininet.h" +//#include "windef.h" +//#include "winbase.h" +#include +#include +//#include "urlmon.h" +#include static HRESULT (WINAPI *pCoInternetGetSession)(DWORD, IInternetSession **, DWORD); static HRESULT (WINAPI *pReleaseBindInfo)(BINDINFO*); @@ -112,7 +117,6 @@ DEFINE_EXPECT(UnlockRequest); DEFINE_EXPECT(Abort); DEFINE_EXPECT(MimeFilter_CreateInstance); DEFINE_EXPECT(MimeFilter_Start); -DEFINE_EXPECT(MimeFilter_ReportProgress); DEFINE_EXPECT(MimeFilter_ReportData); DEFINE_EXPECT(MimeFilter_ReportResult); DEFINE_EXPECT(MimeFilter_Terminate); @@ -134,7 +138,8 @@ static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0}; static const WCHAR hostW[] = {'w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; static const WCHAR winehq_ipW[] = {'2','0','9','.','4','6','.','2','5','.','1','3','4',0}; static const WCHAR emptyW[] = {0}; -static const WCHAR gzipW[] = {'g','z','i','p',0}; +static const WCHAR pjpegW[] = {'i','m','a','g','e','/','p','j','p','e','g',0}; +static const WCHAR gifW[] = {'i','m','a','g','e','/','g','i','f',0}; static HRESULT expect_hrResult; static LPCWSTR file_name, http_url, expect_wsz; @@ -149,9 +154,10 @@ static void *expect_pv; static HANDLE event_complete, event_complete2, event_continue, event_continue_done; static BOOL binding_test; static PROTOCOLDATA protocoldata, *pdata, continue_protdata; -static DWORD prot_read, pi, filter_state, http_post_test, thread_id; +static DWORD prot_read, filter_state, http_post_test, thread_id; static BOOL security_problem, test_async_req, impl_protex; static BOOL async_read_pending, mimefilter_test, direct_read, wait_for_switch, emulate_prot, short_read, test_abort; +static BOOL empty_file, no_mime, bind_from_cache; enum { STATE_CONNECTING, @@ -200,7 +206,7 @@ static const char *debugstr_guid(REFIID riid) { static char buf[50]; - sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]); @@ -215,6 +221,13 @@ static int strcmp_wa(LPCWSTR strw, const char *stra) return lstrcmpA(stra, buf); } +static const char *w2a(LPCWSTR str) +{ + static char buf[INTERNET_MAX_URL_LENGTH]; + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + static HRESULT WINAPI HttpSecurity_QueryInterface(IHttpSecurity *iface, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IUnknown, riid) @@ -567,8 +580,6 @@ static void call_continue(PROTOCOLDATA *protocol_data) HRESULT hres; if(state == STATE_CONNECTING) { - if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) - CLEAR_CALLED(ReportProgress_COOKIE_SENT); if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST || tested_protocol == FTP_TEST) { if (http_is_first){ CLEAR_CALLED(ReportProgress_FINDINGRESOURCE); @@ -593,8 +604,9 @@ static void call_continue(PROTOCOLDATA *protocol_data) case STATE_STARTDOWNLOADING: if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) { SET_EXPECT(OnResponse); - if(tested_protocol == HTTPS_TEST || test_redirect || test_abort) + if(tested_protocol == HTTPS_TEST || test_redirect || test_abort || empty_file) SET_EXPECT(ReportProgress_ACCEPTRANGES); + SET_EXPECT(ReportProgress_ENCODING); SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); if(bindf & BINDF_NEEDFILE) SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -624,10 +636,11 @@ static void call_continue(PROTOCOLDATA *protocol_data) state = STATE_DOWNLOADING; if(tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST) { CHECK_CALLED(OnResponse); - if(tested_protocol == HTTPS_TEST) + if(tested_protocol == HTTPS_TEST || empty_file) CHECK_CALLED(ReportProgress_ACCEPTRANGES); - else if(test_redirect) + else if(test_redirect || test_abort) CLEAR_CALLED(ReportProgress_ACCEPTRANGES); + CLEAR_CALLED(ReportProgress_ENCODING); CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); if(bindf & BINDF_NEEDFILE) CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -667,12 +680,12 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL if(binding_test) { SetEvent(event_complete); - WaitForSingleObject(event_complete2, INFINITE); + ok( WaitForSingleObject(event_complete2, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); return S_OK; }if(direct_read) { continue_protdata = *pProtocolData; SetEvent(event_continue); - WaitForSingleObject(event_continue_done, INFINITE); + ok( WaitForSingleObject(event_continue_done, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); }else { call_continue(pProtocolData); SetEvent(event_complete); @@ -681,6 +694,63 @@ static HRESULT WINAPI ProtocolSink_Switch(IInternetProtocolSink *iface, PROTOCOL return S_OK; } +static const char *status_names[] = +{ + "0", + "FINDINGRESOURCE", + "CONNECTING", + "REDIRECTING", + "BEGINDOWNLOADDATA", + "DOWNLOADINGDATA", + "ENDDOWNLOADDATA", + "BEGINDOWNLOADCOMPONENTS", + "INSTALLINGCOMPONENTS", + "ENDDOWNLOADCOMPONENTS", + "USINGCACHEDCOPY", + "SENDINGREQUEST", + "CLASSIDAVAILABLE", + "MIMETYPEAVAILABLE", + "CACHEFILENAMEAVAILABLE", + "BEGINSYNCOPERATION", + "ENDSYNCOPERATION", + "BEGINUPLOADDATA", + "UPLOADINGDATA", + "ENDUPLOADINGDATA", + "PROTOCOLCLASSID", + "ENCODING", + "VERIFIEDMIMETYPEAVAILABLE", + "CLASSINSTALLLOCATION", + "DECODING", + "LOADINGMIMEHANDLER", + "CONTENTDISPOSITIONATTACH", + "FILTERREPORTMIMETYPE", + "CLSIDCANINSTANTIATE", + "IUNKNOWNAVAILABLE", + "DIRECTBIND", + "RAWMIMETYPE", + "PROXYDETECTING", + "ACCEPTRANGES", + "COOKIE_SENT", + "COMPACT_POLICY_RECEIVED", + "COOKIE_SUPPRESSED", + "COOKIE_STATE_UNKNOWN", + "COOKIE_STATE_ACCEPT", + "COOKIE_STATE_REJECT", + "COOKIE_STATE_PROMPT", + "COOKIE_STATE_LEASH", + "COOKIE_STATE_DOWNGRADE", + "POLICY_HREF", + "P3P_HEADER", + "SESSION_COOKIE_RECEIVED", + "PERSISTENT_COOKIE_RECEIVED", + "SESSION_COOKIES_ALLOWED", + "CACHECONTROL", + "CONTENTDISPOSITIONFILENAME", + "MIMETEXTPLAINMISMATCH", + "PUBLISHERAVAILABLE", + "DISPLAYNAMEAVAILABLE" +}; + static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText) { @@ -688,9 +758,14 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, '0','0','0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0','0','}',0}; static const WCHAR text_plain[] = {'t','e','x','t','/','p','l','a','i','n',0}; + if (ulStatusCode < sizeof(status_names)/sizeof(status_names[0])) + trace( "progress: %s %s\n", status_names[ulStatusCode], wine_dbgstr_w(szStatusText) ); + else + trace( "progress: %u %s\n", ulStatusCode, wine_dbgstr_w(szStatusText) ); + switch(ulStatusCode) { case BINDSTATUS_MIMETYPEAVAILABLE: - CHECK_EXPECT(ReportProgress_MIMETYPEAVAILABLE); + CHECK_EXPECT2(ReportProgress_MIMETYPEAVAILABLE); if(tested_protocol != FILE_TEST && tested_protocol != ITS_TEST && !mimefilter_test && (pi & PI_MIMEVERIFICATION)) { if(!short_read || !direct_read) CHECK_CALLED(Read); /* set in Continue */ @@ -700,11 +775,18 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, ok(szStatusText != NULL, "szStatusText == NULL\n"); if(szStatusText) { if(tested_protocol == BIND_TEST) - ok(szStatusText == expect_wsz, "unexpected szStatusText\n"); + ok(!lstrcmpW(szStatusText, expect_wsz), "unexpected szStatusText %s\n", wine_dbgstr_w(szStatusText)); else if (http_post_test) ok(lstrlenW(text_plain) <= lstrlenW(szStatusText) && !memcmp(szStatusText, text_plain, lstrlenW(text_plain)*sizeof(WCHAR)), "szStatusText != text/plain\n"); + else if(empty_file) + ok(!strcmp_wa(szStatusText, "application/javascript"), "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); + else if((pi & PI_MIMEVERIFICATION) && emulate_prot && !mimefilter_test + && tested_protocol==HTTP_TEST && !short_read) + ok(lstrlenW(gifW) <= lstrlenW(szStatusText) && + !memcmp(szStatusText, gifW, lstrlenW(gifW)*sizeof(WCHAR)), + "szStatusText != image/gif\n"); else if(!mimefilter_test) ok(lstrlenW(text_htmlW) <= lstrlenW(szStatusText) && !memcmp(szStatusText, text_htmlW, lstrlenW(text_htmlW)*sizeof(WCHAR)), @@ -755,7 +837,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, CHECK_EXPECT(ReportProgress_VERIFIEDMIMETYPEAVAILABLE); ok(szStatusText != NULL, "szStatusText == NULL\n"); if(szStatusText) - ok(!lstrcmpW(szStatusText, text_htmlW), "szStatusText != text/html\n"); + ok(!strcmp_wa(szStatusText, "text/html"), "szStatusText != text/html\n"); break; case BINDSTATUS_PROTOCOLCLASSID: CHECK_EXPECT(ReportProgress_PROTOCOLCLASSID); @@ -763,7 +845,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, ok(!lstrcmpW(szStatusText, null_guid), "unexpected classid %s\n", wine_dbgstr_w(szStatusText)); break; case BINDSTATUS_COOKIE_SENT: - CHECK_EXPECT(ReportProgress_COOKIE_SENT); + CHECK_EXPECT2(ReportProgress_COOKIE_SENT); ok(szStatusText == NULL, "szStatusText != NULL\n"); break; case BINDSTATUS_REDIRECTING: @@ -782,8 +864,9 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, ok(!szStatusText, "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); break; case BINDSTATUS_PROXYDETECTING: - CHECK_EXPECT(ReportProgress_PROXYDETECTING); - SET_EXPECT(ReportProgress_CONNECTING); + if(!called_ReportProgress_PROXYDETECTING) + SET_EXPECT(ReportProgress_CONNECTING); + CHECK_EXPECT2(ReportProgress_PROXYDETECTING); ok(!szStatusText, "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); break; case BINDSTATUS_LOADINGMIMEHANDLER: @@ -792,7 +875,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, break; case BINDSTATUS_DECODING: CHECK_EXPECT(ReportProgress_DECODING); - ok(!lstrcmpW(szStatusText, gzipW), "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); + ok(!lstrcmpW(szStatusText, pjpegW), "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); break; default: ok(0, "Unexpected status %d\n", ulStatusCode); @@ -822,6 +905,12 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR "grcfBSCF = %08x\n", grfBSCF); else ok(grfBSCF == (BSCF_FIRSTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE), "grcfBSCF = %08x\n", grfBSCF); + }else if(bind_from_cache) { + CHECK_EXPECT(ReportData); + + ok(grfBSCF == (BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE), "grcfBSCF = %08x\n", grfBSCF); + ok(ulProgress == 1000, "ulProgress = %u\n", ulProgress); + ok(!ulProgressMax, "ulProgressMax = %u\n", ulProgressMax); }else if(direct_read) { BYTE buf[14096]; ULONG read; @@ -870,7 +959,6 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR if(!emulate_prot) CHECK_CALLED(ReportData2); CHECK_CALLED(ReportResult); - ok(hres == S_OK, "Read failed: %08x\n", hres); reported_all_data = TRUE; }else { if(!emulate_prot) @@ -896,14 +984,25 @@ static HRESULT WINAPI ProtocolSink_ReportData(IInternetProtocolSink *iface, DWOR } }else if(!binding_test && (tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST || tested_protocol == FTP_TEST)) { - if(!(grfBSCF & BSCF_LASTDATANOTIFICATION) || (grfBSCF & BSCF_DATAFULLYAVAILABLE)) + if(empty_file) + CHECK_EXPECT2(ReportData); + else if(!(grfBSCF & BSCF_LASTDATANOTIFICATION) || (grfBSCF & BSCF_DATAFULLYAVAILABLE)) CHECK_EXPECT(ReportData); else if (http_post_test) ok(ulProgress == 13, "Read %u bytes instead of 13\n", ulProgress); - ok(ulProgress, "ulProgress == 0\n"); + if(empty_file) { + ok(!ulProgress, "ulProgress = %d\n", ulProgress); + ok(!ulProgressMax, "ulProgressMax = %d\n", ulProgressMax); + }else { + ok(ulProgress, "ulProgress == 0\n"); + } - if(first_data_notif) { + if(empty_file) { + ok(grfBSCF == (BSCF_FIRSTDATANOTIFICATION|BSCF_LASTDATANOTIFICATION), + "grcfBSCF = %08x\n", grfBSCF); + first_data_notif = FALSE; + }else if(first_data_notif) { ok(grfBSCF == BSCF_FIRSTDATANOTIFICATION || grfBSCF == (BSCF_LASTDATANOTIFICATION|BSCF_DATAFULLYAVAILABLE), "grcfBSCF = %08x\n", grfBSCF); @@ -1028,7 +1127,20 @@ static HRESULT WINAPI MimeProtocolSink_Switch(IInternetProtocolSink *iface, PROT static HRESULT WINAPI MimeProtocolSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText) { - CHECK_EXPECT(MimeFilter_ReportProgress); + switch(ulStatusCode) { + case BINDSTATUS_LOADINGMIMEHANDLER: + /* + * IE9 for some reason (bug?) calls this on mime handler's protocol sink instead of the + * main protocol sink. We check ReportProgress_LOADINGMIMEHANDLER both here and in + * ProtocolSink_ReportProgress to workaround it. + */ + CHECK_EXPECT(ReportProgress_LOADINGMIMEHANDLER); + ok(!szStatusText, "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); + break; + default: + ok(0, "Unexpected status code %d\n", ulStatusCode); + } + return S_OK; } @@ -1038,10 +1150,11 @@ static HRESULT WINAPI MimeProtocolSink_ReportData(IInternetProtocolSink *iface, DWORD read = 0; BYTE buf[8192]; HRESULT hres; + BOOL report_mime = FALSE; CHECK_EXPECT(MimeFilter_ReportData); - if(!filter_state) { + if(!filter_state && !no_mime) { SET_EXPECT(Read); hres = IInternetProtocol_Read(filtered_protocol, buf, sizeof(buf), &read); if(tested_protocol == HTTP_TEST) @@ -1055,15 +1168,34 @@ static HRESULT WINAPI MimeProtocolSink_ReportData(IInternetProtocolSink *iface, ok(hres == S_OK, "ReportProgress failed: %08x\n", hres); CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); + SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); + hres = IInternetProtocolSink_ReportProgress(filtered_sink, BINDSTATUS_MIMETYPEAVAILABLE, text_htmlW); + ok(hres == S_OK, "ReportProgress failed: %08x\n", hres); + CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); + /* FIXME: test BINDSTATUS_CACHEFILENAMEAVAILABLE */ } - if(!read_report_data) + if(no_mime && prot_read<200) { + SET_EXPECT(Read); + }else if(no_mime && prot_read<300) { + report_mime = TRUE; + SET_EXPECT(Read); + SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); SET_EXPECT(ReportData); + }else if(!read_report_data) { + SET_EXPECT(ReportData); + } hres = IInternetProtocolSink_ReportData(filtered_sink, grfBSCF, ulProgress, ulProgressMax); ok(hres == S_OK, "ReportData failed: %08x\n", hres); - if(!read_report_data) + if(no_mime && prot_read<=200) { + CHECK_CALLED(Read); + }else if(report_mime) { + CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); CHECK_CALLED(ReportData); + }else if(!read_report_data) { + CHECK_CALLED(ReportData); + } if(!filter_state) filter_state = 1; @@ -1352,6 +1484,8 @@ static HRESULT WINAPI Protocol_Seek(IInternetProtocolEx *iface, static HRESULT WINAPI ProtocolEmul_QueryInterface(IInternetProtocolEx *iface, REFIID riid, void **ppv) { + static const IID unknown_iid = {0x7daf9908,0x8415,0x4005,{0x95,0xae, 0xbd,0x27,0xf6,0xe3,0xdc,0x00}}; + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IInternetProtocol, riid)) { *ppv = iface; return S_OK; @@ -1383,7 +1517,8 @@ static HRESULT WINAPI ProtocolEmul_QueryInterface(IInternetProtocolEx *iface, RE return E_NOINTERFACE; } - ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + if(!IsEqualGUID(riid, &unknown_iid)) /* IE10 */ + ok(0, "unexpected riid %s\n", debugstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; } @@ -1583,14 +1718,14 @@ static void protocol_start(IInternetProtocolSink *pOIProtSink, IInternetBindInfo } SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE, - mimefilter_test ? gzipW : (expect_wsz = text_htmlW)); + mimefilter_test ? pjpegW : (expect_wsz = text_htmlW)); ok(hres == S_OK, "ReportProgress(BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE) failed: %08x\n", hres); if(mimefilter_test) { CHECK_CALLED(MimeFilter_CreateInstance); CHECK_CALLED(MimeFilter_Start); CHECK_CALLED(ReportProgress_LOADINGMIMEHANDLER); - todo_wine CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); + CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); }else { CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); } @@ -1698,7 +1833,7 @@ static HRESULT WINAPI ProtocolEmul_Continue(IInternetProtocolEx *iface, SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); } hres = IInternetProtocolSink_ReportProgress(binding_sink, - BINDSTATUS_MIMETYPEAVAILABLE, mimefilter_test ? gzipW : text_htmlW); + BINDSTATUS_MIMETYPEAVAILABLE, mimefilter_test ? pjpegW : text_htmlW); if(mimefilter_test) { CHECK_CALLED(MimeFilter_CreateInstance); CHECK_CALLED(MimeFilter_Start); @@ -1719,14 +1854,15 @@ static HRESULT WINAPI ProtocolEmul_Continue(IInternetProtocolEx *iface, } pr = prot_read; - if(mimefilter_test) { + if(mimefilter_test) SET_EXPECT(MimeFilter_ReportData); - }else if(pi & PI_MIMEVERIFICATION) { + if((!mimefilter_test || no_mime) && (pi & PI_MIMEVERIFICATION)) { if(pr < 200) SET_EXPECT(Read); /* checked in ReportData for short_read */ if(pr == 200) { if(!mimefilter_test) SET_EXPECT(Read); /* checked in BINDSTATUS_MIMETYPEAVAILABLE or ReportData */ + SET_EXPECT(GetBindInfo); SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); } if(pr >= 200) @@ -1744,6 +1880,7 @@ static HRESULT WINAPI ProtocolEmul_Continue(IInternetProtocolEx *iface, if(!short_read && pr < 200) CHECK_CALLED(Read); if(pr == 200) { + CLEAR_CALLED(GetBindInfo); /* IE9 */ CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); } }else { @@ -1801,6 +1938,7 @@ static HRESULT WINAPI ProtocolEmul_Read(IInternetProtocolEx *iface, void *pv, prot_state = 4; if(short_read) { SET_EXPECT(Read2); /* checked in BINDSTATUS_MIMETYPEAVAILABLE */ + SET_EXPECT(GetBindInfo); SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); } if(mimefilter_test) @@ -1812,8 +1950,10 @@ static HRESULT WINAPI ProtocolEmul_Read(IInternetProtocolEx *iface, void *pv, BSCF_LASTDATANOTIFICATION|BSCF_INTERMEDIATEDATANOTIFICATION, 0, 0); read_report_data--; ok(hres == S_OK, "ReportData failed: %08x\n", hres); - if(short_read) + if(short_read) { + CLEAR_CALLED(GetBindInfo); /* IE9 */ CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); + } if(mimefilter_test) CHECK_CALLED(MimeFilter_ReportData); else if(direct_read) @@ -1830,8 +1970,12 @@ static HRESULT WINAPI ProtocolEmul_Read(IInternetProtocolEx *iface, void *pv, else CHECK_CALLED(ReportResult); - memset(pv, 'x', 100); - prot_read += *pcbRead = 100; + if(cb > 100) + cb = 100; + memset(pv, 'x', cb); + if(cb>6) + memcpy(pv, "gif87a", 6); + prot_read += *pcbRead = cb; return S_OK; }if(prot_state == 4) { *pcbRead = 0; @@ -1843,8 +1987,12 @@ static HRESULT WINAPI ProtocolEmul_Read(IInternetProtocolEx *iface, void *pv, return tested_protocol == HTTP_TEST || tested_protocol == HTTPS_TEST ? E_PENDING : S_FALSE; } - memset(pv, 'x', 100); - prot_read += *pcbRead = 100; + if(cb > 100) + cb = 100; + memset(pv, 'x', cb); + if(cb>6) + memcpy(pv, "gif87a", 6); + prot_read += *pcbRead = cb; return S_OK; } @@ -1920,7 +2068,7 @@ static HRESULT WINAPI MimeProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szU CHECK_EXPECT(MimeFilter_Start); - ok(!lstrcmpW(szUrl, gzipW), "wrong url %s\n", wine_dbgstr_w(szUrl)); + ok(!lstrcmpW(szUrl, pjpegW), "wrong url %s\n", wine_dbgstr_w(szUrl)); ok(grfPI == (PI_FILTER_MODE|PI_FORCE_ASYNC), "grfPI=%x, expected PI_FILTER_MODE|PI_FORCE_ASYNC\n", grfPI); ok(dwReserved, "dwReserved == 0\n"); ok(pOIProtSink != NULL, "pOIProtSink == NULL\n"); @@ -1964,7 +2112,7 @@ static HRESULT WINAPI MimeProtocol_Start(IInternetProtocolEx *iface, LPCWSTR szU filtered_sink = pOIProtSink; SET_EXPECT(ReportProgress_DECODING); - hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_DECODING, gzipW); + hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_DECODING, pjpegW); ok(hres == S_OK, "ReportProgress(BINDSTATUS_DECODING) failed: %08x\n", hres); CHECK_CALLED(ReportProgress_DECODING); @@ -2169,22 +2317,27 @@ static IClassFactory mimefilter_cf = { &MimeFilterCFVtbl }; #define TEST_ASYNCREQ 0x0200 #define TEST_USEIURI 0x0400 #define TEST_IMPLPROTEX 0x0800 +#define TEST_EMPTY 0x1000 +#define TEST_NOMIME 0x2000 +#define TEST_FROMCACHE 0x4000 static void register_filter(BOOL do_register) { IInternetSession *session; HRESULT hres; - static const WCHAR gzipW[] = {'g','z','i','p',0}; - hres = pCoInternetGetSession(0, &session, 0); ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres); if(do_register) { - hres = IInternetSession_RegisterMimeFilter(session, &mimefilter_cf, &IID_IInternetProtocol, gzipW); + hres = IInternetSession_RegisterMimeFilter(session, &mimefilter_cf, &IID_IInternetProtocol, pjpegW); + ok(hres == S_OK, "RegisterMimeFilter failed: %08x\n", hres); + hres = IInternetSession_RegisterMimeFilter(session, &mimefilter_cf, &IID_IInternetProtocol, gifW); ok(hres == S_OK, "RegisterMimeFilter failed: %08x\n", hres); }else { - hres = IInternetSession_UnregisterMimeFilter(session, &mimefilter_cf, gzipW); + hres = IInternetSession_UnregisterMimeFilter(session, &mimefilter_cf, pjpegW); + ok(hres == S_OK, "RegisterMimeFilter failed: %08x\n", hres); + hres = IInternetSession_UnregisterMimeFilter(session, &mimefilter_cf, gifW); ok(hres == S_OK, "RegisterMimeFilter failed: %08x\n", hres); } @@ -2200,6 +2353,7 @@ static void init_test(int prot, DWORD flags) prot_state = 0; async_read_pending = TRUE; mimefilter_test = (flags & TEST_FILTER) != 0; + no_mime = (flags & TEST_NOMIME) != 0; filter_state = 0; post_stream_read = 0; ResetEvent(event_complete); @@ -2220,6 +2374,8 @@ static void init_test(int prot, DWORD flags) test_redirect = (flags & TEST_REDIRECT) != 0; test_abort = (flags & TEST_ABORT) != 0; impl_protex = (flags & TEST_IMPLPROTEX) != 0; + empty_file = (flags & TEST_EMPTY) != 0; + bind_from_cache = (flags & TEST_FROMCACHE) != 0; register_filter(mimefilter_test); } @@ -2304,7 +2460,7 @@ static BOOL file_protocol_start(IInternetProtocol *protocol, LPCWSTR url, CHECK_CALLED(GetBindInfo); if(!(bindf & BINDF_FROMURLMON)) - CHECK_CALLED(ReportProgress_DIRECTBIND); + CLEAR_CALLED(ReportProgress_DIRECTBIND); /* Not called by IE10 */ if(is_first) { CHECK_CALLED(ReportProgress_SENDINGREQUEST); CHECK_CALLED(ReportProgress_CACHEFILENAMEAVAILABLE); @@ -2431,6 +2587,24 @@ static void test_file_protocol_url(LPCWSTR url) IUri_Release(uri); IInternetProtocolEx_Release(protocolex); + + hres = pCreateUri(url, 0, 0, &uri); + ok(hres == S_OK, "CreateUri failed: %08x\n", hres); + + hres = IClassFactory_CreateInstance(factory, NULL, &IID_IInternetProtocolEx, (void**)&protocolex); + ok(hres == S_OK, "Could not get IInternetProtocolEx: %08x\n", hres); + + if(file_protocol_start(NULL, NULL, protocolex, uri, TRUE)) { + hres = IInternetProtocolEx_Read(protocolex, buf, 2, &cb); + ok(hres == S_OK, "Read failed: %08x\n", hres); + hres = IInternetProtocolEx_LockRequest(protocolex, 0); + ok(hres == S_OK, "LockRequest failed: %08x\n", hres); + hres = IInternetProtocolEx_UnlockRequest(protocolex); + ok(hres == S_OK, "UnlockRequest failed: %08x\n", hres); + } + + IUri_Release(uri); + IInternetProtocolEx_Release(protocolex); }else { win_skip("Skipping file protocol StartEx tests\n"); } @@ -2604,6 +2778,51 @@ static void test_file_protocol(void) { test_file_protocol_fail(); } +static void create_cache_entry(const WCHAR *urlw) +{ + FILETIME now, tomorrow, yesterday; + char file_path[MAX_PATH]; + BYTE content[1000]; + ULARGE_INTEGER li; + const char *url; + HANDLE file; + DWORD size; + unsigned i; + BOOL res; + + BYTE cache_headers[] = "HTTP/1.1 200 OK\r\n\r\n"; + + trace("Testing cache read...\n"); + + url = w2a(urlw); + + for(i = 0; i < sizeof(content); i++) + content[i] = '0' + (i%10); + + GetSystemTimeAsFileTime(&now); + li.u.HighPart = now.dwHighDateTime; + li.u.LowPart = now.dwLowDateTime; + li.QuadPart += (LONGLONG)10000000 * 3600 * 24; + tomorrow.dwHighDateTime = li.u.HighPart; + tomorrow.dwLowDateTime = li.u.LowPart; + li.QuadPart -= (LONGLONG)10000000 * 3600 * 24 * 2; + yesterday.dwHighDateTime = li.u.HighPart; + yesterday.dwLowDateTime = li.u.LowPart; + + res = CreateUrlCacheEntryA(url, sizeof(content), "", file_path, 0); + ok(res, "CreateUrlCacheEntryA failed: %u\n", GetLastError()); + + file = CreateFileA(file_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + ok(file != INVALID_HANDLE_VALUE, "CreateFile failed\n"); + + WriteFile(file, content, sizeof(content), &size, NULL); + CloseHandle(file); + + res = CommitUrlCacheEntryA(url, file_path, tomorrow, yesterday, NORMAL_CACHE_ENTRY, + cache_headers, sizeof(cache_headers)-1, "", 0); + ok(res, "CommitUrlCacheEntryA failed: %u\n", GetLastError()); +} + static BOOL http_protocol_start(LPCWSTR url, BOOL use_iuri) { static BOOL got_user_agent = FALSE; @@ -2629,6 +2848,11 @@ static BOOL http_protocol_start(LPCWSTR url, BOOL use_iuri) if(http_post_test == TYMED_ISTREAM) SET_EXPECT(Stream_Seek); } + if(bind_from_cache) { + SET_EXPECT(OnResponse); + SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); + SET_EXPECT(ReportData); + } if(uri) { IInternetProtocolEx *protocolex; @@ -2666,6 +2890,11 @@ static BOOL http_protocol_start(LPCWSTR url, BOOL use_iuri) if(http_post_test == TYMED_ISTREAM) CHECK_CALLED(Stream_Seek); } + if(bind_from_cache) { + CHECK_CALLED(OnResponse); + CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); + CHECK_CALLED(ReportData); + } return TRUE; } @@ -2725,6 +2954,9 @@ static void test_http_protocol_url(LPCWSTR url, int prot, DWORD flags, DWORD tym http_url = url; http_post_test = tymed; + if(flags & TEST_FROMCACHE) + create_cache_entry(url); + hres = CoGetClassObject(prot == HTTPS_TEST ? &CLSID_HttpSProtocol : &CLSID_HttpProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); ok(hres == S_OK, "CoGetClassObject failed: %08x\n", hres); @@ -2774,27 +3006,43 @@ static void test_http_protocol_url(LPCWSTR url, int prot, DWORD flags, DWORD tym SET_EXPECT(Switch); } - if(!http_protocol_start(url, (flags & TEST_USEIURI) != 0)) + if(!http_protocol_start(url, (flags & TEST_USEIURI) != 0)) { + IInternetProtocol_Abort(async_protocol, E_ABORT, 0); + IInternetProtocol_Release(async_protocol); return; + } - if(!direct_read && !test_abort) + if(!direct_read && !test_abort && !bind_from_cache) SET_EXPECT(ReportResult); expect_hrResult = test_abort ? E_ABORT : S_OK; if(direct_read) { SET_EXPECT(Switch); while(wait_for_switch) { - WaitForSingleObject(event_continue, INFINITE); + ok( WaitForSingleObject(event_continue, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); CHECK_CALLED(Switch); /* Set in ReportData */ call_continue(&continue_protdata); SetEvent(event_continue_done); } + }else if(bind_from_cache) { + BYTE buf[1500]; + + hres = IInternetProtocol_Read(async_protocol, buf, 100, &cb); + ok(hres == S_OK && cb == 100, "Read failed: %08x (%d bytes)\n", hres, cb); + + SET_EXPECT(ReportResult); + hres = IInternetProtocol_Read(async_protocol, buf, sizeof(buf), &cb); + ok(hres == S_OK && cb == 900, "Read failed: %08x (%d bytes)\n", hres, cb); + CHECK_CALLED(ReportResult); + + hres = IInternetProtocol_Read(async_protocol, buf, sizeof(buf), &cb); + ok(hres == S_FALSE && !cb, "Read failed: %08x (%d bytes)\n", hres, cb); }else { hres = IInternetProtocol_Read(async_protocol, buf, 1, &cb); ok((hres == E_PENDING && cb==0) || (hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb); - WaitForSingleObject(event_complete, INFINITE); + ok( WaitForSingleObject(event_complete, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(bindf & BINDF_FROMURLMON) CHECK_CALLED(Switch); else @@ -2812,7 +3060,7 @@ static void test_http_protocol_url(LPCWSTR url, int prot, DWORD flags, DWORD tym hres = IInternetProtocol_Read(async_protocol, buf, 1, &cb); ok((hres == E_PENDING && cb==0) || (hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb); - WaitForSingleObject(event_complete, INFINITE); + ok( WaitForSingleObject(event_complete, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(bindf & BINDF_FROMURLMON) CHECK_CALLED(Switch); else @@ -2846,6 +3094,9 @@ static void test_http_protocol_url(LPCWSTR url, int prot, DWORD flags, DWORD tym if(prot == HTTPS_TEST) CLEAR_CALLED(ReportProgress_SENDINGREQUEST); + if (prot == HTTP_TEST || prot == HTTPS_TEST) + CLEAR_CALLED(ReportProgress_COOKIE_SENT); + hres = IInternetProtocol_Abort(async_protocol, E_ABORT, 0); ok(hres == INET_E_RESULT_DISPATCHED, "Abort failed: %08x\n", hres); @@ -2859,6 +3110,13 @@ static void test_http_protocol_url(LPCWSTR url, int prot, DWORD flags, DWORD tym } IClassFactory_Release(factory); + + if(flags & TEST_FROMCACHE) { + BOOL res; + + res = DeleteUrlCacheEntryW(url); + ok(res, "DeleteUrlCacheEntryA failed: %u\n", GetLastError()); + } } static void test_http_protocol(void) @@ -2872,6 +3130,13 @@ static void test_http_protocol(void) static const WCHAR winetest_url[] = {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/', 't','e','s','t','s','/','d','a','t','a','.','p','h','p',0}; + static const WCHAR empty_url[] = + {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/', + 't','e','s','t','s','/','e','m','p','t','y','.','j','s',0}; + static const WCHAR cache_only_url[] = + {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/', + 't','e','s','t','s','/','c','a','c','h','e','-','o','n','l','y',0}; + trace("Testing http protocol (not from urlmon)...\n"); bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; @@ -2897,10 +3162,26 @@ static void test_http_protocol(void) test_http_protocol_url(winetest_url, HTTP_TEST, TEST_DIRECT_READ|TEST_USEIURI, TYMED_NULL); trace("Testing http protocol (redirected)...\n"); - bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON; + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; test_http_protocol_url(redirect_url, HTTP_TEST, TEST_REDIRECT, TYMED_NULL); + trace("Testing http protocol empty file...\n"); + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; + test_http_protocol_url(empty_url, HTTP_TEST, TEST_EMPTY, TYMED_NULL); + + /* This is a bit ugly. We unconditionally disable this test on Wine. This won't work until we have + * support for reading from cache via HTTP layer in wininet. Until then, Wine will fail badly, affecting + * other, unrelated, tests. Working around it is not worth the trouble, we may simply make sure those + * tests work on Windows and have them around for the future. + */ + if(broken(1)) { + trace("Testing http protocol (from cache)...\n"); + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON; + test_http_protocol_url(cache_only_url, HTTP_TEST, TEST_FROMCACHE, TYMED_NULL); + } + trace("Testing http protocol abort...\n"); + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; test_http_protocol_url(winetest_url, HTTP_TEST, TEST_ABORT, TYMED_NULL); test_early_abort(&CLSID_HttpProtocol); @@ -2935,10 +3216,10 @@ static void test_ftp_protocol(void) trace("Testing ftp protocol...\n"); + init_test(FTP_TEST, 0); + bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA | BINDF_FROMURLMON | BINDF_NOWRITECACHE; state = STATE_STARTDOWNLOADING; - tested_protocol = FTP_TEST; - first_data_notif = TRUE; expect_hrResult = E_PENDING; hres = CoGetClassObject(&CLSID_FtpProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk); @@ -2979,12 +3260,16 @@ static void test_ftp_protocol(void) ok((hres == E_PENDING && cb==0) || (hres == S_OK && cb==1), "Read failed: %08x (%d bytes)\n", hres, cb); - WaitForSingleObject(event_complete, INFINITE); + ok( WaitForSingleObject(event_complete, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); while(1) { hres = IInternetProtocol_Read(async_protocol, buf, sizeof(buf), &cb); if(hres == E_PENDING) - WaitForSingleObject(event_complete, INFINITE); + { + DWORD ret = WaitForSingleObject(event_complete, 90000); + ok( ret == WAIT_OBJECT_0, "wait timed out\n" ); + if (ret != WAIT_OBJECT_0) break; + } else if(cb == 0) break; } @@ -3362,7 +3647,7 @@ static void test_binding(int prot, DWORD grf_pi, DWORD test_flags) if(prot == HTTP_TEST || prot == HTTPS_TEST) { while(prot_state < 4) { - WaitForSingleObject(event_complete, INFINITE); + ok( WaitForSingleObject(event_complete, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(mimefilter_test && filtered_protocol) { SET_EXPECT(Continue); IInternetProtocol_Continue(filtered_protocol, pdata); @@ -3387,7 +3672,7 @@ static void test_binding(int prot, DWORD grf_pi, DWORD test_flags) } if(direct_read) CHECK_CALLED(ReportData); /* Set in ReportResult */ - WaitForSingleObject(event_complete, INFINITE); + ok( WaitForSingleObject(event_complete, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); }else { if(mimefilter_test) SET_EXPECT(MimeFilter_LockRequest); @@ -3471,7 +3756,10 @@ START_TEST(protocol) test_file_protocol(); test_http_protocol(); - test_https_protocol(); + if(pCreateUri) + test_https_protocol(); + else + win_skip("Skipping https tests on too old platform\n"); test_ftp_protocol(); test_gopher_protocol(); test_mk_protocol(); @@ -3490,6 +3778,8 @@ START_TEST(protocol) test_binding(FILE_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT|TEST_FILTER); trace("Testing http binding (mime verification, emulate prot, mime filter)...\n"); test_binding(HTTP_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT|TEST_FILTER); + trace("Testing http binding (mime verification, emulate prot, mime filter, no mime)...\n"); + test_binding(HTTP_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT|TEST_FILTER|TEST_NOMIME); trace("Testing http binding (mime verification, emulate prot, direct read)...\n"); test_binding(HTTP_TEST, PI_MIMEVERIFICATION, TEST_EMULATEPROT|TEST_DIRECT_READ); trace("Testing http binding (mime verification, emulate prot, abort)...\n"); diff --git a/rostests/winetests/urlmon/sec_mgr.c b/rostests/winetests/urlmon/sec_mgr.c index c64dfe40f01..c82e91e1139 100644 --- a/rostests/winetests/urlmon/sec_mgr.c +++ b/rostests/winetests/urlmon/sec_mgr.c @@ -18,6 +18,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #define NONAMELESSUNION @@ -26,16 +30,18 @@ #define _WIN32_IE 0x0700 #include -#include -#include +//#include +//#include #include -#include "windef.h" -#include "winbase.h" -#include "ole2.h" -#include "urlmon.h" +//#include "windef.h" +//#include "winbase.h" +#include +#include +#include +//#include "urlmon.h" -#include "initguid.h" +//#include "initguid.h" #define URLZONE_CUSTOM URLZONE_USER_MIN+1 #define URLZONE_CUSTOM2 URLZONE_CUSTOM+1 @@ -70,6 +76,7 @@ DEFINE_EXPECT(ParseUrl_SECURITY_URL_input2); DEFINE_EXPECT(ParseUrl_SECURITY_URL_expected); DEFINE_EXPECT(ParseUrl_SECURITY_URL_http); DEFINE_EXPECT(ParseUrl_SECURITY_DOMAIN_expected); +DEFINE_EXPECT(ProcessUrlAction); static HRESULT (WINAPI *pCoInternetCreateSecurityManager)(IServiceProvider *, IInternetSecurityManager**, DWORD); static HRESULT (WINAPI *pCoInternetCreateZoneManager)(IServiceProvider *, IInternetZoneManager**, DWORD); @@ -77,6 +84,9 @@ static HRESULT (WINAPI *pCoInternetGetSecurityUrl)(LPCWSTR, LPWSTR*, PSUACTION, static HRESULT (WINAPI *pCoInternetGetSecurityUrlEx)(IUri*, IUri**, PSUACTION, DWORD_PTR); static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**); static HRESULT (WINAPI *pCoInternetGetSession)(DWORD, IInternetSession**, DWORD); +static HRESULT (WINAPI *pCoInternetIsFeatureEnabled)(INTERNETFEATURELIST, DWORD); +static HRESULT (WINAPI *pCoInternetIsFeatureEnabledForUrl)(INTERNETFEATURELIST, DWORD, LPCWSTR, IInternetSecurityManager*); +static HRESULT (WINAPI *pCoInternetIsFeatureZoneElevationEnabled)(LPCWSTR, LPCWSTR, IInternetSecurityManager*, DWORD); static const WCHAR url1[] = {'r','e','s',':','/','/','m','s','h','t','m','l','.','d','l','l', '/','b','l','a','n','k','.','h','t','m',0}; @@ -94,6 +104,14 @@ static const WCHAR url9[] = {'h','t','t','p',':','/','/','w','w','w','.','z','o' '.','w','i','n','e','t','e','s','t', '/','s','i','t','e','/','a','b','o','u','t',0}; static const WCHAR url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2','0','f','i','l','e', '.','j','p','g',0}; +static const WCHAR url11[] = {'f','i','l','e',':','/','/','c',':','/','I','n','d','e','x','.','h','t','m',0}; +static const WCHAR url12[] = {'f','i','l','e',':','/','/','/','c',':','/','I','n','d','e','x','.','h','t','m',0}; +static const WCHAR url13[] = {'h','t','t','p',':','g','o','o','g','l','e','.','c','o','m',0}; +static const WCHAR url14[] = {'z','i','p',':','t','e','s','t','i','n','g','.','c','o','m','/','t','e','s','t','i','n','g',0}; +static const WCHAR url15[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e','.','c','o','m','.','u','k',0}; +static const WCHAR url16[] = {'f','i','l','e',':','/','/','/','c',':',0}; +static const WCHAR url17[] = {'f','i','l','e',':','/','/','/','c',':','c','\\',0}; +static const WCHAR url18[] = {'c',':','\\','t','e','s','t','.','h','t','m',0}; static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e', '.','j','p','g',0}; @@ -108,6 +126,7 @@ static const char *szZoneMapDomainsKey = "Software\\Microsoft\\Windows\\CurrentV static const char *szInternetSettingsKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; static const BYTE secid1[] = {'f','i','l','e',':',0,0,0,0}; +static const BYTE secid2[] = {'*',':','i','n','d','e','x','.','h','t','m',3,0,0,0}; static const BYTE secid5[] = {'h','t','t','p',':','w','w','w','.','z','o','n','e','3', '.','w','i','n','e','t','e','s','t',3,0,0,0}; static const BYTE secid6[] = {'a','b','o','u','t',':','b','l','a','n','k',3,0,0,0}; @@ -115,8 +134,12 @@ static const BYTE secid7[] = {'f','t','p',':','z','o','n','e','3', '.','w','i','n','e','t','e','s','t',3,0,0,0}; static const BYTE secid10[] = {'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e','.','j','p','g',3,0,0,0}; +static const BYTE secid14[] = + {'z','i','p',':','t','e','s','t','i','n','g','.','c','o','m','/','t','e','s','t','i','n','g',3,0,0,0}; static const BYTE secid10_2[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e','.','j','p','g',3,0,0,0}; +static const BYTE secid13[] = {'h','t','t','p',':','c','o','m','.','u','k',3,0,0,0}; +static const BYTE secid13_2[] = {'h','t','t','p',':','g','o','o','g','l','e','.','c','o','m','.','u','k',3,0,0,0}; static const GUID CLSID_TestActiveX = {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x06,0x46}}; @@ -126,6 +149,7 @@ const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY = {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}}; static int called_securl_http; +static DWORD ProcessUrlAction_policy; static struct secmgr_test { LPCWSTR url; @@ -140,7 +164,12 @@ static struct secmgr_test { {url3, 0, S_OK, sizeof(secid1), secid1, S_OK}, {url5, 3, S_OK, sizeof(secid5), secid5, S_OK}, {url6, 3, S_OK, sizeof(secid6), secid6, S_OK}, - {url7, 3, S_OK, sizeof(secid7), secid7, S_OK} + {url7, 3, S_OK, sizeof(secid7), secid7, S_OK}, + {url11,0, S_OK, sizeof(secid1), secid1, S_OK}, + {url12,0, S_OK, sizeof(secid1), secid1, S_OK}, + {url16,0, S_OK, sizeof(secid1), secid1, S_OK}, + {url17,0, S_OK, sizeof(secid1), secid1, S_OK}, + {url18,0, S_OK, sizeof(secid1), secid1, S_OK} }; static int strcmp_w(const WCHAR *str1, const WCHAR *str2) @@ -244,6 +273,103 @@ cleanup: return ret; } +static HRESULT WINAPI SecurityManager_QueryInterface(IInternetSecurityManager* This, + REFIID riid, void **ppvObject) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static ULONG WINAPI SecurityManager_AddRef(IInternetSecurityManager* This) +{ + return 2; +} + +static ULONG WINAPI SecurityManager_Release(IInternetSecurityManager* This) +{ + return 1; +} + +static HRESULT WINAPI SecurityManager_SetSecuritySite(IInternetSecurityManager* This, + IInternetSecurityMgrSite *pSite) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecurityManager_GetSecuritySite(IInternetSecurityManager* This, + IInternetSecurityMgrSite **ppSite) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecurityManager_MapUrlToZone(IInternetSecurityManager* This, + LPCWSTR pwszUrl, DWORD *pdwZone, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecurityManager_GetSecurityId(IInternetSecurityManager* This, + LPCWSTR pwszUrl, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecurityManager_ProcessUrlAction(IInternetSecurityManager* This, + LPCWSTR pwszUrl, DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, + BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved) +{ + CHECK_EXPECT(ProcessUrlAction); + ok(dwAction == URLACTION_FEATURE_ZONE_ELEVATION, "dwAction = %x\n", dwAction); + ok(cbPolicy == sizeof(DWORD), "cbPolicy = %d\n", cbPolicy); + ok(!pContext, "pContext != NULL\n"); + ok(dwFlags == PUAF_NOUI, "dwFlags = %x\n", dwFlags); + ok(dwReserved == 0, "dwReserved = %x\n", dwReserved); + + *pPolicy = ProcessUrlAction_policy; + return ProcessUrlAction_policy==URLPOLICY_ALLOW ? S_OK : S_FALSE; +} + +static HRESULT WINAPI SecurityManager_QueryCustomPolicy(IInternetSecurityManager* This, + LPCWSTR pwszUrl, REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, + BYTE *pContext, DWORD cbContext, DWORD dwReserved) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecurityManager_SetZoneMapping(IInternetSecurityManager* This, + DWORD dwZone, LPCWSTR lpszPattern, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI SecurityManager_GetZoneMappings(IInternetSecurityManager* This, + DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IInternetSecurityManagerVtbl SecurityManagerVtbl = { + SecurityManager_QueryInterface, + SecurityManager_AddRef, + SecurityManager_Release, + SecurityManager_SetSecuritySite, + SecurityManager_GetSecuritySite, + SecurityManager_MapUrlToZone, + SecurityManager_GetSecurityId, + SecurityManager_ProcessUrlAction, + SecurityManager_QueryCustomPolicy, + SecurityManager_SetZoneMapping, + SecurityManager_GetZoneMappings +}; + +static IInternetSecurityManager security_manager = { &SecurityManagerVtbl }; static void test_SecurityManager(void) { @@ -305,10 +431,32 @@ static void test_SecurityManager(void) ok(size == sizeof(secid10) || size == sizeof(secid10_2), /* win2k3 */ "size=%d\n", size); - ok(!memcmp(buf, secid10, size) || - !memcmp(buf, secid10_2, size), /* win2k3 */ + ok(!memcmp(buf, secid10, sizeof(secid10)) || + !memcmp(buf, secid10_2, sizeof(secid10_2)), /* win2k3 */ "wrong secid\n"); + zone = 100; + hres = IInternetSecurityManager_MapUrlToZone(secmgr, url13, &zone, 0); + ok(hres == S_OK, "MapUrlToZone failed: %08x\n", hres); + ok(zone == URLZONE_INVALID || broken(zone == URLZONE_INTERNET), "zone=%d\n", zone); + + size = sizeof(buf); + memset(buf, 0xf0, sizeof(buf)); + hres = IInternetSecurityManager_GetSecurityId(secmgr, url13, buf, &size, 0); + ok(hres == E_INVALIDARG || broken(hres == S_OK), "GetSecurityId failed: %08x\n", hres); + + zone = 100; + hres = IInternetSecurityManager_MapUrlToZone(secmgr, url14, &zone, 0); + ok(hres == S_OK, "MapUrlToZone failed: %08x, expected S_OK\n", hres); + ok(zone == URLZONE_INTERNET, "zone=%d\n", zone); + + size = sizeof(buf); + memset(buf, 0xf0, sizeof(buf)); + hres = IInternetSecurityManager_GetSecurityId(secmgr, url14, buf, &size, 0); + ok(hres == S_OK, "GetSecurityId failed: %08x, expected S_OK\n", hres); + ok(size == sizeof(secid14), "size=%d\n", size); + ok(!memcmp(buf, secid14, size), "wrong secid\n"); + zone = 100; hres = IInternetSecurityManager_MapUrlToZone(secmgr, NULL, &zone, 0); ok(hres == E_INVALIDARG, "MapUrlToZone failed: %08x, expected E_INVALIDARG\n", hres); @@ -600,7 +748,8 @@ static const zone_domain_mapping zone_domain_mappings[] = { {"www.testing.com",NULL,"http",URLZONE_CUSTOM}, {"www.testing.com","testing","http",URLZONE_CUSTOM2}, {"org",NULL,"http",URLZONE_CUSTOM}, - {"org","testing","http",URLZONE_CUSTOM2} + {"org","testing","http",URLZONE_CUSTOM2}, + {"wine.testing",NULL,"*",URLZONE_CUSTOM2} }; static void register_zone_domains(void) @@ -747,7 +896,10 @@ static const zone_mapping_test zone_mapping_tests[] = { /* Tests for "org" zone mappings. */ {"http://google.org/",URLZONE_INTERNET,FALSE,URLZONE_CUSTOM}, {"http://org/",URLZONE_CUSTOM}, - {"http://testing.org/",URLZONE_CUSTOM2} + {"http://testing.org/",URLZONE_CUSTOM2}, + /* Tests for "wine.testing" mapping */ + {"*:wine.testing/test",URLZONE_CUSTOM2}, + {"http://wine.testing/testing",URLZONE_CUSTOM2} }; static void test_zone_domain_mappings(void) @@ -1135,7 +1287,7 @@ static void test_SetZoneAttributes(void) /* The key for the zone must be present, when calling SetZoneAttributes */ myRegDeleteTreeA(HKEY_CURRENT_USER, regpath); - /* E_FAIL is returned from IE6 here, which is resonable. + /* E_FAIL is returned from IE6 here, which is reasonable. All newer IE return S_OK without saving the zone attributes to the registry. This is a Windows bug, but we have to accept that as standard */ hr = IInternetZoneManager_SetZoneAttributes(zonemgr, URLZONE_CUSTOM, pZA); @@ -1553,7 +1705,7 @@ static void test_InternetGetSecurityUrlEx_Pluggable(void) HRESULT hr; IUri *uri = NULL, *result; - trace("testing CoInternetGetSecurityUrlEx for plugable protocols...\n"); + trace("testing CoInternetGetSecurityUrlEx for pluggable protocols...\n"); hr = pCreateUri(security_urlW, 0, 0, &uri); ok(hr == S_OK, "CreateUri returned 0x%08x\n", hr); @@ -1609,6 +1761,236 @@ static void test_InternetGetSecurityUrlEx_Pluggable(void) if(uri) IUri_Release(uri); } +static const BYTE secidex2_1[] = {'z','i','p',':','/','/','t','e','s','t','i','n','g','.','c','o','m','/',3,0,0,0}; +static const BYTE secidex2_2[] = {'z','i','p',':','t','e','s','t','i','n','g','.','c','o','m',3,0,0,0}; +static const BYTE secidex2_3[] = {'*',':','t','e','s','t','i','n','g','.','c','o','m',3,0,0,0}; + +static const struct { + const char *uri; + DWORD create_flags; + HRESULT map_hres; + DWORD zone; + BOOL map_todo; + const BYTE *secid; + DWORD secid_size; + HRESULT secid_hres; + BOOL secid_todo; +} sec_mgr_ex2_tests[] = { + {"res://mshtml.dll/blank.htm",0,S_OK,URLZONE_LOCAL_MACHINE,FALSE,secid1,sizeof(secid1),S_OK}, + {"index.htm",Uri_CREATE_ALLOW_RELATIVE,0,URLZONE_INTERNET,FALSE,secid2,sizeof(secid2),S_OK}, + {"file://c:\\Index.html",0,0,URLZONE_LOCAL_MACHINE,FALSE,secid1,sizeof(secid1),S_OK}, + {"http://www.zone3.winetest/",0,0,URLZONE_INTERNET,FALSE,secid5,sizeof(secid5),S_OK}, + {"about:blank",0,0,URLZONE_INTERNET,FALSE,secid6,sizeof(secid6),S_OK}, + {"ftp://zone3.winetest/file.test",0,0,URLZONE_INTERNET,FALSE,secid7,sizeof(secid7),S_OK}, + {"/file/testing/test.test",Uri_CREATE_ALLOW_RELATIVE,0,URLZONE_INTERNET,FALSE,NULL,0,E_INVALIDARG}, + {"zip://testing.com/",0,0,URLZONE_INTERNET,FALSE,secidex2_1,sizeof(secidex2_1),S_OK}, + {"zip:testing.com",0,0,URLZONE_INTERNET,FALSE,secidex2_2,sizeof(secidex2_2),S_OK}, + {"http:google.com",0,S_OK,URLZONE_INVALID,FALSE,NULL,0,E_INVALIDARG}, + {"http:/google.com",0,S_OK,URLZONE_INVALID,FALSE,NULL,0,E_INVALIDARG}, + {"*:/testing",0,S_OK,URLZONE_INTERNET,FALSE,NULL,0,E_INVALIDARG}, + {"*://testing.com",0,S_OK,URLZONE_INTERNET,FALSE,secidex2_3,sizeof(secidex2_3),S_OK} +}; + +static void test_SecurityManagerEx2(void) +{ + HRESULT hres; + DWORD i, zone; + BYTE buf[512]; + DWORD buf_size = sizeof(buf); + IInternetSecurityManager *sec_mgr; + IInternetSecurityManagerEx2 *sec_mgr2; + IUri *uri = NULL; + + static const WCHAR domainW[] = {'c','o','m','.','u','k',0}; + + if(!pCreateUri) { + win_skip("Skipping SecurityManagerEx2, IE is too old\n"); + return; + } + + trace("Testing SecurityManagerEx2...\n"); + + hres = pCoInternetCreateSecurityManager(NULL, &sec_mgr, 0); + ok(hres == S_OK, "CoInternetCreateSecurityManager failed: %08x\n", hres); + + hres = IInternetSecurityManager_QueryInterface(sec_mgr, &IID_IInternetSecurityManagerEx2, (void**)&sec_mgr2); + ok(hres == S_OK, "QueryInterface(IID_IInternetSecurityManagerEx2) failed: %08x\n", hres); + + zone = 0xdeadbeef; + + hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, NULL, &zone, 0, NULL, NULL); + ok(hres == E_INVALIDARG, "MapUrlToZoneEx2 returned %08x, expected E_INVALIDARG\n", hres); + ok(zone == URLZONE_INVALID, "zone was %d\n", zone); + + hres = IInternetSecurityManagerEx2_GetSecurityIdEx2(sec_mgr2, NULL, buf, &buf_size, 0); + ok(hres == E_INVALIDARG, "GetSecurityIdEx2 returned %08x, expected E_INVALIDARG\n", hres); + ok(buf_size == sizeof(buf), "buf_size was %d\n", buf_size); + + hres = pCreateUri(url5, 0, 0, &uri); + ok(hres == S_OK, "CreateUri failed: %08x\n", hres); + + hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, uri, NULL, 0, NULL, NULL); + ok(hres == E_INVALIDARG, "MapToUrlZoneEx2 returned %08x, expected E_INVALIDARG\n", hres); + + buf_size = sizeof(buf); + hres = IInternetSecurityManagerEx2_GetSecurityIdEx2(sec_mgr2, uri, NULL, &buf_size, 0); + ok(hres == E_INVALIDARG || broken(hres == S_OK), "GetSecurityIdEx2 failed: %08x\n", hres); + ok(buf_size == sizeof(buf), "bug_size was %d\n", buf_size); + + hres = IInternetSecurityManagerEx2_GetSecurityIdEx2(sec_mgr2, uri, buf, NULL, 0); + ok(hres == E_INVALIDARG, "GetSecurityIdEx2 returned %08x, expected E_INVALIDARG\n", hres); + + IUri_Release(uri); + + for(i = 0; i < sizeof(sec_mgr_ex2_tests)/sizeof(sec_mgr_ex2_tests[0]); ++i) { + LPWSTR uriW = a2w(sec_mgr_ex2_tests[i].uri); + + uri = NULL; + zone = URLZONE_INVALID; + + hres = pCreateUri(uriW, sec_mgr_ex2_tests[i].create_flags, 0, &uri); + ok(hres == S_OK, "CreateUri returned %08x for '%s'\n", hres, sec_mgr_ex2_tests[i].uri); + + hres = IInternetSecurityManagerEx2_MapUrlToZoneEx2(sec_mgr2, uri, &zone, 0, NULL, NULL); + if(sec_mgr_ex2_tests[i].map_todo) { + todo_wine + ok(hres == sec_mgr_ex2_tests[i].map_hres, "MapUrlZoneToEx2 returned %08x, expected %08x for '%s'\n", + hres, sec_mgr_ex2_tests[i].map_hres, sec_mgr_ex2_tests[i].uri); + todo_wine + ok(zone == sec_mgr_ex2_tests[i].zone, "Expected zone %d, but got %d for '%s'\n", sec_mgr_ex2_tests[i].zone, + zone, sec_mgr_ex2_tests[i].uri); + } else { + ok(hres == sec_mgr_ex2_tests[i].map_hres, "MapUrlToZoneEx2 returned %08x, expected %08x for '%s'\n", + hres, sec_mgr_ex2_tests[i].map_hres, sec_mgr_ex2_tests[i].uri); + ok(zone == sec_mgr_ex2_tests[i].zone, "Expected zone %d, but got %d for '%s'\n", sec_mgr_ex2_tests[i].zone, + zone, sec_mgr_ex2_tests[i].uri); + } + + buf_size = sizeof(buf); + memset(buf, 0xf0, buf_size); + + hres = IInternetSecurityManagerEx2_GetSecurityIdEx2(sec_mgr2, uri, buf, &buf_size, 0); + if(sec_mgr_ex2_tests[i].secid_todo) { + todo_wine + ok(hres == sec_mgr_ex2_tests[i].secid_hres, "GetSecurityIdEx2 returned %08x, expected %08x on test '%s'\n", + hres, sec_mgr_ex2_tests[i].secid_hres, sec_mgr_ex2_tests[i].uri); + if(sec_mgr_ex2_tests[i].secid) { + todo_wine { + ok(buf_size == sec_mgr_ex2_tests[i].secid_size, "Got wrong security id size=%d, expected %d on test '%s'\n", + buf_size, sec_mgr_ex2_tests[i].secid_size, sec_mgr_ex2_tests[i].uri); + ok(!memcmp(buf, sec_mgr_ex2_tests[i].secid, sec_mgr_ex2_tests[i].secid_size), "Got wrong security id on test '%s'\n", + sec_mgr_ex2_tests[i].uri); + } + } + } else { + ok(hres == sec_mgr_ex2_tests[i].secid_hres, "GetSecurityIdEx2 returned %08x, expected %08x on test '%s'\n", + hres, sec_mgr_ex2_tests[i].secid_hres, sec_mgr_ex2_tests[i].uri); + if(sec_mgr_ex2_tests[i].secid) { + ok(buf_size == sec_mgr_ex2_tests[i].secid_size, "Got wrong security id size=%d, expected %d on test '%s'\n", + buf_size, sec_mgr_ex2_tests[i].secid_size, sec_mgr_ex2_tests[i].uri); + ok(!memcmp(buf, sec_mgr_ex2_tests[i].secid, sec_mgr_ex2_tests[i].secid_size), "Got wrong security id on test '%s'\n", + sec_mgr_ex2_tests[i].uri); + } + } + + heap_free(uriW); + IUri_Release(uri); + } + + hres = pCreateUri(url15, 0, 0, &uri); + ok(hres == S_OK, "CreateUri failed: %08x\n", hres); + + buf_size = sizeof(buf); + memset(buf, 0xf0, buf_size); + + hres = IInternetSecurityManagerEx2_GetSecurityIdEx2(sec_mgr2, uri, buf, &buf_size, (DWORD_PTR)domainW); + ok(hres == S_OK, "GetSecurityIdEx2 failed: %08x\n", hres); + todo_wine ok(buf_size == sizeof(secid13), "buf_size was %d\n", buf_size); + todo_wine ok(!memcmp(buf, secid13, sizeof(secid13)), "Got wrong secid\n"); + + buf_size = sizeof(buf); + memset(buf, 0xf0, buf_size); + + hres = IInternetSecurityManagerEx2_GetSecurityIdEx2(sec_mgr2, uri, buf, &buf_size, 0); + ok(hres == S_OK, "GetSecurityIdEx2 failed: %08x\n", hres); + ok(buf_size == sizeof(secid13_2), "buf_size was %d\n", buf_size); + ok(!memcmp(buf, secid13_2, sizeof(secid13_2)), "Got wrong secid\n"); + + IUri_Release(uri); + + IInternetSecurityManagerEx2_Release(sec_mgr2); + IInternetSecurityManager_Release(sec_mgr); +} + +static void test_CoInternetIsFeatureZoneElevationEnabled(void) +{ + struct { + const char *url_from; + const char *url_to; + DWORD flags; + HRESULT hres; + DWORD policy_flags; + } testcases[] = { + /* 0 */ { "http://www.winehq.org", "http://www.winehq.org", 0, S_FALSE, URLPOLICY_ALLOW }, + /* 1 */ { "http://www.winehq.org", "http://www.winehq.org", 0, S_OK, URLPOLICY_DISALLOW }, + /* 2 */ { "http://www.winehq.org", "http://www.codeweavers.com", 0, S_FALSE, URLPOLICY_ALLOW }, + /* 3 */ { "http://www.winehq.org", "http://www.codeweavers.com", 0, S_OK, URLPOLICY_DISALLOW }, + /* 4 */ { "http://www.winehq.org", "http://www.winehq.org", GET_FEATURE_FROM_PROCESS, S_FALSE, -1 }, + /* 5 */ { "http://www.winehq.org", "http://www.winehq.org/dir", GET_FEATURE_FROM_PROCESS, S_FALSE, -1 }, + /* 6 */ { "http://www.winehq.org", "http://www.codeweavers.com", GET_FEATURE_FROM_PROCESS, S_FALSE, -1 }, + /* 7 */ { "http://www.winehq.org", "ftp://winehq.org", GET_FEATURE_FROM_PROCESS, S_FALSE, -1 }, + /* 8 */ { "http://www.winehq.org", "ftp://winehq.org", GET_FEATURE_FROM_PROCESS|0x100, S_FALSE, URLPOLICY_ALLOW }, + /* 9 */ { "http://www.winehq.org", "ftp://winehq.org", GET_FEATURE_FROM_REGISTRY, S_FALSE, URLPOLICY_ALLOW }, + }; + + WCHAR *url_from, *url_to; + int i; + HRESULT hres; + + if(!pCoInternetIsFeatureZoneElevationEnabled || !pCoInternetIsFeatureEnabled + || !pCoInternetIsFeatureEnabledForUrl) { + win_skip("Skipping CoInternetIsFeatureZoneElevationEnabled tests\n"); + return; + } + + + hres = pCoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, GET_FEATURE_FROM_PROCESS); + ok(SUCCEEDED(hres), "CoInternetIsFeatureEnabled returned %x\n", hres); + + trace("Testing CoInternetIsFeatureZoneElevationEnabled... (%x)\n", hres); + + for(i=0; i -#include -#include +//#include +//#include -#include "windef.h" -#include "winbase.h" -#include "ole2.h" -#include "urlmon.h" -#include "wininet.h" +//#include "windef.h" +//#include "winbase.h" +#include +#include +//#include "urlmon.h" +#include #define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE diff --git a/rostests/winetests/urlmon/testlist.c b/rostests/winetests/urlmon/testlist.c index c6709e8adea..b7b9c1dab3b 100644 --- a/rostests/winetests/urlmon/testlist.c +++ b/rostests/winetests/urlmon/testlist.c @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_generated(void); extern void func_misc(void); diff --git a/rostests/winetests/urlmon/uri.c b/rostests/winetests/urlmon/uri.c index 930622a8131..856decb792b 100644 --- a/rostests/winetests/urlmon/uri.c +++ b/rostests/winetests/urlmon/uri.c @@ -18,19 +18,30 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #include -#include -#include +//#include +//#include #define COBJMACROS #define CONST_VTABLE +#define WIN32_LEAN_AND_MEAN -#include "windef.h" -#include "winbase.h" -#include "urlmon.h" -#include "shlwapi.h" -#include "wininet.h" -#include "strsafe.h" +//#include "windef.h" +//#include "winbase.h" +#include +#include +#include +//#include "urlmon.h" +#include +#include +#include +#include + +DEFINE_GUID(CLSID_CUri, 0xDF2FCE13, 0x25EC, 0x45BB, 0x9D,0x4C, 0xCE,0xCD,0x47,0xC2,0x43,0x0C); #define URI_STR_PROPERTY_COUNT Uri_PROPERTY_STRING_LAST+1 #define URI_DWORD_PROPERTY_COUNT (Uri_PROPERTY_DWORD_LAST - Uri_PROPERTY_DWORD_START)+1 @@ -71,6 +82,8 @@ static HRESULT (WINAPI *pCoInternetCombineIUri)(IUri*,IUri*,DWORD,IUri**,DWORD_P static HRESULT (WINAPI *pCoInternetGetSession)(DWORD,IInternetSession**,DWORD); static HRESULT (WINAPI *pCoInternetCombineUrlEx)(IUri*,LPCWSTR,DWORD,IUri**,DWORD_PTR); static HRESULT (WINAPI *pCoInternetParseIUri)(IUri*,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD_PTR); +static HRESULT (WINAPI *pCreateURLMonikerEx)(IMoniker*,LPCWSTR,IMoniker**,DWORD); +static HRESULT (WINAPI *pCreateURLMonikerEx2)(IMoniker*,IUri*,IMoniker**,DWORD); static const WCHAR http_urlW[] = { 'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q', '.','o','r','g','/',0}; @@ -115,6 +128,7 @@ typedef struct _uri_dword_property { DWORD value; HRESULT expected; BOOL todo; + BOOL broken_combine_hres; } uri_dword_property; typedef struct _uri_properties { @@ -203,6 +217,31 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE}, } }, + { "HtTpS://www.winehq.org/tests/..?query=x&return=y", 0, S_OK, FALSE, + { + {"https://www.winehq.org/?query=x&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"https://www.winehq.org/?query=x&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=x&return=y",S_OK,FALSE}, + {"?query=x&return=y",S_OK,FALSE}, + {"HtTpS://www.winehq.org/tests/..?query=x&return=y",S_OK,FALSE}, + {"https",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {443,S_OK,FALSE}, + {URL_SCHEME_HTTPS,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, { "hTTp://us%45r%3Ainfo@examp%4CE.com:80/path/a/b/./c/../%2E%2E/Forbidden'<|> Characters", 0, S_OK, FALSE, { {"http://usEr%3Ainfo@example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE}, @@ -278,6 +317,31 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE} } }, + { "file://c:\\tests\\../tests/foo%20bar.mp3", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, + { + {"file:///c:/tests/../tests/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///c:/tests/../tests/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/c:/tests/../tests/foo%2520bar.mp3",S_OK,FALSE}, + {"/c:/tests/../tests/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file://c:\\tests\\../tests/foo%20bar.mp3",S_OK,FALSE}, + {"file",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_FILE,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, { "FILE://localhost/test dir\\../tests/test%20file.README.txt", 0, S_OK, FALSE, { {"file:///tests/test%20file.README.txt",S_OK,FALSE}, @@ -840,7 +904,7 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE} } }, - /* Unreserved, percent encoded characters aren't decoded in the userinfo becuase the scheme + /* Unreserved, percent encoded characters aren't decoded in the userinfo because the scheme * isn't known. */ { "zip://%2E:%52%53ord@winehq.org/", 0, S_OK, FALSE, @@ -995,6 +1059,31 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE} } }, + { "http://127.0.0.1:8000", 0, S_OK, FALSE, + { + {"http://127.0.0.1:8000/",S_OK}, + {"127.0.0.1:8000",S_OK}, + {"http://127.0.0.1:8000/",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"127.0.0.1",S_OK}, + {"",S_FALSE}, + {"/",S_OK}, + {"/",S_OK}, + {"",S_FALSE}, + {"http://127.0.0.1:8000",S_OK}, + {"http",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_IPV4,S_OK,FALSE}, + {8000,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, /* Make sure it normalizes partial IPv4 addresses correctly. */ { "http://127.0/", 0, S_OK, FALSE, { @@ -1409,7 +1498,7 @@ static const uri_properties uri_tests[] = { {URLZONE_INVALID,E_NOTIMPL,FALSE} } }, - /* Hostname get's lower cased for known scheme types. */ + /* Hostname gets lower-cased for known scheme types. */ { "http://WWW.GOOGLE.com/", 0, S_OK, FALSE, { {"http://www.google.com/",S_OK,FALSE}, @@ -4139,6 +4228,281 @@ static const uri_properties uri_tests[] = { {URL_SCHEME_MK,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} } + }, + { "", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { " \t ", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "javascript:void", 0, S_OK, FALSE, + { + {"javascript:void",S_OK}, + {"",S_FALSE}, + {"javascript:void",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"void",S_OK}, + {"void",S_OK}, + {"",S_FALSE}, + {"javascript:void",S_OK}, + {"javascript",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_JAVASCRIPT,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "javascript://undefined", 0, S_OK, FALSE, + { + {"javascript://undefined",S_OK}, + {"",S_FALSE}, + {"javascript://undefined",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"//undefined",S_OK}, + {"//undefined",S_OK}, + {"",S_FALSE}, + {"javascript://undefined",S_OK}, + {"javascript",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_JAVASCRIPT,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "JavaSCript:escape('/\\?#?')", 0, S_OK, FALSE, + { + {"javascript:escape('/\\?#?')",S_OK}, + {"",S_FALSE}, + {"javascript:escape('/\\?#?')",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"escape('/\\?#?')",S_OK}, + {"escape('/\\?#?')",S_OK}, + {"",S_FALSE}, + {"JavaSCript:escape('/\\?#?')",S_OK}, + {"javascript",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_JAVASCRIPT,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "*://google.com", 0, S_OK, FALSE, + { + {"*:google.com/",S_OK,FALSE}, + {"google.com",S_OK}, + {"*:google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"*://google.com",S_OK,FALSE}, + {"*",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_WILDCARD,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/file.txt",0,S_OK,FALSE, + { + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/file.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/file.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/file.txt",S_OK}, + {"@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/file.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/file.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "gopher://test.winehq.org:151/file.txt",0,S_OK,FALSE, + { + {"gopher://test.winehq.org:151/file.txt",S_OK}, + {"test.winehq.org:151",S_OK}, + {"gopher://test.winehq.org:151/file.txt",S_OK}, + {"winehq.org",S_OK}, + {".txt",S_OK}, + {"",S_FALSE}, + {"test.winehq.org",S_OK}, + {"",S_FALSE}, + {"/file.txt",S_OK}, + {"/file.txt",S_OK}, + {"",S_FALSE}, + {"gopher://test.winehq.org:151/file.txt",S_OK}, + {"gopher",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_DNS,S_OK}, + {151,S_OK}, + {URL_SCHEME_GOPHER,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "//host.com/path/file.txt?query", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"//host.com/path/file.txt?query",S_OK}, + {"host.com",S_OK}, + {"//host.com/path/file.txt?query",S_OK}, + {"host.com",S_OK}, + {".txt",S_OK}, + {"",S_FALSE}, + {"host.com",S_OK}, + {"",S_FALSE}, + {"/path/file.txt",S_OK}, + {"/path/file.txt?query",S_OK}, + {"?query",S_OK}, + {"//host.com/path/file.txt?query",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + }, + { + {Uri_HOST_DNS,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_UNKNOWN,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "//host/path/file.txt?query", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"//host/path/file.txt?query",S_OK}, + {"host",S_OK}, + {"//host/path/file.txt?query",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"host",S_OK}, + {"",S_FALSE}, + {"/path/file.txt",S_OK}, + {"/path/file.txt?query",S_OK}, + {"?query",S_OK}, + {"//host/path/file.txt?query",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + }, + { + {Uri_HOST_DNS,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_UNKNOWN,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "//host", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, + { + {"//host/",S_OK}, + {"host",S_OK}, + {"//host/",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"host",S_OK}, + {"",S_FALSE}, + {"/",S_OK}, + {"/",S_OK}, + {"",S_FALSE}, + {"//host",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + }, + { + {Uri_HOST_DNS,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_UNKNOWN,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } } }; @@ -4216,91 +4580,140 @@ static const invalid_uri invalid_uri_tests[] = { typedef struct _uri_equality { const char* a; DWORD create_flags_a; - BOOL create_todo_a; const char* b; DWORD create_flags_b; - BOOL create_todo_b; BOOL equal; BOOL todo; } uri_equality; static const uri_equality equality_tests[] = { { - "HTTP://www.winehq.org/test dir/./",0,FALSE, - "http://www.winehq.org/test dir/../test dir/",0,FALSE, - TRUE, FALSE + "HTTP://www.winehq.org/test dir/./",0, + "http://www.winehq.org/test dir/../test dir/",0, + TRUE }, { /* http://www.winehq.org/test%20dir */ - "http://%77%77%77%2E%77%69%6E%65%68%71%2E%6F%72%67/%74%65%73%74%20%64%69%72",0,FALSE, - "http://www.winehq.org/test dir",0,FALSE, - TRUE, FALSE + "http://%77%77%77%2E%77%69%6E%65%68%71%2E%6F%72%67/%74%65%73%74%20%64%69%72",0, + "http://www.winehq.org/test dir",0, + TRUE }, { - "c:\\test.mp3",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME,FALSE, - "file:///c:/test.mp3",0,FALSE, - TRUE, FALSE + "c:\\test.mp3",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, + "file:///c:/test.mp3",0, + TRUE }, { - "ftp://ftp.winehq.org/",0,FALSE, - "ftp://ftp.winehq.org",0,FALSE, - TRUE, FALSE + "ftp://ftp.winehq.org/",0, + "ftp://ftp.winehq.org",0, + TRUE }, { - "ftp://ftp.winehq.org/test/test2/../../testB/",0,FALSE, - "ftp://ftp.winehq.org/t%45stB/",0,FALSE, - FALSE, FALSE + "ftp://ftp.winehq.org/test/test2/../../testB/",0, + "ftp://ftp.winehq.org/t%45stB/",0, + FALSE }, { - "http://google.com/TEST",0,FALSE, - "http://google.com/test",0,FALSE, - FALSE, FALSE + "http://google.com/TEST",0, + "http://google.com/test",0, + FALSE }, { - "http://GOOGLE.com/",0,FALSE, - "http://google.com/",0,FALSE, - TRUE, FALSE + "http://GOOGLE.com/",0, + "http://google.com/",0, + TRUE }, /* Performs case insensitive compare of host names (for known scheme types). */ { - "ftp://GOOGLE.com/",Uri_CREATE_NO_CANONICALIZE,FALSE, - "ftp://google.com/",0,FALSE, - TRUE, FALSE + "ftp://GOOGLE.com/",Uri_CREATE_NO_CANONICALIZE, + "ftp://google.com/",0, + TRUE }, { - "zip://GOOGLE.com/",0,FALSE, - "zip://google.com/",0,FALSE, - FALSE, FALSE + "zip://GOOGLE.com/",0, + "zip://google.com/",0, + FALSE }, { - "file:///c:/TEST/TeST/",0,FALSE, - "file:///c:/test/test/",0,FALSE, - TRUE, FALSE + "file:///c:/TEST/TeST/",0, + "file:///c:/test/test/",0, + TRUE }, { - "file:///server/TEST",0,FALSE, - "file:///SERVER/TEST",0,FALSE, - TRUE, FALSE + "file:///server/TEST",0, + "file:///SERVER/TEST",0, + TRUE }, { - "http://google.com",Uri_CREATE_NO_CANONICALIZE,FALSE, - "http://google.com/",0,FALSE, - TRUE, FALSE + "http://google.com",Uri_CREATE_NO_CANONICALIZE, + "http://google.com/",0, + TRUE }, { - "ftp://google.com:21/",0,FALSE, - "ftp://google.com/",0,FALSE, - TRUE, FALSE + "ftp://google.com:21/",0, + "ftp://google.com/",0, + TRUE }, { - "http://google.com:80/",Uri_CREATE_NO_CANONICALIZE,FALSE, - "http://google.com/",0,FALSE, - TRUE, FALSE + "http://google.com:80/",Uri_CREATE_NO_CANONICALIZE, + "http://google.com/",0, + TRUE }, { - "http://google.com:70/",0,FALSE, - "http://google.com:71/",0,FALSE, - FALSE, FALSE + "http://google.com:70/",0, + "http://google.com:71/",0, + FALSE + }, + { + "file:///c:/dir/file.txt", 0, + "file:///c:/dir/file.txt", Uri_CREATE_FILE_USE_DOS_PATH, + TRUE + }, + { + "file:///c:/dir/file.txt", 0, + "file:///c:\\dir\\file.txt", Uri_CREATE_NO_CANONICALIZE, + TRUE + }, + { + "file:///c:/dir/file.txt", 0, + "file:///c:\\dir2\\..\\dir\\file.txt", Uri_CREATE_NO_CANONICALIZE, + TRUE + }, + { + "file:///c:\\dir2\\..\\ dir\\file.txt", Uri_CREATE_NO_CANONICALIZE, + "file:///c:/%20dir/file.txt", 0, + TRUE + }, + { + "file:///c:/Dir/file.txt", 0, + "file:///C:/dir/file.TXT", Uri_CREATE_FILE_USE_DOS_PATH, + TRUE + }, + { + "file:///c:/dir/file.txt", 0, + "file:///c:\\dir\\file.txt", Uri_CREATE_FILE_USE_DOS_PATH, + TRUE + }, + { + "file:///c:/dir/file.txt#a", 0, + "file:///c:\\dir\\file.txt#b", Uri_CREATE_FILE_USE_DOS_PATH, + FALSE + }, + /* Tests of an empty hash/fragment part */ + { + "http://google.com/test",0, + "http://google.com/test#",0, + FALSE + }, + { + "ftp://ftp.winehq.org/",0, + "ftp://ftp.winehq.org/#",0, + FALSE + }, + { + "file:///c:/dir/file.txt#", 0, + "file:///c:\\dir\\file.txt", Uri_CREATE_FILE_USE_DOS_PATH, + FALSE } }; @@ -5325,6 +5738,70 @@ static const uri_builder_test uri_builder_tests[] = { 0,INET_E_INVALID_URL,FALSE, 0,INET_E_INVALID_URL,FALSE, 0,0,0,INET_E_INVALID_URL,FALSE + }, + { "file:///c:/dir/file.html",0,S_OK,FALSE, + { + {TRUE,NULL,NULL,Uri_PROPERTY_FRAGMENT,S_OK}, + }, + {FALSE}, + 0,S_OK,FALSE, + 0,S_OK,FALSE, + 0,0,0,S_OK,FALSE, + { + {"file:///c:/dir/file.html",S_OK}, + {"",S_FALSE}, + {"file:///c:/dir/file.html",S_OK}, + {"",S_FALSE}, + {".html",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"/c:/dir/file.html",S_OK}, + {"/c:/dir/file.html",S_OK}, + {"",S_FALSE}, + {"file:///c:/dir/file.html",S_OK}, + {"file",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_FILE,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "file:///c:/dir/file.html",0,S_OK,FALSE, + { + {TRUE,"#",NULL,Uri_PROPERTY_FRAGMENT,S_OK}, + }, + {FALSE}, + 0,S_OK,FALSE, + 0,S_OK,FALSE, + 0,0,0,S_OK,FALSE, + { + {"file:///c:/dir/file.html#",S_OK}, + {"",S_FALSE}, + {"file:///c:/dir/file.html#",S_OK}, + {"",S_FALSE}, + {".html",S_OK}, + {"#",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"/c:/dir/file.html",S_OK}, + {"/c:/dir/file.html",S_OK}, + {"",S_FALSE}, + {"file:///c:/dir/file.html#",S_OK}, + {"file",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_FILE,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } } }; @@ -6159,6 +6636,303 @@ static const uri_combine_test uri_combine_tests[] = { {URL_SCHEME_HTTP,S_OK}, {URLZONE_INVALID,E_NOTIMPL} } + }, + { "mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir\\file.txt",0, + "relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::\\subdir\\file.txt",0, + "relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\Some\\Bogus\\Path.chm::/subdir/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:@MSITSTORE:C:/Some\\Bogus/Path.chm::/subdir\\file.txt",0, + "relative\\path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:@MSITSTORE:C:/Some\\Bogus/Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:/Some\\Bogus/Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@MSITSTORE:C:/Some\\Bogus/Path.chm::/subdir/relative/path.txt",S_OK}, + {"@MSITSTORE:C:/Some\\Bogus/Path.chm::/subdir/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:/Some\\Bogus/Path.chm::/subdir/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:@MSITSTORE:C:\\dir\\file.chm::/subdir/file.txt",0, + "/relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:@MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"@MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:MSITSTORE:C:\\dir\\file.chm::/subdir/file.txt",0, + "/relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:MSITSTORE:C:\\dir\\file.chm::/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:@MSITSTORE:C:\\dir\\file.chm::/subdir/../../file.txt",0, + "/relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:@MSITSTORE:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@MSITSTORE:/relative/path.txt",S_OK}, + {"@MSITSTORE:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@MSITSTORE:/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:@xxx:C:\\dir\\file.chm::/subdir/../../file.txt",0, + "/relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:@xxx:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@xxx:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"@xxx:/relative/path.txt",S_OK}, + {"@xxx:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:@xxx:/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "mk:xxx:C:\\dir\\file.chm::/subdir/../../file.txt",0, + "/relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"mk:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"/relative/path.txt",S_OK}, + {"/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"mk:/relative/path.txt",S_OK}, + {"mk",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_MK,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "ml:@MSITSTORE:C:\\dir\\file.chm::/subdir/file.txt",0, + "/relative/path.txt",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"ml:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"ml:/relative/path.txt",S_OK}, + {"",S_FALSE}, + {".txt",S_OK}, + {"",S_FALSE}, + {"",S_FALSE}, + {"",S_FALSE}, + {"/relative/path.txt",S_OK}, + {"/relative/path.txt",S_OK}, + {"",S_FALSE}, + {"ml:/relative/path.txt",S_OK}, + {"ml",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK}, + {0,S_FALSE}, + {URL_SCHEME_UNKNOWN,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "http://winehq.org/dir/test?querystring",0, + "//winehq.com/#hash",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"http://winehq.com/#hash",S_OK}, + {"winehq.com",S_OK}, + {"http://winehq.com/#hash",S_OK}, + {"winehq.com",S_OK}, + {"",S_FALSE}, + {"#hash",S_OK}, + {"winehq.com",S_OK}, + {"",S_FALSE}, + {"/",S_OK}, + {"/",S_OK}, + {"",S_FALSE}, + {"http://winehq.com/#hash",S_OK}, + {"http",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_DNS,S_OK}, + {80,S_OK,FALSE,TRUE}, + {URL_SCHEME_HTTP,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } + }, + { "http://winehq.org/dir/test?querystring",0, + "//winehq.com/dir2/../dir/file.txt?query#hash",Uri_CREATE_ALLOW_RELATIVE, + 0,S_OK,FALSE, + { + {"http://winehq.com/dir/file.txt?query#hash",S_OK}, + {"winehq.com",S_OK}, + {"http://winehq.com/dir/file.txt?query#hash",S_OK}, + {"winehq.com",S_OK}, + {".txt",S_OK}, + {"#hash",S_OK}, + {"winehq.com",S_OK}, + {"",S_FALSE}, + {"/dir/file.txt",S_OK}, + {"/dir/file.txt?query",S_OK}, + {"?query",S_OK}, + {"http://winehq.com/dir/file.txt?query#hash",S_OK}, + {"http",S_OK}, + {"",S_FALSE}, + {"",S_FALSE} + }, + { + {Uri_HOST_DNS,S_OK}, + {80,S_OK,FALSE,TRUE}, + {URL_SCHEME_HTTP,S_OK}, + {URLZONE_INVALID,E_NOTIMPL} + } } }; @@ -7342,27 +8116,28 @@ static void test_IUri_HasProperty(void) { static void test_IUri_IsEqual(void) { IUri *uriA, *uriB; - HRESULT hrA, hrB; + BOOL equal; + HRESULT hres; DWORD i; uriA = uriB = NULL; /* Make sure IsEqual handles invalid args correctly. */ - hrA = pCreateUri(http_urlW, 0, 0, &uriA); - hrB = pCreateUri(http_urlW, 0, 0, &uriB); - ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hrA, S_OK); - ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hrB, S_OK); - if(SUCCEEDED(hrA) && SUCCEEDED(hrB)) { - BOOL equal = -1; - hrA = IUri_IsEqual(uriA, NULL, &equal); - ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hrA, S_OK); - ok(equal == FALSE, "Error: Expected equal to be FALSE, but was %d instead.\n", equal); + hres = pCreateUri(http_urlW, 0, 0, &uriA); + ok(hres == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hres, S_OK); + hres = pCreateUri(http_urlW, 0, 0, &uriB); + ok(hres == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hres, S_OK); - hrA = IUri_IsEqual(uriA, uriB, NULL); - ok(hrA == E_POINTER, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hrA, E_POINTER); - } - if(uriA) IUri_Release(uriA); - if(uriB) IUri_Release(uriB); + equal = -1; + hres = IUri_IsEqual(uriA, NULL, &equal); + ok(hres == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hres, S_OK); + ok(!equal, "Error: Expected equal to be FALSE, but was %d instead.\n", equal); + + hres = IUri_IsEqual(uriA, uriB, NULL); + ok(hres == E_POINTER, "Error: IsEqual returned 0x%08x, expected 0x%08x.\n", hres, E_POINTER); + + IUri_Release(uriA); + IUri_Release(uriB); for(i = 0; i < sizeof(equality_tests)/sizeof(equality_tests[0]); ++i) { uri_equality test = equality_tests[i]; @@ -7373,44 +8148,20 @@ static void test_IUri_IsEqual(void) { uriA_W = a2w(test.a); uriB_W = a2w(test.b); - hrA = pCreateUri(uriA_W, test.create_flags_a, 0, &uriA); - if(test.create_todo_a) { - todo_wine { - ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n", - hrA, S_OK, i); - } + hres = pCreateUri(uriA_W, test.create_flags_a, 0, &uriA); + ok(hres == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n", hres, S_OK, i); + + hres = pCreateUri(uriB_W, test.create_flags_b, 0, &uriB); + ok(hres == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n", hres, S_OK, i); + + equal = -1; + hres = IUri_IsEqual(uriA, uriB, &equal); + if(test.todo) todo_wine { + ok(hres == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n", hres, S_OK, i); + ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i); } else { - ok(hrA == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].a\n", - hrA, S_OK, i); - } - - hrB = pCreateUri(uriB_W, test.create_flags_b, 0, &uriB); - if(test.create_todo_b) { - todo_wine { - ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n", - hrB, S_OK, i); - } - } else { - ok(hrB == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on equality_tests[%d].b\n", - hrB, S_OK, i); - } - - if(SUCCEEDED(hrA) && SUCCEEDED(hrB)) { - BOOL equal = -1; - - hrA = IUri_IsEqual(uriA, uriB, &equal); - if(test.todo) { - todo_wine { - ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n", - hrA, S_OK, i); - } - todo_wine { - ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i); - } - } else { - ok(hrA == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n", hrA, S_OK, i); - ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i); - } + ok(hres == S_OK, "Error: IsEqual returned 0x%08x, expected 0x%08x on equality_tests[%d].\n", hres, S_OK, i); + ok(equal == test.equal, "Error: Expected the comparison to be %d on equality_tests[%d].\n", test.equal, i); } if(uriA) IUri_Release(uriA); if(uriB) IUri_Release(uriB); @@ -9524,11 +10275,12 @@ static void test_CoInternetCombineIUri(void) { prop.value, received, i, j); } } else { - ok(hr == prop.expected, + ok(hr == prop.expected || broken(prop.broken_combine_hres && hr == S_FALSE), "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].dword_props[%d].\n", hr, prop.expected, i, j); - ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n", - prop.value, received, i, j); + if(!prop.broken_combine_hres || hr != S_FALSE) + ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n", + prop.value, received, i, j); } } } @@ -9840,11 +10592,12 @@ static void test_CoInternetCombineUrlEx(void) { prop.value, received, i, j); } } else { - ok(hr == prop.expected, + ok(hr == prop.expected || broken(prop.broken_combine_hres && hr == S_FALSE), "Error: IUri_GetPropertyDWORD returned 0x%08x, expected 0x%08x on uri_combine_tests[%d].dword_props[%d].\n", hr, prop.expected, i, j); - ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n", - prop.value, received, i, j); + if(!prop.broken_combine_hres || hr != S_FALSE) + ok(prop.value == received, "Error: Expected %d, but got %d instead on uri_combine_tests[%d].dword_props[%d].\n", + prop.value, received, i, j); } } } @@ -10027,6 +10780,535 @@ static void test_CoInternetParseIUri_Pluggable(void) { if(uri) IUri_Release(uri); } +typedef struct { + const char *url; + DWORD uri_flags; + const char *base_url; + DWORD base_uri_flags; + const char *legacy_url; + const char *uniform_url; + const char *no_canon_url; + const char *uri_url; +} create_urlmon_test_t; + +static const create_urlmon_test_t create_urlmon_tests[] = { + { + "http://www.winehq.org",Uri_CREATE_NO_CANONICALIZE, + NULL,0, + "http://www.winehq.org/", + "http://www.winehq.org/", + "http://www.winehq.org", + "http://www.winehq.org" + }, + { + "file://c:\\dir\\file.txt",Uri_CREATE_NO_CANONICALIZE, + NULL,0, + "file://c:\\dir\\file.txt", + "file:///c:/dir/file.txt", + "file:///c:/dir/file.txt", + "file:///c:/dir/file.txt" + }, + { + "file://c:\\dir\\file.txt",Uri_CREATE_FILE_USE_DOS_PATH, + NULL,0, + "file://c:\\dir\\file.txt", + "file:///c:/dir/file.txt", + "file:///c:/dir/file.txt", + "file://c:\\dir\\file.txt" + }, + { + "dat%61",Uri_CREATE_ALLOW_RELATIVE, + "http://www.winehq.org",0, + "http://www.winehq.org/data", + "http://www.winehq.org/data", + "http://www.winehq.org:80/data", + }, + { + "file.txt",Uri_CREATE_ALLOW_RELATIVE, + "file://c:\\dir\\x.txt",Uri_CREATE_NO_CANONICALIZE, + "file://c:\\dir\\file.txt", + "file:///c:/dir/file.txt", + "file:///c:/dir/file.txt", + }, + { + "",Uri_CREATE_ALLOW_RELATIVE, + NULL,0, + "", + "", + "", + "" + }, + { + "test",Uri_CREATE_ALLOW_RELATIVE, + NULL,0, + "test", + "test", + "test", + "test" + }, + { + "c:\\dir\\file.txt",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, + NULL,0, + "file://c:\\dir\\file.txt", + "file:///c:/dir/file.txt", + "file:///c:/dir/file.txt", + "file:///c:/dir/file.txt", + } +}; + +#define test_urlmon_display_name(a,b) _test_urlmon_display_name(__LINE__,a,b) +static void _test_urlmon_display_name(unsigned line, IMoniker *mon, const char *exurl) +{ + WCHAR *display_name; + HRESULT hres; + + hres = IMoniker_GetDisplayName(mon, NULL, NULL, &display_name); + ok_(__FILE__,line)(hres == S_OK, "GetDisplayName failed: %08x\n", hres); + ok_(__FILE__,line)(!strcmp_aw(exurl, display_name), "unexpected display name: %s, expected %s\n", + wine_dbgstr_w(display_name), exurl); + + CoTaskMemFree(display_name); +} + +#define test_display_uri(a,b) _test_display_uri(__LINE__,a,b) +static void _test_display_uri(unsigned line, IMoniker *mon, const char *exurl) +{ + IUriContainer *uri_container; + IUri *uri; + BSTR display_uri; + HRESULT hres; + + hres = IMoniker_QueryInterface(mon, &IID_IUriContainer, (void**)&uri_container); + ok(hres == S_OK, "Could not get IUriContainer iface: %08x\n", hres); + + uri = NULL; + hres = IUriContainer_GetIUri(uri_container, &uri); + IUriContainer_Release(uri_container); + ok(hres == S_OK, "GetIUri failed: %08x\n", hres); + ok(uri != NULL, "uri == NULL\n"); + + hres = IUri_GetDisplayUri(uri, &display_uri); + IUri_Release(uri); + ok(hres == S_OK, "GetDisplayUri failed: %08x\n", hres); + ok_(__FILE__,line)(!strcmp_aw(exurl, display_uri), "unexpected display uri: %s, expected %s\n", + wine_dbgstr_w(display_uri), exurl); + SysFreeString(display_uri); +} + +static void test_CreateURLMoniker(void) +{ + const create_urlmon_test_t *test; + IMoniker *mon, *base_mon; + WCHAR *url, *base_url; + IUri *uri, *base_uri; + HRESULT hres; + + for(test = create_urlmon_tests; test < create_urlmon_tests + sizeof(create_urlmon_tests)/sizeof(*create_urlmon_tests); test++) { + url = a2w(test->url); + base_url = a2w(test->base_url); + + if(base_url) { + hres = pCreateUri(base_url, test->base_uri_flags, 0, &base_uri); + ok(hres == S_OK, "CreateUri failed: %08x\n", hres); + + hres = pCreateURLMonikerEx2(NULL, base_uri, &base_mon, URL_MK_NO_CANONICALIZE); + ok(hres == S_OK, "CreateURLMonikerEx2 failed: %08x\n", hres); + }else { + base_uri = NULL; + base_mon = NULL; + } + + hres = CreateURLMoniker(base_mon, url, &mon); + ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres); + test_urlmon_display_name(mon, test->legacy_url); + test_display_uri(mon, test->legacy_url); + IMoniker_Release(mon); + + hres = pCreateURLMonikerEx(base_mon, url, &mon, URL_MK_LEGACY); + ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres); + test_urlmon_display_name(mon, test->legacy_url); + test_display_uri(mon, test->legacy_url); + IMoniker_Release(mon); + + hres = pCreateURLMonikerEx(base_mon, url, &mon, URL_MK_UNIFORM); + ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres); + test_urlmon_display_name(mon, test->uniform_url); + test_display_uri(mon, test->uniform_url); + IMoniker_Release(mon); + + hres = pCreateURLMonikerEx(base_mon, url, &mon, URL_MK_NO_CANONICALIZE); + ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres); + test_urlmon_display_name(mon, test->no_canon_url); + test_display_uri(mon, test->no_canon_url); + IMoniker_Release(mon); + + hres = pCreateUri(url, test->uri_flags, 0, &uri); + ok(hres == S_OK, "CreateUri failed: %08x\n", hres); + + hres = pCreateURLMonikerEx2(base_mon, uri, &mon, URL_MK_LEGACY); + ok(hres == S_OK, "CreateURLMonikerEx2 failed: %08x\n", hres); + test_urlmon_display_name(mon, base_url ? test->legacy_url : test->uri_url); + test_display_uri(mon, base_url ? test->legacy_url : test->uri_url); + IMoniker_Release(mon); + + hres = pCreateURLMonikerEx2(base_mon, uri, &mon, URL_MK_UNIFORM); + ok(hres == S_OK, "CreateURLMonikerEx2 failed: %08x\n", hres); + test_urlmon_display_name(mon, base_url ? test->uniform_url : test->uri_url); + test_display_uri(mon, base_url ? test->uniform_url : test->uri_url); + IMoniker_Release(mon); + + hres = pCreateURLMonikerEx2(base_mon, uri, &mon, URL_MK_NO_CANONICALIZE); + ok(hres == S_OK, "CreateURLMonikerEx2 failed: %08x\n", hres); + test_urlmon_display_name(mon, base_url ? test->no_canon_url : test->uri_url); + test_display_uri(mon, base_url ? test->no_canon_url : test->uri_url); + IMoniker_Release(mon); + + IUri_Release(uri); + heap_free(url); + heap_free(base_url); + if(base_uri) + IUri_Release(base_uri); + if(base_mon) + IMoniker_Release(base_mon); + } +} + +static int add_default_flags(DWORD flags) { + if(!(flags & Uri_CREATE_NO_CANONICALIZE)) + flags |= Uri_CREATE_CANONICALIZE; + if(!(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) + flags |= Uri_CREATE_DECODE_EXTRA_INFO; + if(!(flags & Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES)) + flags |= Uri_CREATE_CRACK_UNKNOWN_SCHEMES; + if(!(flags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI)) + flags |= Uri_CREATE_PRE_PROCESS_HTML_URI; + if(!(flags & Uri_CREATE_IE_SETTINGS)) + flags |= Uri_CREATE_NO_IE_SETTINGS; + + return flags; +} + +static void test_IPersistStream(void) +{ + int i, props_order[Uri_PROPERTY_DWORD_LAST+1] = { 0 }; + + props_order[Uri_PROPERTY_RAW_URI] = 1; + props_order[Uri_PROPERTY_FRAGMENT] = 2; + props_order[Uri_PROPERTY_HOST] = 3; + props_order[Uri_PROPERTY_PASSWORD] = 4; + props_order[Uri_PROPERTY_PATH] = 5; + props_order[Uri_PROPERTY_PORT] = 6; + props_order[Uri_PROPERTY_QUERY] = 7; + props_order[Uri_PROPERTY_SCHEME_NAME] = 8; + props_order[Uri_PROPERTY_USER_NAME] = 9; + + for(i=0; icreate_todo || test->create_expected!=S_OK) + continue; + + uriW = a2w(test->uri); + hr = pCreateUri(uriW, test->create_flags, 0, &uri); + ok(hr == S_OK, "%d) CreateUri failed 0x%08x, expected S_OK..\n", i, hr); + + hr = IUri_QueryInterface(uri, &IID_IPersistStream, (void**)&persist_stream); + ok(hr == S_OK, "%d) QueryInterface failed 0x%08x, expected S_OK.\n", i, hr); + + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); + ok(hr == S_OK, "CreateStreamOnHGlobal failed 0x%08x.\n", hr); + hr = IPersistStream_IsDirty(persist_stream); + ok(hr == S_FALSE, "%d) IsDirty returned 0x%08x, expected S_FALSE.\n", i, hr); + hr = IPersistStream_Save(persist_stream, stream, FALSE); + ok(hr == S_OK, "%d) Save failed 0x%08x, expected S_OK.\n", i, hr); + hr = IPersistStream_IsDirty(persist_stream); + ok(hr == S_FALSE, "%d) IsDirty returned 0x%08x, expected S_FALSE.\n", i, hr); + no_off.QuadPart = 0; + hr = IStream_Seek(stream, no_off, STREAM_SEEK_CUR, &size); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = IStream_Seek(stream, no_off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = IPersistStream_GetSizeMax(persist_stream, &max_size); + ok(hr == S_OK, "%d) GetSizeMax failed 0x%08x, expected S_OK.\n", i, hr); + ok(U(size).LowPart+2 == U(max_size).LowPart, + "%d) Written data size is %d, max_size %d.\n", + i, U(size).LowPart, U(max_size).LowPart); + + hr = IStream_Read(stream, (void*)dw_data, sizeof(DWORD), NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + ok(dw_data[0]-2 == U(size).LowPart, "%d) Structure size is %d, expected %d\n", + i, dw_data[0]-2, U(size).LowPart); + hr = IStream_Read(stream, (void*)dw_data, 6*sizeof(DWORD), NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + ok(dw_data[0] == 0, "%d) Incorrect value %x, expected 0 (unknown).\n", i, dw_data[0]); + ok(dw_data[1] == 0, "%d) Incorrect value %x, expected 0 (unknown).\n", i, dw_data[1]); + ok(dw_data[2] == add_default_flags(test->create_flags), + "%d) Incorrect value %x, expected %x (creation flags).\n", + i, dw_data[2], add_default_flags(test->create_flags)); + ok(dw_data[3] == 0, "%d) Incorrect value %x, expected 0 (unknown).\n", i, dw_data[3]); + ok(dw_data[4] == 0, "%d) Incorrect value %x, expected 0 (unknown).\n", i, dw_data[4]); + ok(dw_data[5] == 0, "%d) Incorrect value %x, expected 0 (unknown).\n", i, dw_data[5]); + + props_no = 0; + for(props=0; props<=Uri_PROPERTY_DWORD_LAST; props++) { + if(!props_order[props]) + continue; + + if(props <= Uri_PROPERTY_STRING_LAST) { + if(test->str_props[props].expected == S_OK) + props_no++; + } else { + if(test->dword_props[props-Uri_PROPERTY_DWORD_START].expected == S_OK) + props_no++; + } + } + if(test->dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START].value != URL_SCHEME_HTTP + && test->dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START].value != URL_SCHEME_FTP + && test->dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START].value != URL_SCHEME_HTTPS) + props_no = 1; + + hr = IStream_Read(stream, (void*)&props, sizeof(DWORD), NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + ok(props == props_no, "%d) Properties no is %d, expected %d.\n", i, props, props_no); + + dw_data[2] = 0; + dw_data[3] = -1; + while(props) { + hr = IStream_Read(stream, (void*)dw_data, 2*sizeof(DWORD), NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + props--; + ok(dw_data[2]str_props+dw_data[0]; + hr = IStream_Read(stream, (void*)str_data, dw_data[1], NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + ok(!strcmp_aw(prop->value, str_data) || broken(prop->broken_value && !strcmp_aw(prop->broken_value, str_data)), + "%d) Expected %s but got %s (%d).\n", i, prop->value, wine_dbgstr_w(str_data), dw_data[0]); + } else if(dw_data[0]>=Uri_PROPERTY_DWORD_START && dw_data[0]<=Uri_PROPERTY_DWORD_LAST) { + const uri_dword_property *prop = test->dword_props+dw_data[0]-Uri_PROPERTY_DWORD_START; + ok(dw_data[1] == sizeof(DWORD), "%d) Size of dword property is %d (%d)\n", i, dw_data[1], dw_data[0]); + hr = IStream_Read(stream, (void*)&dw_data[1], sizeof(DWORD), NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + ok(prop->value == dw_data[1], "%d) Expected %d but got %d (%d).\n", i, prop->value, dw_data[1], dw_data[0]); + } else { + ok(FALSE, "%d) Incorrect property type (%d)\n", i, dw_data[0]); + break; + } + } + ok(props == 0, "%d) Not all properties were processed %d. Next property type: %d\n", + i, props, dw_data[0]); + + IPersistStream_Release(persist_stream); + IUri_Release(uri); + + hr = IStream_Seek(stream, no_off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = IPersistStream_GetClassID(persist_stream, &curi); + ok(hr == S_OK, "%d) GetClassID failed 0x%08x, expected S_OK.\n", i, hr); + ok(IsEqualCLSID(&curi, &CLSID_CUri), "%d) GetClassID returned incorrect CLSID.\n", i); + hr = CoCreateInstance(&curi, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IUri, (void**)&uri); + ok(hr == S_OK, "%d) Error creating uninitialized Uri: 0x%08x.\n", i, hr); + hr = IUri_QueryInterface(uri, &IID_IPersistStream, (void**)&persist_stream); + ok(hr == S_OK, "%d) QueryInterface failed 0x%08x, expected S_OK.\n", i, hr); + hr = IPersistStream_Load(persist_stream, stream); + ok(hr == S_OK, "%d) Load failed 0x%08x, expected S_OK.\n", i, hr); + hr = IUri_GetRawUri(uri, &raw_uri); + ok(hr == S_OK, "%d) GetRawUri failed 0x%08x, expected S_OK.\n", i, hr); + ok(!strcmp_aw(test->str_props[Uri_PROPERTY_RAW_URI].value, raw_uri) + || broken(test->str_props[Uri_PROPERTY_RAW_URI].broken_value + && !strcmp_aw(test->str_props[Uri_PROPERTY_RAW_URI].broken_value, raw_uri)), + "%d) Expected %s but got %s.\n", i, test->str_props[Uri_PROPERTY_RAW_URI].value, + wine_dbgstr_w(raw_uri)); + SysFreeString(raw_uri); + + hr = IUri_QueryInterface(uri, &IID_IMarshal, (void**)&marshal); + ok(hr == S_OK, "%d) QueryInterface(IID_IMarshal) failed 0x%08x, expected S_OK.\n", i, hr); + hr = IStream_Seek(stream, no_off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = IMarshal_MarshalInterface(marshal, stream, &IID_IUri, (void*)uri, + MSHCTX_DIFFERENTMACHINE, NULL, MSHLFLAGS_NORMAL); + ok(hr == E_INVALIDARG, "%d) MarshalInterface returned 0x%08x, expected E_INVALIDARG.\n", i, hr); + hr = IMarshal_MarshalInterface(marshal, stream, &IID_IUri, (void*)uri, + MSHCTX_CROSSCTX, NULL, MSHLFLAGS_NORMAL); + ok(hr == E_INVALIDARG, "%d) MarshalInterface returned 0x%08x, expected E_INVALIDARG.\n", i, hr); + hr = IMarshal_MarshalInterface(marshal, stream, &IID_IUri, (void*)uri, + MSHCTX_LOCAL, NULL, MSHLFLAGS_TABLESTRONG); + ok(hr == E_INVALIDARG, "%d) MarshalInterface returned 0x%08x, expected E_INVALIDARG.\n", i, hr); + hr = IMarshal_MarshalInterface(marshal, stream, &IID_IUri, (void*)uri, + MSHCTX_LOCAL, NULL, MSHLFLAGS_TABLEWEAK); + ok(hr == E_INVALIDARG, "%d) MarshalInterface returned 0x%08x, expected E_INVALIDARG.\n", i, hr); + hr = IMarshal_MarshalInterface(marshal, stream, &IID_IUri, (void*)uri, + MSHCTX_LOCAL, NULL, MSHLFLAGS_NOPING); + ok(hr == E_INVALIDARG, "%d) MarshalInterface returned 0x%08x, expected E_INVALIDARG.\n", i, hr); + hr = IMarshal_MarshalInterface(marshal, stream, &IID_IUri, (void*)uri, + MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL); + ok(hr == S_OK, "%d) MarshalInterface failed 0x%08x, expected S_OK.\n", i, hr); + hr = IMarshal_GetUnmarshalClass(marshal, &IID_IUri, (void*)uri, + MSHCTX_CROSSCTX, NULL, MSHLFLAGS_NORMAL, &curi); + ok(hr == E_INVALIDARG, "%d) GetUnmarshalClass returned 0x%08x, expected E_INVALIDARG.\n", i, hr); + hr = IMarshal_GetUnmarshalClass(marshal, &IID_IUri, (void*)uri, + MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL, &curi); + ok(hr == S_OK, "%d) GetUnmarshalClass failed 0x%08x, expected S_OK.\n", i, hr); + ok(IsEqualCLSID(&curi, &CLSID_CUri), "%d) GetUnmarshalClass returned incorrect CLSID.\n", i); + + hr = IStream_Seek(stream, no_off, STREAM_SEEK_CUR, &size); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = IStream_Seek(stream, no_off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = IStream_Read(stream, (void*)dw_data, 3*sizeof(DWORD), NULL); + ok(hr == S_OK, "%d) Read failed 0x%08x, expected S_OK.\n", i, hr); + ok(dw_data[0]-2 == U(size).LowPart, "%d) Structure size is %d, expected %d\n", + i, dw_data[0]-2, U(size).LowPart); + ok(dw_data[1] == MSHCTX_LOCAL, "%d) Incorrect value %d, expected MSHCTX_LOCAL.\n", + i, dw_data[1]); + ok(dw_data[2] == dw_data[0]-8, "%d) Incorrect value %d, expected %d (PersistStream size).\n", + i, dw_data[2], dw_data[0]-8); + if(!test->str_props[Uri_PROPERTY_PATH].value[0] && + (test->dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START].value == URL_SCHEME_HTTP + || test->dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START].value == URL_SCHEME_FTP + || test->dword_props[Uri_PROPERTY_SCHEME-Uri_PROPERTY_DWORD_START].value == URL_SCHEME_HTTPS)) + U(max_size).LowPart += 3*sizeof(DWORD); + ok(dw_data[2] == U(max_size).LowPart, "%d) Incorrect value %d, expected %d (PersistStream size).\n", + i, dw_data[2], U(max_size).LowPart); + IMarshal_Release(marshal); + IUri_Release(uri); + + hr = IStream_Seek(stream, no_off, STREAM_SEEK_SET, NULL); + ok(hr == S_OK, "%d) Seek failed 0x%08x, expected S_OK.\n", i, hr); + hr = CoCreateInstance(&curi, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IUri, (void**)&uri); + ok(hr == S_OK, "%d) Error creating uninitialized Uri: 0x%08x.\n", i, hr); + hr = IUri_QueryInterface(uri, &IID_IMarshal, (void**)&marshal); + ok(hr == S_OK, "%d) QueryInterface failed 0x%08x, expected S_OK.\n", i, hr); + hr = IMarshal_UnmarshalInterface(marshal, stream, &IID_IUri, (void**)&uri); + ok(hr == S_OK, "%d) UnmarshalInterface failed 0x%08x, expected S_OK.\n", i, hr); + hr = IUri_GetRawUri(uri, &raw_uri); + ok(hr == S_OK, "%d) GetRawUri failed 0x%08x, expected S_OK.\n", i, hr); + ok(!strcmp_aw(test->str_props[Uri_PROPERTY_RAW_URI].value, raw_uri) + || broken(test->str_props[Uri_PROPERTY_RAW_URI].broken_value + && !strcmp_aw(test->str_props[Uri_PROPERTY_RAW_URI].broken_value, raw_uri)), + "%d) Expected %s but got %s.\n", i, test->str_props[Uri_PROPERTY_RAW_URI].value, + wine_dbgstr_w(raw_uri)); + SysFreeString(raw_uri); + + IMarshal_Release(marshal); + IStream_Release(stream); + IPersistStream_Release(persist_stream); + IUri_Release(uri); + heap_free(uriW); + } +} + +static void test_UninitializedUri(void) +{ + IUri *uri; + IUriBuilderFactory *ubf; + IPersistStream *ps; + IUriBuilder *ub; + BSTR bstr; + DWORD dword; + BOOL eq; + ULARGE_INTEGER ui; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_CUri, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IUri, (void**)&uri); + if(FAILED(hr)) { + win_skip("Skipping uninitialized Uri tests.\n"); + return; + } + + hr = IUri_QueryInterface(uri, &IID_IUriBuilderFactory, (void**)&ubf); + ok(hr == S_OK, "QueryInterface(IID_IUriBuillderFactory) failed: %x.\n", hr); + hr = IUri_QueryInterface(uri, &IID_IPersistStream, (void**)&ps); + ok(hr == S_OK, "QueryInterface(IID_IPersistStream) failed: %x.\n", hr); + + hr = IUri_GetAbsoluteUri(uri, NULL); + ok(hr == E_UNEXPECTED, "GetAbsoluteUri returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetAbsoluteUri(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetAbsoluteUri returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetAuthority(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetAuthority returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetDisplayUri(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetDisplayUri returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetDomain(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetDomain returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetExtension(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetExtension returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetFragment(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetFragment returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetHost(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetHost returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetHostType(uri, &dword); + ok(hr == E_UNEXPECTED, "GetHostType returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPassword(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetPassword returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPassword(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetPassword returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPathAndQuery(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetPathAndQuery returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPort(uri, &dword); + ok(hr == E_UNEXPECTED, "GetPort returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetProperties(uri, &dword); + ok(hr == E_UNEXPECTED, "GetProperties returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPropertyBSTR(uri, Uri_PROPERTY_RAW_URI, &bstr, 0); + ok(hr == E_UNEXPECTED, "GetPropertyBSTR returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPropertyDWORD(uri, Uri_PROPERTY_PORT, &dword, 0); + ok(hr == E_UNEXPECTED, "GetPropertyDWORD returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetPropertyLength(uri, Uri_PROPERTY_RAW_URI, &dword, 0); + ok(hr == E_UNEXPECTED, "GetPropertyLength returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetQuery(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetQuery returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetRawUri(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetRawUri returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetScheme(uri, &dword); + ok(hr == E_UNEXPECTED, "GetScheme returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetSchemeName(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetSchemeName returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetUserInfo(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetUserInfo returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetUserName(uri, &bstr); + ok(hr == E_UNEXPECTED, "GetUserName returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_GetZone(uri, &dword); + ok(hr == E_UNEXPECTED, "GetZone returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUri_IsEqual(uri, uri, &eq); + ok(hr == E_UNEXPECTED, "IsEqual returned %x, expected E_UNEXPECTED.\n", hr); + + hr = IUriBuilderFactory_CreateInitializedIUriBuilder(ubf, 0, 0, &ub); + ok(hr == E_UNEXPECTED, "CreateInitializedIUriBuilder returned %x, expected E_UNEXPECTED.\n", hr); + hr = IUriBuilderFactory_CreateIUriBuilder(ubf, 0, 0, &ub); + ok(hr == S_OK, "CreateIUriBuilder returned %x, expected S_OK.\n", hr); + IUriBuilder_Release(ub); + + hr = IPersistStream_GetSizeMax(ps, &ui); + ok(hr == S_OK, "GetSizeMax returned %x, expected S_OK.\n", hr); + ok(ui.u.LowPart == 34, "ui.LowPart = %d, expected 34.\n", ui.u.LowPart); + hr = IPersistStream_IsDirty(ps); + ok(hr == S_FALSE, "IsDirty returned %x, expected S_FALSE.\n", hr); + + IPersistStream_Release(ps); + IUriBuilderFactory_Release(ubf); + IUri_Release(uri); +} + START_TEST(uri) { HMODULE hurlmon; @@ -10038,6 +11320,8 @@ START_TEST(uri) { pCoInternetCombineIUri = (void*) GetProcAddress(hurlmon, "CoInternetCombineIUri"); pCoInternetCombineUrlEx = (void*) GetProcAddress(hurlmon, "CoInternetCombineUrlEx"); pCoInternetParseIUri = (void*) GetProcAddress(hurlmon, "CoInternetParseIUri"); + pCreateURLMonikerEx = (void*) GetProcAddress(hurlmon, "CreateURLMonikerEx"); + pCreateURLMonikerEx2 = (void*) GetProcAddress(hurlmon, "CreateURLMonikerEx2"); if(!pCreateUri) { win_skip("CreateUri is not present, skipping tests.\n"); @@ -10136,5 +11420,17 @@ START_TEST(uri) { trace("test CoInternetParseIUri pluggable...\n"); test_CoInternetParseIUri_Pluggable(); + trace("test CreateURLMoniker...\n"); + test_CreateURLMoniker(); + + CoInitialize(NULL); + + trace("test IPersistStream...\n"); + test_IPersistStream(); + + trace("test uninitialized Uri...\n"); + test_UninitializedUri(); + + CoUninitialize(); unregister_protocols(); } diff --git a/rostests/winetests/urlmon/url.c b/rostests/winetests/urlmon/url.c index eb4d31625a5..5a4a52007b5 100644 --- a/rostests/winetests/urlmon/url.c +++ b/rostests/winetests/urlmon/url.c @@ -19,21 +19,29 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include #define COBJMACROS #define NONAMELESSUNION #define CONST_VTABLE -#include "windef.h" -#include "winbase.h" -#include "initguid.h" -#include "urlmon.h" -#include "wininet.h" -#include "mshtml.h" +#include +#include +#include +#include +#include +#include +//#include "initguid.h" +//#include "urlmon.h" +#include +#include -#include "wine/test.h" +#include static HRESULT (WINAPI *pCreateAsyncBindCtxEx)(IBindCtx *, DWORD, IBindStatusCallback *, IEnumFORMATETC *, IBindCtx **, DWORD); @@ -42,6 +50,7 @@ static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**); DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(IID_IBindStatusCallbackHolder,0x79eac9cc,0xbaf9,0x11ce,0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b); +extern CLSID CLSID_AboutProtocol; #define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE @@ -149,29 +158,7 @@ DEFINE_EXPECT(OnSecurityProblem); static const WCHAR winetest_data_urlW[] = {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/', 't','e','s','t','s','/','d','a','t','a','.','p','h','p',0}; - -static const WCHAR TEST_PART_URL_1[] = {'/','t','e','s','t','s','/','d','a','t','a','.','p','h','p','\0'}; - -static const WCHAR winetest_post_urlW[] = - {'h','t','t','p',':','/','/','t','e','s','t','.','w','i','n','e','h','q','.','o','r','g','/', - 't','e','s','t','s','/','p','o','s','t','.','p','h','p',0}; -static const WCHAR ABOUT_BLANK[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; -static WCHAR INDEX_HTML[MAX_PATH]; -static const WCHAR ITS_URL[] = - {'i','t','s',':','t','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0}; -static const WCHAR MK_URL[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':', - 't','e','s','t','.','c','h','m',':',':','/','b','l','a','n','k','.','h','t','m','l',0}; -static const WCHAR https_urlW[] = - {'h','t','t','p','s',':','/','/','w','w','w','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m', - '/','t','e','s','t','.','h','t','m','l',0}; -static const WCHAR https_invalid_cn_urlW[] = - {'h','t','t','p','s',':','/','/','2','0','9','.','4','6','.','2','5','.','1','3','2', - '/','t','e','s','t','.','h','t','m','l',0}; -static const WCHAR ftp_urlW[] = {'f','t','p',':','/','/','f','t','p','.','w','i','n','e','h','q','.','o','r','g', - '/','p','u','b','/','o','t','h','e','r','/', - 'w','i','n','e','l','o','g','o','.','x','c','f','.','t','a','r','.','b','z','2',0}; -static const WCHAR winetest_urlW[] = {'w','i','n','e','t','e','s','t',':','t','e','s','t',0}; - +static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; static const WCHAR wszTextHtml[] = {'t','e','x','t','/','h','t','m','l',0}; @@ -190,8 +177,9 @@ static const CHAR test_txtA[] = "test.txt"; static const WCHAR emptyW[] = {0}; static BOOL stopped_binding = FALSE, stopped_obj_binding = FALSE, emulate_protocol = FALSE, - data_available = FALSE, http_is_first = TRUE, bind_to_object = FALSE, filedwl_api; + data_available = FALSE, http_is_first = TRUE, bind_to_object = FALSE, filedwl_api, post_test; static DWORD read = 0, bindf = 0, prot_state = 0, thread_id, tymed, security_problem; +static const WCHAR *reported_url; static CHAR mime_type[512]; static IInternetProtocolSink *protocol_sink = NULL; static IBinding *current_binding; @@ -206,19 +194,9 @@ static BOOL only_check_prot_args = FALSE; static BOOL invalid_cn_accepted = FALSE; static BOOL abort_start = FALSE; static BOOL abort_progress = FALSE; +static BOOL async_switch = FALSE; -static LPCWSTR urls[] = { - winetest_data_urlW, - ABOUT_BLANK, - INDEX_HTML, - ITS_URL, - MK_URL, - https_urlW, - ftp_urlW, - winetest_urlW -}; - -static WCHAR file_url[INTERNET_MAX_URL_LENGTH]; +static WCHAR file_url[INTERNET_MAX_URL_LENGTH], current_url[INTERNET_MAX_URL_LENGTH]; static enum { HTTP_TEST, @@ -228,7 +206,8 @@ static enum { MK_TEST, HTTPS_TEST, FTP_TEST, - WINETEST_TEST + WINETEST_TEST, + WINETEST_SYNC_TEST } test_protocol; static enum { @@ -317,6 +296,8 @@ static void test_create(void) IBindCtx *bctx; HRESULT hr; + static const WCHAR TEST_PART_URL_1[] = {'/','t','e','s','t','s','/','d','a','t','a','.','p','h','p',0}; + test_CreateURLMoniker(winetest_data_urlW, TEST_PART_URL_1); mon = (void*)0xdeadbeef; @@ -324,6 +305,7 @@ static void test_create(void) ok(hr == S_OK, "got 0x%08x\n", hr); hr = CreateBindCtx(0, &bctx); + ok(hr == S_OK, "got 0x%08x\n", hr); stream = (void*)0xdeadbeef; hr = IMoniker_BindToStorage(mon, bctx, NULL, &IID_IStream, (void**)&stream); @@ -434,7 +416,7 @@ static ULONG WINAPI Protocol_Release(IInternetProtocol *iface) static void test_switch_fail(void) { IInternetProtocolSink *binding_sink; - PROTOCOLDATA protocoldata; + PROTOCOLDATA protocoldata = {0}; HRESULT hres; static BOOL tested_switch_fail; @@ -455,7 +437,7 @@ static void test_switch_fail(void) static DWORD WINAPI thread_proc(PVOID arg) { - PROTOCOLDATA protocoldata; + PROTOCOLDATA protocoldata = {0}; HRESULT hres; if(!no_callback) { @@ -468,7 +450,7 @@ static DWORD WINAPI thread_proc(PVOID arg) BINDSTATUS_FINDINGRESOURCE, wszWineHQSite); ok(hres == S_OK, "ReportProgress failed: %08x\n", hres); if(!no_callback) { - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(bind_to_object) CHECK_CALLED(Obj_OnProgress_FINDINGRESOURCE); else @@ -485,7 +467,7 @@ static DWORD WINAPI thread_proc(PVOID arg) BINDSTATUS_CONNECTING, wszWineHQIP); ok(hres == S_OK, "ReportProgress failed: %08x\n", hres); if(!no_callback) { - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(bind_to_object) CHECK_CALLED(Obj_OnProgress_CONNECTING); else @@ -502,7 +484,7 @@ static DWORD WINAPI thread_proc(PVOID arg) BINDSTATUS_SENDINGREQUEST, NULL); ok(hres == S_OK, "ReportProgress failed: %08x\n", hres); if(!no_callback) { - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(bind_to_object) CHECK_CALLED(Obj_OnProgress_SENDINGREQUEST); else @@ -516,7 +498,7 @@ static DWORD WINAPI thread_proc(PVOID arg) SET_EXPECT(OnProgress_REDIRECTING); hres = IInternetProtocolSink_ReportProgress(protocol_sink, BINDSTATUS_REDIRECTING, winetest_data_urlW); ok(hres == S_OK, "ReportProgress(BINDSTATUS_REFIRECTING) failed: %08x\n", hres); - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); if(bind_to_object) CHECK_CALLED(Obj_OnProgress_REDIRECTING); else @@ -529,7 +511,7 @@ static DWORD WINAPI thread_proc(PVOID arg) prot_state = 1; hres = IInternetProtocolSink_Switch(protocol_sink, &protocoldata); ok(hres == S_OK, "Switch failed: %08x\n", hres); - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); CHECK_CALLED(Continue); CHECK_CALLED(Read); @@ -557,7 +539,7 @@ static DWORD WINAPI thread_proc(PVOID arg) prot_state = 2; hres = IInternetProtocolSink_Switch(protocol_sink, &protocoldata); ok(hres == S_OK, "Switch failed: %08x\n", hres); - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); CHECK_CALLED(Continue); if(test_abort) { CHECK_CALLED(OnProgress_DOWNLOADINGDATA); @@ -576,7 +558,7 @@ static DWORD WINAPI thread_proc(PVOID arg) prot_state = 2; hres = IInternetProtocolSink_Switch(protocol_sink, &protocoldata); ok(hres == S_OK, "Switch failed: %08x\n", hres); - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); CHECK_CALLED(Continue); CHECK_CALLED(Read); if(!no_callback) { @@ -588,7 +570,7 @@ static DWORD WINAPI thread_proc(PVOID arg) prot_state = 3; hres = IInternetProtocolSink_Switch(protocol_sink, &protocoldata); ok(hres == S_OK, "Switch failed: %08x\n", hres); - WaitForSingleObject(complete_event, INFINITE); + ok( WaitForSingleObject(complete_event, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); CHECK_CALLED(Continue); CHECK_CALLED(Read); if(!no_callback) { @@ -618,8 +600,9 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, read = 0; + reported_url = szUrl; if(!filedwl_api) /* FIXME */ - ok(szUrl && !lstrcmpW(szUrl, urls[test_protocol]), "wrong url %s\n", wine_dbgstr_w(szUrl)); + ok(szUrl && !lstrcmpW(szUrl, current_url), "wrong url %s\n", wine_dbgstr_w(szUrl)); ok(pOIProtSink != NULL, "pOIProtSink == NULL\n"); ok(pOIBindInfo != NULL, "pOIBindInfo == NULL\n"); ok(grfPI == 0, "grfPI=%d, expected 0\n", grfPI); @@ -636,6 +619,11 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, return S_OK; } + memset(&bindinfo, 0, sizeof(bindinfo)); + bindinfo.cbSize = 0; + hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bind_info, &bindinfo); + ok(hres == E_INVALIDARG, "GetBindInfo returned: %08x, expected E_INVALIDARG\n", hres); + memset(&bindinfo, 0, sizeof(bindinfo)); bindinfo.cbSize = sizeof(bindinfo); hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bind_info, &bindinfo); @@ -695,6 +683,9 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, CHECK_CALLED(Obj_OnProgress_SENDINGREQUEST); else CHECK_CALLED(OnProgress_SENDINGREQUEST); + case WINETEST_SYNC_TEST: + IInternetProtocolSink_AddRef(pOIProtSink); + protocol_sink = pOIProtSink; default: break; } @@ -756,7 +747,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, SET_EXPECT(BeginningTransaction); SET_EXPECT(QueryInterface_IHttpNegotiate); } - hres = IHttpNegotiate_BeginningTransaction(http_negotiate, urls[test_protocol], + hres = IHttpNegotiate_BeginningTransaction(http_negotiate, current_url, NULL, 0, &additional_headers); if(!no_callback) { CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate); @@ -802,14 +793,27 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink_AddRef(pOIProtSink); protocol_sink = pOIProtSink; - CreateThread(NULL, 0, thread_proc, NULL, 0, &tid); - return S_OK; + if(async_switch) { + PROTOCOLDATA data; + + memset(&data, 0, sizeof(data)); + data.grfFlags = PI_FORCE_ASYNC; + prot_state = 0; + hres = IInternetProtocolSink_Switch(pOIProtSink, &data); + ok(hres == S_OK, "Switch failed: %08x\n", hres); + SET_EXPECT(Continue); + SetEvent(complete_event2); + return E_PENDING; + } else { + CreateThread(NULL, 0, thread_proc, NULL, 0, &tid); + return S_OK; + } } if(test_protocol == FILE_TEST) { hres = IInternetProtocolSink_ReportProgress(pOIProtSink, - BINDSTATUS_CACHEFILENAMEAVAILABLE, file_url+8); + BINDSTATUS_CACHEFILENAMEAVAILABLE, file_url+7); ok(hres == S_OK, "ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE) failed: %08x\n", hres); @@ -825,9 +829,14 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, CHECK_CALLED(Obj_OnProgress_MIMETYPEAVAILABLE); else CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); + }else if(test_protocol == WINETEST_SYNC_TEST) { + SET_EXPECT(OnProgress_MIMETYPEAVAILABLE); + hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE, wszTextHtml); + ok(hres == S_OK, + "ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres); + CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); }else { - hres = IInternetProtocolSink_ReportProgress(pOIProtSink, - BINDSTATUS_MIMETYPEAVAILABLE, wszTextHtml); + hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_MIMETYPEAVAILABLE, wszTextHtml); ok(hres == S_OK, "ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres); } @@ -839,7 +848,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, SET_EXPECT(Read); if(bind_to_object) { - if(test_protocol != FILE_TEST && test_protocol != MK_TEST) + if(test_protocol != FILE_TEST && test_protocol != MK_TEST && test_protocol != WINETEST_SYNC_TEST) SET_EXPECT(Obj_OnProgress_MIMETYPEAVAILABLE); SET_EXPECT(Obj_OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) @@ -864,7 +873,8 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, SET_EXPECT(LockRequest); if(!filedwl_api) SET_EXPECT(OnDataAvailable); - SET_EXPECT(OnStopBinding); + if(test_protocol != WINETEST_SYNC_TEST) /* Set in Read after ReportResult call */ + SET_EXPECT(OnStopBinding); } hres = IInternetProtocolSink_ReportData(pOIProtSink, bscf, 13, 13); @@ -888,7 +898,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, CHECK_CALLED(OnObjectAvailable); CHECK_CALLED(Obj_OnStopBinding); }else { - if(test_protocol != FILE_TEST && test_protocol != MK_TEST) + if(test_protocol != FILE_TEST && test_protocol != MK_TEST && test_protocol != WINETEST_SYNC_TEST) CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA); if(test_protocol == FILE_TEST) @@ -905,17 +915,19 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_BEGINDOWNLOADDATA, NULL); ok(hres == S_OK, "ReportProgress(BINDSTATUS_BEGINDOWNLOADDATA) failed: %08x\n", hres); CHECK_CALLED(Read); - }else if(!bind_to_object && test_protocol == ABOUT_TEST) { + }else if(!bind_to_object && test_protocol == FILE_TEST) { SET_EXPECT(Read); hres = IInternetProtocolSink_ReportData(pOIProtSink, bscf, 13, 13); ok(hres == S_OK, "ReportData failed: %08x\n", hres); CHECK_CALLED(Read); } - SET_EXPECT(Terminate); - hres = IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL); - ok(hres == S_OK, "ReportResult failed: %08x\n", hres); - CHECK_CALLED(Terminate); + if(test_protocol != WINETEST_SYNC_TEST) { + SET_EXPECT(Terminate); + hres = IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL); + ok(hres == S_OK, "ReportResult failed: %08x\n", hres); + CHECK_CALLED(Terminate); + } return S_OK; } @@ -930,11 +942,26 @@ static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface, ok(GetCurrentThreadId() == thread_id, "wrong thread %d\n", GetCurrentThreadId()); + if(!bind_to_object) + ok(reported_url && !lstrcmpW(reported_url, current_url), "wrong url %s\n", wine_dbgstr_w(reported_url)); + ok(pProtocolData != NULL, "pProtocolData == NULL\n"); if(!pProtocolData) return S_OK; switch(prot_state) { + case 0: + hres = IInternetProtocolSink_ReportProgress(protocol_sink, + BINDSTATUS_SENDINGREQUEST, NULL); + ok(hres == S_OK, "ReportProgress failed: %08x\n", hres); + + hres = IInternetProtocolSink_ReportProgress(protocol_sink, + BINDSTATUS_MIMETYPEAVAILABLE, wszTextHtml); + ok(hres == S_OK, + "ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres); + + bscf |= BSCF_FIRSTDATANOTIFICATION|BSCF_INTERMEDIATEDATANOTIFICATION; + break; case 1: { IServiceProvider *service_provider; IHttpNegotiate *http_negotiate; @@ -989,6 +1016,15 @@ static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface, if(prot_state != 2 || !test_abort) SET_EXPECT(Read); switch(prot_state) { + case 0: + hres = IInternetProtocolSink_ReportResult(protocol_sink, S_OK, 0, NULL); + ok(hres == S_OK, "ReportResult failed: %08x\n", hres); + SET_EXPECT(OnProgress_SENDINGREQUEST); + SET_EXPECT(OnProgress_MIMETYPEAVAILABLE); + SET_EXPECT(OnProgress_BEGINDOWNLOADDATA); + SET_EXPECT(LockRequest); + SET_EXPECT(OnStopBinding); + break; case 1: if(bind_to_object) { SET_EXPECT(Obj_OnProgress_MIMETYPEAVAILABLE); @@ -1074,6 +1110,8 @@ static HRESULT WINAPI Protocol_Resume(IInternetProtocol *iface) static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead) { + HRESULT hres; + static const char data[] = ""; CHECK_EXPECT2(Read); @@ -1082,9 +1120,18 @@ static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv, ok(cb != 0, "cb == 0\n"); ok(pcbRead != NULL, "pcbRead == NULL\n"); - if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST) { - HRESULT hres; + if(async_switch) { + if(prot_state++ > 1) { + *pcbRead = 0; + return S_FALSE; + } else { + memset(pv, '?', cb); + *pcbRead = cb; + return S_OK; + } + } + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST) { static int pending = TRUE; pending = !pending; @@ -1128,6 +1175,13 @@ static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv, return S_FALSE; } + if(test_protocol == WINETEST_SYNC_TEST) { + hres = IInternetProtocolSink_ReportResult(protocol_sink, S_OK, 0, NULL); + ok(hres == S_OK, "ReportResult failed: %08x\n", hres); + + SET_EXPECT(OnStopBinding); + } + ok(*pcbRead == 0, "*pcbRead=%d, expected 0\n", *pcbRead); read += *pcbRead = sizeof(data)-1; memcpy(pv, data, sizeof(data)); @@ -1206,7 +1260,7 @@ static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface, ok(GetCurrentThreadId() == thread_id, "wrong thread %d\n", GetCurrentThreadId()); - ok(!lstrcmpW(szURL, urls[test_protocol]), "szURL != urls[test_protocol]\n"); + ok(!lstrcmpW(szURL, current_url), "szURL != current_url\n"); ok(!dwReserved, "dwReserved=%d, expected 0\n", dwReserved); ok(pszAdditionalHeaders != NULL, "pszAdditionalHeaders == NULL\n"); if(pszAdditionalHeaders) @@ -1419,12 +1473,13 @@ static void test_WinInetHttpInfo(IWinInetHttpInfo *http_info, DWORD progress) size = sizeof(DWORD); hres = IWinInetHttpInfo_QueryInfo(http_info, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL, NULL); - ok(hres == expect, "hres = %x, expected %x\n", hres, expect); + ok(hres == expect || ((progress == BINDSTATUS_COOKIE_SENT || progress == BINDSTATUS_PROXYDETECTING) && hres == S_FALSE), + "progress %u: hres = %x, expected %x\n", progress, hres, expect); if(hres == S_OK) { - if(download_state==BEFORE_DOWNLOAD && progress!=BINDSTATUS_MIMETYPEAVAILABLE) - ok(status == 0, "status = %d\n", status); + if(download_state == BEFORE_DOWNLOAD && progress != BINDSTATUS_MIMETYPEAVAILABLE && progress != BINDSTATUS_DECODING) + ok(status == 0, "progress %u: status = %d\n", progress, status); else - ok(status == HTTP_STATUS_OK, "status = %d\n", status); + ok(status == HTTP_STATUS_OK, "progress %u: status = %d\n", progress, status); ok(size == sizeof(DWORD), "size = %d\n", size); } @@ -1538,6 +1593,9 @@ static HRESULT WINAPI statusclb_OnStartBinding(IBindStatusCallbackEx *iface, DWO IWinInetHttpInfo *http_info; HRESULT hres; IMoniker *mon; + DWORD res; + CLSID clsid; + LPOLESTR res_str; if(iface == &objbsc) CHECK_EXPECT(Obj_OnStartBinding); @@ -1562,6 +1620,23 @@ static HRESULT WINAPI statusclb_OnStartBinding(IBindStatusCallbackEx *iface, DWO hres = IBinding_QueryInterface(pib, &IID_IWinInetHttpInfo, (void**)&http_info); ok(hres == E_NOINTERFACE, "Could not get IID_IWinInetHttpInfo: %08x\n", hres); + if(0) { /* crashes with native urlmon */ + hres = IBinding_GetBindResult(pib, NULL, &res, &res_str, NULL); + ok(hres == E_INVALIDARG, "GetBindResult failed: %08x\n", hres); + } + hres = IBinding_GetBindResult(pib, &clsid, NULL, &res_str, NULL); + ok(hres == E_INVALIDARG, "GetBindResult failed: %08x\n", hres); + hres = IBinding_GetBindResult(pib, &clsid, &res, NULL, NULL); + ok(hres == E_INVALIDARG, "GetBindResult failed: %08x\n", hres); + hres = IBinding_GetBindResult(pib, &clsid, &res, &res_str, (void*)0xdeadbeef); + ok(hres == E_INVALIDARG, "GetBindResult failed: %08x\n", hres); + + hres = IBinding_GetBindResult(pib, &clsid, &res, &res_str, NULL); + ok(hres == S_OK, "GetBindResult failed: %08x, expected S_OK\n", hres); + ok(IsEqualCLSID(&clsid, &CLSID_NULL), "incorrect clsid: %s\n", debugstr_guid(&clsid)); + ok(!res, "incorrect res: %x\n", res); + ok(!res_str, "incorrect res_str: %s\n", wine_dbgstr_w(res_str)); + if(abort_start) { binding_hres = abort_hres; return abort_hres; @@ -1658,7 +1733,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u if(filedwl_api) { /* FIXME */ }else { - ok(!lstrcmpW(szStatusText, urls[test_protocol]), "wrong szStatusText %s\n", wine_dbgstr_w(szStatusText)); + ok(!lstrcmpW(szStatusText, current_url), "wrong szStatusText %s\n", wine_dbgstr_w(szStatusText)); } } if(!bind_to_object) @@ -1695,7 +1770,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u if(filedwl_api) { /* FIXME */ }else { - ok(!lstrcmpW(szStatusText, urls[test_protocol]), "wrong szStatusText %s\n", wine_dbgstr_w(szStatusText)); + ok(!lstrcmpW(szStatusText, current_url), "wrong szStatusText %s\n", wine_dbgstr_w(szStatusText)); } } ok(download_state == DOWNLOADING, "Download state was %d, expected DOWNLOADING\n", @@ -1715,7 +1790,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u ok(szStatusText != NULL, "szStatusText == NULL\n"); if(szStatusText && test_protocol == FILE_TEST) - ok(!lstrcmpW(file_url+8, szStatusText), "wrong szStatusText %s\n", wine_dbgstr_w(szStatusText)); + ok(!lstrcmpW(file_url+7, szStatusText), "wrong szStatusText %s\n", wine_dbgstr_w(szStatusText)); break; case BINDSTATUS_CLASSIDAVAILABLE: { @@ -1749,6 +1824,9 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u case BINDSTATUS_COOKIE_SENT: trace("BINDSTATUS_COOKIE_SENT\n"); break; + case BINDSTATUS_DECODING: + trace("BINDSTATUS_DECODING\n"); + break; default: ok(0, "unexpected code %d\n", ulStatusCode); }; @@ -1803,10 +1881,54 @@ static HRESULT WINAPI statusclb_OnStopBinding(IBindStatusCallbackEx *iface, HRES ok(hresult == binding_hres, "binding failed: %08x, expected %08x\n", hresult, binding_hres); ok(szError == NULL, "szError should be NULL\n"); + if(current_binding) { + CLSID clsid; + DWORD res; + LPOLESTR res_str; + HRESULT hres; + + hres = IBinding_GetBindResult(current_binding, &clsid, &res, &res_str, NULL); + ok(hres == S_OK, "GetBindResult failed: %08x, expected S_OK\n", hres); + ok(res == hresult, "res = %08x, expected %08x\n", res, binding_hres); + ok(!res_str, "incorrect res_str = %s\n", wine_dbgstr_w(res_str)); + + if(hresult==S_OK || (abort_start && hresult!=S_FALSE)) { + ok(IsEqualCLSID(&clsid, &CLSID_NULL), + "incorrect protocol CLSID: %s, expected CLSID_NULL\n", + debugstr_guid(&clsid)); + }else if(emulate_protocol) { + todo_wine ok(IsEqualCLSID(&clsid, &CLSID_FtpProtocol), + "incorrect protocol CLSID: %s, expected CLSID_FtpProtocol\n", + debugstr_guid(&clsid)); + }else if(test_protocol == FTP_TEST) { + ok(IsEqualCLSID(&clsid, &CLSID_FtpProtocol), + "incorrect protocol CLSID: %s, expected CLSID_FtpProtocol\n", + debugstr_guid(&clsid)); + }else if(test_protocol == FILE_TEST) { + ok(IsEqualCLSID(&clsid, &CLSID_FileProtocol), + "incorrect protocol CLSID: %s, expected CLSID_FileProtocol\n", + debugstr_guid(&clsid)); + }else if(test_protocol == HTTP_TEST) { + ok(IsEqualCLSID(&clsid, &CLSID_HttpProtocol), + "incorrect protocol CLSID: %s, expected CLSID_HttpProtocol\n", + debugstr_guid(&clsid)); + }else if(test_protocol == HTTPS_TEST) { + ok(IsEqualCLSID(&clsid, &CLSID_HttpSProtocol), + "incorrect protocol CLSID: %s, expected CLSID_HttpSProtocol\n", + debugstr_guid(&clsid)); + }else if(test_protocol == ABOUT_TEST) { + ok(IsEqualCLSID(&clsid, &CLSID_AboutProtocol), + "incorrect protocol CLSID: %s, expected CLSID_AboutProtocol\n", + debugstr_guid(&clsid)); + }else { + ok(0, "unexpected (%d)\n", test_protocol); + } + } + if((test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST) && emulate_protocol) { SetEvent(complete_event); if(iface != &objbsc) - WaitForSingleObject(complete_event2, INFINITE); + ok( WaitForSingleObject(complete_event2, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); } return S_OK; @@ -1929,7 +2051,7 @@ static HRESULT WINAPI statusclb_OnDataAvailable(IBindStatusCallbackEx *iface, DW case TYMED_FILE: if(test_protocol == FILE_TEST) - ok(!lstrcmpW(pstgmed->u.lpszFileName, INDEX_HTML+7), + ok(!lstrcmpW(pstgmed->u.lpszFileName, file_url+7), "unexpected file name %s\n", wine_dbgstr_w(pstgmed->u.lpszFileName)); else if(emulate_protocol) ok(!lstrcmpW(pstgmed->u.lpszFileName, cache_fileW), @@ -2084,9 +2206,9 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva ok(GetCurrentThreadId() == thread_id, "wrong thread %d\n", GetCurrentThreadId()); if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST) - ok(!fFullyAvailable, "fFulyAvailable = %x\n", fFullyAvailable); + ok(!fFullyAvailable, "fFullyAvailable = %x\n", fFullyAvailable); else - ok(fFullyAvailable, "fFulyAvailable = %x\n", fFullyAvailable); + ok(fFullyAvailable, "fFullyAvailable = %x\n", fFullyAvailable); ok(pimkName != NULL, "pimkName == NULL\n"); ok(pibc != NULL, "pibc == NULL\n"); ok(grfMode == 0x12, "grfMode = %x\n", grfMode); @@ -2485,7 +2607,7 @@ static BOOL test_bscholder(IBindStatusCallback *holder) wstr = (void*)0xdeadbeef; SET_EXPECT(QueryInterface_IHttpNegotiate); SET_EXPECT(BeginningTransaction); - hres = IHttpNegotiate_BeginningTransaction(http_negotiate_serv, urls[test_protocol], emptyW, 0, &wstr); + hres = IHttpNegotiate_BeginningTransaction(http_negotiate_serv, current_url, emptyW, 0, &wstr); CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate); /* IE8 */ CHECK_CALLED(BeginningTransaction); ok(hres == S_OK, "BeginningTransaction failed: %08x\n", hres); @@ -2517,8 +2639,8 @@ static BOOL test_bscholder(IBindStatusCallback *holder) CHECK_CALLED_BROKEN(QueryInterface_IHttpNegotiate2); /* IE8 */ CHECK_CALLED(GetRootSecurityId); - IHttpNegotiate_Release(http_negotiate2_serv); - IHttpNegotiate_Release(http_negotiate2); + IHttpNegotiate2_Release(http_negotiate2_serv); + IHttpNegotiate2_Release(http_negotiate2); }else { skip("Could not get IHttpNegotiate2\n"); ret = FALSE; @@ -2686,9 +2808,12 @@ static BOOL test_RegisterBindStatusCallback(void) #define BINDTEST_INVALID_CN 0x0200 #define BINDTEST_ABORT_START 0x0400 #define BINDTEST_ABORT_PROGRESS 0x0800 +#define BINDTEST_ASYNC_SWITCH 0x1000 static void init_bind_test(int protocol, DWORD flags, DWORD t) { + const char *url_a = NULL; + test_protocol = protocol; emulate_protocol = (flags & BINDTEST_EMULATE) != 0; download_state = BEFORE_DOWNLOAD; @@ -2700,14 +2825,40 @@ static void init_bind_test(int protocol, DWORD flags, DWORD t) bind_to_object = (flags & BINDTEST_TOOBJECT) != 0; tymed = t; filedwl_api = (flags & BINDTEST_FILEDWLAPI) != 0; - if(flags & BINDTEST_HTTPRESPONSE) - urls[HTTP_TEST] = winetest_post_urlW; - else - urls[HTTP_TEST] = winetest_data_urlW; - if(flags & BINDTEST_INVALID_CN) - urls[HTTPS_TEST] = https_invalid_cn_urlW; - else - urls[HTTPS_TEST] = https_urlW; + post_test = (flags & BINDTEST_HTTPRESPONSE) != 0; + + switch(protocol) { + case HTTP_TEST: + if(post_test) + url_a = "http://test.winehq.org/tests/post.php"; + else + lstrcpyW(current_url, winetest_data_urlW); + break; + case ABOUT_TEST: + url_a = "about:blank"; + break; + case FILE_TEST: + lstrcpyW(current_url, file_url); + break; + case MK_TEST: + url_a = "mk:@MSITStore:test.chm::/blank.html"; + break; + case ITS_TEST: + url_a = "its:test.chm::/blank.html"; + break; + case HTTPS_TEST: + url_a = (flags & BINDTEST_INVALID_CN) ? "https://209.46.25.132/test.html" : "https://www.codeweavers.com/test.html"; + break; + case FTP_TEST: + url_a = "ftp://ftp.winehq.org/pub/other/winelogo.xcf.tar.bz2"; + break; + default: + url_a = "winetest:test"; + } + + if(url_a) + MultiByteToWideChar(CP_ACP, 0, url_a, -1, current_url, sizeof(current_url)/sizeof(*current_url)); + test_redirect = (flags & BINDTEST_REDIRECT) != 0; use_cache_file = (flags & BINDTEST_USE_CACHE) != 0; callback_read = !(flags & BINDTEST_NO_CALLBACK_READ); @@ -2715,7 +2866,12 @@ static void init_bind_test(int protocol, DWORD flags, DWORD t) test_abort = (flags & BINDTEST_ABORT) != 0; abort_start = (flags & BINDTEST_ABORT_START) != 0; abort_progress = (flags & BINDTEST_ABORT_PROGRESS) != 0; + async_switch = (flags & BINDTEST_ASYNC_SWITCH) != 0; is_async_prot = protocol == HTTP_TEST || protocol == HTTPS_TEST || protocol == FTP_TEST || protocol == WINETEST_TEST; + prot_state = 0; + ResetEvent(complete_event); + + trace("URL: %s\n", wine_dbgstr_w(current_url)); } static void test_BindToStorage(int protocol, DWORD flags, DWORD t) @@ -2751,7 +2907,7 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t) IBindStatusCallback_Release(previousclb); } - hres = CreateURLMoniker(NULL, test_protocol == FILE_TEST ? file_url : urls[test_protocol], &mon); + hres = CreateURLMoniker(NULL, current_url, &mon); ok(hres == S_OK, "failed to create moniker: %08x\n", hres); if(FAILED(hres)) return; @@ -2763,8 +2919,8 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t) hres = IMoniker_GetDisplayName(mon, bctx, NULL, &display_name); ok(hres == S_OK, "GetDisplayName failed %08x\n", hres); - ok(!lstrcmpW(display_name, urls[test_protocol]), - "GetDisplayName got wrong name %s\n", wine_dbgstr_w(display_name)); + ok(!lstrcmpW(display_name, current_url), "GetDisplayName got wrong name %s, expected %s\n", + wine_dbgstr_w(display_name), wine_dbgstr_w(current_url)); CoTaskMemFree(display_name); if(tymed == TYMED_FILE && (test_protocol == ABOUT_TEST || test_protocol == ITS_TEST)) @@ -2792,7 +2948,8 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t) if(is_urlmon_protocol(test_protocol)) SET_EXPECT(SetPriority); SET_EXPECT(Start); - if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST) + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST + || test_protocol == WINETEST_SYNC_TEST) SET_EXPECT(Terminate); if(tymed != TYMED_FILE || (test_protocol != ABOUT_TEST && test_protocol != ITS_TEST)) SET_EXPECT(UnlockRequest); @@ -2862,7 +3019,7 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t) ok(hres == MK_S_ASYNCHRONOUS, "IMoniker_BindToStorage failed: %08x\n", hres); else if(no_callback) { if(emulate_protocol) - WaitForSingleObject(complete_event2, INFINITE); + ok( WaitForSingleObject(complete_event2, 90000) == WAIT_OBJECT_0, "wait timed out\n" ); ok(hres == S_OK, "IMoniker_BindToStorage failed: %08x\n", hres); ok(unk != NULL, "unk == NULL\n"); }else if(!(bindf & BINDF_ASYNCHRONOUS) && tymed == TYMED_FILE) { @@ -2906,6 +3063,13 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t) } } + if(async_switch) { + CHECK_CALLED(OnProgress_SENDINGREQUEST); + CHECK_CALLED(OnProgress_MIMETYPEAVAILABLE); + CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA); + CHECK_CALLED(LockRequest); + CHECK_CALLED(OnStopBinding); + } if(!no_callback) { CLEAR_CALLED(QueryInterface_IBindStatusCallbackEx); /* IE 8 */ CHECK_CALLED(GetBindInfo); @@ -2925,7 +3089,8 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t) if(is_urlmon_protocol(test_protocol)) CHECK_CALLED(SetPriority); CHECK_CALLED(Start); - if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST) { + if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == WINETEST_TEST + || test_protocol == WINETEST_SYNC_TEST) { if(tymed == TYMED_FILE) CLEAR_CALLED(Read); CHECK_CALLED(Terminate); @@ -3064,7 +3229,7 @@ static void test_BindToObject(int protocol, DWORD flags) if(FAILED(hres)) return; - hres = CreateURLMoniker(NULL, test_protocol == FILE_TEST ? file_url : urls[test_protocol], &mon); + hres = CreateURLMoniker(NULL, current_url, &mon); ok(hres == S_OK, "failed to create moniker: %08x\n", hres); if(FAILED(hres)) { IBindCtx_Release(bctx); @@ -3078,7 +3243,7 @@ static void test_BindToObject(int protocol, DWORD flags) hres = IMoniker_GetDisplayName(mon, bctx, NULL, &display_name); ok(hres == S_OK, "GetDisplayName failed %08x\n", hres); - ok(!lstrcmpW(display_name, urls[test_protocol]), "GetDisplayName got wrong name\n"); + ok(!lstrcmpW(display_name, current_url), "GetDisplayName got wrong name\n"); CoTaskMemFree(display_name); SET_EXPECT(QueryInterface_IBindStatusCallbackEx); @@ -3195,7 +3360,7 @@ static void test_BindToObject(int protocol, DWORD flags) CLEAR_CALLED(GetWindow_IWindowForBindingUI); } if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST || test_protocol == FILE_TEST) { - if(urls[test_protocol] == winetest_post_urlW) + if(post_test) CLEAR_CALLED(Obj_OnProgress_SENDINGREQUEST); else CHECK_CALLED(Obj_OnProgress_SENDINGREQUEST); @@ -3275,8 +3440,7 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) SET_EXPECT(OnStopBinding); } - hres = URLDownloadToFileW(NULL, test_protocol == FILE_TEST ? file_url : urls[test_protocol], - dwl_htmlW, 0, (IBindStatusCallback*)&bsc); + hres = URLDownloadToFileW(NULL, current_url, dwl_htmlW, 0, (IBindStatusCallback*)&bsc); ok(hres == S_OK, "URLDownloadToFile failed: %08x\n", hres); CHECK_CALLED(GetBindInfo); @@ -3327,7 +3491,7 @@ static void test_URLDownloadToFile(DWORD prot, BOOL emul) if(prot != FILE_TEST || emul) return; - hres = URLDownloadToFileW(NULL, urls[test_protocol], dwl_htmlW, 0, NULL); + hres = URLDownloadToFileW(NULL, current_url, dwl_htmlW, 0, NULL); ok(hres == S_OK, "URLDownloadToFile failed: %08x\n", hres); res = DeleteFileA(dwl_htmlA); @@ -3354,7 +3518,7 @@ static void test_URLDownloadToFile_abort(void) SET_EXPECT(OnProgress_SENDINGREQUEST); SET_EXPECT(OnStopBinding); - hres = URLDownloadToFileW(NULL, urls[HTTP_TEST], dwl_htmlW, 0, (IBindStatusCallback*)&bsc); + hres = URLDownloadToFileW(NULL, current_url, dwl_htmlW, 0, (IBindStatusCallback*)&bsc); ok(hres == E_ABORT, "URLDownloadToFile failed: %08x, expected E_ABORT\n", hres); CHECK_CALLED(GetBindInfo); @@ -3381,7 +3545,7 @@ static void test_URLDownloadToFile_abort(void) SET_EXPECT(OnStopBinding); abort_hres = E_ABORT; - hres = URLDownloadToFileW(NULL, urls[HTTP_TEST], dwl_htmlW, 0, (IBindStatusCallback*)&bsc); + hres = URLDownloadToFileW(NULL, current_url, dwl_htmlW, 0, (IBindStatusCallback*)&bsc); ok(hres == E_ABORT, "URLDownloadToFile failed: %08x, expected E_ABORT\n", hres); CHECK_CALLED(GetBindInfo); @@ -3416,7 +3580,7 @@ static void test_URLDownloadToFile_abort(void) * IBindStatusCallback's OnStartBinding function. */ abort_hres = E_NOTIMPL; - hres = URLDownloadToFileW(NULL, urls[HTTP_TEST], dwl_htmlW, 0, (IBindStatusCallback*)&bsc); + hres = URLDownloadToFileW(NULL, current_url, dwl_htmlW, 0, (IBindStatusCallback*)&bsc); ok(hres == S_OK, "URLDownloadToFile failed: %08x\n", hres); CHECK_CALLED(GetBindInfo); @@ -3444,15 +3608,10 @@ static void test_URLDownloadToFile_abort(void) static void set_file_url(char *path) { CHAR file_urlA[INTERNET_MAX_URL_LENGTH]; - CHAR INDEX_HTMLA[MAX_PATH]; - lstrcpyA(file_urlA, "file:///"); + lstrcpyA(file_urlA, "file://"); lstrcatA(file_urlA, path); MultiByteToWideChar(CP_ACP, 0, file_urlA, -1, file_url, INTERNET_MAX_URL_LENGTH); - - lstrcpyA(INDEX_HTMLA, "file://"); - lstrcatA(INDEX_HTMLA, path); - MultiByteToWideChar(CP_ACP, 0, INDEX_HTMLA, -1, INDEX_HTML, MAX_PATH); } static void create_file(void) @@ -3512,7 +3671,7 @@ static void test_ReportResult(HRESULT exhres) init_bind_test(ABOUT_TEST, BINDTEST_EMULATE, TYMED_ISTREAM); binding_hres = exhres; - hres = CreateURLMoniker(NULL, ABOUT_BLANK, &mon); + hres = CreateURLMoniker(NULL, about_blankW, &mon); ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres); SET_EXPECT(QueryInterface_IServiceProvider); @@ -3556,7 +3715,7 @@ static void test_BindToStorage_fail(void) IUnknown *unk; HRESULT hres; - hres = CreateURLMoniker(NULL, ABOUT_BLANK, &mon); + hres = CreateURLMoniker(NULL, about_blankW, &mon); ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres); if(FAILED(hres)) return; @@ -3582,6 +3741,8 @@ static void test_StdURLMoniker(void) { IMoniker *mon, *async_mon; LPOLESTR display_name; + IBindCtx *bctx; + IUnknown *unk; HRESULT hres; hres = CoCreateInstance(&IID_IInternet, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, @@ -3603,7 +3764,7 @@ static void test_StdURLMoniker(void) IUri *uri; hres = IMoniker_QueryInterface(mon, &IID_IUriContainer, (void**)&uri_container); - ok(hres == S_OK, "Coud not get IUriMoniker iface: %08x\n", hres); + ok(hres == S_OK, "Could not get IUriMoniker iface: %08x\n", hres); uri = (void*)0xdeadbeef; @@ -3614,6 +3775,23 @@ static void test_StdURLMoniker(void) IUriContainer_Release(uri_container); } + SET_EXPECT(QueryInterface_IServiceProvider); + hres = CreateAsyncBindCtx(0, (IBindStatusCallback*)&bsc, NULL, &bctx); + ok(hres == S_OK, "CreateAsyncBindCtx failed: %08x\n\n", hres); + CHECK_CALLED(QueryInterface_IServiceProvider); + + if(pCreateUri) { /* Skip these tests on old IEs */ + unk = (void*)0xdeadbeef; + hres = IMoniker_BindToStorage(mon, bctx, NULL, &IID_IStream, (void**)&unk); + ok(hres == MK_E_SYNTAX, "BindToStorage failed: %08x, expected MK_E_SYNTAX\n", hres); + ok(!unk, "unk = %p\n", unk); + + unk = (void*)0xdeadbeef; + hres = IMoniker_BindToObject(mon, bctx, NULL, &IID_IUnknown, (void**)&unk); + ok(hres == MK_E_SYNTAX, "BindToStorage failed: %08x, expected MK_E_SYNTAX\n", hres); + ok(!unk, "unk = %p\n", unk); + } + IMoniker_Release(mon); } @@ -3730,6 +3908,9 @@ START_TEST(url) bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; + trace("winetest test (async switch)...\n"); + test_BindToStorage(WINETEST_TEST, BINDTEST_EMULATE|BINDTEST_ASYNC_SWITCH, TYMED_ISTREAM); + trace("about test (no read)...\n"); test_BindToStorage(ABOUT_TEST, BINDTEST_NO_CALLBACK_READ, TYMED_ISTREAM); @@ -3805,6 +3986,9 @@ START_TEST(url) trace("emulated about test (to object)...\n"); test_BindToObject(ABOUT_TEST, BINDTEST_EMULATE); + trace("emulalated test reporting result in read...\n"); + test_BindToStorage(WINETEST_SYNC_TEST, BINDTEST_EMULATE, TYMED_ISTREAM); + trace("file test...\n"); test_BindToStorage(FILE_TEST, 0, TYMED_ISTREAM); From a1f65fd77f63d8a4fae2b80d7f864bebb65eb34a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Fri, 22 Mar 2013 15:10:46 +0000 Subject: [PATCH 40/74] [OPENGL32] * Sync implementation of wglUseFontBitmaps and wglUseFontOutlines with WINE 1.5.26 svn path=/trunk/; revision=58571 --- reactos/dll/opengl/opengl32/font.c | 1612 +++++++-------------- reactos/dll/opengl/opengl32/opengl32.spec | 8 +- 2 files changed, 515 insertions(+), 1105 deletions(-) diff --git a/reactos/dll/opengl/opengl32/font.c b/reactos/dll/opengl/opengl32/font.c index 4f67b572e27..800b80143c4 100644 --- a/reactos/dll/opengl/opengl32/font.c +++ b/reactos/dll/opengl/opengl32/font.c @@ -1,1155 +1,565 @@ -/**************************************************************************** -* Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included -* in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -* SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -****************************************************************************/ +/* Window-specific OpenGL functions implementation. + * + * Copyright (c) 1999 Lionel Ulmer + * Copyright (c) 2005 Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ -#include "opengl32.h" +#include #include +#include -#define LINE_BUF_QUANT 4000 -#define VERT_BUF_QUANT 4000 +#include +#include +#include -static HFONT hNewFont, hOldFont; -static FLOAT ScaleFactor; -static FLOAT* LineBuf; -static DWORD LineBufSize; -static DWORD LineBufIndex; -static FLOAT* VertBuf; -static DWORD VertBufSize; -static DWORD VertBufIndex; -static GLenum TessErrorOccurred; +#include "wine/debug.h" -/***************************************************************************** -* AppendToLineBuf -* -* Appends one floating-point value to the global LineBuf array. Return value -* is non-zero for success, zero for failure. -*****************************************************************************/ +WINE_DEFAULT_DEBUG_CHANNEL(wgl); -INT AppendToLineBuf(FLOAT value) +/*********************************************************************** + * wglUseFontBitmaps_common + */ +static BOOL wglUseFontBitmaps_common( HDC hdc, DWORD first, DWORD count, DWORD listBase, BOOL unicode ) { - if (LineBufIndex >= LineBufSize) - { - FLOAT* f; - LineBufSize += LINE_BUF_QUANT; - - f = (FLOAT*) HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, LineBuf, (LineBufSize) * sizeof(FLOAT)); - if (!f) - return 0; - LineBuf = f; - } - LineBuf[LineBufIndex++] = value; - return 1; -} - -/***************************************************************************** -* AppendToVertBuf -* -* Appends one floating-point value to the global VertBuf array. Return value -* is non-zero for success, zero for failure. -* -* Note that we can't realloc this one, because the tessellator is using -* pointers into it. -*****************************************************************************/ - -INT AppendToVertBuf(FLOAT value) -{ - if (VertBufIndex >= VertBufSize) - return 0; - VertBuf[VertBufIndex++] = value; - return 1; -} - -/***************************************************************************** -* GetWord -* -* Fetch the next 16-bit word from a little-endian byte stream, and increment -* the stream pointer to the next unscanned byte. -*****************************************************************************/ - -LONG GetWord(UCHAR** p) -{ - LONG value; - - value = ((*p)[1] << 8) + (*p)[0]; - *p += 2; - return value; -} - -/***************************************************************************** -* GetDWord -* -* Fetch the next 32-bit word from a little-endian byte stream, and increment -* the stream pointer to the next unscanned byte. -*****************************************************************************/ - -LONG GetDWord(UCHAR** p) -{ - LONG value; - - value = ((*p)[3] << 24) + ((*p)[2] << 16) + ((*p)[1] << 8) + (*p)[0]; - *p += 4; - return value; -} - -/***************************************************************************** -* GetFixed -* -* Fetch the next 32-bit fixed-point value from a little-endian byte stream, -* convert it to floating-point, and increment the stream pointer to the next -* unscanned byte. -*****************************************************************************/ -double GetFixed(UCHAR** p) -{ - LONG hiBits, loBits; - double value; - - loBits = GetWord(p); - hiBits = GetWord(p); - value = (double) ((hiBits << 16) | loBits) / 65536.0; - - return value * ScaleFactor; -} - - -/***************************************************************************** -** -** InvertGlyphBitmap. -** -** Invert the bitmap so that it suits OpenGL's representation. -** Each row starts on a double word boundary. -** -*****************************************************************************/ - -VOID InvertGlyphBitmap(INT w, INT h, DWORD *fptr, DWORD *tptr) -{ - INT dWordsInRow = (w+31)/32; - INT i, j; - - if (w <= 0 || h <= 0) { - return; - } - - tptr += ((h-1)*dWordsInRow); - for (i = 0; i < h; i++) { - for (j = 0; j < dWordsInRow; j++) { - *(tptr + j) = *(fptr + j); - } - tptr -= dWordsInRow; - fptr += dWordsInRow; - } -} - -/***************************************************************************** -* CreateHighResolutionFont -* -* Gets metrics for the current font and creates an equivalent font -* scaled to the design units of the font. -* -*****************************************************************************/ - -HFONT CreateHighResolutionFont(HDC hDC) -{ - UINT otmSize; - OUTLINETEXTMETRIC *otm; - LONG fontHeight, fontWidth, fontUnits; - LOGFONTW logFont, logFontFaceName; - - otmSize = GetOutlineTextMetricsW(hDC, 0, NULL); - if (!otmSize) - return NULL; - - otm = (OUTLINETEXTMETRIC *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, otmSize); - if (!otm) - return NULL; - - otm->otmSize = otmSize; - if (!GetOutlineTextMetricsW(hDC, otmSize, otm)) - return NULL; - - GetObjectW(GetCurrentObject(hDC, OBJ_FONT), sizeof(logFontFaceName), &logFontFaceName); - - fontHeight = otm->otmTextMetrics.tmHeight - - otm->otmTextMetrics.tmInternalLeading; - fontWidth = otm->otmTextMetrics.tmAveCharWidth; - fontUnits = (LONG) otm->otmEMSquare; - - ScaleFactor = 1.0F / (FLOAT) fontUnits; - - logFont.lfHeight = - ((LONG) fontUnits); - logFont.lfWidth = (LONG)((FLOAT) (fontWidth * fontUnits) / (FLOAT) fontHeight); - logFont.lfEscapement = 0; - logFont.lfOrientation = 0; - logFont.lfWeight = otm->otmTextMetrics.tmWeight; - logFont.lfItalic = otm->otmTextMetrics.tmItalic; - logFont.lfUnderline = otm->otmTextMetrics.tmUnderlined; - logFont.lfStrikeOut = otm->otmTextMetrics.tmStruckOut; - logFont.lfCharSet = otm->otmTextMetrics.tmCharSet; - logFont.lfOutPrecision = OUT_OUTLINE_PRECIS; - logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; - logFont.lfQuality = DEFAULT_QUALITY; - logFont.lfPitchAndFamily = - otm->otmTextMetrics.tmPitchAndFamily & 0xf0; - wcscpy(logFont.lfFaceName, logFontFaceName.lfFaceName); - - hNewFont = CreateFontIndirectW(&logFont); - - HeapFree(GetProcessHeap(), 0, otm); - - return hNewFont; -} - -/***************************************************************************** -* MakeLinesFromArc -* -* Subdivides one arc of a quadratic spline until the chordal deviation -* tolerance requirement is met, then places the resulting set of line -* segments in the global LineBuf. -*****************************************************************************/ -INT MakeLinesFromArc(FLOAT x0, FLOAT y0, FLOAT x1, FLOAT y1, FLOAT x2, FLOAT y2, - DWORD vertexCountIndex, FLOAT chordalDeviationSquared) -{ - FLOAT x01; - FLOAT y01; - FLOAT x12; - FLOAT y12; - FLOAT midPointX; - FLOAT midPointY; - FLOAT deltaX; - FLOAT deltaY; - - /* - * Calculate midpoint of the curve by de Casteljau: - */ - x01 = 0.5F * (x0 + x1); - y01 = 0.5F * (y0 + y1); - x12 = 0.5F * (x1 + x2); - y12 = 0.5F * (y1 + y2); - midPointX = 0.5F * (x01 + x12); - midPointY = 0.5F * (y01 + y12); - - - /* - * Estimate chordal deviation by the distance from the midpoint - * of the curve to its non-pointpolated control point. If this - * distance is greater than the specified chordal deviation - * constraint, then subdivide. Otherwise, generate polylines - * from the three control points. - */ - deltaX = midPointX - x1; - deltaY = midPointY - y1; - - if (deltaX * deltaX + deltaY * deltaY > chordalDeviationSquared) - { - MakeLinesFromArc( x0, y0, - x01, y01, - midPointX, midPointY, - vertexCountIndex, - chordalDeviationSquared); - - MakeLinesFromArc( midPointX, midPointY, - x12, y12, - x2, y2, - vertexCountIndex, - chordalDeviationSquared); - } - else - { - /* - * The "pen" is already at (x0, y0), so we don't need to - * add that point to the LineBuf. - */ - if (!AppendToLineBuf(x1) - || !AppendToLineBuf(y1) - || !AppendToLineBuf(x2) - || !AppendToLineBuf(y2)) - return 0; - LineBuf[vertexCountIndex] += 2.0F; - } - - return 1; -} - -/***************************************************************************** -* MakeLinesFromTTQSpline -* -* Converts points from the poly quadratic spline in a TT_PRIM_QSPLINE -* structure to polyline points in the global LineBuf. -*****************************************************************************/ - -INT MakeLinesFromTTQSpline( UCHAR** pp, DWORD vertexCountIndex, WORD pointCount, FLOAT chordalDeviation) -{ - FLOAT x0, y0, x1, y1, x2, y2; - WORD point; - - /* - * Process each of the non-pointpolated points in the outline. - * To do this, we need to generate two pointpolated points (the - * start and end of the arc) for each non-pointpolated point. - * The first pointpolated point is always the one most recently - * stored in LineBuf, so we just extract it from there. The - * second pointpolated point is either the average of the next - * two points in the QSpline, or the last point in the QSpline - * if only one remains. - */ - for (point = 0; point < pointCount - 1; ++point) - { - x0 = LineBuf[LineBufIndex - 2]; - y0 = LineBuf[LineBufIndex - 1]; - - x1 = (FLOAT) GetFixed(pp); - y1 = (FLOAT) GetFixed(pp); - - if (point == pointCount - 2) - { - /* - * This is the last arc in the QSpline. The final - * point is the end of the arc. - */ - x2 = (FLOAT) GetFixed(pp); - y2 = (FLOAT) GetFixed(pp); - } - else - { - /* - * Peek at the next point in the input to compute - * the end of the arc: - */ - x2 = 0.5F * (x1 + (FLOAT) GetFixed(pp)); - y2 = 0.5F * (y1 + (FLOAT) GetFixed(pp)); - /* - * Push the point back onto the input so it will - * be reused as the next off-curve point: - */ - *pp -= 8; - } - - if (!MakeLinesFromArc( x0, y0, - x1, y1, - x2, y2, - vertexCountIndex, - chordalDeviation * chordalDeviation)) - return 0; - } - - return 1; -} - -/***************************************************************************** -* MakeLinesFromTTLine -* -* Converts points from the polyline in a TT_PRIM_LINE structure to -* equivalent points in the global LineBuf. -*****************************************************************************/ -INT MakeLinesFromTTLine(UCHAR** pp, DWORD vertexCountIndex, WORD pointCount) -{ - /* - * Just copy the line segments into the line buffer (converting - * type as we go): - */ - LineBuf[vertexCountIndex] += pointCount; - while (pointCount--) - { - if (!AppendToLineBuf((FLOAT) GetFixed(pp)) /* X coord */ - || !AppendToLineBuf((FLOAT) GetFixed(pp))) /* Y coord */ - return 0; - } - - return 1; -} - -/***************************************************************************** -* MakeLinesFromTTPolyCurve -* -* Converts the lines and splines in a single TTPOLYCURVE structure to points -* in the global LineBuf. -*****************************************************************************/ - -INT MakeLinesFromTTPolycurve(UCHAR** pp, DWORD vertexCountIndex, FLOAT chordalDeviation) -{ - WORD type; - WORD pointCount; - - /* - * Pick up the relevant fields of the TTPOLYCURVE structure: - */ - type = (WORD) GetWord(pp); - pointCount = (WORD) GetWord(pp); - - /* - * Convert the "curve" to line segments: - */ - if (type == TT_PRIM_LINE) - return MakeLinesFromTTLine( pp, - vertexCountIndex, - pointCount); - else if (type == TT_PRIM_QSPLINE) - return MakeLinesFromTTQSpline( pp, - vertexCountIndex, - pointCount, - chordalDeviation); - else - return 0; -} - -/***************************************************************************** -* MakeLinesFromTTPolygon -* -* Converts a TTPOLYGONHEADER and its associated curve structures into a -* single polyline loop in the global LineBuf. -*****************************************************************************/ - -INT MakeLinesFromTTPolygon(UCHAR** pp, FLOAT chordalDeviation) -{ - DWORD polySize; - UCHAR* polyStart; - DWORD vertexCountIndex; - - /* - * Record where the polygon data begins, and where the loop's - * vertex count resides: - */ - polyStart = *pp; - vertexCountIndex = LineBufIndex; - if (!AppendToLineBuf(0.0F)) - return 0; - - /* - * Extract relevant data from the TTPOLYGONHEADER: - */ - polySize = GetDWord(pp); - if (GetDWord(pp) != TT_POLYGON_TYPE) /* polygon type */ - return 0; - if (!AppendToLineBuf((FLOAT) GetFixed(pp))) /* first X coord */ - return 0; - if (!AppendToLineBuf((FLOAT) GetFixed(pp))) /* first Y coord */ - return 0; - LineBuf[vertexCountIndex] += 1.0F; - - /* - * Process each of the TTPOLYCURVE structures in the polygon: - */ - while (*pp < polyStart + polySize) - if (!MakeLinesFromTTPolycurve( pp, - vertexCountIndex, - chordalDeviation)) - return 0; - - return 1; -} - -/***************************************************************************** -* TessVertexOut -* -* Used by tessellator to handle output vertexes. -*****************************************************************************/ - -VOID CALLBACK TessVertexOutData(FLOAT p[3], GLfloat *pz) -{ - GLfloat v[3]; - v[0] = (GLfloat) p[0]; - v[1] = (GLfloat) p[1]; - v[2] = *pz; - glVertex3fv(v); -} - -/***************************************************************************** -* TessCombine -* -* Used by tessellator to handle self-pointsecting contours and degenerate -* geometry. -*****************************************************************************/ -VOID CALLBACK TessCombine(double coords[3], VOID* vertex_data[4], FLOAT weight[4], VOID** outData) -{ - if (!AppendToVertBuf((FLOAT) coords[0]) - || !AppendToVertBuf((FLOAT) coords[1]) - || !AppendToVertBuf((FLOAT) coords[2])) - TessErrorOccurred = GL_OUT_OF_MEMORY; - - *outData = VertBuf + (VertBufIndex - 3); -} - -/***************************************************************************** -* TessError -* -* Saves the last tessellator error code in the global TessErrorOccurred. -*****************************************************************************/ - -VOID CALLBACK TessError(GLenum error) -{ - TessErrorOccurred = error; -} - -/***************************************************************************** -* MakeLinesFromGlyph -* -* Converts the outline of a glyph from the TTPOLYGON format to a simple -* array of floating-point values containing one or more loops. -* -* The first element of the output array is a count of the number of loops. -* The loop data follows this count. Each loop consists of a count of the -* number of vertices it contains, followed by the vertices. Each vertex -* is an X and Y coordinate. For example, a single triangle might be -* described by this array: -* -* 1., 3., 0., 0., 1., 0., 0., 1. -* ^ ^ ^ ^ ^ ^ ^ ^ -* #loops #verts x1 y1 x2 y2 x3 y3 -* -* A two-loop glyph would look like this: -* -* 2., 3., 0.,0., 1.,0., 0.,1., 3., .2,.2, .4,.2, .2,.4 -* -* Line segments from the TTPOLYGON are transferred to the output array in -* the obvious way. Quadratic splines in the TTPOLYGON are converted to -* collections of line segments -*****************************************************************************/ - -INT MakeLinesFromGlyph(UCHAR* glyphBuf, DWORD glyphSize, FLOAT chordalDeviation) -{ - UCHAR* p; - INT status = 0; - - /* - * Pick up all the polygons (aka loops) that make up the glyph: - */ - if (!AppendToLineBuf(0.0F)) /* loop count at LineBuf[0] */ - goto exit; - - p = glyphBuf; - while (p < glyphBuf + glyphSize) - { - if (!MakeLinesFromTTPolygon(&p, chordalDeviation)) - goto exit; - LineBuf[0] += 1.0F; /* increment loop count */ - } - - status = 1; - -exit: - return status; -} - -/***************************************************************************** -* DrawGlyph -* -* Converts the outline of a glyph to OpenGL drawing primitives, tessellating -* as needed, and then draws the glyph. Tessellation of the quadratic splines -* in the outline is controlled by "chordalDeviation", and the drawing -* primitives (lines or polygons) are selected by "format". -* -* Return value is nonzero for success, zero for failure. -* -* Does not check for OpenGL errors, so if the caller needs to know about them, -* it should call glGetError(). -*****************************************************************************/ - -INT DrawGlyph(UCHAR* glyphBuf, DWORD glyphSize, FLOAT chordalDeviation, FLOAT extrusion, INT format) -{ - INT status = 0; - FLOAT* p; - DWORD loop; - DWORD point; - GLUtesselator* tess = NULL; - - /* - * Initialize the global buffer into which we place the outlines: - */ - LineBuf = (FLOAT*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (LINE_BUF_QUANT) * sizeof(FLOAT)); - - if(!LineBuf) - goto exit; - - LineBufSize = LINE_BUF_QUANT; - LineBufIndex = 0; - - /* - * Convert the glyph outlines to a set of polyline loops. - * (See MakeLinesFromGlyph() for the format of the loop data - * structure.) - */ - if (!MakeLinesFromGlyph(glyphBuf, glyphSize, chordalDeviation)) - goto exit; - p = LineBuf; - - - /* - * Now draw the loops in the appropriate format: - */ - if (format == WGL_FONT_LINES) - { - /* - * This is the easy case. Just draw the outlines. - */ - for (loop = (DWORD) *p++; loop; --loop) - { - glBegin(GL_LINE_LOOP); - for (point = (DWORD) *p++; point; --point) - { - glVertex2fv(p); - p += 2; - } - glEnd(); - } - status = 1; - } - - else if (format == WGL_FONT_POLYGONS) - { - double v[3]; - FLOAT *save_p = p; - GLfloat z_value; - - /* - * This is the hard case. We have to set up a tessellator - * to convert the outlines into a set of polygonal - * primitives, which the tessellator passes to some - * auxiliary routines for drawing. - */ - - VertBuf = (FLOAT*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (VERT_BUF_QUANT) * sizeof(FLOAT)); - - if (!VertBuf) - goto exit; - - VertBufSize = VERT_BUF_QUANT; - VertBufIndex = 0; - - if (!(tess = gluNewTess())) - goto exit; - - gluTessCallback(tess, GLU_BEGIN, (VOID(CALLBACK *)()) glBegin); - gluTessCallback(tess, GLU_TESS_VERTEX_DATA, (VOID(CALLBACK *)()) TessVertexOutData); - gluTessCallback(tess, GLU_END, (VOID(CALLBACK *)()) glEnd); - gluTessCallback(tess, GLU_ERROR, (VOID(CALLBACK *)()) TessError); - gluTessCallback(tess, GLU_TESS_COMBINE, (VOID(CALLBACK *)()) TessCombine); - gluTessNormal(tess, 0.0F, 0.0F, 1.0F); - - TessErrorOccurred = 0; - glNormal3f(0.0f, 0.0f, 1.0f); - v[2] = 0.0; - z_value = 0.0f; - - gluTessBeginPolygon(tess, &z_value); - - for (loop = (DWORD) *p++; loop; --loop) - { - gluTessBeginContour(tess); - - for (point = (DWORD) *p++; point; --point) - { - v[0] = p[0]; - v[1] = p[1]; - gluTessVertex(tess, v, p); - p += 2; - } - - gluTessEndContour(tess); - } - gluTessEndPolygon(tess); - - status = !TessErrorOccurred; - - /* Extrusion code */ - if (extrusion) - { - DWORD loops; - GLfloat thickness = (GLfloat) - extrusion; - FLOAT *vert, *vert2; - DWORD count; - - p = save_p; - loops = (DWORD) *p++; - - for (loop = 0; loop < loops; loop++) - { - GLfloat dx, dy, len; - DWORD last; - - count = (DWORD) *p++; - glBegin(GL_QUAD_STRIP); - - /* Check if the first and last vertex are identical - * so we don't draw the same quad twice. - */ - vert = p + (count-1)*2; - last = (p[0] == vert[0] && p[1] == vert[1]) ? count-1 : count; - - for (point = 0; point <= last; point++) - { - vert = p + 2 * (point % last); - vert2 = p + 2 * ((point+1) % last); - - dx = vert[0] - vert2[0]; - dy = vert[1] - vert2[1]; - len = (GLfloat)sqrt(dx * dx + dy * dy); - - glNormal3f(dy / len, -dx / len, 0.0f); - glVertex3f((GLfloat) vert[0], - (GLfloat) vert[1], thickness); - glVertex3f((GLfloat) vert[0], - (GLfloat) vert[1], 0.0f); - } - - glEnd(); - p += count*2; - } - - /* Draw the back face */ - p = save_p; - v[2] = thickness; - glNormal3f(0.0f, 0.0f, -1.0f); - gluTessNormal(tess, 0.0F, 0.0F, -1.0F); - - gluTessBeginPolygon(tess, &thickness); - - for (loop = (DWORD) *p++; loop; --loop) - { - count = (DWORD) *p++; - - gluTessBeginContour(tess); - - for (point = 0; point < count; point++) - { - vert = p + ((count-point-1)<<1); - v[0] = vert[0]; - v[1] = vert[1]; - gluTessVertex(tess, v, vert); - } - p += count*2; - - gluTessEndContour(tess); - } - gluTessEndPolygon(tess); - } - -#if !defined(NDEBUG) - if (TessErrorOccurred) - DBGPRINT("Tessellation error %s\n", gluErrorString(TessErrorOccurred)); -#endif - } - - -exit: - - if(LineBuf) - HeapFree(GetProcessHeap(), 0, LineBuf); - - if(VertBuf) - HeapFree(GetProcessHeap(), 0, VertBuf); - - if (tess) - gluDeleteTess(tess); - - return status; -} - - -/***************************************************************************** -* MakeDisplayListFromGlyph -* -* Converts the outline of a glyph to an OpenGL display list. -* -* Return value is nonzero for success, zero for failure. -* -* Does not check for OpenGL errors, so if the caller needs to know about them, -* it should call glGetError(). -*****************************************************************************/ - -INT MakeDisplayListFromGlyph(DWORD listName, UCHAR* glyphBuf, DWORD glyphSize, LPGLYPHMETRICSFLOAT glyphMetricsFloat, - FLOAT chordalDeviation, FLOAT extrusion, INT format) -{ - INT status; - - glNewList(listName, GL_COMPILE); - status = DrawGlyph(glyphBuf, glyphSize, chordalDeviation, extrusion, format); - glTranslatef(glyphMetricsFloat->gmfCellIncX, glyphMetricsFloat->gmfCellIncY, 0.0F); - glEndList(); - - return status; -} - -// *********************************************************************** - -/***************************************************************************** -* IntUseFontBitmaps -* -* Converts a subrange of the glyphs in a GDI font to OpenGL display -* lists. -* -* Extended to support any GDI font, not just TrueType fonts. (DaveM) -* -*****************************************************************************/ - -BOOL APIENTRY IntUseFontBitmapsW(HDC hDC, DWORD first, DWORD count, DWORD listBase) -{ - INT i, ox, oy, ix, iy; - INT w = 0, h = 0; - INT iBufSize, iCurBufSize = 0; - DWORD *bitmapBuffer = NULL; - DWORD *invertedBitmapBuffer = NULL; - BOOL bSuccessOrFail = TRUE; - BOOL bTrueType = FALSE; - TEXTMETRIC tm; GLYPHMETRICS gm; - RASTERIZER_STATUS rs; - MAT2 mat; - SIZE size; - RECT rect; - HDC hDCMem; - HBITMAP hBitmap; - BITMAPINFO bmi; - HFONT hFont; + unsigned int glyph, size = 0; + void *bitmap = NULL, *gl_bitmap = NULL; + int org_alignment; + BOOL ret = TRUE; - // Set up a unity matrix. - ZeroMemory(&mat, sizeof(mat)); - mat.eM11.value = 1; - mat.eM22.value = 1; + glGetIntegerv(GL_UNPACK_ALIGNMENT, &org_alignment); + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - // Test to see if selected font is TrueType or not - ZeroMemory(&tm, sizeof(tm)); - if (!GetTextMetrics(hDC, &tm)) - { - DBGPRINT("Font metrics error\n"); - return FALSE; - } - bTrueType = (tm.tmPitchAndFamily & TMPF_TRUETYPE) ? TRUE : FALSE; + for (glyph = first; glyph < first + count; glyph++) { + static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} }; + unsigned int needed_size, height, width, width_int; - // Test to see if TRUE-TYPE capabilities are installed - // (only necessary if TrueType font selected) - ZeroMemory(&rs, sizeof(rs)); - - if (bTrueType) - { - if (!GetRasterizerCaps (&rs, sizeof (RASTERIZER_STATUS)) || !(rs.wFlags & TT_ENABLED)) - { - DBGPRINT("No TrueType caps\n"); - bTrueType = FALSE; - } - } - - // Trick to get the current font handle - hFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); - SelectObject(hDC, hFont); - - // Have memory device context available for holding bitmaps of font glyphs - hDCMem = CreateCompatibleDC(hDC); - SelectObject(hDCMem, hFont); - SetTextColor(hDCMem, RGB(0xFF, 0xFF, 0xFF)); - SetBkColor(hDCMem, 0); - - for (i = first; (DWORD) i < (first + count); i++) - { - // Find out how much space is needed for the bitmap so we can - // Set the buffer size correctly. - if (bTrueType) - { - // Use TrueType support to get bitmap size of glyph - iBufSize = GetGlyphOutline(hDC, i, GGO_BITMAP, &gm, 0, NULL, &mat); - if (iBufSize == GDI_ERROR) - { - bSuccessOrFail = FALSE; - break; - } - } + if (unicode) + needed_size = GetGlyphOutlineW(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity); else - { - // Use generic GDI support to compute bitmap size of glyph - w = tm.tmMaxCharWidth; - h = tm.tmHeight; - if (GetTextExtentPoint32(hDC, (LPCTSTR)&i, 1, &size)) - { - w = size.cx; - h = size.cy; - } - iBufSize = w * h; - // Use DWORD multiple for compatibility - iBufSize += 3; - iBufSize /= 4; - iBufSize *= 4; + needed_size = GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity); + + TRACE("Glyph: %3d / List: %d size %d\n", glyph, listBase, needed_size); + if (needed_size == GDI_ERROR) { + ret = FALSE; + break; } - // If we need to allocate Larger Buffers, then do so - but allocate - // An extra 50 % so that we don't do too many mallocs ! - if (iBufSize > iCurBufSize) - { - if (bitmapBuffer) - { - HeapFree(GetProcessHeap(), 0, bitmapBuffer); - } - if (invertedBitmapBuffer) - { - HeapFree(GetProcessHeap(), 0, invertedBitmapBuffer); - } - - iCurBufSize = iBufSize * 2; - bitmapBuffer = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, iCurBufSize); - invertedBitmapBuffer = (DWORD *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, iCurBufSize); - - if (bitmapBuffer == NULL || invertedBitmapBuffer == NULL) - { - bSuccessOrFail = FALSE; - break; - } - } - - // If we fail to get the Glyph data, delete the display lists - // Created so far and return FALSE. - if (bTrueType) - { - // Use TrueType support to get bitmap of glyph - if (GetGlyphOutline(hDC, i, GGO_BITMAP, &gm, iBufSize, bitmapBuffer, &mat) == GDI_ERROR) - { - bSuccessOrFail = FALSE; - break; - } - - // Setup glBitmap parameters for current font glyph - w = gm.gmBlackBoxX; - h = gm.gmBlackBoxY; - ox = gm.gmptGlyphOrigin.x; - oy = gm.gmptGlyphOrigin.y; - ix = gm.gmCellIncX; - iy = gm.gmCellIncY; + if (needed_size > size) { + size = needed_size; + HeapFree(GetProcessHeap(), 0, bitmap); + HeapFree(GetProcessHeap(), 0, gl_bitmap); + bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + gl_bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); } + if (unicode) + ret = (GetGlyphOutlineW(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) != GDI_ERROR); else - { - // Use generic GDI support to create bitmap of glyph - ZeroMemory(bitmapBuffer, iBufSize); + ret = (GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) != GDI_ERROR); + if (!ret) break; - if (i >= tm.tmFirstChar && i <= tm.tmLastChar) - { - // Only create bitmaps for actual font glyphs - hBitmap = CreateBitmap(w, h, 1, 1, NULL); - SelectObject(hDCMem, hBitmap); - // Make bitmap of current font glyph - SetRect(&rect, 0, 0, w, h); - DrawText(hDCMem, (LPCTSTR)&i, 1, &rect, - DT_LEFT | DT_BOTTOM | DT_SINGLELINE | DT_NOCLIP); - // Make copy of bitmap in our local buffer - ZeroMemory(&bmi, sizeof(bmi)); - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmi.bmiHeader.biWidth = w; - bmi.bmiHeader.biHeight = -h; - bmi.bmiHeader.biPlanes = 1; - bmi.bmiHeader.biBitCount = 1; - bmi.bmiHeader.biCompression = BI_RGB; - GetDIBits(hDCMem, hBitmap, 0, h, bitmapBuffer, &bmi, 0); - DeleteObject(hBitmap); + if (TRACE_ON(wgl)) { + unsigned int bitmask; + unsigned char *bitmap_ = bitmap; + + TRACE(" - bbox: %d x %d\n", gm.gmBlackBoxX, gm.gmBlackBoxY); + TRACE(" - origin: (%d, %d)\n", gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y); + TRACE(" - increment: %d - %d\n", gm.gmCellIncX, gm.gmCellIncY); + if (needed_size != 0) { + TRACE(" - bitmap:\n"); + for (height = 0; height < gm.gmBlackBoxY; height++) { + TRACE(" "); + for (width = 0, bitmask = 0x80; width < gm.gmBlackBoxX; width++, bitmask >>= 1) { + if (bitmask == 0) { + bitmap_ += 1; + bitmask = 0x80; + } + if (*bitmap_ & bitmask) + TRACE("*"); + else + TRACE(" "); + } + bitmap_ += (4 - ((UINT_PTR)bitmap_ & 0x03)); + TRACE("\n"); + } } - else - { - // Otherwise use empty display list for non-existing glyph - iBufSize = 0; + } + + /* In OpenGL, the bitmap is drawn from the bottom to the top... So we need to invert the + * glyph for it to be drawn properly. + */ + if (needed_size != 0) { + width_int = (gm.gmBlackBoxX + 31) / 32; + for (height = 0; height < gm.gmBlackBoxY; height++) { + for (width = 0; width < width_int; width++) { + ((int *) gl_bitmap)[(gm.gmBlackBoxY - height - 1) * width_int + width] = + ((int *) bitmap)[height * width_int + width]; + } } - - // Setup glBitmap parameters for current font glyph - ox = 0; - oy = tm.tmDescent; - ix = w; - iy = 0; } - // Create an OpenGL display list. - glNewList((listBase + i), GL_COMPILE); - - // Some fonts have no data for the space character, yet advertise - // a non-zero size. - if (0 == iBufSize) - { - glBitmap(0, 0, 0.0f, 0.0f, (GLfloat) ix, (GLfloat) iy, NULL); + glNewList(listBase++, GL_COMPILE); + if (needed_size != 0) { + glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY, + 0 - gm.gmptGlyphOrigin.x, (int) gm.gmBlackBoxY - gm.gmptGlyphOrigin.y, + gm.gmCellIncX, gm.gmCellIncY, + gl_bitmap); + } else { + /* This is the case of 'empty' glyphs like the space character */ + glBitmap(0, 0, 0, 0, gm.gmCellIncX, gm.gmCellIncY, NULL); } - else - { - // Invert the Glyph data. - InvertGlyphBitmap(w, h, bitmapBuffer, invertedBitmapBuffer); - - // Render an OpenGL bitmap and invert the origin. - glBitmap(w, h, - (GLfloat) ox, (GLfloat) (h-oy), - (GLfloat) ix, (GLfloat) iy, - (GLubyte *) invertedBitmapBuffer); - } - - // Close this display list. glEndList(); } - if (bSuccessOrFail == FALSE) + glPixelStorei(GL_UNPACK_ALIGNMENT, org_alignment); + HeapFree(GetProcessHeap(), 0, bitmap); + HeapFree(GetProcessHeap(), 0, gl_bitmap); + return ret; +} + +/*********************************************************************** + * wglUseFontBitmapsA (OPENGL32.@) + */ +BOOL WINAPI wglUseFontBitmapsA(HDC hdc, DWORD first, DWORD count, DWORD listBase) +{ + return wglUseFontBitmaps_common( hdc, first, count, listBase, FALSE ); +} + +/*********************************************************************** + * wglUseFontBitmapsW (OPENGL32.@) + */ +BOOL WINAPI wglUseFontBitmapsW(HDC hdc, DWORD first, DWORD count, DWORD listBase) +{ + return wglUseFontBitmaps_common( hdc, first, count, listBase, TRUE ); +} + +/* FIXME: should probably have a glu.h header */ + +typedef struct GLUtesselator GLUtesselator; +typedef void (WINAPI *_GLUfuncptr)(void); + +#define GLU_TESS_BEGIN 100100 +#define GLU_TESS_VERTEX 100101 +#define GLU_TESS_END 100102 + +static GLUtesselator * (WINAPI *pgluNewTess)(void); +static void (WINAPI *pgluDeleteTess)(GLUtesselator *tess); +static void (WINAPI *pgluTessNormal)(GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z); +static void (WINAPI *pgluTessBeginPolygon)(GLUtesselator *tess, void *polygon_data); +static void (WINAPI *pgluTessEndPolygon)(GLUtesselator *tess); +static void (WINAPI *pgluTessCallback)(GLUtesselator *tess, GLenum which, _GLUfuncptr fn); +static void (WINAPI *pgluTessBeginContour)(GLUtesselator *tess); +static void (WINAPI *pgluTessEndContour)(GLUtesselator *tess); +static void (WINAPI *pgluTessVertex)(GLUtesselator *tess, GLdouble *location, GLvoid* data); + +static HMODULE load_libglu(void) +{ + static const WCHAR glu32W[] = {'g','l','u','3','2','.','d','l','l',0}; + static int already_loaded; + static HMODULE module; + + if (already_loaded) return module; + already_loaded = 1; + + TRACE("Trying to load GLU library\n"); + module = LoadLibraryW( glu32W ); + if (!module) { - DBGPRINT("DGL_UseFontBitmaps: Get glyph failed\n"); - glDeleteLists((i+listBase), (i-first)); + WARN("Failed to load glu32\n"); + return NULL; + } +#define LOAD_FUNCPTR(f) p##f = (void *)GetProcAddress( module, #f ) + LOAD_FUNCPTR(gluNewTess); + LOAD_FUNCPTR(gluDeleteTess); + LOAD_FUNCPTR(gluTessBeginContour); + LOAD_FUNCPTR(gluTessNormal); + LOAD_FUNCPTR(gluTessBeginPolygon); + LOAD_FUNCPTR(gluTessCallback); + LOAD_FUNCPTR(gluTessEndContour); + LOAD_FUNCPTR(gluTessEndPolygon); + LOAD_FUNCPTR(gluTessVertex); +#undef LOAD_FUNCPTR + return module; +} + +static void fixed_to_double(POINTFX fixed, UINT em_size, GLdouble vertex[3]) +{ + vertex[0] = (fixed.x.value + (GLdouble)fixed.x.fract / (1 << 16)) / em_size; + vertex[1] = (fixed.y.value + (GLdouble)fixed.y.fract / (1 << 16)) / em_size; + vertex[2] = 0.0; +} + +static void WINAPI tess_callback_vertex(GLvoid *vertex) +{ + GLdouble *dbl = vertex; + TRACE("%f, %f, %f\n", dbl[0], dbl[1], dbl[2]); + glVertex3dv(vertex); +} + +static void WINAPI tess_callback_begin(GLenum which) +{ + TRACE("%d\n", which); + glBegin(which); +} + +static void WINAPI tess_callback_end(void) +{ + TRACE("\n"); + glEnd(); +} + +typedef struct _bezier_vector { + GLdouble x; + GLdouble y; +} bezier_vector; + +static double bezier_deviation_squared(const bezier_vector *p) +{ + bezier_vector deviation; + bezier_vector vertex; + bezier_vector base; + double base_length; + double dot; + + vertex.x = (p[0].x + p[1].x*2 + p[2].x)/4 - p[0].x; + vertex.y = (p[0].y + p[1].y*2 + p[2].y)/4 - p[0].y; + + base.x = p[2].x - p[0].x; + base.y = p[2].y - p[0].y; + + base_length = sqrt(base.x*base.x + base.y*base.y); + base.x /= base_length; + base.y /= base_length; + + dot = base.x*vertex.x + base.y*vertex.y; + dot = min(max(dot, 0.0), base_length); + base.x *= dot; + base.y *= dot; + + deviation.x = vertex.x-base.x; + deviation.y = vertex.y-base.y; + + return deviation.x*deviation.x + deviation.y*deviation.y; +} + +static int bezier_approximate(const bezier_vector *p, bezier_vector *points, FLOAT deviation) +{ + bezier_vector first_curve[3]; + bezier_vector second_curve[3]; + bezier_vector vertex; + int total_vertices; + + if(bezier_deviation_squared(p) <= deviation*deviation) + { + if(points) + *points = p[2]; + return 1; } - // Release resources used - DeleteObject(hFont); - DeleteDC(hDCMem); + vertex.x = (p[0].x + p[1].x*2 + p[2].x)/4; + vertex.y = (p[0].y + p[1].y*2 + p[2].y)/4; - if (bitmapBuffer) - HeapFree(GetProcessHeap(), 0, bitmapBuffer); + first_curve[0] = p[0]; + first_curve[1].x = (p[0].x + p[1].x)/2; + first_curve[1].y = (p[0].y + p[1].y)/2; + first_curve[2] = vertex; - if (invertedBitmapBuffer) - HeapFree(GetProcessHeap(), 0, invertedBitmapBuffer); + second_curve[0] = vertex; + second_curve[1].x = (p[2].x + p[1].x)/2; + second_curve[1].y = (p[2].y + p[1].y)/2; + second_curve[2] = p[2]; - return(bSuccessOrFail); + total_vertices = bezier_approximate(first_curve, points, deviation); + if(points) + points += total_vertices; + total_vertices += bezier_approximate(second_curve, points, deviation); + return total_vertices; } -BOOL APIENTRY IntUseFontBitmapsA(HDC hDC, DWORD first, DWORD count, DWORD listBase) +/*********************************************************************** + * wglUseFontOutlines_common + */ +static BOOL wglUseFontOutlines_common(HDC hdc, + DWORD first, + DWORD count, + DWORD listBase, + FLOAT deviation, + FLOAT extrusion, + int format, + LPGLYPHMETRICSFLOAT lpgmf, + BOOL unicode) { - /* Just call IntUseFontBitmapsW for now */ - return IntUseFontBitmapsW(hDC, first, count, listBase); -} + UINT glyph; + const MAT2 identity = {{0,1},{0,0},{0,0},{0,1}}; + GLUtesselator *tess = NULL; + LOGFONTW lf; + HFONT old_font, unscaled_font; + UINT em_size = 1024; + RECT rc; + TRACE("(%p, %d, %d, %d, %f, %f, %d, %p, %s)\n", hdc, first, count, + listBase, deviation, extrusion, format, lpgmf, unicode ? "W" : "A"); + if(deviation <= 0.0) + deviation = 1.0/em_size; -/***************************************************************************** -* IntUseFontOutlines -* -* Converts a subrange of the glyphs in a TrueType font to OpenGL display -* lists. -*****************************************************************************/ - -BOOL APIENTRY IntUseFontOutlinesW(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT chordalDeviation, - FLOAT extrusion, INT format, GLYPHMETRICSFLOAT *glyphMetricsFloatArray) -{ - DWORD glyphIndex; - UCHAR* glyphBuf; - DWORD glyphBufSize; - - /* - * Flush any previous OpenGL errors. This allows us to check for - * new errors so they can be reported via the function return value. - */ - while (glGetError() != GL_NO_ERROR); - - /* - * Make sure that the current font can be sampled accurately. - */ - hNewFont = CreateHighResolutionFont(hDC); - - if (!hNewFont) - return FALSE; - - hOldFont = SelectObject(hDC, hNewFont); - if (!hOldFont) - return FALSE; - - /* - * Preallocate a buffer for the outline data, and track its size: - */ - glyphBuf = (UCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, glyphBufSize = 10240); - - if (!glyphBuf) - return FALSE; /*WGL_STATUS_NOT_ENOUGH_MEMORY*/ - - /* - * Process each glyph in the given range: - */ - for (glyphIndex = first; glyphIndex - first < count; ++glyphIndex) + if(format == WGL_FONT_POLYGONS) { - GLYPHMETRICS glyphMetrics; - DWORD glyphSize; - static MAT2 matrix = + if (!load_libglu()) { - {0, 1}, {0, 0}, - {0, 0}, {0, 1} - }; - LPGLYPHMETRICSFLOAT glyphMetricsFloat = &glyphMetricsFloatArray[glyphIndex - first]; - - /* - * Determine how much space is needed to store the glyph's - * outlines. If our glyph buffer isn't large enough, - * resize it. - */ - - glyphSize = GetGlyphOutline(hDC, glyphIndex, GGO_NATIVE, &glyphMetrics, 0, NULL, &matrix); - - if (glyphSize == GDI_ERROR) - return FALSE; /*WGL_STATUS_FAILURE*/ - - if (glyphSize > glyphBufSize) - { - HeapFree(GetProcessHeap(), 0, glyphBuf); - glyphBuf = (UCHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, glyphBufSize = glyphSize); - if (!glyphBuf) - return FALSE; /*WGL_STATUS_NOT_ENOUGH_MEMORY*/ + ERR("glu32 is required for this function but isn't available\n"); + return FALSE; } + tess = pgluNewTess(); + if(!tess) return FALSE; + pgluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)tess_callback_vertex); + pgluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)tess_callback_begin); + pgluTessCallback(tess, GLU_TESS_END, tess_callback_end); + } - /* - * Get the glyph's outlines. - */ - if (GetGlyphOutline(hDC, glyphIndex, GGO_NATIVE, &glyphMetrics, glyphBufSize, glyphBuf, &matrix) == GDI_ERROR) + GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf); + rc.left = rc.right = rc.bottom = 0; + rc.top = em_size; + DPtoLP(hdc, (POINT*)&rc, 2); + lf.lfHeight = -abs(rc.top - rc.bottom); + lf.lfOrientation = lf.lfEscapement = 0; + unscaled_font = CreateFontIndirectW(&lf); + old_font = SelectObject(hdc, unscaled_font); + + for (glyph = first; glyph < first + count; glyph++) + { + DWORD needed; + GLYPHMETRICS gm; + BYTE *buf; + TTPOLYGONHEADER *pph; + TTPOLYCURVE *ppc; + GLdouble *vertices = NULL; + int vertex_total = -1; + + if(unicode) + needed = GetGlyphOutlineW(hdc, glyph, GGO_NATIVE, &gm, 0, NULL, &identity); + else + needed = GetGlyphOutlineA(hdc, glyph, GGO_NATIVE, &gm, 0, NULL, &identity); + + if(needed == GDI_ERROR) + goto error; + + buf = HeapAlloc(GetProcessHeap(), 0, needed); + + if(unicode) + GetGlyphOutlineW(hdc, glyph, GGO_NATIVE, &gm, needed, buf, &identity); + else + GetGlyphOutlineA(hdc, glyph, GGO_NATIVE, &gm, needed, buf, &identity); + + TRACE("glyph %d\n", glyph); + + if(lpgmf) { - HeapFree(GetProcessHeap(), 0, glyphBuf); - return FALSE; /*WGL_STATUS_FAILURE*/ + lpgmf->gmfBlackBoxX = (float)gm.gmBlackBoxX / em_size; + lpgmf->gmfBlackBoxY = (float)gm.gmBlackBoxY / em_size; + lpgmf->gmfptGlyphOrigin.x = (float)gm.gmptGlyphOrigin.x / em_size; + lpgmf->gmfptGlyphOrigin.y = (float)gm.gmptGlyphOrigin.y / em_size; + lpgmf->gmfCellIncX = (float)gm.gmCellIncX / em_size; + lpgmf->gmfCellIncY = (float)gm.gmCellIncY / em_size; + + TRACE("%fx%f at %f,%f inc %f,%f\n", lpgmf->gmfBlackBoxX, lpgmf->gmfBlackBoxY, + lpgmf->gmfptGlyphOrigin.x, lpgmf->gmfptGlyphOrigin.y, lpgmf->gmfCellIncX, lpgmf->gmfCellIncY); + lpgmf++; } - glyphMetricsFloat->gmfBlackBoxX = - (FLOAT) glyphMetrics.gmBlackBoxX * ScaleFactor; - glyphMetricsFloat->gmfBlackBoxY = - (FLOAT) glyphMetrics.gmBlackBoxY * ScaleFactor; - glyphMetricsFloat->gmfptGlyphOrigin.x = - (FLOAT) glyphMetrics.gmptGlyphOrigin.x * ScaleFactor; - glyphMetricsFloat->gmfptGlyphOrigin.y = - (FLOAT) glyphMetrics.gmptGlyphOrigin.y * ScaleFactor; - glyphMetricsFloat->gmfCellIncX = - (FLOAT) glyphMetrics.gmCellIncX * ScaleFactor; - glyphMetricsFloat->gmfCellIncY = - (FLOAT) glyphMetrics.gmCellIncY * ScaleFactor; - - /* - * Turn the glyph into a display list: - */ - if (!MakeDisplayListFromGlyph((glyphIndex - first) + listBase, glyphBuf, glyphSize, glyphMetricsFloat, - chordalDeviation + ScaleFactor, extrusion, format)) + glNewList(listBase++, GL_COMPILE); + glFrontFace(GL_CCW); + if(format == WGL_FONT_POLYGONS) { - HeapFree(GetProcessHeap(), 0, glyphBuf); - return FALSE; /*WGL_STATUS_FAILURE*/ + glNormal3d(0.0, 0.0, 1.0); + pgluTessNormal(tess, 0, 0, 1); + pgluTessBeginPolygon(tess, NULL); } + + while(!vertices) + { + if(vertex_total != -1) + vertices = HeapAlloc(GetProcessHeap(), 0, vertex_total * 3 * sizeof(GLdouble)); + vertex_total = 0; + + pph = (TTPOLYGONHEADER*)buf; + while((BYTE*)pph < buf + needed) + { + GLdouble previous[3]; + fixed_to_double(pph->pfxStart, em_size, previous); + + if(vertices) + TRACE("\tstart %d, %d\n", pph->pfxStart.x.value, pph->pfxStart.y.value); + + if(format == WGL_FONT_POLYGONS) + pgluTessBeginContour(tess); + else + glBegin(GL_LINE_LOOP); + + if(vertices) + { + fixed_to_double(pph->pfxStart, em_size, vertices); + if(format == WGL_FONT_POLYGONS) + pgluTessVertex(tess, vertices, vertices); + else + glVertex3d(vertices[0], vertices[1], vertices[2]); + vertices += 3; + } + vertex_total++; + + ppc = (TTPOLYCURVE*)((char*)pph + sizeof(*pph)); + while((char*)ppc < (char*)pph + pph->cb) + { + int i, j; + int num; + + switch(ppc->wType) { + case TT_PRIM_LINE: + for(i = 0; i < ppc->cpfx; i++) + { + if(vertices) + { + TRACE("\t\tline to %d, %d\n", + ppc->apfx[i].x.value, ppc->apfx[i].y.value); + fixed_to_double(ppc->apfx[i], em_size, vertices); + if(format == WGL_FONT_POLYGONS) + pgluTessVertex(tess, vertices, vertices); + else + glVertex3d(vertices[0], vertices[1], vertices[2]); + vertices += 3; + } + fixed_to_double(ppc->apfx[i], em_size, previous); + vertex_total++; + } + break; + + case TT_PRIM_QSPLINE: + for(i = 0; i < ppc->cpfx-1; i++) + { + bezier_vector curve[3]; + bezier_vector *points; + GLdouble curve_vertex[3]; + + if(vertices) + TRACE("\t\tcurve %d,%d %d,%d\n", + ppc->apfx[i].x.value, ppc->apfx[i].y.value, + ppc->apfx[i + 1].x.value, ppc->apfx[i + 1].y.value); + + curve[0].x = previous[0]; + curve[0].y = previous[1]; + fixed_to_double(ppc->apfx[i], em_size, curve_vertex); + curve[1].x = curve_vertex[0]; + curve[1].y = curve_vertex[1]; + fixed_to_double(ppc->apfx[i + 1], em_size, curve_vertex); + curve[2].x = curve_vertex[0]; + curve[2].y = curve_vertex[1]; + if(i < ppc->cpfx-2) + { + curve[2].x = (curve[1].x + curve[2].x)/2; + curve[2].y = (curve[1].y + curve[2].y)/2; + } + num = bezier_approximate(curve, NULL, deviation); + points = HeapAlloc(GetProcessHeap(), 0, num*sizeof(bezier_vector)); + num = bezier_approximate(curve, points, deviation); + vertex_total += num; + if(vertices) + { + for(j=0; jwType); + if(format == WGL_FONT_POLYGONS) + pgluTessEndContour(tess); + else + glEnd(); + goto error_in_list; + } + + ppc = (TTPOLYCURVE*)((char*)ppc + sizeof(*ppc) + + (ppc->cpfx - 1) * sizeof(POINTFX)); + } + if(format == WGL_FONT_POLYGONS) + pgluTessEndContour(tess); + else + glEnd(); + pph = (TTPOLYGONHEADER*)((char*)pph + pph->cb); + } + } + +error_in_list: + if(format == WGL_FONT_POLYGONS) + pgluTessEndPolygon(tess); + glTranslated((GLdouble)gm.gmCellIncX / em_size, (GLdouble)gm.gmCellIncY / em_size, 0.0); + glEndList(); + HeapFree(GetProcessHeap(), 0, buf); + HeapFree(GetProcessHeap(), 0, vertices); } - /* - * Clean up temporary storage and return. If an error occurred, - * clear all OpenGL error flags and return FAILURE status; - * otherwise just return SUCCESS. - */ - HeapFree(GetProcessHeap(), 0, glyphBuf); + error: + DeleteObject(SelectObject(hdc, old_font)); + if(format == WGL_FONT_POLYGONS) + pgluDeleteTess(tess); + return TRUE; - DeleteObject(SelectObject(hDC, hOldFont)); - - if (glGetError() == GL_NO_ERROR) - { - return TRUE; /*WGL_STATUS_SUCCESS*/ - } - else - { - while (glGetError() != GL_NO_ERROR); - - return FALSE; /*WGL_STATUS_FAILURE*/ - } } -BOOL APIENTRY IntUseFontOutlinesA(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT chordalDeviation, - FLOAT extrusion, INT format, GLYPHMETRICSFLOAT *glyphMetricsFloatArray) +/*********************************************************************** + * wglUseFontOutlinesA (OPENGL32.@) + */ +BOOL WINAPI wglUseFontOutlinesA(HDC hdc, + DWORD first, + DWORD count, + DWORD listBase, + FLOAT deviation, + FLOAT extrusion, + int format, + LPGLYPHMETRICSFLOAT lpgmf) { - /* Just call IntUseFontOutlinesW for now */ - return IntUseFontOutlinesW(hDC, first, count, listBase, chordalDeviation, extrusion, format, glyphMetricsFloatArray); + return wglUseFontOutlines_common(hdc, first, count, listBase, deviation, extrusion, format, lpgmf, FALSE); } + +/*********************************************************************** + * wglUseFontOutlinesW (OPENGL32.@) + */ +BOOL WINAPI wglUseFontOutlinesW(HDC hdc, + DWORD first, + DWORD count, + DWORD listBase, + FLOAT deviation, + FLOAT extrusion, + int format, + LPGLYPHMETRICSFLOAT lpgmf) +{ + return wglUseFontOutlines_common(hdc, first, count, listBase, deviation, extrusion, format, lpgmf, TRUE); +} \ No newline at end of file diff --git a/reactos/dll/opengl/opengl32/opengl32.spec b/reactos/dll/opengl/opengl32/opengl32.spec index 5f881b06741..0547d89857c 100644 --- a/reactos/dll/opengl/opengl32/opengl32.spec +++ b/reactos/dll/opengl/opengl32/opengl32.spec @@ -363,7 +363,7 @@ @ stdcall wglSwapBuffers(long) rosglSwapBuffers @ stdcall wglSwapLayerBuffers(long long) rosglSwapLayerBuffers @ stub wglSwapMultipleBuffers -@ stdcall wglUseFontBitmapsA(long long long long) rosglUseFontBitmapsA -@ stdcall wglUseFontBitmapsW(long long long long) rosglUseFontBitmapsW -@ stdcall wglUseFontOutlinesA(long long long long long long long ptr) rosglUseFontOutlinesA -@ stdcall wglUseFontOutlinesW(long long long long long long long ptr) rosglUseFontOutlinesW +@ stdcall wglUseFontBitmapsA(long long long long) +@ stdcall wglUseFontBitmapsW(long long long long) +@ stdcall wglUseFontOutlinesA(long long long long long long long ptr) +@ stdcall wglUseFontOutlinesW(long long long long long long long ptr) From 282d76c7d2261350a9863dff5848205758e10106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Fri, 22 Mar 2013 15:16:58 +0000 Subject: [PATCH 41/74] [OPENGL32] * Forgot this file svn path=/trunk/; revision=58572 --- reactos/dll/opengl/opengl32/wgl.c | 35 ------------------------------- 1 file changed, 35 deletions(-) diff --git a/reactos/dll/opengl/opengl32/wgl.c b/reactos/dll/opengl/opengl32/wgl.c index f6feeac8a0e..fe4942e0601 100644 --- a/reactos/dll/opengl/opengl32/wgl.c +++ b/reactos/dll/opengl/opengl32/wgl.c @@ -1241,41 +1241,6 @@ rosglSwapLayerBuffers( HDC hdc, UINT fuPlanes ) return ret; } - -BOOL -APIENTRY -rosglUseFontBitmapsA( HDC hdc, DWORD first, DWORD count, DWORD listBase ) -{ - return IntUseFontBitmapsA(hdc, first, count, listBase); -} - - -BOOL -APIENTRY -rosglUseFontBitmapsW( HDC hdc, DWORD first, DWORD count, DWORD listBase ) -{ - return IntUseFontBitmapsW(hdc, first, count, listBase); -} - -BOOL -APIENTRY -rosglUseFontOutlinesA( HDC hdc, DWORD first, DWORD count, DWORD listBase, - FLOAT deviation, FLOAT extrusion, int format, - GLYPHMETRICSFLOAT *pgmf ) -{ - return IntUseFontOutlinesA(hdc, first, count, listBase, deviation, extrusion, format, pgmf); -} - - -BOOL -APIENTRY -rosglUseFontOutlinesW( HDC hdc, DWORD first, DWORD count, DWORD listBase, - FLOAT deviation, FLOAT extrusion, int format, - GLYPHMETRICSFLOAT *pgmf ) -{ - return IntUseFontOutlinesW(hdc, first, count, listBase, deviation, extrusion, format, pgmf); -} - #ifdef __cplusplus }; /* extern "C" */ #endif /* __cplusplus */ From 6d5e78708bc850fdbe2b962d315d3ef4f5d91bf7 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Fri, 22 Mar 2013 15:19:51 +0000 Subject: [PATCH 42/74] [SHELL32] Fix shdocvw_v1 dependency. svn path=/trunk/; revision=58573 --- reactos/dll/win32/shell32/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/CMakeLists.txt b/reactos/dll/win32/shell32/CMakeLists.txt index 41660cfe658..6ee35190979 100644 --- a/reactos/dll/win32/shell32/CMakeLists.txt +++ b/reactos/dll/win32/shell32/CMakeLists.txt @@ -107,6 +107,6 @@ add_importlibs(shell32 kernel32 ntdll) -add_dependencies(shdocvw shdocvw_v1) +add_dependencies(shell32 shdocvw_v1) add_pch(shell32 precomp.h) add_cd_file(TARGET shell32 DESTINATION reactos/system32 FOR all) From ddd759e8e3289deb778bff27c42cd2886100d603 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 15:22:05 +0000 Subject: [PATCH 43/74] [OPENGL32] * Don't import from glu32 anymore. * Link to libwine for the debugging facilities. * Fixes build. svn path=/trunk/; revision=58574 --- reactos/dll/opengl/opengl32/CMakeLists.txt | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/reactos/dll/opengl/opengl32/CMakeLists.txt b/reactos/dll/opengl/opengl32/CMakeLists.txt index 57e906b8e60..4fb60910f8b 100644 --- a/reactos/dll/opengl/opengl32/CMakeLists.txt +++ b/reactos/dll/opengl/opengl32/CMakeLists.txt @@ -1,5 +1,4 @@ - spec2def(opengl32.dll opengl32.spec ADD_IMPORTLIB) add_definitions( @@ -16,19 +15,8 @@ list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/opengl32.def) add_library(opengl32 SHARED ${SOURCE}) - +target_link_libraries(opengl32 wine) set_module_type(opengl32 win32dll UNICODE) - -add_importlibs(opengl32 - msvcrt - gdi32 - user32 - advapi32 - glu32 - kernel32 - ntdll) - +add_importlibs(opengl32 gdi32 user32 advapi32 msvcrt kernel32 ntdll) add_pch(opengl32 opengl32.h) - add_cd_file(TARGET opengl32 DESTINATION reactos/system32 FOR all) - From 1a808e4dde255320076003c175fdfa161e19fdf7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 15:35:46 +0000 Subject: [PATCH 44/74] [URLMON] * We no longer need these files. svn path=/trunk/; revision=58575 --- reactos/dll/win32/urlmon/protproxy.c | 292 --------------------------- reactos/dll/win32/urlmon/rsrc.rc | 31 --- reactos/dll/win32/urlmon/version.rc | 27 --- 3 files changed, 350 deletions(-) delete mode 100644 reactos/dll/win32/urlmon/protproxy.c delete mode 100644 reactos/dll/win32/urlmon/rsrc.rc delete mode 100644 reactos/dll/win32/urlmon/version.rc diff --git a/reactos/dll/win32/urlmon/protproxy.c b/reactos/dll/win32/urlmon/protproxy.c deleted file mode 100644 index 30df7cef060..00000000000 --- a/reactos/dll/win32/urlmon/protproxy.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright 2009 Jacek Caban for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "urlmon_main.h" -#include - -WINE_DEFAULT_DEBUG_CHANNEL(urlmon); - -static inline ProtocolProxy *impl_from_IInternetProtocol(IInternetProtocol *iface) -{ - return CONTAINING_RECORD(iface, ProtocolProxy, IInternetProtocol_iface); -} - -static HRESULT WINAPI ProtocolProxy_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IInternetProtocol_iface; - }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { - TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); - *ppv = &This->IInternetProtocol_iface; - }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { - TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); - *ppv = &This->IInternetProtocol_iface; - }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { - TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); - *ppv = &This->IInternetProtocolSink_iface; - } - - if(*ppv) { - IInternetProtocol_AddRef(iface); - return S_OK; - } - - WARN("not supported interface %s\n", debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI ProtocolProxy_AddRef(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - LONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p) ref=%d\n", This, ref); - return ref; -} - -static ULONG WINAPI ProtocolProxy_Release(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - if(!ref) { - if(This->protocol_sink) - IInternetProtocolSink_Release(This->protocol_sink); - if(This->protocol) - IInternetProtocol_Release(This->protocol); - - heap_free(This); - - URLMON_UnlockModule(); - } - - return ref; -} - -static HRESULT WINAPI ProtocolProxy_Start(IInternetProtocol *iface, LPCWSTR szUrl, - IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, - DWORD grfPI, HANDLE_PTR dwReserved) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink, - pOIBindInfo, grfPI, dwReserved); - - return IInternetProtocol_Start(This->protocol, szUrl, pOIProtSink, pOIBindInfo, grfPI, dwReserved); -} - -static HRESULT WINAPI ProtocolProxy_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%p)\n", This, pProtocolData); - - return IInternetProtocol_Continue(This->protocol, pProtocolData); -} - -static HRESULT WINAPI ProtocolProxy_Abort(IInternetProtocol *iface, HRESULT hrReason, - DWORD dwOptions) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_Terminate(IInternetProtocol *iface, DWORD dwOptions) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%08x)\n", This, dwOptions); - - return IInternetProtocol_Terminate(This->protocol, dwOptions); -} - -static HRESULT WINAPI ProtocolProxy_Suspend(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_Resume(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_Read(IInternetProtocol *iface, void *pv, - ULONG cb, ULONG *pcbRead) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); - - return IInternetProtocol_Read(This->protocol, pv, cb, pcbRead); -} - -static HRESULT WINAPI ProtocolProxy_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, - DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition); - return E_NOTIMPL; -} - -static HRESULT WINAPI ProtocolProxy_LockRequest(IInternetProtocol *iface, DWORD dwOptions) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)->(%08x)\n", This, dwOptions); - - return IInternetProtocol_LockRequest(This->protocol, dwOptions); -} - -static HRESULT WINAPI ProtocolProxy_UnlockRequest(IInternetProtocol *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocol(iface); - - TRACE("(%p)\n", This); - - return IInternetProtocol_UnlockRequest(This->protocol); -} - -static const IInternetProtocolVtbl ProtocolProxyVtbl = { - ProtocolProxy_QueryInterface, - ProtocolProxy_AddRef, - ProtocolProxy_Release, - ProtocolProxy_Start, - ProtocolProxy_Continue, - ProtocolProxy_Abort, - ProtocolProxy_Terminate, - ProtocolProxy_Suspend, - ProtocolProxy_Resume, - ProtocolProxy_Read, - ProtocolProxy_Seek, - ProtocolProxy_LockRequest, - ProtocolProxy_UnlockRequest -}; - -static inline ProtocolProxy *impl_from_IInternetProtocolSink(IInternetProtocolSink *iface) -{ - return CONTAINING_RECORD(iface, ProtocolProxy, IInternetProtocolSink_iface); -} - -static HRESULT WINAPI ProtocolProxySink_QueryInterface(IInternetProtocolSink *iface, - REFIID riid, void **ppv) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - return IInternetProtocol_QueryInterface(&This->IInternetProtocol_iface, riid, ppv); -} - -static ULONG WINAPI ProtocolProxySink_AddRef(IInternetProtocolSink *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - return IInternetProtocol_AddRef(&This->IInternetProtocol_iface); -} - -static ULONG WINAPI ProtocolProxySink_Release(IInternetProtocolSink *iface) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - return IInternetProtocol_Release(&This->IInternetProtocol_iface); -} - -static HRESULT WINAPI ProtocolProxySink_Switch(IInternetProtocolSink *iface, - PROTOCOLDATA *pProtocolData) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%p)\n", This, pProtocolData); - - return IInternetProtocolSink_Switch(This->protocol_sink, pProtocolData); -} - -static HRESULT WINAPI ProtocolProxySink_ReportProgress(IInternetProtocolSink *iface, - ULONG ulStatusCode, LPCWSTR szStatusText) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%u %s)\n", This, ulStatusCode, debugstr_w(szStatusText)); - - switch(ulStatusCode) { - case BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE: - IInternetProtocolSink_ReportProgress(This->protocol_sink, BINDSTATUS_MIMETYPEAVAILABLE, szStatusText); - break; - default: - IInternetProtocolSink_ReportProgress(This->protocol_sink, ulStatusCode, szStatusText); - } - - return S_OK; -} - -static HRESULT WINAPI ProtocolProxySink_ReportData(IInternetProtocolSink *iface, - DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%d %u %u)\n", This, grfBSCF, ulProgress, ulProgressMax); - - return IInternetProtocolSink_ReportData(This->protocol_sink, grfBSCF, ulProgress, ulProgressMax); -} - -static HRESULT WINAPI ProtocolProxySink_ReportResult(IInternetProtocolSink *iface, - HRESULT hrResult, DWORD dwError, LPCWSTR szResult) -{ - ProtocolProxy *This = impl_from_IInternetProtocolSink(iface); - - TRACE("(%p)->(%08x %d %s)\n", This, hrResult, dwError, debugstr_w(szResult)); - - return IInternetProtocolSink_ReportResult(This->protocol_sink, hrResult, dwError, szResult); -} - -static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = { - ProtocolProxySink_QueryInterface, - ProtocolProxySink_AddRef, - ProtocolProxySink_Release, - ProtocolProxySink_Switch, - ProtocolProxySink_ReportProgress, - ProtocolProxySink_ReportData, - ProtocolProxySink_ReportResult -}; - -HRESULT create_protocol_proxy(IInternetProtocol *protocol, IInternetProtocolSink *protocol_sink, ProtocolProxy **ret) -{ - ProtocolProxy *sink; - - sink = heap_alloc(sizeof(ProtocolProxy)); - if(!sink) - return E_OUTOFMEMORY; - - sink->IInternetProtocol_iface.lpVtbl = &ProtocolProxyVtbl; - sink->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl; - sink->ref = 1; - - IInternetProtocol_AddRef(protocol); - sink->protocol = protocol; - - IInternetProtocolSink_AddRef(protocol_sink); - sink->protocol_sink = protocol_sink; - - *ret = sink; - return S_OK; -} diff --git a/reactos/dll/win32/urlmon/rsrc.rc b/reactos/dll/win32/urlmon/rsrc.rc deleted file mode 100644 index c86575d228d..00000000000 --- a/reactos/dll/win32/urlmon/rsrc.rc +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2005 Jacek Caban - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -/* @makedep: urlmon.rgs */ -1 WINE_REGISTRY urlmon.rgs - -/* @makedep: urlmon.inf */ -REGINST REGINST urlmon.inf - -#define WINE_FILENAME_STR "urlmon.dll" -#define WINE_FILEVERSION 6,0,2800,1485 -#define WINE_FILEVERSION_STR "6.0.2800.1485" -#define WINE_PRODUCTVERSION 6,0,2800,1485 -#define WINE_PRODUCTVERSION_STR "6.0.2800.1485" - -#include "wine/wine_common_ver.rc" diff --git a/reactos/dll/win32/urlmon/version.rc b/reactos/dll/win32/urlmon/version.rc deleted file mode 100644 index 10cc7216ccd..00000000000 --- a/reactos/dll/win32/urlmon/version.rc +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2005 - * - * Stefan Leichter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#define WINE_FILENAME_STR "urlmon.dll" -#define WINE_FILEVERSION 6,0,2800,1485 -#define WINE_FILEVERSION_STR "6.0.2800.1485" -#define WINE_PRODUCTVERSION 6,0,2800,1485 -#define WINE_PRODUCTVERSION_STR "6.0.2800.1485" - -#include "wine/wine_common_ver.rc" From d1dcc02ee45425234f7ce907ff8018d4991de36a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 15:37:19 +0000 Subject: [PATCH 45/74] [DDK] * Fix some annotations in usbbusif.h. svn path=/trunk/; revision=58576 --- reactos/include/ddk/usbbusif.h | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/reactos/include/ddk/usbbusif.h b/reactos/include/ddk/usbbusif.h index 81d60941c1c..95f9c67bac3 100644 --- a/reactos/include/ddk/usbbusif.h +++ b/reactos/include/ddk/usbbusif.h @@ -12,8 +12,9 @@ typedef PVOID PUSB_DEVICE_HANDLE; #endif +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( _In_ PVOID, _In_ PURB); @@ -26,8 +27,9 @@ typedef VOID _Out_opt_ PUSBD_VERSION_INFORMATION, _Out_opt_ PULONG); +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME) ( _In_ PVOID, _Out_opt_ PULONG); @@ -52,8 +54,9 @@ typedef struct _USB_BUS_INFORMATION_LEVEL_1 { WCHAR ControllerNameUnicodeString[1]; } USB_BUS_INFORMATION_LEVEL_1, *PUSB_BUS_INFORMATION_LEVEL_1; +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_INFORMATION) ( _In_ PVOID, _In_ ULONG, @@ -61,8 +64,9 @@ typedef NTSTATUS _Out_ PULONG, _Out_opt_ PULONG); +typedef _Must_inspect_result_ -typedef BOOLEAN +BOOLEAN (USB_BUSIFFN *PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED) ( _In_opt_ PVOID); @@ -117,14 +121,16 @@ typedef struct _USB_BUS_INTERFACE_USBDI_V2 { #if (NTDDI_VERSION >= NTDDI_VISTA) +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME_EX) ( _In_opt_ PVOID, _Out_opt_ PULONG); +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE) ( _In_opt_ PVOID, _Out_opt_ PULONG, @@ -167,8 +173,9 @@ typedef struct _USBC_FUNCTION_DESCRIPTOR{ PVOID Reserved; } USBC_FUNCTION_DESCRIPTOR, *PUSBC_FUNCTION_DESCRIPTOR; +typedef _Must_inspect_result_ -typedef NTSTATUS +NTSTATUS (USB_BUSIFFN *USBC_START_DEVICE_CALLBACK)( _In_ PUSB_DEVICE_DESCRIPTOR DeviceDescriptor, _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, @@ -178,8 +185,9 @@ typedef NTSTATUS _In_ PDEVICE_OBJECT FdoDeviceObject, _In_ PDEVICE_OBJECT PdoDeviceObject); +typedef _Must_inspect_result_ -typedef BOOLEAN +BOOLEAN (USB_BUSIFFN *USBC_PDO_ENABLE_CALLBACK)( _In_ PVOID Context, _In_ USHORT FirstInterfaceNumber, From 4d6099cf0e42eac879f83cff5b3239f6c4501910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Fri, 22 Mar 2013 16:08:08 +0000 Subject: [PATCH 46/74] [WIN32K] * Do not alter the display palette in RealizePalette. CORE-6940 #comment r58577 should hack this away svn path=/trunk/; revision=58577 --- reactos/win32ss/gdi/ntgdi/palette.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/win32ss/gdi/ntgdi/palette.c b/reactos/win32ss/gdi/ntgdi/palette.c index ec173ce3eda..73b4832ac2c 100644 --- a/reactos/win32ss/gdi/ntgdi/palette.c +++ b/reactos/win32ss/gdi/ntgdi/palette.c @@ -771,6 +771,12 @@ IntGdiRealizePalette(HDC hDC) { goto cleanup; } + + if(pdc->dctype == DCTYPE_DIRECT) + { + UNIMPLEMENTED; + goto cleanup; + } ppalSurf = pdc->dclevel.pSurface->ppal; ppalDC = pdc->dclevel.ppal; From f64a5ef35eb8d877ddecb70223ebaa4980b268e0 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 16:13:06 +0000 Subject: [PATCH 47/74] [CRT] * Annotate sys/stat.h. svn path=/trunk/; revision=58578 --- reactos/include/crt/sys/stat.h | 126 ++++++++++++++++++++++++++++----- 1 file changed, 109 insertions(+), 17 deletions(-) diff --git a/reactos/include/crt/sys/stat.h b/reactos/include/crt/sys/stat.h index 45ec7eaad57..766536c7c8a 100644 --- a/reactos/include/crt/sys/stat.h +++ b/reactos/include/crt/sys/stat.h @@ -139,30 +139,122 @@ extern "C" { #define _S_IWRITE 0x0080 #define _S_IEXEC 0x0040 - _CRTIMP int __cdecl _fstat(int _FileDes,struct _stat *_Stat); - _CRTIMP int __cdecl _fstat32(int _FileDes,struct _stat32 *_Stat); - _CRTIMP int __cdecl _stat(const char *_Name,struct _stat *_Stat); - _CRTIMP int __cdecl _stat32(const char *_Name,struct _stat32 *_Stat); + _CRTIMP + int + __cdecl + _fstat( + _In_ int _FileDes, + _Out_ struct _stat *_Stat); + + _CRTIMP + int + __cdecl + _fstat32( + _In_ int _FileDes, + _Out_ struct _stat32 *_Stat); + + _CRTIMP + int + __cdecl + _stat( + _In_z_ const char *_Name, + _Out_ struct _stat *_Stat); + + _CRTIMP + int + __cdecl + _stat32( + _In_z_ const char *_Name, + _Out_ struct _stat32 *_Stat); #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP int __cdecl _fstat64(int _FileDes,struct _stat64 *_Stat); - _CRTIMP int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat); - _CRTIMP int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat); - _CRTIMP int __cdecl _stat64(const char *_Name,struct _stat64 *_Stat); - _CRTIMP int __cdecl _stat32i64(const char *_Name,struct _stat32i64 *_Stat); - _CRTIMP int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat); + + _CRTIMP + int + __cdecl + _fstat64( + _In_ int _FileDes, + _Out_ struct _stat64 *_Stat); + + _CRTIMP + int + __cdecl + _fstat32i64( + _In_ int _FileDes, + _Out_ struct _stat32i64 *_Stat); + + _CRTIMP + int + __cdecl + _fstat64i32( + _In_ int _FileDes, + _Out_ struct _stat64i32 *_Stat); + + _CRTIMP + int + __cdecl + _stat64( + _In_z_ const char *_Name, + _Out_ struct _stat64 *_Stat); + + _CRTIMP + int + __cdecl + _stat32i64( + _In_z_ const char *_Name, + _Out_ struct _stat32i64 *_Stat); + + _CRTIMP + int + __cdecl + _stat64i32( + _In_z_ const char *_Name, + _Out_ struct _stat64i32 *_Stat); + #endif /* _INTEGRAL_MAX_BITS >= 64 */ #ifndef _WSTAT_DEFINED #define _WSTAT_DEFINED - _CRTIMP int __cdecl _wstat(const wchar_t *_Name,struct _stat *_Stat); - _CRTIMP int __cdecl _wstat32(const wchar_t *_Name,struct _stat32 *_Stat); + + _CRTIMP + int + __cdecl + _wstat( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat *_Stat); + + _CRTIMP + int + __cdecl + _wstat32( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat32 *_Stat); + #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP int __cdecl _wstat32i64(const wchar_t *_Name,struct _stat32i64 *_Stat); - _CRTIMP int __cdecl _wstat64i32(const wchar_t *_Name,struct _stat64i32 *_Stat); - _CRTIMP int __cdecl _wstat64(const wchar_t *_Name,struct _stat64 *_Stat); -#endif -#endif + _CRTIMP + int + __cdecl + _wstat32i64( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat32i64 *_Stat); + + _CRTIMP + int + __cdecl + _wstat64i32( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat64i32 *_Stat); + + _CRTIMP + int + __cdecl + _wstat64( + _In_z_ const wchar_t *_Name, + _Out_ struct _stat64 *_Stat); + +#endif /* _INTEGRAL_MAX_BITS >= 64 */ + +#endif /* _WSTAT_DEFINED */ /** Compatibility definitons *************************************************/ From e8316eb4bf4c0866470bcfb2553a95337d536cc5 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 16:13:43 +0000 Subject: [PATCH 48/74] [MSXML3] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58579 --- reactos/dll/win32/msxml3/attribute.c | 2 +- reactos/dll/win32/msxml3/cdata.c | 20 +- reactos/dll/win32/msxml3/dispex.c | 1 + reactos/dll/win32/msxml3/domdoc.c | 206 ++++++++++++------- reactos/dll/win32/msxml3/element.c | 51 +++-- reactos/dll/win32/msxml3/factory.c | 2 +- reactos/dll/win32/msxml3/httprequest.c | 209 +++++++++++++------ reactos/dll/win32/msxml3/main.c | 2 + reactos/dll/win32/msxml3/msxml_private.h | 21 +- reactos/dll/win32/msxml3/mxwriter.c | 4 +- reactos/dll/win32/msxml3/node.c | 183 ++++++++++++++--- reactos/dll/win32/msxml3/nodelist.c | 68 ++++-- reactos/dll/win32/msxml3/saxreader.c | 250 +++++++++++++---------- reactos/dll/win32/msxml3/schema.c | 109 +++++++--- reactos/dll/win32/msxml3/text.c | 15 ++ reactos/dll/win32/msxml3/xmlparser.c | 46 ++++- reactos/dll/win32/msxml3/xslpattern.l | 2 +- reactos/dll/win32/msxml3/xslpattern.yy.c | 21 +- reactos/media/doc/README.WINE | 2 +- 19 files changed, 848 insertions(+), 366 deletions(-) diff --git a/reactos/dll/win32/msxml3/attribute.c b/reactos/dll/win32/msxml3/attribute.c index edd33d019ae..6bd7a5809d1 100644 --- a/reactos/dll/win32/msxml3/attribute.c +++ b/reactos/dll/win32/msxml3/attribute.c @@ -606,7 +606,7 @@ static HRESULT WINAPI domattr_put_value( TRACE("(%p)->(%s)\n", This, debugstr_variant(&value)); - return node_put_value(&This->node, &value); + return node_put_value_escaped(&This->node, &value); } static const struct IXMLDOMAttributeVtbl domattr_vtbl = diff --git a/reactos/dll/win32/msxml3/cdata.c b/reactos/dll/win32/msxml3/cdata.c index b7d8e3884e7..cbf72cb58a2 100644 --- a/reactos/dll/win32/msxml3/cdata.c +++ b/reactos/dll/win32/msxml3/cdata.c @@ -293,10 +293,9 @@ static HRESULT WINAPI domcdata_insertBefore( IXMLDOMNode** outOldNode) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); - - FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), outOldNode); - - return node_insert_before(&This->node, newNode, &refChild, outOldNode); + TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode); + if (outOldNode) *outOldNode = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_replaceChild( @@ -306,10 +305,9 @@ static HRESULT WINAPI domcdata_replaceChild( IXMLDOMNode** outOldNode) { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); - - FIXME("(%p)->(%p %p %p) needs tests\n", This, newNode, oldNode, outOldNode); - - return node_replace_child(&This->node, newNode, oldNode, outOldNode); + TRACE("(%p)->(%p %p %p)\n", This, newNode, oldNode, outOldNode); + if (outOldNode) *outOldNode = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_removeChild( @@ -318,7 +316,8 @@ static HRESULT WINAPI domcdata_removeChild( { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); TRACE("(%p)->(%p %p)\n", This, child, oldChild); - return node_remove_child(&This->node, child, oldChild); + if (oldChild) *oldChild = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_appendChild( @@ -327,7 +326,8 @@ static HRESULT WINAPI domcdata_appendChild( { domcdata *This = impl_from_IXMLDOMCDATASection( iface ); TRACE("(%p)->(%p %p)\n", This, child, outChild); - return node_append_child(&This->node, child, outChild); + if (outChild) *outChild = NULL; + return E_FAIL; } static HRESULT WINAPI domcdata_hasChildNodes( diff --git a/reactos/dll/win32/msxml3/dispex.c b/reactos/dll/win32/msxml3/dispex.c index 4384f9836e7..9eb5ae33e5b 100644 --- a/reactos/dll/win32/msxml3/dispex.c +++ b/reactos/dll/win32/msxml3/dispex.c @@ -601,6 +601,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc hres = IUnknown_QueryInterface(This->outer, get_riid_from_tid(data->funcs[n].tid), (void**)&unk); if(FAILED(hres)) { ERR("Could not get iface: %08x\n", hres); + ITypeInfo_Release(ti); return E_FAIL; } diff --git a/reactos/dll/win32/msxml3/domdoc.c b/reactos/dll/win32/msxml3/domdoc.c index 15075e3f58b..9828482f5c0 100644 --- a/reactos/dll/win32/msxml3/domdoc.c +++ b/reactos/dll/win32/msxml3/domdoc.c @@ -135,9 +135,6 @@ struct domdoc bsc_t *bsc; HRESULT error; - /* IPersistStream */ - IStream *stream; - /* IObjectWithSite*/ IUnknown *site; @@ -559,19 +556,28 @@ void xmldoc_init(xmlDocPtr doc, MSXML_VERSION version) priv_from_xmlDocPtr(doc)->properties = create_properties(version); } -LONG xmldoc_add_ref(xmlDocPtr doc) +LONG xmldoc_add_refs(xmlDocPtr doc, LONG refs) { - LONG ref = InterlockedIncrement(&priv_from_xmlDocPtr(doc)->refs); + LONG ref = InterlockedExchangeAdd(&priv_from_xmlDocPtr(doc)->refs, refs) + refs; TRACE("(%p)->(%d)\n", doc, ref); return ref; } -LONG xmldoc_release(xmlDocPtr doc) +LONG xmldoc_add_ref(xmlDocPtr doc) +{ + return xmldoc_add_refs(doc, 1); +} + +LONG xmldoc_release_refs(xmlDocPtr doc, LONG refs) { xmldoc_priv *priv = priv_from_xmlDocPtr(doc); - LONG ref = InterlockedDecrement(&priv->refs); + LONG ref = InterlockedExchangeAdd(&priv->refs, -refs) - refs; TRACE("(%p)->(%d)\n", doc, ref); - if(ref == 0) + + if (ref < 0) + WARN("negative refcount, expect troubles\n"); + + if (ref == 0) { orphan_entry *orphan, *orphan2; TRACE("freeing docptr %p\n", doc); @@ -590,6 +596,11 @@ LONG xmldoc_release(xmlDocPtr doc) return ref; } +LONG xmldoc_release(xmlDocPtr doc) +{ + return xmldoc_release_refs(doc, 1); +} + HRESULT xmldoc_add_orphan(xmlDocPtr doc, xmlNodePtr node) { xmldoc_priv *priv = priv_from_xmlDocPtr(doc); @@ -624,7 +635,7 @@ HRESULT xmldoc_remove_orphan(xmlDocPtr doc, xmlNodePtr node) static inline xmlDocPtr get_doc( domdoc *This ) { - return (xmlDocPtr)This->node.node; + return This->node.node->doc; } static HRESULT attach_xmldoc(domdoc *This, xmlDocPtr xml ) @@ -721,46 +732,42 @@ static HRESULT WINAPI PersistStreamInit_IsDirty( return S_FALSE; } -static HRESULT WINAPI PersistStreamInit_Load( - IPersistStreamInit *iface, LPSTREAM pStm) +static HRESULT domdoc_load_from_stream(domdoc *doc, ISequentialStream *stream) { - domdoc *This = impl_from_IPersistStreamInit(iface); - HRESULT hr; - HGLOBAL hglobal; DWORD read, written, len; - BYTE buf[4096]; - char *ptr; xmlDocPtr xmldoc = NULL; + IStream *hstream; + HGLOBAL hglobal; + BYTE buf[4096]; + HRESULT hr; + char *ptr; - TRACE("(%p)->(%p)\n", This, pStm); - - if (!pStm) - return E_INVALIDARG; - - hr = CreateStreamOnHGlobal(NULL, TRUE, &This->stream); + hstream = NULL; + hr = CreateStreamOnHGlobal(NULL, TRUE, &hstream); if (FAILED(hr)) return hr; do { - IStream_Read(pStm, buf, sizeof(buf), &read); - hr = IStream_Write(This->stream, buf, read, &written); + ISequentialStream_Read(stream, buf, sizeof(buf), &read); + hr = IStream_Write(hstream, buf, read, &written); } while(SUCCEEDED(hr) && written != 0 && read != 0); if (FAILED(hr)) { - ERR("Failed to copy stream\n"); + ERR("failed to copy stream 0x%08x\n", hr); + IStream_Release(hstream); return hr; } - hr = GetHGlobalFromStream(This->stream, &hglobal); + hr = GetHGlobalFromStream(hstream, &hglobal); if (FAILED(hr)) return hr; len = GlobalSize(hglobal); ptr = GlobalLock(hglobal); - if (len != 0) - xmldoc = doparse(This, ptr, len, XML_CHAR_ENCODING_NONE); + if (len) + xmldoc = doparse(doc, ptr, len, XML_CHAR_ENCODING_NONE); GlobalUnlock(hglobal); if (!xmldoc) @@ -771,7 +778,19 @@ static HRESULT WINAPI PersistStreamInit_Load( xmldoc->_private = create_priv(); - return attach_xmldoc(This, xmldoc); + return attach_xmldoc(doc, xmldoc); +} + +static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, IStream *stream) +{ + domdoc *This = impl_from_IPersistStreamInit(iface); + + TRACE("(%p)->(%p)\n", This, stream); + + if (!stream) + return E_INVALIDARG; + + return domdoc_load_from_stream(This, (ISequentialStream*)stream); } static HRESULT WINAPI PersistStreamInit_Save( @@ -801,7 +820,7 @@ static HRESULT WINAPI PersistStreamInit_GetSizeMax( IPersistStreamInit *iface, ULARGE_INTEGER *pcbSize) { domdoc *This = impl_from_IPersistStreamInit(iface); - TRACE("(%p)->(%p): stub!\n", This, pcbSize); + TRACE("(%p)->(%p)\n", This, pcbSize); return E_NOTIMPL; } @@ -914,8 +933,6 @@ static ULONG WINAPI domdoc_Release( IXMLDOMDocument3 *iface ) if (This->site) IUnknown_Release( This->site ); destroy_xmlnode(&This->node); - if (This->stream) - IStream_Release(This->stream); for (eid = 0; eid < EVENTID_LAST; eid++) if (This->events[eid]) IDispatch_Release(This->events[eid]); @@ -1115,12 +1132,26 @@ static HRESULT WINAPI domdoc_insertBefore( IXMLDOMNode** outNewChild ) { domdoc *This = impl_from_IXMLDOMDocument3( iface ); + DOMNodeType type; + HRESULT hr; TRACE("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), outNewChild); - return node_insert_before(&This->node, newChild, &refChild, outNewChild); -} + hr = IXMLDOMNode_get_nodeType(newChild, &type); + if (hr != S_OK) return hr; + TRACE("new node type %d\n", type); + switch (type) + { + case NODE_ATTRIBUTE: + case NODE_DOCUMENT: + case NODE_CDATA_SECTION: + if (outNewChild) *outNewChild = NULL; + return E_FAIL; + default: + return node_insert_before(&This->node, newChild, &refChild, outNewChild); + } +} static HRESULT WINAPI domdoc_replaceChild( IXMLDOMDocument3 *iface, @@ -1510,7 +1541,9 @@ static HRESULT WINAPI domdoc_put_documentElement( domdoc *This = impl_from_IXMLDOMDocument3( iface ); IXMLDOMNode *elementNode; xmlNodePtr oldRoot; + xmlDocPtr old_doc; xmlnode *xmlNode; + int refcount = 0; HRESULT hr; TRACE("(%p)->(%p)\n", This, DOMElement); @@ -1526,7 +1559,14 @@ static HRESULT WINAPI domdoc_put_documentElement( if(xmldoc_remove_orphan(xmlNode->node->doc, xmlNode->node) != S_OK) WARN("%p is not an orphan of %p\n", xmlNode->node->doc, xmlNode->node); + old_doc = xmlNode->node->doc; + if (old_doc != get_doc(This)) + refcount = xmlnode_get_inst_cnt(xmlNode); + + /* old root is still orphaned by its document, update refcount from new root */ + if (refcount) xmldoc_add_refs(get_doc(This), refcount); oldRoot = xmlDocSetRootElement( get_doc(This), xmlNode->node); + if (refcount) xmldoc_release_refs(old_doc, refcount); IXMLDOMNode_Release( elementNode ); if(oldRoot) @@ -2029,8 +2069,6 @@ static HRESULT WINAPI domdoc_load( domdoc *This = impl_from_IXMLDOMDocument3( iface ); LPWSTR filename = NULL; HRESULT hr = S_FALSE; - IXMLDOMDocument3 *pNewDoc = NULL; - IStream *pStream = NULL; xmlDocPtr xmldoc; TRACE("(%p)->(%s)\n", This, debugstr_variant(&source)); @@ -2096,13 +2134,18 @@ static HRESULT WINAPI domdoc_load( } break; case VT_UNKNOWN: + { + ISequentialStream *stream = NULL; + IXMLDOMDocument3 *newdoc = NULL; + if (!V_UNKNOWN(&source)) return E_INVALIDARG; - hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&pNewDoc); + + hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IXMLDOMDocument3, (void**)&newdoc); if(hr == S_OK) { - if(pNewDoc) + if(newdoc) { - domdoc *newDoc = impl_from_IXMLDOMDocument3( pNewDoc ); + domdoc *newDoc = impl_from_IXMLDOMDocument3( newdoc ); xmldoc = xmlCopyDoc(get_doc(newDoc), 1); xmldoc->_private = create_priv(); @@ -2114,40 +2157,25 @@ static HRESULT WINAPI domdoc_load( return hr; } } - hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&pStream); - if(hr == S_OK) - { - IPersistStream *pDocStream; - hr = IXMLDOMDocument3_QueryInterface(iface, &IID_IPersistStream, (void**)&pDocStream); - if(hr == S_OK) - { - hr = IPersistStream_Load(pDocStream, pStream); - IStream_Release(pStream); - if(hr == S_OK) - { - *isSuccessful = VARIANT_TRUE; - TRACE("Using IStream to load Document\n"); - return S_OK; - } - else - { - ERR("xmldoc_IPersistStream_Load failed (%d)\n", hr); - } - } - else - { - ERR("QueryInterface IID_IPersistStream failed (%d)\n", hr); - } - } - else + hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_IStream, (void**)&stream); + if (FAILED(hr)) + hr = IUnknown_QueryInterface(V_UNKNOWN(&source), &IID_ISequentialStream, (void**)&stream); + + if (hr == S_OK) { - /* ISequentialStream */ - FIXME("Unknown type not supported (%d) (%p)(%p)\n", hr, pNewDoc, V_UNKNOWN(&source)->lpVtbl); + hr = domdoc_load_from_stream(This, stream); + if (hr == S_OK) + *isSuccessful = VARIANT_TRUE; + ISequentialStream_Release(stream); + return hr; } + + FIXME("unsupported IUnknown type (0x%08x) (%p)\n", hr, V_UNKNOWN(&source)->lpVtbl); break; - default: - FIXME("VT type not supported (%d)\n", V_VT(&source)); + } + default: + FIXME("VT type not supported (%d)\n", V_VT(&source)); } if ( filename ) @@ -3251,12 +3279,43 @@ static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoi return S_OK; } -static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, - DWORD *pdwCookie) +static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *unk_sink, + DWORD *cookie) { ConnectionPoint *This = impl_from_IConnectionPoint(iface); - FIXME("(%p)->(%p %p): stub\n", This, pUnkSink, pdwCookie); - return E_NOTIMPL; + IUnknown *sink; + HRESULT hr; + DWORD i; + + TRACE("(%p)->(%p %p)\n", This, unk_sink, cookie); + + hr = IUnknown_QueryInterface(unk_sink, This->iid, (void**)&sink); + if(FAILED(hr) && !IsEqualGUID(&IID_IPropertyNotifySink, This->iid)) + hr = IUnknown_QueryInterface(unk_sink, &IID_IDispatch, (void**)&sink); + if(FAILED(hr)) + return CONNECT_E_CANNOTCONNECT; + + if(This->sinks) + { + for (i = 0; i < This->sinks_size; i++) + if (!This->sinks[i].unk) + break; + + if (i == This->sinks_size) + This->sinks = heap_realloc(This->sinks,(++This->sinks_size)*sizeof(*This->sinks)); + } + else + { + This->sinks = heap_alloc(sizeof(*This->sinks)); + This->sinks_size = 1; + i = 0; + } + + This->sinks[i].unk = sink; + if (cookie) + *cookie = i+1; + + return S_OK; } static HRESULT WINAPI ConnectionPoint_Unadvise(IConnectionPoint *iface, DWORD cookie) @@ -3466,7 +3525,6 @@ HRESULT get_domdoc_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document) doc->resolving = 0; doc->properties = properties_from_xmlDocPtr(xmldoc); doc->error = S_OK; - doc->stream = NULL; doc->site = NULL; doc->safeopt = 0; doc->bsc = NULL; diff --git a/reactos/dll/win32/msxml3/element.c b/reactos/dll/win32/msxml3/element.c index cfc4165f66d..1cdc0f84b8b 100644 --- a/reactos/dll/win32/msxml3/element.c +++ b/reactos/dll/win32/msxml3/element.c @@ -304,13 +304,29 @@ static HRESULT WINAPI domelem_get_attributes( static HRESULT WINAPI domelem_insertBefore( IXMLDOMElement *iface, IXMLDOMNode* newNode, VARIANT refChild, - IXMLDOMNode** outOldNode) + IXMLDOMNode** old_node) { domelem *This = impl_from_IXMLDOMElement( iface ); + DOMNodeType type; + HRESULT hr; - TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), outOldNode); + TRACE("(%p)->(%p %s %p)\n", This, newNode, debugstr_variant(&refChild), old_node); - return node_insert_before(&This->node, newNode, &refChild, outOldNode); + hr = IXMLDOMNode_get_nodeType(newNode, &type); + if (hr != S_OK) return hr; + + TRACE("new node type %d\n", type); + switch (type) + { + case NODE_DOCUMENT: + case NODE_DOCUMENT_TYPE: + case NODE_ENTITY: + case NODE_NOTATION: + if (old_node) *old_node = NULL; + return E_FAIL; + default: + return node_insert_before(&This->node, newNode, &refChild, old_node); + } } static HRESULT WINAPI domelem_replaceChild( @@ -739,7 +755,7 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret) { static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; const BYTE *d = buf; - int bytes, pad_bytes, div, i; + int bytes, pad_bytes, div; DWORD needed; WCHAR *ptr; @@ -756,7 +772,6 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret) div = len / 3; ptr = *ret; - i = 0; while (div > 0) { /* first char is the first 6 bits of the first byte*/ @@ -769,7 +784,6 @@ static HRESULT encode_base64(const BYTE *buf, int len, BSTR *ret) *ptr++ = b64[ ((d[1] << 2) & 0x3c) | (d[2] >> 6 & 0x03)]; /* fourth char is the remaining 6 bits of the third byte */ *ptr++ = b64[ d[2] & 0x3f]; - i += 4; d += 3; div--; } @@ -1232,8 +1246,7 @@ static HRESULT WINAPI domelem_setAttribute( domelem *This = impl_from_IXMLDOMElement( iface ); xmlChar *xml_name, *xml_value, *local, *prefix; xmlNodePtr element; - HRESULT hr; - VARIANT var; + HRESULT hr = S_OK; TRACE("(%p)->(%s %s)\n", This, debugstr_w(name), debugstr_variant(&value)); @@ -1241,16 +1254,25 @@ static HRESULT WINAPI domelem_setAttribute( if ( !element ) return E_FAIL; - VariantInit(&var); - hr = VariantChangeType(&var, &value, 0, VT_BSTR); - if(hr != S_OK) + if (V_VT(&value) != VT_BSTR) { - FIXME("VariantChangeType failed\n"); - return hr; + VARIANT var; + + VariantInit(&var); + hr = VariantChangeType(&var, &value, 0, VT_BSTR); + if (hr != S_OK) + { + FIXME("VariantChangeType failed\n"); + return hr; + } + + xml_value = xmlchar_from_wchar(V_BSTR(&var)); + VariantClear(&var); } + else + xml_value = xmlchar_from_wchar(V_BSTR(&value)); xml_name = xmlchar_from_wchar( name ); - xml_value = xmlchar_from_wchar( V_BSTR(&var) ); if ((local = xmlSplitQName2(xml_name, &prefix))) { @@ -1273,7 +1295,6 @@ static HRESULT WINAPI domelem_setAttribute( heap_free(xml_value); heap_free(xml_name); - VariantClear(&var); return hr; } diff --git a/reactos/dll/win32/msxml3/factory.c b/reactos/dll/win32/msxml3/factory.c index 6f82e183968..f22d08e23cd 100644 --- a/reactos/dll/win32/msxml3/factory.c +++ b/reactos/dll/win32/msxml3/factory.c @@ -101,7 +101,7 @@ static const struct clsid_version_t clsid_versions_table[] = static MSXML_VERSION get_msxml_version(const GUID *clsid) { - int i; + unsigned int i; for (i = 0; i < sizeof(clsid_versions_table)/sizeof(struct clsid_version_t); i++) if (IsEqualGUID(clsid, clsid_versions_table[i].clsid)) diff --git a/reactos/dll/win32/msxml3/httprequest.c b/reactos/dll/win32/msxml3/httprequest.c index 7ddc49cd72e..4179368839f 100644 --- a/reactos/dll/win32/msxml3/httprequest.c +++ b/reactos/dll/win32/msxml3/httprequest.c @@ -85,8 +85,8 @@ typedef struct /* request */ BINDVERB verb; BSTR custom; - BSTR siteurl; - BSTR url; + IUri *uri; + IUri *base_uri; BOOL async; struct list reqheaders; /* cached resulting custom request headers string length in WCHARs */ @@ -144,9 +144,17 @@ static inline serverhttp *impl_from_IServerXMLHTTPRequest(IServerXMLHTTPRequest static void httprequest_setreadystate(httprequest *This, READYSTATE state) { READYSTATE last = This->state; + static const char* readystates[] = { + "READYSTATE_UNINITIALIZED", + "READYSTATE_LOADING", + "READYSTATE_LOADED", + "READYSTATE_INTERACTIVE", + "READYSTATE_COMPLETE"}; This->state = state; + TRACE("state %s\n", readystates[state]); + if (This->sink && last != state) { DISPPARAMS params; @@ -209,6 +217,7 @@ static void BindStatusCallback_Detach(BindStatusCallback *bsc) if (bsc) { if (bsc->binding) IBinding_Abort(bsc->binding); + bsc->request->bsc = NULL; bsc->request = NULL; IBindStatusCallback_Release(&bsc->IBindStatusCallback_iface); } @@ -343,7 +352,11 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac } if (hr == S_OK) + { + BindStatusCallback_Detach(This->request->bsc); + This->request->bsc = This; httprequest_setreadystate(This->request, READYSTATE_COMPLETE); + } return S_OK; } @@ -688,23 +701,28 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback * case VT_ARRAY|VT_UI1: { sa = V_ARRAY(body); - if ((hr = SafeArrayAccessData(sa, (void **)&ptr)) != S_OK) return hr; + if ((hr = SafeArrayAccessData(sa, (void **)&ptr)) != S_OK) + { + heap_free(bsc); + return hr; + } if ((hr = SafeArrayGetUBound(sa, 1, &size) != S_OK)) { SafeArrayUnaccessData(sa); + heap_free(bsc); return hr; } size++; break; } + default: + FIXME("unsupported body data type %d\n", V_VT(body)); + /* fall through */ case VT_EMPTY: case VT_ERROR: ptr = NULL; size = 0; break; - default: - FIXME("unsupported body data type %d\n", V_VT(body)); - break; } bsc->body = GlobalAlloc(GMEM_FIXED, size); @@ -734,7 +752,7 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback * { IMoniker *moniker; - hr = CreateURLMoniker(NULL, This->url, &moniker); + hr = CreateURLMonikerEx2(NULL, This->uri, &moniker, URL_MK_UNIFORM); if (hr == S_OK) { IStream *stream; @@ -756,6 +774,53 @@ static HRESULT BindStatusCallback_create(httprequest* This, BindStatusCallback * return hr; } +static HRESULT verify_uri(httprequest *This, IUri *uri) +{ + DWORD scheme, base_scheme; + BSTR host, base_host; + HRESULT hr; + + if(!(This->safeopt & INTERFACESAFE_FOR_UNTRUSTED_DATA)) + return S_OK; + + if(!This->base_uri) + return E_ACCESSDENIED; + + hr = IUri_GetScheme(uri, &scheme); + if(FAILED(hr)) + return hr; + + hr = IUri_GetScheme(This->base_uri, &base_scheme); + if(FAILED(hr)) + return hr; + + if(scheme != base_scheme) { + WARN("Schemes don't match\n"); + return E_ACCESSDENIED; + } + + if(scheme == INTERNET_SCHEME_UNKNOWN) { + FIXME("Unknown scheme\n"); + return E_ACCESSDENIED; + } + + hr = IUri_GetHost(uri, &host); + if(FAILED(hr)) + return hr; + + hr = IUri_GetHost(This->base_uri, &base_host); + if(SUCCEEDED(hr)) { + if(strcmpiW(host, base_host)) { + WARN("Hosts don't match\n"); + hr = E_ACCESSDENIED; + } + SysFreeString(base_host); + } + + SysFreeString(host); + return hr; +} + static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url, VARIANT async, VARIANT user, VARIANT password) { @@ -765,15 +830,20 @@ static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url, static const WCHAR MethodDeleteW[] = {'D','E','L','E','T','E',0}; static const WCHAR MethodPropFindW[] = {'P','R','O','P','F','I','N','D',0}; VARIANT str, is_async; + IUri *uri; HRESULT hr; if (!method || !url) return E_INVALIDARG; /* free previously set data */ - SysFreeString(This->url); + if(This->uri) { + IUri_Release(This->uri); + This->uri = NULL; + } + SysFreeString(This->user); SysFreeString(This->password); - This->url = This->user = This->password = NULL; + This->user = This->password = NULL; if (!strcmpiW(method, MethodGetW)) { @@ -800,22 +870,22 @@ static HRESULT httprequest_open(httprequest *This, BSTR method, BSTR url, return E_FAIL; } - /* try to combine with site url */ - if (This->siteurl && PathIsRelativeW(url)) - { - DWORD len = INTERNET_MAX_URL_LENGTH; - WCHAR *fullW = heap_alloc(len*sizeof(WCHAR)); - - hr = UrlCombineW(This->siteurl, url, fullW, &len, 0); - if (hr == S_OK) - { - TRACE("combined url %s\n", debugstr_w(fullW)); - This->url = SysAllocString(fullW); - } - heap_free(fullW); - } + if(This->base_uri) + hr = CoInternetCombineUrlEx(This->base_uri, url, 0, &uri, 0); else - This->url = SysAllocString(url); + hr = CreateUri(url, 0, 0, &uri); + if(FAILED(hr)) { + WARN("Could not create IUri object: %08x\n", hr); + return hr; + } + + hr = verify_uri(This, uri); + if(FAILED(hr)) { + IUri_Release(uri); + return hr; + } + + This->uri = uri; VariantInit(&is_async); hr = VariantChangeType(&is_async, &async, 0, VT_BOOL); @@ -881,7 +951,8 @@ static HRESULT httprequest_getResponseHeader(httprequest *This, BSTR header, BST { struct httpheader *entry; - if (!header || !value) return E_INVALIDARG; + if (!header) return E_INVALIDARG; + if (!value) return E_POINTER; if (This->raw_respheaders && list_empty(&This->respheaders)) { @@ -915,7 +986,7 @@ static HRESULT httprequest_getResponseHeader(httprequest *This, BSTR header, BST static HRESULT httprequest_getAllResponseHeaders(httprequest *This, BSTR *respheaders) { - if (!respheaders) return E_INVALIDARG; + if (!respheaders) return E_POINTER; *respheaders = SysAllocString(This->raw_respheaders); @@ -930,10 +1001,9 @@ static HRESULT httprequest_send(httprequest *This, VARIANT body) if (This->state != READYSTATE_LOADING) return E_FAIL; hr = BindStatusCallback_create(This, &bsc, &body); - if (FAILED(hr)) return hr; - - BindStatusCallback_Detach(This->bsc); - This->bsc = bsc; + if (FAILED(hr)) + /* success path to detach it is OnStopBinding call */ + BindStatusCallback_Detach(bsc); return hr; } @@ -941,7 +1011,6 @@ static HRESULT httprequest_send(httprequest *This, VARIANT body) static HRESULT httprequest_abort(httprequest *This) { BindStatusCallback_Detach(This->bsc); - This->bsc = NULL; httprequest_setreadystate(This, READYSTATE_UNINITIALIZED); @@ -950,17 +1019,16 @@ static HRESULT httprequest_abort(httprequest *This) static HRESULT httprequest_get_status(httprequest *This, LONG *status) { - if (!status) return E_INVALIDARG; - if (This->state != READYSTATE_COMPLETE) return E_FAIL; + if (!status) return E_POINTER; *status = This->status; - return S_OK; + return This->state == READYSTATE_COMPLETE ? S_OK : E_FAIL; } static HRESULT httprequest_get_statusText(httprequest *This, BSTR *status) { - if (!status) return E_INVALIDARG; + if (!status) return E_POINTER; if (This->state != READYSTATE_COMPLETE) return E_FAIL; *status = SysAllocString(This->status_text); @@ -973,7 +1041,7 @@ static HRESULT httprequest_get_responseText(httprequest *This, BSTR *body) HGLOBAL hglobal; HRESULT hr; - if (!body) return E_INVALIDARG; + if (!body) return E_POINTER; if (This->state != READYSTATE_COMPLETE) return E_FAIL; hr = GetHGlobalFromStream(This->bsc->stream, &hglobal); @@ -1119,7 +1187,7 @@ static HRESULT httprequest_get_responseStream(httprequest *This, VARIANT *body) static HRESULT httprequest_get_readyState(httprequest *This, LONG *state) { - if (!state) return E_INVALIDARG; + if (!state) return E_POINTER; *state = This->state; return S_OK; @@ -1139,10 +1207,12 @@ static void httprequest_release(httprequest *This) if (This->site) IUnknown_Release( This->site ); + if (This->uri) + IUri_Release(This->uri); + if (This->base_uri) + IUri_Release(This->base_uri); SysFreeString(This->custom); - SysFreeString(This->siteurl); - SysFreeString(This->url); SysFreeString(This->user); SysFreeString(This->password); @@ -1442,37 +1512,55 @@ static HRESULT WINAPI httprequest_ObjectWithSite_GetSite( IObjectWithSite *iface return IUnknown_QueryInterface( This->site, iid, ppvSite ); } +static void get_base_uri(httprequest *This) +{ + IServiceProvider *provider; + IHTMLDocument2 *doc; + IUri *uri; + BSTR url; + HRESULT hr; + + hr = IUnknown_QueryInterface(This->site, &IID_IServiceProvider, (void**)&provider); + if(FAILED(hr)) + return; + + hr = IServiceProvider_QueryService(provider, &SID_SContainerDispatch, &IID_IHTMLDocument2, (void**)&doc); + IServiceProvider_Release(provider); + if(FAILED(hr)) + return; + + hr = IHTMLDocument2_get_URL(doc, &url); + IHTMLDocument2_Release(doc); + if(FAILED(hr) || !url || !*url) + return; + + TRACE("host url %s\n", debugstr_w(url)); + + hr = CreateUri(url, 0, 0, &uri); + SysFreeString(url); + if(FAILED(hr)) + return; + + This->base_uri = uri; +} + static HRESULT WINAPI httprequest_ObjectWithSite_SetSite( IObjectWithSite *iface, IUnknown *punk ) { httprequest *This = impl_from_IObjectWithSite(iface); - IServiceProvider *provider; - HRESULT hr; - TRACE("(%p)->(%p)\n", iface, punk); - - if (punk) - IUnknown_AddRef( punk ); + TRACE("(%p)->(%p)\n", This, punk); if(This->site) IUnknown_Release( This->site ); + if(This->base_uri) + IUri_Release(This->base_uri); This->site = punk; - hr = IUnknown_QueryInterface(This->site, &IID_IServiceProvider, (void**)&provider); - if (hr == S_OK) + if (punk) { - IHTMLDocument2 *doc; - - hr = IServiceProvider_QueryService(provider, &SID_SContainerDispatch, &IID_IHTMLDocument2, (void**)&doc); - if (hr == S_OK) - { - SysFreeString(This->siteurl); - - hr = IHTMLDocument2_get_URL(doc, &This->siteurl); - IHTMLDocument2_Release(doc); - TRACE("host url %s, 0x%08x\n", debugstr_w(This->siteurl), hr); - } - IServiceProvider_Release(provider); + IUnknown_AddRef( punk ); + get_base_uri(This); } return S_OK; @@ -1826,7 +1914,8 @@ static void init_httprequest(httprequest *req) req->async = FALSE; req->verb = -1; req->custom = NULL; - req->url = req->siteurl = req->user = req->password = NULL; + req->uri = req->base_uri = NULL; + req->user = req->password = NULL; req->state = READYSTATE_UNINITIALIZED; req->sink = NULL; diff --git a/reactos/dll/win32/msxml3/main.c b/reactos/dll/win32/msxml3/main.c index 4deee6a3033..4f18378876a 100644 --- a/reactos/dll/win32/msxml3/main.c +++ b/reactos/dll/win32/msxml3/main.c @@ -276,6 +276,8 @@ const char *debugstr_variant(const VARIANT *v) return wine_dbg_sprintf("{VT_I2: %d}", V_I2(v)); case VT_I4: return wine_dbg_sprintf("{VT_I4: %d}", V_I4(v)); + case VT_INT: + return wine_dbg_sprintf("{VT_INT: %d}", V_INT(v)); case VT_R8: return wine_dbg_sprintf("{VT_R8: %lf}", V_R8(v)); case VT_BSTR: diff --git a/reactos/dll/win32/msxml3/msxml_private.h b/reactos/dll/win32/msxml3/msxml_private.h index e156ec26703..dc5250bb132 100644 --- a/reactos/dll/win32/msxml3/msxml_private.h +++ b/reactos/dll/win32/msxml3/msxml_private.h @@ -194,7 +194,8 @@ static inline LPWSTR heap_strdupW(LPCWSTR str) size = (strlenW(str)+1)*sizeof(WCHAR); ret = heap_alloc(size); - memcpy(ret, str, size); + if(ret) + memcpy(ret, str, size); } return ret; @@ -291,6 +292,9 @@ extern xmlChar *xmlChar_from_wchar( LPCWSTR str ) DECLSPEC_HIDDEN; extern void xmldoc_init( xmlDocPtr doc, MSXML_VERSION version ) DECLSPEC_HIDDEN; extern LONG xmldoc_add_ref( xmlDocPtr doc ) DECLSPEC_HIDDEN; extern LONG xmldoc_release( xmlDocPtr doc ) DECLSPEC_HIDDEN; +extern LONG xmldoc_add_refs( xmlDocPtr doc, LONG refs ) DECLSPEC_HIDDEN; +extern LONG xmldoc_release_refs ( xmlDocPtr doc, LONG refs ) DECLSPEC_HIDDEN; +extern int xmlnode_get_inst_cnt( xmlnode *node ) DECLSPEC_HIDDEN; extern HRESULT xmldoc_add_orphan( xmlDocPtr doc, xmlNodePtr node ) DECLSPEC_HIDDEN; extern HRESULT xmldoc_remove_orphan( xmlDocPtr doc, xmlNodePtr node ) DECLSPEC_HIDDEN; extern void xmldoc_link_xmldecl(xmlDocPtr doc, xmlNodePtr node) DECLSPEC_HIDDEN; @@ -404,6 +408,21 @@ static inline xmlChar *xmlchar_from_wchar( const WCHAR *str ) return xmlchar_from_wcharn(str, -1); } +static inline xmlChar *heap_strdupxmlChar(const xmlChar *str) +{ + xmlChar *ret = NULL; + + if(str) { + DWORD size; + + size = (xmlStrlen(str)+1)*sizeof(xmlChar); + ret = heap_alloc(size); + memcpy(ret, str, size); + } + + return ret; +} + #endif static inline HRESULT return_bstr(const WCHAR *value, BSTR *p) diff --git a/reactos/dll/win32/msxml3/mxwriter.c b/reactos/dll/win32/msxml3/mxwriter.c index 0069e4119b6..e60a6074069 100644 --- a/reactos/dll/win32/msxml3/mxwriter.c +++ b/reactos/dll/win32/msxml3/mxwriter.c @@ -291,7 +291,9 @@ static HRESULT alloc_output_buffer(xml_encoding encoding, output_buffer **buffer return hr; } - if (ret->code_page == CP_UTF8) { + /* currently we always create a default output buffer that is UTF-16 only, + but it's possible to allocate with specific encoding too */ + if (encoding != XmlEncoding_UTF16) { hr = init_encoded_buffer(&ret->encoded); if (hr != S_OK) { free_encoded_buffer(&ret->utf16); diff --git a/reactos/dll/win32/msxml3/node.c b/reactos/dll/win32/msxml3/node.c index 788bea8bd32..f52026e8668 100644 --- a/reactos/dll/win32/msxml3/node.c +++ b/reactos/dll/win32/msxml3/node.c @@ -285,36 +285,48 @@ static HRESULT node_set_content_escaped(xmlnode *This, LPCWSTR value) HRESULT node_put_value(xmlnode *This, VARIANT *value) { - VARIANT string_value; HRESULT hr; - VariantInit(&string_value); - hr = VariantChangeType(&string_value, value, 0, VT_BSTR); - if(FAILED(hr)) { - WARN("Couldn't convert to VT_BSTR\n"); - return hr; - } + if (V_VT(value) != VT_BSTR) + { + VARIANT string_value; - hr = node_set_content(This, V_BSTR(&string_value)); - VariantClear(&string_value); + VariantInit(&string_value); + hr = VariantChangeType(&string_value, value, 0, VT_BSTR); + if(FAILED(hr)) { + WARN("Couldn't convert to VT_BSTR\n"); + return hr; + } + + hr = node_set_content(This, V_BSTR(&string_value)); + VariantClear(&string_value); + } + else + hr = node_set_content(This, V_BSTR(value)); return hr; } HRESULT node_put_value_escaped(xmlnode *This, VARIANT *value) { - VARIANT string_value; HRESULT hr; - VariantInit(&string_value); - hr = VariantChangeType(&string_value, value, 0, VT_BSTR); - if(FAILED(hr)) { - WARN("Couldn't convert to VT_BSTR\n"); - return hr; - } + if (V_VT(value) != VT_BSTR) + { + VARIANT string_value; - hr = node_set_content_escaped(This, V_BSTR(&string_value)); - VariantClear(&string_value); + VariantInit(&string_value); + hr = VariantChangeType(&string_value, value, 0, VT_BSTR); + if(FAILED(hr)) { + WARN("Couldn't convert to VT_BSTR\n"); + return hr; + } + + hr = node_set_content_escaped(This, V_BSTR(&string_value)); + VariantClear(&string_value); + } + else + hr = node_set_content_escaped(This, V_BSTR(value)); return hr; } @@ -377,11 +389,45 @@ HRESULT node_get_next_sibling(xmlnode *This, IXMLDOMNode **ret) return get_node(This, "next", This->node->next, ret); } +static int node_get_inst_cnt(xmlNodePtr node) +{ + int ret = *(LONG *)&node->_private; + xmlNodePtr child; + + /* add attribute counts */ + if (node->type == XML_ELEMENT_NODE) + { + xmlAttrPtr prop = node->properties; + + while (prop) + { + ret += node_get_inst_cnt((xmlNodePtr)prop); + prop = prop->next; + } + } + + /* add children counts */ + child = node->children; + while (child) + { + ret += node_get_inst_cnt(child); + child = child->next; + } + + return ret; +} + +int xmlnode_get_inst_cnt(xmlnode *node) +{ + return node_get_inst_cnt(node->node); +} + HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT *ref_child, IXMLDOMNode **ret) { IXMLDOMNode *before = NULL; xmlnode *node_obj; + int refcount = 0; xmlDocPtr doc; HRESULT hr; @@ -417,6 +463,8 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT if(xmldoc_remove_orphan(node_obj->node->doc, node_obj->node) != S_OK) WARN("%p is not an orphan of %p\n", node_obj->node, node_obj->node->doc); + refcount = xmlnode_get_inst_cnt(node_obj); + if(before) { xmlnode *before_node_obj = get_node_obj(before); @@ -429,10 +477,16 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT hr = IXMLDOMNode_removeChild(node_obj->parent, node_obj->iface, NULL); if (hr == S_OK) xmldoc_remove_orphan(node_obj->node->doc, node_obj->node); } + doc = node_obj->node->doc; - xmldoc_add_ref(before_node_obj->node->doc); + + /* refs count including subtree */ + if (doc != before_node_obj->node->doc) + refcount = xmlnode_get_inst_cnt(node_obj); + + if (refcount) xmldoc_add_refs(before_node_obj->node->doc, refcount); xmlAddPrevSibling(before_node_obj->node, node_obj->node); - xmldoc_release(doc); + if (refcount) xmldoc_release_refs(doc, refcount); node_obj->parent = This->parent; } else @@ -444,11 +498,15 @@ HRESULT node_insert_before(xmlnode *This, IXMLDOMNode *new_child, const VARIANT if (hr == S_OK) xmldoc_remove_orphan(node_obj->node->doc, node_obj->node); } doc = node_obj->node->doc; - xmldoc_add_ref(This->node->doc); + + if (doc != This->node->doc) + refcount = xmlnode_get_inst_cnt(node_obj); + + if (refcount) xmldoc_add_refs(This->node->doc, refcount); /* xmlAddChild doesn't unlink node from previous parent */ xmlUnlinkNode(node_obj->node); xmlAddChild(This->node, node_obj->node); - xmldoc_release(doc); + if (refcount) xmldoc_release_refs(doc, refcount); node_obj->parent = This->iface; } @@ -468,6 +526,7 @@ HRESULT node_replace_child(xmlnode *This, IXMLDOMNode *newChild, IXMLDOMNode *ol xmlnode *old_child, *new_child; xmlDocPtr leaving_doc; xmlNode *my_ancestor; + int refcount = 0; /* Do not believe any documentation telling that newChild == NULL means removal. It does certainly *not* apply to msxml3! */ @@ -505,9 +564,13 @@ HRESULT node_replace_child(xmlnode *This, IXMLDOMNode *newChild, IXMLDOMNode *ol WARN("%p is not an orphan of %p\n", new_child->node, new_child->node->doc); leaving_doc = new_child->node->doc; - xmldoc_add_ref(old_child->node->doc); + + if (leaving_doc != old_child->node->doc) + refcount = xmlnode_get_inst_cnt(new_child); + + if (refcount) xmldoc_add_refs(old_child->node->doc, refcount); xmlReplaceNode(old_child->node, new_child->node); - xmldoc_release(leaving_doc); + if (refcount) xmldoc_release_refs(leaving_doc, refcount); new_child->parent = old_child->parent; old_child->parent = NULL; @@ -598,7 +661,7 @@ HRESULT node_clone(xmlnode *This, VARIANT_BOOL deep, IXMLDOMNode **cloneNode) clone = xmlCopyNode(This->node, deep ? 1 : 2); if (clone) { - clone->doc = This->node->doc; + xmlSetTreeDoc(clone, This->node->doc); xmldoc_add_orphan(clone->doc, clone); node = create_node(clone); @@ -836,6 +899,53 @@ HRESULT node_get_xml(xmlnode *This, BOOL ensure_eol, BSTR *ret) return *ret ? S_OK : E_OUTOFMEMORY; } +static void htmldtd_dumpcontent(xmlOutputBufferPtr buf, xmlDocPtr doc) +{ + xmlDtdPtr cur = doc->intSubset; + + xmlOutputBufferWriteString(buf, "name); + if (cur->ExternalID) + { + xmlOutputBufferWriteString(buf, " PUBLIC "); + xmlBufferWriteQuotedString(buf->buffer, cur->ExternalID); + if (cur->SystemID) + { + xmlOutputBufferWriteString(buf, " "); + xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); + } + } + else if (cur->SystemID) + { + xmlOutputBufferWriteString(buf, " SYSTEM "); + xmlBufferWriteQuotedString(buf->buffer, cur->SystemID); + } + xmlOutputBufferWriteString(buf, ">\n"); +} + +static void htmldoc_dumpcontent(xmlOutputBufferPtr buf, xmlDocPtr doc) +{ + xmlElementType type; + + /* force HTML output */ + type = doc->type; + doc->type = XML_HTML_DOCUMENT_NODE; + if (doc->intSubset) + htmldtd_dumpcontent(buf, doc); + if (doc->children) + { + xmlNodePtr cur = doc->children; + + while (cur) + { + htmlNodeDumpFormatOutput(buf, doc, cur, NULL, 1); + cur = cur->next; + } + + } + doc->type = type; +} + HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR *p) { #ifdef SONAME_LIBXSLT @@ -863,7 +973,7 @@ HRESULT node_transform_node(const xmlnode *This, IXMLDOMNode *stylesheet, BSTR * xmlOutputBufferPtr output = xmlAllocOutputBuffer(NULL); if (output) { - htmlDocContentDumpOutput(output, result->doc, NULL); + htmldoc_dumpcontent(output, result->doc); content = xmlBufferContent(output->buffer); *p = bstr_from_xmlChar(content); xmlOutputBufferClose(output); @@ -973,17 +1083,36 @@ HRESULT node_get_base_name(xmlnode *This, BSTR *name) return S_OK; } +/* _private field holds a number of COM instances spawned from this libxml2 node */ +static void xmlnode_add_ref(xmlNodePtr node) +{ + if (node->type == XML_DOCUMENT_NODE) return; + InterlockedIncrement((LONG*)&node->_private); +} + +static void xmlnode_release(xmlNodePtr node) +{ + if (node->type == XML_DOCUMENT_NODE) return; + InterlockedDecrement((LONG*)&node->_private); +} + void destroy_xmlnode(xmlnode *This) { if(This->node) + { + xmlnode_release(This->node); xmldoc_release(This->node->doc); + } release_dispex(&This->dispex); } void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data) { if(node) - xmldoc_add_ref( node->doc ); + { + xmlnode_add_ref(node); + xmldoc_add_ref(node->doc); + } This->node = node; This->iface = node_iface; diff --git a/reactos/dll/win32/msxml3/nodelist.c b/reactos/dll/win32/msxml3/nodelist.c index 6ed73de22d9..994d5b93921 100644 --- a/reactos/dll/win32/msxml3/nodelist.c +++ b/reactos/dll/win32/msxml3/nodelist.c @@ -341,28 +341,62 @@ static HRESULT xmlnodelist_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD fl TRACE("(%p)->(%x %x %x %p %p %p)\n", This, id, lcid, flags, params, res, ei); - V_VT(res) = VT_DISPATCH; - V_DISPATCH(res) = NULL; - - if (id < DISPID_DOM_COLLECTION_BASE || id > DISPID_DOM_COLLECTION_MAX) - return DISP_E_UNKNOWNNAME; - - switch(flags) + if (id >= DISPID_DOM_COLLECTION_BASE && id <= DISPID_DOM_COLLECTION_MAX) { - case INVOKE_PROPERTYGET: + switch(flags) { - IXMLDOMNode *disp = NULL; + case DISPATCH_PROPERTYGET: + { + IXMLDOMNode *disp = NULL; - IXMLDOMNodeList_get_item(&This->IXMLDOMNodeList_iface, id - DISPID_DOM_COLLECTION_BASE, &disp); - V_DISPATCH(res) = (IDispatch*)disp; - break; - } - default: - { - FIXME("unimplemented flags %x\n", flags); - break; + V_VT(res) = VT_DISPATCH; + IXMLDOMNodeList_get_item(&This->IXMLDOMNodeList_iface, id - DISPID_DOM_COLLECTION_BASE, &disp); + V_DISPATCH(res) = (IDispatch*)disp; + break; + } + default: + { + FIXME("unimplemented flags %x\n", flags); + break; + } } } + else if (id == DISPID_VALUE) + { + switch(flags) + { + case DISPATCH_METHOD|DISPATCH_PROPERTYGET: + case DISPATCH_PROPERTYGET: + case DISPATCH_METHOD: + { + IXMLDOMNode *item; + VARIANT index; + HRESULT hr; + + if (params->cArgs - params->cNamedArgs != 1) return DISP_E_BADPARAMCOUNT; + + VariantInit(&index); + hr = VariantChangeType(&index, params->rgvarg, 0, VT_I4); + if(FAILED(hr)) + { + FIXME("failed to convert arg, %s\n", debugstr_variant(params->rgvarg)); + return hr; + } + + IXMLDOMNodeList_get_item(&This->IXMLDOMNodeList_iface, V_I4(&index), &item); + V_VT(res) = VT_DISPATCH; + V_DISPATCH(res) = (IDispatch*)item; + break; + } + default: + { + FIXME("DISPID_VALUE: unimplemented flags %x\n", flags); + break; + } + } + } + else + return DISP_E_UNKNOWNNAME; TRACE("ret %p\n", V_DISPATCH(res)); diff --git a/reactos/dll/win32/msxml3/saxreader.c b/reactos/dll/win32/msxml3/saxreader.c index 19d8e69a5fa..9fb17120423 100644 --- a/reactos/dll/win32/msxml3/saxreader.c +++ b/reactos/dll/win32/msxml3/saxreader.c @@ -171,12 +171,13 @@ enum saxhandler_type SAXContentHandler = 0, SAXDeclHandler, SAXDTDHandler, + SAXEntityResolver, SAXErrorHandler, SAXLexicalHandler, SAXHandler_Last }; -struct saxhandler_iface +struct saxanyhandler_iface { IUnknown *handler; IUnknown *vbhandler; @@ -200,6 +201,23 @@ struct saxlexicalhandler_iface IVBSAXLexicalHandler *vbhandler; }; +struct saxentityresolver_iface +{ + ISAXEntityResolver *handler; + IVBSAXEntityResolver *vbhandler; +}; + +struct saxhandler_iface +{ + union { + struct saxcontenthandler_iface content; + struct saxentityresolver_iface entityresolver; + struct saxerrorhandler_iface error; + struct saxlexicalhandler_iface lexical; + struct saxanyhandler_iface anyhandler; + } u; +}; + typedef struct { DispatchEx dispex; @@ -218,7 +236,7 @@ typedef struct static HRESULT saxreader_put_handler(saxreader *reader, enum saxhandler_type type, void *ptr, BOOL vb) { - struct saxhandler_iface *iface = &reader->saxhandlers[type]; + struct saxanyhandler_iface *iface = &reader->saxhandlers[type].u.anyhandler; IUnknown *unk = (IUnknown*)ptr; if (unk) @@ -237,7 +255,7 @@ static HRESULT saxreader_put_handler(saxreader *reader, enum saxhandler_type typ static HRESULT saxreader_get_handler(const saxreader *reader, enum saxhandler_type type, BOOL vb, void **ret) { - const struct saxhandler_iface *iface = &reader->saxhandlers[type]; + const struct saxanyhandler_iface *iface = &reader->saxhandlers[type].u.anyhandler; if (!ret) return E_POINTER; @@ -256,17 +274,17 @@ static HRESULT saxreader_get_handler(const saxreader *reader, enum saxhandler_ty static struct saxcontenthandler_iface *saxreader_get_contenthandler(saxreader *reader) { - return (struct saxcontenthandler_iface*)&reader->saxhandlers[SAXContentHandler]; + return &reader->saxhandlers[SAXContentHandler].u.content; } static struct saxerrorhandler_iface *saxreader_get_errorhandler(saxreader *reader) { - return (struct saxerrorhandler_iface*)&reader->saxhandlers[SAXErrorHandler]; + return &reader->saxhandlers[SAXErrorHandler].u.error; } static struct saxlexicalhandler_iface *saxreader_get_lexicalhandler(saxreader *reader) { - return (struct saxlexicalhandler_iface*)&reader->saxhandlers[SAXLexicalHandler]; + return &reader->saxhandlers[SAXLexicalHandler].u.lexical; } typedef struct @@ -279,8 +297,8 @@ typedef struct saxreader *saxreader; HRESULT ret; xmlParserCtxtPtr pParserCtxt; - WCHAR *publicId; - WCHAR *systemId; + BSTR publicId; + BSTR systemId; int line; int column; BOOL vbInterface; @@ -330,8 +348,23 @@ static inline saxlocator *impl_from_ISAXAttributes( ISAXAttributes *iface ) static inline int saxreader_has_handler(const saxlocator *locator, enum saxhandler_type type) { - return (locator->vbInterface && locator->saxreader->saxhandlers[type].vbhandler) || - (!locator->vbInterface && locator->saxreader->saxhandlers[type].handler); + struct saxanyhandler_iface *iface = &locator->saxreader->saxhandlers[type].u.anyhandler; + return (locator->vbInterface && iface->vbhandler) || (!locator->vbInterface && iface->handler); +} + +static HRESULT saxreader_saxcharacters(saxlocator *locator, BSTR chars) +{ + struct saxcontenthandler_iface *content = saxreader_get_contenthandler(locator->saxreader); + HRESULT hr; + + if (!saxreader_has_handler(locator, SAXContentHandler)) return S_OK; + + if (locator->vbInterface) + hr = IVBSAXContentHandler_characters(content->vbhandler, &chars); + else + hr = ISAXContentHandler_characters(content->handler, chars, SysStringLen(chars)); + + return hr; } /* property names */ @@ -1550,7 +1583,6 @@ static void libxmlCharacters( int len) { saxlocator *This = ctx; - struct saxcontenthandler_iface *handler = saxreader_get_contenthandler(This->saxreader); BSTR Chars; HRESULT hr; xmlChar *cur, *end; @@ -1609,10 +1641,7 @@ static void libxmlCharacters( } Chars = pooled_bstr_from_xmlCharN(&This->saxreader->pool, cur, end-cur); - if(This->vbInterface) - hr = IVBSAXContentHandler_characters(handler->vbhandler, &Chars); - else - hr = ISAXContentHandler_characters(handler->handler, Chars, SysStringLen(Chars)); + hr = saxreader_saxcharacters(This, Chars); if (sax_callback_failed(This, hr)) { @@ -1745,33 +1774,58 @@ static void libxmlFatalError(void *ctx, const char *msg, ...) This->ret = E_FAIL; } -static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len) +/* The only reason this helper exists is that CDATA section are reported by chunks, + newlines are used as delimiter. More than that, reader even alters input data before reporting. + + This helper should be called for substring with trailing newlines. +*/ +static BSTR saxreader_get_cdata_chunk(const xmlChar *str, int len) { - saxlocator *This = ctx; - struct saxcontenthandler_iface *content = saxreader_get_contenthandler(This->saxreader); - struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(This->saxreader); - HRESULT hr = S_OK; - xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur-len; - xmlChar *cur, *end; - int realLen; - BSTR Chars; - BOOL lastEvent = FALSE, change; + BSTR bstr = bstr_from_xmlCharN(str, len), ret; + WCHAR *ptr; - update_position(This, FALSE); - while(beg-9>=This->pParserCtxt->input->base - && memcmp(beg-9, "= bstr) + ptr--; + + while (*++ptr) { - if(*beg=='\n' || (*beg=='\r' && *(beg+1)!='\n')) - This->line--; - beg--; + /* replace returns as: + + - "\r" -> "\n" + - "\r\r" -> "\r" + - "\r\n" -> "\n" + */ + if (*ptr == '\r') + { + if (*(ptr+1) == '\r' || *(ptr+1) == '\n') + { + /* shift tail */ + memmove(ptr, ptr+1, len-- - (ptr-bstr)); + } + else + *ptr = '\n'; + } } - This->column = 0; - for(; beg>=This->pParserCtxt->input->base && *beg!='\n' && *beg!='\r'; beg--) - This->column++; - if (saxreader_has_handler(This, SAXLexicalHandler)) + ret = SysAllocStringLen(bstr, len); + SysFreeString(bstr); + return ret; +} + +static void libxml_cdatablock(void *ctx, const xmlChar *value, int len) +{ + const xmlChar *start, *end; + saxlocator *locator = ctx; + struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader); + HRESULT hr = S_OK; + BSTR chars; + int i; + + update_position(locator, FALSE); + if (saxreader_has_handler(locator, SAXLexicalHandler)) { - if (This->vbInterface) + if (locator->vbInterface) hr = IVBSAXLexicalHandler_startCDATA(lexical->vbhandler); else hr = ISAXLexicalHandler_startCDATA(lexical->handler); @@ -1779,61 +1833,66 @@ static void libxmlCDataBlock(void *ctx, const xmlChar *value, int len) if(FAILED(hr)) { - format_error_message_from_id(This, hr); + format_error_message_from_id(locator, hr); return; } - realLen = This->pParserCtxt->input->cur-beg-3; - cur = beg; - end = beg; + start = value; + end = NULL; + i = 0; - while(1) + while (i < len) { - while(end-begsaxreader->pool, cur, end-cur+1); - if (This->vbInterface) - hr = IVBSAXContentHandler_characters(content->vbhandler, &Chars); - else - hr = ISAXContentHandler_characters(content->handler, Chars, SysStringLen(Chars)); - } - - if(change) *end = '\r'; - - if(lastEvent) - break; - - This->column += end-cur+2; - end += 2; - cur = end; + i++; + locator->column++; } - if (saxreader_has_handler(This, SAXLexicalHandler)) + /* no newline chars (or last chunk) report as a whole */ + if (!end && start == value) { - if (This->vbInterface) + /* report */ + chars = bstr_from_xmlCharN(start, len-(start-value)); + TRACE("(%s)\n", debugstr_w(chars)); + hr = saxreader_saxcharacters(locator, chars); + SysFreeString(chars); + } + + if (saxreader_has_handler(locator, SAXLexicalHandler)) + { + if (locator->vbInterface) hr = IVBSAXLexicalHandler_endCDATA(lexical->vbhandler); else hr = ISAXLexicalHandler_endCDATA(lexical->handler); } if(FAILED(hr)) - format_error_message_from_id(This, hr); + format_error_message_from_id(locator, hr); +} - This->column += 4+end-cur; +static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid) +{ + FIXME("entity resolving not implemented, %s, %s\n", publicid, systemid); + return xmlSAX2ResolveEntity(ctx, publicid, systemid); } /*** IVBSAXLocator interface ***/ @@ -2123,7 +2182,7 @@ static HRESULT WINAPI isaxlocator_getPublicId( publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt)); if(SysStringLen(publicId)) - This->publicId = (WCHAR*)&publicId; + This->publicId = publicId; else { SysFreeString(publicId); @@ -2145,7 +2204,7 @@ static HRESULT WINAPI isaxlocator_getSystemId( systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt)); if(SysStringLen(systemId)) - This->systemId = (WCHAR*)&systemId; + This->systemId = systemId; else { SysFreeString(systemId); @@ -2370,24 +2429,6 @@ static HRESULT internal_parseStream(saxreader *This, ISequentialStream *stream, return hr; } -static HRESULT internal_getEntityResolver( - saxreader *This, - void *pEntityResolver, - BOOL vbInterface) -{ - FIXME("(%p)->(%p) stub\n", This, pEntityResolver); - return E_NOTIMPL; -} - -static HRESULT internal_putEntityResolver( - saxreader *This, - void *pEntityResolver, - BOOL vbInterface) -{ - FIXME("(%p)->(%p) stub\n", This, pEntityResolver); - return E_NOTIMPL; -} - static HRESULT internal_parse( saxreader* This, VARIANT varInput, @@ -2737,7 +2778,7 @@ static ULONG WINAPI saxxmlreader_Release( for (i = 0; i < SAXHandler_Last; i++) { - struct saxhandler_iface *iface = &This->saxhandlers[i]; + struct saxanyhandler_iface *iface = &This->saxhandlers[i].u.anyhandler; if (iface->handler) IUnknown_Release(iface->handler); @@ -2870,18 +2911,18 @@ static HRESULT WINAPI saxxmlreader_putProperty( static HRESULT WINAPI saxxmlreader_get_entityResolver( IVBSAXXMLReader* iface, - IVBSAXEntityResolver **pEntityResolver) + IVBSAXEntityResolver **resolver) { saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return internal_getEntityResolver(This, pEntityResolver, TRUE); + return saxreader_get_handler(This, SAXEntityResolver, TRUE, (void**)resolver); } static HRESULT WINAPI saxxmlreader_put_entityResolver( IVBSAXXMLReader* iface, - IVBSAXEntityResolver *pEntityResolver) + IVBSAXEntityResolver *resolver) { saxreader *This = impl_from_IVBSAXXMLReader( iface ); - return internal_putEntityResolver(This, pEntityResolver, TRUE); + return saxreader_put_handler(This, SAXEntityResolver, resolver, TRUE); } static HRESULT WINAPI saxxmlreader_get_contentHandler( @@ -3077,18 +3118,18 @@ static HRESULT WINAPI isaxxmlreader_putProperty( static HRESULT WINAPI isaxxmlreader_getEntityResolver( ISAXXMLReader* iface, - ISAXEntityResolver **ppEntityResolver) + ISAXEntityResolver **resolver) { saxreader *This = impl_from_ISAXXMLReader( iface ); - return internal_getEntityResolver(This, ppEntityResolver, FALSE); + return saxreader_get_handler(This, SAXEntityResolver, FALSE, (void**)resolver); } static HRESULT WINAPI isaxxmlreader_putEntityResolver( ISAXXMLReader* iface, - ISAXEntityResolver *pEntityResolver) + ISAXEntityResolver *resolver) { saxreader *This = impl_from_ISAXXMLReader( iface ); - return internal_putEntityResolver(This, pEntityResolver, FALSE); + return saxreader_put_handler(This, SAXEntityResolver, resolver, FALSE); } static HRESULT WINAPI isaxxmlreader_getContentHandler( @@ -3256,7 +3297,8 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, IUnknown *outer, LPVOID *ppOb reader->sax.comment = libxmlComment; reader->sax.error = libxmlFatalError; reader->sax.fatalError = libxmlFatalError; - reader->sax.cdataBlock = libxmlCDataBlock; + reader->sax.cdataBlock = libxml_cdatablock; + reader->sax.resolveEntity = libxmlresolveentity; *ppObj = &reader->IVBSAXXMLReader_iface; diff --git a/reactos/dll/win32/msxml3/schema.c b/reactos/dll/win32/msxml3/schema.c index f0413842e50..f00ba3a3b45 100644 --- a/reactos/dll/win32/msxml3/schema.c +++ b/reactos/dll/win32/msxml3/schema.c @@ -103,6 +103,9 @@ typedef struct MSXML_VERSION version; xmlHashTablePtr cache; + xmlChar **uris; + int allocated; + int count; VARIANT_BOOL validateOnLoad; int read_only; @@ -116,12 +119,6 @@ typedef struct LONG ref; } cache_entry; -typedef struct -{ - LONG index; - BSTR* out; -} cache_index_data; - /* datatypes lookup stuff * generated with help from gperf */ #define DT_MIN_STR_LEN 2 @@ -744,7 +741,7 @@ void schemasInit(void) return; } buf = LockResource(datatypes_handle); - datatypes_len = SizeofResource(MSXML_hInstance, datatypes_rsrc) - 1; + datatypes_len = SizeofResource(MSXML_hInstance, datatypes_rsrc); /* Resource is loaded as raw data, * need a null-terminated string */ @@ -844,7 +841,7 @@ static BOOL link_datatypes(xmlDocPtr schema) xmlNodePtr root, next, child; xmlNsPtr ns; - assert((void*)xmlGetExternalEntityLoader() == (void*)external_entity_loader); + assert(xmlGetExternalEntityLoader() == external_entity_loader); root = xmlDocGetRootElement(schema); if (!root) return FALSE; @@ -985,6 +982,55 @@ static void cache_free(void* data, xmlChar* name /* ignored */) cache_entry_release((cache_entry*)data); } +/* returns index or -1 if not found */ +static int cache_free_uri(schema_cache *cache, const xmlChar *uri) +{ + int i; + + for (i = 0; i < cache->count; i++) + if (xmlStrEqual(cache->uris[i], uri)) + { + heap_free(cache->uris[i]); + return i; + } + + return -1; +} + +static void cache_add_entry(schema_cache *cache, const xmlChar *uri, cache_entry *entry) +{ + int i; + + /* meaning no entry found with this name */ + if (xmlHashRemoveEntry(cache->cache, uri, cache_free)) + { + if (cache->count == cache->allocated) + { + cache->allocated *= 2; + cache->uris = heap_realloc(cache->uris, cache->allocated*sizeof(xmlChar*)); + } + i = cache->count++; + } + else + i = cache_free_uri(cache, uri); + + cache->uris[i] = heap_strdupxmlChar(uri); + xmlHashAddEntry(cache->cache, uri, entry); +} + +static void cache_remove_entry(schema_cache *cache, const xmlChar *uri) +{ + /* adjust index if entry was really removed */ + if (xmlHashRemoveEntry(cache->cache, uri, cache_free) == 0) + { + int i = cache_free_uri(cache, uri); + if (i == -1) return; + /* shift array */ + if (i != --cache->count) + memmove(&cache->uris[i], &cache->uris[i+1], (cache->count-i)*sizeof(xmlChar*)); + } +} + /* This one adds all namespaces defined in document to a cache, without anything associated with uri obviously. Unfortunately namespace:: axis implementation in libxml2 differs from what we need, @@ -1033,8 +1079,7 @@ HRESULT cache_from_doc_ns(IXMLDOMSchemaCollection2 *iface, xmlnode *node) entry->schema = NULL; entry->doc = NULL; - xmlHashRemoveEntry(This->cache, ns->href, cache_free); - xmlHashAddEntry(This->cache, ns->href, entry); + cache_add_entry(This, ns->href, entry); } pos++; } @@ -1091,6 +1136,11 @@ static ULONG WINAPI schema_cache_Release(IXMLDOMSchemaCollection2* iface) if (ref == 0) { + int i; + + for (i = 0; i < This->count; i++) + heap_free(This->uris[i]); + heap_free(This->uris); xmlHashFree(This->cache, cache_free); release_dispex(&This->dispex); heap_free(This); @@ -1146,7 +1196,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri { case VT_NULL: { - xmlHashRemoveEntry(This->cache, name, cache_free); + cache_remove_entry(This, name); } break; @@ -1164,8 +1214,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri return E_FAIL; } - xmlHashRemoveEntry(This->cache, name, cache_free); - xmlHashAddEntry(This->cache, name, entry); + cache_add_entry(This, name, entry); } break; @@ -1214,8 +1263,7 @@ static HRESULT WINAPI schema_cache_add(IXMLDOMSchemaCollection2* iface, BSTR uri return E_FAIL; } - xmlHashRemoveEntry(This->cache, name, cache_free); - xmlHashAddEntry(This->cache, name, entry); + cache_add_entry(This, name, entry); } break; @@ -1263,7 +1311,7 @@ static HRESULT WINAPI schema_cache_remove(IXMLDOMSchemaCollection2* iface, BSTR if (This->version == MSXML6) return E_NOTIMPL; - xmlHashRemoveEntry(This->cache, name, cache_free); + cache_remove_entry(This, name); heap_free(name); return S_OK; } @@ -1275,33 +1323,25 @@ static HRESULT WINAPI schema_cache_get_length(IXMLDOMSchemaCollection2* iface, L if (!length) return E_POINTER; - *length = xmlHashSize(This->cache); + + *length = This->count; return S_OK; } -static void cache_index(void* data /* ignored */, void* index, xmlChar* name) -{ - cache_index_data* index_data = (cache_index_data*)index; - - if (index_data->index-- == 0) - *index_data->out = bstr_from_xmlChar(name); -} - static HRESULT WINAPI schema_cache_get_namespaceURI(IXMLDOMSchemaCollection2* iface, - LONG index, BSTR* len) + LONG index, BSTR* uri) { schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface); - cache_index_data data = {index, len}; - TRACE("(%p)->(%i %p)\n", This, index, len); - if (!len) + TRACE("(%p)->(%i %p)\n", This, index, uri); + + if (!uri) return E_POINTER; - if (index >= xmlHashSize(This->cache)) + if (index >= This->count) return E_FAIL; - *len = NULL; - xmlHashScan(This->cache, cache_index, &data); + *uri = bstr_from_xmlChar(This->uris[index]); return S_OK; } @@ -1313,7 +1353,7 @@ static void cache_copy(void* data, void* dest, xmlChar* name) if (xmlHashLookup(This->cache, name) == NULL) { cache_entry_add_ref(entry); - xmlHashAddEntry(This->cache, name, entry); + cache_add_entry(This, name, entry); } } @@ -1531,6 +1571,9 @@ HRESULT SchemaCache_create(MSXML_VERSION version, IUnknown* outer, void** obj) This->IXMLDOMSchemaCollection2_iface.lpVtbl = &XMLDOMSchemaCollection2Vtbl; This->cache = xmlHashCreate(DEFAULT_HASHTABLE_SIZE); + This->allocated = 10; + This->count = 0; + This->uris = heap_alloc(This->allocated*sizeof(xmlChar*)); This->ref = 1; This->version = version; This->validateOnLoad = VARIANT_TRUE; diff --git a/reactos/dll/win32/msxml3/text.c b/reactos/dll/win32/msxml3/text.c index dd761342ed6..efc79e547e1 100644 --- a/reactos/dll/win32/msxml3/text.c +++ b/reactos/dll/win32/msxml3/text.c @@ -29,6 +29,7 @@ //#include #ifdef HAVE_LIBXML2 # include +# include //# include #endif @@ -58,6 +59,11 @@ static inline domtext *impl_from_IXMLDOMText( IXMLDOMText *iface ) return CONTAINING_RECORD(iface, domtext, IXMLDOMText_iface); } +static void domtext_reset_noenc(domtext *This) +{ + This->node.node->name = NULL; +} + static HRESULT WINAPI domtext_QueryInterface( IXMLDOMText *iface, REFIID riid, @@ -185,6 +191,7 @@ static HRESULT WINAPI domtext_put_nodeValue( TRACE("(%p)->(%s)\n", This, debugstr_variant(&value)); + domtext_reset_noenc(This); return node_put_value(&This->node, &value); } @@ -374,6 +381,7 @@ static HRESULT WINAPI domtext_put_text( { domtext *This = impl_from_IXMLDOMText( iface ); TRACE("(%p)->(%s)\n", This, debugstr_w(p)); + domtext_reset_noenc(This); return node_put_text( &This->node, p ); } @@ -611,7 +619,14 @@ static HRESULT WINAPI domtext_put_data( BSTR data) { domtext *This = impl_from_IXMLDOMText( iface ); + static WCHAR rnW[] = {'\r','\n',0}; + TRACE("(%p)->(%s)\n", This, debugstr_w(data)); + + if (data && !strcmpW(rnW, data)) + This->node.node->name = xmlStringTextNoenc; + else + domtext_reset_noenc(This); return node_set_content(&This->node, data); } diff --git a/reactos/dll/win32/msxml3/xmlparser.c b/reactos/dll/win32/msxml3/xmlparser.c index 9a500e58c27..7807ea1b309 100644 --- a/reactos/dll/win32/msxml3/xmlparser.c +++ b/reactos/dll/win32/msxml3/xmlparser.c @@ -49,6 +49,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); typedef struct _xmlparser { IXMLParser IXMLParser_iface; + IXMLNodeFactory *nodefactory; + IUnknown *input; LONG ref; int flags; @@ -98,6 +100,12 @@ static ULONG WINAPI xmlparser_Release(IXMLParser* iface) TRACE("(%p)->(%d)\n", This, ref); if ( ref == 0 ) { + if(This->input) + IUnknown_Release(This->input); + + if(This->nodefactory) + IXMLNodeFactory_Release(This->nodefactory); + heap_free( This ); } @@ -109,18 +117,33 @@ static HRESULT WINAPI xmlparser_SetFactory(IXMLParser *iface, IXMLNodeFactory *p { xmlparser *This = impl_from_IXMLParser( iface ); - FIXME("(%p %p)\n", This, pNodeFactory); + TRACE("(%p %p)\n", This, pNodeFactory); - return E_NOTIMPL; + if(This->nodefactory) + IXMLNodeFactory_Release(This->nodefactory); + + This->nodefactory = pNodeFactory; + if(This->nodefactory) + IXMLNodeFactory_AddRef(This->nodefactory); + + return S_OK; } static HRESULT WINAPI xmlparser_GetFactory(IXMLParser *iface, IXMLNodeFactory **ppNodeFactory) { xmlparser *This = impl_from_IXMLParser( iface ); - FIXME("(%p, %p)\n", This, ppNodeFactory); + TRACE("(%p, %p)\n", This, ppNodeFactory); - return E_NOTIMPL; + if(!ppNodeFactory) + return E_INVALIDARG; + + *ppNodeFactory = This->nodefactory; + + if(*ppNodeFactory) + IXMLNodeFactory_AddRef(*ppNodeFactory); + + return S_OK; } static HRESULT WINAPI xmlparser_Abort(IXMLParser *iface, BSTR bstrErrorInfo) @@ -230,9 +253,18 @@ static HRESULT WINAPI xmlparser_SetInput(IXMLParser *iface, IUnknown *pStm) { xmlparser *This = impl_from_IXMLParser( iface ); - FIXME("(%p %p)\n", This, pStm); + TRACE("(%p %p)\n", This, pStm); - return E_NOTIMPL; + if(!pStm) + return E_INVALIDARG; + + if(This->input) + IUnknown_Release(This->input); + + This->input = pStm; + IUnknown_AddRef(This->input); + + return S_OK; } static HRESULT WINAPI xmlparser_PushData(IXMLParser *iface, const char *pData, @@ -418,6 +450,8 @@ HRESULT XMLParser_create(IUnknown* pUnkOuter, void**ppObj) return E_OUTOFMEMORY; This->IXMLParser_iface.lpVtbl = &xmlparser_vtbl; + This->nodefactory = NULL; + This->input = NULL; This->flags = 0; This->ref = 1; diff --git a/reactos/dll/win32/msxml3/xslpattern.l b/reactos/dll/win32/msxml3/xslpattern.l index eb84e40bc79..bda383602cf 100644 --- a/reactos/dll/win32/msxml3/xslpattern.l +++ b/reactos/dll/win32/msxml3/xslpattern.l @@ -58,7 +58,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msxml); %option reentrant bison-bridge %option noyywrap %option prefix="xslpattern_" -%option noinput nounput +%option noinput nounput never-interactive /* From the w3c XML standard * */ diff --git a/reactos/dll/win32/msxml3/xslpattern.yy.c b/reactos/dll/win32/msxml3/xslpattern.yy.c index 489a47474e5..f61ced65b8a 100644 --- a/reactos/dll/win32/msxml3/xslpattern.yy.c +++ b/reactos/dll/win32/msxml3/xslpattern.yy.c @@ -872,16 +872,12 @@ yy_match: yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 138 ); + while ( yy_current_state != 95 ); + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; yy_find_action: yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = yyg->yy_last_accepting_cpos; - yy_current_state = yyg->yy_last_accepting_state; - yy_act = yy_accept[yy_current_state]; - } YY_DO_BEFORE_ACTION; @@ -1088,7 +1084,7 @@ YY_RULE_SETUP #line 153 "xslpattern.l" ECHO; YY_BREAK -#line 1092 "xslpattern.yy.c" +#line 1088 "xslpattern.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1155,7 +1151,8 @@ case YY_STATE_EOF(INITIAL): else { - yy_cp = yyg->yy_c_buf_p; + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; } } @@ -1609,10 +1606,6 @@ static void xslpattern__load_buffer_state (yyscan_t yyscanner) xslpattern_free((void *) b ,yyscanner ); } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a xslpattern_restart() or at EOF. @@ -1637,7 +1630,7 @@ extern int isatty (int ); b->yy_bs_column = 0; } - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + b->yy_is_interactive = 0; errno = oerrno; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 88d684edc6f..f2f3e7aad9b 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -120,7 +120,7 @@ reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync reactos/dll/win32/msxml # Synced to Wine-1.5.19 reactos/dll/win32/msxml2 # Synced to Wine-1.5.19 -reactos/dll/win32/msxml3 # Synced to Wine-1.5.12 +reactos/dll/win32/msxml3 # Synced to Wine-1.5.26 reactos/dll/win32/msxml4 # Synced to Wine-1.5.19 reactos/dll/win32/msxml6 # Synced to Wine-1.5.19 reactos/dll/win32/nddeapi # Synced to Wine-1.5.19 From aaa2bdfbceb909d6df0cc0a05eed621298cc01d5 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 22 Mar 2013 16:13:58 +0000 Subject: [PATCH 49/74] [MSXML3_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58580 --- rostests/winetests/msxml3/CMakeLists.txt | 1 + rostests/winetests/msxml3/domdoc.c | 2023 ++++++---------------- rostests/winetests/msxml3/httpreq.c | 1792 +++++++++++++++++++ rostests/winetests/msxml3/saxreader.c | 279 ++- rostests/winetests/msxml3/schema.c | 46 +- rostests/winetests/msxml3/testlist.c | 7 +- rostests/winetests/msxml3/xmldoc.c | 19 +- rostests/winetests/msxml3/xmlparser.c | 108 +- rostests/winetests/msxml3/xmlview.c | 35 +- 9 files changed, 2696 insertions(+), 1614 deletions(-) create mode 100644 rostests/winetests/msxml3/httpreq.c diff --git a/rostests/winetests/msxml3/CMakeLists.txt b/rostests/winetests/msxml3/CMakeLists.txt index bb70fc92449..12d78771ccc 100644 --- a/rostests/winetests/msxml3/CMakeLists.txt +++ b/rostests/winetests/msxml3/CMakeLists.txt @@ -3,6 +3,7 @@ add_definitions(-D__ROS_LONG64__) list(APPEND SOURCE domdoc.c + httpreq.c saxreader.c schema.c testlist.c diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index fcbbed62012..327ad0a593c 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -4,7 +4,7 @@ * Copyright 2005 Mike McCormack for CodeWeavers * Copyright 2007-2008 Alistair Leslie-Hughes * Copyright 2010-2011 Adam Martinson for CodeWeavers - * Copyright 2010-2012 Nikolay Sivov for CodeWeavers + * Copyright 2010-2013 Nikolay Sivov for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,50 +22,33 @@ */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #include #include -#include "windows.h" +//#include "windows.h" -#include "msxml2.h" -#include "msxml2did.h" -#include "ole2.h" -#include "dispex.h" +#include -#include "initguid.h" -#include "objsafe.h" -#include "mshtml.h" - -#include "wine/test.h" +#include +#include +#include +#include +#include +#include +//#include "initguid.h" /* undef the #define in msxml2 so that we can access all versions */ #undef CLSID_DOMDocument -DEFINE_GUID(SID_SContainerDispatch, 0xb722be00, 0x4e68, 0x101b, 0xa2, 0xbc, 0x00, 0xaa, 0x00, 0x40, 0x47, 0x70); -DEFINE_GUID(SID_UnknownSID, 0x75dd09cb, 0x6c40, 0x11d5, 0x85, 0x43, 0x00, 0xc0, 0x4f, 0xa0, 0xfb, 0xa3); DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); -#define DEFINE_EXPECT(func) \ - static BOOL expect_ ## func = FALSE, called_ ## func = FALSE - -#define SET_EXPECT(func) \ - expect_ ## func = TRUE - -#define CHECK_EXPECT2(func) \ - do { \ - ok(expect_ ##func, "unexpected call " #func "\n"); \ - called_ ## func = TRUE; \ - }while(0) - -#define CHECK_CALLED(func) \ - do { \ - ok(called_ ## func, "expected " #func "\n"); \ - expect_ ## func = called_ ## func = FALSE; \ - }while(0) - static const char *debugstr_guid(REFIID riid) { static char buf[50]; @@ -191,1103 +174,6 @@ static IDispatch* create_dispevent(void) return (IDispatch*)&event->IDispatch_iface; } -/* object site */ -DEFINE_EXPECT(site_qi_IServiceProvider); -DEFINE_EXPECT(site_qi_IXMLDOMDocument); -DEFINE_EXPECT(site_qi_IOleClientSite); - -DEFINE_EXPECT(sp_queryservice_SID_SBindHost); -DEFINE_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2); -DEFINE_EXPECT(sp_queryservice_SID_secmgr_htmldoc2); -DEFINE_EXPECT(sp_queryservice_SID_secmgr_xmldomdoc); -DEFINE_EXPECT(sp_queryservice_SID_secmgr_secmgr); - -DEFINE_EXPECT(htmldoc2_get_all); -DEFINE_EXPECT(htmldoc2_get_url); -DEFINE_EXPECT(collection_get_length); - -typedef struct -{ - IServiceProvider IServiceProvider_iface; -} testprov_t; - -testprov_t testprov; - -static HRESULT WINAPI site_QueryInterface(IUnknown *iface, REFIID riid, void **ppvObject) -{ - *ppvObject = NULL; - - if (IsEqualGUID(riid, &IID_IServiceProvider)) - CHECK_EXPECT2(site_qi_IServiceProvider); - - if (IsEqualGUID(riid, &IID_IXMLDOMDocument)) - CHECK_EXPECT2(site_qi_IXMLDOMDocument); - - if (IsEqualGUID(riid, &IID_IOleClientSite)) - CHECK_EXPECT2(site_qi_IOleClientSite); - - if (IsEqualGUID(riid, &IID_IUnknown)) - *ppvObject = iface; - else if (IsEqualGUID(riid, &IID_IServiceProvider)) - *ppvObject = &testprov.IServiceProvider_iface; - - if (*ppvObject) IUnknown_AddRef(iface); - - return *ppvObject ? S_OK : E_NOINTERFACE; -} - -static ULONG WINAPI site_AddRef(IUnknown *iface) -{ - return 2; -} - -static ULONG WINAPI site_Release(IUnknown *iface) -{ - return 1; -} - -static const IUnknownVtbl testsiteVtbl = -{ - site_QueryInterface, - site_AddRef, - site_Release -}; - -typedef struct -{ - IUnknown IUnknown_iface; -} testsite_t; - -static testsite_t testsite = { { &testsiteVtbl } }; - -/* test IHTMLElementCollection */ -static HRESULT WINAPI htmlecoll_QueryInterface(IHTMLElementCollection *iface, REFIID riid, void **ppvObject) -{ - ok(0, "unexpected call\n"); - *ppvObject = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI htmlecoll_AddRef(IHTMLElementCollection *iface) -{ - return 2; -} - -static ULONG WINAPI htmlecoll_Release(IHTMLElementCollection *iface) -{ - return 1; -} - -static HRESULT WINAPI htmlecoll_GetTypeInfoCount(IHTMLElementCollection *iface, UINT *pctinfo) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_GetTypeInfo(IHTMLElementCollection *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_GetIDsOfNames(IHTMLElementCollection *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_Invoke(IHTMLElementCollection *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_toString(IHTMLElementCollection *iface, BSTR *String) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_put_length(IHTMLElementCollection *iface, LONG v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_get_length(IHTMLElementCollection *iface, LONG *v) -{ - CHECK_EXPECT2(collection_get_length); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_get__newEnum(IHTMLElementCollection *iface, IUnknown **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_item(IHTMLElementCollection *iface, VARIANT name, VARIANT index, IDispatch **pdisp) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmlecoll_tags(IHTMLElementCollection *iface, VARIANT tagName, IDispatch **pdisp) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static const IHTMLElementCollectionVtbl TestHTMLECollectionVtbl = { - htmlecoll_QueryInterface, - htmlecoll_AddRef, - htmlecoll_Release, - htmlecoll_GetTypeInfoCount, - htmlecoll_GetTypeInfo, - htmlecoll_GetIDsOfNames, - htmlecoll_Invoke, - - htmlecoll_toString, - htmlecoll_put_length, - htmlecoll_get_length, - htmlecoll_get__newEnum, - htmlecoll_item, - htmlecoll_tags -}; - -typedef struct -{ - IHTMLElementCollection IHTMLElementCollection_iface; -} testhtmlecoll_t; - -static testhtmlecoll_t htmlecoll = { { &TestHTMLECollectionVtbl } }; - -/* test IHTMLDocument2 */ -static HRESULT WINAPI htmldoc2_QueryInterface(IHTMLDocument2 *iface, REFIID riid, void **ppvObject) -{ - trace("\n"); - *ppvObject = NULL; - return E_NOINTERFACE; -} - -static ULONG WINAPI htmldoc2_AddRef(IHTMLDocument2 *iface) -{ - return 2; -} - -static ULONG WINAPI htmldoc2_Release(IHTMLDocument2 *iface) -{ - return 1; -} - -static HRESULT WINAPI htmldoc2_GetTypeInfoCount(IHTMLDocument2 *iface, UINT *pctinfo) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_GetTypeInfo(IHTMLDocument2 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_GetIDsOfNames(IHTMLDocument2 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_Invoke(IHTMLDocument2 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_Script(IHTMLDocument2 *iface, IDispatch **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_all(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - CHECK_EXPECT2(htmldoc2_get_all); - *p = &htmlecoll.IHTMLElementCollection_iface; - return S_OK; -} - -static HRESULT WINAPI htmldoc2_get_body(IHTMLDocument2 *iface, IHTMLElement **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_activeElement(IHTMLDocument2 *iface, IHTMLElement **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_images(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_applets(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_links(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_forms(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_anchors(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_title(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_title(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_scripts(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_designMode(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_designMode(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_selection(IHTMLDocument2 *iface, IHTMLSelectionObject **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_readyState(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_frames(IHTMLDocument2 *iface, IHTMLFramesCollection2 **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_embeds(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_plugins(IHTMLDocument2 *iface, IHTMLElementCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_alinkColor(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_alinkColor(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_bgColor(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_bgColor(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_fgColor(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_fgColor(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_linkColor(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_linkColor(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_vlinkColor(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_vlinkColor(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_referrer(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_location(IHTMLDocument2 *iface, IHTMLLocation **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_lastModified(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_URL(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_URL(IHTMLDocument2 *iface, BSTR *p) -{ - CHECK_EXPECT2(htmldoc2_get_url); - *p = SysAllocString(NULL); - return S_OK; -} - -static HRESULT WINAPI htmldoc2_put_domain(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_domain(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_cookie(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_cookie(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_expando(IHTMLDocument2 *iface, VARIANT_BOOL v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_expando(IHTMLDocument2 *iface, VARIANT_BOOL *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_charset(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_charset(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_defaultCharset(IHTMLDocument2 *iface, BSTR v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_defaultCharset(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_mimeType(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_fileSize(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_fileCreatedDate(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_fileModifiedDate(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_fileUpdatedDate(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_security(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_protocol(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_nameProp(IHTMLDocument2 *iface, BSTR *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_write(IHTMLDocument2 *iface, SAFEARRAY *psarray) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_writeln(IHTMLDocument2 *iface, SAFEARRAY *psarray) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_open(IHTMLDocument2 *iface, BSTR url, VARIANT name, - VARIANT features, VARIANT replace, IDispatch **pomWindowResult) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_close(IHTMLDocument2 *iface) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_clear(IHTMLDocument2 *iface) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_queryCommandSupported(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT_BOOL *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_queryCommandEnabled(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT_BOOL *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_queryCommandState(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT_BOOL *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_queryCommandIndeterm(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT_BOOL *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_queryCommandText(IHTMLDocument2 *iface, BSTR cmdID, - BSTR *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_queryCommandValue(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_execCommand(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_execCommandShowHelp(IHTMLDocument2 *iface, BSTR cmdID, - VARIANT_BOOL *pfRet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_createElement(IHTMLDocument2 *iface, BSTR eTag, - IHTMLElement **newElem) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onhelp(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onhelp(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onclick(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onclick(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_ondblclick(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_ondblclick(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onkeyup(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onkeyup(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onkeydown(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onkeydown(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onkeypress(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onkeypress(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onmouseup(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onmouseup(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onmousedown(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onmousedown(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onmousemove(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onmousemove(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onmouseout(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onmouseout(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onmouseover(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onmouseover(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onreadystatechange(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onreadystatechange(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onafterupdate(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onafterupdate(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onrowexit(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onrowexit(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onrowenter(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onrowenter(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_ondragstart(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_ondragstart(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onselectstart(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onselectstart(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_elementFromPoint(IHTMLDocument2 *iface, LONG x, LONG y, - IHTMLElement **elementHit) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_parentWindow(IHTMLDocument2 *iface, IHTMLWindow2 **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_styleSheets(IHTMLDocument2 *iface, - IHTMLStyleSheetsCollection **p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onbeforeupdate(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onbeforeupdate(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_put_onerrorupdate(IHTMLDocument2 *iface, VARIANT v) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_get_onerrorupdate(IHTMLDocument2 *iface, VARIANT *p) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_toString(IHTMLDocument2 *iface, BSTR *String) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI htmldoc2_createStyleSheet(IHTMLDocument2 *iface, BSTR bstrHref, - LONG lIndex, IHTMLStyleSheet **ppnewStyleSheet) -{ - ok(0, "unexpected call\n"); - return E_NOTIMPL; -} - -static const IHTMLDocument2Vtbl TestHTMLDocumentVtbl = { - htmldoc2_QueryInterface, - htmldoc2_AddRef, - htmldoc2_Release, - htmldoc2_GetTypeInfoCount, - htmldoc2_GetTypeInfo, - htmldoc2_GetIDsOfNames, - htmldoc2_Invoke, - htmldoc2_get_Script, - htmldoc2_get_all, - htmldoc2_get_body, - htmldoc2_get_activeElement, - htmldoc2_get_images, - htmldoc2_get_applets, - htmldoc2_get_links, - htmldoc2_get_forms, - htmldoc2_get_anchors, - htmldoc2_put_title, - htmldoc2_get_title, - htmldoc2_get_scripts, - htmldoc2_put_designMode, - htmldoc2_get_designMode, - htmldoc2_get_selection, - htmldoc2_get_readyState, - htmldoc2_get_frames, - htmldoc2_get_embeds, - htmldoc2_get_plugins, - htmldoc2_put_alinkColor, - htmldoc2_get_alinkColor, - htmldoc2_put_bgColor, - htmldoc2_get_bgColor, - htmldoc2_put_fgColor, - htmldoc2_get_fgColor, - htmldoc2_put_linkColor, - htmldoc2_get_linkColor, - htmldoc2_put_vlinkColor, - htmldoc2_get_vlinkColor, - htmldoc2_get_referrer, - htmldoc2_get_location, - htmldoc2_get_lastModified, - htmldoc2_put_URL, - htmldoc2_get_URL, - htmldoc2_put_domain, - htmldoc2_get_domain, - htmldoc2_put_cookie, - htmldoc2_get_cookie, - htmldoc2_put_expando, - htmldoc2_get_expando, - htmldoc2_put_charset, - htmldoc2_get_charset, - htmldoc2_put_defaultCharset, - htmldoc2_get_defaultCharset, - htmldoc2_get_mimeType, - htmldoc2_get_fileSize, - htmldoc2_get_fileCreatedDate, - htmldoc2_get_fileModifiedDate, - htmldoc2_get_fileUpdatedDate, - htmldoc2_get_security, - htmldoc2_get_protocol, - htmldoc2_get_nameProp, - htmldoc2_write, - htmldoc2_writeln, - htmldoc2_open, - htmldoc2_close, - htmldoc2_clear, - htmldoc2_queryCommandSupported, - htmldoc2_queryCommandEnabled, - htmldoc2_queryCommandState, - htmldoc2_queryCommandIndeterm, - htmldoc2_queryCommandText, - htmldoc2_queryCommandValue, - htmldoc2_execCommand, - htmldoc2_execCommandShowHelp, - htmldoc2_createElement, - htmldoc2_put_onhelp, - htmldoc2_get_onhelp, - htmldoc2_put_onclick, - htmldoc2_get_onclick, - htmldoc2_put_ondblclick, - htmldoc2_get_ondblclick, - htmldoc2_put_onkeyup, - htmldoc2_get_onkeyup, - htmldoc2_put_onkeydown, - htmldoc2_get_onkeydown, - htmldoc2_put_onkeypress, - htmldoc2_get_onkeypress, - htmldoc2_put_onmouseup, - htmldoc2_get_onmouseup, - htmldoc2_put_onmousedown, - htmldoc2_get_onmousedown, - htmldoc2_put_onmousemove, - htmldoc2_get_onmousemove, - htmldoc2_put_onmouseout, - htmldoc2_get_onmouseout, - htmldoc2_put_onmouseover, - htmldoc2_get_onmouseover, - htmldoc2_put_onreadystatechange, - htmldoc2_get_onreadystatechange, - htmldoc2_put_onafterupdate, - htmldoc2_get_onafterupdate, - htmldoc2_put_onrowexit, - htmldoc2_get_onrowexit, - htmldoc2_put_onrowenter, - htmldoc2_get_onrowenter, - htmldoc2_put_ondragstart, - htmldoc2_get_ondragstart, - htmldoc2_put_onselectstart, - htmldoc2_get_onselectstart, - htmldoc2_elementFromPoint, - htmldoc2_get_parentWindow, - htmldoc2_get_styleSheets, - htmldoc2_put_onbeforeupdate, - htmldoc2_get_onbeforeupdate, - htmldoc2_put_onerrorupdate, - htmldoc2_get_onerrorupdate, - htmldoc2_toString, - htmldoc2_createStyleSheet -}; - -typedef struct -{ - IHTMLDocument2 IHTMLDocument2_iface; -} testhtmldoc2_t; - -static testhtmldoc2_t htmldoc2 = { { &TestHTMLDocumentVtbl } }; - -static HRESULT WINAPI sp_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppvObject) -{ - *ppvObject = NULL; - - if (IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IServiceProvider)) - { - *ppvObject = iface; - IServiceProvider_AddRef(iface); - return S_OK; - } - - ok(0, "unexpected query interface: %s\n", debugstr_guid(riid)); - - return E_NOINTERFACE; -} - -static ULONG WINAPI sp_AddRef(IServiceProvider *iface) -{ - return 2; -} - -static ULONG WINAPI sp_Release(IServiceProvider *iface) -{ - return 1; -} - -static HRESULT WINAPI sp_QueryService(IServiceProvider *iface, REFGUID service, REFIID riid, void **obj) -{ - *obj = NULL; - - if (IsEqualGUID(service, &SID_SBindHost) && - IsEqualGUID(riid, &IID_IBindHost)) - { - CHECK_EXPECT2(sp_queryservice_SID_SBindHost); - } - else if (IsEqualGUID(service, &SID_SContainerDispatch) && - IsEqualGUID(riid, &IID_IHTMLDocument2)) - { - CHECK_EXPECT2(sp_queryservice_SID_SContainerDispatch_htmldoc2); - } - else if (IsEqualGUID(service, &SID_SInternetHostSecurityManager) && - IsEqualGUID(riid, &IID_IHTMLDocument2)) - { - CHECK_EXPECT2(sp_queryservice_SID_secmgr_htmldoc2); - *obj = &htmldoc2.IHTMLDocument2_iface; - return S_OK; - } - else if (IsEqualGUID(service, &SID_SInternetHostSecurityManager) && - IsEqualGUID(riid, &IID_IXMLDOMDocument)) - { - CHECK_EXPECT2(sp_queryservice_SID_secmgr_xmldomdoc); - } - else if (IsEqualGUID(service, &SID_SInternetHostSecurityManager) && - IsEqualGUID(riid, &IID_IInternetHostSecurityManager)) - { - CHECK_EXPECT2(sp_queryservice_SID_secmgr_secmgr); - } - else if (IsEqualGUID(service, &SID_UnknownSID) && - IsEqualGUID(riid, &IID_IStream)) - { - /* FIXME: unidentified service id */ - } - else - ok(0, "unexpected request: sid %s, riid %s\n", debugstr_guid(service), debugstr_guid(riid)); - - return E_NOTIMPL; -} - -static const IServiceProviderVtbl testprovVtbl = -{ - sp_QueryInterface, - sp_AddRef, - sp_Release, - sp_QueryService -}; - -testprov_t testprov = { { &testprovVtbl } }; - /* IStream */ static HRESULT WINAPI istream_QueryInterface(IStream *iface, REFIID riid, void **ppvObject) { @@ -2879,16 +1765,20 @@ static void test_persiststreaminit(void) { IXMLDOMDocument *doc; IPersistStreamInit *streaminit; + ULARGE_INTEGER size; HRESULT hr; doc = create_document(&IID_IXMLDOMDocument); if (!doc) return; hr = IXMLDOMDocument_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&streaminit); - ok( hr == S_OK, "failed with 0x%08x\n", hr ); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IPersistStreamInit_InitNew(streaminit); - ok( hr == S_OK, "failed with 0x%08x\n", hr ); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IPersistStreamInit_GetSizeMax(streaminit, &size); + ok(hr == E_NOTIMPL, "got 0x%08x\n", hr); IXMLDOMDocument_Release(doc); } @@ -4941,386 +3831,6 @@ static void _test_IObjectSafety_common(unsigned line, IObjectSafety *safety) "got %08x\n", supported); } -static void test_XMLHTTP(void) -{ - static const char bodyA[] = "mode=Test"; - static const char urlA[] = "http://crossover.codeweavers.com/posttest.php"; - static const char xmltestA[] = "http://crossover.codeweavers.com/xmltest.xml"; - static const WCHAR wszExpectedResponse[] = {'F','A','I','L','E','D',0}; - static const CHAR xmltestbodyA[] = "\nTEST\n"; - - IXMLHttpRequest *xhr; - IObjectSafety *safety; - IObjectWithSite *obj_site, *obj_site2; - BSTR bstrResponse, str, str1; - VARIANT varbody, varbody_ref; - VARIANT dummy; - VARIANT async; - LONG state, status, bound; - IDispatch *event; - void *ptr; - HRESULT hr; - HGLOBAL g; - - hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, - &IID_IXMLHttpRequest, (void**)&xhr); - if (FAILED(hr)) - { - win_skip("IXMLHTTPRequest is not available (0x%08x)\n", hr); - return; - } - - VariantInit(&dummy); - V_VT(&dummy) = VT_ERROR; - V_ERROR(&dummy) = DISP_E_MEMBERNOTFOUND; - VariantInit(&async); - V_VT(&async) = VT_BOOL; - V_BOOL(&async) = VARIANT_FALSE; - - hr = IXMLHttpRequest_put_onreadystatechange(xhr, NULL); - EXPECT_HR(hr, S_OK); - - hr = IXMLHttpRequest_abort(xhr); - EXPECT_HR(hr, S_OK); - - V_VT(&varbody) = VT_I2; - V_I2(&varbody) = 1; - hr = IXMLHttpRequest_get_responseBody(xhr, &varbody); - EXPECT_HR(hr, E_PENDING); - ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); - ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); - - V_VT(&varbody) = VT_I2; - V_I2(&varbody) = 1; - hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); - EXPECT_HR(hr, E_PENDING); - ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); - ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); - - /* send before open */ - hr = IXMLHttpRequest_send(xhr, dummy); - ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); - - /* initial status code */ - hr = IXMLHttpRequest_get_status(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - status = 0xdeadbeef; - hr = IXMLHttpRequest_get_status(xhr, &status); - ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); - ok(status == 0xdeadbeef, "got %d\n", status); - - hr = IXMLHttpRequest_get_statusText(xhr, &str); - ok(hr == E_FAIL, "got 0x%08x\n", hr); - - /* invalid parameters */ - hr = IXMLHttpRequest_open(xhr, NULL, NULL, async, dummy, dummy); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_open(xhr, _bstr_("POST"), NULL, async, dummy, dummy); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_open(xhr, NULL, _bstr_(urlA), async, dummy, dummy); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_setRequestHeader(xhr, NULL, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_("header1"), NULL); - ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); - - hr = IXMLHttpRequest_setRequestHeader(xhr, NULL, _bstr_("value1")); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_("header1"), _bstr_("value1")); - ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); - - hr = IXMLHttpRequest_get_readyState(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - state = -1; - hr = IXMLHttpRequest_get_readyState(xhr, &state); - EXPECT_HR(hr, S_OK); - ok(state == READYSTATE_UNINITIALIZED, "got %d, expected READYSTATE_UNINITIALIZED\n", state); - - event = create_dispevent(); - - EXPECT_REF(event, 1); - hr = IXMLHttpRequest_put_onreadystatechange(xhr, event); - EXPECT_HR(hr, S_OK); - EXPECT_REF(event, 2); - - g_unexpectedcall = g_expectedcall = 0; - - hr = IXMLHttpRequest_open(xhr, _bstr_("POST"), _bstr_(urlA), async, dummy, dummy); - EXPECT_HR(hr, S_OK); - - ok(g_unexpectedcall == 0, "unexpected disp event call\n"); - ok(g_expectedcall == 1 || broken(g_expectedcall == 0) /* win2k */, "no expected disp event call\n"); - - /* status code after ::open() */ - status = 0xdeadbeef; - hr = IXMLHttpRequest_get_status(xhr, &status); - ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); - ok(status == 0xdeadbeef, "got %d\n", status); - - state = -1; - hr = IXMLHttpRequest_get_readyState(xhr, &state); - EXPECT_HR(hr, S_OK); - ok(state == READYSTATE_LOADING, "got %d, expected READYSTATE_LOADING\n", state); - - hr = IXMLHttpRequest_abort(xhr); - EXPECT_HR(hr, S_OK); - - state = -1; - hr = IXMLHttpRequest_get_readyState(xhr, &state); - EXPECT_HR(hr, S_OK); - ok(state == READYSTATE_UNINITIALIZED || broken(state == READYSTATE_LOADING) /* win2k */, - "got %d, expected READYSTATE_UNINITIALIZED\n", state); - - hr = IXMLHttpRequest_open(xhr, _bstr_("POST"), _bstr_(urlA), async, dummy, dummy); - EXPECT_HR(hr, S_OK); - - hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_("header1"), _bstr_("value1")); - EXPECT_HR(hr, S_OK); - - hr = IXMLHttpRequest_setRequestHeader(xhr, NULL, _bstr_("value1")); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_setRequestHeader(xhr, _bstr_(""), _bstr_("value1")); - EXPECT_HR(hr, E_INVALIDARG); - - V_VT(&varbody) = VT_BSTR; - V_BSTR(&varbody) = _bstr_(bodyA); - - hr = IXMLHttpRequest_send(xhr, varbody); - if (hr == INET_E_RESOURCE_NOT_FOUND) - { - skip("No connection could be made with crossover.codeweavers.com\n"); - IXMLHttpRequest_Release(xhr); - return; - } - EXPECT_HR(hr, S_OK); - - /* response headers */ - hr = IXMLHttpRequest_getAllResponseHeaders(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - hr = IXMLHttpRequest_getAllResponseHeaders(xhr, &str); - EXPECT_HR(hr, S_OK); - /* status line is stripped already */ - ok(memcmp(str, _bstr_("HTTP"), 4*sizeof(WCHAR)), "got response headers %s\n", wine_dbgstr_w(str)); - ok(*str, "got empty headers\n"); - hr = IXMLHttpRequest_getAllResponseHeaders(xhr, &str1); - EXPECT_HR(hr, S_OK); - ok(str1 != str, "got %p\n", str1); - SysFreeString(str1); - SysFreeString(str); - - hr = IXMLHttpRequest_getResponseHeader(xhr, NULL, NULL); - EXPECT_HR(hr, E_INVALIDARG); - hr = IXMLHttpRequest_getResponseHeader(xhr, _bstr_("Date"), NULL); - EXPECT_HR(hr, E_INVALIDARG); - hr = IXMLHttpRequest_getResponseHeader(xhr, _bstr_("Date"), &str); - EXPECT_HR(hr, S_OK); - ok(*str != ' ', "got leading space in header %s\n", wine_dbgstr_w(str)); - SysFreeString(str); - - /* status code after ::send() */ - status = 0xdeadbeef; - hr = IXMLHttpRequest_get_status(xhr, &status); - EXPECT_HR(hr, S_OK); - ok(status == 200, "got %d\n", status); - - hr = IXMLHttpRequest_get_statusText(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_get_statusText(xhr, &str); - EXPECT_HR(hr, S_OK); - ok(!lstrcmpW(str, _bstr_("OK")), "got status %s\n", wine_dbgstr_w(str)); - SysFreeString(str); - - /* another ::send() after completed request */ - V_VT(&varbody) = VT_BSTR; - V_BSTR(&varbody) = _bstr_(bodyA); - - hr = IXMLHttpRequest_send(xhr, varbody); - ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); - - hr = IXMLHttpRequest_get_responseText(xhr, &bstrResponse); - EXPECT_HR(hr, S_OK); - /* the server currently returns "FAILED" because the Content-Type header is - * not what the server expects */ - if(hr == S_OK) - { - ok(!memcmp(bstrResponse, wszExpectedResponse, sizeof(wszExpectedResponse)), - "expected %s, got %s\n", wine_dbgstr_w(wszExpectedResponse), wine_dbgstr_w(bstrResponse)); - SysFreeString(bstrResponse); - } - - /* POST: VT_VARIANT|VT_BYREF body */ - V_VT(&varbody_ref) = VT_VARIANT|VT_BYREF; - V_VARIANTREF(&varbody_ref) = &varbody; - hr = IXMLHttpRequest_open(xhr, _bstr_("POST"), _bstr_(urlA), async, dummy, dummy); - EXPECT_HR(hr, S_OK); - hr = IXMLHttpRequest_send(xhr, varbody_ref); - EXPECT_HR(hr, S_OK); - - /* GET request */ - hr = IXMLHttpRequest_open(xhr, _bstr_("GET"), _bstr_(xmltestA), async, dummy, dummy); - EXPECT_HR(hr, S_OK); - - V_VT(&varbody) = VT_EMPTY; - - hr = IXMLHttpRequest_send(xhr, varbody); - if (hr == INET_E_RESOURCE_NOT_FOUND) - { - skip("No connection could be made with crossover.codeweavers.com\n"); - IXMLHttpRequest_Release(xhr); - return; - } - EXPECT_HR(hr, S_OK); - - hr = IXMLHttpRequest_get_responseText(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - hr = IXMLHttpRequest_get_responseText(xhr, &bstrResponse); - EXPECT_HR(hr, S_OK); - ok(!memcmp(bstrResponse, _bstr_(xmltestbodyA), sizeof(xmltestbodyA)*sizeof(WCHAR)), - "expected %s, got %s\n", xmltestbodyA, wine_dbgstr_w(bstrResponse)); - SysFreeString(bstrResponse); - - hr = IXMLHttpRequest_get_responseBody(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - V_VT(&varbody) = VT_EMPTY; - hr = IXMLHttpRequest_get_responseBody(xhr, &varbody); - EXPECT_HR(hr, S_OK); - ok(V_VT(&varbody) == (VT_ARRAY|VT_UI1), "got type %d, expected %d\n", V_VT(&varbody), VT_ARRAY|VT_UI1); - ok(SafeArrayGetDim(V_ARRAY(&varbody)) == 1, "got %d, expected one dimension\n", SafeArrayGetDim(V_ARRAY(&varbody))); - - bound = -1; - hr = SafeArrayGetLBound(V_ARRAY(&varbody), 1, &bound); - EXPECT_HR(hr, S_OK); - ok(bound == 0, "got %d, expected zero bound\n", bound); - - hr = SafeArrayAccessData(V_ARRAY(&varbody), &ptr); - EXPECT_HR(hr, S_OK); - ok(memcmp(ptr, xmltestbodyA, sizeof(xmltestbodyA)-1) == 0, "got wrong body data\n"); - SafeArrayUnaccessData(V_ARRAY(&varbody)); - - VariantClear(&varbody); - - /* get_responseStream */ - hr = IXMLHttpRequest_get_responseStream(xhr, NULL); - EXPECT_HR(hr, E_INVALIDARG); - - V_VT(&varbody) = VT_EMPTY; - hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); - ok(V_VT(&varbody) == VT_UNKNOWN, "got type %d\n", V_VT(&varbody)); - EXPECT_HR(hr, S_OK); - EXPECT_REF(V_UNKNOWN(&varbody), 1); - - g = NULL; - hr = GetHGlobalFromStream((IStream*)V_UNKNOWN(&varbody), &g); - EXPECT_HR(hr, S_OK); - ok(g != NULL, "got %p\n", g); - - hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectSafety, (void**)&safety); - EXPECT_HR(hr, S_OK); - if(hr == S_OK) - { - test_IObjectSafety_common(safety); - IObjectSafety_Release(safety); - } - - IDispatch_Release(event); - - /* interaction with object site */ - EXPECT_REF(xhr, 1); - hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site); - EXPECT_HR(hr, S_OK); -todo_wine { - EXPECT_REF(xhr, 1); - EXPECT_REF(obj_site, 1); -} - - IObjectWithSite_AddRef(obj_site); -todo_wine { - EXPECT_REF(obj_site, 2); - EXPECT_REF(xhr, 1); -} - IObjectWithSite_Release(obj_site); - - hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site2); - EXPECT_HR(hr, S_OK); -todo_wine { - EXPECT_REF(xhr, 1); - EXPECT_REF(obj_site, 1); - EXPECT_REF(obj_site2, 1); - ok(obj_site != obj_site2, "expected new instance\n"); -} - SET_EXPECT(site_qi_IServiceProvider); - SET_EXPECT(sp_queryservice_SID_SBindHost); - SET_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2); - SET_EXPECT(sp_queryservice_SID_secmgr_htmldoc2); - SET_EXPECT(sp_queryservice_SID_secmgr_xmldomdoc); - SET_EXPECT(sp_queryservice_SID_secmgr_secmgr); - - /* calls to IHTMLDocument2 */ - SET_EXPECT(htmldoc2_get_all); - SET_EXPECT(collection_get_length); - SET_EXPECT(htmldoc2_get_url); - - SET_EXPECT(site_qi_IXMLDOMDocument); - SET_EXPECT(site_qi_IOleClientSite); - - hr = IObjectWithSite_SetSite(obj_site, &testsite.IUnknown_iface); - EXPECT_HR(hr, S_OK); - - CHECK_CALLED(site_qi_IServiceProvider); -todo_wine - CHECK_CALLED(sp_queryservice_SID_SBindHost); - CHECK_CALLED(sp_queryservice_SID_SContainerDispatch_htmldoc2); -todo_wine { - CHECK_CALLED(sp_queryservice_SID_secmgr_htmldoc2); - CHECK_CALLED(sp_queryservice_SID_secmgr_xmldomdoc); - /* this one isn't very reliable - CHECK_CALLED(sp_queryservice_SID_secmgr_secmgr); */ - - CHECK_CALLED(htmldoc2_get_all); - CHECK_CALLED(collection_get_length); - CHECK_CALLED(htmldoc2_get_url); - - CHECK_CALLED(site_qi_IXMLDOMDocument); - CHECK_CALLED(site_qi_IOleClientSite); -} - IObjectWithSite_Release(obj_site); - - /* try to set site another time */ - - /* to be removed once IObjectWithSite is properly separated */ - SET_EXPECT(site_qi_IServiceProvider); - SET_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2); - - hr = IObjectWithSite_SetSite(obj_site2, &testsite.IUnknown_iface); - EXPECT_HR(hr, S_OK); - - todo_wine EXPECT_REF(xhr, 1); - IXMLHttpRequest_Release(xhr); - - /* still works after request is released */ - - /* to be removed once IObjectWithSite is properly separated */ - SET_EXPECT(site_qi_IServiceProvider); - SET_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2); - - hr = IObjectWithSite_SetSite(obj_site2, &testsite.IUnknown_iface); - EXPECT_HR(hr, S_OK); - IObjectWithSite_Release(obj_site2); - - free_bstrs(); -} - static void test_IXMLDOMDocument2(void) { static const WCHAR emptyW[] = {0}; @@ -6104,7 +4614,7 @@ static void test_cloneNode(void ) IXMLDOMNamedNodeMap *mapAttr; LONG length, length1; LONG attr_cnt, attr_cnt1; - IXMLDOMNode *node; + IXMLDOMNode *node, *attr; IXMLDOMNode *node_clone; IXMLDOMNode *node_first; HRESULT hr; @@ -6165,6 +4675,11 @@ static void test_cloneNode(void ) hr = IXMLDOMNamedNodeMap_get_length(mapAttr, &attr_cnt1); ok( hr == S_OK, "ret %08x\n", hr ); ok(attr_cnt1 == 3, "got %d\n", attr_cnt1); + /* now really get some attributes from cloned element */ + attr = NULL; + hr = IXMLDOMNamedNodeMap_getNamedItem(mapAttr, _bstr_("id"), &attr); + ok(hr == S_OK, "ret %08x\n", hr); + IXMLDOMNode_Release(attr); IXMLDOMNamedNodeMap_Release(mapAttr); ok(length == length1, "wrong Child count (%d, %d)\n", length, length1); @@ -8098,7 +6613,7 @@ static void test_put_nodeValue(void) IXMLDOMDocument_Release(doc); } -static void test_document_IObjectSafety(void) +static void test_IObjectSafety(void) { IXMLDOMDocument *doc; IObjectSafety *safety; @@ -8113,8 +6628,16 @@ static void test_document_IObjectSafety(void) test_IObjectSafety_common(safety); IObjectSafety_Release(safety); - IXMLDOMDocument_Release(doc); + + hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, + &IID_IObjectSafety, (void**)&safety); + ok(hr == S_OK, "Could not create XMLHTTPRequest instance: %08x\n", hr); + + test_IObjectSafety_common(safety); + + IObjectSafety_Release(safety); + } typedef struct _property_test_t { @@ -9561,10 +8084,15 @@ static void test_put_nodeTypedValue(void) static void test_get_xml(void) { static const char xmlA[] = "\r\ntest\r\n"; + static const char attrA[] = "attr=\""a & b"\""; + static const char attr2A[] = "\"a & b\""; + static const char attr3A[] = "attr=\"&quot;a\""; + static const char attr4A[] = ""a"; static const char fooA[] = ""; IXMLDOMProcessingInstruction *pi; IXMLDOMNode *first; IXMLDOMElement *elem = NULL; + IXMLDOMAttribute *attr; IXMLDOMDocument *doc; VARIANT_BOOL b; VARIANT v; @@ -9620,6 +8148,51 @@ static void test_get_xml(void) SysFreeString(xml); IXMLDOMElement_Release(elem); + + /* attribute node */ + hr = IXMLDOMDocument_createAttribute(doc, _bstr_("attr"), &attr); + ok(hr == S_OK, "got 0x%08x\n", hr); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("\"a & b\""); + hr = IXMLDOMAttribute_put_value(attr, v); + ok(hr == S_OK, "got 0x%08x\n", hr); + + xml = NULL; + hr = IXMLDOMAttribute_get_xml(attr, &xml); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!memcmp(xml, _bstr_(attrA), (sizeof(attrA)-1)*sizeof(WCHAR)), "got %s\n", wine_dbgstr_w(xml)); + SysFreeString(xml); + + VariantInit(&v); + hr = IXMLDOMAttribute_get_value(attr, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v)); + ok(!memcmp(V_BSTR(&v), _bstr_(attr2A), (sizeof(attr2A)-1)*sizeof(WCHAR)), + "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_(""a"); + hr = IXMLDOMAttribute_put_value(attr, v); + ok(hr == S_OK, "got 0x%08x\n", hr); + + xml = NULL; + hr = IXMLDOMAttribute_get_xml(attr, &xml); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!memcmp(xml, _bstr_(attr3A), (sizeof(attr3A)-1)*sizeof(WCHAR)), "got %s\n", wine_dbgstr_w(xml)); + SysFreeString(xml); + + VariantInit(&v); + hr = IXMLDOMAttribute_get_value(attr, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v)); + ok(!memcmp(V_BSTR(&v), _bstr_(attr4A), (sizeof(attr4A)-1)*sizeof(WCHAR)), + "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + + IXMLDOMAttribute_Release(attr); + IXMLDOMDocument_Release(doc); free_bstrs(); @@ -9765,8 +8338,7 @@ todo_wine { hr = IXSLProcessor_get_output(processor, &v); ok(hr == S_OK, "got 0x%08x\n", hr); ok(V_VT(&v) == VT_BSTR, "got type %d\n", V_VT(&v)); - /* we currently output one '\n' instead of empty string */ - todo_wine ok(lstrcmpW(V_BSTR(&v), _bstr_("")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + ok(lstrcmpW(V_BSTR(&v), _bstr_("")) == 0, "got %s\n", wine_dbgstr_w(V_BSTR(&v))); IXMLDOMDocument_Release(doc2); VariantClear(&v); @@ -9786,15 +8358,30 @@ todo_wine { static void test_insertBefore(void) { - IXMLDOMDocument *doc, *doc2; + IXMLDOMDocument *doc, *doc2, *doc3; IXMLDOMAttribute *attr; IXMLDOMElement *elem1, *elem2, *elem3, *elem4, *elem5; - IXMLDOMNode *node, *newnode; + IXMLDOMNode *node, *newnode, *cdata; HRESULT hr; VARIANT v; BSTR p; doc = create_document(&IID_IXMLDOMDocument); + doc3 = create_document(&IID_IXMLDOMDocument); + + /* document to document */ + V_VT(&v) = VT_NULL; + node = (void*)0xdeadbeef; + hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)doc3, v, &node); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(node == NULL, "got %p\n", node); + + /* document to itself */ + V_VT(&v) = VT_NULL; + node = (void*)0xdeadbeef; + hr = IXMLDOMDocument_insertBefore(doc, (IXMLDOMNode*)doc, v, &node); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(node == NULL, "got %p\n", node); /* insertBefore behaviour for attribute node */ V_VT(&v) = VT_I4; @@ -9805,6 +8392,47 @@ static void test_insertBefore(void) ok(hr == S_OK, "got 0x%08x\n", hr); ok(attr != NULL, "got %p\n", attr); + /* attribute to document */ + V_VT(&v) = VT_NULL; + node = (void*)0xdeadbeef; + hr = IXMLDOMDocument_insertBefore(doc3, (IXMLDOMNode*)attr, v, &node); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(node == NULL, "got %p\n", node); + + /* cdata to document */ + V_VT(&v) = VT_I4; + V_I4(&v) = NODE_CDATA_SECTION; + + cdata = NULL; + hr = IXMLDOMDocument_createNode(doc3, v, _bstr_("cdata"), NULL, &cdata); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(cdata != NULL, "got %p\n", cdata); + + EXPECT_NO_CHILDREN(cdata); + + /* attribute to cdata */ + V_VT(&v) = VT_NULL; + node = (void*)0xdeadbeef; + hr = IXMLDOMNode_insertBefore(cdata, (IXMLDOMNode*)attr, v, &node); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(node == NULL, "got %p\n", node); + + /* document to cdata */ + V_VT(&v) = VT_NULL; + node = (void*)0xdeadbeef; + hr = IXMLDOMNode_insertBefore(cdata, (IXMLDOMNode*)doc, v, &node); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(node == NULL, "got %p\n", node); + + V_VT(&v) = VT_NULL; + node = (void*)0xdeadbeef; + hr = IXMLDOMDocument_insertBefore(doc3, cdata, v, &node); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + ok(node == NULL, "got %p\n", node); + + IXMLDOMNode_Release(cdata); + IXMLDOMDocument_Release(doc3); + /* attribute to attribute */ V_VT(&v) = VT_I4; V_I4(&v) = NODE_ATTRIBUTE; @@ -9910,6 +8538,12 @@ static void test_insertBefore(void) todo_wine EXPECT_REF(elem2, 2); + /* document to element */ + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = NULL; + hr = IXMLDOMElement_insertBefore(elem1, (IXMLDOMNode*)doc, v, NULL); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + V_VT(&v) = VT_DISPATCH; V_DISPATCH(&v) = NULL; node = NULL; @@ -10991,6 +9625,10 @@ static void test_mxnamespacemanager(void) hr = IVBMXNamespaceManager_getDeclaredPrefixes(mgr2, &prefixes); if (hr == S_OK) { + IDispatchEx *dispex; + VARIANT arg, ret; + DISPPARAMS dispparams; + ok(prefixes != NULL, "got %p\n", prefixes); EXPECT_REF(nsmgr, 2); EXPECT_REF(mgr2, 2); @@ -11004,6 +9642,25 @@ static void test_mxnamespacemanager(void) IUnknown_Release(unk1); IUnknown_Release(unk2); + + hr = IMXNamespacePrefixes_QueryInterface(prefixes, &IID_IDispatchEx, (void**)&dispex); + ok(hr == S_OK, "got 0x%08x\n", hr); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 1; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + IDispatchEx_Release(dispex); IMXNamespacePrefixes_Release(prefixes); } IVBMXNamespaceManager_Release(mgr2); @@ -11455,7 +10112,9 @@ static void test_dispex(void) IXMLHTTPRequest *req; IXMLDOMElement *elem; IDispatchEx *dispex; + DISPPARAMS dispparams; IXMLDOMNode *node; + VARIANT arg, ret; VARIANT_BOOL b; IUnknown *unk; HRESULT hr; @@ -11512,6 +10171,91 @@ static void test_dispex(void) ok(did == DISPID_DOM_COLLECTION_BASE+1, "got 0x%08x\n", did); IDispatchEx_Release(dispex); + did = -1; + hr = IDispatchEx_GetDispID(dispex, _bstr_("item"), 0, &did); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(did == DISPID_VALUE, "got %d\n", did); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 0; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret)); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 2; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret)); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 1; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + dispparams.cArgs = 0; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = NULL; + + V_VT(&ret) = VT_EMPTY; + V_I4(&ret) = 1; + hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_I4, "got %d\n", V_VT(&ret)); + ok(V_I4(&ret) == 0, "got %d\n", V_I4(&ret)); + + dispparams.cArgs = 0; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = NULL; + + V_VT(&ret) = VT_EMPTY; + V_I4(&ret) = 1; + hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_I4(&ret) == 1, "got %d\n", V_I4(&ret)); + IXMLDOMNodeList_Release(node_list); /* IXMLDOMParseError */ @@ -11519,6 +10263,26 @@ static void test_dispex(void) EXPECT_HR(hr, S_OK); IXMLDOMParseError_QueryInterface(error, &IID_IUnknown, (void**)&unk); test_domobj_dispex(unk); + + hr = IXMLDOMParseError_QueryInterface(error, &IID_IDispatchEx, (void**)&dispex); + ok(hr == S_OK, "got 0x%08x\n", hr); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 1; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret)); + + IDispatchEx_Release(dispex); + IUnknown_Release(unk); IXMLDOMParseError_Release(error); @@ -11571,6 +10335,95 @@ static void test_dispex(void) ok(did == DISPID_DOM_COLLECTION_BASE+1, "got 0x%08x\n", did); IDispatchEx_Release(dispex); + did = -1; + hr = IDispatchEx_GetDispID(dispex, _bstr_("item"), 0, &did); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(did == DISPID_VALUE, "got %d\n", did); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 0; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); +todo_wine { + ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret)); +} + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 2; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); +todo_wine { + ok(hr == DISP_E_BADPARAMCOUNT, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret)); +} + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 1; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); +todo_wine + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_DISPATCH, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == NULL, "got %p\n", V_DISPATCH(&ret)); + + dispparams.cArgs = 0; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = NULL; + + V_VT(&ret) = VT_EMPTY; + V_I4(&ret) = 1; + hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &ret, NULL, NULL); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_I4, "got %d\n", V_VT(&ret)); + ok(V_I4(&ret) == 0, "got %d\n", V_I4(&ret)); + + dispparams.cArgs = 0; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = NULL; + + V_VT(&ret) = VT_EMPTY; + V_I4(&ret) = 1; + hr = IDispatchEx_Invoke(dispex, DISPID_DOM_NODELIST_LENGTH, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08x\n", hr); +todo_wine { + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_I4(&ret) == 1, "got %d\n", V_I4(&ret)); +} IXMLDOMNamedNodeMap_Release(map); IXMLDOMElement_Release(elem); @@ -11939,6 +10792,61 @@ static void test_nodeValue(void) IXMLDOMDocument_Release(doc); } +static void test_xmlns_attribute(void) +{ + BSTR str; + IXMLDOMDocument *doc; + IXMLDOMElement *root; + IXMLDOMAttribute *pAttribute; + IXMLDOMElement *elem; + HRESULT hr; + + doc = create_document(&IID_IXMLDOMDocument); + if (!doc) return; + + hr = IXMLDOMDocument_createElement(doc, _bstr_("Testing"), &root); + EXPECT_HR(hr, S_OK); + + hr = IXMLDOMDocument_appendChild(doc, (IXMLDOMNode*)root, NULL); + EXPECT_HR(hr, S_OK); + + str = SysAllocString(szAttribute); + hr = IXMLDOMDocument_createAttribute(doc, _bstr_("xmlns:dt"), &pAttribute); + ok( hr == S_OK, "returns %08x\n", hr ); + if(hr == S_OK) + { + VARIANT v; + + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = _bstr_("urn:schemas-microsoft-com:datatypes"); + hr = IXMLDOMAttribute_put_nodeValue(pAttribute, v); + + hr = IXMLDOMElement_setAttributeNode(root, pAttribute, NULL); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMNode_put_dataType((IXMLDOMNode*)root, _bstr_("bin.base64")); + ok(hr == S_OK, "ret %08x\n", hr ); + + hr = IXMLDOMDocument_get_documentElement(doc, &elem); + EXPECT_HR(hr, S_OK); + + hr = IXMLDOMElement_get_xml(elem, &str); + ok( hr == S_OK, "got 0x%08x\n", hr); + todo_wine ok( lstrcmpW(str, _bstr_("")) == 0, + "got %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + IXMLDOMElement_Release(elem); + IXMLDOMAttribute_Release( pAttribute); + } + + SysFreeString(str); + + IXMLDOMDocument_Release(doc); + + free_bstrs(); +} + static const char namespacesA[] = "" " " @@ -12219,6 +11127,9 @@ static void test_put_data(void) WCHAR buff[100], *data; IXMLDOMDocument *doc; DOMNodeType *type; + IXMLDOMText *text; + IXMLDOMNode *node; + VARIANT v; BSTR get_data; HRESULT hr; @@ -12233,9 +11144,6 @@ static void test_put_data(void) type = put_data_types; while (*type != NODE_INVALID) { - IXMLDOMNode *node; - VARIANT v; - V_VT(&v) = VT_I2; V_I2(&v) = *type; @@ -12247,8 +11155,6 @@ static void test_put_data(void) { case NODE_TEXT: { - IXMLDOMText *text; - hr = IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text); EXPECT_HR(hr, S_OK); hr = IXMLDOMText_put_data(text, data); @@ -12318,6 +11224,32 @@ static void test_put_data(void) type++; } + /* \r\n sequence is never escaped */ + V_VT(&v) = VT_I2; + V_I2(&v) = NODE_TEXT; + + hr = IXMLDOMDocument_createNode(doc, v, _bstr_("name"), NULL, &node); + ok(hr == S_OK, "got 0x%08x\n", hr); + + IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMText, (void**)&text); + + hr = IXMLDOMText_put_data(text, _bstr_("\r\n")); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IXMLDOMText_get_data(text, &get_data); + ok(hr == S_OK, "got 0x%08x\n", hr); +todo_wine + ok(!lstrcmpW(get_data, _bstr_("\n")), "got %s\n", wine_dbgstr_w(get_data)); + SysFreeString(get_data); + + hr = IXMLDOMText_get_xml(text, &get_data); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(!lstrcmpW(get_data, _bstr_("\r\n")), "got %s\n", wine_dbgstr_w(get_data)); + SysFreeString(get_data); + + IXMLDOMText_Release(text); + IXMLDOMNode_Release(node); + IXMLDOMDocument_Release(doc); free_bstrs(); } @@ -12502,6 +11434,47 @@ static void test_namedmap_newenum(void) IXMLDOMDocument_Release(doc); } +static const char xsltext_xsl[] = +"" +"" +"" +"" +" " +" " +" testdata" +" " +" " +"" +""; + +static void test_xsltext(void) +{ + IXMLDOMDocument *doc, *doc2; + VARIANT_BOOL b; + HRESULT hr; + BSTR ret; + + doc = create_document(&IID_IXMLDOMDocument); + if (!doc) return; + + doc2 = create_document(&IID_IXMLDOMDocument); + + hr = IXMLDOMDocument_loadXML(doc, _bstr_(xsltext_xsl), &b); + EXPECT_HR(hr, S_OK); + + hr = IXMLDOMDocument_loadXML(doc2, _bstr_(""), &b); + EXPECT_HR(hr, S_OK); + + hr = IXMLDOMDocument_transformNode(doc2, (IXMLDOMNode*)doc, &ret); + EXPECT_HR(hr, S_OK); + ok(!lstrcmpW(ret, _bstr_("testdata")), "transform result %s\n", wine_dbgstr_w(ret)); + SysFreeString(ret); + + IXMLDOMDocument_Release(doc2); + IXMLDOMDocument_Release(doc); + free_bstrs(); +} + START_TEST(domdoc) { IXMLDOMDocument *doc; @@ -12512,8 +11485,6 @@ START_TEST(domdoc) ok( hr == S_OK, "failed to init com\n"); if (hr != S_OK) return; - test_XMLHTTP(); - hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&doc ); if (hr != S_OK) { @@ -12552,7 +11523,7 @@ START_TEST(domdoc) test_nodeTypedValue(); test_TransformWithLoadingLocalFile(); test_put_nodeValue(); - test_document_IObjectSafety(); + test_IObjectSafety(); test_splitText(); test_getQualifiedItem(); test_removeQualifiedItem(); @@ -12585,8 +11556,10 @@ START_TEST(domdoc) test_put_data(); test_putref_schemas(); test_namedmap_newenum(); + test_xmlns_attribute(); test_xsltemplate(); + test_xsltext(); hr = CoCreateInstance(&CLSID_MXNamespaceManager40, NULL, CLSCTX_INPROC_SERVER, &IID_IMXNamespaceManager, (void**)&unk); diff --git a/rostests/winetests/msxml3/httpreq.c b/rostests/winetests/msxml3/httpreq.c new file mode 100644 index 00000000000..47a3c12ea87 --- /dev/null +++ b/rostests/winetests/msxml3/httpreq.c @@ -0,0 +1,1792 @@ +/* + * XML test + * + * Copyright 2010-2012 Nikolay Sivov for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#define CONST_VTABLE + +#include +#include + +//#include "windows.h" + +#include + +#include +#include +#include +//#include "msxml2.h" +//#include "msxml2did.h" +//#include "dispex.h" +#include +#include +#include + + +#define EXPECT_HR(hr,hr_exp) \ + ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp) + +#define EXPECT_REF(node,ref) _expect_ref((IUnknown*)node, ref, __LINE__) +static void _expect_ref(IUnknown* obj, ULONG ref, int line) +{ + ULONG rc = IUnknown_AddRef(obj); + IUnknown_Release(obj); + ok_(__FILE__,line)(rc-1 == ref, "expected refcount %d, got %d\n", ref, rc-1); +} + +DEFINE_GUID(SID_SContainerDispatch, 0xb722be00, 0x4e68, 0x101b, 0xa2, 0xbc, 0x00, 0xaa, 0x00, 0x40, 0x47, 0x70); +DEFINE_GUID(SID_UnknownSID, 0x75dd09cb, 0x6c40, 0x11d5, 0x85, 0x43, 0x00, 0xc0, 0x4f, 0xa0, 0xfb, 0xa3); + +#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + expect_ ## func = TRUE + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +/* object site */ +DEFINE_EXPECT(site_qi_IServiceProvider); +DEFINE_EXPECT(site_qi_IXMLDOMDocument); +DEFINE_EXPECT(site_qi_IOleClientSite); + +DEFINE_EXPECT(sp_queryservice_SID_SBindHost); +DEFINE_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2); +DEFINE_EXPECT(sp_queryservice_SID_secmgr_htmldoc2); +DEFINE_EXPECT(sp_queryservice_SID_secmgr_xmldomdoc); +DEFINE_EXPECT(sp_queryservice_SID_secmgr_secmgr); + +DEFINE_EXPECT(htmldoc2_get_all); +DEFINE_EXPECT(htmldoc2_get_url); +DEFINE_EXPECT(collection_get_length); + +static const char *debugstr_guid(REFIID riid) +{ + static char buf[50]; + + if(!riid) + return "(null)"; + + sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], + riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], + riid->Data4[5], riid->Data4[6], riid->Data4[7]); + + return buf; +} + +static int g_unexpectedcall, g_expectedcall; + +static BSTR alloc_str_from_narrow(const char *str) +{ + int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + BSTR ret = SysAllocStringLen(NULL, len - 1); /* NUL character added automatically */ + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len-1); + return ret; +} + +static BSTR alloced_bstrs[256]; +static int alloced_bstrs_count; + +static BSTR _bstr_(const char *str) +{ + if(!str) + return NULL; + + assert(alloced_bstrs_count < sizeof(alloced_bstrs)/sizeof(alloced_bstrs[0])); + alloced_bstrs[alloced_bstrs_count] = alloc_str_from_narrow(str); + return alloced_bstrs[alloced_bstrs_count++]; +} + +static void free_bstrs(void) +{ + int i; + for (i = 0; i < alloced_bstrs_count; i++) + SysFreeString(alloced_bstrs[i]); + alloced_bstrs_count = 0; +} + +static BSTR a2bstr(const char *str) +{ + BSTR ret; + int len; + + if(!str) + return NULL; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + ret = SysAllocStringLen(NULL, len); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + + return ret; +} + + +/* test IHTMLElementCollection */ +static HRESULT WINAPI htmlecoll_QueryInterface(IHTMLElementCollection *iface, REFIID riid, void **ppvObject) +{ + ok(0, "unexpected call\n"); + *ppvObject = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI htmlecoll_AddRef(IHTMLElementCollection *iface) +{ + return 2; +} + +static ULONG WINAPI htmlecoll_Release(IHTMLElementCollection *iface) +{ + return 1; +} + +static HRESULT WINAPI htmlecoll_GetTypeInfoCount(IHTMLElementCollection *iface, UINT *pctinfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_GetTypeInfo(IHTMLElementCollection *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_GetIDsOfNames(IHTMLElementCollection *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_Invoke(IHTMLElementCollection *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_toString(IHTMLElementCollection *iface, BSTR *String) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_put_length(IHTMLElementCollection *iface, LONG v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_get_length(IHTMLElementCollection *iface, LONG *v) +{ + CHECK_EXPECT2(collection_get_length); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_get__newEnum(IHTMLElementCollection *iface, IUnknown **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_item(IHTMLElementCollection *iface, VARIANT name, VARIANT index, IDispatch **pdisp) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmlecoll_tags(IHTMLElementCollection *iface, VARIANT tagName, IDispatch **pdisp) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IHTMLElementCollectionVtbl TestHTMLECollectionVtbl = { + htmlecoll_QueryInterface, + htmlecoll_AddRef, + htmlecoll_Release, + htmlecoll_GetTypeInfoCount, + htmlecoll_GetTypeInfo, + htmlecoll_GetIDsOfNames, + htmlecoll_Invoke, + htmlecoll_toString, + htmlecoll_put_length, + htmlecoll_get_length, + htmlecoll_get__newEnum, + htmlecoll_item, + htmlecoll_tags +}; + +static IHTMLElementCollection htmlecoll = { &TestHTMLECollectionVtbl }; + +/* test IHTMLDocument2 */ +static HRESULT WINAPI htmldoc2_QueryInterface(IHTMLDocument2 *iface, REFIID riid, void **ppvObject) +{ + trace("\n"); + *ppvObject = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI htmldoc2_AddRef(IHTMLDocument2 *iface) +{ + return 2; +} + +static ULONG WINAPI htmldoc2_Release(IHTMLDocument2 *iface) +{ + return 1; +} + +static HRESULT WINAPI htmldoc2_GetTypeInfoCount(IHTMLDocument2 *iface, UINT *pctinfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_GetTypeInfo(IHTMLDocument2 *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_GetIDsOfNames(IHTMLDocument2 *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_Invoke(IHTMLDocument2 *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_Script(IHTMLDocument2 *iface, IDispatch **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_all(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + CHECK_EXPECT2(htmldoc2_get_all); + *p = &htmlecoll; + return S_OK; +} + +static HRESULT WINAPI htmldoc2_get_body(IHTMLDocument2 *iface, IHTMLElement **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_activeElement(IHTMLDocument2 *iface, IHTMLElement **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_images(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_applets(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_links(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_forms(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_anchors(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_title(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_title(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_scripts(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_designMode(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_designMode(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_selection(IHTMLDocument2 *iface, IHTMLSelectionObject **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_readyState(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_frames(IHTMLDocument2 *iface, IHTMLFramesCollection2 **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_embeds(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_plugins(IHTMLDocument2 *iface, IHTMLElementCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_alinkColor(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_alinkColor(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_bgColor(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_bgColor(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_fgColor(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_fgColor(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_linkColor(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_linkColor(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_vlinkColor(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_vlinkColor(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_referrer(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_location(IHTMLDocument2 *iface, IHTMLLocation **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_lastModified(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_URL(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_URL(IHTMLDocument2 *iface, BSTR *p) +{ + CHECK_EXPECT2(htmldoc2_get_url); + *p = a2bstr("http://test.winehq.org/"); + return S_OK; +} + +static HRESULT WINAPI htmldoc2_put_domain(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_domain(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_cookie(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_cookie(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_expando(IHTMLDocument2 *iface, VARIANT_BOOL v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_expando(IHTMLDocument2 *iface, VARIANT_BOOL *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_charset(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_charset(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_defaultCharset(IHTMLDocument2 *iface, BSTR v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_defaultCharset(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_mimeType(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_fileSize(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_fileCreatedDate(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_fileModifiedDate(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_fileUpdatedDate(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_security(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_protocol(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_nameProp(IHTMLDocument2 *iface, BSTR *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_write(IHTMLDocument2 *iface, SAFEARRAY *psarray) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_writeln(IHTMLDocument2 *iface, SAFEARRAY *psarray) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_open(IHTMLDocument2 *iface, BSTR url, VARIANT name, + VARIANT features, VARIANT replace, IDispatch **pomWindowResult) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_close(IHTMLDocument2 *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_clear(IHTMLDocument2 *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_queryCommandSupported(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT_BOOL *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_queryCommandEnabled(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT_BOOL *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_queryCommandState(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT_BOOL *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_queryCommandIndeterm(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT_BOOL *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_queryCommandText(IHTMLDocument2 *iface, BSTR cmdID, + BSTR *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_queryCommandValue(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_execCommand(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT_BOOL showUI, VARIANT value, VARIANT_BOOL *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_execCommandShowHelp(IHTMLDocument2 *iface, BSTR cmdID, + VARIANT_BOOL *pfRet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_createElement(IHTMLDocument2 *iface, BSTR eTag, + IHTMLElement **newElem) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onhelp(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onhelp(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onclick(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onclick(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_ondblclick(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_ondblclick(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onkeyup(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onkeyup(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onkeydown(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onkeydown(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onkeypress(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onkeypress(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onmouseup(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onmouseup(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onmousedown(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onmousedown(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onmousemove(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onmousemove(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onmouseout(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onmouseout(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onmouseover(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onmouseover(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onreadystatechange(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onreadystatechange(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onafterupdate(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onafterupdate(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onrowexit(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onrowexit(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onrowenter(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onrowenter(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_ondragstart(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_ondragstart(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onselectstart(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onselectstart(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_elementFromPoint(IHTMLDocument2 *iface, LONG x, LONG y, + IHTMLElement **elementHit) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_parentWindow(IHTMLDocument2 *iface, IHTMLWindow2 **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_styleSheets(IHTMLDocument2 *iface, + IHTMLStyleSheetsCollection **p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onbeforeupdate(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onbeforeupdate(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_put_onerrorupdate(IHTMLDocument2 *iface, VARIANT v) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_get_onerrorupdate(IHTMLDocument2 *iface, VARIANT *p) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_toString(IHTMLDocument2 *iface, BSTR *String) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI htmldoc2_createStyleSheet(IHTMLDocument2 *iface, BSTR bstrHref, + LONG lIndex, IHTMLStyleSheet **ppnewStyleSheet) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IHTMLDocument2Vtbl TestHTMLDocumentVtbl = { + htmldoc2_QueryInterface, + htmldoc2_AddRef, + htmldoc2_Release, + htmldoc2_GetTypeInfoCount, + htmldoc2_GetTypeInfo, + htmldoc2_GetIDsOfNames, + htmldoc2_Invoke, + htmldoc2_get_Script, + htmldoc2_get_all, + htmldoc2_get_body, + htmldoc2_get_activeElement, + htmldoc2_get_images, + htmldoc2_get_applets, + htmldoc2_get_links, + htmldoc2_get_forms, + htmldoc2_get_anchors, + htmldoc2_put_title, + htmldoc2_get_title, + htmldoc2_get_scripts, + htmldoc2_put_designMode, + htmldoc2_get_designMode, + htmldoc2_get_selection, + htmldoc2_get_readyState, + htmldoc2_get_frames, + htmldoc2_get_embeds, + htmldoc2_get_plugins, + htmldoc2_put_alinkColor, + htmldoc2_get_alinkColor, + htmldoc2_put_bgColor, + htmldoc2_get_bgColor, + htmldoc2_put_fgColor, + htmldoc2_get_fgColor, + htmldoc2_put_linkColor, + htmldoc2_get_linkColor, + htmldoc2_put_vlinkColor, + htmldoc2_get_vlinkColor, + htmldoc2_get_referrer, + htmldoc2_get_location, + htmldoc2_get_lastModified, + htmldoc2_put_URL, + htmldoc2_get_URL, + htmldoc2_put_domain, + htmldoc2_get_domain, + htmldoc2_put_cookie, + htmldoc2_get_cookie, + htmldoc2_put_expando, + htmldoc2_get_expando, + htmldoc2_put_charset, + htmldoc2_get_charset, + htmldoc2_put_defaultCharset, + htmldoc2_get_defaultCharset, + htmldoc2_get_mimeType, + htmldoc2_get_fileSize, + htmldoc2_get_fileCreatedDate, + htmldoc2_get_fileModifiedDate, + htmldoc2_get_fileUpdatedDate, + htmldoc2_get_security, + htmldoc2_get_protocol, + htmldoc2_get_nameProp, + htmldoc2_write, + htmldoc2_writeln, + htmldoc2_open, + htmldoc2_close, + htmldoc2_clear, + htmldoc2_queryCommandSupported, + htmldoc2_queryCommandEnabled, + htmldoc2_queryCommandState, + htmldoc2_queryCommandIndeterm, + htmldoc2_queryCommandText, + htmldoc2_queryCommandValue, + htmldoc2_execCommand, + htmldoc2_execCommandShowHelp, + htmldoc2_createElement, + htmldoc2_put_onhelp, + htmldoc2_get_onhelp, + htmldoc2_put_onclick, + htmldoc2_get_onclick, + htmldoc2_put_ondblclick, + htmldoc2_get_ondblclick, + htmldoc2_put_onkeyup, + htmldoc2_get_onkeyup, + htmldoc2_put_onkeydown, + htmldoc2_get_onkeydown, + htmldoc2_put_onkeypress, + htmldoc2_get_onkeypress, + htmldoc2_put_onmouseup, + htmldoc2_get_onmouseup, + htmldoc2_put_onmousedown, + htmldoc2_get_onmousedown, + htmldoc2_put_onmousemove, + htmldoc2_get_onmousemove, + htmldoc2_put_onmouseout, + htmldoc2_get_onmouseout, + htmldoc2_put_onmouseover, + htmldoc2_get_onmouseover, + htmldoc2_put_onreadystatechange, + htmldoc2_get_onreadystatechange, + htmldoc2_put_onafterupdate, + htmldoc2_get_onafterupdate, + htmldoc2_put_onrowexit, + htmldoc2_get_onrowexit, + htmldoc2_put_onrowenter, + htmldoc2_get_onrowenter, + htmldoc2_put_ondragstart, + htmldoc2_get_ondragstart, + htmldoc2_put_onselectstart, + htmldoc2_get_onselectstart, + htmldoc2_elementFromPoint, + htmldoc2_get_parentWindow, + htmldoc2_get_styleSheets, + htmldoc2_put_onbeforeupdate, + htmldoc2_get_onbeforeupdate, + htmldoc2_put_onerrorupdate, + htmldoc2_get_onerrorupdate, + htmldoc2_toString, + htmldoc2_createStyleSheet +}; + +static IHTMLDocument2 htmldoc2 = { &TestHTMLDocumentVtbl }; + +static HRESULT WINAPI sp_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IServiceProvider)) + { + *ppvObject = iface; + IServiceProvider_AddRef(iface); + return S_OK; + } + + ok(0, "unexpected query interface: %s\n", debugstr_guid(riid)); + + return E_NOINTERFACE; +} + +static ULONG WINAPI sp_AddRef(IServiceProvider *iface) +{ + return 2; +} + +static ULONG WINAPI sp_Release(IServiceProvider *iface) +{ + return 1; +} + +static HRESULT WINAPI sp_QueryService(IServiceProvider *iface, REFGUID service, REFIID riid, void **obj) +{ + *obj = NULL; + + if (IsEqualGUID(service, &SID_SBindHost) && + IsEqualGUID(riid, &IID_IBindHost)) + { + CHECK_EXPECT2(sp_queryservice_SID_SBindHost); + } + else if (IsEqualGUID(service, &SID_SContainerDispatch) && + IsEqualGUID(riid, &IID_IHTMLDocument2)) + { + CHECK_EXPECT2(sp_queryservice_SID_SContainerDispatch_htmldoc2); + } + else if (IsEqualGUID(service, &SID_SInternetHostSecurityManager) && + IsEqualGUID(riid, &IID_IHTMLDocument2)) + { + CHECK_EXPECT2(sp_queryservice_SID_secmgr_htmldoc2); + *obj = &htmldoc2; + return S_OK; + } + else if (IsEqualGUID(service, &SID_SInternetHostSecurityManager) && + IsEqualGUID(riid, &IID_IXMLDOMDocument)) + { + CHECK_EXPECT2(sp_queryservice_SID_secmgr_xmldomdoc); + } + else if (IsEqualGUID(service, &SID_SInternetHostSecurityManager) && + IsEqualGUID(riid, &IID_IInternetHostSecurityManager)) + { + CHECK_EXPECT2(sp_queryservice_SID_secmgr_secmgr); + } + else if (IsEqualGUID(service, &SID_UnknownSID) && + IsEqualGUID(riid, &IID_IStream)) + { + /* FIXME: unidentified service id */ + } + else + ok(0, "unexpected request: sid %s, riid %s\n", debugstr_guid(service), debugstr_guid(riid)); + + return E_NOTIMPL; +} + +static const IServiceProviderVtbl testprovVtbl = +{ + sp_QueryInterface, + sp_AddRef, + sp_Release, + sp_QueryService +}; + +static IServiceProvider testprov = { &testprovVtbl }; + +static HRESULT WINAPI site_QueryInterface(IUnknown *iface, REFIID riid, void **ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualGUID(riid, &IID_IServiceProvider)) + CHECK_EXPECT2(site_qi_IServiceProvider); + + if (IsEqualGUID(riid, &IID_IXMLDOMDocument)) + CHECK_EXPECT2(site_qi_IXMLDOMDocument); + + if (IsEqualGUID(riid, &IID_IOleClientSite)) + CHECK_EXPECT2(site_qi_IOleClientSite); + + if (IsEqualGUID(riid, &IID_IUnknown)) + *ppvObject = iface; + else if (IsEqualGUID(riid, &IID_IServiceProvider)) + *ppvObject = &testprov; + + if (*ppvObject) IUnknown_AddRef(iface); + + return *ppvObject ? S_OK : E_NOINTERFACE; +} + +static ULONG WINAPI site_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI site_Release(IUnknown *iface) +{ + return 1; +} + +static const IUnknownVtbl testsiteVtbl = +{ + site_QueryInterface, + site_AddRef, + site_Release +}; + +static IUnknown testsite = { &testsiteVtbl }; + +typedef struct +{ + IDispatch IDispatch_iface; + LONG ref; +} dispevent; + +static IXMLHttpRequest *httpreq; + +static inline dispevent *impl_from_IDispatch( IDispatch *iface ) +{ + return CONTAINING_RECORD(iface, dispevent, IDispatch_iface); +} + +static HRESULT WINAPI dispevent_QueryInterface(IDispatch *iface, REFIID riid, void **ppvObject) +{ + *ppvObject = NULL; + + if ( IsEqualGUID( riid, &IID_IDispatch) || + IsEqualGUID( riid, &IID_IUnknown) ) + { + *ppvObject = iface; + } + else + return E_NOINTERFACE; + + IDispatch_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI dispevent_AddRef(IDispatch *iface) +{ + dispevent *This = impl_from_IDispatch( iface ); + return InterlockedIncrement( &This->ref ); +} + +static ULONG WINAPI dispevent_Release(IDispatch *iface) +{ + dispevent *This = impl_from_IDispatch( iface ); + ULONG ref = InterlockedDecrement( &This->ref ); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI dispevent_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo) +{ + g_unexpectedcall++; + *pctinfo = 0; + return S_OK; +} + +static HRESULT WINAPI dispevent_GetTypeInfo(IDispatch *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + g_unexpectedcall++; + return S_OK; +} + +static HRESULT WINAPI dispevent_GetIDsOfNames(IDispatch *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + g_unexpectedcall++; + return S_OK; +} + +static HRESULT WINAPI dispevent_Invoke(IDispatch *iface, DISPID member, REFIID riid, + LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *result, + EXCEPINFO *excepInfo, UINT *argErr) +{ + LONG state; + HRESULT hr; + + ok(member == 0, "expected 0 member, got %d\n", member); + ok(lcid == LOCALE_SYSTEM_DEFAULT, "expected LOCALE_SYSTEM_DEFAULT, got lcid %x\n", lcid); + ok(flags == DISPATCH_METHOD, "expected DISPATCH_METHOD, got %d\n", flags); + + ok(params->cArgs == 0, "got %d\n", params->cArgs); + ok(params->cNamedArgs == 0, "got %d\n", params->cNamedArgs); + ok(params->rgvarg == NULL, "got %p\n", params->rgvarg); + ok(params->rgdispidNamedArgs == NULL, "got %p\n", params->rgdispidNamedArgs); + + ok(result == NULL, "got %p\n", result); + ok(excepInfo == NULL, "got %p\n", excepInfo); + ok(argErr == NULL, "got %p\n", argErr); + + g_expectedcall++; + + state = READYSTATE_UNINITIALIZED; + hr = IXMLHttpRequest_get_readyState(httpreq, &state); + ok(hr == S_OK, "got 0x%08x\n", hr); + if (state == READYSTATE_COMPLETE) + { + BSTR text = NULL; + + hr = IXMLHttpRequest_get_responseText(httpreq, &text); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(*text != 0, "got %s\n", wine_dbgstr_w(text)); + SysFreeString(text); + } + + return E_FAIL; +} + +static const IDispatchVtbl dispeventVtbl = +{ + dispevent_QueryInterface, + dispevent_AddRef, + dispevent_Release, + dispevent_GetTypeInfoCount, + dispevent_GetTypeInfo, + dispevent_GetIDsOfNames, + dispevent_Invoke +}; + +static IDispatch* create_dispevent(void) +{ + dispevent *event = HeapAlloc(GetProcessHeap(), 0, sizeof(*event)); + + event->IDispatch_iface.lpVtbl = &dispeventVtbl; + event->ref = 1; + + return &event->IDispatch_iface; +} + +static IXMLHttpRequest *create_xhr(void) +{ + IXMLHttpRequest *ret; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLHttpRequest, (void**)&ret); + + return SUCCEEDED(hr) ? ret : NULL; +} + +static void set_safety_opt(IUnknown *unk, DWORD mask, DWORD opts) +{ + IObjectSafety *obj_safety; + HRESULT hr; + + hr = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&obj_safety); + ok(hr == S_OK, "Could not get IObjectSafety iface: %08x\n", hr); + + hr = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatch, mask, mask&opts); + ok(hr == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hr); + + IObjectSafety_Release(obj_safety); +} + +static void set_xhr_site(IXMLHttpRequest *xhr) +{ + IObjectWithSite *obj_site; + HRESULT hr; + + hr = IXMLHttpRequest_QueryInterface(xhr, &IID_IObjectWithSite, (void**)&obj_site); + ok(hr == S_OK, "Could not get IObjectWithSite iface: %08x\n", hr); + + SET_EXPECT(site_qi_IServiceProvider); + SET_EXPECT(sp_queryservice_SID_SBindHost); + SET_EXPECT(sp_queryservice_SID_SContainerDispatch_htmldoc2); + SET_EXPECT(sp_queryservice_SID_secmgr_htmldoc2); + SET_EXPECT(sp_queryservice_SID_secmgr_xmldomdoc); + SET_EXPECT(sp_queryservice_SID_secmgr_secmgr); + + /* calls to IHTMLDocument2 */ + SET_EXPECT(htmldoc2_get_all); + SET_EXPECT(collection_get_length); + SET_EXPECT(htmldoc2_get_url); + + SET_EXPECT(site_qi_IXMLDOMDocument); + SET_EXPECT(site_qi_IOleClientSite); + + hr = IObjectWithSite_SetSite(obj_site, &testsite); + EXPECT_HR(hr, S_OK); + + CHECK_CALLED(site_qi_IServiceProvider); +todo_wine + CHECK_CALLED(sp_queryservice_SID_SBindHost); + CHECK_CALLED(sp_queryservice_SID_SContainerDispatch_htmldoc2); +todo_wine { + CHECK_CALLED(sp_queryservice_SID_secmgr_htmldoc2); + CHECK_CALLED(sp_queryservice_SID_secmgr_xmldomdoc); + /* this one isn't very reliable + CHECK_CALLED(sp_queryservice_SID_secmgr_secmgr); */ + + CHECK_CALLED(htmldoc2_get_all); + CHECK_CALLED(collection_get_length); + CHECK_CALLED(htmldoc2_get_url); + + CHECK_CALLED(site_qi_IXMLDOMDocument); + CHECK_CALLED(site_qi_IOleClientSite); +} + + IObjectWithSite_Release(obj_site); +} + +#define test_open(a,b,c,d) _test_open(__LINE__,a,b,c,d) +static void _test_open(unsigned line, IXMLHttpRequest *xhr, const char *method, const char *url, HRESULT exhres) +{ + VARIANT empty, vfalse; + HRESULT hr; + + V_VT(&empty) = VT_EMPTY; + V_VT(&vfalse) = VT_BOOL; + V_BOOL(&vfalse) = VARIANT_FALSE; + + hr = IXMLHttpRequest_open(xhr, _bstr_(method), _bstr_(url), vfalse, empty, empty); + ok_(__FILE__,line)(hr == exhres, "open(%s %s) failed: %08x, expected %08x\n", method, url, hr, exhres); +} + +static void test_XMLHTTP(void) +{ + static const char bodyA[] = "mode=Test"; + static const char urlA[] = "http://crossover.codeweavers.com/posttest.php"; + static const char xmltestA[] = "http://crossover.codeweavers.com/xmltest.xml"; + static const WCHAR wszExpectedResponse[] = {'F','A','I','L','E','D',0}; + static const CHAR xmltestbodyA[] = "\nTEST\n"; + + IXMLHttpRequest *xhr; + IObjectWithSite *obj_site, *obj_site2; + BSTR bstrResponse, str, str1; + VARIANT varbody, varbody_ref; + VARIANT dummy; + LONG state, status, bound; + IDispatch *event; + void *ptr; + HRESULT hr; + HGLOBAL g; + + if (!winetest_interactive) + { + skip("test_XMLHTTP skipped, ROSTESTS-100\n"); + return; + } + + xhr = create_xhr(); + + VariantInit(&dummy); + V_VT(&dummy) = VT_ERROR; + V_ERROR(&dummy) = DISP_E_MEMBERNOTFOUND; + + hr = IXMLHttpRequest_put_onreadystatechange(xhr, NULL); + EXPECT_HR(hr, S_OK); + + hr = IXMLHttpRequest_abort(xhr); + EXPECT_HR(hr, S_OK); + + V_VT(&varbody) = VT_I2; + V_I2(&varbody) = 1; + hr = IXMLHttpRequest_get_responseBody(xhr, &varbody); + EXPECT_HR(hr, E_PENDING); + ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); + ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); + + V_VT(&varbody) = VT_I2; + V_I2(&varbody) = 1; + hr = IXMLHttpRequest_get_responseStream(xhr, &varbody); + EXPECT_HR(hr, E_PENDING); + ok(V_VT(&varbody) == VT_EMPTY, "got type %d\n", V_VT(&varbody)); + ok(V_I2(&varbody) == 1, "got %d\n", V_I2(&varbody)); + + /* send before open */ + hr = IXMLHttpRequest_send(xhr, dummy); + ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); + + /* initial status code */ + hr = IXMLHttpRequest_get_status(xhr, NULL); + ok(hr == E_POINTER || broken(hr == E_INVALIDARG) /* +//#include #include -#include "windows.h" -#include "ole2.h" -#include "msxml2.h" -#include "msxml2did.h" -#include "ocidl.h" -#include "dispex.h" +#include +//#include "windows.h" +#include +#include +#include +#include +//#include "ocidl.h" +#include -#include "wine/test.h" #define EXPECT_HR(hr,hr_exp) \ ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp) @@ -168,9 +173,11 @@ typedef enum _CH { CH_IGNORABLEWHITESPACE, CH_PROCESSINGINSTRUCTION, CH_SKIPPEDENTITY, + LH_STARTCDATA, + LH_ENDCDATA, EH_ERROR, EH_FATALERROR, - EG_IGNORABLEWARNING, + EH_IGNORABLEWARNING, EVENT_LAST } CH; @@ -187,6 +194,8 @@ static const char *event_names[EVENT_LAST] = { "ignorableWhitespace", "processingInstruction", "skippedEntity", + "startCDATA", + "endCDATA", "error", "fatalError", "ignorableWarning" @@ -410,6 +419,8 @@ static void ok_sequence_(struct call_sequence **seq, int sequence_index, case CH_PUTDOCUMENTLOCATOR: case CH_STARTDOCUMENT: case CH_ENDDOCUMENT: + case LH_STARTCDATA: + case LH_ENDCDATA: break; case CH_STARTPREFIXMAPPING: /* prefix, uri */ @@ -459,7 +470,7 @@ static void ok_sequence_(struct call_sequence **seq, int sequence_index, context, get_event_name(actual->id), expected->ret, actual->ret); break; case EH_ERROR: - case EG_IGNORABLEWARNING: + case EH_IGNORABLEWARNING: default: ok(0, "%s: callback not handled, %s\n", context, get_event_name(actual->id)); } @@ -570,6 +581,17 @@ static const char test_attributes[] = "" "\n"; +static const char test_cdata_xml[] = +"" +""; + +static const char test2_cdata_xml[] = +"" +""; + +static const char test3_cdata_xml[] = +""; + static struct call_entry content_handler_test1[] = { { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK }, { CH_STARTDOCUMENT, 0, 0, S_OK }, @@ -894,6 +916,94 @@ static struct call_entry attribute_norm_alt[] = { { CH_ENDTEST } }; +static struct call_entry cdata_test[] = { + { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK }, + { CH_STARTDOCUMENT, 0, 0, S_OK }, + { CH_STARTELEMENT, 1, 26, S_OK, "", "a", "a" }, + { LH_STARTCDATA, 1, 35, S_OK }, + { CH_CHARACTERS, 1, 35, S_OK, "Some \n" }, + { CH_CHARACTERS, 1, 42, S_OK, "text\n\n" }, + { CH_CHARACTERS, 1, 49, S_OK, "data\n\n" }, + { LH_ENDCDATA, 1, 49, S_OK }, + { CH_ENDELEMENT, 6, 6, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 0, 0, S_OK }, + { CH_ENDTEST } +}; + +static struct call_entry cdata_test2[] = { + { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK }, + { CH_STARTDOCUMENT, 0, 0, S_OK }, + { CH_STARTELEMENT, 1, 26, S_OK, "", "a", "a" }, + { LH_STARTCDATA, 1, 35, S_OK }, + { CH_CHARACTERS, 1, 35, S_OK, "\n\n" }, + { CH_CHARACTERS, 1, 38, S_OK, "Some \n" }, + { CH_CHARACTERS, 1, 45, S_OK, "text\n\n" }, + { CH_CHARACTERS, 1, 52, S_OK, "data\n\n" }, + { LH_ENDCDATA, 1, 52, S_OK }, + { CH_ENDELEMENT, 8, 6, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 0, 0, S_OK }, + { CH_ENDTEST } +}; + +static struct call_entry cdata_test3[] = { + { CH_PUTDOCUMENTLOCATOR, 0, 0, S_OK }, + { CH_STARTDOCUMENT, 0, 0, S_OK }, + { CH_STARTELEMENT, 1, 26, S_OK, "", "a", "a" }, + { LH_STARTCDATA, 1, 35, S_OK }, + { CH_CHARACTERS, 1, 35, S_OK, "Some text data" }, + { LH_ENDCDATA, 1, 35, S_OK }, + { CH_ENDELEMENT, 1, 54, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 0, 0, S_OK }, + { CH_ENDTEST } +}; + +/* this is what MSXML6 does */ +static struct call_entry cdata_test_alt[] = { + { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK }, + { CH_STARTDOCUMENT, 1, 22, S_OK }, + { CH_STARTELEMENT, 1, 25, S_OK, "", "a", "a" }, + { LH_STARTCDATA, 1, 34, S_OK }, + { CH_CHARACTERS, 1, 40, S_OK, "Some " }, + { CH_CHARACTERS, 2, 0, S_OK, "\n" }, + { CH_CHARACTERS, 3, 1, S_OK, "text\n" }, + { CH_CHARACTERS, 4, 0, S_OK, "\n" }, + { CH_CHARACTERS, 6, 3, S_OK, "data\n\n" }, + { LH_ENDCDATA, 6, 3, S_OK }, + { CH_ENDELEMENT, 6, 7, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 6, 7, S_OK }, + { CH_ENDTEST } +}; + +static struct call_entry cdata_test2_alt[] = { + { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK }, + { CH_STARTDOCUMENT, 1, 22, S_OK }, + { CH_STARTELEMENT, 1, 25, S_OK, "", "a", "a" }, + { LH_STARTCDATA, 1, 34, S_OK }, + { CH_CHARACTERS, 2, 1, S_OK, "\n" }, + { CH_CHARACTERS, 3, 0, S_OK, "\n" }, + { CH_CHARACTERS, 3, 6, S_OK, "Some " }, + { CH_CHARACTERS, 4, 0, S_OK, "\n" }, + { CH_CHARACTERS, 5, 1, S_OK, "text\n" }, + { CH_CHARACTERS, 6, 0, S_OK, "\n" }, + { CH_CHARACTERS, 8, 3, S_OK, "data\n\n" }, + { LH_ENDCDATA, 8, 3, S_OK }, + { CH_ENDELEMENT, 8, 7, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 8, 7, S_OK }, + { CH_ENDTEST } +}; + +static struct call_entry cdata_test3_alt[] = { + { CH_PUTDOCUMENTLOCATOR, 1, 0, S_OK }, + { CH_STARTDOCUMENT, 1, 22, S_OK }, + { CH_STARTELEMENT, 1, 25, S_OK, "", "a", "a" }, + { LH_STARTCDATA, 1, 34, S_OK }, + { CH_CHARACTERS, 1, 51, S_OK, "Some text data" }, + { LH_ENDCDATA, 1, 51, S_OK }, + { CH_ENDELEMENT, 1, 55, S_OK, "", "a", "a" }, + { CH_ENDDOCUMENT, 1, 55, S_OK }, + { CH_ENDTEST } +}; + static const char xmlspace_attr[] = "" " Some text data "; @@ -1191,6 +1301,7 @@ static HRESULT WINAPI contentHandler_skippedEntity( init_call_entry(locator, &call); call.id = CH_SKIPPEDENTITY; call.arg1W = SysAllocStringLen(name, len); + add_call(sequences, CONTENT_HANDLER_INDEX, &call); return get_expected_ret(); } @@ -1274,7 +1385,7 @@ static HRESULT WINAPI isaxerrorHandler_fatalError( return S_OK; } -static HRESULT WINAPI isaxerrorHanddler_ignorableWarning( +static HRESULT WINAPI isaxerrorHandler_ignorableWarning( ISAXErrorHandler* iface, ISAXLocator *pLocator, const WCHAR *pErrorMessage, @@ -1291,7 +1402,7 @@ static const ISAXErrorHandlerVtbl errorHandlerVtbl = isaxerrorHandler_Release, isaxerrorHandler_error, isaxerrorHandler_fatalError, - isaxerrorHanddler_ignorableWarning + isaxerrorHandler_ignorableWarning }; static ISAXErrorHandler errorHandler = { &errorHandlerVtbl }; @@ -1582,14 +1693,24 @@ static HRESULT WINAPI isaxlexical_endEntity(ISAXLexicalHandler *iface, static HRESULT WINAPI isaxlexical_startCDATA(ISAXLexicalHandler *iface) { - ok(0, "call not expected\n"); - return E_NOTIMPL; + struct call_entry call; + + init_call_entry(locator, &call); + call.id = LH_STARTCDATA; + add_call(sequences, CONTENT_HANDLER_INDEX, &call); + + return get_expected_ret(); } static HRESULT WINAPI isaxlexical_endCDATA(ISAXLexicalHandler *iface) { - ok(0, "call not expected\n"); - return E_NOTIMPL; + struct call_entry call; + + init_call_entry(locator, &call); + call.id = LH_ENDCDATA; + add_call(sequences, CONTENT_HANDLER_INDEX, &call); + + return get_expected_ret(); } static HRESULT WINAPI isaxlexical_comment(ISAXLexicalHandler *iface, @@ -1879,6 +2000,27 @@ static struct msxmlsupported_data_t reader_support_data[] = { NULL } }; +static struct saxlexicalhandler lexicalhandler; +static struct saxdeclhandler declhandler; + +static IStream *create_test_stream(const char *data, int len) +{ + ULARGE_INTEGER size; + LARGE_INTEGER pos; + IStream *stream; + ULONG written; + + if (len == -1) len = strlen(data); + CreateStreamOnHGlobal(NULL, TRUE, &stream); + size.QuadPart = len; + IStream_SetSize(stream, size); + IStream_Write(stream, data, len, &written); + pos.QuadPart = 0; + IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + + return stream; +} + static void test_saxreader(void) { const struct msxmlsupported_data_t *table = reader_support_data; @@ -1891,8 +2033,6 @@ static void test_saxreader(void) SAFEARRAYBOUND SADim[1]; char *ptr = NULL; IStream *stream; - ULARGE_INTEGER size; - LARGE_INTEGER pos; ULONG written; HANDLE file; static const CHAR testXmlA[] = "test.xml"; @@ -1903,6 +2043,7 @@ static void test_saxreader(void) while (table->clsid) { struct call_entry *test_seq; + ISAXEntityResolver *resolver; BSTR str; if (!is_clsid_supported(table->clsid, reader_support_data)) @@ -1985,12 +2126,7 @@ static void test_saxreader(void) SafeArrayDestroy(sa); - CreateStreamOnHGlobal(NULL, TRUE, &stream); - size.QuadPart = strlen(testXML); - IStream_SetSize(stream, size); - IStream_Write(stream, testXML, strlen(testXML), &written); - pos.QuadPart = 0; - IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + stream = create_test_stream(testXML, -1); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)stream; @@ -2001,12 +2137,7 @@ static void test_saxreader(void) IStream_Release(stream); - CreateStreamOnHGlobal(NULL, TRUE, &stream); - size.QuadPart = strlen(test_attributes); - IStream_SetSize(stream, size); - IStream_Write(stream, test_attributes, strlen(test_attributes), &written); - pos.QuadPart = 0; - IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + stream = create_test_stream(test_attributes, -1); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)stream; @@ -2144,12 +2275,7 @@ static void test_saxreader(void) hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespaces"), VARIANT_FALSE); EXPECT_HR(hr, S_OK); - CreateStreamOnHGlobal(NULL, TRUE, &stream); - size.QuadPart = strlen(test_attributes); - IStream_SetSize(stream, size); - IStream_Write(stream, test_attributes, strlen(test_attributes), &written); - pos.QuadPart = 0; - IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + stream = create_test_stream(test_attributes, -1); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)stream; @@ -2172,12 +2298,7 @@ static void test_saxreader(void) hr = ISAXXMLReader_putFeature(reader, _bstr_("http://xml.org/sax/features/namespace-prefixes"), VARIANT_FALSE); EXPECT_HR(hr, S_OK); - CreateStreamOnHGlobal(NULL, TRUE, &stream); - size.QuadPart = strlen(test_attributes); - IStream_SetSize(stream, size); - IStream_Write(stream, test_attributes, strlen(test_attributes), &written); - pos.QuadPart = 0; - IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + stream = create_test_stream(test_attributes, -1); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)stream; @@ -2198,12 +2319,7 @@ static void test_saxreader(void) EXPECT_HR(hr, S_OK); /* attribute normalization */ - CreateStreamOnHGlobal(NULL, TRUE, &stream); - size.QuadPart = strlen(attribute_normalize); - IStream_SetSize(stream, size); - IStream_Write(stream, attribute_normalize, strlen(attribute_normalize), &written); - pos.QuadPart = 0; - IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + stream = create_test_stream(attribute_normalize, -1); V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)stream; @@ -2220,6 +2336,70 @@ static void test_saxreader(void) EXPECT_HR(hr, S_OK); ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "attribute value normalization", TRUE); + resolver = (void*)0xdeadbeef; + hr = ISAXXMLReader_getEntityResolver(reader, &resolver); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(resolver == NULL, "got %p\n", resolver); + + hr = ISAXXMLReader_putEntityResolver(reader, NULL); + ok(hr == S_OK || broken(hr == E_FAIL), "got 0x%08x\n", hr); + + /* CDATA sections */ + init_saxlexicalhandler(&lexicalhandler, S_OK); + + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown*)&lexicalhandler.ISAXLexicalHandler_iface; + hr = ISAXXMLReader_putProperty(reader, _bstr_("http://xml.org/sax/properties/lexical-handler"), var); + ok(hr == S_OK, "got 0x%08x\n", hr); + + stream = create_test_stream(test_cdata_xml, -1); + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown*)stream; + + if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader60)) + test_seq = cdata_test_alt; + else + test_seq = cdata_test; + + set_expected_seq(test_seq); + hr = ISAXXMLReader_parse(reader, var); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "cdata test", TRUE); + + /* 2. CDATA sections */ + stream = create_test_stream(test2_cdata_xml, -1); + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown*)stream; + + if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader60)) + test_seq = cdata_test2_alt; + else + test_seq = cdata_test2; + + set_expected_seq(test_seq); + hr = ISAXXMLReader_parse(reader, var); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "cdata test 2", TRUE); + + IStream_Release(stream); + + /* 3. CDATA sections */ + stream = create_test_stream(test3_cdata_xml, -1); + V_VT(&var) = VT_UNKNOWN; + V_UNKNOWN(&var) = (IUnknown*)stream; + + if (IsEqualGUID(table->clsid, &CLSID_SAXXMLReader60)) + test_seq = cdata_test3_alt; + else + test_seq = cdata_test3; + + set_expected_seq(test_seq); + hr = ISAXXMLReader_parse(reader, var); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok_sequence(sequences, CONTENT_HANDLER_INDEX, test_seq, "cdata test 3", TRUE); + + IStream_Release(stream); + ISAXXMLReader_Release(reader); table++; } @@ -2233,9 +2413,6 @@ struct saxreader_props_test_t IUnknown *iface; }; -static struct saxlexicalhandler lexicalhandler; -static struct saxdeclhandler declhandler; - static const struct saxreader_props_test_t props_test_data[] = { { "http://xml.org/sax/properties/lexical-handler", (IUnknown*)&lexicalhandler.ISAXLexicalHandler_iface }, { "http://xml.org/sax/properties/declaration-handler", (IUnknown*)&declhandler.ISAXDeclHandler_iface }, diff --git a/rostests/winetests/msxml3/schema.c b/rostests/winetests/msxml3/schema.c index 5325d8da7da..e9299cda7e3 100644 --- a/rostests/winetests/msxml3/schema.c +++ b/rostests/winetests/msxml3/schema.c @@ -19,18 +19,26 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include #define COBJMACROS -#include "initguid.h" -#include "windows.h" -#include "ole2.h" -#include "msxml2.h" -#include "msxml2did.h" -#include "dispex.h" +#include -#include "wine/test.h" +#include +//#include "windows.h" +#include +#include +#include +#include +#include + + +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); #define EXPECT_HR(hr,hr_exp) \ ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp) @@ -1463,8 +1471,11 @@ static void test_obj_dispex(IUnknown *obj) static void test_dispex(void) { IXMLDOMSchemaCollection *cache; + IDispatchEx *dispex; IUnknown *unk; HRESULT hr; + DISPPARAMS dispparams; + VARIANT arg, ret; cache = create_cache(&IID_IXMLDOMSchemaCollection); if (!cache) return; @@ -1474,6 +1485,25 @@ static void test_dispex(void) test_obj_dispex(unk); IUnknown_Release(unk); + hr = IXMLDOMSchemaCollection_QueryInterface(cache, &IID_IDispatchEx, (void**)&dispex); + ok(hr == S_OK, "got 0x%08x\n", hr); + + V_VT(&arg) = VT_I4; + V_I4(&arg) = 0; + dispparams.cArgs = 1; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = &arg; + + V_VT(&ret) = VT_EMPTY; + V_DISPATCH(&ret) = (void*)0x1; + hr = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &ret, NULL, NULL); + ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08x\n", hr); + ok(V_VT(&ret) == VT_EMPTY, "got %d\n", V_VT(&ret)); + ok(V_DISPATCH(&ret) == (void*)0x1, "got %p\n", V_DISPATCH(&ret)); + + IDispatchEx_Release(dispex); + IXMLDOMSchemaCollection_Release(cache); } diff --git a/rostests/winetests/msxml3/testlist.c b/rostests/winetests/msxml3/testlist.c index 7ddd40fc095..ed54b4f2622 100644 --- a/rostests/winetests/msxml3/testlist.c +++ b/rostests/winetests/msxml3/testlist.c @@ -1,12 +1,10 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_domdoc(void); +extern void func_httpreq(void); extern void func_saxreader(void); extern void func_schema(void); extern void func_xmldoc(void); @@ -16,6 +14,7 @@ extern void func_xmlview(void); const struct test winetest_testlist[] = { { "domdoc", func_domdoc }, + { "httpreq", func_httpreq }, { "saxreader", func_saxreader }, { "schema", func_schema }, { "xmldoc", func_xmldoc }, diff --git a/rostests/winetests/msxml3/xmldoc.c b/rostests/winetests/msxml3/xmldoc.c index 7bf50626da0..834d02135dd 100644 --- a/rostests/winetests/msxml3/xmldoc.c +++ b/rostests/winetests/msxml3/xmldoc.c @@ -18,16 +18,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS -#include -#include "windows.h" -#include "ole2.h" -#include "msxml2.h" -#include "msxml2did.h" -#include "ocidl.h" +#include -#include "wine/test.h" +//#include +//#include "windows.h" +#include +#include +#include +#include +#include #define EXPECT_HR(hr,hr_exp) \ ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp) diff --git a/rostests/winetests/msxml3/xmlparser.c b/rostests/winetests/msxml3/xmlparser.c index 4bf80bbee92..74b999e43eb 100644 --- a/rostests/winetests/msxml3/xmlparser.c +++ b/rostests/winetests/msxml3/xmlparser.c @@ -17,21 +17,97 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE -#include -#include +//#include +//#include -#include "windows.h" -#include "ole2.h" -#include "xmlparser.h" -#include "wine/test.h" +#include + +//#include "windows.h" +#include +#include + +static HRESULT WINAPI nodefact_QueryInterface(IXMLNodeFactory *iface, + REFIID riid, void **ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualGUID(riid, &IID_IXMLNodeFactory) || + IsEqualGUID(riid, &IID_IUnknown)) + *ppvObject = iface; + else + return E_NOINTERFACE; + + return S_OK; +} + +static ULONG WINAPI nodefact_AddRef(IXMLNodeFactory *iface) +{ + return 2; +} + +static ULONG WINAPI nodefact_Release(IXMLNodeFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI nodefact_NotifyEvent(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, XML_NODEFACTORY_EVENT iEvt) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_BeginChildren(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, XML_NODE_INFO *pNodeInfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_EndChildren(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, BOOL fEmpty, XML_NODE_INFO *pNodeInfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_Error(IXMLNodeFactory *iface, + IXMLNodeSource *pSource, HRESULT hrErrorCode, USHORT cNumRecs, + XML_NODE_INFO **ppNodeInfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI nodefact_CreateNode(IXMLNodeFactory *iface, IXMLNodeSource *pSource, + PVOID pNodeParent, USHORT cNumRecs, XML_NODE_INFO **ppNodeInfo) +{ + return E_NOTIMPL; +} + +static const IXMLNodeFactoryVtbl nodefactoryVtbl = +{ + nodefact_QueryInterface, + nodefact_AddRef, + nodefact_Release, + nodefact_NotifyEvent, + nodefact_BeginChildren, + nodefact_EndChildren, + nodefact_Error, + nodefact_CreateNode +}; + +static IXMLNodeFactory thenodefactory = { &nodefactoryVtbl }; static void create_test(void) { HRESULT hr; IXMLParser *parser; + IXMLNodeFactory *nodefactory; DWORD flags; hr = CoCreateInstance(&CLSID_XMLParser30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLParser, (void**)&parser); @@ -50,6 +126,26 @@ static void create_test(void) flags = IXMLParser_GetFlags(parser); ok(flags == XMLFLAG_SAX, "Expected 0 got %d\n", flags); + hr = IXMLParser_GetFactory(parser, NULL); + ok(hr == E_INVALIDARG, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_GetFactory(parser, &nodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + ok(nodefactory == NULL, "expected NULL\n"); + + hr = IXMLParser_SetFactory(parser, &thenodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_GetFactory(parser, &nodefactory); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + ok(nodefactory == &thenodefactory, "expected NULL\n"); + + hr = IXMLParser_SetInput(parser, NULL); + ok(hr == E_INVALIDARG, "Expected S_OK got 0x%08x\n", hr); + + hr = IXMLParser_SetFactory(parser, NULL); + ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); + hr = IXMLParser_SetFlags(parser, 0); ok(hr == S_OK, "Expected S_OK got 0x%08x\n", hr); diff --git a/rostests/winetests/msxml3/xmlview.c b/rostests/winetests/msxml3/xmlview.c index eb660e4d769..1237d3e669c 100644 --- a/rostests/winetests/msxml3/xmlview.c +++ b/rostests/winetests/msxml3/xmlview.c @@ -15,23 +15,30 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE -#include -#include +//#include +//#include -#include "windows.h" -#include "ole2.h" -#include "mshtml.h" -#include "mshtmdid.h" -#include "initguid.h" -#include "perhist.h" -#include "docobj.h" -#include "urlmon.h" -#include "xmlparser.h" +#include -#include "wine/test.h" +//#include "windows.h" +#include +#include +#include +#include +#include +#include +#include +#include +//#include "urlmon.h" +#include HRESULT (WINAPI *pCreateURLMoniker)(IMoniker*, LPCWSTR, IMoniker**); @@ -123,9 +130,11 @@ static HRESULT WINAPI HTMLEvents_Invoke(IDispatch *iface, DISPID dispIdMember, R { if(dispIdMember == DISPID_HTMLDOCUMENTEVENTS2_ONREADYSTATECHANGE) { static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0}; + HRESULT hr; BSTR state; - IHTMLDocument2_get_readyState(html_doc, &state); + hr = IHTMLDocument2_get_readyState(html_doc, &state); + ok(hr == S_OK, "got 0x%08x\n", hr); if(!memcmp(state, completeW, sizeof(completeW))) loaded = TRUE; } From 3bbbee5d337de788f5761713560638d73d357cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Fri, 22 Mar 2013 16:32:11 +0000 Subject: [PATCH 50/74] [DDRAW] * Add CMakeLists.txt svn path=/trunk/; revision=58581 --- reactos/dll/directx/ddraw/CMakeLists.txt | 61 ++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 reactos/dll/directx/ddraw/CMakeLists.txt diff --git a/reactos/dll/directx/ddraw/CMakeLists.txt b/reactos/dll/directx/ddraw/CMakeLists.txt new file mode 100644 index 00000000000..1d69eee2381 --- /dev/null +++ b/reactos/dll/directx/ddraw/CMakeLists.txt @@ -0,0 +1,61 @@ + +spec2def(ddraw.dll ddraw.spec ADD_IMPORTLIB) + +list(APPEND SOURCE + cleanup.c + main.c + startup.c + Clipper/clipper_main.c + Clipper/clipper_stubs.c + Color/color_stubs.c + d3d/DirectD3D_main.c + Ddraw/callbacks_dd_hel.c + Ddraw/ddraw_displaymode.c + Ddraw/ddraw_main.c + Ddraw/ddraw_setcooperativelevel.c + Ddraw/ddraw_stubs.c + Ddraw/GetCaps.c + Ddraw/GetDeviceIdentifier.c + Gamma/gamma_stubs.c + Kernel/kernel_stubs.c + Palette/createpalette.c + Palette/palette.c + Surface/callbacks_surf_hel.c + Surface/createsurface.c + Surface/surface_main.c + Surface/surface_stubs.c + Videoport/videoport_stubs.c + Vtable/DirectD3D_Vtable.c + Vtable/DirectD3D2_Vtable.c + Vtable/DirectD3D3_Vtable.c + Vtable/DirectD3D7_Vtable.c + Vtable/DirectDraw_Vtable.c + Vtable/DirectDraw2_Vtable.c + Vtable/DirectDraw4_Vtable.c + Vtable/DirectDraw7_Vtable.c + Vtable/DirectDrawSurface_Vtable.c + Vtable/DirectDrawSurface2_Vtable.c + Vtable/DirectDrawSurface3_Vtable.c + Vtable/DirectDrawSurface4_Vtable.c + Vtable/DirectDrawSurface7_Vtable.c +) + +add_library(ddraw SHARED ${SOURCE}) + +set_module_type(ddraw win32dll) + +target_link_libraries(ddraw + uuid + dxguid + ${PSEH_LIB} +) + +add_importlibs(ddraw + advapi32 + gdi32 + user32 + msvcrt + kernel32 + ntdll) + +add_cd_file(TARGET ddraw DESTINATION reactos/system32 FOR all) \ No newline at end of file From 8886eb989eae5dca9b1ca1e8275d93ddb848c7ce Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 23 Mar 2013 05:10:18 +0000 Subject: [PATCH 51/74] [LIBSAMPLERATE] Fix redefinition of 'lrint' / 'lrintf'. svn path=/trunk/; revision=58582 --- reactos/lib/3rdparty/libsamplerate/config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/3rdparty/libsamplerate/config.h b/reactos/lib/3rdparty/libsamplerate/config.h index 0a9f06c6984..8f7fd4f9689 100644 --- a/reactos/lib/3rdparty/libsamplerate/config.h +++ b/reactos/lib/3rdparty/libsamplerate/config.h @@ -96,10 +96,10 @@ /* #undef HAVE_LIBM */ /* Define if you have C99's lrint function. */ -/* #undef HAVE_LRINT */ +#define HAVE_LRINT 1 /* Define if you have C99's lrintf function. */ -/* #undef HAVE_LRINTF */ +#define HAVE_LRINTF 1 /* Define to 1 if you have the `malloc' function. */ #define HAVE_MALLOC 1 From 6dac8c3e7dbc2aa7b426b1847ef032b34dc97279 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 23 Mar 2013 05:11:52 +0000 Subject: [PATCH 52/74] [TRANSLATION] Update/add translations: - German by Zehnvor (CORE-6804); - Italian by Ivan Di Francesco (CORE-6911); - Chinese by Yu Pan (CORE-7000); - Turkish by Erdem Ersoy (CORE-7011, CORE-7014). svn path=/trunk/; revision=58583 --- .../applications/cmdutils/doskey/doskey.rc | 15 +- .../cmdutils/doskey/lang/it-IT.rc | 27 ++ .../base/applications/dxdiag/lang/it-IT.rc | 226 +++++++++++++++ reactos/base/applications/dxdiag/rsrc.rc | 19 +- .../base/applications/fontview/fontview.rc | 3 + .../base/applications/fontview/lang/it-IT.rc | 13 + .../games/solitaire/lang/tr-TR.rc | 2 +- .../applications/games/spider/lang/tr-TR.rc | 2 +- .../applications/games/winmine/lang/tr-TR.rc | 2 +- .../base/applications/magnify/lang/tr-TR.rc | 72 +++++ reactos/base/applications/magnify/rsrc.rc | 3 + .../base/applications/mplay32/lang/tr-TR.rc | 30 ++ reactos/base/applications/mplay32/rsrc.rc | 3 + .../base/applications/mspaint/lang/tr-TR.rc | 206 ++++++++++++++ reactos/base/applications/mspaint/rsrc.rc | 3 + .../network/wlanconf/lang/de-DE.rc | 41 +++ .../network/wlanconf/lang/it-IT.rc | 40 +++ .../applications/network/wlanconf/wlanconf.rc | 10 +- .../base/applications/notepad/lang/tr-TR.rc | 127 +++++---- .../base/applications/regedit/lang/it-IT.rc | 117 ++++---- reactos/base/applications/regedit/rsrc.rc | 1 + .../base/applications/shutdown/lang/it-IT.rc | 132 ++++----- .../base/applications/sndrec32/lang/tr-TR.rc | 54 ++++ reactos/base/applications/sndrec32/rsrc.rc | 7 +- reactos/base/applications/wordpad/Tr.rc | 263 +++++++++++++----- reactos/base/applications/wordpad/rsrc.rc | 6 +- reactos/base/applications/write/Tr.rc | 28 ++ reactos/base/applications/write/rsrc.rc | 3 + reactos/win32ss/user/user32/lang/en-US.rc | 2 +- reactos/win32ss/user/user32/lang/zh-CN.rc | 75 +++++ reactos/win32ss/user/user32/user32.rc | 9 +- 31 files changed, 1261 insertions(+), 280 deletions(-) create mode 100644 reactos/base/applications/cmdutils/doskey/lang/it-IT.rc create mode 100644 reactos/base/applications/dxdiag/lang/it-IT.rc create mode 100644 reactos/base/applications/fontview/lang/it-IT.rc create mode 100644 reactos/base/applications/magnify/lang/tr-TR.rc create mode 100644 reactos/base/applications/mplay32/lang/tr-TR.rc create mode 100644 reactos/base/applications/mspaint/lang/tr-TR.rc create mode 100644 reactos/base/applications/network/wlanconf/lang/de-DE.rc create mode 100644 reactos/base/applications/network/wlanconf/lang/it-IT.rc create mode 100644 reactos/base/applications/sndrec32/lang/tr-TR.rc create mode 100644 reactos/base/applications/write/Tr.rc create mode 100644 reactos/win32ss/user/user32/lang/zh-CN.rc diff --git a/reactos/base/applications/cmdutils/doskey/doskey.rc b/reactos/base/applications/cmdutils/doskey/doskey.rc index ca48da26319..d5a85f38b80 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.rc +++ b/reactos/base/applications/cmdutils/doskey/doskey.rc @@ -18,6 +18,15 @@ #ifdef LANGUAGE_EN_US #include "lang/en-US.rc" #endif +#ifdef LANGUAGE_ES_ES + #include "lang/es-ES.rc" +#endif +#ifdef LANGUAGE_FR_FR + #include "lang/fr-FR.rc" +#endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif @@ -33,9 +42,3 @@ #ifdef LANGUAGE_ZH_CN #include "lang/zh-CN.rc" #endif -#ifdef LANGUAGE_FR_FR - #include "lang/fr-FR.rc" -#endif -#ifdef LANGUAGE_ES_ES - #include "lang/es-ES.rc" -#endif diff --git a/reactos/base/applications/cmdutils/doskey/lang/it-IT.rc b/reactos/base/applications/cmdutils/doskey/lang/it-IT.rc new file mode 100644 index 00000000000..f170fb20e32 --- /dev/null +++ b/reactos/base/applications/cmdutils/doskey/lang/it-IT.rc @@ -0,0 +1,27 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Gestisce le impostazioni della riga di comando di editing, la cronologia e le macro.\n\ +\n\ +DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ + [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ +\n\ + /INSERT Attiva la modalità di inserimento.\n\ + /OVERSTRIKE Disattiva la modalità di inserimento.\n\ + /EXENAME=exename Consente di impostare il nome del programma per visualizzare/cambiare la cronologia\n\ + e le macro. Il valore predefinito è cmd.exe.\n\ + /HISTORY Consente di visualizzare la cronologia dei comandi.\n\ + /LISTSIZE=size Imposta il numero di comandi al buffer storico.\n\ + /REINSTALL Cancella la cronologia dei comandi.\n\ + /MACROS Consente di visualizzare le definizioni delle macro.\n\ + /MACROS:exename Visualizza le definizioni di macro per un programma specifico.\n\ + /MACROS:ALL Visualizza le definizioni macro per tutti i programmi.\n\ + /MACROFILE=file Carica le definizioni di macro da un file.\n\ + macroname Specifica il nome di una macro per creare.\n\ + text Consente di specificare il testo di sostituzione per la macro.\n" + +IDS_INVALID_MACRO_DEF, "Definizion macro non valida: %s\n" + +END diff --git a/reactos/base/applications/dxdiag/lang/it-IT.rc b/reactos/base/applications/dxdiag/lang/it-IT.rc new file mode 100644 index 00000000000..b476598d74c --- /dev/null +++ b/reactos/base/applications/dxdiag/lang/it-IT.rc @@ -0,0 +1,226 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +IDD_MAIN_DIALOG DIALOGEX DISCARDABLE 0, 0, 478, 280 +STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "Programma di diagnostica ReactX" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "Tab1",IDC_TAB_CONTROL,"SysTabControl32",WS_TABSTOP,2,2,474,250 + PUSHBUTTON "&Aiuto", IDC_BUTTON_HELP, 2, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + DEFPUSHBUTTON "&Prossima pagina", IDC_BUTTON_NEXT, 257, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Salva tutte le informazioni...", IDC_BUTTON_SAVE_INFO, 311, 261, 110, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&uSCITA", IDC_BUTTON_EXIT, 425, 261, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +IDD_SYSTEM_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Questo strumento riporta informazioni dettagliate sui componenti ReactX e dei driver installati sul sistema.", -1, 10, 10, 443, 17 + LTEXT "Se si sa quale zona è la causa del problema, fare clic sopra la scheda appropriata. In caso contrario, è possibile utilizzare il tasto Pagina successiva qui sotto per visitare ogni pagina in sequenza.", -1, 10, 30, 443, 25 + GROUPBOX "Informazioni di sistema", -1, 10, 55, 443, 130, SS_RIGHT + LTEXT "Data/Ora:", -1, 70, 70, 80, 10, SS_RIGHT + LTEXT "Nome del computer:", -1, 70, 80, 80, 10, SS_RIGHT + LTEXT "Sistema operativo:", -1, 70, 90, 80, 10, SS_RIGHT + LTEXT "Lingua:", -1, 70, 100, 80, 10, SS_RIGHT + LTEXT "Produttore DI sistema:", -1, 70, 110, 80, 10, SS_RIGHT + LTEXT "Modello di Sistem :", -1, 70, 120, 80, 10, SS_RIGHT + LTEXT "BIOS:", -1, 70, 130, 80, 10, SS_RIGHT + LTEXT "Processore:", -1, 70, 140, 80, 10, SS_RIGHT + LTEXT "Memoria:", -1, 70, 150, 80, 10, SS_RIGHT + LTEXT "Page file:", -1, 70, 160, 80, 10, SS_RIGHT + LTEXT "ReactX-Version:", -1, 70, 170, 80, 10, SS_RIGHT + LTEXT "", IDC_STATIC_TIME, 155, 70, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_COMPUTER, 155, 80, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_OS, 155, 90, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_LANG, 155, 100, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MANU, 155, 110, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MODEL, 155, 120, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_BIOS, 155, 130, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_PROC, 155, 140, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_MEM, 155, 150, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_SWAP, 155, 160, 195, 10, SS_LEFT + LTEXT "", IDC_STATIC_VERSION, 155, 170, 195, 10, SS_LEFT +END + +IDD_DISPLAY_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Device", -1, 10, 10, 250, 100 + RTEXT "Nome:", -1, 20, 25, 70, 10 + RTEXT "Fabbricante:", -1, 20, 35, 70, 10 + RTEXT "Chip Type:", -1, 20, 45, 70, 10 + RTEXT "DAC Type:", -1, 20, 55, 70, 10 + RTEXT "Totale memnoria (Approssimativo):", -1, 20, 65, 70, 10 + RTEXT "Modalità di visualizzazione corrente:", -1, 20, 75, 70, 10 + RTEXT "Monitor:", -1, 20, 85, 70, 10 + LTEXT "", IDC_STATIC_ADAPTER_ID, 95, 25, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_VENDOR, 95, 35, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_CHIP, 95, 45, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_DAC, 95, 55, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MEM, 95, 65, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MODE, 95, 75, 150, 10 + LTEXT "", IDC_STATIC_ADAPTER_MONITOR, 95, 85, 150, 10 + + GROUPBOX "Driver", -1, 270, 10, 190, 100 + RTEXT "Driver Principale:", -1, 275, 25, 55, 10 + RTEXT "Versione:", -1, 275, 35, 55, 10 + RTEXT "Data:", -1, 275, 45, 55, 10 + RTEXT "WHQL-Logo:", -1, 275, 55, 55, 10 + RTEXT "Mini-VDD:", -1, 275, 65, 55, 10 + RTEXT " vvdddVDD:", -1, 275, 75, 55, 10 + RTEXT "DDI Version:", -1, 275, 85, 55, 10 + LTEXT "", IDC_STATIC_ADAPTER_DRIVER, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_VERSION, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_DATE, 335, 45, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_LOGO, 335, 55, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_MINIVDD, 335, 65, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_VDD, 335, 75, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_DDI, 335, 85, 100, 10 + + GROUPBOX "ReactX-Features", -1, 10, 115, 450, 60 + RTEXT "Accelerazione DirectDraw:", -1, 15, 130, 110, 12 + RTEXT "Accelerazione Direct3D:", -1, 15, 145, 110, 12 + RTEXT "AGP Texture Acceleration:", -1, 15, 160, 110, 12 + LTEXT "", IDC_STATIC_DDSTATE, 130, 130, 40, 10 + LTEXT "", IDC_STATIC_D3DSTATE, 130, 145, 40, 10 + LTEXT "", IDC_STATIC_AGPSTATE, 130, 160, 40, 10 + PUSHBUTTON "Abilita", IDC_BUTTON_DDRAW, 170, 124, 60, 14, WS_DISABLED + PUSHBUTTON "Abilita", IDC_BUTTON_D3D, 170, 140, 60, 14, WS_DISABLED + PUSHBUTTON "Abilita", IDC_BUTTON_AGP, 170, 156, 60, 14, WS_DISABLED + PUSHBUTTON "Test DirectDraw", IDC_BUTTON_TESTDD, 250, 124, 80, 14 + PUSHBUTTON "Test Direct3D", IDC_BUTTON_TEST3D, 250, 140, 80, 14 + + GROUPBOX "Notes", -1, 10, 180, 450, 40 + EDITTEXT IDC_TEXT_INFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP +END + + +IDD_SOUND_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Device", -1, 10, 10, 250, 100 + RTEXT "Nome:", -1, 20, 25, 70, 10 + RTEXT "Device ID:", -1, 20, 35, 70, 10 + RTEXT "Manufacturer ID:", -1, 20, 45, 70, 10 + RTEXT "Product ID:", -1, 20, 55, 70, 10 + RTEXT "Tipo:", -1, 20, 65, 70, 10 + RTEXT "Default Device:", -1, 20, 75, 70, 10 + LTEXT "", IDC_STATIC_DSOUND_NAME, 95, 25, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_DEVICEID, 95, 35, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_VENDORID, 95, 45, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_PRODUCTID, 95, 55, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_TYPE, 95, 65, 150, 10 + LTEXT "", IDC_STATIC_DSOUND_STANDARD, 95, 75, 150, 10 + GROUPBOX "Driver", -1, 270, 10, 190, 100 + RTEXT "Nome:", -1, 275, 25, 55, 10 + RTEXT "Versione:", -1, 275, 35, 55, 10 + RTEXT "Data:", -1, 275, 45, 55, 10 + RTEXT "WHQL-Logo:", -1, 275, 55, 55, 10 + RTEXT "Altri Files:", -1, 275, 65, 55, 10 + RTEXT "Provider:", -1, 275, 75, 55, 10 + LTEXT "", IDC_STATIC_DSOUND_DRIVER, 335, 25, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_VERSION, 335, 35, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_DATE, 335, 45, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_LOGO, 335, 55, 100, 10 + LTEXT "", IDC_STATIC_DSOUND_FILES, 335, 65, 100, 10 + LTEXT "", IDC_STATIC_ADAPTER_PROVIDER, 335, 75, 100, 10 + GROUPBOX "ReactX-Features", -1, 10, 115, 450, 60 + CONTROL "", IDC_SLIDER_DSOUND, "msctls_trackbar32", TBS_BOTTOM | TBS_AUTOTICKS | WS_TABSTOP, 120, 135, 80, 17 + RTEXT "Hardware Sound\nAcceleration Level:", -1, 20, 135, 90, 20 + PUSHBUTTON "Test DirectSound", IDC_BUTTON_TESTDSOUND, 270, 134, 80, 14 + GROUPBOX "Note", -1, 10, 180, 450, 40 + EDITTEXT IDC_TEXT_DSOUNDINFO, 20, 192, 432, 20, WS_DISABLED | WS_TABSTOP +END + +IDD_MUSIC_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN +END + + +IDD_INPUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "DirectInput Devices", -1, 10, 10, 452, 80 + CONTROL "", IDC_LIST_DEVICE, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 + GROUPBOX "Input Devices", -1, 10, 100, 452, 60 + CONTROL "", IDC_TREE_PORT, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 112, 432, 40, 0x00000200 + GROUPBOX "Informazioni", -1, 10, 170, 452, 50 + EDITTEXT IDC_RICH_INFO, 20, 182, 432, 30, WS_DISABLED | WS_TABSTOP +END + +IDD_NETWORK_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Registered DirectPlay Service Provider", -1, 10, 10, 452, 80 + CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 +END + +IDD_HELP_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 +STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg" +BEGIN +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_MAIN_DIALOG "Tool di diagnostica ReactX" + IDS_SYSTEM_DIALOG "Sistema" + IDS_DISPLAY_DIALOG "Display" + IDS_SOUND_DIALOG "Suoni" + IDS_MUSIC_DIALOG "Musica" + IDS_INPUT_DIALOG "Input" + IDS_NETWORK_DIALOG "Network" + IDS_HELP_DIALOG "Aiuto" + IDS_FORMAT_MB "%I64uMB RAM" + IDS_FORMAT_SWAP "%I64u MB utilizzata, %I64u MB avviabile" + IDS_FORMAT_UNIPROC "%s (%u CPU)" + IDS_FORMAT_MPPROC "%s (%u CPUs)" + IDS_VERSION_UNKNOWN "Versione Sconosciuta" + IDS_DEVICE_STATUS_ATTACHED "Connesso" + IDS_DEVICE_STATUS_MISSING "Disconnesso" + IDS_DEVICE_STATUS_UNKNOWN "Sconosciuto" + IDS_DEVICE_NAME "Nome Device" + IDS_DEVICE_STATUS "Stato" + IDS_DEVICE_CONTROLLER "Controller ID" + IDS_DEVICE_MANUFACTURER "Manufacturer ID" + IDS_DEVICE_PRODUCT "Product ID" + IDS_DEVICE_FORCEFEEDBACK "Forza Feedback-Driver" + IDS_NOT_APPLICABLE "Non applicabile" + IDS_OPTION_YES "Si" + IDS_DIRECTPLAY_COL_NAME1 "Nome" + IDS_DIRECTPLAY_COL_NAME2 "Registro" + IDS_DIRECTPLAY_COL_NAME3 "File" + IDS_DIRECTPLAY_COL_NAME4 "Versione" + IDS_DIRECTPLAY8_MODEMSP "DirectPlay8-Modem Service Provider" + IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 Serial Service Provider" + IDS_DIRECTPLAY8_IPXSP "DirectPlay8 IPX Service Provider" + IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP Service Provider" + IDS_DIRECTPLAY_TCPCONN "Connessione Internet TCP/IP per DirectPlay" + IDS_DIRECTPLAY_IPXCONN "Connessione IPX per DirectPlay" + IDS_DIRECTPLAY_MODEMCONN "Connessione Modem per DirectPlay" + IDS_DIRECTPLAY_SERIALCONN "Connessione seriale per DirectPlay" + IDS_REG_SUCCESS "OK" + IDS_REG_FAIL "Errore" + IDS_DDTEST_ERROR "Test fallito!" + IDS_DDTEST_DESCRIPTION "Questo avvierà il controllo dell'interfaccia DirectDraw. Continuare?" + IDS_DDPRIMARY_DESCRIPTION "Questo test utilizza DirectDraw per disegnare sulla superficie primaria. Rettangoli in bianco e nero devono essere compilati. Continuare?" + IDS_DDPRIMARY_RESULT "Hai visto rettangoli bianchi e neri?" + IDS_DDOFFSCREEN_DESCRIPTION "Questo test utilizza DirectDraw per disegnare buffer fuori schermo. Spostameni rettangolo bianco devono essere compilati. Continuare?" + IDS_DDOFFSCREEN_RESULT "Hai visto il rettangolo bianco muoversi?" + IDS_DDFULLSCREEN_DESCRIPTION "Questo test utilizza DirectDraw per disegnare in una modalità schermo intero. I Spostamenti del rettangolo bianco devono essere compilati. Continuare?" + IDS_DDFULLSCREEN_RESULT "Hai visto un rettangolo bianco in movimento in modalità schermo intero?" + IDS_FORMAT_ADAPTER_MEM "%u MB" + IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u bit)(%uHz)" + IDS_OPTION_NO "No" + IDS_D3DTEST_DESCRIPTION "Avviare il test dell'interfaccia Direct3D. Continuare?" + IDS_D3DTEST_D3Dx "Questo test utilizza accelerazione hardware dell'interfaccia Direct3D % u." +END \ No newline at end of file diff --git a/reactos/base/applications/dxdiag/rsrc.rc b/reactos/base/applications/dxdiag/rsrc.rc index bb5f17f179c..7bbc648a36d 100644 --- a/reactos/base/applications/dxdiag/rsrc.rc +++ b/reactos/base/applications/dxdiag/rsrc.rc @@ -22,6 +22,9 @@ #ifdef LANGUAGE_HE_IL #include "lang/he-IL.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_JA_JP #include "lang/ja-JP.rc" #endif @@ -34,12 +37,6 @@ #ifdef LANGUAGE_NB_NO #include "lang/no-NO.rc" #endif -#ifdef LANGUAGE_SK_SK - #include "lang/sk-SK.rc" -#endif -#ifdef LANGUAGE_SV_SE - #include "lang/sv-SE.rc" -#endif #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif @@ -52,12 +49,18 @@ #ifdef LANGUAGE_RU_RU #include "lang/ru-RU.rc" #endif -#ifdef LANGUAGE_UK_UA - #include "lang/uk-UA.rc" +#ifdef LANGUAGE_SK_SK + #include "lang/sk-SK.rc" +#endif +#ifdef LANGUAGE_SV_SE + #include "lang/sv-SE.rc" #endif #ifdef LANGUAGE_TR_TR #include "lang/tr-TR.rc" #endif +#ifdef LANGUAGE_UK_UA + #include "lang/uk-UA.rc" +#endif #ifdef LANGUAGE_ZH_CN #include "lang/zh-CN.rc" #endif diff --git a/reactos/base/applications/fontview/fontview.rc b/reactos/base/applications/fontview/fontview.rc index 797e3cef18e..315e51861fb 100644 --- a/reactos/base/applications/fontview/fontview.rc +++ b/reactos/base/applications/fontview/fontview.rc @@ -39,6 +39,9 @@ END #ifdef LANGUAGE_HE_IL #include "lang/he-IL.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_LT_LT #include "lang/lt-LT.rc" #endif diff --git a/reactos/base/applications/fontview/lang/it-IT.rc b/reactos/base/applications/fontview/lang/it-IT.rc new file mode 100644 index 00000000000..948f3982197 --- /dev/null +++ b/reactos/base/applications/fontview/lang/it-IT.rc @@ -0,0 +1,13 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + IDS_INSTALL, "Installa" + IDS_PRINT, "Stampa" + IDS_STRING, "" + IDS_OPEN, "Open Font..." + IDS_ERROR, "Errore" + IDS_ERROR_NOMEM, "Memoria insufficiente per completare l'operazione." + IDS_ERROR_NOFONT, "Il file% 1 non è un file di origine valido." + IDS_ERROR_NOCLASS, "Impossibile avviare la classe." +END diff --git a/reactos/base/applications/games/solitaire/lang/tr-TR.rc b/reactos/base/applications/games/solitaire/lang/tr-TR.rc index 8029aff7726..d4ff3c7a838 100644 --- a/reactos/base/applications/games/solitaire/lang/tr-TR.rc +++ b/reactos/base/applications/games/solitaire/lang/tr-TR.rc @@ -78,7 +78,7 @@ BEGIN END POPUP "&Yardım" BEGIN - MENUITEM "&İçerik\tF1", IDM_HELP_CONTENTS + MENUITEM "&Yardım Konuları\tF1", IDM_HELP_CONTENTS MENUITEM "&Hakkında", IDM_HELP_ABOUT END END diff --git a/reactos/base/applications/games/spider/lang/tr-TR.rc b/reactos/base/applications/games/spider/lang/tr-TR.rc index 9b14a2ae32b..2e7e0e8a5cd 100644 --- a/reactos/base/applications/games/spider/lang/tr-TR.rc +++ b/reactos/base/applications/games/spider/lang/tr-TR.rc @@ -70,7 +70,7 @@ BEGIN END POPUP "&Yardım" BEGIN - MENUITEM "&İçerik\tF1", IDM_HELP_CONTENTS + MENUITEM "&Yardım Konuları\tF1", IDM_HELP_CONTENTS MENUITEM "&Hakkında", IDM_HELP_ABOUT END END diff --git a/reactos/base/applications/games/winmine/lang/tr-TR.rc b/reactos/base/applications/games/winmine/lang/tr-TR.rc index 3c2dcad1ffa..add68d5581c 100644 --- a/reactos/base/applications/games/winmine/lang/tr-TR.rc +++ b/reactos/base/applications/games/winmine/lang/tr-TR.rc @@ -23,7 +23,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE BEGIN - IDS_APPNAME, "Wine Mayın Tarlası" + IDS_APPNAME, "Mayın Tarlası" IDS_NOBODY, "Hiç kimse" IDS_ABOUT, "Telif hakkı: Joshua Thielen, 2000" END diff --git a/reactos/base/applications/magnify/lang/tr-TR.rc b/reactos/base/applications/magnify/lang/tr-TR.rc new file mode 100644 index 00000000000..adf5f3bf874 --- /dev/null +++ b/reactos/base/applications/magnify/lang/tr-TR.rc @@ -0,0 +1,72 @@ +/* + * PROJECT: ReactOS Magnifier + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/applications/magnify/lang/tr-TR.rc + * PURPOSE: Turkish Language File for Magnifier + * TRANSLATOR: 2013 - Erdem Ersoy (eersoy93) + */ + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +IDC_MAGNIFIER MENU +BEGIN + POPUP "&Seçke" + BEGIN + MENUITEM "&Çıkış", IDM_EXIT + MENUITEM "&Ayarlar", IDM_OPTIONS + MENUITEM SEPARATOR + MENUITEM "&Hakkında", IDM_ABOUT + END +END + +IDC_MAGNIFIER ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 22, 17, 220, 75 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_SYSMENU +CAPTION "Hakkında" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + ICON IDI_ICON,IDC_MYICON,14,9,20,20 + LTEXT "Büyüteç: Sürüm 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX + LTEXT "Telif Hakkı: 2007 - Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,48,24,125,22 + PUSHBUTTON "Tamam",IDOK,162,48,50,14 +END + +IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Büyüteç Ayarları" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Çıkış",IDOK,96,161,50,14 + PUSHBUTTON "Yardım",IDC_BUTTON_HELP,38,161,50,14 + LTEXT "Büyütme düzeyi:",IDC_STATIC,6,8,68,8 + COMBOBOX IDC_ZOOM,72,6,63,66,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "İzleme",IDC_STATIC,7,25,139,59 + GROUPBOX "Sunum",IDC_STATIC,7,87,139,57 + CONTROL "Fare imlecini takip et",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10 + CONTROL "Düğme takımı odağını izle",IDC_FOLLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10 + CONTROL "Metin düzenlemesini izle",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10 + CONTROL "Renkleri ters çevir",IDC_INVERTCOLORSCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,114,10 + CONTROL "Simge durumunda baÅŸlat",IDC_STARTMINIMIZEDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,114,10 + CONTROL "Büyüteci göster",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10 +END + +IDD_WARNINGDIALOG DIALOGEX 0, 0, 250, 97 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION +CAPTION "ReactOS Büyüteç" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Tamam",IDOK,193,76,50,14 + ICON IDI_ICON,IDC_STATIC,7,17,20,20 + LTEXT "Büyüteç, hafif görme engelli kullanıcıların en az çaba harcamaları için tasarlanmıştır. Görme engelli bir çok kullanıcı, günlük kullanım için bu aracı kullanmaya gereksinim duyacaktır.",IDC_STATIC,36,7,207,33 + CONTROL "Bunu bir daha gösterme",IDC_SHOWWARNINGCHECK, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10 +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Büyüteç" +END diff --git a/reactos/base/applications/magnify/rsrc.rc b/reactos/base/applications/magnify/rsrc.rc index fa009b52be7..adea857be93 100644 --- a/reactos/base/applications/magnify/rsrc.rc +++ b/reactos/base/applications/magnify/rsrc.rc @@ -46,6 +46,9 @@ #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" #endif diff --git a/reactos/base/applications/mplay32/lang/tr-TR.rc b/reactos/base/applications/mplay32/lang/tr-TR.rc new file mode 100644 index 00000000000..26fd5f6de11 --- /dev/null +++ b/reactos/base/applications/mplay32/lang/tr-TR.rc @@ -0,0 +1,30 @@ +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +IDR_MAINMENU MENU +BEGIN + POPUP "&Kütük" + BEGIN + MENUITEM "&Aç", IDM_OPEN_FILE + MENUITEM "&Kapat", IDM_CLOSE_FILE + MENUITEM SEPARATOR + MENUITEM "&Çıkış", IDM_EXIT + END + POPUP "&Yardım" + BEGIN + MENUITEM "&Hakkında", IDM_ABOUT + END +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ALL_TYPES_FILTER "Tüm Desteklenen Dosyalar (*.wav, *.cda, *.mid, *.midi, *.avi)\0*.wav;*.cda;*.mid;*.midi;*.avi\0" + IDS_TOOLTIP_PLAY "Çal" + IDS_TOOLTIP_STOP "Durdur" + IDS_TOOLTIP_EJECT "Çıkar" + IDS_TOOLTIP_BACKWARD "Bir Önceki" + IDS_TOOLTIP_SEEKBACK "Geri Sar" + IDS_TOOLTIP_SEEKFORW "İleri Sar" + IDS_TOOLTIP_FORWARD "Bir Sonraki" + IDS_APPTITLE "ReactOS Çokluortam Oynatıcısı" + IDS_PLAY "Çal" +END diff --git a/reactos/base/applications/mplay32/rsrc.rc b/reactos/base/applications/mplay32/rsrc.rc index 1f05683a0cb..5fe2c465b66 100644 --- a/reactos/base/applications/mplay32/rsrc.rc +++ b/reactos/base/applications/mplay32/rsrc.rc @@ -51,6 +51,9 @@ #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" #endif diff --git a/reactos/base/applications/mspaint/lang/tr-TR.rc b/reactos/base/applications/mspaint/lang/tr-TR.rc new file mode 100644 index 00000000000..4ff328d805d --- /dev/null +++ b/reactos/base/applications/mspaint/lang/tr-TR.rc @@ -0,0 +1,206 @@ +/* + * PROJECT: PAINT for ReactOS + * LICENSE: unknown (LGPL assumed) + * FILE: base/applications/mspaint/lang/tr-TR.rc + * PURPOSE: Turkish Language resource file + * TRANSLATORS: 2013 - Erdem Ersoy (eersoy93) + */ + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +ID_MENU MENU +BEGIN + POPUP "&Kütük" + BEGIN + MENUITEM "&Yeni\tCtrl+N", IDM_FILENEW + MENUITEM "&Aç\tCtrl+O", IDM_FILEOPEN + MENUITEM "&Kaydet\tCtrl+S", IDM_FILESAVE + MENUITEM "Ay&rı Kaydet", IDM_FILESAVEAS + MENUITEM SEPARATOR + MENUITEM "Döşeyerek Duvar Kağıdı Yap", IDM_FILEASWALLPAPERPLANE + MENUITEM "Ortalayarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERCENTERED + MENUITEM "Uzatarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERSTRETCHED + MENUITEM SEPARATOR + MENUITEM "&Çıkış\tAlt+F4", IDM_FILEEXIT + END + + POPUP "&Düzen" + BEGIN + MENUITEM "Geri Al\tCtrl+Z", IDM_EDITUNDO + MENUITEM "Yinele\tCtrl+Y", IDM_EDITREDO + MENUITEM SEPARATOR + MENUITEM "Kes\tCtrl+X", IDM_EDITCUT + MENUITEM "ÇoÄŸalt\tCtrl+C", IDM_EDITCOPY + MENUITEM "Yapıştır\tCtrl+V", IDM_EDITPASTE + MENUITEM "Seçimi Sil\tDel", IDM_EDITDELETESELECTION + MENUITEM "Seçimi Evir", IDM_EDITINVERTSELECTION + MENUITEM "Hepsini Seç\tCtrl+A", IDM_EDITSELECTALL + MENUITEM SEPARATOR + MENUITEM "Seçimi Åžuraya Kopyala", IDM_EDITCOPYTO + MENUITEM "Åžuradan Yapıştır", IDM_EDITPASTEFROM + END + + POPUP "&Görünüm" + BEGIN + MENUITEM "Araç ÇubuÄŸu\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED + MENUITEM "Renklik\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED + MENUITEM "Durum ÇubuÄŸu", IDM_VIEWSTATUSBAR, CHECKED + MENUITEM "Metin ÇubuÄŸu", IDM_FORMATICONBAR, CHECKED, GRAYED + MENUITEM SEPARATOR + POPUP "Büyüt" + BEGIN + POPUP "Kullanıcı Tanımlı" + BEGIN + MENUITEM "%12,5", IDM_VIEWZOOM125 + MENUITEM "%25", IDM_VIEWZOOM25 + MENUITEM "%50", IDM_VIEWZOOM50 + MENUITEM "%100", IDM_VIEWZOOM100 + MENUITEM "%200", IDM_VIEWZOOM200 + MENUITEM "%400", IDM_VIEWZOOM400 + MENUITEM "%800", IDM_VIEWZOOM800 + END + MENUITEM SEPARATOR + MENUITEM "Kılavuzu Göster\tCtrl+G", IDM_VIEWSHOWGRID + MENUITEM "Küçüğünü Göster", IDM_VIEWSHOWMINIATURE + END + MENUITEM "Tam Ekran\tCtrl+F", IDM_VIEWFULLSCREEN + END + + POPUP "G&örüntü" + BEGIN + MENUITEM "Döndür ya da Çevir\tCtrl+R", IDM_IMAGEROTATEMIRROR + MENUITEM "Boyutlandır\tCtrl+W", IDM_IMAGECHANGESIZE + MENUITEM "Kırp", IDM_IMAGECROP + MENUITEM "Renkleri Evir\tCtrl+I", IDM_IMAGEINVERTCOLORS + MENUITEM "Öznitelikler\tCtrl+E", IDM_IMAGEATTRIBUTES + MENUITEM "Resmi Temizle\tCtrl+Shft+N", IDM_IMAGEDELETEIMAGE + MENUITEM "Donuk Çiz", IDM_IMAGEDRAWOPAQUE + END + + POPUP "R&enkler" + BEGIN + MENUITEM "RenkliÄŸi Düzenle", IDM_COLORSEDITPALETTE + END + + POPUP "&Yardım" + BEGIN + MENUITEM "Yardım Konuları", IDM_HELPHELPTOPICS + MENUITEM SEPARATOR + MENUITEM "Hakkında", IDM_HELPINFO + END +END + +ID_ACCELERATORS ACCELERATORS +BEGIN + "^N", IDM_FILENEW + "^O", IDM_FILEOPEN + "^S", IDM_FILESAVE + "^Z", IDM_EDITUNDO + "^Y", IDM_EDITREDO + "^X", IDM_EDITCUT + "^C", IDM_EDITCOPY + "^V", IDM_EDITPASTE + VK_DELETE, IDM_EDITDELETESELECTION, VIRTKEY + "^A", IDM_EDITSELECTALL + "^T", IDM_VIEWTOOLBOX + "^L", IDM_VIEWCOLORPALETTE + "^G", IDM_VIEWSHOWGRID + "^F", IDM_VIEWFULLSCREEN + "^R", IDM_IMAGEROTATEMIRROR + "^W", IDM_IMAGECHANGESIZE + "^I", IDM_IMAGEINVERTCOLORS + "^E", IDM_IMAGEATTRIBUTES + "N", IDM_IMAGEDELETEIMAGE, CONTROL, SHIFT, VIRTKEY +END + +IDD_MIRRORROTATE DIALOGEX 100, 100, 180, 100 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Resmi Döndür ya da Çevir" +BEGIN + GROUPBOX "Döndür ya da Çevir", IDD_MIRRORROTATEGROUP, 6, 6, 112, 86 + AUTORADIOBUTTON "Yatay Çevir", IDD_MIRRORROTATERB1, 12, 18, 100, 10, WS_GROUP + AUTORADIOBUTTON "Dikey Çevir", IDD_MIRRORROTATERB2, 12, 30, 100, 10 + AUTORADIOBUTTON "Açıyla Çevir", IDD_MIRRORROTATERB3, 12, 42, 100, 10 + AUTORADIOBUTTON "90°", IDD_MIRRORROTATERB4, 42, 54, 50, 10, WS_GROUP | WS_DISABLED + AUTORADIOBUTTON "180°", IDD_MIRRORROTATERB5, 42, 66, 50, 10, WS_DISABLED + AUTORADIOBUTTON "270°", IDD_MIRRORROTATERB6, 42, 78, 50, 10, WS_DISABLED + DEFPUSHBUTTON "Tamam", IDOK, 125, 8, 48, 14 + PUSHBUTTON "Vazgeç", IDCANCEL, 125, 24, 48, 14 +END + +IDD_ATTRIBUTES DIALOGEX 100, 100, 225, 120 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Öznitelikler" +BEGIN + EDITTEXT IDD_ATTRIBUTESEDIT1, 48, 40, 35, 12 + EDITTEXT IDD_ATTRIBUTESEDIT2, 128, 40, 35, 12 + LTEXT "En:", IDD_ATTRIBUTESTEXT1, 10, 40, 35, 10 + LTEXT "Boy:", IDD_ATTRIBUTESTEXT2, 90, 40, 35, 10 + LTEXT "Kütüğün Zamanı:", IDD_ATTRIBUTESTEXT3, 10, 5, 60, 10 + LTEXT "Kütüğün Boyutu:", IDD_ATTRIBUTESTEXT4, 10, 15, 60, 10 + LTEXT "Çözünürlük:", IDD_ATTRIBUTESTEXT5, 10, 25, 60, 10 + LTEXT "(Daha yok.)", IDD_ATTRIBUTESTEXT6, 60, 5, 90, 10 + LTEXT "(Daha yok.)", IDD_ATTRIBUTESTEXT7, 60, 15, 90, 10 + LTEXT "(Daha yok.)", IDD_ATTRIBUTESTEXT8, 60, 25, 90, 10 + GROUPBOX "Birim", IDD_ATTRIBUTESGROUP1, 6, 57, 158, 27 + AUTORADIOBUTTON "İnç", IDD_ATTRIBUTESRB1, 12, 69, 45, 10, WS_GROUP + AUTORADIOBUTTON "cm", IDD_ATTRIBUTESRB2, 62, 69, 45, 10 + AUTORADIOBUTTON "Nokta", IDD_ATTRIBUTESRB3, 112, 69, 45, 10 + GROUPBOX "Renkler", IDD_ATTRIBUTESGROUP2, 6, 88, 158, 27 + AUTORADIOBUTTON "Siyah-beyaz", IDD_ATTRIBUTESRB4, 12, 100, 70, 10, WS_GROUP + AUTORADIOBUTTON "Renkli", IDD_ATTRIBUTESRB5, 92, 100, 35, 10 + DEFPUSHBUTTON "Tamam", IDOK, 170, 8, 48, 14 + PUSHBUTTON "Vazgeç", IDCANCEL, 170, 24, 48, 14 + PUSHBUTTON "Öntanımlı", IDD_ATTRIBUTESSTANDARD, 170, 40, 48, 14 +END + +IDD_CHANGESIZE DIALOGEX 100, 100, 225, 80 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Boyutlandır" +BEGIN + GROUPBOX "Boyutlandır", IDD_CHANGESIZEGROUP, 6, 6, 158, 66 + ICON IDI_HORZSTRETCH, IDD_CHANGESIZEICON1, 12, 18, 32, 32 + LTEXT "Yatay:", IDD_CHANGESIZETEXT1, 45, 24, 40, 10 + EDITTEXT IDD_CHANGESIZEEDIT1, 90, 23, 32, 12 + LTEXT "%", IDD_CHANGESIZETEXT2, 125, 24, 15, 10 + ICON IDI_VERTSTRETCH, IDD_CHANGESIZEICON2, 12, 43, 32, 32 + LTEXT "Dikey:", IDD_CHANGESIZETEXT3, 45, 49, 40, 10 + EDITTEXT IDD_CHANGESIZEEDIT2, 90, 48, 32, 12 + LTEXT "%", IDD_CHANGESIZETEXT4, 125, 49, 15, 10 + DEFPUSHBUTTON "Tamam", IDOK, 170, 8, 48, 14 + PUSHBUTTON "Vazgeç", IDCANCEL, 170, 24, 48, 14 +END + +STRINGTABLE +BEGIN + IDS_PROGRAMNAME, "Görüntü Düzenleyicisi" + IDS_WINDOWTITLE, "%s - Görüntü Düzenleyicisi" + IDS_INFOTITLE, "ReactOS için Görüntü Düzenleyicisi" + IDS_INFOTEXT, "ReactOS için Görüntü Düzenleyicisi GNU Kısıtlı Genel Kamu Lisansı'nın (LGPL) 3. sürümüyle lisanslıdır. (bk: www.gnu.org)" + IDS_SAVEPROMPTTEXT, "%s için yapılan deÄŸiÅŸiklikler kaydedilsin mi?" + IDS_DEFAULTFILENAME, "Adsız.bmp" + IDS_MINIATURETITLE, "Küçüğü" + IDS_TOOLTIP1, "Özgür Seçim" + IDS_TOOLTIP2, "Dikdörtgen Seçim" + IDS_TOOLTIP3, "Silgi" + IDS_TOOLTIP4, "Boya Kabı" + IDS_TOOLTIP5, "Renk Seçici" + IDS_TOOLTIP6, "Büyüteç" + IDS_TOOLTIP7, "Kalem" + IDS_TOOLTIP8, "Fırça" + IDS_TOOLTIP9, "Püskürteç" + IDS_TOOLTIP10, "Metin" + IDS_TOOLTIP11, "Çizgi" + IDS_TOOLTIP12, "Kıvrım" + IDS_TOOLTIP13, "Dikdörtgen" + IDS_TOOLTIP14, "Çokgen" + IDS_TOOLTIP15, "Söbek" + IDS_TOOLTIP16, "Yuvarlatılmış Dikdörtgen" + IDS_OPENFILTER, "Bit EÅŸlem Görüntüleri (*.bmp;*.dib)\1*.bmp;*.dib\1Tüm Kütükler (*.*)\1*.*\1" + IDS_SAVEFILTER, "24-bit Bit EÅŸlem Görüntüsü(*.bmp;*.dib)\1*.bmp;*.dib\1" + IDS_FILESIZE, "%d sekizlik" + IDS_PRINTRES, "Her metrekarede %d x %d nokta" +END diff --git a/reactos/base/applications/mspaint/rsrc.rc b/reactos/base/applications/mspaint/rsrc.rc index 07a069d5d7d..c79b7c7155b 100644 --- a/reactos/base/applications/mspaint/rsrc.rc +++ b/reactos/base/applications/mspaint/rsrc.rc @@ -86,6 +86,9 @@ #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" +#endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" #endif diff --git a/reactos/base/applications/network/wlanconf/lang/de-DE.rc b/reactos/base/applications/network/wlanconf/lang/de-DE.rc new file mode 100644 index 00000000000..df90cd547fa --- /dev/null +++ b/reactos/base/applications/network/wlanconf/lang/de-DE.rc @@ -0,0 +1,41 @@ +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN +IDS_USAGE, "\nEinen WLAN Adapter konfigurieren.\n\n\ +WLANCONF [-c SSID [-w WEP] [-a]] [-d] [-s]\n\n\ +\t-c SSID\t\teine Verbindung mit der angegebenen\n\ +\t\t\tSSID herstellen \n\ +\t-w WEP\t\tden zu benutzenden WEP-Schlüssel angeben\n\ +\t-a\t\tals ad-hoc-Netzwerk konfigurieren\n\ +\t-d\t\tvom aktuellen Access Point trennen\n\ +\t-s\t\t scannt nach verfügbaren Access Points\n\ +\t\t\tin der Nähe.\n\n\ +Werden keine Parameter angegeben, werden Informationen zur WLAN-Verbindung ausgegeben.\n" +/* === */ +IDS_NO_NETWORK, "Keine Netzwerke gefunden.\n" +IDS_NO_WLAN_ADAPTER, "Es konnte kein WLAN Adapter gefunden werden.\n" +IDS_SUCCESS, "Die Operation wurde erfolgreich abgeschlossen.\n" +IDS_WLAN_DISCONNECT, "\nWLAN getrennt\n" +/* === */ +IDS_MSG_WEP_ENABLED, "WEP aktiv: %s\n" +IDS_MSG_NETWORK_MODE, "Netzwerkmodus: %s\n" +IDS_MSG_CURRENT_WIRELESS, "\nAktuelle WLAN-Konfiguration:\n\n" +IDS_MSG_ENCRYPTED, "Verschlüsselt: %s\n" +IDS_MSG_NETWORK_TYPE, "Netzwerktyp: %s\n" +IDS_MSG_RSSI, "RSSI: %i dBm\n" +IDS_MSG_SUPPORT_RATE, "Unterstützte Geschwindigkeiten (Mbps): " +IDS_MSG_TRANSMISSION_POWER, "Sendeleistung: %d mW\n" +IDS_MSG_ANTENNA_COUNT, "Anzahl der Antennen: %d\n" +IDS_MSG_TRANSMIT_ANTENNA, "Sendeantenne: %d\n" +IDS_MSG_TRANSMIT_ANTENNA_ANY, "Sendeantenne: beliebig\n" +IDS_MSG_RECEIVE_ANTENNA, "Empfangsantenne: %d\n" +IDS_MSG_RECEIVE_ANTENNA_ANY, "Empfangsantenne: beliebig\n" +IDS_MSG_FRAGMENT_THRESHOLD, "Fragmentierungsschwelle: %d Bytes\n" +IDS_MSG_RTS_THRESHOLD, "RTS-Schwelle: %d Bytes\n" +/* === */ +IDS_YES, "Ja" +IDS_NO, "Nein" +IDS_ADHOC, "Adhoc" +IDS_INFRASTRUCTURE, "Infrastruktur" +END diff --git a/reactos/base/applications/network/wlanconf/lang/it-IT.rc b/reactos/base/applications/network/wlanconf/lang/it-IT.rc new file mode 100644 index 00000000000..d1cff018097 --- /dev/null +++ b/reactos/base/applications/network/wlanconf/lang/it-IT.rc @@ -0,0 +1,40 @@ +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN +IDS_USAGE, "\nConfigurazione adattatore WLAN.\n\n\ +WLANCONF [-c SSID [-w WEP] [-a]] [-d] [-s]\n\n\ +\t-c SSID\t\tConnesso al SSID,\n\ +\t-w WEP\t\tSpecifica una chiave WEP da usare.\n\ +\t-a\t\tSpecifica la rete di destinazione ad-hoc\n\ +\t-d\t\tDisconneti dall'AP corrente.\n\ +\t-s\t\tEsegue la scansione e visualizza un elenco di punti di accesso\n\ +\t\t\tin range.\n\n\ +Non passando nessun parametro verranno stampate le informazioni relative alla connessione WLAN corrente\n" +/* === */ +IDS_NO_NETWORK, "Nessuna rete trovata\n" +IDS_NO_WLAN_ADAPTER, "Impossibile trovare un adattatore WLAN sul sistema\n" +IDS_SUCCESS, "Operazione completata con successo.\n" +IDS_WLAN_DISCONNECT, "\nWLAN disconnesso\n" +/* === */ +IDS_MSG_WEP_ENABLED, "WEP abilitato: %s\n" +IDS_MSG_NETWORK_MODE, "Modalità di rete: %s\n" +IDS_MSG_CURRENT_WIRELESS, "\Informazioni correnti per la configurazione wireless:\n\n" +IDS_MSG_ENCRYPTED, "Crittografia: %s\n" +IDS_MSG_NETWORK_TYPE, "Tipologia rete: %s\n" +IDS_MSG_RSSI, "RSSI: %i dBm\n" +IDS_MSG_SUPPORT_RATE, "Tariffe supportate (Mbps): " +IDS_MSG_TRANSMISSION_POWER, "Potenza Trasmissione: %d mW\n" +IDS_MSG_ANTENNA_COUNT, "Numero Antenne: %d\n" +IDS_MSG_TRANSMIT_ANTENNA, "Trasmissione antenna: %d\n" +IDS_MSG_TRANSMIT_ANTENNA_ANY, "Trasmissione antenna: Qualsiasi\n" +IDS_MSG_RECEIVE_ANTENNA, "Ricezione Antenna: %d\n" +IDS_MSG_RECEIVE_ANTENNA_ANY, "Ricezione Antenna: Qualsiasi\n" +IDS_MSG_FRAGMENT_THRESHOLD, "Soglia di Frammentazione: %d bytes\n" +IDS_MSG_RTS_THRESHOLD, "Soglia RTS: %d bytes\n" +/* === */ +IDS_YES, "Si" +IDS_NO, "No" +IDS_ADHOC, "Adhoc" +IDS_INFRASTRUCTURE, "Infrastruttura" +END diff --git a/reactos/base/applications/network/wlanconf/wlanconf.rc b/reactos/base/applications/network/wlanconf/wlanconf.rc index f8ebcca9b6f..c1af29a6350 100644 --- a/reactos/base/applications/network/wlanconf/wlanconf.rc +++ b/reactos/base/applications/network/wlanconf/wlanconf.rc @@ -5,13 +5,21 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #define REACTOS_STR_FILE_DESCRIPTION "ReactOS WLAN Configuration Tool\0" -#define REACTOS_STR_INTERNAL_NAME "wlanconf\0" +#define REACTOS_STR_INTERNAL_NAME "wlanconf\0" #define REACTOS_STR_ORIGINAL_FILENAME "wlanconf.exe\0" #define REACTOS_STR_ORIGINAL_COPYRIGHT "Cameron Gutman (cameron.gutman@reactos.org)\0" #include // UTF-8 #pragma code_page(65001) + +#ifdef LANGUAGE_DE_DE + #include "lang/de-DE.rc" +#endif #ifdef LANGUAGE_EN_US #include "lang/en-US.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif + diff --git a/reactos/base/applications/notepad/lang/tr-TR.rc b/reactos/base/applications/notepad/lang/tr-TR.rc index 4d429533418..3b1eecd433d 100644 --- a/reactos/base/applications/notepad/lang/tr-TR.rc +++ b/reactos/base/applications/notepad/lang/tr-TR.rc @@ -1,10 +1,8 @@ -/* +/* * Notepad (Turkish resources) * - * Copyright 1997,98 Marcel Baur - * Proofread 1998 by David Lee Lambert - * Copyright 2002 Sylvain Petreolle - * Çeviri 2012 Arda Tanrıkulu + * Copyright 2012 Arda Tanrıkulu + * Copyright 2013 Erdem Ersoy (eersoy93) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -43,81 +41,80 @@ END MAIN_MENU MENU BEGIN - POPUP "&Dosya" + POPUP "&Kütük" BEGIN - MENUITEM "&Yeni\tCtrl+N", CMD_NEW - MENUITEM "&Aç...\tCtrl+O", CMD_OPEN + MENUITEM "&Yeni\tCtrl+N", CMD_NEW + MENUITEM "&Aç\tCtrl+O", CMD_OPEN MENUITEM "&Kaydet\tCtrl+S", CMD_SAVE - MENUITEM "&Farklı Kaydet...", CMD_SAVE_AS + MENUITEM "Ay&rı Kaydet", CMD_SAVE_AS MENUITEM SEPARATOR - MENUITEM "&Sayfa Yapısı...", CMD_PAGE_SETUP - MENUITEM "&Yazdır\tCtrl+P", CMD_PRINT - MENUITEM "&Yazıcı Ayarları...", CMD_PRINTER_SETUP + MENUITEM "&Sayfa Yapısı", CMD_PAGE_SETUP + MENUITEM "Ya&zdır\tCtrl+P", CMD_PRINT + MENUITEM "Yaz&ıcı Ayarları", CMD_PRINTER_SETUP MENUITEM SEPARATOR - MENUITEM "&Çıkış", CMD_EXIT + MENUITEM "&Çıkış", CMD_EXIT END POPUP "&Düzen" BEGIN - MENUITEM "&Geri Al\tCtrl+Z", CMD_UNDO + MENUITEM "&Geri Al\tCtrl+Z", CMD_UNDO MENUITEM SEPARATOR MENUITEM "&Kes\tCtrl+X", CMD_CUT - MENUITEM "K&opyala\tCtrl+C", CMD_COPY - MENUITEM "Y&apıştır\tCtrl+V", CMD_PASTE - MENUITEM "&Sil\tDel", CMD_DELETE + MENUITEM "&ÇoÄŸalt\tCtrl+C", CMD_COPY + MENUITEM "&Yapıştır\tCtrl+V", CMD_PASTE + MENUITEM "&Sil\tDel", CMD_DELETE MENUITEM SEPARATOR - MENUITEM "&Bul...\tCtrl+F", CMD_SEARCH - MENUITEM "Son&rakini Bul\tF3", CMD_SEARCH_NEXT - MENUITEM "&DeÄŸiÅŸtir\tCtrl+H", CMD_REPLACE - MENUITEM "G&it...\tCtrl+G", CMD_GOTO + MENUITEM "&Ara\tCtrl+F", CMD_SEARCH + MENUITEM "S&onrakini Ara\tF3", CMD_SEARCH_NEXT + MENUITEM "&DeÄŸiÅŸtir\tCtrl+H", CMD_REPLACE + MENUITEM "G&it\tCtrl+G", CMD_GOTO MENUITEM SEPARATOR MENUITEM "&Tümünü Seç\tCtrl+A", CMD_SELECT_ALL - MENUITEM "Saat/Tari&h\tF5", CMD_TIME_DATE + MENUITEM "&Zaman\tF5", CMD_TIME_DATE END POPUP "&Biçim" BEGIN - MENUITEM "&Sözcük Kaydır", CMD_WRAP - MENUITEM "&Yazı Tipi...", CMD_FONT + MENUITEM "&Satır Kaydır", CMD_WRAP + MENUITEM "&Yazı Türü", CMD_FONT END POPUP "&Görünüm" BEGIN - MENUITEM "&Durum çubuÄŸu", CMD_STATUSBAR + MENUITEM "&Durum ÇubuÄŸu", CMD_STATUSBAR END POPUP "&Yardım" BEGIN - MENUITEM "&Yardım Konuları", CMD_HELP_CONTENTS - MENUITEM "&Ara...", CMD_HELP_SEARCH - MENUITEM "&Yardımda yardım", CMD_HELP_ON_HELP + MENUITEM "&Yardım Konuları", CMD_HELP_CONTENTS + MENUITEM "Yardımda &Ara", CMD_HELP_SEARCH + MENUITEM "Yardım &İçin Yardım", CMD_HELP_ON_HELP MENUITEM SEPARATOR - MENUITEM "&Not Defteri &Hakkında", CMD_ABOUT - MENUITEM "Bil&gi", CMD_ABOUT_WINE + MENUITEM "&Hakkında", CMD_ABOUT + MENUITEM "&Bilgi", CMD_ABOUT_WINE END END /* Dialog `Page setup' */ - DIALOG_PAGESETUP DIALOGEX 0, 0, 225, 95 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Sayfa Yapısı" BEGIN -LTEXT "Üst&bilgi:", 0x140, 10, 07, 40, 15 -EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP -LTEXT "Altbil&gi:", 0x142, 10, 24, 40, 15 -EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "Üst &Bilgi:", 0x140, 10, 07, 40, 15 +EDITTEXT 0x141, 60, 05,110, 12, WS_BORDER | WS_TABSTOP +LTEXT "&Alt Bilgi:", 0x142, 10, 24, 40, 15 +EDITTEXT 0x143, 60, 22,110, 12, WS_BORDER | WS_TABSTOP -GROUPBOX "&Kenar BoÅŸlukları:", 0x144, 10, 43,160, 45 -LTEXT "S&ol:", 0x145, 20, 55, 30, 10, WS_CHILD +GROUPBOX "Kenar Payı:", 0x144, 10, 43,160, 45 +LTEXT "S&ol:", 0x145, 20, 55, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/ 0x147, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Üst:", 0x148, 20, 73, 30, 10, WS_CHILD +LTEXT "&Üst:", 0x148, 20, 73, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/ 0x14A, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&SaÄŸ:", 0x14B, 100, 55, 30, 10, WS_CHILD +LTEXT "&SaÄŸ:", 0x14B, 100, 55, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/ 0x14D, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "A<:", 0x14E, 100, 73, 30, 10, WS_CHILD +LTEXT "A<:", 0x14E, 100, 73, 30, 10, WS_CHILD EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP -DEFPUSHBUTTON "Tamam", IDOK, 180, 3, 40, 15, WS_TABSTOP -PUSHBUTTON "İptal", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP -PUSHBUTTON "&Yardım", IDHELP, 180, 39, 40, 15, WS_TABSTOP +DEFPUSHBUTTON "&Tamam", IDOK, 180, 3, 40, 15, WS_TABSTOP +PUSHBUTTON "&Vazgeç", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP +PUSHBUTTON "&Yardım", IDHELP, 180, 39, 40, 15, WS_TABSTOP END /* Dialog `Encoding' */ @@ -129,31 +126,31 @@ BEGIN COMBOBOX ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP LTEXT "K&odlama:",0x155,5,2,41,12 COMBOBOX ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP -LTEXT "Sonhatlar:",0x156,5,20,41,12 +LTEXT "&Sonlanma:",0x156,5,20,41,12 END /* Dialog 'Go To' */ DIALOG_GOTO DIALOGEX 0,0,165,50 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Satıra git" +CAPTION "Satıra Git" BEGIN EDITTEXT ID_LINENUMBER,54,10,106,12,WS_CHILD | WS_BORDER | WS_TABSTOP -LTEXT "&Satır No:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER -DEFPUSHBUTTON "Tamam", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP -PUSHBUTTON "İptal", IDCANCEL, 120, 30, 40, 15, WS_CHILD | WS_TABSTOP +LTEXT "Satır No:",0x155,5,12,41,12,WS_CHILD | WS_TABSTOP | ES_NUMBER +DEFPUSHBUTTON "&Tamam", IDOK, 75, 30, 40, 15, WS_CHILD | WS_TABSTOP +PUSHBUTTON "&Vazgeç", IDCANCEL, 120, 30, 40, 15, WS_CHILD | WS_TABSTOP END IDD_ABOUTBOX DIALOGEX DISCARDABLE 22,16,284,170 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Not Defteri Hakkında" +CAPTION "ReactOS Metin Düzenleyicisi Hakkında" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "ReactOS Not Defteri v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n", + CONTROL "ReactOS Metin Düzenleyicisi - Sürüm: 1.0\r\nTelif Hakkı: 1997,98 Marcel Baur (mbaur@g26.ethz.ch)\r\nTelif Hakkı: 2000 Mike McCormack (Mike_McCormack@looksmart.com.au)\r\nTelif Hakkı: 2002 Sylvain Petreolle (spetreolle@yahoo.fr)\r\nTelif Hakkı: 2002 Andriy Palamarchuk\r\n", -1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,46,7,232,39 CONTROL " ", -1,"Static",0x50000000,8,48,272,11 - DEFPUSHBUTTON "Kapat",IDOK,114,149,44,15,WS_GROUP + DEFPUSHBUTTON "&Tamam",IDOK,114,149,44,15,WS_GROUP ICON IDI_NPICON,-1,12,9,20,30 EDITTEXT IDC_LICENSE,8,64,272,81,ES_MULTILINE | ES_READONLY | WS_VSCROLL @@ -161,7 +158,7 @@ END STRINGTABLE DISCARDABLE BEGIN - STRING_LICENSE, "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 2 of the License, or (at your option) any later version.\r\n\r\nThis 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.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + STRING_LICENSE, "ÖNEMLİ: AÅŸağıdaki metin özgün metnin resmi olmayan çevirisidir. Çeviri metniyle özgün metin arasında ayrım olabilir. Özgün metin çeviri metninin altındadır.\r\n\r\n***\r\n\r\nBu yazılım özgürdür, yani bu yazılım Özgür Yazılım Vakfı'nın yayınladığı GNU Genel Kamu Lisansı'nın 2. sürümü veya daha sonraki sürümleri altında yeniden dağıtabilir veya deÄŸiÅŸtirebilirsiniz.\r\n\r\nBu yazılım, kullanışlı olabileceÄŸi umuduyla dağıtılmıştır, ancak özellikle SATILABİLİRLİK ve BELİRLİ BİR AMACA UYGUNLUK açısından olmak üzere bu yazılımın hiçbir güvencesi yoktur. Daha fazla bilgi için GNU Genel Kamu Lisansı'na bakınız.\r\n\r\nBu yazılımla birlikte GNU Genel Kamu Lisansı'nın bir sûretine de iye olmanız gerekir, eÄŸer yoksa Özgür Yazılım Vakfı A.Åž.'ne (51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 ABD) yazınız. \r\n\r\n***\r\n\r\nThis 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 2 of the License, or (at your option) any later version.\r\n\r\nThis 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.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE @@ -173,29 +170,29 @@ STRING_PAGESETUP_RIGHTVALUE, "20 mm" /* FIXME */ STRING_PAGESETUP_TOPVALUE, "25 mm" /* FIXME */ STRING_PAGESETUP_BOTTOMVALUE, "25 mm" /* FIXME */ -STRING_NOTEPAD, "Not Defteri" +STRING_NOTEPAD, "Metin Düzenleyicisi" STRING_ERROR, "HATA" STRING_WARNING, "UYARI" STRING_INFO, "Bilgi" STRING_UNTITLED, "Adsız" -STRING_ALL_FILES, "Tüm dosyalar (*.*)" -STRING_TEXT_FILES_TXT, "Metin dosyaları (*.txt)" +STRING_ALL_FILES, "Tüm Kütükler (*.*)" +STRING_TEXT_FILES_TXT, "Metin Belgeleri (*.txt)" -STRING_TOOLARGE, "'%s' dosyası Not Defteri için çok büyük.\n\nBu dosyayı düzenlemek için baÅŸka bir düzenleyici kullanın." -STRING_NOTEXT, "HiçbirÅŸey yazmadınız." -STRING_DOESNOTEXIST, "'%s' dosyası bulunamıyor.\n\nYeni bir dosya yaratmak ister misiniz?" -STRING_NOTSAVED, " dosyasındaki metin deÄŸiÅŸmiÅŸ.\n\nDeÄŸiÅŸiklikleri kaydetmek istiyor musunuz?" -STRING_NOTFOUND, "'%s' bulunamıyor." -STRING_OUT_OF_MEMORY, "Bu iÅŸlemi tamamlamak için yetersiz bellek. Kullanılabilen belleÄŸi arttırmak için bir veya daha fazla uygulamadan çıkıp yeniden deneyin." -STRING_CANNOTFIND "'%s' bulunamıyor" +STRING_TOOLARGE, "'%s' kütüğü Metin Düzenleyicisi için çok büyük. Bu kütüğü düzenlemek için baÅŸka bir metin düzenleyicisi kullanınız." +STRING_NOTEXT, "Hiçbir ÅŸey yazmadınız. Lütfen bir ÅŸeyler yazıp yeniden deneyiniz." +STRING_DOESNOTEXIST, "'%s' kütüğü mevcut deÄŸil. Yeni bir kütük oluÅŸturmak ister misiniz?" +STRING_NOTSAVED, "'%s' kütüğündeki metin deÄŸiÅŸtirilmiÅŸ. DeÄŸiÅŸiklikleri kaydetmek istiyor musunuz?" +STRING_NOTFOUND, "'%s' kütüğü bulunamadı." +STRING_OUT_OF_MEMORY, "Bu iÅŸlemi tamamlamak için gereken bellek yetersiz. Kullanılabilen belleÄŸi arttırmak için bir veya daha fazla uygulamadan çıkıp bu iÅŸlemi yeniden deneyiniz." +STRING_CANNOTFIND "'%s' bulunamadı." STRING_ANSI, "ANSI" STRING_UNICODE, "Unicode" -STRING_UNICODE_BE, "Unicode (big endian)" +STRING_UNICODE_BE, "Unicode (Big Endian)" STRING_UTF8, "UTF-8" STRING_CRLF, "Windows" -STRING_LF, "Unix" +STRING_LF, "UNIX" STRING_CR, "Mac" -STRING_LINE_COLUMN, "St %d, Stn %d" +STRING_LINE_COLUMN, "%d. Satır, %d. Sütun" END diff --git a/reactos/base/applications/regedit/lang/it-IT.rc b/reactos/base/applications/regedit/lang/it-IT.rc index cc4d1509581..2b5a9a08907 100644 --- a/reactos/base/applications/regedit/lang/it-IT.rc +++ b/reactos/base/applications/regedit/lang/it-IT.rc @@ -64,7 +64,7 @@ BEGIN ID_REGISTRY_CONNECTNETWORKREGISTRY MENUITEM "&Disconnetti da Registro di rete...", - ID_REGISTRY_DISCONNECTNETWORKREGISTRY,GRAYED + ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED MENUITEM SEPARATOR MENUITEM "&Stampa\tCtrl+P", ID_REGISTRY_PRINT, GRAYED MENUITEM SEPARATOR @@ -242,43 +242,43 @@ END IDD_EDIT_RESOURCE_LIST DIALOGEX 32, 24, 170, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Resource List" +CAPTION "Lista Risorse" FONT 8, "MS Shell Dlg" { CONTROL "", IDC_RESOURCE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 10, 150, 75 DEFPUSHBUTTON "OK", IDOK, 27, 100, 50, 14 - PUSHBUTTON "Show...", IDC_SHOW_RESOURCE, 93, 100, 50, 14, WS_DISABLED + PUSHBUTTON "Visualizza...", IDC_SHOW_RESOURCE, 93, 100, 50, 14, WS_DISABLED } IDD_EDIT_RESOURCE DIALOGEX 6, 18, 281, 283 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Resources" +CAPTION "Risorse" FONT 8, "MS Shell Dlg" { LTEXT "DMA:", IDC_STATIC, 10, 5, 20, 8 CONTROL "", IDC_DMA_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 15, 261, 31 - LTEXT "Interrupt:", IDC_STATIC, 10, 48, 35, 8 + LTEXT "Interruzione:", IDC_STATIC, 10, 48, 35, 8 CONTROL "", IDC_IRQ_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 58, 261, 31 - LTEXT "Memory:", IDC_STATIC, 10, 91, 32, 8 + LTEXT "Memoria:", IDC_STATIC, 10, 91, 32, 8 CONTROL "", IDC_MEMORY_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 101, 261, 31 - LTEXT "Port:", IDC_STATIC, 10, 134, 38, 8 + LTEXT "Porta:", IDC_STATIC, 10, 134, 38, 8 CONTROL "", IDC_PORT_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 144, 261, 31 - LTEXT "Device specific data:", IDC_STATIC, 10, 177, 80, 8 + LTEXT "Dati specifici del dispositivo", IDC_STATIC, 10, 177, 80, 8 CONTROL "", IDC_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 188, 261, 31 - GROUPBOX "Usage", IDC_STATIC, 10, 219, 125, 39 - LTEXT "Undetermined", IDC_UNDETERMINED, 18, 230, 46, 8, WS_DISABLED - LTEXT "Shared", IDC_SHARED, 18, 240, 48, 8, WS_DISABLED - LTEXT "Device exclusive", IDC_DEVICE_EXCLUSIVE, 72, 230, 58, 8, WS_DISABLED - LTEXT "Driver exclusive", IDC_DRIVER_EXCLUSIVE, 72, 240, 54, 8, WS_DISABLED - RTEXT "Interface Type:", IDC_STATIC, 144, 220, 58, 8 + GROUPBOX "Utilizzo", IDC_STATIC, 10, 219, 125, 39 + LTEXT "Indeterminato", IDC_UNDETERMINED, 18, 230, 46, 8, WS_DISABLED + LTEXT "Condividi", IDC_SHARED, 18, 240, 48, 8, WS_DISABLED + LTEXT "Device esclusivo", IDC_DEVICE_EXCLUSIVE, 72, 230, 58, 8, WS_DISABLED + LTEXT "Driver esclusivo", IDC_DRIVER_EXCLUSIVE, 72, 240, 54, 8, WS_DISABLED + RTEXT "Tipo di interfaccia:", IDC_STATIC, 144, 220, 58, 8 LTEXT "", IDC_INTERFACETYPE, 205, 220, 66, 8 RTEXT "Bus Nummer:", IDC_STATIC, 151, 230, 51, 8 LTEXT "", IDC_BUSNUMBER, 205, 230, 66, 8 - RTEXT "Version:", IDC_STATIC, 151, 240, 51, 8 + RTEXT "Versione:", IDC_STATIC, 151, 240, 51, 8 LTEXT "", IDC_VERSION, 205, 240, 66, 8 - RTEXT "Revision:", IDC_STATIC, 151, 250, 51, 8 + RTEXT "Revisione:", IDC_STATIC, 151, 250, 51, 8 LTEXT "", IDC_REVISION, 205, 250, 66, 8 DEFPUSHBUTTON "OK",IDOK, 92, 263, 40, 14 PUSHBUTTON "&Data...", IDC_SHOW_RESOURCE_DATA, 148, 263, 40, 14, WS_DISABLED @@ -324,9 +324,9 @@ BEGIN ID_REGISTRY_EXPORTREGISTRYFILE "Esporta tutto o parte del Registro in un file di testo" ID_REGISTRY_LOADHIVE - "Loads a hive file into the registry" + "Carica un file hive nel Registro di sistema" ID_REGISTRY_UNLOADHIVE - "Unloads a hive from the registry" + "Espelle un hive dal Registro di sistema" ID_REGISTRY_CONNECTNETWORKREGISTRY "Si connette al Registro di un computer remoto" ID_REGISTRY_DISCONNECTNETWORKREGISTRY @@ -370,23 +370,23 @@ BEGIN IDS_ERR_DELETEVALUE "Impossibile cancellare tutti i valori indicati!" IDS_ERR_RENVAL_CAPTION "Errore nel rinominare il valore" IDS_ERR_RENVAL_TOEMPTY "Impossibile rinominare %s. Il nome indicato è vuoto. Riprovate con un altro nome." - IDS_QUERY_IMPORT_HIVE_CAPTION "Confirm Key Restoration" - IDS_QUERY_IMPORT_HIVE_MSG "A key will be restored on top of the currently selected key.\nAll values and subkeys of this key will be deleted.\nDo you want to continue the operation?" + IDS_QUERY_IMPORT_HIVE_CAPTION "Conferma ripristino della chiave" + IDS_QUERY_IMPORT_HIVE_MSG "Una chiave sarà ripristinata in cima alla chiave correntemente selezionata.\n Tutti i valori e le sottochiavi di questa chiave verranno eliminati.\n Si desidera continuare l'operazione?" IDS_NEW_KEY "Nuova chiave #%d" IDS_NEW_VALUE "Nuovo valore #%d" END STRINGTABLE DISCARDABLE BEGIN - IDS_BINARY_EMPTY "(valore binario di lunghezza nulla)" + IDS_BINARY_EMPTY "(valore binario di lunghezza nulla)" IDS_DEFAULT_VALUE_NAME "(predefinito)" IDS_VALUE_NOT_SET "(valore non impostato)" IDS_UNKNOWN_TYPE "Tipo sconosciuto: (0x%lx)" IDS_MY_COMPUTER "Il mio Computer" IDS_IMPORT_REG_FILE "Importa file di Registro" IDS_EXPORT_REG_FILE "Esporta file di Registro" - IDS_LOAD_HIVE "Load Hive" - IDS_UNLOAD_HIVE "Unload Hive" + IDS_LOAD_HIVE "Carica Hive" + IDS_UNLOAD_HIVE "Esplis Hive" IDS_INVALID_DWORD "(valore DWORD non valido)" END @@ -436,48 +436,48 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_IMPORT_PROMPT "Adding information can unintentionally change or delete values and cause components to stop working correctly.\nIf you do not trust the source of this information in '%s', do not add it to registry.\n\nAre you sure you want to continue?" - IDS_IMPORT_OK "The keys and values contained in '%s' have been successfully added to the registry." - IDS_IMPORT_ERROR "Cannot import '%s': Error opening the file. There may be a disk, file system error or file may not exist." - IDS_EXPORT_ERROR "Cannot export '%s': Error creating or writing to the file. There may be a disk or file system error." + IDS_IMPORT_PROMPT "Aggiungendo informazioni si possono involontariamente modificare o eliminare i valori e causare il giusto funzionamente dei componenti.\n Se non si considera attendibile la fonte di queste informazioni in '% s', non aggiungere al Registro di sistema.\n\n Si desidera continuare? " + IDS_IMPORT_OK "Le chiavi e i valori contenuti in '% s' sono stati correttamente aggiunti al Registro di sistema." + IDS_IMPORT_ERROR "Impossibile importare '% s': Errore durante l'apertura del file. Ci può essere un disco, file cdanneggiati o il file non esiste." + IDS_EXPORT_ERROR "Impossibile esportare '% s': Errore durante la creazione o la scrittura del file. Ci può essere un disco o un file di sistema danneggiato." END STRINGTABLE DISCARDABLE BEGIN IDS_BUSNUMBER "Bus Number" - IDS_INTERFACE "Interface" - IDS_DMA_CHANNEL "Channel" - IDS_DMA_PORT "Port" - IDS_INTERRUPT_VECTOR "Vector" - IDS_INTERRUPT_LEVEL "Level" - IDS_INTERRUPT_AFFINITY "Affinity" - IDS_INTERRUPT_TYPE "Type" - IDS_MEMORY_ADDRESS "Physical Address" - IDS_MEMORY_LENGTH "Length" - IDS_MEMORY_ACCESS "Access" - IDS_PORT_ADDRESS "Physical Address" - IDS_PORT_LENGTH "Length" - IDS_PORT_ACCESS "Access" - IDS_SPECIFIC_RESERVED1 "Reserved 1" - IDS_SPECIFIC_RESERVED2 "Reserved 2" - IDS_SPECIFIC_DATASIZE "Data Size" + IDS_INTERFACE "Interfaccia" + IDS_DMA_CHANNEL "Canale" + IDS_DMA_PORT "Porta" + IDS_INTERRUPT_VECTOR "Vettore" + IDS_INTERRUPT_LEVEL "Livello" + IDS_INTERRUPT_AFFINITY "Affinità" + IDS_INTERRUPT_TYPE "Tipo" + IDS_MEMORY_ADDRESS "Indirizzo fisico" + IDS_MEMORY_LENGTH "Lunghezza" + IDS_MEMORY_ACCESS "Accesso" + IDS_PORT_ADDRESS "Indirizzo fisico" + IDS_PORT_LENGTH "Lunghezza" + IDS_PORT_ACCESS "Accesso" + IDS_SPECIFIC_RESERVED1 "Riservato 1" + IDS_SPECIFIC_RESERVED2 "Riservato 2" + IDS_SPECIFIC_DATASIZE "Lunghezza dati" END STRINGTABLE DISCARDABLE BEGIN - IDS_PORT_PORT_IO "Port" - IDS_PORT_MEMORY_IO "Memory" - IDS_INTERRUPT_EDGE_SENSITIVE "Edge Sensitive" - IDS_INTERRUPT_LEVEL_SENSITIVE "Level Sensitive" - IDS_MEMORY_READ_ONLY "Read Only" - IDS_MEMORY_WRITE_ONLY "Write Only" - IDS_MEMORY_READ_WRITE "Read / Write" + IDS_PORT_PORT_IO "Porta" + IDS_PORT_MEMORY_IO "Memoria" + IDS_INTERRUPT_EDGE_SENSITIVE "Bordo Sensibile" + IDS_INTERRUPT_LEVEL_SENSITIVE "Livello Sensibile" + IDS_MEMORY_READ_ONLY "Solo lettura" + IDS_MEMORY_WRITE_ONLY "Solo scrittura" + IDS_MEMORY_READ_WRITE "Leggi / Scrivi" END STRINGTABLE DISCARDABLE BEGIN - IDS_BUS_UNDEFINED "Undefined" - IDS_BUS_INTERNAL "Internal" + IDS_BUS_UNDEFINED "Indefinito" + IDS_BUS_INTERNAL "Interno" IDS_BUS_ISA "ISA" IDS_BUS_EISA "EISA" IDS_BUS_MICROCHANNEL "MicroChannel" @@ -489,11 +489,11 @@ BEGIN IDS_BUS_CBUS "C-Bus" IDS_BUS_MPIBUS "MPI-Bus" IDS_BUS_MPSABUS "MPSA-Bus" - IDS_BUS_PROCESSORINTERNAL "Processor Internal" + IDS_BUS_PROCESSORINTERNAL "Processore Interno" IDS_BUS_INTERNALPOWERBUS "Internal Power Bus" IDS_BUS_PNPISABUS "PnP-ISA Bus" IDS_BUS_PNPBUS "PnP Bus" - IDS_BUS_UNKNOWNTYPE "Unknown Interface Type" + IDS_BUS_UNKNOWNTYPE "Tipologia interfaccia sconosciuta" END /*****************************************************************/ @@ -513,15 +513,18 @@ BEGIN EDITTEXT IDC_EXPORT_BRANCH_TEXT,30,34,335,12 END +// +// Dialog resources +// IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Load Hive" +CAPTION "Carica Hive" FONT 8, "Ms Shell Dlg" { - LTEXT "&Key:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT + LTEXT "&Chiave:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 DEFPUSHBUTTON "OK", IDOK, 140, 17, 50, 14 - PUSHBUTTON "Cancel", IDCANCEL, 89, 17, 50, 14 + PUSHBUTTON "Cancella", IDCANCEL, 89, 17, 50, 14 } IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46 diff --git a/reactos/base/applications/regedit/rsrc.rc b/reactos/base/applications/regedit/rsrc.rc index 18c7452196f..7805baa78c6 100644 --- a/reactos/base/applications/regedit/rsrc.rc +++ b/reactos/base/applications/regedit/rsrc.rc @@ -25,6 +25,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* include localised resources */ // UTF-8 #pragma code_page(65001) + #ifdef LANGUAGE_BG_BG #include "lang/bg-BG.rc" #endif diff --git a/reactos/base/applications/shutdown/lang/it-IT.rc b/reactos/base/applications/shutdown/lang/it-IT.rc index 3396e0bf775..ea1a5611718 100644 --- a/reactos/base/applications/shutdown/lang/it-IT.rc +++ b/reactos/base/applications/shutdown/lang/it-IT.rc @@ -3,27 +3,27 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL /* Dialog */ IDD_GUI DIALOGEX DISCARDABLE 0, 0, 240, 255 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Remote Shutdown" +CAPTION "Accesso remoto" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "&OK",IDC_OK,125,232,50,14 PUSHBUTTON "&Cancel",IDC_CANCEL,178,232,50,14 CTEXT "Co&mputers:", IDC_STATIC,9,9,35,36 LISTBOX IDC_COMPUTER_LIST,8,19,162,55 - PUSHBUTTON "&Add...",IDC_ADD_SYSTEM,179,19,50,14 - PUSHBUTTON "&Remove",IDC_REMOVE_SYSTEM,179,36,50,14,WS_DISABLED - PUSHBUTTON "&Browse...",IDC_BROWSE_SYSTEM,179,53,50,14 - CTEXT "Which action do you want these computers to execute?", IDC_ACTION,14,81,20,14 + PUSHBUTTON "&Aggiungi...",IDC_ADD_SYSTEM,179,19,50,14 + PUSHBUTTON "&Rimuovi...",IDC_REMOVE_SYSTEM,179,36,50,14,WS_DISABLED + PUSHBUTTON "&Naviga...",IDC_BROWSE_SYSTEM,179,53,50,14 + CTEXT "quale azione si vuole eseguire?", IDC_ACTION,14,81,20,14 COMBOBOX IDC_ACTION_TYPE,37,79,129,14,WS_TABSTOP | CBS_DROPDOWN - CHECKBOX "Warn users",IDC_WARN_USERS,178,79,50,14,BS_AUTOCHECKBOX | WS_TABSTOP - CTEXT "Display warning for",IDC_SHOW_WARN_ONE,11,99,65,14 + CHECKBOX "Avvio all'utente",IDC_WARN_USERS,178,79,50,14,BS_AUTOCHECKBOX | WS_TABSTOP + CTEXT "Visualizza avviso per",IDC_SHOW_WARN_ONE,11,99,65,14 EDITTEXT IDC_SHOW_WARN,78,97,41,14 - CTEXT "second(s)",IDC_SHOW_WARN_TWO,124,99,32,10 - GROUPBOX "Shutdown Event Tracker",IDC_STATIC,5,114,224,114 - CTEXT "Reason:",IDC_STATIC,16,130,27,8 - CHECKBOX "Planned",IDC_PLANNED,175,130,40,12,BS_AUTOCHECKBOX | WS_TABSTOP + CTEXT "secondi(s)",IDC_SHOW_WARN_TWO,124,99,32,10 + GROUPBOX "Individuazione evento di arresto",IDC_STATIC,5,114,224,114 + CTEXT "Ragione:",IDC_STATIC,16,130,27,8 + CHECKBOX "Progettato",IDC_PLANNED,175,130,40,12,BS_AUTOCHECKBOX | WS_TABSTOP COMBOBOX IDC_REASON_CODE,17,142,198,13,WS_TABSTOP | CBS_DROPDOWN - CTEXT "Comm&ent:",IDC_COMMENT_CAPTION,17,159,30,8 + CTEXT "Comm&ento:",IDC_COMMENT_CAPTION,17,159,30,8 EDITTEXT IDC_COMMENT_TEXT,17,171,198,50,WS_VSCROLL END @@ -35,69 +35,69 @@ BEGIN Usage: shutdown [/?] [/i | /l | /s | /r | /g | /a | /p | /h | /e] [/f]\n\ [/m \\\\computer][/t xxx][/d [p|u:]xx:yy [/c ""comment""]]\n\ \n\ - No arguments or /? Display this help.\n\ - /i Show the graphical user interface (GUI). This option must be the\n\ - first one.\n\ - /l Log off on the local system only. Cannot be used with /m or /d.\n\ - /s Shutdown the computer.\n\ - /r Restart the computer.\n\ - /g Restart the computer and restart all the registered applications.\n\ - /a Cancel a delayed shutdown. Can only be used during the delay\n\ - period.\n\ - /p Shutdown the local computer without any timeout or warning. Can be\n\ - used with /d or /f.\n\ - /h Hibernate the local computer. Usable with /f.\n\ - /e Document the reason for the unexpected computer shutdown.\n\ - /m \\\\computer Specify the target computer (UNC/IP address).\n\ - /t xxx Set the timeout period to xxx seconds before shutting down.\n\ - The valid range starts from 0 to 315360000 (10 years),\n\ - 30 being the default value.\n\ - /c ""comment"" Comment on the reason for shutdown or restart.\n\ - 512 characters maximum allowed.\n\ - /f Force running applications to close without warning users. If you\n\ - do not specify any other parameter, this option will also log off.\n\ - /d [p|u:]xx:yy Give the reason code for the shutdown or the restart.\n\ - p indicates that the shutdown or the restart is planned.\n\ - u indicates that the reason is defined by the user.\n\ - If neither p nor u are specified, the shutdown or the restart are\n\ - not planned.\n\ - xx is the major reason code (positive integer smaller than 256).\n\ - yy is the minor reason code (positive integer smaller than 65536).\n" + Non ci sono argomenti o/? Visualizza aiuti.\n\ + /i Mostra l'interfaccia utente grafica (GUI). Questa opzione deve essere la \n\ + prima.\n\ + /l Disconnessione dal sistema locale. Non può essere utilizzata con /m or /d.\n\ + /s Chiusura del computer.\n\ + /r Riavvio del computer.\n\ + /g Riavvio del computer e riavvio di tutte le applicazioni registrate.\n\ + /a cancellare un arresto ritardato. Può essere utilizzato solo durante il periodo\n\ + di ritardo.\n\ + /p Spegnere il computer locale senza alcun timeout o avviso. Può essere\n\ + utilizzato con /d or /f.\n\ + /h Sospensione del computer locale. Utilizzabile con /f.\n\ + /e Documento e il motivo dell'arresto del computer inatteso.\n\ + /m \\\\computer Specificare la destinazione del computer (UNC/IP address).\n\ + /t xxx Imposta il periodo di timeout di xxx secondi prima di spegnersi.\n\ + L'intervallo valido inizia 0-315360000 (10 anni),\n\ + 30 è il valore di default.\n\ + /c ""comment"" Commento sul motivo per cui spegnere o riavviare.\n\ + 512 caratteri massimi consentiti.\n\ + /f Forzare la chiusura delle applicazioni in esecuzione senza che avvertire gli utenti. Se\n\ + non è specificato un'altro parametro, questa opzione è valida anche per la disconnessione.\n\ + /d [p|u:]xx:yy Indicare il codice motivo per l'arresto o il riavvio.\n\ + p indica che l'arresto o il riavvio è previsto.\n\ + u indica che il motivo è definito dall'utente.\n\ + Se nè p nè u vengono specificati, l'arresto o il riavvio non sono\n\ + pianificati.\n\ + xx è il codice maggiore (numero intero positivo inferiore a 256).\n\ + yy è il codice minore (numero intero positivo inferiore a 65536).\n" - IDS_ERROR_SHUTDOWN_REBOOT, "ERROR: Unable to shutdown and restart at the same time.\n" - IDS_ERROR_TIMEOUT, "ERROR: Timeout value of %u is out of bounds (0-315360000).\n" - IDS_ERROR_ABORT, "ERROR: Unable to abort the shutdown of the system.\n" - IDS_ERROR_LOGOFF, "ERROR: Unable to logoff the system.\n" - IDS_ERROR_SHUTDOWN, "ERROR: Unable to shutdown the system.\n" - IDS_ERROR_RESTART, "ERROR: Unable to restart the system.\n" - IDS_ERROR_MAX_COMMENT_LENGTH, "ERROR: Comment length exceeds maximum character limit set by the system.\n" - IDS_ERROR_HIBERNATE, "ERROR: Unable to send system into hibernation mode.\n" - IDS_ERROR_HIBERNATE_LOCAL, "ERROR: Hibernation mode cannot be started remotely.\n" - IDS_ERROR_HIBERNATE_ENABLED, "ERROR: Hibernation mode is not enabled.\n" - IDS_ERROR_DIALOG_CAPTION, "Remote Shutdown" - IDS_ERROR_DIALOG_INIT, "Unable to display the graphical user interface." + IDS_ERROR_SHUTDOWN_REBOOT, "ERROR: Impossibile arrestare e riavviare al tempo stesso.\n" + IDS_ERROR_TIMEOUT, "ERROR: Il valore di timeout di u% è fuori dai limiti (0-315360000) \n" + IDS_ERROR_ABORT, "ERROR: Impossibile interrompere l'arresto del sistema \n." + IDS_ERROR_LOGOFF, "ERROR: Impossibile disconnettersi dal sistema \n" + IDS_ERROR_SHUTDOWN, "ERROR: Impossibile arrestare il sistema \n." + IDS_ERROR_RESTART, "ERROR: Impossibile riavviare il sistema \n." + IDS_ERROR_MAX_COMMENT_LENGTH, "ERROR: Lunghezza commento supera il limite massimo di caratteri impostato dal sistema \n" + IDS_ERROR_HIBERNATE, "ERROR: Impossibile avviare il sistema in modalità di sospensione. \n" + IDS_ERROR_HIBERNATE_LOCAL, "ERROR: Modalitài sospensione non può essere avviata in modalità remota \n" + IDS_ERROR_HIBERNATE_ENABLED, "ERROR: Modalità di sospensione non è abilitata \n" + IDS_ERROR_DIALOG_CAPTION, "Arresto improviso" + IDS_ERROR_DIALOG_INIT, "Impossibile visualizzare l'interfaccia utente grafica." END /* Remote shutdown action strings */ STRINGTABLE DISCARDABLE BEGIN - IDS_ACTION_SHUTDOWN, "Shutdown the system" - IDS_ACTION_RESTART, "Restart the system" - IDS_ACTION_UNEXPECTED_SHUTDOWN, "Annotate the unexpected shutdown" + IDS_ACTION_SHUTDOWN, "Esci dal sistema" + IDS_ACTION_RESTART, "Riavvia il sistema" + IDS_ACTION_UNEXPECTED_SHUTDOWN, "Arresto improviso" END /* Remote shutdown reason strings */ STRINGTABLE DISCARDABLE BEGIN - IDS_REASON_OTHER, "Other" - IDS_REASON_HARDWARE_MAINTENANCE, "Hardware: Maintenance" - IDS_REASON_HARDWARE_INSTALL, "Hardware: Installation" - IDS_REASON_OS_RECOVER, "Operating System: Recovery" - IDS_REASON_OS_RECONFIGURE, "Operating System: Reconfigure" - IDS_REASON_APP_MAINTENANCE, "Application: Maintenance" - IDS_REASON_APP_INSTALL, "Application: Installation" - IDS_REASON_APP_UNRESPONSIVE, "Application: Unresponsive" - IDS_REASON_APP_UNSTABLE, "Application: Unstable" - IDS_REASON_SECURITY, "Security Issue" - IDS_REASON_NETWORK, "Loss of network connectivity" + IDS_REASON_OTHER, "Altro" + IDS_REASON_HARDWARE_MAINTENANCE, "Hardware: Manutenzione" + IDS_REASON_HARDWARE_INSTALL, "Hardware: Installazione" + IDS_REASON_OS_RECOVER, "Sistema Operativo System: Recupero" + IDS_REASON_OS_RECONFIGURE, "Sistema Operativo: Riconfigurazione" + IDS_REASON_APP_MAINTENANCE, "Applicazione: Manutenzione" + IDS_REASON_APP_INSTALL, "Applicazione: Installazione" + IDS_REASON_APP_UNRESPONSIVE, "Applicazione: Non Risponde" + IDS_REASON_APP_UNSTABLE, "Applicazione: Instabile" + IDS_REASON_SECURITY, "Problema di sicurezza" + IDS_REASON_NETWORK, "Connetività di rete assente" END diff --git a/reactos/base/applications/sndrec32/lang/tr-TR.rc b/reactos/base/applications/sndrec32/lang/tr-TR.rc new file mode 100644 index 00000000000..7973b39b8e2 --- /dev/null +++ b/reactos/base/applications/sndrec32/lang/tr-TR.rc @@ -0,0 +1,54 @@ +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +IDC_REACTOS_SNDREC32 ACCELERATORS +BEGIN + "?", IDM_ABOUT, ASCII, ALT + "/", IDM_ABOUT, ASCII, ALT +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 196, 75 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS Ses Kaydedicisi Hakkında" +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + ICON IDI_SNDREC32,-1,19,14,21,20 + LTEXT "ReactOS Ses Kaydedicisi, sürüm 1.0",IDC_STATIC,56,16,114,8,SS_NOPREFIX + LTEXT "Tekif Hakkı - 2009",IDC_STATIC,55,25,114,8 + DEFPUSHBUTTON "&Tamam",IDOK,139,54,50,14,WS_GROUP +END + +IDR_MENU1 MENU +BEGIN + POPUP "&Kütük" + BEGIN + MENUITEM "&Yeni", ID_NEW + MENUITEM "&Aç", ID_FILE_OPEN + MENUITEM "&Kaydet", ID_FILE_SAVE, GRAYED + MENUITEM "Ay&rı Kaydet", ID_FILE_SAVEAS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Çıkış", ID_EXIT + END + MENUITEM "Yapılacak", 0 + MENUITEM "Yapılacak_2", 0 + POPUP "&Yardım" + BEGIN + MENUITEM "&Hakkında", ID__ABOUT + END +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "Ses Kaydedicisi" + IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" +END + +STRINGTABLE +BEGIN + IDS_STRPOS "Konum: %.2f s" + IDS_STRDUR "Uzunluk: %.2f s" + IDS_STRBUF "Nitelik: %.2f KB" + IDS_STRFMT "%.1f kHz, %u bitlik" + IDS_STRMONO "Tek Yol" + IDS_STRSTEREO "Çift Yol" + IDS_STRCHAN "%s" +END diff --git a/reactos/base/applications/sndrec32/rsrc.rc b/reactos/base/applications/sndrec32/rsrc.rc index 1a7a23a0e1a..41d7cc1679d 100644 --- a/reactos/base/applications/sndrec32/rsrc.rc +++ b/reactos/base/applications/sndrec32/rsrc.rc @@ -47,14 +47,17 @@ IDB_BITMAP2_STOP_DIS BITMAP "resources/but_stop_dis.bmp" #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif +#ifdef LANGUAGE_RO_RO + #include "lang/ro-RO.rc" +#endif #ifdef LANGUAGE_SK_SK #include "lang/sk-SK.rc" #endif #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif -#ifdef LANGUAGE_RO_RO - #include "lang/ro-RO.rc" +#ifdef LANGUAGE_TR_TR + #include "lang/tr-TR.rc" #endif #ifdef LANGUAGE_UK_UA #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 6831ae3b2a4..88b1f7db62f 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -1,7 +1,8 @@ /* * Turkish Resources for Wordpad * - * Copyright 2006 Fatih Aþýcý + * Copyright 2006 Fatih Aşıcı + * Copyright 2013 Erdem Ersoy (eersoy93) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,78 +21,78 @@ #include "wordpad.h" -LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT +LANGUAGE LANG_TURKISH, SUBLANG_NEUTRAL IDM_MAINMENU MENU BEGIN - POPUP "&Dosya" + POPUP "&Kütük" BEGIN - MENUITEM "&Yeni...\tCtrl+N", ID_FILE_NEW - MENUITEM "&Aç...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Yeni\tCtrl+N", ID_FILE_NEW + MENUITEM "&Aç\tCtrl+O", ID_FILE_OPEN MENUITEM "&Kaydet\tCtrl+S", ID_FILE_SAVE - MENUITEM "&Farklý Kaydet...", ID_FILE_SAVEAS + MENUITEM "Ay&rı Kaydet", ID_FILE_SAVEAS MENUITEM SEPARATOR - MENUITEM "&Print...\tCtrl+P", ID_PRINT - MENUITEM "Print previe&w...", ID_PREVIEW - MENUITEM "Pag&e setup...", ID_PRINTSETUP + MENUITEM "Ya&zdır\tCtrl+P", ID_PRINT + MENUITEM "&Baskı Önizleme", ID_PREVIEW + MENUITEM "&Sayfa Yapısı", ID_PRINTSETUP MENUITEM SEPARATOR - MENUITEM "&Çýk", ID_FILE_EXIT + MENUITEM "&Çıkış", ID_FILE_EXIT END - POPUP "&Düzen" + POPUP "&Düzen" BEGIN MENUITEM "&Geri Al\tCtrl+Z", ID_EDIT_UNDO MENUITEM "&Yinele\tCtrl+Y", ID_EDIT_REDO MENUITEM SEPARATOR - MENUITEM "Ke&s\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Kopyala\tCtrl+C", ID_EDIT_COPY - MENUITEM "Ya&pýþtýr\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Kes\tCtrl+X", ID_EDIT_CUT + MENUITEM "&ÇoÄŸalt\tCtrl+C", ID_EDIT_COPY + MENUITEM "Ya&pıştır\tCtrl+V", ID_EDIT_PASTE MENUITEM "&Sil\tDel", ID_EDIT_CLEAR - MENUITEM "&Tümünü seç\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM "&Tümünü Seç\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCtrl+F", ID_FIND - MENUITEM "Find &next\tF3", ID_FIND_NEXT - MENUITEM "&Replace...\tCtrl+H", ID_REPLACE + MENUITEM "&Ara\tCtrl+F", ID_FIND + MENUITEM "S&onrakini Ara\tF3", ID_FIND_NEXT + MENUITEM "&DeÄŸiÅŸtir\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR - MENUITEM "Salt-&okunur", ID_EDIT_READONLY - MENUITEM "&Deðiþmiþ", ID_EDIT_MODIFIED + MENUITEM "Sa< Okunur", ID_EDIT_READONLY + MENUITEM "D&eÄŸiÅŸtirilmiÅŸ", ID_EDIT_MODIFIED MENUITEM SEPARATOR - POPUP "D&iðerleri" + POPUP "D&iÄŸer Seçenekler" BEGIN - MENUITEM "Seçim &bilgisi", ID_EDIT_SELECTIONINFO - MENUITEM "Karakter bi&çimi", ID_EDIT_CHARFORMAT - MENUITEM "&Öntanýmlý kar. biçimi", ID_EDIT_DEFCHARFORMAT - MENUITEM "Paragra&f biçimi", ID_EDIT_PARAFORMAT - MENUITEM "&Metni al", ID_EDIT_GETTEXT + MENUITEM "&Seçim Bilgisi", ID_EDIT_SELECTIONINFO + MENUITEM "&Damga Biçimi", ID_EDIT_CHARFORMAT + MENUITEM "&Öntanımlı Damga Biçimi", ID_EDIT_DEFCHARFORMAT + MENUITEM "&Paragraf Biçimi", ID_EDIT_PARAFORMAT + MENUITEM "&Metni Al", ID_EDIT_GETTEXT END END - POPUP "&View" + POPUP "&Görünüm" BEGIN - MENUITEM "&Toolbar", ID_TOGGLE_TOOLBAR - MENUITEM "&Formatbar", ID_TOGGLE_FORMATBAR - MENUITEM "&Ruler", ID_TOGGLE_RULER - MENUITEM "&Statusbar", ID_TOGGLE_STATUSBAR + MENUITEM "&Araç ÇubuÄŸu", ID_TOGGLE_TOOLBAR + MENUITEM "&Biçim ÇubuÄŸu", ID_TOGGLE_FORMATBAR + MENUITEM "&Çizgilik", ID_TOGGLE_RULER + MENUITEM "&Durum ÇubuÄŸu", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR - MENUITEM "&Options...", ID_VIEWPROPERTIES + MENUITEM "A&yarlar", ID_VIEWPROPERTIES END - POPUP "&Insert" + POPUP "&Ekle" BEGIN - MENUITEM "&Date and time...", ID_DATETIME + MENUITEM "&Tarih veya Saat", ID_DATETIME END - POPUP "&Biçim" + POPUP "&Biçim" BEGIN - MENUITEM "&Font...", ID_FONTSETTINGS - MENUITEM "&Bullet points", ID_BULLET - MENUITEM "&Paragraph...", ID_PARAFORMAT - MENUITEM "&Tabs...", ID_TABSTOPS + MENUITEM "&Yazı türü", ID_FONTSETTINGS + MENUITEM "&Madde imi", ID_BULLET + MENUITEM "&Paragraf", ID_PARAFORMAT + MENUITEM "&Sekmeler", ID_TABSTOPS POPUP "&Arkaplan" BEGIN - MENUITEM "S&istem\tCtrl+1", ID_BACK_1 - MENUITEM "&Sarýmtýrak\tCtrl+2", ID_BACK_2 + MENUITEM "&Dizge Rengi\tCtrl+1", ID_BACK_1 + MENUITEM "&Sarımtırak\tCtrl+2", ID_BACK_2 END END - POPUP "&Help" + POPUP "&Yardım" BEGIN - MENUITEM "&About Wine Wordpad", ID_ABOUT + MENUITEM "&Hakkında", ID_ABOUT END END @@ -99,12 +100,12 @@ IDM_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "Ke&s", ID_EDIT_CUT - MENUITEM "&Kopyala", ID_EDIT_COPY - MENUITEM "Ya&pýþtýr", ID_EDIT_PASTE + MENUITEM "&Kes", ID_EDIT_CUT + MENUITEM "&ÇoÄŸalt", ID_EDIT_COPY + MENUITEM "&Yapıştır", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "&Bullet points", ID_BULLET - MENUITEM "&Paragraph...", ID_PARAFORMAT + MENUITEM "&Madde imi", ID_BULLET + MENUITEM "&Paragraf", ID_PARAFORMAT END END @@ -112,22 +113,154 @@ IDM_COLOR_POPUP MENU BEGIN POPUP "" BEGIN - MENUITEM "Siyah", ID_COLOR_BLACK - MENUITEM "Koyu Kýrmýzý",ID_COLOR_MAROON - MENUITEM "Yeþil", ID_COLOR_GREEN - MENUITEM "Koyu Sarý", ID_COLOR_OLIVE - MENUITEM "Koyu Mavi", ID_COLOR_NAVY - MENUITEM "Mor", ID_COLOR_PURPLE - MENUITEM "Deniz Mavisi",ID_COLOR_TEAL - MENUITEM "Gri", ID_COLOR_GRAY - MENUITEM "Gümüþ", ID_COLOR_SILVER - MENUITEM "Kýrmýzý", ID_COLOR_RED - MENUITEM "Parlak Yeþil",ID_COLOR_LIME - MENUITEM "Sarý", ID_COLOR_YELLOW - MENUITEM "Mavi", ID_COLOR_BLUE - MENUITEM "Pembe", ID_COLOR_FUCHSIA - MENUITEM "Turkuaz", ID_COLOR_AQUA - MENUITEM "Beyaz", ID_COLOR_WHITE - MENUITEM "Automatic", ID_COLOR_AUTOMATIC + MENUITEM "Kara", ID_COLOR_BLACK + MENUITEM "ViÅŸne Çürüğü", ID_COLOR_MAROON + MENUITEM "YeÅŸil", ID_COLOR_GREEN + MENUITEM "Zeytinyağı", ID_COLOR_OLIVE + MENUITEM "Deniz Mavisi", ID_COLOR_NAVY + MENUITEM "Mor", ID_COLOR_PURPLE + MENUITEM "Çamurcun", ID_COLOR_TEAL + MENUITEM "Kül Rengi", ID_COLOR_GRAY + MENUITEM "Gümüş", ID_COLOR_SILVER + MENUITEM "Al", ID_COLOR_RED + MENUITEM "Misket limonu", ID_COLOR_LIME + MENUITEM "Sarı", ID_COLOR_YELLOW + MENUITEM "Mavi", ID_COLOR_BLUE + MENUITEM "Küpe ÇiçeÄŸi", ID_COLOR_FUCHSIA + MENUITEM "Turkuaz", ID_COLOR_AQUA + MENUITEM "Beyaz", ID_COLOR_WHITE + MENUITEM "Dizge Rengi", ID_COLOR_AUTOMATIC END END + +IDD_DATETIME DIALOG 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Zaman" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Var Olan Biçimler:",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&Tamam",IDOK,87,12,40,12 + PUSHBUTTON "&Vazgeç",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Yeni" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Yeni belge türü:",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&Tamam",IDOK,97,12,40,12 + PUSHBUTTON "&Vazgeç",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Paragraf Düzeni" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Pay", -1, 10, 10, 120, 68 + LTEXT "Sol", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "SaÄŸ", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "İlk satır", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "Hizâlama", -1, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&Tamam", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Vazgeç", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Sekmeler" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Sekme Durakları", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Ekle", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Sil", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&Tamam", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Vazgeç", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "&Hepsini Sil", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG 0, 0, 280, 110 +STYLE DS_SYSMODAL +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Satır Kaydırma", -1, 10, 10, 130, 85 + RADIOBUTTON "&Kaydırma yok", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "&Pencere kenarlığına kadar", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "&ÇizgiliÄŸe kadar", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Çubuklar", -1, 150, 10, 120, 85 + CHECKBOX "&Araç ÇubuÄŸu", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "&Biçim ÇubuÄŸu", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "Ç&izgilik", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "&Durum ÇubuÄŸu", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE +BEGIN + STRING_ALL_FILES, "Tüm Kütükler (*.*)" + STRING_TEXT_FILES_TXT, "Metin Belgeleri (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Unicode Metin Belgeleri (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Zengin Metin Belgeleri (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Zengin Metin Belgesi" + STRING_NEWFILE_TXT, "Metin Belgesi" + STRING_NEWFILE_TXT_UNICODE, "Unicode Metin Belgesi" + STRING_PRINTER_FILES_PRN, "Yazıcı Dosyaları (*.PRN)" +END + +STRINGTABLE +BEGIN + STRING_ALIGN_LEFT, "Sol" + STRING_ALIGN_RIGHT, "SaÄŸ" + STRING_ALIGN_CENTER, "Orta" +END + +STRINGTABLE +BEGIN + STRING_VIEWPROPS_TITLE, "Ayarlar" + STRING_VIEWPROPS_TEXT, "Metin" + STRING_VIEWPROPS_RICHTEXT, "Zengin Metin" +END + +STRINGTABLE +BEGIN + STRING_PREVIEW_PRINT, "Yazdır" + STRING_PREVIEW_NEXTPAGE, "Sonraki Sayfa" + STRING_PREVIEW_PREVPAGE, "Önceki Sayfa" + STRING_PREVIEW_TWOPAGES, "İkili" + STRING_PREVIEW_ONEPAGE, "Tekli" + STRING_PREVIEW_ZOOMIN, "YakınlaÅŸtır" + STRING_PREVIEW_ZOOMOUT, "UzaklaÅŸtır" + STRING_PREVIEW_CLOSE, "Tamam" + STRING_PREVIEW_PAGE, "Sayfa" + STRING_PREVIEW_PAGES, "Sayfalar" + STRING_UNITS_CM, "cm" + STRING_UNITS_IN, "in" + STRING_UNITS_INCH, "inç" + STRING_UNITS_PT, "pt" +END + +STRINGTABLE +BEGIN + STRING_DEFAULT_FILENAME, "Adsız" + STRING_PROMPT_SAVE_CHANGES, "'%s' için deÄŸiÅŸiklikler kaydedilsin mi?" + STRING_SEARCH_FINISHED, "Belge araması tamamlandı." + STRING_LOAD_RICHED_FAILED, "Zengin metin kitaplığının yüklenmesi baÅŸarısız oldu." + STRING_SAVE_LOSEFORMATTING, "EÄŸer düz metin belgesi olarak kaydedilirse yapılan tüm deÄŸiÅŸiklikler kaybolacak. Devam etmek istiyor musunuz?" + STRING_INVALID_NUMBER, "Geçersiz sayı biçimi." + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE içeren belgeler desteklenmiyor." + STRING_WRITE_FAILED, "Belgenin kaydedilmesi baÅŸarısız oldu." + STRING_WRITE_ACCESS_DENIED, "Bu kütüğü kaydetme yetkiniz yok." + STRING_OPEN_FAILED, "Belgenin açılması baÅŸarısız oldu." + STRING_OPEN_ACCESS_DENIED, "Bu kütüğü açma yetkiniz yok." + STRING_PRINTING_NOT_IMPLEMENTED, "Yazdırma seçeneÄŸi daha tamamlanmadı." + STRING_MAX_TAB_STOPS, "En fazla 32 adet sekme durağı ekleyebilirsiniz." +END diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index d4357bfe1fe..0ed7ac21288 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -77,9 +77,6 @@ IDC_ZOOM CURSOR "zoom.cur" #ifdef LANGUAGE_PL_PL #include "Pl.rc" #endif -#ifdef LANGUAGE_TR_TR - #include "Tr.rc" -#endif /* UTF-8 */ #ifdef LANGUAGE_DA_DK @@ -124,6 +121,9 @@ IDC_ZOOM CURSOR "zoom.cur" #ifdef LANGUAGE_SV_SE #include "Sv.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "Tr.rc" +#endif #ifdef LANGUAGE_UK_UA #include "Uk.rc" #endif diff --git a/reactos/base/applications/write/Tr.rc b/reactos/base/applications/write/Tr.rc new file mode 100644 index 00000000000..4a2fb2e6f2c --- /dev/null +++ b/reactos/base/applications/write/Tr.rc @@ -0,0 +1,28 @@ +/* + * Turkish language support + * + * Copyright (C) 2013 Erdem Ersoy (eersoy93) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resources.h" + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +STRINGTABLE +{ + IDS_FAILED, "Zengin Metin Düzenleyicisi'nin açılması baÅŸarısız oldu." +} diff --git a/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/rsrc.rc index ec3e0649318..11ec57618f8 100644 --- a/reactos/base/applications/write/rsrc.rc +++ b/reactos/base/applications/write/rsrc.rc @@ -84,6 +84,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #ifdef LANGUAGE_SR_SP #include "Sr.rc" #endif +#ifdef LANGUAGE_TR_TR + #include "Tr.rc" +#endif #ifdef LANGUAGE_UK_UA #include "Uk.rc" #endif diff --git a/reactos/win32ss/user/user32/lang/en-US.rc b/reactos/win32ss/user/user32/lang/en-US.rc index 8f52f67ad49..d2f49c0b4c0 100644 --- a/reactos/win32ss/user/user32/lang/en-US.rc +++ b/reactos/win32ss/user/user32/lang/en-US.rc @@ -45,7 +45,7 @@ BEGIN MENUITEM "Mi&nimize", SC_MINIMIZE MENUITEM "Ma&ximize", SC_MAXIMIZE MENUITEM SEPARATOR - MENUITEM "&Close\tAlt-F4", SC_CLOSE + MENUITEM "&Close\tAlt+F4", SC_CLOSE END ///////////////////////////////////////////////////////////////////////////// diff --git a/reactos/win32ss/user/user32/lang/zh-CN.rc b/reactos/win32ss/user/user32/lang/zh-CN.rc new file mode 100644 index 00000000000..7b7641366fe --- /dev/null +++ b/reactos/win32ss/user/user32/lang/zh-CN.rc @@ -0,0 +1,75 @@ +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +///////////////////////////////////////////////////////////////////////////// +// +// Dialogs +// + +SELWINDOW DIALOGEX DISCARDABLE 20, 20, 220, 140 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | + WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "选择窗å£" +BEGIN + LISTBOX 100, 5, 5, 210, 110, LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL + PUSHBUTTON "确定(&O)", 1, 60, 120, 40, 15, BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "å–æ¶ˆ(&C)", 2, 120, 120, 40, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +///////////////////////////////////////////////////////////////////////////// +// +// Menus +// + +EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "撤销(&U)", EM_UNDO + MENUITEM SEPARATOR + MENUITEM "剪切(&t)", WM_CUT + MENUITEM "å¤åˆ¶(&C)", WM_COPY + MENUITEM "粘贴(&P)", WM_PASTE + MENUITEM "删除(&D)", WM_CLEAR + MENUITEM SEPARATOR + MENUITEM "全选(&A)", EM_SETSEL + END +END + + +SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE +BEGIN + MENUITEM "还原(&R)", SC_RESTORE + MENUITEM "移动(&M)", SC_MOVE + MENUITEM "大å°(&S)", SC_SIZE + MENUITEM "最å°åŒ–(&n)", SC_MINIMIZE + MENUITEM "最大化(&x)", SC_MAXIMIZE + MENUITEM SEPARATOR + MENUITEM "关闭(&C)\tAlt+F4", SC_CLOSE +END + +///////////////////////////////////////////////////////////////////////////// +// +// Strings +// + +STRINGTABLE +BEGIN + IDS_ERROR, "错误" + IDS_OK, "确定" + IDS_CANCEL, "å–æ¶ˆ" + IDS_ABORT, "中止(&A)" + IDS_RETRY, "é‡è¯•(&R)" + IDS_IGNORE, "忽略(&I)" + IDS_YES, "是(&Y)" + IDS_NO, "å¦(&N)" + IDS_HELP, "帮助" + IDS_TRYAGAIN, "é‡è¯•(&T)" + IDS_CONTINUE, "ç»§ç»­(&C)" +END + +STRINGTABLE +BEGIN + IDS_MDI_MOREWINDOWS, "更多窗å£(&M)..." +END + diff --git a/reactos/win32ss/user/user32/user32.rc b/reactos/win32ss/user/user32/user32.rc index 3bc29059a9e..36e098430b4 100644 --- a/reactos/win32ss/user/user32/user32.rc +++ b/reactos/win32ss/user/user32/user32.rc @@ -179,9 +179,12 @@ OBM_OLD_CLOSE BITMAP "resources/obm_old_close.bmp" #ifdef LANGUAGE_SV_SE #include "lang/sv-SE.rc" #endif -#ifdef LANGUAGE_UK_UA - #include "lang/uk-UA.rc" -#endif #ifdef LANGUAGE_TR_TR #include "lang/tr-TR.rc" #endif +#ifdef LANGUAGE_UK_UA + #include "lang/uk-UA.rc" +#endif +#ifdef LANGUAGE_ZH_CN + #include "lang/zh-CN.rc" +#endif From 5d35e2e644315b31cf8fb43051dcd80a6d5d8416 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 23 Mar 2013 05:37:05 +0000 Subject: [PATCH 53/74] [LIBSAMPLERATE] Revert r58582, fix MSVC build. svn path=/trunk/; revision=58584 --- reactos/lib/3rdparty/libsamplerate/config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/lib/3rdparty/libsamplerate/config.h b/reactos/lib/3rdparty/libsamplerate/config.h index 8f7fd4f9689..0a9f06c6984 100644 --- a/reactos/lib/3rdparty/libsamplerate/config.h +++ b/reactos/lib/3rdparty/libsamplerate/config.h @@ -96,10 +96,10 @@ /* #undef HAVE_LIBM */ /* Define if you have C99's lrint function. */ -#define HAVE_LRINT 1 +/* #undef HAVE_LRINT */ /* Define if you have C99's lrintf function. */ -#define HAVE_LRINTF 1 +/* #undef HAVE_LRINTF */ /* Define to 1 if you have the `malloc' function. */ #define HAVE_MALLOC 1 From 43fd991656fed2cc26366949158249ce121550f8 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 23 Mar 2013 05:48:04 +0000 Subject: [PATCH 54/74] Put newline at end of Italian file. svn path=/trunk/; revision=58585 --- reactos/base/applications/dxdiag/lang/it-IT.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/dxdiag/lang/it-IT.rc b/reactos/base/applications/dxdiag/lang/it-IT.rc index b476598d74c..4c7a254fb01 100644 --- a/reactos/base/applications/dxdiag/lang/it-IT.rc +++ b/reactos/base/applications/dxdiag/lang/it-IT.rc @@ -223,4 +223,4 @@ BEGIN IDS_OPTION_NO "No" IDS_D3DTEST_DESCRIPTION "Avviare il test dell'interfaccia Direct3D. Continuare?" IDS_D3DTEST_D3Dx "Questo test utilizza accelerazione hardware dell'interfaccia Direct3D % u." -END \ No newline at end of file +END From 5d0dc7b5882f873fd9c81adf42140984677d4147 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 23 Mar 2013 10:35:27 +0000 Subject: [PATCH 55/74] [OLE32] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58586 --- reactos/dll/win32/ole32/compobj.c | 150 +++++++++++---------- reactos/dll/win32/ole32/compositemoniker.c | 12 +- reactos/dll/win32/ole32/defaulthandler.c | 2 +- reactos/dll/win32/ole32/moniker.c | 2 +- reactos/dll/win32/ole32/ole2.c | 117 ++++++++-------- reactos/dll/win32/ole32/pointermoniker.c | 2 +- reactos/dll/win32/ole32/rpc.c | 47 +++---- reactos/dll/win32/ole32/storage32.c | 4 +- reactos/dll/win32/ole32/usrmarshal.c | 8 +- reactos/media/doc/README.WINE | 2 +- 10 files changed, 173 insertions(+), 173 deletions(-) diff --git a/reactos/dll/win32/ole32/compobj.c b/reactos/dll/win32/ole32/compobj.c index f23468409bb..4b3ae49f566 100644 --- a/reactos/dll/win32/ole32/compobj.c +++ b/reactos/dll/win32/ole32/compobj.c @@ -818,14 +818,17 @@ static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay) real_delay = 0; } - if (!real_delay || (entry->unload_time && (entry->unload_time < GetTickCount()))) + if (!real_delay || (entry->unload_time && ((int)(GetTickCount() - entry->unload_time) > 0))) { list_remove(&entry->entry); COMPOBJ_DllList_ReleaseRef(entry->dll, TRUE); HeapFree(GetProcessHeap(), 0, entry); } else + { entry->unload_time = GetTickCount() + real_delay; + if (!entry->unload_time) entry->unload_time = 1; + } } else if (entry->unload_time) entry->unload_time = 0; @@ -2035,8 +2038,11 @@ HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID) *ppszProgID = CoTaskMemAlloc(progidlen * sizeof(WCHAR)); if (*ppszProgID) { - if (RegQueryValueW(hkey, NULL, *ppszProgID, &progidlen)) + if (RegQueryValueW(hkey, NULL, *ppszProgID, &progidlen)) { ret = REGDB_E_CLASSNOTREG; + CoTaskMemFree(*ppszProgID); + *ppszProgID = NULL; + } } else ret = E_OUTOFMEMORY; @@ -2732,83 +2738,82 @@ HRESULT WINAPI CoResumeClassObjects(void) * CoGetClassObject() */ HRESULT WINAPI CoCreateInstance( - REFCLSID rclsid, - LPUNKNOWN pUnkOuter, - DWORD dwClsContext, - REFIID iid, - LPVOID *ppv) + REFCLSID rclsid, + LPUNKNOWN pUnkOuter, + DWORD dwClsContext, + REFIID iid, + LPVOID *ppv) { - HRESULT hres; - LPCLASSFACTORY lpclf = 0; - APARTMENT *apt; + HRESULT hres; + LPCLASSFACTORY lpclf = 0; + APARTMENT *apt; - TRACE("(rclsid=%s, pUnkOuter=%p, dwClsContext=%08x, riid=%s, ppv=%p)\n", debugstr_guid(rclsid), - pUnkOuter, dwClsContext, debugstr_guid(iid), ppv); + TRACE("(rclsid=%s, pUnkOuter=%p, dwClsContext=%08x, riid=%s, ppv=%p)\n", debugstr_guid(rclsid), + pUnkOuter, dwClsContext, debugstr_guid(iid), ppv); - /* - * Sanity check - */ - if (ppv==0) - return E_POINTER; + if (ppv==0) + return E_POINTER; - /* - * Initialize the "out" parameter - */ - *ppv = 0; + *ppv = 0; - if (!(apt = COM_CurrentApt())) - { - if (!(apt = apartment_find_multi_threaded())) + if (!(apt = COM_CurrentApt())) { - ERR("apartment not initialised\n"); - return CO_E_NOTINITIALIZED; - } - apartment_release(apt); - } - - /* - * The Standard Global Interface Table (GIT) object is a process-wide singleton. - * Rather than create a class factory, we can just check for it here - */ - if (IsEqualIID(rclsid, &CLSID_StdGlobalInterfaceTable)) { - if (StdGlobalInterfaceTableInstance == NULL) - StdGlobalInterfaceTableInstance = StdGlobalInterfaceTable_Construct(); - hres = IGlobalInterfaceTable_QueryInterface( (IGlobalInterfaceTable*) StdGlobalInterfaceTableInstance, iid, ppv); - if (hres) return hres; - - TRACE("Retrieved GIT (%p)\n", *ppv); - return S_OK; - } - - if (IsEqualCLSID(rclsid, &CLSID_ManualResetEvent)) - return ManualResetEvent_Construct(pUnkOuter, iid, ppv); - - /* - * Get a class factory to construct the object we want. - */ - hres = CoGetClassObject(rclsid, - dwClsContext, - NULL, - &IID_IClassFactory, - (LPVOID)&lpclf); - - if (FAILED(hres)) - return hres; - - /* - * Create the object and don't forget to release the factory - */ - hres = IClassFactory_CreateInstance(lpclf, pUnkOuter, iid, ppv); - IClassFactory_Release(lpclf); - if(FAILED(hres)) + if (!(apt = apartment_find_multi_threaded())) { - if (hres == CLASS_E_NOAGGREGATION && pUnkOuter) - FIXME("Class %s does not support aggregation\n", debugstr_guid(rclsid)); - else - FIXME("no instance created for interface %s of class %s, hres is 0x%08x\n", debugstr_guid(iid), debugstr_guid(rclsid),hres); + ERR("apartment not initialised\n"); + return CO_E_NOTINITIALIZED; } + apartment_release(apt); + } - return hres; + /* + * The Standard Global Interface Table (GIT) object is a process-wide singleton. + * Rather than create a class factory, we can just check for it here + */ + if (IsEqualIID(rclsid, &CLSID_StdGlobalInterfaceTable)) + { + if (StdGlobalInterfaceTableInstance == NULL) + StdGlobalInterfaceTableInstance = StdGlobalInterfaceTable_Construct(); + hres = IGlobalInterfaceTable_QueryInterface((IGlobalInterfaceTable*)StdGlobalInterfaceTableInstance, + iid, + ppv); + if (hres) return hres; + + TRACE("Retrieved GIT (%p)\n", *ppv); + return S_OK; + } + + if (IsEqualCLSID(rclsid, &CLSID_ManualResetEvent)) + return ManualResetEvent_Construct(pUnkOuter, iid, ppv); + + /* + * Get a class factory to construct the object we want. + */ + hres = CoGetClassObject(rclsid, + dwClsContext, + NULL, + &IID_IClassFactory, + (LPVOID)&lpclf); + + if (FAILED(hres)) + return hres; + + /* + * Create the object and don't forget to release the factory + */ + hres = IClassFactory_CreateInstance(lpclf, pUnkOuter, iid, ppv); + IClassFactory_Release(lpclf); + if (FAILED(hres)) + { + if (hres == CLASS_E_NOAGGREGATION && pUnkOuter) + FIXME("Class %s does not support aggregation\n", debugstr_guid(rclsid)); + else + FIXME("no instance created for interface %s of class %s, hres is 0x%08x\n", + debugstr_guid(iid), + debugstr_guid(rclsid),hres); + } + + return hres; } /*********************************************************************** @@ -3876,6 +3881,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, if (res == WAIT_OBJECT_0 + cHandles) /* messages available */ { MSG msg; + int count = 0; /* call message filter */ @@ -3905,7 +3911,9 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, } } - while (COM_PeekMessage(apt, &msg)) + /* some apps (e.g. Visio 2010) don't handle WM_PAINT properly and loop forever, + * so after processing 100 messages we go back to checking the wait handles */ + while (count++ < 100 && COM_PeekMessage(apt, &msg)) { TRACE("received message whilst waiting for RPC: 0x%04x\n", msg.message); TranslateMessage(&msg); diff --git a/reactos/dll/win32/ole32/compositemoniker.c b/reactos/dll/win32/ole32/compositemoniker.c index 8088d953976..a010e4fa7ff 100644 --- a/reactos/dll/win32/ole32/compositemoniker.c +++ b/reactos/dll/win32/ole32/compositemoniker.c @@ -1641,10 +1641,10 @@ static const IEnumMonikerVtbl VT_EnumMonikerImpl = ******************************************************************************/ static HRESULT EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker, ULONG tabSize, - ULONG currentPos, BOOL leftToRigth, IEnumMoniker ** ppmk) + ULONG currentPos, BOOL leftToRight, IEnumMoniker ** ppmk) { EnumMonikerImpl* newEnumMoniker; - int i; + ULONG i; if (currentPos > tabSize) return E_INVALIDARG; @@ -1668,17 +1668,17 @@ EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker, ULONG tabSize, return E_OUTOFMEMORY; } - if (leftToRigth) + if (leftToRight) for (i=0;itabMoniker[i]=tabMoniker[i]; IMoniker_AddRef(tabMoniker[i]); } else - for (i=tabSize-1;i>=0;i--){ + for (i = tabSize; i > 0; i--){ - newEnumMoniker->tabMoniker[tabSize-i-1]=tabMoniker[i]; - IMoniker_AddRef(tabMoniker[i]); + newEnumMoniker->tabMoniker[tabSize-i]=tabMoniker[i - 1]; + IMoniker_AddRef(tabMoniker[i - 1]); } *ppmk=&newEnumMoniker->IEnumMoniker_iface; diff --git a/reactos/dll/win32/ole32/defaulthandler.c b/reactos/dll/win32/ole32/defaulthandler.c index 0b3db7ad50b..f1ca02b91ff 100644 --- a/reactos/dll/win32/ole32/defaulthandler.c +++ b/reactos/dll/win32/ole32/defaulthandler.c @@ -1325,7 +1325,7 @@ static HRESULT WINAPI DefaultHandler_Run( release_delegates(This); - hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_ALL, + hr = CoCreateInstance(&This->clsid, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, &IID_IOleObject, (void **)&This->pOleDelegate); if (FAILED(hr)) return hr; diff --git a/reactos/dll/win32/ole32/moniker.c b/reactos/dll/win32/ole32/moniker.c index 4e3d46c5c66..9de947caf4b 100644 --- a/reactos/dll/win32/ole32/moniker.c +++ b/reactos/dll/win32/ole32/moniker.c @@ -149,7 +149,7 @@ static BOOL start_rpcss(void) strcatW( cmd, rpcss ); Wow64DisableWow64FsRedirection( &redir ); - rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); + rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi ); Wow64RevertWow64FsRedirection( redir ); if (rslt) diff --git a/reactos/dll/win32/ole32/ole2.c b/reactos/dll/win32/ole32/ole2.c index 851bbeae3fa..70da8a461db 100644 --- a/reactos/dll/win32/ole32/ole2.c +++ b/reactos/dll/win32/ole32/ole2.c @@ -1880,11 +1880,11 @@ HOLEMENU WINAPI OleCreateMenuDescriptor( * Destroy the shared menu descriptor */ HRESULT WINAPI OleDestroyMenuDescriptor( - HOLEMENU hmenuDescriptor) + HOLEMENU hmenuDescriptor) { - if ( hmenuDescriptor ) - GlobalFree( hmenuDescriptor ); - return S_OK; + if ( hmenuDescriptor ) + GlobalFree( hmenuDescriptor ); + return S_OK; } /*********************************************************************** @@ -1908,72 +1908,73 @@ HRESULT WINAPI OleDestroyMenuDescriptor( * these are non null. */ HRESULT WINAPI OleSetMenuDescriptor( - HOLEMENU hOleMenu, - HWND hwndFrame, - HWND hwndActiveObject, - LPOLEINPLACEFRAME lpFrame, - LPOLEINPLACEACTIVEOBJECT lpActiveObject) + HOLEMENU hOleMenu, + HWND hwndFrame, + HWND hwndActiveObject, + LPOLEINPLACEFRAME lpFrame, + LPOLEINPLACEACTIVEOBJECT lpActiveObject) { - OleMenuDescriptor *pOleMenuDescriptor = NULL; + OleMenuDescriptor *pOleMenuDescriptor = NULL; - /* Check args */ - if ( !hwndFrame || (hOleMenu && !hwndActiveObject) ) - return E_INVALIDARG; + /* Check args */ + if ( !hwndFrame || (hOleMenu && !hwndActiveObject) ) + return E_INVALIDARG; - if ( lpFrame || lpActiveObject ) - { - FIXME("(%p, %p, %p, %p, %p), Context sensitive help filtering not implemented!\n", - hOleMenu, - hwndFrame, - hwndActiveObject, - lpFrame, - lpActiveObject); - } + if ( lpFrame || lpActiveObject ) + { + FIXME("(%p, %p, %p, %p, %p), Context sensitive help filtering not implemented!\n", + hOleMenu, + hwndFrame, + hwndActiveObject, + lpFrame, + lpActiveObject); + } - /* Set up a message hook to intercept the containers frame window messages. - * The message filter is responsible for dispatching menu messages from the - * shared menu which are intended for the object. - */ + /* Set up a message hook to intercept the containers frame window messages. + * The message filter is responsible for dispatching menu messages from the + * shared menu which are intended for the object. + */ - if ( hOleMenu ) /* Want to install dispatching code */ - { - /* If OLEMenu hooks are already installed for this thread, fail - * Note: This effectively means that OleSetMenuDescriptor cannot - * be called twice in succession on the same frame window - * without first calling it with a null hOleMenu to uninstall */ - if ( OLEMenu_IsHookInstalled( GetCurrentThreadId() ) ) - return E_FAIL; + if ( hOleMenu ) /* Want to install dispatching code */ + { + /* If OLEMenu hooks are already installed for this thread, fail + * Note: This effectively means that OleSetMenuDescriptor cannot + * be called twice in succession on the same frame window + * without first calling it with a null hOleMenu to uninstall + */ + if ( OLEMenu_IsHookInstalled( GetCurrentThreadId() ) ) + return E_FAIL; - /* Get the menu descriptor */ - pOleMenuDescriptor = GlobalLock( hOleMenu ); - if ( !pOleMenuDescriptor ) - return E_UNEXPECTED; + /* Get the menu descriptor */ + pOleMenuDescriptor = GlobalLock( hOleMenu ); + if ( !pOleMenuDescriptor ) + return E_UNEXPECTED; - /* Update the menu descriptor */ - pOleMenuDescriptor->hwndFrame = hwndFrame; - pOleMenuDescriptor->hwndActiveObject = hwndActiveObject; + /* Update the menu descriptor */ + pOleMenuDescriptor->hwndFrame = hwndFrame; + pOleMenuDescriptor->hwndActiveObject = hwndActiveObject; - GlobalUnlock( hOleMenu ); - pOleMenuDescriptor = NULL; + GlobalUnlock( hOleMenu ); + pOleMenuDescriptor = NULL; - /* Add a menu descriptor windows property to the frame window */ - SetPropW( hwndFrame, prop_olemenuW, hOleMenu ); + /* Add a menu descriptor windows property to the frame window */ + SetPropW( hwndFrame, prop_olemenuW, hOleMenu ); - /* Install thread scope message hooks for WH_GETMESSAGE and WH_CALLWNDPROC */ - if ( !OLEMenu_InstallHooks( GetCurrentThreadId() ) ) - return E_FAIL; - } - else /* Want to uninstall dispatching code */ - { - /* Uninstall the hooks */ - if ( !OLEMenu_UnInstallHooks( GetCurrentThreadId() ) ) - return E_FAIL; + /* Install thread scope message hooks for WH_GETMESSAGE and WH_CALLWNDPROC */ + if ( !OLEMenu_InstallHooks( GetCurrentThreadId() ) ) + return E_FAIL; + } + else /* Want to uninstall dispatching code */ + { + /* Uninstall the hooks */ + if ( !OLEMenu_UnInstallHooks( GetCurrentThreadId() ) ) + return E_FAIL; - /* Remove the menu descriptor property from the frame window */ - RemovePropW( hwndFrame, prop_olemenuW ); - } + /* Remove the menu descriptor property from the frame window */ + RemovePropW( hwndFrame, prop_olemenuW ); + } - return S_OK; + return S_OK; } /****************************************************************************** diff --git a/reactos/dll/win32/ole32/pointermoniker.c b/reactos/dll/win32/ole32/pointermoniker.c index 436d6e25edd..2a0a80d3e7f 100644 --- a/reactos/dll/win32/ole32/pointermoniker.c +++ b/reactos/dll/win32/ole32/pointermoniker.c @@ -632,7 +632,7 @@ static HRESULT WINAPI PointerMonikerCF_CreateInstance(LPCLASSFACTORY iface, if (FAILED(hr)) return hr; - hr = IMoniker_QueryInterface(pMoniker, riid, ppv); + hr = IMoniker_QueryInterface(pMoniker, riid, ppv); if (FAILED(hr)) IMoniker_Release(pMoniker); diff --git a/reactos/dll/win32/ole32/rpc.c b/reactos/dll/win32/ole32/rpc.c index 238bfbba1b5..5839d0df1ed 100644 --- a/reactos/dll/win32/ole32/rpc.c +++ b/reactos/dll/win32/ole32/rpc.c @@ -1683,7 +1683,7 @@ static HRESULT create_server(REFCLSID rclsid, HANDLE *process) /* FIXME: Win2003 supports a ServerExecutable value that is passed into * CreateProcess */ - if (!CreateProcessW(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) { + if (!CreateProcessW(NULL, command, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)) { WARN("failed to run local server %s\n", debugstr_w(command)); return HRESULT_FROM_WIN32(GetLastError()); } @@ -1880,7 +1880,7 @@ struct local_server_params { CLSID clsid; IStream *stream; - HANDLE ready_event; + HANDLE pipe; HANDLE stop_event; HANDLE thread; BOOL multi_use; @@ -1901,7 +1901,7 @@ static DWORD WINAPI local_server_thread(LPVOID param) ULONG res; BOOL multi_use = lsp->multi_use; OVERLAPPED ovl; - HANDLE pipe_event, hPipe, new_pipe; + HANDLE pipe_event, hPipe = lsp->pipe, new_pipe; DWORD bytes; TRACE("Starting threader for %s.\n",debugstr_guid(&lsp->clsid)); @@ -1910,18 +1910,6 @@ static DWORD WINAPI local_server_thread(LPVOID param) get_localserver_pipe_name(pipefn, &lsp->clsid); ovl.hEvent = pipe_event = CreateEventW(NULL, FALSE, FALSE, NULL); - hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, - 4096, 4096, 500 /* 0.5 second timeout */, NULL ); - if (hPipe == INVALID_HANDLE_VALUE) - { - FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError()); - CloseHandle(pipe_event); - return 1; - } - - SetEvent(lsp->ready_event); - while (1) { if (!ConnectNamedPipe(hPipe, &ovl)) { @@ -2011,8 +1999,9 @@ static DWORD WINAPI local_server_thread(LPVOID param) /* starts listening for a local server */ HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, void **registration) { - DWORD tid; + DWORD tid, err; struct local_server_params *lsp; + WCHAR pipefn[100]; lsp = HeapAlloc(GetProcessHeap(), 0, sizeof(*lsp)); if (!lsp) @@ -2021,34 +2010,36 @@ HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, vo lsp->clsid = *clsid; lsp->stream = stream; IStream_AddRef(stream); - lsp->ready_event = CreateEventW(NULL, FALSE, FALSE, NULL); - if (!lsp->ready_event) - { - HeapFree(GetProcessHeap(), 0, lsp); - return HRESULT_FROM_WIN32(GetLastError()); - } lsp->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL); if (!lsp->stop_event) { - CloseHandle(lsp->ready_event); HeapFree(GetProcessHeap(), 0, lsp); return HRESULT_FROM_WIN32(GetLastError()); } lsp->multi_use = multi_use; + get_localserver_pipe_name(pipefn, &lsp->clsid); + lsp->pipe = CreateNamedPipeW(pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + 4096, 4096, 500 /* 0.5 second timeout */, NULL); + if (lsp->pipe == INVALID_HANDLE_VALUE) + { + err = GetLastError(); + FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError()); + CloseHandle(lsp->stop_event); + HeapFree(GetProcessHeap(), 0, lsp); + return HRESULT_FROM_WIN32(err); + } + lsp->thread = CreateThread(NULL, 0, local_server_thread, lsp, 0, &tid); if (!lsp->thread) { - CloseHandle(lsp->ready_event); + CloseHandle(lsp->pipe); CloseHandle(lsp->stop_event); HeapFree(GetProcessHeap(), 0, lsp); return HRESULT_FROM_WIN32(GetLastError()); } - WaitForSingleObject(lsp->ready_event, INFINITE); - CloseHandle(lsp->ready_event); - lsp->ready_event = NULL; - *registration = lsp; return S_OK; } diff --git a/reactos/dll/win32/ole32/storage32.c b/reactos/dll/win32/ole32/storage32.c index 69a7f8c8e08..a3c7435c02a 100644 --- a/reactos/dll/win32/ole32/storage32.c +++ b/reactos/dll/win32/ole32/storage32.c @@ -1767,7 +1767,7 @@ static HRESULT WINAPI StorageBaseImpl_CopyTo( StorageBaseImpl *This = impl_from_IStorage(iface); BOOL skip_storage = FALSE, skip_stream = FALSE; - int i; + DWORD i; TRACE("(%p, %d, %p, %p, %p)\n", iface, ciidExclude, rgiidExclude, @@ -2822,7 +2822,7 @@ static HRESULT StorageImpl_Construct( { ULONG current_block = This->extBigBlockDepotStart; ULONG cache_size = This->extBigBlockDepotCount * 2; - int i; + ULONG i; This->extBigBlockDepotLocations = HeapAlloc(GetProcessHeap(), 0, sizeof(ULONG) * cache_size); if (!This->extBigBlockDepotLocations) diff --git a/reactos/dll/win32/ole32/usrmarshal.c b/reactos/dll/win32/ole32/usrmarshal.c index b8ec9897b50..0c61b4f2324 100644 --- a/reactos/dll/win32/ole32/usrmarshal.c +++ b/reactos/dll/win32/ole32/usrmarshal.c @@ -2360,8 +2360,8 @@ HRESULT CALLBACK IMoniker_BindToStorage_Proxy( REFIID riid, void **ppvObj) { - FIXME(":stub\n"); - return E_NOTIMPL; + TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj); + return IMoniker_RemoteBindToStorage_Proxy(This, pbc, pmkToLeft, riid, (IUnknown**)ppvObj); } HRESULT __RPC_STUB IMoniker_BindToStorage_Stub( @@ -2371,8 +2371,8 @@ HRESULT __RPC_STUB IMoniker_BindToStorage_Stub( REFIID riid, IUnknown **ppvObj) { - FIXME(":stub\n"); - return E_NOTIMPL; + TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj); + return IMoniker_BindToStorage(This, pbc, pmkToLeft, riid, (void**)ppvObj); } HRESULT CALLBACK IEnumString_Next_Proxy( diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f2f3e7aad9b..901b6c185d5 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -130,7 +130,7 @@ reactos/dll/win32/ntprint # Synced to Wine-1.5.4 reactos/dll/win32/objsel # Synced to Wine-1.5.19 reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. reactos/dll/win32/odbccp32 # Synced to Wine-1.5.19 -reactos/dll/win32/ole32 # Synced to Wine-1.5.19 +reactos/dll/win32/ole32 # Synced to Wine-1.5.26 reactos/dll/win32/oleacc # Autosync reactos/dll/win32/oleaut32 # Synced to Wine-1.5.19 reactos/dll/win32/olecli32 # Synced to Wine-1.5.19 From a85aee22bcf6307359809c7a4b30c902e2390657 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 23 Mar 2013 10:35:40 +0000 Subject: [PATCH 56/74] [OLE32_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58587 --- rostests/winetests/ole32/clipboard.c | 16 +- rostests/winetests/ole32/compobj.c | 24 ++- rostests/winetests/ole32/defaulthandler.c | 202 +++++++++++++++++++++- rostests/winetests/ole32/dragdrop.c | 15 +- rostests/winetests/ole32/errorinfo.c | 13 +- rostests/winetests/ole32/hglobalstream.c | 13 +- rostests/winetests/ole32/marshal.c | 25 ++- rostests/winetests/ole32/moniker.c | 24 ++- rostests/winetests/ole32/ole2.c | 29 +++- rostests/winetests/ole32/propvariant.c | 16 +- rostests/winetests/ole32/stg_prop.c | 14 +- rostests/winetests/ole32/storage32.c | 18 +- rostests/winetests/ole32/testlist.c | 5 +- rostests/winetests/ole32/usrmarshal.c | 16 +- 14 files changed, 354 insertions(+), 76 deletions(-) diff --git a/rostests/winetests/ole32/clipboard.c b/rostests/winetests/ole32/clipboard.c index 5a160324af9..ca391313ef2 100644 --- a/rostests/winetests/ole32/clipboard.c +++ b/rostests/winetests/ole32/clipboard.c @@ -18,18 +18,24 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #define NONAMELESSUNION -#include +//#include #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" +#include +#include +#include +#include +//#include "objbase.h" -#include "wine/test.h" +#include #define InitFormatEtc(fe, cf, med) \ {\ diff --git a/rostests/winetests/ole32/compobj.c b/rostests/winetests/ole32/compobj.c index 531018da28e..95bbc4310c2 100644 --- a/rostests/winetests/ole32/compobj.c +++ b/rostests/winetests/ole32/compobj.c @@ -18,22 +18,28 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #include -#include "windef.h" -#include "winbase.h" +#include +#include +#include #define USE_COM_CONTEXT_DEF -#include "initguid.h" -#include "objbase.h" -#include "shlguid.h" -#include "urlmon.h" /* for CLSID_FileProtocol */ +//#include "initguid.h" +//#include "objbase.h" +//#include "shlguid.h" +#include +//#include "urlmon.h" /* for CLSID_FileProtocol */ -#include "ctxtcall.h" +#include -#include "wine/test.h" +#include extern const IID GUID_NULL; @@ -709,7 +715,7 @@ static void test_CoRegisterPSClsid(void) CLSID clsid; hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer); - ok(hr == CO_E_NOTINITIALIZED, "CoRegisterPSClsid should have returened CO_E_NOTINITIALIZED instead of 0x%08x\n", hr); + ok(hr == CO_E_NOTINITIALIZED, "CoRegisterPSClsid should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr); pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); diff --git a/rostests/winetests/ole32/defaulthandler.c b/rostests/winetests/ole32/defaulthandler.c index a6469b709e5..e0265cc9419 100644 --- a/rostests/winetests/ole32/defaulthandler.c +++ b/rostests/winetests/ole32/defaulthandler.c @@ -18,17 +18,61 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE -#include +//#include +#include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" +#include +#include +#include +//#include "objbase.h" -#include "wine/test.h" +#include +#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + expect_ ## func = TRUE + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +DEFINE_EXPECT(CF_QueryInterface_ClassFactory); +DEFINE_EXPECT(CF_CreateInstance); + +static const char *debugstr_guid(REFIID riid) +{ + static char buf[50]; + + sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], + riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], + riid->Data4[5], riid->Data4[6], riid->Data4[7]); + + return buf; +} static HRESULT create_storage(IStorage **stg) { @@ -100,11 +144,159 @@ static void test_olestream(void) IStorage_Release(stg); } +static HRESULT WINAPI test_class_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(riid, &IID_IUnknown)) { + *ppv = iface; + return S_OK; + }else if(IsEqualGUID(riid, &IID_IOleObject)) { + ok(0, "unexpected query for IOleObject interface\n"); + *ppv = NULL; + return E_NOINTERFACE; + } + + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI test_class_AddRef(IUnknown *iface) +{ + return 2; +} + +static ULONG WINAPI test_class_Release(IUnknown *iface) +{ + return 1; +} + +static IUnknownVtbl test_class_vtbl = { + test_class_QueryInterface, + test_class_AddRef, + test_class_Release, +}; + +static IUnknown test_class = { &test_class_vtbl }; + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(riid, &IID_IUnknown)) { + *ppv = iface; + return S_OK; + }else if(IsEqualGUID(riid, &IID_IMarshal)) { + *ppv = NULL; + return E_NOINTERFACE; + }else if(IsEqualGUID(riid, &IID_IClassFactory)) { + CHECK_EXPECT(CF_QueryInterface_ClassFactory); + *ppv = iface; + return S_OK; + } + + ok(0, "unexpected interface: %s\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + return 2; +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, + IUnknown *pUnkOuter, REFIID riid, void **ppv) +{ + CHECK_EXPECT(CF_CreateInstance); + + ok(pUnkOuter == NULL, "pUnkOuter != NULL\n"); + todo_wine ok(IsEqualGUID(riid, &IID_IUnknown), "riid = %s\n", debugstr_guid(riid)); + if(IsEqualGUID(riid, &IID_IOleObject)) { + *ppv = NULL; + return E_NOINTERFACE; + } + + *ppv = &test_class; + return S_OK; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static IClassFactoryVtbl ClassFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +static IClassFactory ClassFactory = { &ClassFactoryVtbl }; + +static void test_default_handler_run(void) +{ + const CLSID test_server_clsid = {0x0f77e570,0x80c3,0x11e2,{0x9e,0x96,0x08,0x00,0x20,0x0c,0x9a,0x66}}; + + IUnknown *unk; + IRunnableObject *ro; + DWORD class_reg; + HRESULT hres; + + if(!GetProcAddress(GetModuleHandle("ole32"), "CoRegisterSurrogateEx")) { + win_skip("skipping OleCreateDefaultHandler tests\n"); + return; + } + + hres = CoRegisterClassObject(&test_server_clsid, (IUnknown*)&ClassFactory, + CLSCTX_INPROC_SERVER, 0, &class_reg); + ok(hres == S_OK, "CoRegisterClassObject failed: %x\n", hres); + + hres = OleCreateDefaultHandler(&test_server_clsid, NULL, &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "OleCreateDefaultHandler failed: %x\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&ro); + ok(hres == S_OK, "QueryInterface(IRunnableObject) failed: %x\n", hres); + IUnknown_Release(unk); + + hres = IRunnableObject_Run(ro, NULL); + ok(hres == REGDB_E_CLASSNOTREG, "Run returned: %x, expected REGDB_E_CLASSNOTREG\n", hres); + IRunnableObject_Release(ro); + + CoRevokeClassObject(class_reg); + + hres = CoRegisterClassObject(&test_server_clsid, (IUnknown*)&ClassFactory, + CLSCTX_LOCAL_SERVER, 0, &class_reg); + ok(hres == S_OK, "CoRegisterClassObject failed: %x\n", hres); + + hres = OleCreateDefaultHandler(&test_server_clsid, NULL, &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "OleCreateDefaultHandler failed: %x\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IRunnableObject, (void**)&ro); + ok(hres == S_OK, "QueryInterface(IRunnableObject) failed: %x\n", hres); + IUnknown_Release(unk); + + SET_EXPECT(CF_QueryInterface_ClassFactory); + SET_EXPECT(CF_CreateInstance); + hres = IRunnableObject_Run(ro, NULL); + todo_wine ok(hres == S_OK, "Run failed: %x\n", hres); + CHECK_CALLED(CF_QueryInterface_ClassFactory); + CHECK_CALLED(CF_CreateInstance); + IRunnableObject_Release(ro); + + CoRevokeClassObject(class_reg); +} + START_TEST(defaulthandler) { OleInitialize(NULL); test_olestream(); + test_default_handler_run(); OleUninitialize(); } diff --git a/rostests/winetests/ole32/dragdrop.c b/rostests/winetests/ole32/dragdrop.c index 10385bdac4e..83a7872b609 100644 --- a/rostests/winetests/ole32/dragdrop.c +++ b/rostests/winetests/ole32/dragdrop.c @@ -18,18 +18,23 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define _WIN32_DCOM #define COBJMACROS #define CONST_VTABLE #include -#include +//#include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" +#include +#include +#include +//#include "objbase.h" -#include "wine/test.h" +#include static int droptarget_refs; diff --git a/rostests/winetests/ole32/errorinfo.c b/rostests/winetests/ole32/errorinfo.c index bb350aea73d..25a7cdb498d 100644 --- a/rostests/winetests/ole32/errorinfo.c +++ b/rostests/winetests/ole32/errorinfo.c @@ -18,16 +18,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" +#include +#include +#include +//#include "objbase.h" -#include "wine/test.h" +#include #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) diff --git a/rostests/winetests/ole32/hglobalstream.c b/rostests/winetests/ole32/hglobalstream.c index b509fb5d76a..9d43ce68117 100644 --- a/rostests/winetests/ole32/hglobalstream.c +++ b/rostests/winetests/ole32/hglobalstream.c @@ -18,15 +18,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" +#include +#include +#include +//#include "objbase.h" -#include "wine/test.h" +#include #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) diff --git a/rostests/winetests/ole32/marshal.c b/rostests/winetests/ole32/marshal.c index 2baec4bb30e..bb6b983ed42 100644 --- a/rostests/winetests/ole32/marshal.c +++ b/rostests/winetests/ole32/marshal.c @@ -18,22 +18,29 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define _WIN32_DCOM #define COBJMACROS #define CONST_VTABLE -#include +//#include #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "olectl.h" -#include "shlguid.h" -#include "shobjidl.h" -#include "initguid.h" +#include +#include +#include +#include +#include +//#include "objbase.h" +//#include "olectl.h" +#include +//#include "shobjidl.h" +//#include "initguid.h" -#include "wine/test.h" +#include DEFINE_GUID(CLSID_StdGlobalInterfaceTable,0x00000323,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(CLSID_ManualResetEvent, 0x0000032c,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); diff --git a/rostests/winetests/ole32/moniker.c b/rostests/winetests/ole32/moniker.c index 2e5a6034e05..6a2ea547e03 100644 --- a/rostests/winetests/ole32/moniker.c +++ b/rostests/winetests/ole32/moniker.c @@ -18,22 +18,28 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define _WIN32_DCOM #define COBJMACROS #define CONST_VTABLE -#include +//#include #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "ocidl.h" -#include "initguid.h" -#include "comcat.h" -#include "olectl.h" +#include +#include +#include +#include +//#include "objbase.h" +//#include "ocidl.h" +//#include "initguid.h" +#include +#include -#include "wine/test.h" +#include #define ok_more_than_one_lock() ok(cLocks > 0, "Number of locks should be > 0, but actually is %d\n", cLocks) #define ok_no_locks() ok(cLocks == 0, "Number of locks should be 0, but actually is %d\n", cLocks) diff --git a/rostests/winetests/ole32/ole2.c b/rostests/winetests/ole32/ole2.c index 27653c12165..6b9ed142f72 100644 --- a/rostests/winetests/ole32/ole2.c +++ b/rostests/winetests/ole32/ole2.c @@ -18,18 +18,25 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #define WIN32_LEAN_AND_MEAN #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "shlguid.h" +#include +#include +#include +#include +#include +//#include "objbase.h" +//#include "shlguid.h" -#include "wine/test.h" +#include #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) @@ -1701,6 +1708,9 @@ static void test_default_handler(void) hr = IOleObject_GetClientSite(pObject, &pClientSite); ok_ole_success(hr, "IOleObject_GetClientSite"); + hr = IOleObject_SetClientSite(pObject, pClientSite); + ok_ole_success(hr, "IOleObject_SetClientSite"); + hr = IOleObject_GetClipboardData(pObject, 0, &pDataObject); ok(hr == OLE_E_NOTRUNNING, "IOleObject_GetClipboardData should have returned OLE_E_NOTRUNNING instead of 0x%08x\n", @@ -1923,6 +1933,14 @@ static const IUnknownVtbl UnknownVtbl = static IUnknown unknown = { &UnknownVtbl }; +static void test_OleRun(void) +{ + HRESULT hr; + + hr = OleRun(&unknown); + ok(hr == S_OK, "OleRun failed 0x%08x\n", hr); +} + static void test_OleLockRunning(void) { HRESULT hr; @@ -1981,6 +1999,7 @@ START_TEST(ole2) test_data_cache(); test_default_handler(); test_runnable(); + test_OleRun(); test_OleLockRunning(); test_OleDraw(); diff --git a/rostests/winetests/ole32/propvariant.c b/rostests/winetests/ole32/propvariant.c index 3f49980b527..ac912ae60f2 100644 --- a/rostests/winetests/ole32/propvariant.c +++ b/rostests/winetests/ole32/propvariant.c @@ -18,9 +18,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windows.h" +//#include "windows.h" -#include "wine/test.h" +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#include + +#include +#include +#include +#include +#include + +#include /* invalid in all versions */ #define PROP_INV 0x7f diff --git a/rostests/winetests/ole32/stg_prop.c b/rostests/winetests/ole32/stg_prop.c index db4c14246a2..2040556c343 100644 --- a/rostests/winetests/ole32/stg_prop.c +++ b/rostests/winetests/ole32/stg_prop.c @@ -15,11 +15,19 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #include + +#include +#include #define COBJMACROS -#include "objbase.h" -#include "wine/test.h" -#include "initguid.h" +#include +#include +//#include "initguid.h" DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(FMTID_SummaryInformation,0xF29F85E0,0x4FF9,0x1068,0xAB,0x91,0x08,0x00,0x2B,0x27,0xB3,0xD9); diff --git a/rostests/winetests/ole32/storage32.c b/rostests/winetests/ole32/storage32.c index d99bda6ceb7..3e3581b1356 100644 --- a/rostests/winetests/ole32/storage32.c +++ b/rostests/winetests/ole32/storage32.c @@ -18,16 +18,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #define COBJMACROS -#include -#include "wine/test.h" - -#include "ole2.h" -#include "objidl.h" -#include "initguid.h" +//#include +#include +#include +#include +//#include "objidl.h" +#include DEFINE_GUID( test_stg_cls, 0x88888888, 0x0425, 0x0000, 0,0,0,0,0,0,0,0); diff --git a/rostests/winetests/ole32/testlist.c b/rostests/winetests/ole32/testlist.c index 65c40d2c5ad..67227861877 100644 --- a/rostests/winetests/ole32/testlist.c +++ b/rostests/winetests/ole32/testlist.c @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_clipboard(void); extern void func_compobj(void); diff --git a/rostests/winetests/ole32/usrmarshal.c b/rostests/winetests/ole32/usrmarshal.c index 631400681cc..e50968b0972 100644 --- a/rostests/winetests/ole32/usrmarshal.c +++ b/rostests/winetests/ole32/usrmarshal.c @@ -18,16 +18,22 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "objidl.h" +#include +#include +#include +#include +//#include "objbase.h" +//#include "objidl.h" -#include "wine/test.h" +#include ULONG __RPC_USER HMETAFILE_UserSize(ULONG *, ULONG, HMETAFILE *); unsigned char * __RPC_USER HMETAFILE_UserMarshal(ULONG *, unsigned char *, HMETAFILE *); From a6c07ee5d89cb7fbe0de3ca045d672d369a5779e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 23 Mar 2013 11:24:29 +0000 Subject: [PATCH 57/74] [OLEAUT32] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58588 --- reactos/dll/win32/oleaut32/connpt.h | 2 +- reactos/dll/win32/oleaut32/oleaut.c | 25 +++- reactos/dll/win32/oleaut32/olepicture.c | 4 +- reactos/dll/win32/oleaut32/olepropframe.c | 4 +- reactos/dll/win32/oleaut32/recinfo.c | 2 +- reactos/dll/win32/oleaut32/tmarshal.c | 135 ++++++++----------- reactos/dll/win32/oleaut32/typelib.c | 152 ++++++++++++---------- reactos/dll/win32/oleaut32/typelib.h | 14 +- reactos/dll/win32/oleaut32/typelib2.c | 4 +- reactos/dll/win32/oleaut32/varformat.c | 2 +- reactos/dll/win32/oleaut32/variant.c | 6 +- reactos/dll/win32/oleaut32/variant.h | 10 +- reactos/dll/win32/oleaut32/vartype.c | 122 ++++++++++++++++- reactos/media/doc/README.WINE | 2 +- 14 files changed, 300 insertions(+), 184 deletions(-) diff --git a/reactos/dll/win32/oleaut32/connpt.h b/reactos/dll/win32/oleaut32/connpt.h index cac3ae62fa8..e0bdd8b59b4 100644 --- a/reactos/dll/win32/oleaut32/connpt.h +++ b/reactos/dll/win32/oleaut32/connpt.h @@ -19,6 +19,6 @@ #ifndef _CONNPT_H #define _CONNPT_H -HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, IConnectionPoint **pCP); +HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid, IConnectionPoint **pCP) DECLSPEC_HIDDEN; #endif /* _CONNPT_H */ diff --git a/reactos/dll/win32/oleaut32/oleaut.c b/reactos/dll/win32/oleaut32/oleaut.c index fa52acc2036..2a61c016141 100644 --- a/reactos/dll/win32/oleaut32/oleaut.c +++ b/reactos/dll/win32/oleaut32/oleaut.c @@ -93,14 +93,15 @@ typedef struct { } u; } bstr_t; +#define BUCKET_SIZE 16 +#define BUCKET_BUFFER_SIZE 6 + typedef struct { unsigned short head; unsigned short cnt; - bstr_t *buf[6]; + bstr_t *buf[BUCKET_BUFFER_SIZE]; } bstr_cache_entry_t; -#define BUCKET_SIZE 16 - #define ARENA_INUSE_FILLER 0x55 #define ARENA_TAIL_FILLER 0xab #define ARENA_FREE_FILLER 0xfeeefeee @@ -141,7 +142,7 @@ static bstr_t *alloc_bstr(size_t size) if(cache_entry) { ret = cache_entry->buf[cache_entry->head++]; - cache_entry->head %= sizeof(cache_entry->buf)/sizeof(*cache_entry->buf); + cache_entry->head %= BUCKET_BUFFER_SIZE; cache_entry->cnt--; } @@ -260,14 +261,26 @@ void WINAPI SysFreeString(BSTR str) bstr = bstr_from_str(str); cache_entry = get_cache_entry(bstr->size+sizeof(WCHAR)); if(cache_entry) { + unsigned i; + EnterCriticalSection(&cs_bstr_cache); + /* According to tests, freeing a string that's already in cache doesn't corrupt anything. + * For that to work we need to search the cache. */ + for(i=0; i < cache_entry->cnt; i++) { + if(cache_entry->buf[(cache_entry->head+i) % BUCKET_BUFFER_SIZE] == bstr) { + WARN_(heap)("String already is in cache!\n"); + LeaveCriticalSection(&cs_bstr_cache); + return; + } + } + if(cache_entry->cnt < sizeof(cache_entry->buf)/sizeof(*cache_entry->buf)) { - cache_entry->buf[(cache_entry->head+cache_entry->cnt)%((sizeof(cache_entry->buf)/sizeof(*cache_entry->buf)))] = bstr; + cache_entry->buf[(cache_entry->head+cache_entry->cnt) % BUCKET_BUFFER_SIZE] = bstr; cache_entry->cnt++; if(WARN_ON(heap)) { - unsigned i, n = bstr_alloc_size(bstr->size) / sizeof(DWORD) - 1; + unsigned n = bstr_alloc_size(bstr->size) / sizeof(DWORD) - 1; bstr->size = ARENA_FREE_FILLER; for(i=0; iu.dwptr[i] = ARENA_FREE_FILLER; diff --git a/reactos/dll/win32/oleaut32/olepicture.c b/reactos/dll/win32/oleaut32/olepicture.c index 051621f28c7..a698c92ca07 100644 --- a/reactos/dll/win32/oleaut32/olepicture.c +++ b/reactos/dll/win32/oleaut32/olepicture.c @@ -1423,8 +1423,8 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface, IStream *pStm) } while (!headerisdata); if (statfailed) { /* we don't know the size ... read all we get */ - int sizeinc = 4096; - int origsize = sizeinc; + unsigned int sizeinc = 4096; + unsigned int origsize = sizeinc; ULONG nread = 42; TRACE("Reading all data from stream.\n"); diff --git a/reactos/dll/win32/oleaut32/olepropframe.c b/reactos/dll/win32/oleaut32/olepropframe.c index d86d40507b4..eb9a1c39a9a 100644 --- a/reactos/dll/win32/oleaut32/olepropframe.c +++ b/reactos/dll/win32/oleaut32/olepropframe.c @@ -143,7 +143,7 @@ static HRESULT WINAPI PropertyPageSite_TranslateAccelerator( return E_NOTIMPL; } -IPropertyPageSiteVtbl PropertyPageSiteVtbl = { +static IPropertyPageSiteVtbl PropertyPageSiteVtbl = { PropertyPageSite_QueryInterface, PropertyPageSite_AddRef, PropertyPageSite_Release, @@ -171,7 +171,7 @@ HRESULT WINAPI OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams) IPropertyPage **property_page; PropertyPageSite *property_page_site; HRESULT res; - int i; + ULONG i; HMODULE hcomctl; HRSRC property_sheet_dialog_find = NULL; HGLOBAL property_sheet_dialog_load = NULL; diff --git a/reactos/dll/win32/oleaut32/recinfo.c b/reactos/dll/win32/oleaut32/recinfo.c index 5a865f6e629..a27443334c9 100644 --- a/reactos/dll/win32/oleaut32/recinfo.c +++ b/reactos/dll/win32/oleaut32/recinfo.c @@ -619,7 +619,7 @@ HRESULT WINAPI GetRecordInfoFromTypeInfo(ITypeInfo* pTI, IRecordInfo** ppRecInfo ret->name = NULL; } - ret->fields = HeapAlloc(GetProcessHeap(), 0, ret->n_vars*sizeof(VARDESC)); + ret->fields = HeapAlloc(GetProcessHeap(), 0, ret->n_vars*sizeof(fieldstr)); for(i = 0; in_vars; i++) { VARDESC *vardesc; hres = ITypeInfo_GetVarDesc(pTypeInfo, i, &vardesc); diff --git a/reactos/dll/win32/oleaut32/tmarshal.c b/reactos/dll/win32/oleaut32/tmarshal.c index 8f6d696c7d2..ea814b23d2c 100644 --- a/reactos/dll/win32/oleaut32/tmarshal.c +++ b/reactos/dll/win32/oleaut32/tmarshal.c @@ -137,29 +137,29 @@ _unmarshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN *pUnk) { DWORD xsize; TRACE("...%s...\n",debugstr_guid(riid)); - + *pUnk = NULL; hres = xbuf_get(buf,(LPBYTE)&xsize,sizeof(xsize)); if (hres) { ERR("xbuf_get failed\n"); return hres; } - + if (xsize == 0) return S_OK; - + hres = CreateStreamOnHGlobal(0,TRUE,&pStm); if (hres) { ERR("Stream create failed %x\n",hres); return hres; } - + hres = IStream_Write(pStm,buf->base+buf->curoff,xsize,&res); if (hres) { ERR("stream write %x\n",hres); IStream_Release(pStm); return hres; } - + memset(&seekto,0,sizeof(seekto)); hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos); if (hres) { @@ -167,14 +167,14 @@ _unmarshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN *pUnk) { IStream_Release(pStm); return hres; } - + hres = CoUnmarshalInterface(pStm,riid,(LPVOID*)pUnk); if (hres) { ERR("Unmarshalling interface %s failed with %x\n",debugstr_guid(riid),hres); IStream_Release(pStm); return hres; } - + IStream_Release(pStm); return xbuf_skip(buf,xsize); } @@ -204,25 +204,25 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) { hres = E_FAIL; TRACE("...%s...\n",debugstr_guid(riid)); - + hres = CreateStreamOnHGlobal(0,TRUE,&pStm); if (hres) { ERR("Stream create failed %x\n",hres); goto fail; } - + hres = CoMarshalInterface(pStm,riid,pUnk,0,NULL,0); if (hres) { ERR("Marshalling interface %s failed with %x\n", debugstr_guid(riid), hres); goto fail; } - + hres = IStream_Stat(pStm,&ststg,STATFLAG_NONAME); if (hres) { ERR("Stream stat failed\n"); goto fail; } - + tempbuf = HeapAlloc(GetProcessHeap(), 0, ststg.cbSize.u.LowPart); memset(&seekto,0,sizeof(seekto)); hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos); @@ -230,22 +230,22 @@ _marshal_interface(marshal_state *buf, REFIID riid, LPUNKNOWN pUnk) { ERR("Failed Seek %x\n",hres); goto fail; } - + hres = IStream_Read(pStm,tempbuf,ststg.cbSize.u.LowPart,&res); if (hres) { ERR("Failed Read %x\n",hres); goto fail; } - + xsize = ststg.cbSize.u.LowPart; xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize)); hres = xbuf_add(buf,tempbuf,ststg.cbSize.u.LowPart); - + HeapFree(GetProcessHeap(),0,tempbuf); IStream_Release(pStm); - + return hres; - + fail: xsize = 0; xbuf_add(buf,(LPBYTE)&xsize,sizeof(xsize)); @@ -412,15 +412,15 @@ static HRESULT num_of_funcs(ITypeInfo *tinfo, unsigned int *num, #include "pshpack1.h" typedef struct _TMAsmProxy { - BYTE popleax; + DWORD lealeax; + BYTE pushleax; BYTE pushlval; DWORD nr; - BYTE pushleax; BYTE lcall; DWORD xcall; BYTE lret; WORD bytestopop; - BYTE nop; + WORD nop; } TMAsmProxy; #include "poppack.h" @@ -1216,7 +1216,7 @@ deserialize_param( ); return S_OK; } - case VT_SAFEARRAY: { + case VT_SAFEARRAY: { if (readit) { ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION); @@ -1338,13 +1338,13 @@ static inline BOOL is_out_elem(const ELEMDESC *elem) return (elem->u.paramdesc.wParamFlags & PARAMFLAG_FOUT || !elem->u.paramdesc.wParamFlags); } -static DWORD -xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) +static DWORD WINAPI xCall(int method, void **args) { - DWORD *args = ((DWORD*)&tpinfo)+1, *xargs; + TMProxyImpl *tpinfo = args[0]; + DWORD *xargs; const FUNCDESC *fdesc; HRESULT hres; - int i, relaydeb = TRACE_ON(olerelay); + int i; marshal_state buf; RPCOLEMESSAGE msg; ULONG status; @@ -1376,7 +1376,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) LeaveCriticalSection(&tpinfo->crit); - if (relaydeb) { + if (TRACE_ON(olerelay)) { TRACE_(olerelay)("->"); if (iname) TRACE_(olerelay)("%s:",relaystr(iname)); @@ -1401,10 +1401,10 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) if (nrofnames > sizeof(names)/sizeof(names[0])) ERR("Need more names!\n"); - xargs = args; + xargs = (DWORD *)(args + 1); for (i=0;icParams;i++) { ELEMDESC *elem = fdesc->lprgelemdescParam+i; - if (relaydeb) { + if (TRACE_ON(olerelay)) { if (i) TRACE_(olerelay)(","); if (i+1tdesc, xargs, @@ -1440,7 +1440,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) } xargs+=_argsize(&elem->tdesc, tinfo); } - if (relaydeb) TRACE_(olerelay)(")"); + TRACE_(olerelay)(")"); memset(&msg,0,sizeof(msg)); msg.cbBuffer = buf.curoff; @@ -1451,14 +1451,14 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) goto exit; } memcpy(msg.Buffer,buf.base,buf.curoff); - if (relaydeb) TRACE_(olerelay)("\n"); + TRACE_(olerelay)("\n"); hres = IRpcChannelBuffer_SendReceive(chanbuf,&msg,&status); if (hres) { ERR("RpcChannelBuffer SendReceive failed, %x\n",hres); goto exit; } - if (relaydeb) TRACE_(olerelay)(" status = %08x (",status); + TRACE_(olerelay)(" status = %08x (",status); if (buf.base) buf.base = HeapReAlloc(GetProcessHeap(),0,buf.base,msg.cbBuffer); else @@ -1468,25 +1468,24 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) buf.curoff = 0; /* generic deserializer using typelib description */ - xargs = args; + xargs = (DWORD *)(args + 1); status = S_OK; for (i=0;icParams;i++) { ELEMDESC *elem = fdesc->lprgelemdescParam+i; - if (relaydeb) { - if (i) TRACE_(olerelay)(","); - if (i+1tdesc), xargs, @@ -1503,7 +1502,7 @@ xCall(LPVOID retptr, int method, TMProxyImpl *tpinfo /*, args */) hres = xbuf_get(&buf, (LPBYTE)&remoteresult, sizeof(DWORD)); if (hres != S_OK) goto exit; - if (relaydeb) TRACE_(olerelay)(") = %08x\n", remoteresult); + TRACE_(olerelay)(") = %08x\n", remoteresult); hres = remoteresult; @@ -1639,7 +1638,7 @@ static ULONG WINAPI TMarshalDispatchChannel_Release(LPRPCCHANNELBUFFER iface) if (ref) return ref; - IRpcChannelBuffer_Release(This->pDelegateChannel); + IRpcChannelBuffer_Release(This->pDelegateChannel); HeapFree(GetProcessHeap(), 0, This); return 0; } @@ -1727,8 +1726,8 @@ static inline HRESULT get_facbuf_for_iid(REFIID riid, IPSFactoryBuffer **facbuf) static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) { int j; - /* nrofargs without This */ - int nrofargs; + /* nrofargs including This */ + int nrofargs = 1; ITypeInfo *tinfo2; TMAsmProxy *xasm = proxy->asmstubs + num; HRESULT hres; @@ -1741,7 +1740,6 @@ static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) } ITypeInfo_Release(tinfo2); /* some args take more than 4 byte on the stack */ - nrofargs = 0; for (j=0;jcParams;j++) nrofargs += _argsize(&fdesc->lprgelemdescParam[j].tdesc, proxy->tinfo); @@ -1750,25 +1748,21 @@ static HRESULT init_proxy_entry_point(TMProxyImpl *proxy, unsigned int num) ERR("calling convention is not stdcall????\n"); return E_FAIL; } -/* popl %eax - return ptr - * pushl +/* leal 4(%esp),%eax * pushl %eax + * pushl * call xCall - * lret (+4) - * - * - * arg3 arg2 arg1 + * lret */ - xasm->popleax = 0x58; + xasm->lealeax = 0x0424448d; + xasm->pushleax = 0x50; xasm->pushlval = 0x68; xasm->nr = num; - xasm->pushleax = 0x50; - xasm->lcall = 0xe8; /* relative jump */ - xasm->xcall = (DWORD)xCall; - xasm->xcall -= (DWORD)&(xasm->lret); + xasm->lcall = 0xe8; + xasm->xcall = (char *)xCall - (char *)&xasm->lret; xasm->lret = 0xc2; - xasm->bytestopop = (nrofargs+2)*4; /* pop args, This, iMethod */ - xasm->nop = 0x90; + xasm->bytestopop = nrofargs * 4; + xasm->nop = 0x9090; proxy->lpvtbl[fdesc->oVft / sizeof(void *)] = xasm; #else FIXME("not implemented on non i386\n"); @@ -1808,8 +1802,6 @@ PSFacBuf_CreateProxy( proxy = CoTaskMemAlloc(sizeof(TMProxyImpl)); if (!proxy) return E_OUTOFMEMORY; - assert(sizeof(TMAsmProxy) == 16); - proxy->dispatch = NULL; proxy->dispatch_proxy = NULL; proxy->outerunknown = pUnkOuter; @@ -1871,40 +1863,23 @@ PSFacBuf_CreateProxy( proxy->lpvtbl[i] = ProxyIUnknown_Release; break; case 3: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[3] = ProxyIDispatch_GetTypeInfoCount; break; case 4: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[4] = ProxyIDispatch_GetTypeInfo; break; case 5: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[5] = ProxyIDispatch_GetIDsOfNames; break; case 6: - if(!defer_to_dispatch) - { - hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; - } + if(!defer_to_dispatch) hres = init_proxy_entry_point(proxy, i); else proxy->lpvtbl[6] = ProxyIDispatch_Invoke; break; default: hres = init_proxy_entry_point(proxy, i); - if(FAILED(hres)) return hres; } } diff --git a/reactos/dll/win32/oleaut32/typelib.c b/reactos/dll/win32/oleaut32/typelib.c index f5e7f82d08e..5c81263d86e 100644 --- a/reactos/dll/win32/oleaut32/typelib.c +++ b/reactos/dll/win32/oleaut32/typelib.c @@ -986,7 +986,7 @@ typedef struct tagTLBImpLib /* internal ITypeLib data */ typedef struct tagITypeLibImpl { - const ITypeLib2Vtbl *lpVtbl; + ITypeLib2 ITypeLib2_iface; const ITypeCompVtbl *lpVtblTypeComp; LONG ref; TLIBATTR LibAttr; /* guid,lcid,syskind,version,flags */ @@ -2547,9 +2547,10 @@ static HRESULT TLB_PEFile_Open(LPCWSTR path, INT index, LPVOID *ppBase, DWORD *p return S_OK; } } - - hr = E_FAIL; } + + TRACE("No TYPELIB resource found\n"); + hr = E_FAIL; } TLB_PEFile_Release((IUnknown *)&This->lpvtbl); @@ -2918,7 +2919,7 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath if (!strcmpiW(entry->path, pszPath) && entry->index == index) { TRACE("cache hit\n"); - *ppTypeLib = (ITypeLib2*)entry; + *ppTypeLib = &entry->ITypeLib2_iface; ITypeLib2_AddRef(*ppTypeLib); LeaveCriticalSection(&cache_section); return S_OK; @@ -2952,8 +2953,6 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath ret = TYPE_E_CANTLOADLIBRARY; IUnknown_Release(pFile); } - else - ret = TYPE_E_CANTLOADLIBRARY; if(*ppTypeLib) { ITypeLibImpl *impl = (ITypeLibImpl*)*ppTypeLib; @@ -2969,8 +2968,15 @@ static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath list_add_head(&tlb_cache, &impl->entry); LeaveCriticalSection(&cache_section); ret = S_OK; - } else - ERR("Loading of typelib %s failed with error %d\n", debugstr_w(pszFileName), GetLastError()); + } + else + { + if(ret != E_FAIL) + ERR("Loading of typelib %s failed with error %d\n", debugstr_w(pszFileName), GetLastError()); + + ret = TYPE_E_CANTLOADLIBRARY; + } + return ret; } @@ -2984,7 +2990,7 @@ static ITypeLibImpl* TypeLibImpl_Constructor(void) pTypeLibImpl = heap_alloc_zero(sizeof(ITypeLibImpl)); if (!pTypeLibImpl) return NULL; - pTypeLibImpl->lpVtbl = &tlbvt; + pTypeLibImpl->ITypeLib2_iface.lpVtbl = &tlbvt; pTypeLibImpl->lpVtblTypeComp = &tlbtcvt; pTypeLibImpl->ref = 1; @@ -3202,7 +3208,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) } TRACE("(%p)\n", pTypeLibImpl); - return (ITypeLib2*) pTypeLibImpl; + return &pTypeLibImpl->ITypeLib2_iface; } @@ -4200,58 +4206,53 @@ static ITypeLib2* ITypeLib2_Constructor_SLTG(LPVOID pLib, DWORD dwTLBLength) } heap_free(pOtherTypeInfoBlks); - return (ITypeLib2*)pTypeLibImpl; + return &pTypeLibImpl->ITypeLib2_iface; } -/* ITypeLib::QueryInterface - */ -static HRESULT WINAPI ITypeLib2_fnQueryInterface( - ITypeLib2 * iface, - REFIID riid, - VOID **ppvObject) +static inline ITypeLibImpl *impl_from_ITypeLib2(ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + return CONTAINING_RECORD(iface, ITypeLibImpl, ITypeLib2_iface); +} + +static HRESULT WINAPI ITypeLib2_fnQueryInterface(ITypeLib2 *iface, REFIID riid, void **ppv) +{ + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p)->(IID: %s)\n",This,debugstr_guid(riid)); - *ppvObject=NULL; if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid,&IID_ITypeLib)|| IsEqualIID(riid,&IID_ITypeLib2)) { - *ppvObject = This; + *ppv = &This->ITypeLib2_iface; + } + else + { + *ppv = NULL; + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; } - if(*ppvObject) - { - ITypeLib2_AddRef(iface); - TRACE("-- Interface: (%p)->(%p)\n",ppvObject,*ppvObject); - return S_OK; - } - TRACE("-- Interface: E_NOINTERFACE\n"); - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; } -/* ITypeLib::AddRef - */ static ULONG WINAPI ITypeLib2_fnAddRef( ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->ref was %u\n",This, ref - 1); + TRACE("(%p) ref=%u\n", This, ref); return ref; } -/* ITypeLib::Release - */ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(%u)\n",This, ref); + TRACE("(%p) ref=%u\n",This, ref); if (!ref) { @@ -4295,7 +4296,7 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) LIST_FOR_EACH_ENTRY_SAFE(pImpLib, pImpLibNext, &This->implib_list, TLBImpLib, entry) { if (pImpLib->pImpTypeLib) - ITypeLib_Release((ITypeLib *)pImpLib->pImpTypeLib); + ITypeLib2_Release(&pImpLib->pImpTypeLib->ITypeLib2_iface); SysFreeString(pImpLib->name); list_remove(&pImpLib->entry); @@ -4324,7 +4325,7 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface) */ static UINT WINAPI ITypeLib2_fnGetTypeInfoCount( ITypeLib2 *iface) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p)->count is %d\n",This, This->TypeInfoCount); return This->TypeInfoCount; } @@ -4338,7 +4339,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfo( UINT index, ITypeInfo **ppTInfo) { - ITypeLibImpl *This = (ITypeLibImpl*)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("%p %u %p\n", This, index, ppTInfo); @@ -4364,7 +4365,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoType( UINT index, TYPEKIND *pTKind) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p, %d, %p)\n", This, index, pTKind); @@ -4389,8 +4390,8 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeInfoOfGuid( REFGUID guid, ITypeInfo **ppTInfo) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - UINT i; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + int i; TRACE("%p %s %p\n", This, debugstr_guid(guid), ppTInfo); @@ -4414,7 +4415,7 @@ static HRESULT WINAPI ITypeLib2_fnGetLibAttr( ITypeLib2 *iface, LPTLIBATTR *attr) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p, %p)\n", This, attr); @@ -4437,7 +4438,7 @@ static HRESULT WINAPI ITypeLib2_fnGetTypeComp( ITypeLib2 *iface, ITypeComp **ppTComp) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TRACE("(%p)->(%p)\n",This,ppTComp); *ppTComp = (ITypeComp *)&This->lpVtblTypeComp; @@ -4463,13 +4464,10 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation( DWORD *pdwHelpContext, BSTR *pBstrHelpFile) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - + ITypeLibImpl *This = impl_from_ITypeLib2(iface); HRESULT result = E_INVALIDARG; - ITypeInfo *pTInfo; - TRACE("(%p) index %d Name(%p) DocString(%p) HelpContext(%p) HelpFile(%p)\n", This, index, pBstrName, pBstrDocString, @@ -4557,8 +4555,9 @@ static HRESULT WINAPI ITypeLib2_fnIsName( ULONG lHashVal, BOOL *pfName) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR), tic, fdc, vrc, pc; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + int tic; + UINT nNameBufLen = (lstrlenW(szNameBuf)+1)*sizeof(WCHAR), fdc, vrc; TRACE("(%p)->(%s,%08x,%p)\n", This, debugstr_w(szNameBuf), lHashVal, pfName); @@ -4569,6 +4568,8 @@ static HRESULT WINAPI ITypeLib2_fnIsName( if(!memcmp(szNameBuf,pTInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) { TLBFuncDesc *pFInfo = &pTInfo->funcdescs[fdc]; + int pc; + if(!memcmp(szNameBuf,pFInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit; for(pc=0; pc < pFInfo->funcdesc.cParams; pc++) if(!memcmp(szNameBuf,pFInfo->pParamDesc[pc].Name, nNameBufLen)) @@ -4603,8 +4604,9 @@ static HRESULT WINAPI ITypeLib2_fnFindName( MEMBERID *memid, UINT16 *found) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - UINT tic, count = 0; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + int tic; + UINT count = 0; UINT len; TRACE("(%p)->(%s %u %p %p %p)\n", This, debugstr_w(name), hash, ppTInfo, memid, found); @@ -4621,7 +4623,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName( if(!memcmp(name, pTInfo->Name, len)) goto ITypeLib2_fnFindName_exit; for(fdc = 0; fdc < pTInfo->TypeAttr.cFuncs; ++fdc) { TLBFuncDesc *func = &pTInfo->funcdescs[fdc]; - UINT pc; + int pc; if(!memcmp(name, func->Name, len)) goto ITypeLib2_fnFindName_exit; for(pc = 0; pc < func->funcdesc.cParams; pc++) { @@ -4656,10 +4658,9 @@ static VOID WINAPI ITypeLib2_fnReleaseTLibAttr( ITypeLib2 *iface, TLIBATTR *pTLibAttr) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - TRACE("freeing (%p)\n",This); + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + TRACE("(%p)->(%p)\n", This, pTLibAttr); heap_free(pTLibAttr); - } /* ITypeLib2::GetCustData @@ -4671,10 +4672,10 @@ static HRESULT WINAPI ITypeLib2_fnGetCustData( REFGUID guid, VARIANT *pVarVal) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); TLBCustData *pCData; - TRACE("%p %s %p\n", This, debugstr_guid(guid), pVarVal); + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(guid), pVarVal); pCData = TLB_get_custdata_by_guid(&This->custdata_list, guid); if(!pCData) @@ -4697,7 +4698,7 @@ static HRESULT WINAPI ITypeLib2_fnGetLibStatistics( ULONG *pcUniqueNames, ULONG *pcchUniqueNames) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); FIXME("(%p): stub!\n", This); @@ -4721,7 +4722,7 @@ static HRESULT WINAPI ITypeLib2_fnGetDocumentation2( DWORD *pdwHelpStringContext, BSTR *pbstrHelpStringDll) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; + ITypeLibImpl *This = impl_from_ITypeLib2(iface); HRESULT result; ITypeInfo *pTInfo; @@ -4807,8 +4808,8 @@ static HRESULT WINAPI ITypeLib2_fnGetAllCustData( ITypeLib2 * iface, CUSTDATA *pCustData) { - ITypeLibImpl *This = (ITypeLibImpl *)iface; - TRACE("%p %p\n", iface, pCustData); + ITypeLibImpl *This = impl_from_ITypeLib2(iface); + TRACE("(%p)->(%p)\n", This, pCustData); return TLB_copy_all_custdata(&This->custdata_list, pCustData); } @@ -4838,21 +4839,21 @@ static HRESULT WINAPI ITypeLibComp_fnQueryInterface(ITypeComp * iface, REFIID ri { ITypeLibImpl *This = impl_from_ITypeComp(iface); - return ITypeLib2_QueryInterface((ITypeLib2 *)This, riid, ppv); + return ITypeLib2_QueryInterface(&This->ITypeLib2_iface, riid, ppv); } static ULONG WINAPI ITypeLibComp_fnAddRef(ITypeComp * iface) { ITypeLibImpl *This = impl_from_ITypeComp(iface); - return ITypeLib2_AddRef((ITypeLib2 *)This); + return ITypeLib2_AddRef(&This->ITypeLib2_iface); } static ULONG WINAPI ITypeLibComp_fnRelease(ITypeComp * iface) { ITypeLibImpl *This = impl_from_ITypeComp(iface); - return ITypeLib2_Release((ITypeLib2 *)This); + return ITypeLib2_Release(&This->ITypeLib2_iface); } static HRESULT WINAPI ITypeLibComp_fnBind( @@ -5001,7 +5002,7 @@ static HRESULT WINAPI ITypeLibComp_fnBindType( ITypeComp ** ppTComp) { ITypeLibImpl *This = impl_from_ITypeComp(iface); - UINT i; + int i; TRACE("(%s, %x, %p, %p)\n", debugstr_w(szName), lHash, ppTInfo, ppTComp); @@ -5096,14 +5097,14 @@ static ULONG WINAPI ITypeInfo_fnAddRef( ITypeInfo2 *iface) TRACE("(%p)->ref is %u\n",This, ref); if (ref == 1 /* incremented from 0 */) - ITypeLib2_AddRef((ITypeLib2*)This->pTypeLib); + ITypeLib2_AddRef(&This->pTypeLib->ITypeLib2_iface); return ref; } static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) { - UINT i, j; + UINT i; TRACE("destroying ITypeInfo(%p)\n",This); @@ -5118,6 +5119,7 @@ static void ITypeInfoImpl_Destroy(ITypeInfoImpl *This) for (i = 0; i < This->TypeAttr.cFuncs; ++i) { + int j; TLBFuncDesc *pFInfo = &This->funcdescs[i]; for(j = 0; j < pFInfo->funcdesc.cParams; j++) { @@ -5179,7 +5181,7 @@ static ULONG WINAPI ITypeInfo_fnRelease(ITypeInfo2 *iface) if (!ref) { BOOL not_attached_to_typelib = This->not_attached_to_typelib; - ITypeLib2_Release((ITypeLib2*)This->pTypeLib); + ITypeLib2_Release(&This->pTypeLib->ITypeLib2_iface); if (not_attached_to_typelib) heap_free(This); /* otherwise This will be freed when typelib is freed */ @@ -6191,6 +6193,10 @@ DispCallFunc( case VT_CY: V_UI8(pvargResult) = call_method( func, argspos - 1, args + 1, &stack_offset ); break; + case VT_HRESULT: + WARN("invalid return type %u\n", vtReturn); + heap_free( args ); + return E_INVALIDARG; default: V_UI4(pvargResult) = call_method( func, argspos - 1, args + 1, &stack_offset ); break; @@ -6269,6 +6275,10 @@ DispCallFunc( args[0] = (DWORD_PTR)pvargResult; /* arg 0 is a pointer to the result */ call_method( func, argspos, args ); break; + case VT_HRESULT: + WARN("invalid return type %u\n", vtReturn); + heap_free( args ); + return E_INVALIDARG; default: V_UI8(pvargResult) = call_method( func, argspos - 1, args + 1 ); break; @@ -7053,7 +7063,7 @@ static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo( } else { if(ref_type->pImpTLInfo->pImpTypeLib) { TRACE("typeinfo in imported typelib that is already loaded\n"); - pTLib = (ITypeLib*)ref_type->pImpTLInfo->pImpTypeLib; + pTLib = (ITypeLib*)&ref_type->pImpTLInfo->pImpTypeLib->ITypeLib2_iface; ITypeLib_AddRef(pTLib); result = S_OK; } else { @@ -7838,7 +7848,7 @@ HRESULT WINAPI CreateDispTypeInfo( *pptinfo = (ITypeInfo*)pTIClass; ITypeInfo_AddRef(*pptinfo); - ITypeLib_Release((ITypeLib *)&pTypeLibImpl->lpVtbl); + ITypeLib2_Release(&pTypeLibImpl->ITypeLib2_iface); return S_OK; diff --git a/reactos/dll/win32/oleaut32/typelib.h b/reactos/dll/win32/oleaut32/typelib.h index 15e8f02500a..fdf825fdc0a 100644 --- a/reactos/dll/win32/oleaut32/typelib.h +++ b/reactos/dll/win32/oleaut32/typelib.h @@ -597,16 +597,16 @@ WORD typeofarray #include "poppack.h" /* heap allocation helpers */ -extern void* heap_alloc_zero(unsigned size); -extern void* heap_alloc(unsigned size); -extern void* heap_realloc(void *ptr, unsigned size); -extern void heap_free(void *ptr); +extern void* heap_alloc_zero(unsigned size) DECLSPEC_HIDDEN __WINE_ALLOC_SIZE(1); +extern void* heap_alloc(unsigned size) DECLSPEC_HIDDEN __WINE_ALLOC_SIZE(1); +extern void* heap_realloc(void *ptr, unsigned size) DECLSPEC_HIDDEN; +extern void heap_free(void *ptr) DECLSPEC_HIDDEN; -HRESULT ITypeInfoImpl_GetInternalFuncDesc( ITypeInfo *iface, UINT index, const FUNCDESC **ppFuncDesc ); +HRESULT ITypeInfoImpl_GetInternalFuncDesc( ITypeInfo *iface, UINT index, const FUNCDESC **ppFuncDesc ) DECLSPEC_HIDDEN; -extern DWORD _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args); +extern DWORD _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args) DECLSPEC_HIDDEN; -HRESULT TMARSHAL_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv); +HRESULT TMARSHAL_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN; /* The OLE Automation ProxyStub Interface Class (aka Typelib Marshaler) */ DEFINE_OLEGUID( CLSID_PSDispatch, 0x00020420, 0x0000, 0x0000 ); diff --git a/reactos/dll/win32/oleaut32/typelib2.c b/reactos/dll/win32/oleaut32/typelib2.c index c855776f756..cb2c04f72f6 100644 --- a/reactos/dll/win32/oleaut32/typelib2.c +++ b/reactos/dll/win32/oleaut32/typelib2.c @@ -2053,8 +2053,10 @@ static HRESULT WINAPI ICreateTypeInfo2_fnAddFuncDesc( if(This->dual) This->dual->typedata = This->typedata; } else { + unsigned int j; + iter = This->typedata->next; - for(i=0; inext; insert->next = iter->next; diff --git a/reactos/dll/win32/oleaut32/varformat.c b/reactos/dll/win32/oleaut32/varformat.c index 268eca2bce7..f571443f1bf 100644 --- a/reactos/dll/win32/oleaut32/varformat.c +++ b/reactos/dll/win32/oleaut32/varformat.c @@ -1911,7 +1911,7 @@ static HRESULT VARIANT_FormatDate(LPVARIANT pVarIn, LPOLESTR lpszFormat, WCHAR fmt_buff[80]; if (!GetLocaleInfoW(lcid, dwFmt, fmt_buff, sizeof(fmt_buff)/sizeof(WCHAR)) || - !GetDateFormatW(lcid, 0, &udate.st, fmt_buff, pBuff, + !get_date_format(lcid, 0, &udate.st, fmt_buff, pBuff, sizeof(buff)/sizeof(WCHAR)-(pBuff-buff))) { hRes = E_INVALIDARG; diff --git a/reactos/dll/win32/oleaut32/variant.c b/reactos/dll/win32/oleaut32/variant.c index 5600e167b87..67608e67211 100644 --- a/reactos/dll/win32/oleaut32/variant.c +++ b/reactos/dll/win32/oleaut32/variant.c @@ -3134,9 +3134,9 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) LOCALE_USER_DEFAULT, 0, &d))) hres = VariantChangeType(&varLeft,&varLeft, VARIANT_LOCALBOOL, VT_BOOL); - if (SUCCEEDED(hres) && V_VT(&varLeft) != resvt) - hres = VariantChangeType(&varLeft,&varLeft,0,resvt); - if (FAILED(hres)) goto VarAnd_Exit; + if (SUCCEEDED(hres) && V_VT(&varLeft) != resvt) + hres = VariantChangeType(&varLeft,&varLeft,0,resvt); + if (FAILED(hres)) goto VarAnd_Exit; } if (resvt == VT_I4 && V_VT(&varRight) == VT_UI4) diff --git a/reactos/dll/win32/oleaut32/variant.h b/reactos/dll/win32/oleaut32/variant.h index 14b6c058e1b..97bebfcb842 100644 --- a/reactos/dll/win32/oleaut32/variant.h +++ b/reactos/dll/win32/oleaut32/variant.h @@ -48,12 +48,12 @@ #define VTBIT_VARIANT (1 << VT_VARIANT) #define VTBIT_15 (1 << 15) /* no variant type with this number */ -extern const char * const wine_vtypes[]; +extern const char * const wine_vtypes[] DECLSPEC_HIDDEN; #define debugstr_vt(v) (((v)&VT_TYPEMASK) <= VT_CLSID ? wine_vtypes[((v)&VT_TYPEMASK)] : \ ((v)&VT_TYPEMASK) == VT_BSTR_BLOB ? "VT_BSTR_BLOB": "Invalid") #define debugstr_VT(v) (!(v) ? "(null)" : debugstr_vt(V_TYPE((v)))) -extern const char * const wine_vflags[]; +extern const char * const wine_vflags[] DECLSPEC_HIDDEN; #define debugstr_vf(v) (wine_vflags[((v)&VT_EXTRA_TYPE)>>12]) #define debugstr_VF(v) (!(v) ? "(null)" : debugstr_vf(V_EXTRA_TYPE(v))) @@ -125,5 +125,7 @@ typedef struct tagVARIANT_NUMBER_CHARS } VARIANT_NUMBER_CHARS; -BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *); -HRESULT VARIANT_ClearInd(VARIANTARG *); +BOOL VARIANT_GetLocalisedText(LANGID, DWORD, WCHAR *) DECLSPEC_HIDDEN; +HRESULT VARIANT_ClearInd(VARIANTARG *) DECLSPEC_HIDDEN; +BOOL get_date_format(LCID, DWORD, const SYSTEMTIME *, + const WCHAR *, WCHAR *, int) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/oleaut32/vartype.c b/reactos/dll/win32/oleaut32/vartype.c index c7bc15bacfb..5553d77a3c8 100644 --- a/reactos/dll/win32/oleaut32/vartype.c +++ b/reactos/dll/win32/oleaut32/vartype.c @@ -6579,6 +6579,120 @@ HRESULT WINAPI VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut) return *pbstrOut ? S_OK : E_OUTOFMEMORY; } +static inline int output_int_len(int o, int min_len, WCHAR *date, int date_len) +{ + int len, tmp; + + if(min_len >= date_len) + return -1; + + for(len=0, tmp=o; tmp; tmp/=10) len++; + if(!len) len++; + if(len >= date_len) + return -1; + + for(tmp=min_len-len; tmp>0; tmp--) + *date++ = '0'; + for(tmp=len; tmp>0; tmp--, o/=10) + date[tmp-1] = '0' + o%10; + return min_len>len ? min_len : len; +} + +/* format date string, similar to GetDateFormatW function but works on bigger range of dates */ +BOOL get_date_format(LCID lcid, DWORD flags, const SYSTEMTIME *st, + const WCHAR *fmt, WCHAR *date, int date_len) +{ + static const LCTYPE dayname[] = { + LOCALE_SDAYNAME7, LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, + LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6 + }; + static const LCTYPE sdayname[] = { + LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, + LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, + LOCALE_SABBREVDAYNAME6 + }; + static const LCTYPE monthname[] = { + LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME4, + LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, + LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 + }; + static const LCTYPE smonthname[] = { + LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, + LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, + LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9, + LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 + }; + + if(flags & ~(LOCALE_NOUSEROVERRIDE|VAR_DATEVALUEONLY)) + FIXME("ignoring flags %x\n", flags); + flags &= LOCALE_NOUSEROVERRIDE; + + while(*fmt && date_len) { + int count = 1; + + switch(*fmt) { + case 'd': + case 'M': + case 'y': + case 'g': + while(*fmt == *(fmt+count)) + count++; + fmt += count-1; + } + + switch(*fmt) { + case 'd': + if(count >= 4) + count = GetLocaleInfoW(lcid, dayname[st->wDayOfWeek] | flags, date, date_len)-1; + else if(count == 3) + count = GetLocaleInfoW(lcid, sdayname[st->wDayOfWeek] | flags, date, date_len)-1; + else + count = output_int_len(st->wDay, count, date, date_len); + break; + case 'M': + if(count >= 4) + count = GetLocaleInfoW(lcid, monthname[st->wMonth-1] | flags, date, date_len)-1; + else if(count == 3) + count = GetLocaleInfoW(lcid, smonthname[st->wMonth-1] | flags, date, date_len)-1; + else + count = output_int_len(st->wMonth, count, date, date_len); + break; + case 'y': + if(count >= 3) + count = output_int_len(st->wYear, 0, date, date_len); + else + count = output_int_len(st->wYear%100, count, date, date_len); + break; + case 'g': + if(count == 2) { + FIXME("Should be using GetCalendarInfo(CAL_SERASTRING), defaulting to 'AD'\n"); + + *date++ = 'A'; + date_len--; + if(date_len) + *date = 'D'; + else + count = -1; + break; + } + /* fall through */ + default: + *date = *fmt; + } + + if(count < 0) + break; + fmt++; + date += count; + date_len -= count; + } + + if(!date_len) + return FALSE; + *date++ = 0; + return TRUE; +} + /****************************************************************************** * VarBstrFromDate [OLEAUT32.114] * @@ -6599,7 +6713,7 @@ HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbst { SYSTEMTIME st; DWORD dwFormatFlags = dwFlags & LOCALE_NOUSEROVERRIDE; - WCHAR date[128], *time; + WCHAR date[128], fmt_buff[80], *time; TRACE("(%g,0x%08x,0x%08x,%p)\n", dateIn, lcid, dwFlags, pbstrOut); @@ -6622,15 +6736,15 @@ HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbst if (whole == 0.0) dwFlags |= VAR_TIMEVALUEONLY; - else if (partial < 1e-12) + else if (partial > -1e-12 && partial < 1e-12) dwFlags |= VAR_DATEVALUEONLY; } if (dwFlags & VAR_TIMEVALUEONLY) date[0] = '\0'; else - if (!GetDateFormatW(lcid, dwFormatFlags|DATE_SHORTDATE, &st, NULL, date, - sizeof(date)/sizeof(WCHAR))) + if (!GetLocaleInfoW(lcid, LOCALE_SSHORTDATE, fmt_buff, sizeof(fmt_buff)/sizeof(WCHAR)) || + !get_date_format(lcid, dwFlags, &st, fmt_buff, date, sizeof(date)/sizeof(WCHAR))) return E_INVALIDARG; if (!(dwFlags & VAR_DATEVALUEONLY)) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 901b6c185d5..dcafc50461e 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -132,7 +132,7 @@ reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. reactos/dll/win32/odbccp32 # Synced to Wine-1.5.19 reactos/dll/win32/ole32 # Synced to Wine-1.5.26 reactos/dll/win32/oleacc # Autosync -reactos/dll/win32/oleaut32 # Synced to Wine-1.5.19 +reactos/dll/win32/oleaut32 # Synced to Wine-1.5.26 reactos/dll/win32/olecli32 # Synced to Wine-1.5.19 reactos/dll/win32/oledlg # Autosync reactos/dll/win32/olepro32 # Autosync From 38dc6fc8e9d74ecbca62c5c8452dfa5b6dacec80 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 23 Mar 2013 11:25:24 +0000 Subject: [PATCH 58/74] [OLEAUT32_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58589 --- rostests/winetests/oleaut32/dispatch.c | 12 +- rostests/winetests/oleaut32/olefont.c | 31 ++-- rostests/winetests/oleaut32/olepicture.c | 30 ++-- rostests/winetests/oleaut32/safearray.c | 34 ++-- rostests/winetests/oleaut32/test_reg.idl | 8 + rostests/winetests/oleaut32/testlist.c | 5 +- rostests/winetests/oleaut32/tmarshal.c | 19 +- rostests/winetests/oleaut32/tmarshal.rc | 10 +- rostests/winetests/oleaut32/typelib.c | 210 +++++++++++++++++++---- rostests/winetests/oleaut32/usrmarshal.c | 15 +- rostests/winetests/oleaut32/varformat.c | 34 ++-- rostests/winetests/oleaut32/vartest.c | 30 ++-- rostests/winetests/oleaut32/vartype.c | 56 +++++- 13 files changed, 366 insertions(+), 128 deletions(-) diff --git a/rostests/winetests/oleaut32/dispatch.c b/rostests/winetests/oleaut32/dispatch.c index 0f52241f996..cd531287adb 100644 --- a/rostests/winetests/oleaut32/dispatch.c +++ b/rostests/winetests/oleaut32/dispatch.c @@ -18,10 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #include -#include -#include -#include +//#include +//#include +#include +#include +//#include static const WCHAR szSunshine[] = {'S','u','n','s','h','i','n','e',0}; diff --git a/rostests/winetests/oleaut32/olefont.c b/rostests/winetests/oleaut32/olefont.c index 24825540ec1..3a20f2fae4e 100644 --- a/rostests/winetests/oleaut32/olefont.c +++ b/rostests/winetests/oleaut32/olefont.c @@ -20,25 +20,30 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include -#include -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include +//#include +//#include +//#include #define COBJMACROS #include -#include -#include -#include +//#include +//#include +//#include #include -#include -#include -#include -#include -#include +//#include +//#include +//#include +//#include +//#include +#include #include -#include +//#include DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); diff --git a/rostests/winetests/oleaut32/olepicture.c b/rostests/winetests/oleaut32/olepicture.c index 3f64c67e3fd..40118a5ad8d 100644 --- a/rostests/winetests/oleaut32/olepicture.c +++ b/rostests/winetests/oleaut32/olepicture.c @@ -19,28 +19,32 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include -#include -#include +//#include +//#include #define COBJMACROS #define CONST_VTABLE #define NONAMELESSUNION -#include "wine/test.h" -#include -#include -#include +#include +//#include +//#include +//#include #include #include -#include -#include - -#include -#include +//#include +//#include +#include +//#include +//#include #include -#include +//#include #define expect_eq(expr, value, type, format) { type ret = (expr); ok((value) == ret, #expr " expected " format " got " format "\n", value, ret); } diff --git a/rostests/winetests/oleaut32/safearray.c b/rostests/winetests/oleaut32/safearray.c index b6893345f59..1d634f9afbe 100644 --- a/rostests/winetests/oleaut32/safearray.c +++ b/rostests/winetests/oleaut32/safearray.c @@ -19,25 +19,29 @@ * */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include -#include -#include +//#include +//#include #define COBJMACROS #define CONST_VTABLE -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "wingdi.h" -#include "winnls.h" -#include "winsock.h" -#include "winerror.h" -#include "winnt.h" - -#include "wtypes.h" -#include "oleauto.h" +#include +//#include "windef.h" +//#include "winbase.h" +//#include "winuser.h" +//#include "wingdi.h" +//#include "winnls.h" +//#include "winsock.h" +//#include "winerror.h" +//#include "winnt.h" +#include +//#include "wtypes.h" +#include static HMODULE hOleaut32; diff --git a/rostests/winetests/oleaut32/test_reg.idl b/rostests/winetests/oleaut32/test_reg.idl index 4598efd5ce7..7f73b2502e9 100644 --- a/rostests/winetests/oleaut32/test_reg.idl +++ b/rostests/winetests/oleaut32/test_reg.idl @@ -127,4 +127,12 @@ library register_test interface Iole_from_disp; } + [ + uuid(f1b68c3b-02a3-4110-bc4c-cf9bc7e7f177) + ] + interface IInvokeTest : IDispatch + { + [propget, id(DISPID_VALUE)] + LONG test([in] LONG i); + } } diff --git a/rostests/winetests/oleaut32/testlist.c b/rostests/winetests/oleaut32/testlist.c index 7ba9bf2741f..805c68e80d3 100644 --- a/rostests/winetests/oleaut32/testlist.c +++ b/rostests/winetests/oleaut32/testlist.c @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_dispatch(void); extern void func_olefont(void); diff --git a/rostests/winetests/oleaut32/tmarshal.c b/rostests/winetests/oleaut32/tmarshal.c index 9b90dce6bba..245ae71d56a 100644 --- a/rostests/winetests/oleaut32/tmarshal.c +++ b/rostests/winetests/oleaut32/tmarshal.c @@ -17,16 +17,25 @@ * */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE -#include -#include -#include +//#include +#include +#include +#include +#include +#include +//#include +//#include -#include "wine/test.h" +#include -#include "tmarshal.h" +#include #include "tmarshal_dispids.h" static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT); diff --git a/rostests/winetests/oleaut32/tmarshal.rc b/rostests/winetests/oleaut32/tmarshal.rc index cbb3b189599..f514e8e9b8c 100644 --- a/rostests/winetests/oleaut32/tmarshal.rc +++ b/rostests/winetests/oleaut32/tmarshal.rc @@ -18,14 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winnls.h" +#include +//#include "winbase.h" +//#include "winuser.h" +//#include "winnls.h" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL -#include "wine/wine_common_ver.rc" +#include /* @makedep: tmarshal.tlb */ 1 TYPELIB tmarshal.tlb diff --git a/rostests/winetests/oleaut32/typelib.c b/rostests/winetests/oleaut32/typelib.c index dab2aaac2ed..6129ae64130 100644 --- a/rostests/winetests/oleaut32/typelib.c +++ b/rostests/winetests/oleaut32/typelib.c @@ -19,20 +19,28 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS +#define CONST_VTABLE #include -#include +//#include #include -#include "windef.h" -#include "winbase.h" -#include "oleauto.h" -#include "ocidl.h" -#include "shlwapi.h" -#include "tmarshal.h" +//#include "windef.h" +//#include "winbase.h" +#include +#include +#include +#include +//#include "ocidl.h" +//#include "shlwapi.h" +#include -#include "test_reg.h" +#include #define expect_eq(expr, value, type, format) { type _ret = (expr); ok((value) == _ret, #expr " expected " format " got " format "\n", value, _ret); } #define expect_int(expr, value) expect_eq(expr, (int)(value), int, "%d") @@ -64,6 +72,74 @@ static WCHAR wszguid[] = {'g','u','i','d',0}; static const int is_win64 = sizeof(void *) > sizeof(int); +static HRESULT WINAPI invoketest_QueryInterface(IInvokeTest *iface, REFIID riid, void **ret) +{ + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDispatch) || + IsEqualIID(riid, &IID_IInvokeTest)) + { + *ret = iface; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI invoketest_AddRef(IInvokeTest *iface) +{ + return 2; +} + +static ULONG WINAPI invoketest_Release(IInvokeTest *iface) +{ + return 1; +} + +static HRESULT WINAPI invoketest_GetTypeInfoCount(IInvokeTest *iface, UINT *cnt) +{ + ok(0, "unexpected call\n"); + *cnt = 0; + return E_NOTIMPL; +} + +static HRESULT WINAPI invoketest_GetTypeInfo(IInvokeTest *iface, UINT index, LCID lcid, ITypeInfo **ti) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI invoketest_GetIDsOfNames(IInvokeTest *iface, REFIID riid, LPOLESTR *names, + UINT cnt, LCID lcid, DISPID *dispid) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI invoketest_Invoke(IInvokeTest *iface, DISPID dispid, REFIID riid, + LCID lcid, WORD flags, DISPPARAMS *dispparams, VARIANT *res, EXCEPINFO *ei, UINT *argerr) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static LONG WINAPI invoketest_get_test(IInvokeTest *iface, LONG i) +{ + return i+1; +} + +static const IInvokeTestVtbl invoketestvtbl = { + invoketest_QueryInterface, + invoketest_AddRef, + invoketest_Release, + invoketest_GetTypeInfoCount, + invoketest_GetTypeInfo, + invoketest_GetIDsOfNames, + invoketest_Invoke, + invoketest_get_test +}; + +static IInvokeTest invoketest = { &invoketestvtbl }; + static void init_function_pointers(void) { HMODULE hmod = GetModuleHandleA("oleaut32.dll"); @@ -534,6 +610,27 @@ static void test_CreateDispTypeInfo(void) SysFreeString(methdata[3].szName); } +static const char *create_test_typelib(int res_no) +{ + static char filename[MAX_PATH]; + HANDLE file; + HRSRC res; + void *ptr; + DWORD written; + + GetTempFileNameA( ".", "tlb", 0, filename ); + file = CreateFile( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" ); + if (file == INVALID_HANDLE_VALUE) return NULL; + res = FindResource( GetModuleHandle(0), MAKEINTRESOURCE(res_no), "TYPELIB" ); + ok( res != 0, "couldn't find resource\n" ); + ptr = LockResource( LoadResource( GetModuleHandle(0), res )); + WriteFile( file, ptr, SizeofResource( GetModuleHandle(0), res ), &written, NULL ); + ok( written == SizeofResource( GetModuleHandle(0), res ), "couldn't write resource\n" ); + CloseHandle( file ); + return filename; +} + static void test_TypeInfo(void) { ITypeLib *pTypeLib; @@ -549,9 +646,11 @@ static void test_TypeInfo(void) DISPID dispidMember; DISPPARAMS dispparams; GUID bogusguid = {0x806afb4f,0x13f7,0x42d2,{0x89,0x2c,0x6c,0x97,0xc3,0x6a,0x36,0xc1}}; - VARIANT var; - UINT count; + VARIANT var, res, args[2]; + UINT count, i; TYPEKIND kind; + const char *filenameA; + WCHAR filename[MAX_PATH]; hr = LoadTypeLib(wszStdOle2, &pTypeLib); ok_ole_success(hr, LoadTypeLib); @@ -714,6 +813,53 @@ static void test_TypeInfo(void) ITypeInfo_Release(pTypeInfo); ITypeLib_Release(pTypeLib); + + filenameA = create_test_typelib(3); + MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filename, MAX_PATH); + hr = LoadTypeLib(filename, &pTypeLib); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_IInvokeTest, &pTypeInfo); + ok(hr == S_OK, "got 0x%08x\n", hr); + + dispparams.cArgs = 1; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.rgvarg = args; + + V_VT(&args[0]) = VT_I4; + V_I4(&args[0]) = 0; + + V_VT(&res) = VT_EMPTY; + + i = 0; + V_VT(&res) = VT_EMPTY; + V_I4(&res) = 0; + /* call propget with DISPATCH_METHOD|DISPATCH_PROPERTYGET flags */ + hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, DISPID_VALUE, DISPATCH_METHOD|DISPATCH_PROPERTYGET, + &dispparams, &res, NULL, &i); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res)); + ok(V_I4(&res) == 1, "got %d\n", V_I4(&res)); + + i = 0; + /* call propget with DISPATCH_METHOD flags */ + hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, DISPID_VALUE, DISPATCH_METHOD, + &dispparams, &res, NULL, &i); + ok(hr == DISP_E_MEMBERNOTFOUND, "got 0x%08x, %d\n", hr, i); + + i = 0; + V_VT(&res) = VT_EMPTY; + V_I4(&res) = 0; + hr = ITypeInfo_Invoke(pTypeInfo, &invoketest, DISPID_VALUE, DISPATCH_PROPERTYGET, + &dispparams, &res, NULL, &i); + ok(hr == S_OK, "got 0x%08x, %d\n", hr, i); + ok(V_VT(&res) == VT_I4, "got %d\n", V_VT(&res)); + ok(V_I4(&res) == 1, "got %d\n", V_I4(&res)); + + ITypeInfo_Release(pTypeInfo); + ITypeLib_Release(pTypeLib); + DeleteFileA(filenameA); } static int WINAPI int_func( int a0, int a1, int a2, int a3, int a4 ) @@ -784,6 +930,11 @@ static int WINAPI inst_func( void *inst, int a ) return a * 2; } +static HRESULT WINAPI ret_false_func(void) +{ + return S_FALSE; +} + static const void *vtable[] = { NULL, NULL, NULL, inst_func }; static void test_DispCallFunc(void) @@ -899,6 +1050,17 @@ static void test_DispCallFunc(void) ok( res == S_OK, "DispCallFunc failed %x\n", res ); ok( V_VT(&result) == VT_I4, "wrong result type %d\n", V_VT(&result) ); ok( V_I4(&result) == 6, "wrong result %08x\n", V_I4(&result) ); + + memset( &result, 0xcc, sizeof(result) ); + res = DispCallFunc(NULL, (ULONG_PTR)ret_false_func, CC_STDCALL, VT_ERROR, 0, NULL, NULL, &result); + ok(res == S_OK, "DispCallFunc failed: %08x\n", res); + ok(V_VT(&result) == VT_ERROR, "V_VT(result) = %u\n", V_VT(&result)); + ok(V_ERROR(&result) == S_FALSE, "V_ERROR(result) = %08x\n", V_ERROR(&result)); + + memset( &result, 0xcc, sizeof(result) ); + res = DispCallFunc(NULL, (ULONG_PTR)ret_false_func, CC_STDCALL, VT_HRESULT, 0, NULL, NULL, &result); + ok(res == E_INVALIDARG, "DispCallFunc failed: %08x\n", res); + ok(V_VT(&result) == 0xcccc, "V_VT(result) = %u\n", V_VT(&result)); } /* RegDeleteTreeW from dlls/advapi32/registry.c */ @@ -2722,27 +2884,6 @@ static void test_dump_typelib(const char *name) #endif -static const char *create_test_typelib(int res_no) -{ - static char filename[MAX_PATH]; - HANDLE file; - HRSRC res; - void *ptr; - DWORD written; - - GetTempFileNameA( ".", "tlb", 0, filename ); - file = CreateFile( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); - ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" ); - if (file == INVALID_HANDLE_VALUE) return NULL; - res = FindResource( GetModuleHandle(0), MAKEINTRESOURCE(res_no), "TYPELIB" ); - ok( res != 0, "couldn't find resource\n" ); - ptr = LockResource( LoadResource( GetModuleHandle(0), res )); - WriteFile( file, ptr, SizeofResource( GetModuleHandle(0), res ), &written, NULL ); - ok( written == SizeofResource( GetModuleHandle(0), res ), "couldn't write resource\n" ); - CloseHandle( file ); - return filename; -} - static void test_create_typelib_lcid(LCID lcid) { char filename[MAX_PATH]; @@ -2813,7 +2954,7 @@ static void test_register_typelib(BOOL system_registration) { TYPEKIND kind; WORD flags; - } attrs[11] = + } attrs[12] = { { TKIND_INTERFACE, 0 }, { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE }, @@ -2825,7 +2966,8 @@ static void test_register_typelib(BOOL system_registration) { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL }, { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE }, { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE }, - { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE } + { TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE }, + { TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE } }; trace("Starting %s typelib registration tests\n", @@ -2857,7 +2999,7 @@ static void test_register_typelib(BOOL system_registration) ok(hr == S_OK, "got %08x\n", hr); count = ITypeLib_GetTypeInfoCount(typelib); - ok(count == 11, "got %d\n", count); + ok(count == 12, "got %d\n", count); for(i = 0; i < count; i++) { diff --git a/rostests/winetests/oleaut32/usrmarshal.c b/rostests/winetests/oleaut32/usrmarshal.c index 4f7b8431e45..a1127e0f463 100644 --- a/rostests/winetests/oleaut32/usrmarshal.c +++ b/rostests/winetests/oleaut32/usrmarshal.c @@ -18,17 +18,22 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS #define CONST_VTABLE #include -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "propidl.h" /* for LPSAFEARRAY_User* routines */ +#include +#include +#include +//#include "objbase.h" +//#include "propidl.h" /* for LPSAFEARRAY_User* routines */ -#include "wine/test.h" +#include #if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION) # define V_U2(A) ((A)->n1.n2) diff --git a/rostests/winetests/oleaut32/varformat.c b/rostests/winetests/oleaut32/varformat.c index 0354d198229..5f1ea51e22d 100644 --- a/rostests/winetests/oleaut32/varformat.c +++ b/rostests/winetests/oleaut32/varformat.c @@ -19,23 +19,27 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include -#include -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "windef.h" -#include "winbase.h" -#include "winsock.h" -#include "wine/test.h" -#include "winuser.h" -#include "wingdi.h" -#include "winnls.h" -#include "winerror.h" -#include "winnt.h" +//#include +//#include +//#include +//#include -#include "wtypes.h" -#include "oleauto.h" +//#include "windef.h" +//#include "winbase.h" +//#include "winsock.h" +#include +//#include "winuser.h" +//#include "wingdi.h" +#include +//#include "winerror.h" +//#include "winnt.h" +#include +//#include "wtypes.h" +#include static HMODULE hOleaut32; diff --git a/rostests/winetests/oleaut32/vartest.c b/rostests/winetests/oleaut32/vartest.c index c7b46dbeba2..429ff242c96 100644 --- a/rostests/winetests/oleaut32/vartest.c +++ b/rostests/winetests/oleaut32/vartest.c @@ -19,25 +19,29 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include #include #include #define CONST_VTABLE -#include "windef.h" -#include "winbase.h" -#include "winsock.h" -#include "wine/test.h" -#include "winuser.h" -#include "wingdi.h" -#include "winnls.h" -#include "winerror.h" -#include "winnt.h" - -#include "wtypes.h" -#include "oleauto.h" +//#include "windef.h" +//#include "winbase.h" +//#include "winsock.h" +#include +//#include "winuser.h" +//#include "wingdi.h" +#include +//#include "winerror.h" +//#include "winnt.h" +#include +//#include "wtypes.h" +#include static HMODULE hOleaut32; diff --git a/rostests/winetests/oleaut32/vartype.c b/rostests/winetests/oleaut32/vartype.c index 58b30b1c892..9fda4e6a67c 100644 --- a/rostests/winetests/oleaut32/vartype.c +++ b/rostests/winetests/oleaut32/vartype.c @@ -18,10 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define CONST_VTABLE -#include "wine/test.h" -#include "oleauto.h" +#include +#include +#include +#include #include /* Some Visual C++ versions choke on __uint64 to float conversions. @@ -4951,7 +4957,8 @@ static void test_VarBstrFromDate(void) BSTR_DATE(365.25, "12/30/1900 6:00:00 AM"); BSTR_DATE(1461.0, "12/31/1903"); BSTR_DATE(1461.5, "12/31/1903 12:00:00 PM"); - todo_wine { BSTR_DATE(-657434.0, "1/1/100"); } + BSTR_DATE(-49192.24, "4/24/1765 5:45:36 AM"); + BSTR_DATE(-657434.0, "1/1/100"); BSTR_DATE(2958465.0, "12/31/9999"); #undef BSTR_DATE @@ -6072,6 +6079,47 @@ static void test_ChangeType_keep_dst(void) SysFreeString(bstr); } +/* This tests assumes an empty cache, so it needs to be ran early in the test. */ +static void test_bstr_cache(void) +{ + BSTR str, str2, strs[20]; + unsigned i; + + static const WCHAR testW[] = {'t','e','s','t',0}; + + str = SysAllocString(testW); + /* This should put the string into cache */ + SysFreeString(str); + /* The string is in cache, this won't touch it */ + SysFreeString(str); + + ok(SysStringLen(str) == 4, "unexpected len\n"); + ok(!lstrcmpW(str, testW), "string changed\n"); + + str2 = SysAllocString(testW); + ok(str == str2, "str != str2\n"); + SysFreeString(str2); + + /* Fill the bucket with cached entries. */ + for(i=0; i < sizeof(strs)/sizeof(*strs); i++) + strs[i] = SysAllocStringLen(NULL, 24); + for(i=0; i < sizeof(strs)/sizeof(*strs); i++) + SysFreeString(strs[i]); + + /* Following allocation will be made from cache */ + str = SysAllocStringLen(NULL, 24); + ok(str == strs[0], "str != strs[0]\n"); + + /* Smaller buffers may also use larget cached buffers */ + str2 = SysAllocStringLen(NULL, 16); + ok(str2 == strs[1], "str2 != strs[1]\n"); + + SysFreeString(str); + SysFreeString(str2); + SysFreeString(str); + SysFreeString(str2); +} + START_TEST(vartype) { hOleaut32 = GetModuleHandleA("oleaut32.dll"); @@ -6079,6 +6127,8 @@ START_TEST(vartype) trace("LCIDs: System=0x%08x, User=0x%08x\n", GetSystemDefaultLCID(), GetUserDefaultLCID()); + test_bstr_cache(); + test_VarI1FromI2(); test_VarI1FromI4(); test_VarI1FromI8(); From fad117e7dec6a76a30a760e4214c29f9297814c2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 23 Mar 2013 11:26:10 +0000 Subject: [PATCH 59/74] [CRT] * Annotate sys/timeb.h. svn path=/trunk/; revision=58590 --- reactos/include/crt/sys/timeb.h | 40 ++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/reactos/include/crt/sys/timeb.h b/reactos/include/crt/sys/timeb.h index 574c9704f27..c4ba001033b 100644 --- a/reactos/include/crt/sys/timeb.h +++ b/reactos/include/crt/sys/timeb.h @@ -55,13 +55,41 @@ extern "C" { #endif /* !_TIMEB_DEFINED */ - _CRTIMP void __cdecl _ftime(struct _timeb *_Time); - _CRT_INSECURE_DEPRECATE(_ftime32_s) _CRTIMP void __cdecl _ftime32(struct __timeb32 *_Time); - _CRTIMP errno_t __cdecl _ftime32_s(struct __timeb32 *_Time); + _CRTIMP + void + __cdecl + _ftime( + _Out_ struct _timeb *_Time); + + _CRT_INSECURE_DEPRECATE(_ftime32_s) + _CRTIMP + void + __cdecl + _ftime32( + _Out_ struct __timeb32 *_Time); + + _CRTIMP + errno_t + __cdecl + _ftime32_s( + _Out_ struct __timeb32 *_Time); + #if _INTEGRAL_MAX_BITS >= 64 - _CRT_INSECURE_DEPRECATE(_ftime64_s) _CRTIMP void __cdecl _ftime64(struct __timeb64 *_Time); - _CRTIMP errno_t __cdecl _ftime64_s(struct __timeb64 *_Time); -#endif + + _CRT_INSECURE_DEPRECATE(_ftime64_s) + _CRTIMP + void + __cdecl + _ftime64( + _Out_ struct __timeb64 *_Time); + + _CRTIMP + errno_t + __cdecl + _ftime64_s( + _Out_ struct __timeb64 *_Time); + +#endif /* _INTEGRAL_MAX_BITS >= 64 */ #ifndef NO_OLDNAMES #if !defined (RC_INVOKED) From 99afe97aa2f8bf901bd92b3f3088ebdb69487bc6 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 23 Mar 2013 17:59:35 +0000 Subject: [PATCH 60/74] [TOOLS] Fix some compiler warnings, improve formatting, diagnostic messages. svn path=/trunk/; revision=58591 --- reactos/tools/geninc/geninc.c | 6 ++- reactos/tools/mkhive/reginf.c | 2 +- reactos/tools/mkhive/registry.c | 2 + reactos/tools/mkshelllink/mkshelllink.c | 62 +++++++++++++------------ reactos/tools/obj2bin/obj2bin.c | 11 ++--- reactos/tools/rsym/rsym.c | 8 ++-- 6 files changed, 48 insertions(+), 43 deletions(-) diff --git a/reactos/tools/geninc/geninc.c b/reactos/tools/geninc/geninc.c index a3f6605b63d..fccc7a58fb0 100644 --- a/reactos/tools/geninc/geninc.c +++ b/reactos/tools/geninc/geninc.c @@ -1,4 +1,6 @@ - +/* + * Generates assembly definitions from the target headers. + */ #include #include @@ -104,7 +106,7 @@ int main(int argc, char* argv[]) /* Verify the PE signature */ if (signature != 0x4550) { - fprintf(stderr, "Invalid signature: 0x%lx.\n", signature); + fprintf(stderr, "Invalid signature: 0x%x.\n", signature); goto quit; } diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index 330afc0a4ae..2b94fbc6ef8 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -430,7 +430,7 @@ registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) else { /* get flags */ - if (InfHostGetIntField (Context, 4, &Flags) != 0) + if (InfHostGetIntField (Context, 4, (INT *)&Flags) != 0) Flags = 0; } diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index b232ef957d0..80778fed243 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -562,6 +562,8 @@ RegQueryValueExA( rc = RegQueryValueExW(hKey, lpValueNameW, lpReserved, lpType, lpData, lpcbData); if (lpValueNameW) free(lpValueNameW); + if (rc != ERROR_SUCCESS) + return rc; return ERROR_UNSUCCESSFUL; } diff --git a/reactos/tools/mkshelllink/mkshelllink.c b/reactos/tools/mkshelllink/mkshelllink.c index 7f5cda40875..b8a00b3a13b 100644 --- a/reactos/tools/mkshelllink/mkshelllink.c +++ b/reactos/tools/mkshelllink/mkshelllink.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #ifndef _MSC_VER @@ -19,7 +20,8 @@ typedef unsigned __int32 uint32_t; #define SW_SHOWNORMAL 1 #define SW_SHOWMINNOACTIVE 7 -typedef struct _GUID { +typedef struct _GUID +{ uint32_t Data1; uint16_t Data2; uint16_t Data3; @@ -140,7 +142,7 @@ int main(int argc, const char *argv[]) LNK_HEADER Header; uint16_t uhTmp; uint32_t dwTmp; - + for (i = 1; i < argc; ++i) { if (argv[i][0] != '-' && argv[i][0] != '/') @@ -166,8 +168,8 @@ int main(int argc, const char *argv[]) else if (!strcmp(argv[i] + 1, "g") && i + 1 < argc) { unsigned Data4Tmp[8], j; - - sscanf(argv[++i], "{%8lx-%4hx-%4hx-%2x%2x-%2x%2x%2x%2x%2x%2x}", + + sscanf(argv[++i], "{%8x-%4hx-%4hx-%2x%2x-%2x%2x%2x%2x%2x%2x}", &Guid.Data1, &Guid.Data2, &Guid.Data3, &Data4Tmp[0], &Data4Tmp[1], &Data4Tmp[2], &Data4Tmp[3], &Data4Tmp[4], &Data4Tmp[5], &Data4Tmp[6], &Data4Tmp[7]); @@ -177,7 +179,7 @@ int main(int argc, const char *argv[]) else printf("Invalid option: %s\n", argv[i]); } - + if (!pszTarget || bHelp) { printf("Usage: %s [-o path][-d descr][-w path][-c cmd_line_args][-i icon_path [nr]][-h][-g guid] target\n" @@ -191,14 +193,14 @@ int main(int argc, const char *argv[]) "target\tAbsolute or relative to guid specified with -g option path\n", argv[0]); return 0; } - + pFile = fopen(pszOutputPath, "wb"); if (!pFile) { printf("Failed to open %s\n", pszOutputPath); return -1; } - + // Header memset(&Header, 0, sizeof(Header)); Header.Signature = (uint32_t)'L'; @@ -215,7 +217,7 @@ int main(int argc, const char *argv[]) Header.IconNr = IconNr; Header.Show = bMinimized ? SW_SHOWMINNOACTIVE : SW_SHOWNORMAL; fwrite(&Header, sizeof(Header), 1, pFile); - + if (Header.Flags & LINK_ID_LIST) { ID_LIST_FILE IdListFile; @@ -223,12 +225,12 @@ int main(int argc, const char *argv[]) ID_LIST_DRIVE IdListDrive; unsigned cbListSize = sizeof(IdListGuid) + sizeof(uint16_t), cchName; const char *pszName = pszTarget; - + // ID list // It seems explorer does not accept links without id list. List is relative to desktop. - + pszName = pszTarget; - + if (pszName[0] && pszName[1] == ':') { cbListSize += sizeof(IdListDrive); @@ -236,32 +238,32 @@ int main(int argc, const char *argv[]) while (*pszName == '\\' || *pszName == '/') ++pszName; } - + while (*pszName) { cchName = 0; while (pszName[cchName] && pszName[cchName] != '\\' && pszName[cchName] != '/') ++cchName; - + if (cchName != 1 || pszName[0] != '.') cbListSize += sizeof(IdListFile) + 2 * (cchName + 1); - + pszName += cchName; while (*pszName == '\\' || *pszName == '/') ++pszName; } - + uhTmp = cbListSize; fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); // size - + IdListGuid.Size = sizeof(IdListGuid); IdListGuid.Type = PT_GUID; IdListGuid.dummy = 0x50; IdListGuid.guid = Guid; fwrite(&IdListGuid, sizeof(IdListGuid), 1, pFile); - + pszName = pszTarget; - + if (isalpha(pszName[0]) && pszName[1] == ':') { memset(&IdListDrive, 0, sizeof(IdListDrive)); @@ -273,13 +275,13 @@ int main(int argc, const char *argv[]) while(*pszName == '\\' || *pszName == '/') ++pszName; } - + while (*pszName) { cchName = 0; while (pszName[cchName] && pszName[cchName] != '\\' && pszName[cchName] != '/') ++cchName; - + if (cchName != 1 || pszName[0] != '.') { memset(&IdListFile, 0, sizeof(IdListFile)); @@ -294,16 +296,16 @@ int main(int argc, const char *argv[]) fwrite(pszName, cchName, 1, pFile); fputc(0, pFile); } - + pszName += cchName; while (*pszName == '\\' || *pszName == '/') ++pszName; } - + uhTmp = 0; // list end fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); } - + if (Header.Flags & LINK_DESCRIPTION) { // Dscription @@ -311,7 +313,7 @@ int main(int argc, const char *argv[]) fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); fputs(pszDescription, pFile); } - + if (Header.Flags & LINK_RELATIVE_PATH) { // Relative Path @@ -319,7 +321,7 @@ int main(int argc, const char *argv[]) fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); fputs(pszTarget, pFile); } - + if (Header.Flags & LINK_WORKING_DIR) { // Working Dir @@ -327,7 +329,7 @@ int main(int argc, const char *argv[]) fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); fputs(pszWorkingDir, pFile); } - + if (Header.Flags & LINK_CMD_LINE_ARGS) { // Command line arguments @@ -335,7 +337,7 @@ int main(int argc, const char *argv[]) fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); fputs(pszCmdLineArgs, pFile); } - + if (Header.Flags & LINK_ICON) { // Command line arguments @@ -343,12 +345,12 @@ int main(int argc, const char *argv[]) fwrite(&uhTmp, sizeof(uhTmp), 1, pFile); fputs(pszIcon, pFile); } - + // Extra stuff dwTmp = 0; fwrite(&dwTmp, sizeof(dwTmp), 1, pFile); - + fclose(pFile); - + return 0; } diff --git a/reactos/tools/obj2bin/obj2bin.c b/reactos/tools/obj2bin/obj2bin.c index 478487401f3..770e813c41c 100644 --- a/reactos/tools/obj2bin/obj2bin.c +++ b/reactos/tools/obj2bin/obj2bin.c @@ -51,7 +51,7 @@ RelocateSection( break; default: - printf("Unknown relocatation type %ld address %ld\n", + printf("Unknown relocatation type %d, address 0x%lx\n", pReloc->Type, pReloc->VirtualAddress); } @@ -107,7 +107,7 @@ int main(int argc, char *argv[]) { free(pData); fclose(pSourceFile); - fprintf(stderr, "Failed to read source file: %ld\n", nFileSize); + fprintf(stderr, "Failed to read %ld bytes from source file\n", nFileSize); return -4; } @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) if (!pDestFile) { free(pData); - fprintf(stderr, "Couldn't open dest file '%s'\n", pszDestFile); + fprintf(stderr, "Couldn't open destination file '%s'\n", pszDestFile); return -5; } @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) for (i = 0; i < pFileHeader->NumberOfSections; i++) { /* Check if this is '.text' section */ - if ((strcmp(pSectionHeader->Name, ".text") == 0) && + if ((strcmp((char*)pSectionHeader->Name, ".text") == 0) && (pSectionHeader->SizeOfRawData != 0)) { RelocateSection(pData, @@ -146,7 +146,7 @@ int main(int argc, char *argv[]) { free(pData); fclose(pDestFile); - fprintf(stderr, "Failed to write data %ld\n", + fprintf(stderr, "Failed to write %ld bytes to destination file\n", pSectionHeader->SizeOfRawData); return -6; } @@ -162,4 +162,3 @@ int main(int argc, char *argv[]) return 0; } - diff --git a/reactos/tools/rsym/rsym.c b/reactos/tools/rsym/rsym.c index 3894d406dea..1690d4f206f 100644 --- a/reactos/tools/rsym/rsym.c +++ b/reactos/tools/rsym/rsym.c @@ -60,7 +60,7 @@ GetStabInfo(void *FileData, PIMAGE_FILE_HEADER PEFileHeader, for (Idx = 0; Idx < PEFileHeader->NumberOfSections; Idx++) { /* printf("section: '%.08s'\n", PESectionHeaders[Idx].Name); */ - if ((strncmp((char*)PESectionHeaders[Idx].Name, ".stab", 5) == 0) + if ((strncmp((char *) PESectionHeaders[Idx].Name, ".stab", 5) == 0) && (PESectionHeaders[Idx].Name[5] == 0)) { /* printf(".stab section found. Size %d\n", @@ -70,7 +70,7 @@ GetStabInfo(void *FileData, PIMAGE_FILE_HEADER PEFileHeader, *StabSymbolsBase = (void *)((char *) FileData + PESectionHeaders[Idx].PointerToRawData); } - if (strncmp((char*)PESectionHeaders[Idx].Name, ".stabstr", 8) == 0) + if (strncmp((char *) PESectionHeaders[Idx].Name, ".stabstr", 8) == 0) { /* printf(".stabstr section found. Size %d\n", PESectionHeaders[Idx].SizeOfRawData); */ @@ -528,7 +528,7 @@ CreateOutputFile(FILE *OutFile, void *InData, if ((0 == StartOfRawData || InSectionHeaders[Section].PointerToRawData < StartOfRawData) && 0 != InSectionHeaders[Section].PointerToRawData - && 0 != (strncmp(InSectionHeaders[Section].Name, ".stab", 5))) + && 0 != (strncmp((char *) InSectionHeaders[Section].Name, ".stab", 5))) { StartOfRawData = InSectionHeaders[Section].PointerToRawData; } @@ -580,7 +580,7 @@ CreateOutputFile(FILE *OutFile, void *InData, OutRelocSection = NULL; for (Section = 0; Section < InFileHeader->NumberOfSections; Section++) { - if (0 != (strncmp(InSectionHeaders[Section].Name, ".stab", 5))) + if (0 != (strncmp((char *) InSectionHeaders[Section].Name, ".stab", 5))) { *CurrentSectionHeader = InSectionHeaders[Section]; CurrentSectionHeader->PointerToLinenumbers = 0; From 6b7605bd228a1935c746e649425f8f5a836294b3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Mar 2013 18:43:27 +0000 Subject: [PATCH 61/74] [CMAKE] Implement add_object_library function svn path=/trunk/; revision=58592 --- reactos/cmake/CMakeMacros.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reactos/cmake/CMakeMacros.cmake b/reactos/cmake/CMakeMacros.cmake index ba7f4a73418..8a08e1a7147 100644 --- a/reactos/cmake/CMakeMacros.cmake +++ b/reactos/cmake/CMakeMacros.cmake @@ -422,3 +422,13 @@ function(get_defines OUTPUT_VAR) endforeach() set(${OUTPUT_VAR} ${__tmp_var} PARENT_SCOPE) endfunction() + +if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) + function(add_object_library _target) + add_library(${_target} OBJECT ${ARGN}) + endfunction() +else() + function(add_object_library _target) + add_library(${_target} ${ARGN}) + endfunction() +endif() From b8ae1388ea5e10e95307de6c6d5c10b07fed8e0e Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sat, 23 Mar 2013 19:19:16 +0000 Subject: [PATCH 62/74] [TRANSLATION] Update translations: - Turkish by Erdem Ersoy (CORE-7014); - Italian by Paolo Devoti (CORE-7024). svn path=/trunk/; revision=58593 --- .../games/solitaire/lang/tr-TR.rc | 4 +- .../applications/games/spider/lang/tr-TR.rc | 2 +- .../applications/games/winmine/lang/tr-TR.rc | 18 ++-- .../base/applications/magnify/lang/tr-TR.rc | 2 +- .../base/applications/mplay32/lang/tr-TR.rc | 8 +- .../base/applications/mspaint/lang/tr-TR.rc | 82 +++++++++---------- .../base/applications/notepad/lang/tr-TR.rc | 20 ++--- .../base/applications/regedit/lang/it-IT.rc | 12 +-- .../base/applications/sndrec32/lang/en-US.rc | 4 +- .../base/applications/sndrec32/lang/tr-TR.rc | 8 +- reactos/base/applications/wordpad/En.rc | 2 +- reactos/base/applications/wordpad/Tr.rc | 32 ++++---- reactos/dll/cpl/timedate/lang/it-IT.rc | 6 +- reactos/dll/cpl/timedate/rsrc.rc | 7 +- reactos/dll/win32/userenv/lang/it-IT.rc | 22 ++--- 15 files changed, 115 insertions(+), 114 deletions(-) diff --git a/reactos/base/applications/games/solitaire/lang/tr-TR.rc b/reactos/base/applications/games/solitaire/lang/tr-TR.rc index d4ff3c7a838..80da4cd23db 100644 --- a/reactos/base/applications/games/solitaire/lang/tr-TR.rc +++ b/reactos/base/applications/games/solitaire/lang/tr-TR.rc @@ -71,8 +71,8 @@ BEGIN BEGIN MENUITEM "&Dağıt\tF2", IDM_GAME_NEW MENUITEM SEPARATOR - MENUITEM "D&esteler", IDM_GAME_DECK - MENUITEM "&Ayarlar", IDM_GAME_OPTIONS + MENUITEM "D&esteler...", IDM_GAME_DECK + MENUITEM "&Ayarlar...", IDM_GAME_OPTIONS MENUITEM SEPARATOR MENUITEM "&Çıkış", IDM_GAME_EXIT END diff --git a/reactos/base/applications/games/spider/lang/tr-TR.rc b/reactos/base/applications/games/spider/lang/tr-TR.rc index 2e7e0e8a5cd..0da28065b7c 100644 --- a/reactos/base/applications/games/spider/lang/tr-TR.rc +++ b/reactos/base/applications/games/spider/lang/tr-TR.rc @@ -64,7 +64,7 @@ BEGIN BEGIN MENUITEM "&Yeni oyun\tF2", IDM_GAME_NEW MENUITEM SEPARATOR - MENUITEM "&Desteler", IDM_GAME_DECK + MENUITEM "&Desteler...", IDM_GAME_DECK MENUITEM SEPARATOR MENUITEM "&Çıkış", IDM_GAME_EXIT END diff --git a/reactos/base/applications/games/winmine/lang/tr-TR.rc b/reactos/base/applications/games/winmine/lang/tr-TR.rc index add68d5581c..91032ad246e 100644 --- a/reactos/base/applications/games/winmine/lang/tr-TR.rc +++ b/reactos/base/applications/games/winmine/lang/tr-TR.rc @@ -31,20 +31,20 @@ END MENU_WINEMINE MENU BEGIN POPUP "&Seçenekler" BEGIN - MENUITEM "&Yeni\tF2", IDM_NEW + MENUITEM "&Yeni\tF2", IDM_NEW MENUITEM SEPARATOR - MENUITEM "&Soru İmi", IDM_MARKQ + MENUITEM "&Soru İmi", IDM_MARKQ MENUITEM SEPARATOR - MENUITEM "&BaÅŸlangıç", IDM_BEGINNER - MENUITEM "&Orta", IDM_ADVANCED - MENUITEM "&İleri", IDM_EXPERT - MENUITEM "&Özel", IDM_CUSTOM + MENUITEM "&BaÅŸlangıç", IDM_BEGINNER + MENUITEM "&Orta", IDM_ADVANCED + MENUITEM "&İleri", IDM_EXPERT + MENUITEM "&Özel...", IDM_CUSTOM MENUITEM SEPARATOR - MENUITEM "&Çıkış\tAlt+X", IDM_EXIT + MENUITEM "&Çıkış\tAlt+X", IDM_EXIT END POPUP "&Bilgi" BEGIN - MENUITEM "&En Kısa Süreler", IDM_TIMES - MENUITEM "&Hakkında", IDM_ABOUT + MENUITEM "&En Kısa Süreler...", IDM_TIMES + MENUITEM "&Hakkında", IDM_ABOUT END END diff --git a/reactos/base/applications/magnify/lang/tr-TR.rc b/reactos/base/applications/magnify/lang/tr-TR.rc index adf5f3bf874..39dec89bd02 100644 --- a/reactos/base/applications/magnify/lang/tr-TR.rc +++ b/reactos/base/applications/magnify/lang/tr-TR.rc @@ -13,7 +13,7 @@ BEGIN POPUP "&Seçke" BEGIN MENUITEM "&Çıkış", IDM_EXIT - MENUITEM "&Ayarlar", IDM_OPTIONS + MENUITEM "&Ayarlar...", IDM_OPTIONS MENUITEM SEPARATOR MENUITEM "&Hakkında", IDM_ABOUT END diff --git a/reactos/base/applications/mplay32/lang/tr-TR.rc b/reactos/base/applications/mplay32/lang/tr-TR.rc index 26fd5f6de11..25c867e8fef 100644 --- a/reactos/base/applications/mplay32/lang/tr-TR.rc +++ b/reactos/base/applications/mplay32/lang/tr-TR.rc @@ -4,14 +4,14 @@ IDR_MAINMENU MENU BEGIN POPUP "&Kütük" BEGIN - MENUITEM "&Aç", IDM_OPEN_FILE - MENUITEM "&Kapat", IDM_CLOSE_FILE + MENUITEM "&Aç...", IDM_OPEN_FILE + MENUITEM "&Kapat", IDM_CLOSE_FILE MENUITEM SEPARATOR - MENUITEM "&Çıkış", IDM_EXIT + MENUITEM "&Çıkış", IDM_EXIT END POPUP "&Yardım" BEGIN - MENUITEM "&Hakkında", IDM_ABOUT + MENUITEM "&Hakkında", IDM_ABOUT END END diff --git a/reactos/base/applications/mspaint/lang/tr-TR.rc b/reactos/base/applications/mspaint/lang/tr-TR.rc index 4ff328d805d..3fff8d85231 100644 --- a/reactos/base/applications/mspaint/lang/tr-TR.rc +++ b/reactos/base/applications/mspaint/lang/tr-TR.rc @@ -12,81 +12,81 @@ ID_MENU MENU BEGIN POPUP "&Kütük" BEGIN - MENUITEM "&Yeni\tCtrl+N", IDM_FILENEW - MENUITEM "&Aç\tCtrl+O", IDM_FILEOPEN - MENUITEM "&Kaydet\tCtrl+S", IDM_FILESAVE - MENUITEM "Ay&rı Kaydet", IDM_FILESAVEAS + MENUITEM "&Yeni\tCtrl+N", IDM_FILENEW + MENUITEM "&Aç...\tCtrl+O", IDM_FILEOPEN + MENUITEM "&Kaydet\tCtrl+S", IDM_FILESAVE + MENUITEM "Ay&rı Kaydet...", IDM_FILESAVEAS MENUITEM SEPARATOR - MENUITEM "Döşeyerek Duvar Kağıdı Yap", IDM_FILEASWALLPAPERPLANE + MENUITEM "Döşeyerek Duvar Kağıdı Yap", IDM_FILEASWALLPAPERPLANE MENUITEM "Ortalayarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERCENTERED - MENUITEM "Uzatarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERSTRETCHED + MENUITEM "Uzatarak Duvar Kağıdı Yap", IDM_FILEASWALLPAPERSTRETCHED MENUITEM SEPARATOR - MENUITEM "&Çıkış\tAlt+F4", IDM_FILEEXIT + MENUITEM "&Çıkış\tAlt+F4", IDM_FILEEXIT END POPUP "&Düzen" BEGIN - MENUITEM "Geri Al\tCtrl+Z", IDM_EDITUNDO - MENUITEM "Yinele\tCtrl+Y", IDM_EDITREDO + MENUITEM "Geri Al\tCtrl+Z", IDM_EDITUNDO + MENUITEM "Yinele\tCtrl+Y", IDM_EDITREDO MENUITEM SEPARATOR - MENUITEM "Kes\tCtrl+X", IDM_EDITCUT - MENUITEM "ÇoÄŸalt\tCtrl+C", IDM_EDITCOPY - MENUITEM "Yapıştır\tCtrl+V", IDM_EDITPASTE - MENUITEM "Seçimi Sil\tDel", IDM_EDITDELETESELECTION - MENUITEM "Seçimi Evir", IDM_EDITINVERTSELECTION - MENUITEM "Hepsini Seç\tCtrl+A", IDM_EDITSELECTALL + MENUITEM "Kes\tCtrl+X", IDM_EDITCUT + MENUITEM "ÇoÄŸalt\tCtrl+C", IDM_EDITCOPY + MENUITEM "Yapıştır\tCtrl+V", IDM_EDITPASTE + MENUITEM "Seçimi Sil\tDel", IDM_EDITDELETESELECTION + MENUITEM "Seçimi Evir", IDM_EDITINVERTSELECTION + MENUITEM "Hepsini Seç\tCtrl+A", IDM_EDITSELECTALL MENUITEM SEPARATOR - MENUITEM "Seçimi Åžuraya Kopyala", IDM_EDITCOPYTO - MENUITEM "Åžuradan Yapıştır", IDM_EDITPASTEFROM + MENUITEM "Seçimi Åžuraya Kopyala...", IDM_EDITCOPYTO + MENUITEM "Åžuradan Yapıştır...", IDM_EDITPASTEFROM END POPUP "&Görünüm" BEGIN - MENUITEM "Araç ÇubuÄŸu\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED - MENUITEM "Renklik\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED - MENUITEM "Durum ÇubuÄŸu", IDM_VIEWSTATUSBAR, CHECKED - MENUITEM "Metin ÇubuÄŸu", IDM_FORMATICONBAR, CHECKED, GRAYED + MENUITEM "Araç ÇubuÄŸu\tCtrl+T", IDM_VIEWTOOLBOX, CHECKED + MENUITEM "Renklik\tCtrl+L", IDM_VIEWCOLORPALETTE, CHECKED + MENUITEM "Durum ÇubuÄŸu", IDM_VIEWSTATUSBAR, CHECKED + MENUITEM "Metin ÇubuÄŸu", IDM_FORMATICONBAR, CHECKED, GRAYED MENUITEM SEPARATOR POPUP "Büyüt" BEGIN POPUP "Kullanıcı Tanımlı" BEGIN - MENUITEM "%12,5", IDM_VIEWZOOM125 - MENUITEM "%25", IDM_VIEWZOOM25 - MENUITEM "%50", IDM_VIEWZOOM50 - MENUITEM "%100", IDM_VIEWZOOM100 - MENUITEM "%200", IDM_VIEWZOOM200 - MENUITEM "%400", IDM_VIEWZOOM400 - MENUITEM "%800", IDM_VIEWZOOM800 + MENUITEM "%12,5", IDM_VIEWZOOM125 + MENUITEM "%25", IDM_VIEWZOOM25 + MENUITEM "%50", IDM_VIEWZOOM50 + MENUITEM "%100", IDM_VIEWZOOM100 + MENUITEM "%200", IDM_VIEWZOOM200 + MENUITEM "%400", IDM_VIEWZOOM400 + MENUITEM "%800", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Kılavuzu Göster\tCtrl+G", IDM_VIEWSHOWGRID - MENUITEM "Küçüğünü Göster", IDM_VIEWSHOWMINIATURE + MENUITEM "Kılavuzu Göster\tCtrl+G", IDM_VIEWSHOWGRID + MENUITEM "Küçüğünü Göster", IDM_VIEWSHOWMINIATURE END - MENUITEM "Tam Ekran\tCtrl+F", IDM_VIEWFULLSCREEN + MENUITEM "Tam Ekran\tCtrl+F", IDM_VIEWFULLSCREEN END POPUP "G&örüntü" BEGIN - MENUITEM "Döndür ya da Çevir\tCtrl+R", IDM_IMAGEROTATEMIRROR - MENUITEM "Boyutlandır\tCtrl+W", IDM_IMAGECHANGESIZE - MENUITEM "Kırp", IDM_IMAGECROP - MENUITEM "Renkleri Evir\tCtrl+I", IDM_IMAGEINVERTCOLORS - MENUITEM "Öznitelikler\tCtrl+E", IDM_IMAGEATTRIBUTES - MENUITEM "Resmi Temizle\tCtrl+Shft+N", IDM_IMAGEDELETEIMAGE - MENUITEM "Donuk Çiz", IDM_IMAGEDRAWOPAQUE + MENUITEM "Döndür ya da Çevir...\tCtrl+R", IDM_IMAGEROTATEMIRROR + MENUITEM "Boyutlandır...\tCtrl+W", IDM_IMAGECHANGESIZE + MENUITEM "Kırp", IDM_IMAGECROP + MENUITEM "Renkleri Evir...\tCtrl+I", IDM_IMAGEINVERTCOLORS + MENUITEM "Öznitelikler\tCtrl+E", IDM_IMAGEATTRIBUTES + MENUITEM "Resmi Temizle\tCtrl+Shft+N", IDM_IMAGEDELETEIMAGE + MENUITEM "Donuk Çiz", IDM_IMAGEDRAWOPAQUE END POPUP "R&enkler" BEGIN - MENUITEM "RenkliÄŸi Düzenle", IDM_COLORSEDITPALETTE + MENUITEM "RenkliÄŸi Düzenle...", IDM_COLORSEDITPALETTE END POPUP "&Yardım" BEGIN - MENUITEM "Yardım Konuları", IDM_HELPHELPTOPICS + MENUITEM "Yardım Konuları", IDM_HELPHELPTOPICS MENUITEM SEPARATOR - MENUITEM "Hakkında", IDM_HELPINFO + MENUITEM "Hakkında", IDM_HELPINFO END END diff --git a/reactos/base/applications/notepad/lang/tr-TR.rc b/reactos/base/applications/notepad/lang/tr-TR.rc index 3b1eecd433d..453d8a09d2c 100644 --- a/reactos/base/applications/notepad/lang/tr-TR.rc +++ b/reactos/base/applications/notepad/lang/tr-TR.rc @@ -44,13 +44,13 @@ BEGIN POPUP "&Kütük" BEGIN MENUITEM "&Yeni\tCtrl+N", CMD_NEW - MENUITEM "&Aç\tCtrl+O", CMD_OPEN + MENUITEM "&Aç...\tCtrl+O", CMD_OPEN MENUITEM "&Kaydet\tCtrl+S", CMD_SAVE - MENUITEM "Ay&rı Kaydet", CMD_SAVE_AS + MENUITEM "Ay&rı Kaydet...", CMD_SAVE_AS MENUITEM SEPARATOR - MENUITEM "&Sayfa Yapısı", CMD_PAGE_SETUP - MENUITEM "Ya&zdır\tCtrl+P", CMD_PRINT - MENUITEM "Yaz&ıcı Ayarları", CMD_PRINTER_SETUP + MENUITEM "&Sayfa Yapısı...", CMD_PAGE_SETUP + MENUITEM "Ya&zdır...\tCtrl+P", CMD_PRINT + MENUITEM "Yaz&ıcı Ayarları...", CMD_PRINTER_SETUP MENUITEM SEPARATOR MENUITEM "&Çıkış", CMD_EXIT END @@ -63,10 +63,10 @@ BEGIN MENUITEM "&Yapıştır\tCtrl+V", CMD_PASTE MENUITEM "&Sil\tDel", CMD_DELETE MENUITEM SEPARATOR - MENUITEM "&Ara\tCtrl+F", CMD_SEARCH + MENUITEM "&Ara...\tCtrl+F", CMD_SEARCH MENUITEM "S&onrakini Ara\tF3", CMD_SEARCH_NEXT - MENUITEM "&DeÄŸiÅŸtir\tCtrl+H", CMD_REPLACE - MENUITEM "G&it\tCtrl+G", CMD_GOTO + MENUITEM "&DeÄŸiÅŸtir...\tCtrl+H",CMD_REPLACE + MENUITEM "G&it...\tCtrl+G", CMD_GOTO MENUITEM SEPARATOR MENUITEM "&Tümünü Seç\tCtrl+A", CMD_SELECT_ALL MENUITEM "&Zaman\tF5", CMD_TIME_DATE @@ -74,7 +74,7 @@ BEGIN POPUP "&Biçim" BEGIN MENUITEM "&Satır Kaydır", CMD_WRAP - MENUITEM "&Yazı Türü", CMD_FONT + MENUITEM "&Yazı Türü...", CMD_FONT END POPUP "&Görünüm" BEGIN @@ -83,7 +83,7 @@ BEGIN POPUP "&Yardım" BEGIN MENUITEM "&Yardım Konuları", CMD_HELP_CONTENTS - MENUITEM "Yardımda &Ara", CMD_HELP_SEARCH + MENUITEM "Yardımda &Ara...", CMD_HELP_SEARCH MENUITEM "Yardım &İçin Yardım", CMD_HELP_ON_HELP MENUITEM SEPARATOR MENUITEM "&Hakkında", CMD_ABOUT diff --git a/reactos/base/applications/regedit/lang/it-IT.rc b/reactos/base/applications/regedit/lang/it-IT.rc index 2b5a9a08907..f356be56b01 100644 --- a/reactos/base/applications/regedit/lang/it-IT.rc +++ b/reactos/base/applications/regedit/lang/it-IT.rc @@ -227,7 +227,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | CAPTION "Modifica DWORD" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Name:",IDC_STATIC,6,6,134,8 + LTEXT "&Nome:",IDC_STATIC,6,6,134,8 EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY LTEXT "&Dati:",IDC_STATIC,6,35,161,8 EDITTEXT IDC_VALUE_DATA,6,46,116,12,ES_AUTOHSCROLL @@ -306,7 +306,7 @@ END STRINGTABLE DISCARDABLE BEGIN ID_REGISTRY_MENU "Contiene i comandi per lavorare su tutto il Registro" - ID_EDIT_MENU "Contiene i comandi per editare valori o chiavi" + ID_EDIT_MENU "Contiene i comandi per modificare valori o chiavi" ID_VIEW_MENU "Contiene i comandi per personalizzare la finestra del Registro" ID_FAVOURITES_MENU "Contiene i comandi per accedere alle chiavi usate frequentemente" ID_HELP_MENU "Contiene i comandi per visualizzare la Guida e informazioni sull'editor del Registro" @@ -386,7 +386,7 @@ BEGIN IDS_IMPORT_REG_FILE "Importa file di Registro" IDS_EXPORT_REG_FILE "Esporta file di Registro" IDS_LOAD_HIVE "Carica Hive" - IDS_UNLOAD_HIVE "Esplis Hive" + IDS_UNLOAD_HIVE "Scarica Hive" IDS_INVALID_DWORD "(valore DWORD non valido)" END @@ -467,8 +467,8 @@ STRINGTABLE DISCARDABLE BEGIN IDS_PORT_PORT_IO "Porta" IDS_PORT_MEMORY_IO "Memoria" - IDS_INTERRUPT_EDGE_SENSITIVE "Bordo Sensibile" - IDS_INTERRUPT_LEVEL_SENSITIVE "Livello Sensibile" + IDS_INTERRUPT_EDGE_SENSITIVE "Sensibile al fronte" + IDS_INTERRUPT_LEVEL_SENSITIVE "Sensibile al livello" IDS_MEMORY_READ_ONLY "Solo lettura" IDS_MEMORY_WRITE_ONLY "Solo scrittura" IDS_MEMORY_READ_WRITE "Leggi / Scrivi" @@ -524,7 +524,7 @@ FONT 8, "Ms Shell Dlg" LTEXT "&Chiave:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 DEFPUSHBUTTON "OK", IDOK, 140, 17, 50, 14 - PUSHBUTTON "Cancella", IDCANCEL, 89, 17, 50, 14 + PUSHBUTTON "Annulla", IDCANCEL, 89, 17, 50, 14 } IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46 diff --git a/reactos/base/applications/sndrec32/lang/en-US.rc b/reactos/base/applications/sndrec32/lang/en-US.rc index 60179d7dbef..1491ed75180 100644 --- a/reactos/base/applications/sndrec32/lang/en-US.rc +++ b/reactos/base/applications/sndrec32/lang/en-US.rc @@ -36,13 +36,13 @@ BEGIN END END -STRINGTABLE +STRINGTABLE BEGIN IDS_APP_TITLE "Sound recorder" IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" END -STRINGTABLE +STRINGTABLE BEGIN IDS_STRPOS "Position: %.2f s" IDS_STRDUR "Lenght: %.2f s" diff --git a/reactos/base/applications/sndrec32/lang/tr-TR.rc b/reactos/base/applications/sndrec32/lang/tr-TR.rc index 7973b39b8e2..cc24ae968ed 100644 --- a/reactos/base/applications/sndrec32/lang/tr-TR.rc +++ b/reactos/base/applications/sndrec32/lang/tr-TR.rc @@ -22,9 +22,9 @@ BEGIN POPUP "&Kütük" BEGIN MENUITEM "&Yeni", ID_NEW - MENUITEM "&Aç", ID_FILE_OPEN + MENUITEM "&Aç...", ID_FILE_OPEN MENUITEM "&Kaydet", ID_FILE_SAVE, GRAYED - MENUITEM "Ay&rı Kaydet", ID_FILE_SAVEAS, GRAYED + MENUITEM "Ay&rı Kaydet...", ID_FILE_SAVEAS, GRAYED MENUITEM SEPARATOR MENUITEM "&Çıkış", ID_EXIT END @@ -36,13 +36,13 @@ BEGIN END END -STRINGTABLE +STRINGTABLE BEGIN IDS_APP_TITLE "Ses Kaydedicisi" IDC_REACTOS_SNDREC32 "REACTOS_SNDREC32" END -STRINGTABLE +STRINGTABLE BEGIN IDS_STRPOS "Konum: %.2f s" IDS_STRDUR "Uzunluk: %.2f s" diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index 4e05b677ff6..5b3d73187de 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/base/applications/wordpad/En.rc @@ -173,7 +173,7 @@ END IDD_TABSTOPS DIALOG 30, 20, 200, 110 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Tabs" -FONT 8, "MS SHell DLg" +FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tab stops", -1, 10, 10, 120, 90 COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 88b1f7db62f..05722f4abea 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -27,14 +27,14 @@ IDM_MAINMENU MENU BEGIN POPUP "&Kütük" BEGIN - MENUITEM "&Yeni\tCtrl+N", ID_FILE_NEW - MENUITEM "&Aç\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Yeni...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Aç...\tCtrl+O", ID_FILE_OPEN MENUITEM "&Kaydet\tCtrl+S", ID_FILE_SAVE - MENUITEM "Ay&rı Kaydet", ID_FILE_SAVEAS + MENUITEM "Ay&rı Kaydet...", ID_FILE_SAVEAS MENUITEM SEPARATOR - MENUITEM "Ya&zdır\tCtrl+P", ID_PRINT - MENUITEM "&Baskı Önizleme", ID_PREVIEW - MENUITEM "&Sayfa Yapısı", ID_PRINTSETUP + MENUITEM "Ya&zdır...\tCtrl+P", ID_PRINT + MENUITEM "&Baskı Önizleme...", ID_PREVIEW + MENUITEM "&Sayfa Yapısı...", ID_PRINTSETUP MENUITEM SEPARATOR MENUITEM "&Çıkış", ID_FILE_EXIT END @@ -51,7 +51,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Ara\tCtrl+F", ID_FIND MENUITEM "S&onrakini Ara\tF3", ID_FIND_NEXT - MENUITEM "&DeÄŸiÅŸtir\tCtrl+H", ID_REPLACE + MENUITEM "&DeÄŸiÅŸtir...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR MENUITEM "Sa< Okunur", ID_EDIT_READONLY MENUITEM "D&eÄŸiÅŸtirilmiÅŸ", ID_EDIT_MODIFIED @@ -72,18 +72,18 @@ BEGIN MENUITEM "&Çizgilik", ID_TOGGLE_RULER MENUITEM "&Durum ÇubuÄŸu", ID_TOGGLE_STATUSBAR MENUITEM SEPARATOR - MENUITEM "A&yarlar", ID_VIEWPROPERTIES + MENUITEM "A&yarlar...", ID_VIEWPROPERTIES END POPUP "&Ekle" BEGIN - MENUITEM "&Tarih veya Saat", ID_DATETIME + MENUITEM "&Tarih veya Saat...",ID_DATETIME END POPUP "&Biçim" BEGIN - MENUITEM "&Yazı türü", ID_FONTSETTINGS - MENUITEM "&Madde imi", ID_BULLET - MENUITEM "&Paragraf", ID_PARAFORMAT - MENUITEM "&Sekmeler", ID_TABSTOPS + MENUITEM "&Yazı Türü...", ID_FONTSETTINGS + MENUITEM "&Madde İmi", ID_BULLET + MENUITEM "&Paragraf...", ID_PARAFORMAT + MENUITEM "&Sekmeler...", ID_TABSTOPS POPUP "&Arkaplan" BEGIN MENUITEM "&Dizge Rengi\tCtrl+1", ID_BACK_1 @@ -92,7 +92,7 @@ BEGIN END POPUP "&Yardım" BEGIN - MENUITEM "&Hakkında", ID_ABOUT + MENUITEM "&Hakkında", ID_ABOUT END END @@ -104,8 +104,8 @@ BEGIN MENUITEM "&ÇoÄŸalt", ID_EDIT_COPY MENUITEM "&Yapıştır", ID_EDIT_PASTE MENUITEM SEPARATOR - MENUITEM "&Madde imi", ID_BULLET - MENUITEM "&Paragraf", ID_PARAFORMAT + MENUITEM "&Madde İmi", ID_BULLET + MENUITEM "&Paragraf...", ID_PARAFORMAT END END diff --git a/reactos/dll/cpl/timedate/lang/it-IT.rc b/reactos/dll/cpl/timedate/lang/it-IT.rc index bca07521721..f54ebdfd93b 100644 --- a/reactos/dll/cpl/timedate/lang/it-IT.rc +++ b/reactos/dll/cpl/timedate/lang/it-IT.rc @@ -15,7 +15,7 @@ BEGIN CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 11, 37, 108, 80, WS_EX_CLIENTEDGE - GROUPBOX "&Time", -1, 132, 2, 113, 125 + GROUPBOX "&Ora", -1, 132, 2, 113, 125 CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32", DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 144, 105, 90, 12 @@ -50,7 +50,7 @@ BEGIN PUSHBUTTON "Aggiorna ora", IDC_UPDATEBUTTON, 187, 22, 49, 14 LTEXT "", IDC_SUCSYNC, 12, 54, 214, 23 LTEXT "", IDC_NEXTSYNC, 12, 96, 137, 12 - LTEXT "La sincronizzazione può avvenire solo quando il computer è connesso a Internet.", -1, 12, 114, 225, 25 + LTEXT "La sincronizzazione può avvenire solo quando il computer è connesso a Internet.", -1, 12, 114, 225, 25 END @@ -61,7 +61,7 @@ BEGIN IDS_TIMEZONETEXT "Fuso orario corrente: %s" IDS_TIMEZONEINVALID "Non valido" IDS_TIMEZONEUNKNOWN "Sconosciuto" - IDS_INETTIMESUCSYNC "L'ora è stata sincronizzata correttamente con %s %s alle %s" + IDS_INETTIMESUCSYNC "L'ora è stata sincronizzata correttamente con %s %s alle %s" IDS_INETTIMENEXTSYNC "Prossima sincronizzazione: %s alle %s" IDS_INETTIMESYNCING "Sincronizzazione ora con %s" IDS_INETTIMEERROR "E' stato rilevato un errore mentre ReactOS si stava sincronizzando con %s" diff --git a/reactos/dll/cpl/timedate/rsrc.rc b/reactos/dll/cpl/timedate/rsrc.rc index 99b6ddee2ab..099879b900c 100644 --- a/reactos/dll/cpl/timedate/rsrc.rc +++ b/reactos/dll/cpl/timedate/rsrc.rc @@ -31,9 +31,6 @@ #ifdef LANGUAGE_ID_ID #include "lang/id-ID.rc" #endif -#ifdef LANGUAGE_IT_IT - #include "lang/it-IT.rc" -#endif #ifdef LANGUAGE_JA_JP #include "lang/ja-JP.rc" #endif @@ -58,9 +55,13 @@ // UTF-8 #pragma code_page(65001) + #ifdef LANGUAGE_HE_IL #include "lang/he-IL.rc" #endif +#ifdef LANGUAGE_IT_IT + #include "lang/it-IT.rc" +#endif #ifdef LANGUAGE_PL_PL #include "lang/pl-PL.rc" #endif diff --git a/reactos/dll/win32/userenv/lang/it-IT.rc b/reactos/dll/win32/userenv/lang/it-IT.rc index 4d376a7bd8b..fe002225fe2 100644 --- a/reactos/dll/win32/userenv/lang/it-IT.rc +++ b/reactos/dll/win32/userenv/lang/it-IT.rc @@ -1,13 +1,13 @@ /* -* PROJECT: ReactOS userenv.dll -* LICENSE: GPL - See COPYING in the top level directory -* FILE: dll/win32/userenv/lang/it-IT.rc -* PURPOSE: Italian Translation of dll/win32/userenv/lang/en-US.rc -* TRANSLATOR: Copyright (C) 2007 Daniele Forsi (dforsi at gmail.com) Italian Translation -* -* UPDATE HISTORY: -* 11 Feb 2009: Gabriel Ilardi (gabrielilardi at hotmail.it) - compatibility fixes/update. -*/ + * PROJECT: ReactOS userenv.dll + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll/win32/userenv/lang/it-IT.rc + * PURPOSE: Italian Translation of dll/win32/userenv/lang/en-US.rc + * TRANSLATOR: Copyright (C) 2007 Daniele Forsi (dforsi at gmail.com) Italian Translation + * + * UPDATE HISTORY: + * 11 Feb 2009: Gabriel Ilardi (gabrielilardi at hotmail.it) - compatibility fixes/update. + */ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL @@ -26,8 +26,8 @@ BEGIN IDS_MYMUSIC "Documenti\\Musica" IDS_MYVIDEOS "Documenti\\Video" IDS_TEMPLATES "Modelli" - IDS_RECENT "Recent" - IDS_SENDTO "SendTo" + IDS_RECENT "Recenti" + IDS_SENDTO "Invia a" IDS_PRINTHOOD "Stampanti" IDS_NETHOOD "Risorse di rete" IDS_LOCALSETTINGS "Impostazioni locali" From e66df55a54eec2b1f2dd975c518c81302cea2842 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Mar 2013 21:15:28 +0000 Subject: [PATCH 63/74] [HAL] Fix the mess that was our hal CMakeLists.txt. Seperate all components into their own cmake files, svn path=/trunk/; revision=58594 --- reactos/hal/halx86/CMakeLists.txt | 284 +++++------------------------- reactos/hal/halx86/acpi.cmake | 14 ++ reactos/hal/halx86/apic.cmake | 14 ++ reactos/hal/halx86/generic.cmake | 27 +++ reactos/hal/halx86/legacy.cmake | 20 +++ reactos/hal/halx86/minihal.cmake | 32 ++++ reactos/hal/halx86/pcidata.cmake | 13 ++ reactos/hal/halx86/pic.cmake | 13 ++ reactos/hal/halx86/up.cmake | 6 + 9 files changed, 187 insertions(+), 236 deletions(-) create mode 100644 reactos/hal/halx86/acpi.cmake create mode 100644 reactos/hal/halx86/apic.cmake create mode 100644 reactos/hal/halx86/generic.cmake create mode 100644 reactos/hal/halx86/legacy.cmake create mode 100644 reactos/hal/halx86/minihal.cmake create mode 100644 reactos/hal/halx86/pcidata.cmake create mode 100644 reactos/hal/halx86/pic.cmake create mode 100644 reactos/hal/halx86/up.cmake diff --git a/reactos/hal/halx86/CMakeLists.txt b/reactos/hal/halx86/CMakeLists.txt index daec98d5b98..c02a53d85df 100644 --- a/reactos/hal/halx86/CMakeLists.txt +++ b/reactos/hal/halx86/CMakeLists.txt @@ -7,263 +7,75 @@ include_directories( include ${REACTOS_SOURCE_DIR}/ntoskrnl/include) -list(APPEND HAL_GENERIC_SOURCE - generic/beep.c - generic/cmos.c - generic/display.c - generic/dma.c - generic/drive.c - generic/halinit.c - generic/memory.c - generic/misc.c - generic/reboot.c - generic/sysinfo.c - generic/usage.c) +function(add_hal _halname) + cmake_parse_arguments(_haldata "" "" "SOURCES;COMPONENTS" ${ARGN}) -if(ARCH STREQUAL "i386") - list(APPEND HAL_GENERIC_SOURCE - generic/bios.c - generic/portio.c) -endif() - -if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_generic OBJECT ${HAL_GENERIC_SOURCE}) -else() - add_library(lib_hal_generic ${HAL_GENERIC_SOURCE}) -endif() - -add_dependencies(lib_hal_generic asm) -add_pch(lib_hal_generic include/hal.h) - -if(ARCH STREQUAL "i386") - - ##################################### - # Generate the pcidata source files in the x86 build - # - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h - COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h ClassTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h - DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids) - - add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h - COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h VendorTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h - DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids) - ##################################### - - list(APPEND HAL_LEGACY_SOURCE - legacy/bus/bushndlr.c - legacy/bus/cmosbus.c - legacy/bus/isabus.c - legacy/bus/pcibus.c - ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c - ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c - legacy/bus/sysbus.c - legacy/bussupp.c - legacy/halpnpdd.c - legacy/halpcat.c) + # Handle the spec file for the dll name + spec2def(${_halname}.dll ../hal.spec ADD_IMPORTLIB) + # Create the actual target if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_legacy OBJECT ${HAL_LEGACY_SOURCE}) + foreach(_component ${_haldata_COMPONENTS}) + list(APPEND _haldata_SOURCES "$") + endforeach() + add_library(${_halname} SHARED + ${_haldata_SOURCES} + ${CMAKE_CURRENT_BINARY_DIR}/hal.def) else() - add_library(lib_hal_legacy ${HAL_LEGACY_SOURCE}) + foreach(_component ${_haldata_COMPONENTS}) + list(APPEND _haldata_LIBS "lib_hal_${_component}") + endforeach() + add_library(${_halname} SHARED + ${_haldata_SOURCES} + ${CMAKE_CURRENT_BINARY_DIR}/hal.def) + target_link_libraries(${_halname} ${_haldata_LIBS}) endif() - #add_pch(lib_hal_legacy include/hal.h) - - if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(lib_hal_legacy lib_hal_generic) + target_link_libraries(${_halname} libcntpr) + add_importlibs(${_halname} ntoskrnl) + #add_pch(${_halname} include/hal.h) + add_dependencies(${_halname} psdk bugcodes asm) + set_entrypoint(${_halname} HalInitSystem 8) + set_subsystem(${_halname} native) + set_image_base(${_halname} 0x00010000) + add_cd_file(TARGET ${_halname} DESTINATION reactos/system32 NO_CAB FOR all) + if(MSVC) + add_target_link_flags(${_halname} "/ignore:4216 /ignore:4078") endif() +endfunction() -endif() - -list(APPEND HAL_ACPI_SOURCE - acpi/halacpi.c - acpi/halpnpdd.c - acpi/busemul.c - legacy/bus/pcibus.c) - -if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_acpi OBJECT ${HAL_ACPI_SOURCE}) -else() - add_library(lib_hal_acpi ${HAL_ACPI_SOURCE}) -endif() -#add_pch(lib_hal_acpi include/hal.h) - -if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(lib_hal_acpi lib_hal_generic) -endif() - -list(APPEND HAL_UP_SOURCE - generic/spinlock.c - up/processor.c) - -if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_up OBJECT ${HAL_UP_SOURCE}) -endif() - -list(APPEND HAL_APIC_ASM_SOURCE - apic/apictrap.S - apic/tsccal.S) - -list(APPEND HAL_APIC_SOURCE - apic/apic.c - apic/apictimer.c - apic/halinit_apic.c - apic/rtctimer.c - apic/tsc.c) +# The components +include(generic.cmake) +include(acpi.cmake) +include(apic.cmake) if(ARCH STREQUAL "i386") - list(APPEND HAL_PIC_ASM_SOURCE - generic/systimer.S - generic/trap.S) - list(APPEND HAL_PIC_SOURCE - generic/profil.c - generic/timer.c - up/halinit_up.c - up/pic.c) - - if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(lib_hal_pic OBJECT ${HAL_PIC_SOURCE} ${HAL_PIC_ASM_SOURCE}) - add_dependencies(lib_hal_pic asm) - endif() - - list(APPEND MINI_HAL_SOURCE - generic/portio.c - generic/systimer.S - legacy/bus/bushndlr.c - legacy/bus/cmosbus.c - legacy/bus/isabus.c - legacy/bus/pcibus.c - legacy/bus/sysbus.c - legacy/bussupp.c - generic/beep.c - generic/bios.c - generic/cmos.c - generic/dma.c - generic/display.c - generic/drive.c - generic/misc.c - generic/profil.c - generic/reboot.c - generic/spinlock.c - generic/sysinfo.c - generic/timer.c - generic/usage.c - up/halinit_mini.c - up/pic.c - up/processor.c) - - spec2def(hal.dll ../hal.spec ADD_IMPORTLIB) + include(pcidata.cmake) + include(legacy.cmake) + include(up.cmake) + include(pic.cmake) + include(minihal.cmake) # hal - if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(hal SHARED - $ - $ - $ - $ - generic/v86.S - up/halup.rc - ${CMAKE_CURRENT_BINARY_DIR}/hal.def) - else() - add_asm_files(hal_asm - ${HAL_PIC_ASM_SOURCE} - generic/v86.S) - add_library(hal SHARED - ${HAL_UP_SOURCE} - ${HAL_PIC_SOURCE} - ${hal_asm} - up/halup.rc - ${CMAKE_CURRENT_BINARY_DIR}/hal.def) - endif() + add_hal(hal SOURCES up/halup.rc COMPONENTS generic legacy up pic) + add_hal(halacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi up pic) + add_hal(halapic SOURCES acpi/halacpi.rc COMPONENTS generic legacy up apic) + add_hal(halaacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi up apic) - if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(hal lib_hal_generic lib_hal_legacy) - endif() - target_link_libraries(hal libcntpr) - add_importlibs(hal ntoskrnl) - #add_pch(hal include/hal.h) - add_dependencies(hal psdk bugcodes asm) - set_entrypoint(hal HalInitSystem 8) - set_subsystem(hal native) - set_image_base(hal 0x00010000) - add_cd_file(TARGET hal DESTINATION reactos/system32 NO_CAB FOR all) - if(MSVC) - add_target_link_flags(hal "/ignore:4216 /ignore:4078") - endif() - - # hal acpi - spec2def(halacpi.dll ../hal.spec) - if(NOT MSVC AND (CMAKE_VERSION VERSION_GREATER 2.8.7)) - add_library(halacpi SHARED - $ - $ - $ - $ - generic/v86.S - acpi/halacpi.rc - ${CMAKE_CURRENT_BINARY_DIR}/halacpi.def) - else() - set_source_files_properties(${HAL_PIC_ASM_SOURCE} generic/v86.S PROPERTIES COMPILE_DEFINITIONS "CONFIG_ACPI") - add_asm_files(halacpi_asm ${HAL_PIC_ASM_SOURCE} generic/v86.S) - add_library(halacpi SHARED - ${HAL_UP_SOURCE} - ${HAL_PIC_SOURCE} - ${halacpi_asm} - acpi/halacpi.rc - ${CMAKE_CURRENT_BINARY_DIR}/halacpi.def) - endif() - - if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) - target_link_libraries(halacpi lib_hal_generic lib_hal_acpi) - endif() - target_link_libraries(halacpi libcntpr) - add_importlibs(halacpi ntoskrnl) - add_dependencies(halacpi psdk bugcodes asm) - set_entrypoint(halacpi HalInitSystem@8) - set_subsystem(halacpi native) - set_image_base(halacpi 0x00010000) - add_target_compile_definitions(halacpi CONFIG_ACPI) - add_cd_file(TARGET halacpi DESTINATION reactos/system32 NO_CAB FOR all) - if(MSVC) - add_target_link_flags(halacpi "/ignore:4216 /ignore:4078") - endif() - - # mini_hal - add_library(mini_hal ${MINI_HAL_SOURCE}) - add_target_compile_definitions(mini_hal _BLDR_ _MINIHAL_) - add_dependencies(mini_hal psdk bugcodes asm) + #add_hal(halmps SOURCES up/halup.rc COMPONENTS generic legacy smp pic) + #add_hal(halmacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi smp pic) + #add_hal(halmapic SOURCES acpi/halacpi.rc COMPONENTS generic legacy smp apic) + #add_hal(halmaacpi SOURCES acpi/halacpi.rc COMPONENTS generic acpi smp apic) elseif(ARCH STREQUAL "amd64") - spec2def(hal.dll ../hal.spec ADD_IMPORTLIB) - list(APPEND HAL_SOURCE - ${HAL_GENERIC_SOURCE} - ${HAL_ACPI_SOURCE} - ${HAL_APIC_SOURCE} generic/spinlock.c amd64/x86bios.c amd64/halinit.c - amd64/processor.c - ${CMAKE_CURRENT_BINARY_DIR}/hal.def) + amd64/processor.c) - # hal - add_library(hal SHARED ${HAL_SOURCE}) - add_pch(hal include/hal.h) - add_dependencies(hal psdk bugcodes asm) - - set_entrypoint(hal HalInitSystem) - set_subsystem(hal native) - set_image_base(hal 0x00010000) - add_importlibs(hal ntoskrnl) - target_link_libraries(hal libcntpr) - if(MSVC) - add_target_link_flags(hal "/ignore:4216") - endif() - - add_cd_file(TARGET hal DESTINATION reactos/system32 NO_CAB FOR all) + add_hal(hal SOURCES ${HAL_SOURCE} COMPONENTS generic acpi apic) endif() diff --git a/reactos/hal/halx86/acpi.cmake b/reactos/hal/halx86/acpi.cmake new file mode 100644 index 00000000000..1c710f4cf89 --- /dev/null +++ b/reactos/hal/halx86/acpi.cmake @@ -0,0 +1,14 @@ + +list(APPEND HAL_ACPI_SOURCE + acpi/halacpi.c + acpi/halpnpdd.c + acpi/busemul.c + legacy/bus/pcibus.c) + +add_object_library(lib_hal_acpi ${HAL_ACPI_SOURCE}) + +#add_pch(lib_hal_acpi include/hal.h) + +if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) + target_link_libraries(lib_hal_acpi lib_hal_generic) +endif() diff --git a/reactos/hal/halx86/apic.cmake b/reactos/hal/halx86/apic.cmake new file mode 100644 index 00000000000..8fd16fe8e78 --- /dev/null +++ b/reactos/hal/halx86/apic.cmake @@ -0,0 +1,14 @@ + +list(APPEND HAL_APIC_ASM_SOURCE + apic/apictrap.S + apic/tsccal.S) + +list(APPEND HAL_APIC_SOURCE + apic/apic.c + apic/apictimer.c + apic/halinit_apic.c + apic/rtctimer.c + apic/tsc.c) + +add_object_library(lib_hal_apic ${HAL_APIC_SOURCE} ${HAL_APIC_ASM_SOURCE}) +add_dependencies(lib_hal_apic asm) diff --git a/reactos/hal/halx86/generic.cmake b/reactos/hal/halx86/generic.cmake new file mode 100644 index 00000000000..129f64cd647 --- /dev/null +++ b/reactos/hal/halx86/generic.cmake @@ -0,0 +1,27 @@ + +list(APPEND HAL_GENERIC_SOURCE + generic/beep.c + generic/cmos.c + generic/display.c + generic/dma.c + generic/drive.c + generic/halinit.c + generic/memory.c + generic/misc.c + generic/reboot.c + generic/sysinfo.c + generic/usage.c) + +if(ARCH STREQUAL "i386") + list(APPEND HAL_GENERIC_SOURCE + generic/bios.c + generic/portio.c) + + list(APPEND HAL_GENERIC_ASM_SOURCE + generic/v86.S) +endif() + +add_asm_files(halacpi_asm ${HAL_PIC_ASM_SOURCE} generic/v86.S) +add_object_library(lib_hal_generic ${HAL_GENERIC_SOURCE} ${HAL_GENERIC_ASM_SOURCE}) +add_dependencies(lib_hal_generic asm) +add_pch(lib_hal_generic include/hal.h) diff --git a/reactos/hal/halx86/legacy.cmake b/reactos/hal/halx86/legacy.cmake new file mode 100644 index 00000000000..1fb59012bcb --- /dev/null +++ b/reactos/hal/halx86/legacy.cmake @@ -0,0 +1,20 @@ + +list(APPEND HAL_LEGACY_SOURCE + legacy/bus/bushndlr.c + legacy/bus/cmosbus.c + legacy/bus/isabus.c + legacy/bus/pcibus.c + ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c + ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c + legacy/bus/sysbus.c + legacy/bussupp.c + legacy/halpnpdd.c + legacy/halpcat.c) + +add_object_library(lib_hal_legacy ${HAL_LEGACY_SOURCE}) + +#add_pch(lib_hal_legacy include/hal.h) + +if(MSVC OR (NOT CMAKE_VERSION VERSION_GREATER 2.8.7)) + target_link_libraries(lib_hal_legacy lib_hal_generic) +endif() diff --git a/reactos/hal/halx86/minihal.cmake b/reactos/hal/halx86/minihal.cmake new file mode 100644 index 00000000000..0d7bb3089ca --- /dev/null +++ b/reactos/hal/halx86/minihal.cmake @@ -0,0 +1,32 @@ + + +list(APPEND MINI_HAL_SOURCE + generic/portio.c + generic/systimer.S + legacy/bus/bushndlr.c + legacy/bus/cmosbus.c + legacy/bus/isabus.c + legacy/bus/pcibus.c + legacy/bus/sysbus.c + legacy/bussupp.c + generic/beep.c + generic/bios.c + generic/cmos.c + generic/dma.c + generic/display.c + generic/drive.c + generic/misc.c + generic/profil.c + generic/reboot.c + generic/spinlock.c + generic/sysinfo.c + generic/timer.c + generic/usage.c + up/halinit_mini.c + up/pic.c + up/processor.c) + +# mini_hal +add_library(mini_hal ${MINI_HAL_SOURCE}) +add_target_compile_definitions(mini_hal _BLDR_ _MINIHAL_) +add_dependencies(mini_hal psdk bugcodes asm) diff --git a/reactos/hal/halx86/pcidata.cmake b/reactos/hal/halx86/pcidata.cmake new file mode 100644 index 00000000000..5860e507fc8 --- /dev/null +++ b/reactos/hal/halx86/pcidata.cmake @@ -0,0 +1,13 @@ +##################################### +# Generate the pcidata source files in the x86 build +# +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h + COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.c ${CMAKE_CURRENT_BINARY_DIR}/pci_classes.h ClassTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h + DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_classes.ids) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h + COMMAND native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.c ${CMAKE_CURRENT_BINARY_DIR}/pci_vendors.h VendorTable INIT_FUNCTION ${CMAKE_CURRENT_SOURCE_DIR}/include/hal.h + DEPENDS native-bin2c ${CMAKE_CURRENT_SOURCE_DIR}/legacy/bus/pci_vendors.ids) +##################################### diff --git a/reactos/hal/halx86/pic.cmake b/reactos/hal/halx86/pic.cmake new file mode 100644 index 00000000000..f06ed8bc4c0 --- /dev/null +++ b/reactos/hal/halx86/pic.cmake @@ -0,0 +1,13 @@ + +list(APPEND HAL_PIC_ASM_SOURCE + generic/systimer.S + generic/trap.S) + +list(APPEND HAL_PIC_SOURCE + generic/profil.c + generic/timer.c + up/halinit_up.c + up/pic.c) + +add_object_library(lib_hal_pic ${HAL_PIC_SOURCE} ${HAL_PIC_ASM_SOURCE}) +add_dependencies(lib_hal_pic asm) diff --git a/reactos/hal/halx86/up.cmake b/reactos/hal/halx86/up.cmake new file mode 100644 index 00000000000..08c04316a45 --- /dev/null +++ b/reactos/hal/halx86/up.cmake @@ -0,0 +1,6 @@ + +list(APPEND HAL_UP_SOURCE + generic/spinlock.c + up/processor.c) + +add_object_library(lib_hal_up ${HAL_UP_SOURCE}) From 3f4e9dfa3da46dfe8cb7fb2a26fb68bced6e2d35 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Mar 2013 21:20:00 +0000 Subject: [PATCH 64/74] [FREELDR] Fix amd64 build svn path=/trunk/; revision=58595 --- reactos/boot/freeldr/freeldr/CMakeLists.txt | 1 + reactos/boot/freeldr/freeldr/arch/amd64/entry.S | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/reactos/boot/freeldr/freeldr/CMakeLists.txt b/reactos/boot/freeldr/freeldr/CMakeLists.txt index cc65e0e6330..924a75d71cc 100644 --- a/reactos/boot/freeldr/freeldr/CMakeLists.txt +++ b/reactos/boot/freeldr/freeldr/CMakeLists.txt @@ -135,6 +135,7 @@ elseif(ARCH STREQUAL "amd64") arch/i386/hwapm.c arch/i386/hwdisk.c arch/i386/hwpci.c + arch/i386/i386bug.c arch/i386/i386rtl.c arch/i386/i386disk.c arch/i386/i386vid.c diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/entry.S b/reactos/boot/freeldr/freeldr/arch/amd64/entry.S index 9390520ff2b..9379008f9de 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/entry.S +++ b/reactos/boot/freeldr/freeldr/arch/amd64/entry.S @@ -52,6 +52,15 @@ stop: nop +PUBLIC Reboot +Reboot: + /* Set the function ID */ + mov bx, FNID_Reboot + + /* Switch to real mode (We don't return) */ + jmp SwitchToReal + + /* Internal function for realmode calls * bx must be set to the ID of the realmode function to call. */ PUBLIC CallRealMode From 91f32c3e71944385dba3d1348ebece1a2b8b2052 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Mar 2013 21:46:05 +0000 Subject: [PATCH 65/74] [WINDOWSCODECS] Fix amd64 build svn path=/trunk/; revision=58596 --- reactos/dll/win32/windowscodecs/jpegformat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/windowscodecs/jpegformat.c b/reactos/dll/win32/windowscodecs/jpegformat.c index a8866a7d57b..6871a131a70 100644 --- a/reactos/dll/win32/windowscodecs/jpegformat.c +++ b/reactos/dll/win32/windowscodecs/jpegformat.c @@ -29,7 +29,7 @@ //#include #include //#include -//#include +#include #ifdef SONAME_LIBJPEG /* This is a hack, so jpeglib.h does not redefine INT32 and the like*/ From 2c17a42c86e4e1e7e1fc50e8a1a6760c5ce7c27d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Mar 2013 21:50:27 +0000 Subject: [PATCH 66/74] [WIN32K] - Fix amd64 build - Add an overflow check, ASSERT success when unmapping a section view svn path=/trunk/; revision=58597 --- reactos/win32ss/gdi/eng/floatobj.h | 6 +++--- reactos/win32ss/gdi/eng/mapping.c | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/reactos/win32ss/gdi/eng/floatobj.h b/reactos/win32ss/gdi/eng/floatobj.h index 16bc2d1a06d..91fe93e399b 100644 --- a/reactos/win32ss/gdi/eng/floatobj.h +++ b/reactos/win32ss/gdi/eng/floatobj.h @@ -80,9 +80,9 @@ extern const FLOATOBJ gef16; #define FLOATOBJ_16 16. #define FLOATOBJ_1_16 (1./16.) -#define gef0 FLOATOBJ_0 -#define gef1 FLOATOBJ_1 -#define gef16 FLOATOBJ_16 +static const FLOATOBJ gef0 = 0.; +static const FLOATOBJ gef1 = 1.; +static const FLOATOBJ gef16 = 16.; #define FLOATOBJ_Set0(fo) *(fo) = 0; #define FLOATOBJ_Set1(fo) *(fo) = 1; diff --git a/reactos/win32ss/gdi/eng/mapping.c b/reactos/win32ss/gdi/eng/mapping.c index 971aad6b239..3a99745c4e7 100644 --- a/reactos/win32ss/gdi/eng/mapping.c +++ b/reactos/win32ss/gdi/eng/mapping.c @@ -26,6 +26,13 @@ EngMapSectionView( PVOID pvBaseAddress; NTSTATUS Status; + /* Check if the size is ok (for 64 bit) */ + if (cjSize > ULONG_MAX) + { + DPRINT1("chSize out of range: 0x%Id\n", cjSize); + return NULL; + } + /* Align the offset at allocation granularity and compensate for the size */ liSectionOffset.QuadPart = cjOffset & ~(MM_ALLOCATION_GRANULARITY - 1); cjSize += cjOffset & (MM_ALLOCATION_GRANULARITY - 1); @@ -48,7 +55,7 @@ EngMapSectionView( } /* Secure the section memory */ - *phSecure = EngSecureMem(pvBaseAddress, cjSize); + *phSecure = EngSecureMem(pvBaseAddress, (ULONG)cjSize); if (!*phSecure) { ZwUnmapViewOfSection(NtCurrentProcess(), pvBaseAddress); @@ -76,10 +83,7 @@ EngUnmapSectionView( /* Unmap the section view */ Status = MmUnmapViewOfSection(PsGetCurrentProcess(), pvBits); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Could not unmap section view!\n"); - } + ASSERT(NT_SUCCESS(Status)); } From ed6bd94d05562d86000b127574c8fa00eb9a231b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 23 Mar 2013 21:57:17 +0000 Subject: [PATCH 67/74] [INCLUDE] - Add missing __stosq intrinsic - Move architecture specific stuff to a later location in wdm.h to make sure we have ASSERT macros already - Add missing extern "C" to some NDK header - Remove duplicate sal definitions svn path=/trunk/; revision=58598 --- reactos/include/crt/msc/intrin.h | 2 + reactos/include/ddk/wdm.h | 1121 +++++++++++++++--------------- reactos/include/ndk/mmtypes.h | 12 +- reactos/include/ndk/obfuncs.h | 8 + reactos/include/ndk/rtlfuncs.h | 1 + reactos/include/psdk/sal.h | 1 - reactos/include/psdk/sal_old.h | 1 - reactos/include/xdk/kefuncs.h | 15 + reactos/include/xdk/ketypes.h | 18 - 9 files changed, 596 insertions(+), 583 deletions(-) diff --git a/reactos/include/crt/msc/intrin.h b/reactos/include/crt/msc/intrin.h index 6875399828e..d021a782168 100644 --- a/reactos/include/crt/msc/intrin.h +++ b/reactos/include/crt/msc/intrin.h @@ -117,6 +117,8 @@ void __movsd(unsigned long * Destination, unsigned long const * Source, size_t C #pragma intrinsic(__movsd) #endif #ifdef _M_AMD64 +void __stosq(unsigned __int64 * Dest, unsigned __int64 Data, size_t Count); +#pragma intrinsic(__stosq) void __movsq(unsigned __int64 * Destination, unsigned __int64 const * Source, size_t Count); #pragma intrinsic(__movsq) #endif diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 00f9f2f79d8..5b1a3169409 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -1676,567 +1676,6 @@ extern PCCHAR KeNumberProcessors; #endif -#if defined(_M_IX86) -/** Kernel definitions for x86 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 -#define CLOCK_LEVEL CLOCK2_LEVEL - -#define KIP0PCRADDRESS 0xffdff000 -#define KI_USER_SHARED_DATA 0xffdf0000 -#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L -#define KeGetDcacheFillSize() 1L - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) - - -typedef struct _KFLOATING_SAVE { - ULONG ControlWord; - ULONG StatusWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - ULONG Cr0NpxState; - ULONG Spare1; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; - -#define YieldProcessor _mm_pause - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - LONG Barrier, *Dummy = &Barrier; - UNREFERENCED_LOCAL_VARIABLE(Dummy); - -#if defined(__GNUC__) - __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); -#elif defined(_MSC_VER) - __asm xchg [Barrier], eax -#endif -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -_IRQL_requires_max_(HIGH_LEVEL) -_IRQL_saves_ -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql(VOID); - -_IRQL_requires_max_(HIGH_LEVEL) -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -_IRQL_requires_max_(HIGH_LEVEL) -_IRQL_raises_(NewIrql) -_IRQL_saves_ -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - _In_ KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -_IRQL_requires_max_(DISPATCH_LEVEL) -_IRQL_saves_ -_IRQL_raises_(DISPATCH_LEVEL) -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - -_Requires_lock_not_held_(*SpinLock) -_Acquires_lock_(*SpinLock) -_IRQL_requires_max_(DISPATCH_LEVEL) -_IRQL_saves_ -_IRQL_raises_(DISPATCH_LEVEL) -NTHALAPI -KIRQL -FASTCALL -KfAcquireSpinLock( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) - -_Requires_lock_held_(*SpinLock) -_Releases_lock_(*SpinLock) -_IRQL_requires_(DISPATCH_LEVEL) -NTHALAPI -VOID -FASTCALL -KfReleaseSpinLock( - _Inout_ PKSPIN_LOCK SpinLock, - _In_ _IRQL_restores_ KIRQL NewIrql); -#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) - -_Requires_lock_not_held_(*SpinLock) -_Acquires_lock_(*SpinLock) -_IRQL_requires_min_(DISPATCH_LEVEL) -NTKERNELAPI -VOID -FASTCALL -KefAcquireSpinLockAtDpcLevel( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) - -_Requires_lock_held_(*SpinLock) -_Releases_lock_(*SpinLock) -_IRQL_requires_min_(DISPATCH_LEVEL) -NTKERNELAPI -VOID -FASTCALL -KefReleaseSpinLockFromDpcLevel( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - -_Always_(_Post_satisfies_(return<=0)) -_Must_inspect_result_ -_IRQL_requires_max_(DISPATCH_LEVEL) -_Kernel_float_saved_ -_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) -NTKERNELAPI -NTSTATUS -NTAPI -KeSaveFloatingPointState( - _Out_ PKFLOATING_SAVE FloatSave); - -_Success_(1) -_Kernel_float_restored_ -_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) -NTKERNELAPI -NTSTATUS -NTAPI -KeRestoreFloatingPointState( - _In_ PKFLOATING_SAVE FloatSave); - -/* VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -/* x86 and x64 performs a 0x2C interrupt */ -#define DbgRaiseAssertionFailure __int2c - -FORCEINLINE -VOID -_KeQueryTickCount( - OUT PLARGE_INTEGER CurrentCount) -{ - for (;;) { -#ifdef NONAMELESSUNION - CurrentCount->s.HighPart = KeTickCount.High1Time; - CurrentCount->s.LowPart = KeTickCount.LowPart; - if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; -#else - CurrentCount->HighPart = KeTickCount.High1Time; - CurrentCount->LowPart = KeTickCount.LowPart; - if (CurrentCount->HighPart == KeTickCount.High2Time) break; -#endif - YieldProcessor(); - } -} -#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) - - - - - -#elif defined(_M_AMD64) -/** Kernel definitions for AMD64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define CLOCK_LEVEL 13 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define POWER_LEVEL 14 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL -#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) -#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) -#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) -#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -#define KeQueryInterruptTime() \ - (*(volatile ULONG64*)SharedInterruptTime) - -#define KeQuerySystemTime(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime - -#define KeQueryTickCount(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount - -#define KeGetDcacheFillSize() 1L - -#define YieldProcessor _mm_pause -#define MemoryBarrier __faststorefence -#define FastFence __faststorefence -#define LoadFence _mm_lfence -#define MemoryFence _mm_mfence -#define StoreFence _mm_sfence -#define LFENCE_ACQUIRE() LoadFence() - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - // FIXME: Do we really need lfence after the __faststorefence ? - FastFence(); - LFENCE_ACQUIRE(); -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -FORCEINLINE -KIRQL -KeGetCurrentIrql(VOID) -{ - return (KIRQL)__readcr8(); -} - -FORCEINLINE -VOID -KeLowerIrql(IN KIRQL NewIrql) -{ - ASSERT((KIRQL)__readcr8() >= NewIrql); - __writecr8(NewIrql); -} - -FORCEINLINE -KIRQL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - - OldIrql = (KIRQL)__readcr8(); - ASSERT(OldIrql <= NewIrql); - __writecr8(NewIrql); - return OldIrql; -} -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -FORCEINLINE -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -FORCEINLINE -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 -} - -FORCEINLINE -PKTHREAD -KeGetCurrentThread(VOID) -{ - return (struct _KTHREAD *)__readgsqword(0x188); -} - -FORCEINLINE -NTSTATUS -KeSaveFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -FORCEINLINE -NTSTATUS -KeRestoreFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -/* VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -/* x86 and x64 performs a 0x2C interrupt */ -#define DbgRaiseAssertionFailure __int2c - -#elif defined(_M_IA64) -/** Kernel definitions for IA64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMC_LEVEL 3 -#define DEVICE_LEVEL_BASE 4 -#define PC_LEVEL 12 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define CLOCK_LEVEL 13 -#define POWER_LEVEL 15 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) -extern volatile LARGE_INTEGER KeTickCount; - -#define PAUSE_PROCESSOR __yield(); - -FORCEINLINE -VOID -KeFlushWriteBuffer(VOID) -{ - __mf (); - return; -} - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - - -#elif defined(_M_PPC) - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef struct _KPCR_TIB { - PVOID ExceptionList; /* 00 */ - PVOID StackBase; /* 04 */ - PVOID StackLimit; /* 08 */ - PVOID SubSystemTib; /* 0C */ - _ANONYMOUS_UNION union { - PVOID FiberData; /* 10 */ - ULONG Version; /* 10 */ - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; /* 14 */ - struct _KPCR_TIB *Self; /* 18 */ -} KPCR_TIB, *PKPCR_TIB; /* 1C */ - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 1C */ - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IrrActive; /* 2C */ - ULONG IDR; /* 30 */ - PVOID KdVersionBlock; /* 34 */ - PUSHORT IDT; /* 38 */ - PUSHORT GDT; /* 3C */ - struct _KTSS *TSS; /* 40 */ - USHORT MajorVersion; /* 44 */ - USHORT MinorVersion; /* 46 */ - KAFFINITY SetMember; /* 48 */ - ULONG StallScaleFactor; /* 4C */ - UCHAR SpareUnused; /* 50 */ - UCHAR Number; /* 51 */ -} KPCR, *PKPCR; /* 54 */ - -#define KeGetPcr() PCR - -#define YieldProcessor() __asm__ __volatile__("nop"); - -FORCEINLINE -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - ULONG Number; - __asm__ __volatile__ ( - "lwz %0, %c1(12)\n" - : "=r" (Number) - : "i" (FIELD_OFFSET(KPCR, Number)) - ); - return Number; -} - -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - IN KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - IN KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - - -#elif defined(_M_MIPS) -#error MIPS Headers are totally incorrect - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define IPI_LEVEL 29 -#define HIGH_LEVEL 31 - -typedef struct _KPCR { - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IDR; /* 30 */ -} KPCR, *PKPCR; - -#define KeGetPcr() PCR - -typedef struct _KFLOATING_SAVE { -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -static __inline -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - return 0; -} - -#define YieldProcessor() __asm__ __volatile__("nop"); - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTKERNELAPI -VOID -NTAPI -KfLowerIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KfRaiseIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - -#elif defined(_M_ARM) -#include -#else -#error Unknown Architecture -#endif - /****************************************************************************** * Memory manager Types * ******************************************************************************/ @@ -10169,6 +9608,566 @@ RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( /****************************************************************************** * Kernel Functions * ******************************************************************************/ +#if defined(_M_IX86) +/** Kernel definitions for x86 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 +#define CLOCK_LEVEL CLOCK2_LEVEL + +#define KIP0PCRADDRESS 0xffdff000 +#define KI_USER_SHARED_DATA 0xffdf0000 +#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L +#define KeGetDcacheFillSize() 1L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) + + +typedef struct _KFLOATING_SAVE { + ULONG ControlWord; + ULONG StatusWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + ULONG Cr0NpxState; + ULONG Spare1; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; + +#define YieldProcessor _mm_pause + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + LONG Barrier, *Dummy = &Barrier; + UNREFERENCED_LOCAL_VARIABLE(Dummy); + +#if defined(__GNUC__) + __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); +#elif defined(_MSC_VER) + __asm xchg [Barrier], eax +#endif +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql(VOID); + +_IRQL_requires_max_(HIGH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_raises_(NewIrql) +_IRQL_saves_ +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + _In_ KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +FASTCALL +KfAcquireSpinLock( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfReleaseSpinLock( + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); +#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefAcquireSpinLockAtDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefReleaseSpinLockFromDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + +_Always_(_Post_satisfies_(return<=0)) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Kernel_float_saved_ +_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeSaveFloatingPointState( + _Out_ PKFLOATING_SAVE FloatSave); + +_Success_(1) +_Kernel_float_restored_ +_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeRestoreFloatingPointState( + _In_ PKFLOATING_SAVE FloatSave); + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +FORCEINLINE +VOID +_KeQueryTickCount( + OUT PLARGE_INTEGER CurrentCount) +{ + for (;;) { +#ifdef NONAMELESSUNION + CurrentCount->s.HighPart = KeTickCount.High1Time; + CurrentCount->s.LowPart = KeTickCount.LowPart; + if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; +#else + CurrentCount->HighPart = KeTickCount.High1Time; + CurrentCount->LowPart = KeTickCount.LowPart; + if (CurrentCount->HighPart == KeTickCount.High2Time) break; +#endif + YieldProcessor(); + } +} +#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) + + + + + +#elif defined(_M_AMD64) +/** Kernel definitions for AMD64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define CLOCK_LEVEL 13 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define POWER_LEVEL 14 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL +#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) +#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) +#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) +#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +#define KeQueryInterruptTime() \ + (*(volatile ULONG64*)SharedInterruptTime) + +#define KeQuerySystemTime(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime + +#define KeQueryTickCount(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount + +#define KeGetDcacheFillSize() 1L + +#define YieldProcessor _mm_pause +#define MemoryBarrier __faststorefence +#define FastFence __faststorefence +#define LoadFence _mm_lfence +#define MemoryFence _mm_mfence +#define StoreFence _mm_sfence +#define LFENCE_ACQUIRE() LoadFence() + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + // FIXME: Do we really need lfence after the __faststorefence ? + FastFence(); + LFENCE_ACQUIRE(); +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +FORCEINLINE +KIRQL +KeGetCurrentIrql(VOID) +{ + return (KIRQL)__readcr8(); +} + +FORCEINLINE +VOID +KeLowerIrql(IN KIRQL NewIrql) +{ + ASSERT((KIRQL)__readcr8() >= NewIrql); + __writecr8(NewIrql); +} + +FORCEINLINE +KIRQL +KfRaiseIrql(IN KIRQL NewIrql) +{ + KIRQL OldIrql; + + OldIrql = (KIRQL)__readcr8(); + ASSERT(OldIrql <= NewIrql); + __writecr8(NewIrql); + return OldIrql; +} +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +FORCEINLINE +KIRQL +KeRaiseIrqlToDpcLevel(VOID) +{ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +FORCEINLINE +KIRQL +KeRaiseIrqlToSynchLevel(VOID) +{ + return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 +} + +FORCEINLINE +PKTHREAD +KeGetCurrentThread(VOID) +{ + return (struct _KTHREAD *)__readgsqword(0x188); +} + +FORCEINLINE +NTSTATUS +KeSaveFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +FORCEINLINE +NTSTATUS +KeRestoreFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +#elif defined(_M_IA64) +/** Kernel definitions for IA64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMC_LEVEL 3 +#define DEVICE_LEVEL_BASE 4 +#define PC_LEVEL 12 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define CLOCK_LEVEL 13 +#define POWER_LEVEL 15 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) +extern volatile LARGE_INTEGER KeTickCount; + +#define PAUSE_PROCESSOR __yield(); + +FORCEINLINE +VOID +KeFlushWriteBuffer(VOID) +{ + __mf (); + return; +} + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + + +#elif defined(_M_PPC) + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef struct _KPCR_TIB { + PVOID ExceptionList; /* 00 */ + PVOID StackBase; /* 04 */ + PVOID StackLimit; /* 08 */ + PVOID SubSystemTib; /* 0C */ + _ANONYMOUS_UNION union { + PVOID FiberData; /* 10 */ + ULONG Version; /* 10 */ + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; /* 14 */ + struct _KPCR_TIB *Self; /* 18 */ +} KPCR_TIB, *PKPCR_TIB; /* 1C */ + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + KPCR_TIB Tib; /* 00 */ + struct _KPCR *Self; /* 1C */ + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IrrActive; /* 2C */ + ULONG IDR; /* 30 */ + PVOID KdVersionBlock; /* 34 */ + PUSHORT IDT; /* 38 */ + PUSHORT GDT; /* 3C */ + struct _KTSS *TSS; /* 40 */ + USHORT MajorVersion; /* 44 */ + USHORT MinorVersion; /* 46 */ + KAFFINITY SetMember; /* 48 */ + ULONG StallScaleFactor; /* 4C */ + UCHAR SpareUnused; /* 50 */ + UCHAR Number; /* 51 */ +} KPCR, *PKPCR; /* 54 */ + +#define KeGetPcr() PCR + +#define YieldProcessor() __asm__ __volatile__("nop"); + +FORCEINLINE +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + ULONG Number; + __asm__ __volatile__ ( + "lwz %0, %c1(12)\n" + : "=r" (Number) + : "i" (FIELD_OFFSET(KPCR, Number)) + ); + return Number; +} + +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + + +#elif defined(_M_MIPS) +#error MIPS Headers are totally incorrect + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + +#define PASSIVE_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define IPI_LEVEL 29 +#define HIGH_LEVEL 31 + +typedef struct _KPCR { + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IDR; /* 30 */ +} KPCR, *PKPCR; + +#define KeGetPcr() PCR + +typedef struct _KFLOATING_SAVE { +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +static __inline +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + return 0; +} + +#define YieldProcessor() __asm__ __volatile__("nop"); + +#define KeLowerIrql(a) KfLowerIrql(a) +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTKERNELAPI +VOID +NTAPI +KfLowerIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KfRaiseIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + +#elif defined(_M_ARM) +#include +#else +#error Unknown Architecture +#endif NTKERNELAPI VOID diff --git a/reactos/include/ndk/mmtypes.h b/reactos/include/ndk/mmtypes.h index ec96ec3dddc..82a1668a433 100644 --- a/reactos/include/ndk/mmtypes.h +++ b/reactos/include/ndk/mmtypes.h @@ -66,12 +66,12 @@ Author: // // Flags for ProcessExecutionOptions // -#define MEM_EXECUTE_OPTION_DISABLE 0x1 +#define MEM_EXECUTE_OPTION_DISABLE 0x1 #define MEM_EXECUTE_OPTION_ENABLE 0x2 #define MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION 0x4 #define MEM_EXECUTE_OPTION_PERMANENT 0x8 #define MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE 0x10 -#define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE 0x20 +#define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE 0x20 #define MEM_EXECUTE_OPTION_VALID_FLAGS 0x3F #ifndef NTOS_MODE_USER @@ -989,6 +989,10 @@ typedef struct _DRIVER_SPECIFIED_VERIFIER_THUNKS ULONG NumberOfThunks; } DRIVER_SPECIFIED_VERIFIER_THUNKS, *PDRIVER_SPECIFIED_VERIFIER_THUNKS; +#ifdef __cplusplus +extern "C" { +#endif + // // Default heap size values. For user mode, these values are copied to a new // process's PEB by the kernel in MmCreatePeb. In kernel mode, RtlCreateHeap @@ -1007,6 +1011,10 @@ extern SIZE_T MmHeapDeCommitFreeBlockThreshold; // extern POBJECT_TYPE NTSYSAPI MmSectionObjectType; +#ifdef __cplusplus +}; // extern "C" +#endif + #endif // !NTOS_MODE_USER #endif // _MMTYPES_H diff --git a/reactos/include/ndk/obfuncs.h b/reactos/include/ndk/obfuncs.h index 96cc917564f..48c9ac88b9e 100644 --- a/reactos/include/ndk/obfuncs.h +++ b/reactos/include/ndk/obfuncs.h @@ -26,6 +26,10 @@ Author: #include #include +#ifdef __cplusplus +extern "C" { +#endif + #ifndef NTOS_MODE_USER // @@ -576,4 +580,8 @@ ZwWaitForSingleObject( #endif /* NTOS_MODE_USER */ +#ifdef __cplusplus +}; // extern "C" +#endif + #endif diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index ac709780f02..d565d4cd461 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -3259,6 +3259,7 @@ DbgPrompt( _In_ ULONG MaximumResponseLength ); +#undef DbgBreakPoint VOID NTAPI DbgBreakPoint( diff --git a/reactos/include/psdk/sal.h b/reactos/include/psdk/sal.h index 36facf4ea67..e87475d82d2 100644 --- a/reactos/include/psdk/sal.h +++ b/reactos/include/psdk/sal.h @@ -1090,7 +1090,6 @@ __PRIMOP(int, _In_function_class_(__In_impl_ char*);) #define _In_function_class_(x) _In_function_class_(#x) #define _Called_from_function_class_(x) _In_function_class_(x) -#define _Function_class_(x) _SA_annotes1(SAL_functionClassNew, #x) #else // ] [ !_PREFAST_ diff --git a/reactos/include/psdk/sal_old.h b/reactos/include/psdk/sal_old.h index 74a97652593..9b93826d4e9 100644 --- a/reactos/include/psdk/sal_old.h +++ b/reactos/include/psdk/sal_old.h @@ -53,7 +53,6 @@ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {} #define __inner_override __declspec("__override") #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")") -#define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")") #define __maybenull __declspec("SAL_maybenull") #define __maybereadonly __declspec("SAL_maybereadonly") #define __maybevalid __declspec("SAL_maybevalid") diff --git a/reactos/include/xdk/kefuncs.h b/reactos/include/xdk/kefuncs.h index 06196cce606..d33a8a4f34f 100644 --- a/reactos/include/xdk/kefuncs.h +++ b/reactos/include/xdk/kefuncs.h @@ -2,6 +2,21 @@ * Kernel Functions * ******************************************************************************/ $if (_WDMDDK_) +#if defined(_M_IX86) +$include(x86/ke.h) +#elif defined(_M_AMD64) +$include(amd64/ke.h) +#elif defined(_M_IA64) +$include(ia64/ke.h) +#elif defined(_M_PPC) +$include(ppc/ke.h) +#elif defined(_M_MIPS) +$include(mips/ke.h) +#elif defined(_M_ARM) +$include(arm/ke.h) +#else +#error Unknown Architecture +#endif NTKERNELAPI VOID diff --git a/reactos/include/xdk/ketypes.h b/reactos/include/xdk/ketypes.h index f65c9a6e47d..1ef6473ba2e 100644 --- a/reactos/include/xdk/ketypes.h +++ b/reactos/include/xdk/ketypes.h @@ -1237,21 +1237,3 @@ typedef struct _KQUEUE { $endif (_NTIFS_) -$if (_WDMDDK_) -#if defined(_M_IX86) -$include(x86/ke.h) -#elif defined(_M_AMD64) -$include(amd64/ke.h) -#elif defined(_M_IA64) -$include(ia64/ke.h) -#elif defined(_M_PPC) -$include(ppc/ke.h) -#elif defined(_M_MIPS) -$include(mips/ke.h) -#elif defined(_M_ARM) -$include(arm/ke.h) -#else -#error Unknown Architecture -#endif -$endif (_WDMDDK_) - From 66fc8a9d5ae3eb7a2b0e95d300ef3b053931428f Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 24 Mar 2013 09:29:55 +0000 Subject: [PATCH 68/74] [win32k] - Add a hackfix to ftGdiGetGlyphOutline to make it handle scaling more properly - Improves CORE-4657 svn path=/trunk/; revision=58599 --- reactos/win32ss/gdi/ntgdi/freetype.c | 33 +++++++++++++++++++++------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/reactos/win32ss/gdi/ntgdi/freetype.c b/reactos/win32ss/gdi/ntgdi/freetype.c index 652f22f6f7f..abcf6b17bc0 100644 --- a/reactos/win32ss/gdi/ntgdi/freetype.c +++ b/reactos/win32ss/gdi/ntgdi/freetype.c @@ -1646,15 +1646,32 @@ ftGdiGetGlyphOutline( IntLockFreeType; /* Scaling transform */ - if (aveWidth) + /*if (aveWidth)*/ { - FT_Matrix scaleMat; - DPRINT("Scaling Trans!\n"); - scaleMat.xx = FT_FixedFromFloat(widthRatio); - scaleMat.xy = 0; - scaleMat.yx = 0; - scaleMat.yy = (1 << 16); - FT_Matrix_Multiply(&scaleMat, &transMat); + + FT_Matrix ftmatrix; + FLOATOBJ efTemp; + + PMATRIX pmx = DC_pmxWorldToDevice(dc); + + /* Create a freetype matrix, by converting to 16.16 fixpoint format */ + efTemp = pmx->efM11; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.xx = FLOATOBJ_GetLong(&efTemp); + + efTemp = pmx->efM12; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.xy = FLOATOBJ_GetLong(&efTemp); + + efTemp = pmx->efM21; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.yx = FLOATOBJ_GetLong(&efTemp); + + efTemp = pmx->efM22; + FLOATOBJ_MulLong(&efTemp, 0x00010000); + ftmatrix.yy = FLOATOBJ_GetLong(&efTemp); + + FT_Matrix_Multiply(&ftmatrix, &transMat); needsTransform = TRUE; } From aa6e6ab6005d6c222bee7c8922cfabda9d2db47b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 24 Mar 2013 12:35:51 +0000 Subject: [PATCH 69/74] [SHLWAPI] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58600 --- reactos/dll/win32/shlwapi/istream.c | 2 +- reactos/dll/win32/shlwapi/ordinal.c | 23 +--- reactos/dll/win32/shlwapi/path.c | 160 ++++++++++++++++++++----- reactos/dll/win32/shlwapi/reg.c | 2 +- reactos/dll/win32/shlwapi/shlwapi.rc | 2 +- reactos/dll/win32/shlwapi/shlwapi.spec | 3 + reactos/dll/win32/shlwapi/string.c | 29 ++++- reactos/dll/win32/shlwapi/thread.c | 2 +- reactos/dll/win32/shlwapi/url.c | 43 ++++--- reactos/media/doc/README.WINE | 2 +- 10 files changed, 193 insertions(+), 75 deletions(-) diff --git a/reactos/dll/win32/shlwapi/istream.c b/reactos/dll/win32/shlwapi/istream.c index 1946e7e62b7..3a87dc4ee4c 100644 --- a/reactos/dll/win32/shlwapi/istream.c +++ b/reactos/dll/win32/shlwapi/istream.c @@ -531,7 +531,7 @@ HRESULT WINAPI SHCreateStreamOnFileA(LPCSTR lpszPath, DWORD dwMode, if (!lpszPath) return HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND); - MultiByteToWideChar(0, 0, lpszPath, -1, szPath, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, lpszPath, -1, szPath, MAX_PATH); return SHCreateStreamOnFileW(szPath, dwMode, lppStream); } diff --git a/reactos/dll/win32/shlwapi/ordinal.c b/reactos/dll/win32/shlwapi/ordinal.c index dfd50c5a5a3..d832d1bbc40 100644 --- a/reactos/dll/win32/shlwapi/ordinal.c +++ b/reactos/dll/win32/shlwapi/ordinal.c @@ -641,25 +641,6 @@ INT WINAPI SHStringFromGUIDW(REFGUID guid, LPWSTR lpszDest, INT cchMax) return iLen; } -/************************************************************************* - * @ [SHLWAPI.29] - * - * Determine if a Unicode character is a space. - * - * PARAMS - * wc [I] Character to check. - * - * RETURNS - * TRUE, if wc is a space, - * FALSE otherwise. - */ -BOOL WINAPI IsCharSpaceW(WCHAR wc) -{ - WORD CharType; - - return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_SPACE); -} - /************************************************************************* * @ [SHLWAPI.30] * @@ -2680,7 +2661,7 @@ DWORD WINAPI SHGetRestriction(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpVal lpSubKey = strRegistryPolicyW; retval = RegOpenKeyW(HKEY_LOCAL_MACHINE, lpSubKey, &hKey); - if (retval != ERROR_SUCCESS) + if (retval != ERROR_SUCCESS) retval = RegOpenKeyW(HKEY_CURRENT_USER, lpSubKey, &hKey); if (retval != ERROR_SUCCESS) return 0; @@ -2728,7 +2709,7 @@ DWORD WINAPI SHRestrictionLookup( /* we have a known policy */ /* check if this policy has been cached */ - if (*polArr == SHELL_NO_POLICY) + if (*polArr == SHELL_NO_POLICY) *polArr = SHGetRestriction(initial, polTable->appstr, polTable->keystr); return *polArr; } diff --git a/reactos/dll/win32/shlwapi/path.c b/reactos/dll/win32/shlwapi/path.c index 9fb8ac0eaf2..47fb520b522 100644 --- a/reactos/dll/win32/shlwapi/path.c +++ b/reactos/dll/win32/shlwapi/path.c @@ -3246,6 +3246,9 @@ HRESULT WINAPI PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, HRESULT ret; DWORD lenW = sizeof(bufW)/sizeof(WCHAR), lenA; + if (!pszUrl || !pszPath || !pcchPath || !*pcchPath) + return E_INVALIDARG; + if(!RtlCreateUnicodeStringFromAsciiz(&urlW, pszUrl)) return E_INVALIDARG; if((ret = PathCreateFromUrlW(urlW.Buffer, pathW, &lenW, dwReserved)) == E_POINTER) { @@ -3287,61 +3290,156 @@ HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved) { static const WCHAR file_colon[] = { 'f','i','l','e',':',0 }; - HRESULT hr; - DWORD nslashes = 0; - WCHAR *ptr; + static const WCHAR localhost[] = { 'l','o','c','a','l','h','o','s','t',0 }; + DWORD nslashes, unescape, len; + const WCHAR *src; + WCHAR *tpath, *dst; + HRESULT ret; TRACE("(%s,%p,%p,0x%08x)\n", debugstr_w(pszUrl), pszPath, pcchPath, dwReserved); if (!pszUrl || !pszPath || !pcchPath || !*pcchPath) return E_INVALIDARG; - - if (strncmpW(pszUrl, file_colon, 5)) + if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, + file_colon, 5) != CSTR_EQUAL) return E_INVALIDARG; pszUrl += 5; + ret = S_OK; - while(*pszUrl == '/' || *pszUrl == '\\') { + src = pszUrl; + nslashes = 0; + while (*src == '/' || *src == '\\') { nslashes++; - pszUrl++; + src++; } - if(isalphaW(*pszUrl) && (pszUrl[1] == ':' || pszUrl[1] == '|') && (pszUrl[2] == '/' || pszUrl[2] == '\\')) - nslashes = 0; + /* We need a temporary buffer so we can compute what size to ask for. + * We know that the final string won't be longer than the current pszUrl + * plus at most two backslashes. All the other transformations make it + * shorter. + */ + len = 2 + lstrlenW(pszUrl) + 1; + if (*pcchPath < len) + tpath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + else + tpath = pszPath; - switch(nslashes) { - case 2: - pszUrl -= 2; - break; + len = 0; + dst = tpath; + unescape = 1; + switch (nslashes) + { case 0: + /* 'file:' + escaped DOS path */ break; + case 1: + /* 'file:/' + escaped DOS path */ + /* fall through */ + case 3: + /* 'file:///' (implied localhost) + escaped DOS path */ + if (!isalphaW(*src) || (src[1] != ':' && src[1] != '|')) + src -= 1; + break; + case 2: + if (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, src, 9, + localhost, 9) == CSTR_EQUAL && + (src[9] == '/' || src[9] == '\\')) + { + /* 'file://localhost/' + escaped DOS path */ + src += 10; + } + else if (isalphaW(*src) && (src[1] == ':' || src[1] == '|')) + { + /* 'file://' + unescaped DOS path */ + unescape = 0; + } + else + { + /* 'file://hostname:port/path' (where path is escaped) + * or 'file:' + escaped UNC path (\\server\share\path) + * The second form is clearly specific to Windows and it might + * even be doing a network lookup to try to figure it out. + */ + while (*src && *src != '/' && *src != '\\') + src++; + len = src - pszUrl; + StrCpyNW(dst, pszUrl, len + 1); + dst += len; + if (isalphaW(src[1]) && (src[2] == ':' || src[2] == '|')) + { + /* 'Forget' to add a trailing '/', just like Windows */ + src++; + } + } + break; + case 4: + /* 'file://' + unescaped UNC path (\\server\share\path) */ + unescape = 0; + if (isalphaW(*src) && (src[1] == ':' || src[1] == '|')) + break; + /* fall through */ default: - pszUrl -= 1; - break; + /* 'file:/...' + escaped UNC path (\\server\share\path) */ + src -= 2; } - hr = UrlUnescapeW((LPWSTR)pszUrl, pszPath, pcchPath, 0); - if(hr != S_OK) return hr; + /* Copy the remainder of the path */ + len += lstrlenW(src); + StrCpyW(dst, src); - for(ptr = pszPath; *ptr; ptr++) - if(*ptr == '/') *ptr = '\\'; + /* First do the Windows-specific path conversions */ + for (dst = tpath; *dst; dst++) + if (*dst == '/') *dst = '\\'; + if (isalphaW(*tpath) && tpath[1] == '|') + tpath[1] = ':'; /* c| -> c: */ - while(*pszPath == '\\') - pszPath++; - - if(isalphaW(*pszPath) && pszPath[1] == '|' && pszPath[2] == '\\') /* c|\ -> c:\ */ - pszPath[1] = ':'; - - if(nslashes == 2 && (ptr = strchrW(pszPath, '\\'))) { /* \\host\c:\ -> \\hostc:\ */ - ptr++; - if(isalphaW(*ptr) && (ptr[1] == ':' || ptr[1] == '|') && ptr[2] == '\\') { - memmove(ptr - 1, ptr, (strlenW(ptr) + 1) * sizeof(WCHAR)); - (*pcchPath)--; + /* And only then unescape the path (i.e. escaped slashes are left as is) */ + if (unescape) + { + ret = UrlUnescapeW(tpath, NULL, &len, URL_UNESCAPE_INPLACE); + if (ret == S_OK) + { + /* When working in-place UrlUnescapeW() does not set len */ + len = lstrlenW(tpath); } } - TRACE("Returning %s\n",debugstr_w(pszPath)); + if (*pcchPath < len + 1) + { + ret = E_POINTER; + *pcchPath = len + 1; + } + else + { + *pcchPath = len; + if (tpath != pszPath) + StrCpyW(pszPath, tpath); + } + if (tpath != pszPath) + HeapFree(GetProcessHeap(), 0, tpath); + TRACE("Returning (%u) %s\n", *pcchPath, debugstr_w(pszPath)); + return ret; +} + +/************************************************************************* + * PathCreateFromUrlAlloc [SHLWAPI.@] + */ +HRESULT WINAPI PathCreateFromUrlAlloc(LPCWSTR pszUrl, LPWSTR *pszPath, + DWORD dwReserved) +{ + WCHAR pathW[MAX_PATH]; + DWORD size; + HRESULT hr; + + size = MAX_PATH; + hr = PathCreateFromUrlW(pszUrl, pathW, &size, dwReserved); + if (SUCCEEDED(hr)) + { + /* Yes, this is supposed to crash if pszPath is NULL */ + *pszPath = StrDupW(pathW); + } return hr; } diff --git a/reactos/dll/win32/shlwapi/reg.c b/reactos/dll/win32/shlwapi/reg.c index 18d2db0234b..af836f0de5e 100644 --- a/reactos/dll/win32/shlwapi/reg.c +++ b/reactos/dll/win32/shlwapi/reg.c @@ -2232,7 +2232,7 @@ DWORD WINAPI SHCopyKeyA(HKEY hKeySrc, LPCSTR lpszSrcSubKey, HKEY hKeyDst, DWORD TRACE("(hkey=%p,%s,%p08x,%d)\n", hKeySrc, debugstr_a(lpszSrcSubKey), hKeyDst, dwReserved); if (lpszSrcSubKey) - MultiByteToWideChar(0, 0, lpszSrcSubKey, -1, szSubKeyW, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, lpszSrcSubKey, -1, szSubKeyW, MAX_PATH); return SHCopyKeyW(hKeySrc, lpszSrcSubKey ? szSubKeyW : NULL, hKeyDst, dwReserved); } diff --git a/reactos/dll/win32/shlwapi/shlwapi.rc b/reactos/dll/win32/shlwapi/shlwapi.rc index 1d4073ac4a0..f89bf9ae8be 100644 --- a/reactos/dll/win32/shlwapi/shlwapi.rc +++ b/reactos/dll/win32/shlwapi/shlwapi.rc @@ -1,5 +1,5 @@ /* - * Top level resource file for shlwapi + * Resources for shlwapi * * Copyright 2004 Jon Griffiths * diff --git a/reactos/dll/win32/shlwapi/shlwapi.spec b/reactos/dll/win32/shlwapi/shlwapi.spec index ba4e8221ad0..72c2060645b 100644 --- a/reactos/dll/win32/shlwapi/shlwapi.spec +++ b/reactos/dll/win32/shlwapi/shlwapi.spec @@ -566,6 +566,8 @@ @ stdcall HashData (ptr long ptr long) @ stdcall IntlStrEqWorkerA(long str str long) StrIsIntlEqualA @ stdcall IntlStrEqWorkerW(long wstr wstr long) StrIsIntlEqualW +@ stdcall IsCharSpaceA(long) +@ stdcall IsInternetESCEnabled() @ stdcall PathAddBackslashA (str) @ stdcall PathAddBackslashW (wstr) @ stdcall PathAddExtensionA (str str) @@ -586,6 +588,7 @@ @ stdcall PathCompactPathW(long wstr long) @ stdcall PathCreateFromUrlA(str ptr ptr long) @ stdcall PathCreateFromUrlW(wstr ptr ptr long) +@ stdcall PathCreateFromUrlAlloc(wstr ptr long) @ stdcall PathFileExistsA (str) @ stdcall PathFileExistsW (wstr) @ stdcall PathFindExtensionA (str) diff --git a/reactos/dll/win32/shlwapi/string.c b/reactos/dll/win32/shlwapi/string.c index 2ee2aa98b4b..cba16d720fb 100644 --- a/reactos/dll/win32/shlwapi/string.c +++ b/reactos/dll/win32/shlwapi/string.c @@ -1891,7 +1891,7 @@ HRESULT WINAPI SHStrDupA(LPCSTR lpszStr, LPWSTR * lppszDest) if (lpszStr) { - len = MultiByteToWideChar(0, 0, lpszStr, -1, 0, 0) * sizeof(WCHAR); + len = MultiByteToWideChar(CP_ACP, 0, lpszStr, -1, NULL, 0) * sizeof(WCHAR); *lppszDest = CoTaskMemAlloc(len); } else @@ -1899,7 +1899,7 @@ HRESULT WINAPI SHStrDupA(LPCSTR lpszStr, LPWSTR * lppszDest) if (*lppszDest) { - MultiByteToWideChar(0, 0, lpszStr, -1, *lppszDest, len/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpszStr, -1, *lppszDest, len/sizeof(WCHAR)); hRet = S_OK; } else @@ -2828,3 +2828,28 @@ end: HeapFree(GetProcessHeap(), 0, dllname); return hr; } + +BOOL WINAPI IsCharSpaceA(CHAR c) +{ + WORD CharType; + return GetStringTypeA(GetSystemDefaultLCID(), CT_CTYPE1, &c, 1, &CharType) && (CharType & C1_SPACE); +} + +/************************************************************************* + * @ [SHLWAPI.29] + * + * Determine if a Unicode character is a space. + * + * PARAMS + * wc [I] Character to check. + * + * RETURNS + * TRUE, if wc is a space, + * FALSE otherwise. + */ +BOOL WINAPI IsCharSpaceW(WCHAR wc) +{ + WORD CharType; + + return GetStringTypeW(CT_CTYPE1, &wc, 1, &CharType) && (CharType & C1_SPACE); +} diff --git a/reactos/dll/win32/shlwapi/thread.c b/reactos/dll/win32/shlwapi/thread.c index 6006b098e88..6747a51b893 100644 --- a/reactos/dll/win32/shlwapi/thread.c +++ b/reactos/dll/win32/shlwapi/thread.c @@ -534,7 +534,7 @@ HANDLE WINAPI SHGlobalCounterCreateNamedA(LPCSTR lpszName, DWORD iInitial) TRACE("(%s,%d)\n", debugstr_a(lpszName), iInitial); if (lpszName) - MultiByteToWideChar(0, 0, lpszName, -1, szBuff, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, lpszName, -1, szBuff, MAX_PATH); return SHGlobalCounterCreateNamedW(lpszName ? szBuff : NULL, iInitial); } diff --git a/reactos/dll/win32/shlwapi/url.c b/reactos/dll/win32/shlwapi/url.c index a503b4c4af0..6b591560b2a 100644 --- a/reactos/dll/win32/shlwapi/url.c +++ b/reactos/dll/win32/shlwapi/url.c @@ -270,8 +270,8 @@ HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized, ret = UrlCanonicalizeW(url, canonical, pcchCanonicalized, dwFlags); if(ret == S_OK) - WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized, - *pcchCanonicalized+1, 0, 0); + WideCharToMultiByte(CP_ACP, 0, canonical, -1, pszCanonicalized, + *pcchCanonicalized+1, NULL, NULL); HeapFree(GetProcessHeap(), 0, url); HeapFree(GetProcessHeap(), 0, canonical); @@ -631,8 +631,8 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, relative = base + INTERNET_MAX_URL_LENGTH; combined = relative + INTERNET_MAX_URL_LENGTH; - MultiByteToWideChar(0, 0, pszBase, -1, base, INTERNET_MAX_URL_LENGTH); - MultiByteToWideChar(0, 0, pszRelative, -1, relative, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, pszBase, -1, base, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, pszRelative, -1, relative, INTERNET_MAX_URL_LENGTH); len = *pcchCombined; ret = UrlCombineW(base, relative, pszCombined?combined:NULL, &len, dwFlags); @@ -642,14 +642,14 @@ HRESULT WINAPI UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, return ret; } - len2 = WideCharToMultiByte(0, 0, combined, len, 0, 0, 0, 0); + len2 = WideCharToMultiByte(CP_ACP, 0, combined, len, NULL, 0, NULL, NULL); if (len2 > *pcchCombined) { *pcchCombined = len2; HeapFree(GetProcessHeap(), 0, base); return E_POINTER; } - WideCharToMultiByte(0, 0, combined, len+1, pszCombined, (*pcchCombined)+1, - 0, 0); + WideCharToMultiByte(CP_ACP, 0, combined, len+1, pszCombined, (*pcchCombined)+1, + NULL, NULL); *pcchCombined = len2; HeapFree(GetProcessHeap(), 0, base); return S_OK; @@ -1601,7 +1601,7 @@ HRESULT WINAPI UrlHashW(LPCWSTR pszUrl, unsigned char *lpDest, DWORD nDestLen) /* Win32 hashes the data as an ASCII string, presumably so that both A+W * return the same digests for the same URL. */ - WideCharToMultiByte(0, 0, pszUrl, -1, szUrl, MAX_PATH, 0, 0); + WideCharToMultiByte(CP_ACP, 0, pszUrl, -1, szUrl, MAX_PATH, NULL, NULL); HashData((const BYTE*)szUrl, (int)strlen(szUrl), lpDest, nDestLen); return S_OK; } @@ -1670,7 +1670,7 @@ static HRESULT URL_GuessScheme(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut) WCHAR value[MAX_PATH], data[MAX_PATH]; WCHAR Wxx, Wyy; - MultiByteToWideChar(0, 0, + MultiByteToWideChar(CP_ACP, 0, "Software\\Microsoft\\Windows\\CurrentVersion\\URL\\Prefixes", -1, reg_path, MAX_PATH); RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_path, 0, 1, &newkey); @@ -1868,7 +1868,8 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) return FALSE; case URLIS_FILEURL: - return !StrCmpNA("file:", pszUrl, 5); + return (CompareStringA(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, + "file:", 5) == CSTR_EQUAL); case URLIS_DIRECTORY: last = pszUrl + strlen(pszUrl) - 1; @@ -1893,7 +1894,7 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) */ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) { - static const WCHAR stemp[] = { 'f','i','l','e',':',0 }; + static const WCHAR file_colon[] = { 'f','i','l','e',':',0 }; PARSEDURLW base; DWORD res1; LPCWSTR last; @@ -1921,7 +1922,8 @@ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) return FALSE; case URLIS_FILEURL: - return !strncmpW(stemp, pszUrl, 5); + return (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pszUrl, 5, + file_colon, 5) == CSTR_EQUAL); case URLIS_DIRECTORY: last = pszUrl + strlenW(pszUrl) - 1; @@ -2199,7 +2201,7 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); out = in + INTERNET_MAX_URL_LENGTH; - MultiByteToWideChar(0, 0, pszIn, -1, in, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, pszIn, -1, in, INTERNET_MAX_URL_LENGTH); len = INTERNET_MAX_URL_LENGTH; ret = UrlGetPartW(in, out, &len, dwPart, dwFlags); @@ -2209,13 +2211,13 @@ HRESULT WINAPI UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, return ret; } - len2 = WideCharToMultiByte(0, 0, out, len, 0, 0, 0, 0); + len2 = WideCharToMultiByte(CP_ACP, 0, out, len, NULL, 0, NULL, NULL); if (len2 > *pcchOut) { *pcchOut = len2+1; HeapFree(GetProcessHeap(), 0, in); return E_POINTER; } - len2 = WideCharToMultiByte(0, 0, out, len+1, pszOut, *pcchOut, 0, 0); + len2 = WideCharToMultiByte(CP_ACP, 0, out, len+1, pszOut, *pcchOut, NULL, NULL); *pcchOut = len2-1; HeapFree(GetProcessHeap(), 0, in); return ret; @@ -2529,7 +2531,7 @@ HRESULT WINAPI MLBuildResURLA(LPCSTR lpszLibName, HMODULE hMod, DWORD dwFlags, hRet = MLBuildResURLW(lpszLibName ? szLibName : NULL, hMod, dwFlags, lpszRes ? szRes : NULL, lpszDest ? szDest : NULL, dwDestLen); if (SUCCEEDED(hRet) && lpszDest) - WideCharToMultiByte(CP_ACP, 0, szDest, -1, lpszDest, dwDestLen, 0, 0); + WideCharToMultiByte(CP_ACP, 0, szDest, -1, lpszDest, dwDestLen, NULL, NULL); return hRet; } @@ -2623,3 +2625,12 @@ HRESULT WINAPI UrlFixupW(LPCWSTR url, LPWSTR translatedUrl, DWORD maxChars) return S_OK; } + +/************************************************************************* + * IsInternetESCEnabled [SHLWAPI.@] + */ +BOOL WINAPI IsInternetESCEnabled(void) +{ + FIXME(": stub\n"); + return FALSE; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index dcafc50461e..9dbf1015474 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -164,7 +164,7 @@ reactos/dll/win32/shdoclc # Synced to Wine-1.5.19 reactos/dll/win32/shdocvw # Autosync reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shfolder # Autosync -reactos/dll/win32/shlwapi # Synced to Wine-1.5.13 +reactos/dll/win32/shlwapi # Synced to Wine-1.5.26 reactos/dll/win32/slbcsp # Synced to Wine-1.5.19 reactos/dll/win32/snmpapi # Synced to Wine-1.5.19 reactos/dll/win32/softpub # Synced to Wine-1.5.19 From f2c550a04f6100fe8a3cb91854b009c3b2cca205 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 24 Mar 2013 12:36:17 +0000 Subject: [PATCH 70/74] [SHLWAPI_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58601 --- rostests/winetests/shlwapi/assoc.c | 19 ++- rostests/winetests/shlwapi/clist.c | 14 +- rostests/winetests/shlwapi/clsid.c | 25 +-- rostests/winetests/shlwapi/generated.c | 16 +- rostests/winetests/shlwapi/istream.c | 20 ++- rostests/winetests/shlwapi/ordinal.c | 32 ++-- rostests/winetests/shlwapi/path.c | 203 +++++++++++++++++++------ rostests/winetests/shlwapi/shreg.c | 22 +-- rostests/winetests/shlwapi/string.c | 33 ++-- rostests/winetests/shlwapi/testlist.c | 5 +- rostests/winetests/shlwapi/thread.c | 19 ++- rostests/winetests/shlwapi/url.c | 40 ++--- 12 files changed, 300 insertions(+), 148 deletions(-) diff --git a/rostests/winetests/shlwapi/assoc.c b/rostests/winetests/shlwapi/assoc.c index a6f5e2d5e61..36f8b4f3e5a 100644 --- a/rostests/winetests/shlwapi/assoc.c +++ b/rostests/winetests/shlwapi/assoc.c @@ -17,11 +17,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "wine/test.h" -#include "shlwapi.h" -#include "shlguid.h" +//#include + +#include +#include +#include +#include #define expect(expected, got) ok ( expected == got, "Expected %d, got %d\n", expected, got) #define expect_hr(expected, got) ok ( expected == got, "Expected %08x, got %08x\n", expected, got) @@ -78,7 +83,8 @@ static void test_getstring_bad(void) hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotBad, open, NULL, &len); ok(hr == E_FAIL || - hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION), /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ + hr == HRESULT_FROM_WIN32(ERROR_NO_ASSOCIATION) /* Win9x/WinMe/NT4/W2K/Vista/W2K8 */ || + hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), /* Win8 */ "Unexpected result : %08x\n", hr); hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotHtml, invalid, NULL, &len); @@ -133,7 +139,8 @@ static void test_getstring_basic(void) hr = pAssocQueryStringW(0, ASSOCSTR_FRIENDLYAPPNAME, dotHtml, open, NULL, &len); ok(hr == S_FALSE || - hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), /* Win9x/NT4 */ + hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) /* Win9x/NT4 */ || + hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), /* Win8 */ "Unexpected result : %08x\n", hr); if (hr != S_FALSE) { diff --git a/rostests/winetests/shlwapi/clist.c b/rostests/winetests/shlwapi/clist.c index 65d3178bd19..181683643f8 100755 --- a/rostests/winetests/shlwapi/clist.c +++ b/rostests/winetests/shlwapi/clist.c @@ -17,12 +17,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "objbase.h" +//#include + +#include +//#include "windef.h" +//#include "winbase.h" +#include typedef struct tagSHLWAPI_CLIST { diff --git a/rostests/winetests/shlwapi/clsid.c b/rostests/winetests/shlwapi/clsid.c index cf9be96372d..f6067312027 100755 --- a/rostests/winetests/shlwapi/clsid.c +++ b/rostests/winetests/shlwapi/clsid.c @@ -17,17 +17,22 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "wine/test.h" -#include "winbase.h" -#include "winerror.h" -#include "winnls.h" -#include "winuser.h" -#include "initguid.h" -#include "shlguid.h" -#include "shobjidl.h" -#include "olectl.h" +//#include + +#include +//#include "winbase.h" +//#include "winerror.h" +//#include "winnls.h" +//#include "winuser.h" +#include +#include +#include +#include +#include DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); diff --git a/rostests/winetests/shlwapi/generated.c b/rostests/winetests/shlwapi/generated.c index e5e0896af8f..c1382ba3af7 100755 --- a/rostests/winetests/shlwapi/generated.c +++ b/rostests/winetests/shlwapi/generated.c @@ -5,6 +5,10 @@ * Unit tests for data structure packing */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define WINVER 0x0501 #define _WIN32_IE 0x0501 #define _WIN32_WINNT 0x0501 @@ -12,13 +16,13 @@ #define WINE_NOWINSOCK #include -#include "windef.h" -#include "winbase.h" -#include "wtypes.h" -#include "winreg.h" -#include "shlwapi.h" +#include +#include +//#include "wtypes.h" +#include +#include -#include "wine/test.h" +#include /*********************************************************************** * Compatibility macros diff --git a/rostests/winetests/shlwapi/istream.c b/rostests/winetests/shlwapi/istream.c index f525d7c3316..65cc66c194d 100644 --- a/rostests/winetests/shlwapi/istream.c +++ b/rostests/winetests/shlwapi/istream.c @@ -17,16 +17,22 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS -#include -#include +//#include +//#include -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "shlwapi.h" +#include +//#include "windef.h" +//#include "winbase.h" +#include +#include +#include +//#include "shlwapi.h" /* Function pointers for the SHCreateStreamOnFile functions */ diff --git a/rostests/winetests/shlwapi/ordinal.c b/rostests/winetests/shlwapi/ordinal.c index 1229ae2a75f..7b72de35e88 100755 --- a/rostests/winetests/shlwapi/ordinal.c +++ b/rostests/winetests/shlwapi/ordinal.c @@ -17,22 +17,28 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #define COBJMACROS #define CONST_VTABLE -#include "wine/test.h" -#include "winbase.h" -#include "winerror.h" -#include "winuser.h" -#include "ole2.h" -#include "oaidl.h" -#include "ocidl.h" -#include "mlang.h" -#include "shlwapi.h" -#include "docobj.h" -#include "shobjidl.h" -#include "shlobj.h" +#include +//#include "winbase.h" +#include +#include +//#include "winerror.h" +//#include "winuser.h" +#include +//#include "oaidl.h" +//#include "ocidl.h" +//#include "mlang.h" +#include +//#include "docobj.h" +#include +//#include "shlobj.h" /* Function ptrs for ordinal calls */ static HMODULE hShlwapi; diff --git a/rostests/winetests/shlwapi/path.c b/rostests/winetests/shlwapi/path.c index d459570a982..8ef71c98ec4 100755 --- a/rostests/winetests/shlwapi/path.c +++ b/rostests/winetests/shlwapi/path.c @@ -17,21 +17,27 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "shlwapi.h" -#include "wininet.h" +#include +//#include "windef.h" +//#include "winbase.h" +#include +#include +#include +#include static HRESULT (WINAPI *pPathIsValidCharA)(char,DWORD); static HRESULT (WINAPI *pPathIsValidCharW)(WCHAR,DWORD); static LPWSTR (WINAPI *pPathCombineW)(LPWSTR, LPCWSTR, LPCWSTR); static HRESULT (WINAPI *pPathCreateFromUrlA)(LPCSTR, LPSTR, LPDWORD, DWORD); static HRESULT (WINAPI *pPathCreateFromUrlW)(LPCWSTR, LPWSTR, LPDWORD, DWORD); +static HRESULT (WINAPI *pPathCreateFromUrlAlloc)(LPCWSTR, LPWSTR*, DWORD); static BOOL (WINAPI *pPathAppendA)(LPSTR, LPCSTR); /* ################ */ @@ -39,34 +45,88 @@ static BOOL (WINAPI *pPathAppendA)(LPSTR, LPCSTR); static const struct { const char *url; const char *path; - DWORD ret; + DWORD ret, todo; } TEST_PATHFROMURL[] = { - {"file:///c:/foo/ba%5Cr", "c:\\foo\\ba\\r", S_OK}, - {"file:///c:/foo/../ba%5Cr", "c:\\foo\\..\\ba\\r", S_OK}, - {"file:///host/c:/foo/bar", "\\host\\c:\\foo\\bar", S_OK}, - {"file://host/c:/foo/bar", "\\\\hostc:\\foo\\bar", S_OK}, - {"file://host/c:/foo/bar", "\\\\hostc:\\foo\\bar", S_OK}, - {"file:\\\\host\\c:\\foo\\bar", "\\\\hostc:\\foo\\bar", S_OK}, - {"file:\\\\host\\ca\\foo\\bar", "\\\\host\\ca\\foo\\bar", S_OK}, - {"file:\\\\host\\c|\\foo\\bar", "\\\\hostc|\\foo\\bar", S_OK}, - {"file:\\%5Chost\\c:\\foo\\bar", "\\\\host\\c:\\foo\\bar", S_OK}, - {"file:\\\\host\\cx:\\foo\\bar", "\\\\host\\cx:\\foo\\bar", S_OK}, - {"file://c:/foo/bar", "c:\\foo\\bar", S_OK}, - {"file://c:/d:/foo/bar", "c:\\d:\\foo\\bar", S_OK}, - {"file://c|/d|/foo/bar", "c:\\d|\\foo\\bar", S_OK}, - {"file://host/foo/bar", "\\\\host\\foo\\bar", S_OK}, - {"file:/foo/bar", "\\foo\\bar", S_OK}, - {"file:/foo/bar/", "\\foo\\bar\\", S_OK}, - {"file:foo/bar", "foo\\bar", S_OK}, - {"file:c:/foo/bar", "c:\\foo\\bar", S_OK}, - {"file:c|/foo/bar", "c:\\foo\\bar", S_OK}, - {"file:cx|/foo/bar", "cx|\\foo\\bar", S_OK}, - {"file:////c:/foo/bar", "c:\\foo\\bar", S_OK}, -/* {"file:////c:/foo/foo%20bar", "c:\\foo\\foo%20bar", S_OK},*/ + /* 0 leading slash */ + {"file:c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:c|/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:cx|/foo/bar", "cx|\\foo\\bar", S_OK, 0}, + {"file:c:foo/bar", "c:foo\\bar", S_OK, 0}, + {"file:c|foo/bar", "c:foo\\bar", S_OK, 0}, + {"file:c:/foo%20ba%2fr", "c:\\foo ba/r", S_OK, 0}, + {"file:foo%20ba%2fr", "foo ba/r", S_OK, 0}, + {"file:foo/bar/", "foo\\bar\\", S_OK, 0}, - {"c:\\foo\\bar", NULL, E_INVALIDARG}, - {"foo/bar", NULL, E_INVALIDARG}, - {"http://foo/bar", NULL, E_INVALIDARG}, + /* 1 leading (back)slash */ + {"file:/c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:\\c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:/c|/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:/cx|/foo/bar", "\\cx|\\foo\\bar", S_OK, 0}, + {"file:/c:foo/bar", "c:foo\\bar", S_OK, 0}, + {"file:/c|foo/bar", "c:foo\\bar", S_OK, 0}, + {"file:/c:/foo%20ba%2fr", "c:\\foo ba/r", S_OK, 0}, + {"file:/foo%20ba%2fr", "\\foo ba/r", S_OK, 0}, + {"file:/foo/bar/", "\\foo\\bar\\", S_OK, 0}, + + /* 2 leading (back)slashes */ + {"file://c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file://c:/d:/foo/bar", "c:\\d:\\foo\\bar", S_OK, 0}, + {"file://c|/d|/foo/bar", "c:\\d|\\foo\\bar", S_OK, 0}, + {"file://cx|/foo/bar", "\\\\cx|\\foo\\bar", S_OK, 0}, + {"file://c:foo/bar", "c:foo\\bar", S_OK, 0}, + {"file://c|foo/bar", "c:foo\\bar", S_OK, 0}, + {"file://c:/foo%20ba%2fr", "c:\\foo%20ba%2fr", S_OK, 0}, + {"file://c%3a/foo/../bar", "\\\\c:\\foo\\..\\bar", S_OK, 0}, + {"file://c%7c/foo/../bar", "\\\\c|\\foo\\..\\bar", S_OK, 0}, + {"file://foo%20ba%2fr", "\\\\foo ba/r", S_OK, 0}, + {"file://localhost/c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file://localhost/c:/foo%20ba%5Cr", "c:\\foo ba\\r", S_OK, 0}, + {"file://LocalHost/c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:\\\\localhost\\c:\\foo\\bar", "c:\\foo\\bar", S_OK, 0}, + {"file://incomplete", "\\\\incomplete", S_OK, 0}, + + /* 3 leading (back)slashes (omitting hostname) */ + {"file:///c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"File:///c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:///c:/foo%20ba%2fr", "c:\\foo ba/r", S_OK, 0}, + {"file:///foo%20ba%2fr", "\\foo ba/r", S_OK, 0}, + {"file:///foo/bar/", "\\foo\\bar\\", S_OK, 0}, + {"file:///localhost/c:/foo/bar", "\\localhost\\c:\\foo\\bar", S_OK, 0}, + + /* 4 leading (back)slashes */ + {"file:////c:/foo/bar", "c:\\foo\\bar", S_OK, 0}, + {"file:////c:/foo%20ba%2fr", "c:\\foo%20ba%2fr", S_OK, 0}, + {"file:////foo%20ba%2fr", "\\\\foo%20ba%2fr", S_OK, 0}, + + /* 5 and more leading (back)slashes */ + {"file://///c:/foo/bar", "\\\\c:\\foo\\bar", S_OK, 0}, + {"file://///c:/foo%20ba%2fr", "\\\\c:\\foo ba/r", S_OK, 0}, + {"file://///foo%20ba%2fr", "\\\\foo ba/r", S_OK, 0}, + {"file://////c:/foo/bar", "\\\\c:\\foo\\bar", S_OK, 0}, + + /* Leading (back)slashes cannot be escaped */ + {"file:%2f%2flocalhost%2fc:/foo/bar", "//localhost/c:\\foo\\bar", S_OK, 0}, + {"file:%5C%5Clocalhost%5Cc:/foo/bar", "\\\\localhost\\c:\\foo\\bar", S_OK, 0}, + + /* Hostname handling */ + {"file://l%6fcalhost/c:/foo/bar", "\\\\localhostc:\\foo\\bar", S_OK, 0}, + {"file://localhost:80/c:/foo/bar", "\\\\localhost:80c:\\foo\\bar", S_OK, 0}, + {"file://host/c:/foo/bar", "\\\\hostc:\\foo\\bar", S_OK, 0}, + {"file://host//c:/foo/bar", "\\\\host\\\\c:\\foo\\bar", S_OK, 0}, + {"file://host/\\c:/foo/bar", "\\\\host\\\\c:\\foo\\bar", S_OK, 0}, + {"file://host/c:foo/bar", "\\\\hostc:foo\\bar", S_OK, 0}, + {"file://host/foo/bar", "\\\\host\\foo\\bar", S_OK, 0}, + {"file:\\\\host\\c:\\foo\\bar", "\\\\hostc:\\foo\\bar", S_OK, 0}, + {"file:\\\\host\\ca\\foo\\bar", "\\\\host\\ca\\foo\\bar", S_OK, 0}, + {"file:\\\\host\\c|\\foo\\bar", "\\\\hostc|\\foo\\bar", S_OK, 0}, + {"file:\\%5Chost\\c:\\foo\\bar", "\\\\host\\c:\\foo\\bar", S_OK, 0}, + {"file:\\\\host\\cx:\\foo\\bar", "\\\\host\\cx:\\foo\\bar", S_OK, 0}, + {"file:///host/c:/foo/bar", "\\host\\c:\\foo\\bar", S_OK, 0}, + + /* Not file URLs */ + {"c:\\foo\\bar", NULL, E_INVALIDARG, 0}, + {"foo/bar", NULL, E_INVALIDARG, 0}, + {"http://foo/bar", NULL, E_INVALIDARG, 0}, }; @@ -128,7 +188,7 @@ static LPWSTR GetWideString(const char* szString) { LPWSTR wszString = HeapAlloc(GetProcessHeap(), 0, (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); - MultiByteToWideChar(0, 0, szString, -1, wszString, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, szString, -1, wszString, INTERNET_MAX_URL_LENGTH); return wszString; } @@ -203,45 +263,87 @@ static void test_PathCreateFromUrl(void) { size_t i; char ret_path[INTERNET_MAX_URL_LENGTH]; - DWORD len, ret; + DWORD len, len2, ret; WCHAR ret_pathW[INTERNET_MAX_URL_LENGTH]; WCHAR *pathW, *urlW; - static const char url[] = "http://www.winehq.org"; if (!pPathCreateFromUrlA) { win_skip("PathCreateFromUrlA not found\n"); return; } - /* Check ret_path = NULL */ - len = sizeof(url); - ret = pPathCreateFromUrlA(url, NULL, &len, 0); - ok ( ret == E_INVALIDARG, "got 0x%08x expected E_INVALIDARG\n", ret); + /* Won't say how much is needed without a buffer */ + len = 0xdeca; + ret = pPathCreateFromUrlA("file://foo", NULL, &len, 0); + ok(ret == E_INVALIDARG, "got 0x%08x expected E_INVALIDARG\n", ret); + ok(len == 0xdeca, "got %x expected 0xdeca\n", len); + /* Test the decoding itself */ for(i = 0; i < sizeof(TEST_PATHFROMURL) / sizeof(TEST_PATHFROMURL[0]); i++) { len = INTERNET_MAX_URL_LENGTH; ret = pPathCreateFromUrlA(TEST_PATHFROMURL[i].url, ret_path, &len, 0); - ok(ret == TEST_PATHFROMURL[i].ret, "ret %08x from url %s\n", ret, TEST_PATHFROMURL[i].url); - if(TEST_PATHFROMURL[i].path) { - ok(!lstrcmpi(ret_path, TEST_PATHFROMURL[i].path), "got %s expected %s from url %s\n", ret_path, TEST_PATHFROMURL[i].path, TEST_PATHFROMURL[i].url); - ok(len == strlen(ret_path), "ret len %d from url %s\n", len, TEST_PATHFROMURL[i].url); + if (!(TEST_PATHFROMURL[i].todo & 0x1)) + ok(ret == TEST_PATHFROMURL[i].ret, "ret %08x from url %s\n", ret, TEST_PATHFROMURL[i].url); + else todo_wine + ok(ret == TEST_PATHFROMURL[i].ret, "ret %08x from url %s\n", ret, TEST_PATHFROMURL[i].url); + if(SUCCEEDED(ret) && TEST_PATHFROMURL[i].path) { + if(!(TEST_PATHFROMURL[i].todo & 0x2)) { + ok(!lstrcmpi(ret_path, TEST_PATHFROMURL[i].path), "got %s expected %s from url %s\n", ret_path, TEST_PATHFROMURL[i].path, TEST_PATHFROMURL[i].url); + ok(len == strlen(ret_path), "ret len %d from url %s\n", len, TEST_PATHFROMURL[i].url); + } else todo_wine + /* Wrong string, don't bother checking the length */ + ok(!lstrcmpi(ret_path, TEST_PATHFROMURL[i].path), "got %s expected %s from url %s\n", ret_path, TEST_PATHFROMURL[i].path, TEST_PATHFROMURL[i].url); } + if (pPathCreateFromUrlW) { len = INTERNET_MAX_URL_LENGTH; pathW = GetWideString(TEST_PATHFROMURL[i].path); urlW = GetWideString(TEST_PATHFROMURL[i].url); ret = pPathCreateFromUrlW(urlW, ret_pathW, &len, 0); - WideCharToMultiByte(CP_ACP, 0, ret_pathW, -1, ret_path, sizeof(ret_path),0,0); - ok(ret == TEST_PATHFROMURL[i].ret, "ret %08x from url L\"%s\"\n", ret, TEST_PATHFROMURL[i].url); - if(TEST_PATHFROMURL[i].path) { - ok(!lstrcmpiW(ret_pathW, pathW), "got %s expected %s from url L\"%s\"\n", - ret_path, TEST_PATHFROMURL[i].path, TEST_PATHFROMURL[i].url); - ok(len == lstrlenW(ret_pathW), "ret len %d from url L\"%s\"\n", len, TEST_PATHFROMURL[i].url); + WideCharToMultiByte(CP_ACP, 0, ret_pathW, -1, ret_path, sizeof(ret_path),NULL,NULL); + if (!(TEST_PATHFROMURL[i].todo & 0x1)) + ok(ret == TEST_PATHFROMURL[i].ret, "ret %08x from url L\"%s\"\n", ret, TEST_PATHFROMURL[i].url); + else todo_wine + ok(ret == TEST_PATHFROMURL[i].ret, "ret %08x from url L\"%s\"\n", ret, TEST_PATHFROMURL[i].url); + if(SUCCEEDED(ret) && TEST_PATHFROMURL[i].path) { + if(!(TEST_PATHFROMURL[i].todo & 0x2)) { + ok(!lstrcmpiW(ret_pathW, pathW), "got %s expected %s from url L\"%s\"\n", + ret_path, TEST_PATHFROMURL[i].path, TEST_PATHFROMURL[i].url); + ok(len == lstrlenW(ret_pathW), "ret len %d from url L\"%s\"\n", len, TEST_PATHFROMURL[i].url); + } else todo_wine + /* Wrong string, don't bother checking the length */ + ok(!lstrcmpiW(ret_pathW, pathW), "got %s expected %s from url L\"%s\"\n", + ret_path, TEST_PATHFROMURL[i].path, TEST_PATHFROMURL[i].url); } + + if (SUCCEEDED(ret)) + { + /* Check what happens if the buffer is too small */ + len2 = 2; + ret = pPathCreateFromUrlW(urlW, ret_pathW, &len2, 0); + ok(ret == E_POINTER, "ret %08x, expected E_POINTER from url %s\n", ret, TEST_PATHFROMURL[i].url); + if(!(TEST_PATHFROMURL[i].todo & 0x4)) + ok(len2 == len + 1, "got len = %d expected %d from url %s\n", len2, len + 1, TEST_PATHFROMURL[i].url); + else todo_wine + ok(len2 == len + 1, "got len = %d expected %d from url %s\n", len2, len + 1, TEST_PATHFROMURL[i].url); + } + FreeWideString(urlW); FreeWideString(pathW); } } + + if (pPathCreateFromUrlAlloc) + { + static const WCHAR fileW[] = {'f','i','l','e',':','/','/','f','o','o',0}; + static const WCHAR fooW[] = {'\\','\\','f','o','o',0}; + + pathW = NULL; + ret = pPathCreateFromUrlAlloc(fileW, &pathW, 0); + ok(ret == S_OK, "got 0x%08x expected S_OK\n", ret); + ok(lstrcmpiW(pathW, fooW) == 0, "got %s expected %s\n", wine_dbgstr_w(pathW), wine_dbgstr_w(fooW)); + HeapFree(GetProcessHeap(), 0, pathW); + } } @@ -1369,6 +1471,7 @@ START_TEST(path) pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA"); pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW"); + pPathCreateFromUrlAlloc = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlAlloc"); pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW"); pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455); pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456); diff --git a/rostests/winetests/shlwapi/shreg.c b/rostests/winetests/shlwapi/shreg.c index 3634041c01e..c6b55feef5c 100755 --- a/rostests/winetests/shlwapi/shreg.c +++ b/rostests/winetests/shlwapi/shreg.c @@ -17,16 +17,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "winreg.h" -#include "winuser.h" -#include "shlwapi.h" +//#include +//#include + +#include +//#include "windef.h" +//#include "winbase.h" +//#include "winerror.h" +#include +//#include "winuser.h" +#include /* Keys used for testing */ #define REG_TEST_KEY "Software\\Wine\\Test" diff --git a/rostests/winetests/shlwapi/string.c b/rostests/winetests/shlwapi/string.c index aac79f83bd1..619f118fbab 100755 --- a/rostests/winetests/shlwapi/string.c +++ b/rostests/winetests/shlwapi/string.c @@ -17,18 +17,23 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "wine/test.h" -#include "winbase.h" -#include "winerror.h" -#include "winnls.h" +//#include + +#include +//#include "winbase.h" +//#include "winerror.h" +#include +#include #define NO_SHLWAPI_REG #define NO_SHLWAPI_PATH #define NO_SHLWAPI_GDI #define NO_SHLWAPI_STREAM -#include "shlwapi.h" -#include "shtypes.h" +#include +//#include "shtypes.h" #define expect_eq(expr, val, type, fmt) do { \ type ret = expr; \ @@ -411,7 +416,7 @@ static void test_StrCpyW(void) while(result->value) { - MultiByteToWideChar(0,0,result->byte_size_64,-1,szSrc,sizeof(szSrc)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,result->byte_size_64,-1,szSrc,sizeof(szSrc)/sizeof(WCHAR)); lpRes = StrCpyW(szBuff, szSrc); ok(!StrCmpW(szSrc, szBuff) && lpRes == szBuff, "Copied string %s wrong\n", result->byte_size_64); @@ -475,7 +480,7 @@ static void test_StrToIntW(void) while (result->string) { - MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); return_val = StrToIntW(szBuff); ok(return_val == result->str_to_int, "converted '%s' wrong (%d)\n", result->string, return_val); @@ -525,7 +530,7 @@ static void test_StrToIntExW(void) while (result->string) { return_val = -1; - MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); bRet = StrToIntExW(szBuff, 0, &return_val); ok(!bRet || return_val != -1, "No result returned from '%s'\n", result->string); @@ -539,7 +544,7 @@ static void test_StrToIntExW(void) while (result->string) { return_val = -1; - MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); bRet = StrToIntExW(szBuff, STIF_SUPPORT_HEX, &return_val); ok(!bRet || return_val != -1, "No result returned from '%s'\n", result->string); @@ -604,7 +609,7 @@ static void test_StrToInt64ExW(void) while (result->string) { return_val = -1; - MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); bRet = pStrToInt64ExW(szBuff, 0, &return_val); ok(!bRet || return_val != -1, "No result returned from '%s'\n", result->string); @@ -618,7 +623,7 @@ static void test_StrToInt64ExW(void) while (result->string) { return_val = -1; - MultiByteToWideChar(0,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP,0,result->string,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR)); bRet = pStrToInt64ExW(szBuff, STIF_SUPPORT_HEX, &return_val); ok(!bRet || return_val != -1, "No result returned from '%s'\n", result->string); @@ -693,7 +698,7 @@ static void test_StrFormatKBSizeW(void) while(result->value) { pStrFormatKBSizeW(result->value, szBuffW, 256); - WideCharToMultiByte(0,0,szBuffW,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR),0,0); + WideCharToMultiByte(CP_ACP,0,szBuffW,-1,szBuff,sizeof(szBuff)/sizeof(WCHAR),NULL,NULL); ok(!strcmp(result->kb_size, szBuff), "Formatted %x%08x wrong: got %s, expected %s\n", (LONG)(result->value >> 32), (LONG)result->value, szBuff, result->kb_size); diff --git a/rostests/winetests/shlwapi/testlist.c b/rostests/winetests/shlwapi/testlist.c index 4940c49f4c4..3ef2c1de75a 100755 --- a/rostests/winetests/shlwapi/testlist.c +++ b/rostests/winetests/shlwapi/testlist.c @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_clist(void); extern void func_clsid(void); diff --git a/rostests/winetests/shlwapi/thread.c b/rostests/winetests/shlwapi/thread.c index d4a17872361..fc141d3b5ee 100644 --- a/rostests/winetests/shlwapi/thread.c +++ b/rostests/winetests/shlwapi/thread.c @@ -17,19 +17,24 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include #include #define COBJMACROS #define CONST_VTABLE -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "ole2.h" -#include "shlwapi.h" +#include +#include +//#include "winreg.h" +//#include "winerror.h" +#include +//#include "shlwapi.h" -#include "wine/test.h" +#include static HRESULT (WINAPI *pSHCreateThreadRef)(LONG*, IUnknown**); static HRESULT (WINAPI *pSHGetThreadRef)(IUnknown**); diff --git a/rostests/winetests/shlwapi/url.c b/rostests/winetests/shlwapi/url.c index fbc3601e77f..abdf88045a5 100644 --- a/rostests/winetests/shlwapi/url.c +++ b/rostests/winetests/shlwapi/url.c @@ -18,16 +18,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "shlwapi.h" -#include "wininet.h" -#include "intshcut.h" +//#include +//#include + +#include +//#include "windef.h" +//#include "winbase.h" +#include +#include +#include +#include +#include /* ################ */ static HMODULE hShlwapi; @@ -450,7 +455,8 @@ static const struct { { "file://e:/b/c", FALSE, TRUE }, { "http:partial", FALSE, FALSE }, { "mailto://www.winehq.org/test.html", TRUE, FALSE }, - { "file:partial", FALSE, TRUE } + { "file:partial", FALSE, TRUE }, + { "File:partial", FALSE, TRUE }, }; /* ########################### */ @@ -459,7 +465,7 @@ static LPWSTR GetWideString(const char* szString) { LPWSTR wszString = HeapAlloc(GetProcessHeap(), 0, (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR)); - MultiByteToWideChar(0, 0, szString, -1, wszString, INTERNET_MAX_URL_LENGTH); + MultiByteToWideChar(CP_ACP, 0, szString, -1, wszString, INTERNET_MAX_URL_LENGTH); return wszString; } @@ -1062,7 +1068,7 @@ static void test_UrlCanonicalizeW(void) BOOL choped; int pos; - MultiByteToWideChar(CP_ACP, 0, "http://www.winehq.org/X", -1, szUrl, 128); + MultiByteToWideChar(CP_ACP, 0, "http://www.winehq.org/X", -1, szUrl, sizeof(szUrl)/sizeof(szUrl[0])); pos = lstrlenW(szUrl) - 1; szUrl[pos] = i; urllen = INTERNET_MAX_URL_LENGTH; @@ -1219,7 +1225,7 @@ static void test_UrlIs(void) test_UrlIs_null(URLIS_URL); for(i = 0; i < sizeof(TEST_PATH_IS_URL) / sizeof(TEST_PATH_IS_URL[0]); i++) { - MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, 80); + MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, sizeof(wurl)/sizeof(*wurl)); ret = pUrlIsA( TEST_PATH_IS_URL[i].path, URLIS_URL ); ok( ret == TEST_PATH_IS_URL[i].expect, @@ -1234,7 +1240,7 @@ static void test_UrlIs(void) } } for(i = 0; i < sizeof(TEST_URLIS_ATTRIBS) / sizeof(TEST_URLIS_ATTRIBS[0]); i++) { - MultiByteToWideChar(CP_ACP, 0, TEST_URLIS_ATTRIBS[i].url, -1, wurl, 80); + MultiByteToWideChar(CP_ACP, 0, TEST_URLIS_ATTRIBS[i].url, -1, wurl, sizeof(wurl)/sizeof(*wurl)); ret = pUrlIsA( TEST_URLIS_ATTRIBS[i].url, URLIS_OPAQUE); ok( ret == TEST_URLIS_ATTRIBS[i].expectOpaque, @@ -1288,7 +1294,7 @@ static void test_UrlUnescape(void) ok(strcmp(szReturnUrl,TEST_URL_UNESCAPE[i].expect)==0, "Expected \"%s\", but got \"%s\" from \"%s\"\n", TEST_URL_UNESCAPE[i].expect, szReturnUrl, TEST_URL_UNESCAPE[i].url); ZeroMemory(szReturnUrl, sizeof(szReturnUrl)); - /* if we set the bufferpointer to NULL here UrlUnescape fails and string gets not converted */ + /* if we set the buffer pointer to NULL here, UrlUnescape fails and the string is not converted */ res = pUrlUnescapeA(TEST_URL_UNESCAPE[i].url, szReturnUrl, NULL, 0); ok(res == E_INVALIDARG, "UrlUnescapeA returned 0x%x (expected E_INVALIDARG) for \"%s\"\n", @@ -1319,7 +1325,7 @@ static void test_UrlUnescape(void) ok(!strcmp(inplace, expected), "got %s expected %s\n", inplace, expected); ok(dwEscaped == 27, "got %d expected 27\n", dwEscaped); - /* if we set the bufferpointer to NULL, the string apparently still gets converted (Google Lively does this)) */ + /* if we set the buffer pointer to NULL, the string apparently still gets converted (Google Lively does this) */ res = pUrlUnescapeA(another_inplace, NULL, NULL, URL_UNESCAPE_INPLACE); ok(res == S_OK, "UrlUnescapeA returned 0x%x (expected S_OK)\n", res); ok(!strcmp(another_inplace, expected), "got %s expected %s\n", another_inplace, expected); @@ -1330,7 +1336,7 @@ static void test_UrlUnescape(void) ok(res == S_OK, "UrlUnescapeW returned 0x%x (expected S_OK)\n", res); ok(dwEscaped == 50, "got %d expected 50\n", dwEscaped); - /* if we set the bufferpointer to NULL, the string apparently still gets converted (Google Lively does this)) */ + /* if we set the buffer pointer to NULL, the string apparently still gets converted (Google Lively does this) */ res = pUrlUnescapeW(another_inplaceW, NULL, NULL, URL_UNESCAPE_INPLACE); ok(res == S_OK, "UrlUnescapeW returned 0x%x (expected S_OK)\n", res); From 0351bb4f27079ee69b5fd9d40b6b31192f7b6b1f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 24 Mar 2013 13:27:52 +0000 Subject: [PATCH 71/74] [HAL] Link to libgcc, hopefully fixes build for Pierre svn path=/trunk/; revision=58602 --- reactos/hal/halx86/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/hal/halx86/CMakeLists.txt b/reactos/hal/halx86/CMakeLists.txt index c02a53d85df..c4bb719ddde 100644 --- a/reactos/hal/halx86/CMakeLists.txt +++ b/reactos/hal/halx86/CMakeLists.txt @@ -41,6 +41,8 @@ function(add_hal _halname) add_cd_file(TARGET ${_halname} DESTINATION reactos/system32 NO_CAB FOR all) if(MSVC) add_target_link_flags(${_halname} "/ignore:4216 /ignore:4078") + else() + target_link_libraries(${_halname} -lgcc) endif() endfunction() From d7273a7fcccdd31110898a7ddf9a7ecd4d5f60cc Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 24 Mar 2013 16:08:28 +0000 Subject: [PATCH 72/74] * Use PSEH3 for the TestBE runs. svn path=/trunk/; revision=58603 --- reactos/cmake/gcc.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/cmake/gcc.cmake b/reactos/cmake/gcc.cmake index 35ca75ad22b..adee7f7eb6f 100644 --- a/reactos/cmake/gcc.cmake +++ b/reactos/cmake/gcc.cmake @@ -91,6 +91,11 @@ elseif(ARCH STREQUAL "amd64") add_compile_flags("-mpreferred-stack-boundary=4") endif() +# PSEH +if(GCC_VERSION VERSION_GREATER 4.7) + set(USE_PSEH3 1) +endif() + # Other if(ARCH STREQUAL "amd64") add_definitions(-U_X86_ -UWIN32) From 740d266240012bf25c06b33c62f927a52f69df8e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 24 Mar 2013 16:48:09 +0000 Subject: [PATCH 73/74] * Add the PSEH3 related define for the TestBE runs. svn path=/trunk/; revision=58604 --- reactos/cmake/gcc.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/cmake/gcc.cmake b/reactos/cmake/gcc.cmake index adee7f7eb6f..c3d2e0b7cbb 100644 --- a/reactos/cmake/gcc.cmake +++ b/reactos/cmake/gcc.cmake @@ -94,6 +94,7 @@ endif() # PSEH if(GCC_VERSION VERSION_GREATER 4.7) set(USE_PSEH3 1) + add_definitions(-D_USE_PSEH3=1) endif() # Other From 4e62a422f89174583c8c899f31c80de5799c33f4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 24 Mar 2013 17:09:03 +0000 Subject: [PATCH 74/74] [FREELDR] - Set bugcheck data when the image is corrupt - Add 2 more useful debug constants: DEBUG_WARN and DEBUG_ERR - Use COM2 for debug output when _WINKD_ is defined - Fix amd64 boot svn path=/trunk/; revision=58606 --- .../boot/freeldr/freeldr/arch/amd64/winldr.c | 18 ++++++++++-------- reactos/boot/freeldr/freeldr/debug.c | 11 +++++++++++ reactos/boot/freeldr/freeldr/include/mm.h | 5 +++++ reactos/boot/freeldr/freeldr/mm/meminit.c | 16 ++++++++++++++-- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c index 68d8569b189..72a014734da 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c @@ -269,6 +269,7 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) { PKGDTENTRY64 Entry; KDESCRIPTOR GdtDesc; + TRACE("Amd64SetupGdt(GdtBase = %p, TssBase = %p)\n", GdtBase, TssBase); /* Setup KGDT64_NULL */ Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL); @@ -308,20 +309,22 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) /* Set the new Gdt */ __lgdt(&GdtDesc.Limit); - TRACE("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT); - + TRACE("Leave Amd64SetupGdt()\n"); } VOID Amd64SetupIdt(PVOID IdtBase) { KDESCRIPTOR IdtDesc, OldIdt; + ULONG Size; + TRACE("Amd64SetupIdt(IdtBase = %p)\n", IdtBase); /* Get old IDT */ - __sidt(&OldIdt); + __sidt(&OldIdt.Limit); /* Copy the old IDT */ - RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, OldIdt.Limit + 1); + Size = min(OldIdt.Limit + 1, NUM_IDT * sizeof(KIDTENTRY)); + //RtlCopyMemory(IdtBase, (PVOID)OldIdt.Base, Size); /* Setup the new IDT descriptor */ IdtDesc.Base = IdtBase; @@ -329,8 +332,7 @@ Amd64SetupIdt(PVOID IdtBase) /* Set the new IDT */ __lidt(&IdtDesc.Limit); - TRACE("Idtr.Base = %p\n", IdtDesc.Base); - + TRACE("Leave Amd64SetupIdt()\n"); } VOID @@ -354,7 +356,7 @@ WinLdrSetProcessorContext(void) Amd64SetupGdt(GdtIdt, KSEG0_BASE | (TssBasePage << MM_PAGE_SHIFT)); /* Copy old Idt and set idtr */ - Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + 2048)); // HACK! + Amd64SetupIdt((PVOID)((ULONG64)GdtIdt + NUM_GDT * sizeof(KGDTENTRY))); /* LDT is unused */ // __lldt(0); @@ -390,7 +392,7 @@ void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock) TssBasePage = Tss >> MM_PAGE_SHIFT; /* Allocate space for new GDT + IDT */ - BlockSize = NUM_GDT*sizeof(KGDTENTRY) + NUM_IDT*sizeof(KIDTENTRY);//FIXME: Use GDT/IDT limits here? + BlockSize = NUM_GDT * sizeof(KGDTENTRY) + NUM_IDT * sizeof(KIDTENTRY); NumPages = (BlockSize + MM_PAGE_SIZE - 1) >> MM_PAGE_SHIFT; GdtIdt = (PKGDTENTRY)MmAllocateMemoryWithType(NumPages * MM_PAGE_SIZE, LoaderMemoryData); if (GdtIdt == NULL) diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c index 5ac8e10fbd0..e86060c73a2 100644 --- a/reactos/boot/freeldr/freeldr/debug.c +++ b/reactos/boot/freeldr/freeldr/debug.c @@ -24,6 +24,8 @@ #if DBG && !defined(_M_ARM) //#define DEBUG_ALL +//#define DEBUG_WARN +//#define DEBUG_ERR //#define DEBUG_INIFILE //#define DEBUG_REACTOS //#define DEBUG_CUSTOM @@ -49,7 +51,12 @@ ULONG DebugPort = RS232; //ULONG DebugPort = SCREEN; //ULONG DebugPort = BOCHS; //ULONG DebugPort = SCREEN|BOCHS; +#ifdef _WINKD_ +/* COM1 is the WinDbg port */ +ULONG ComPort = COM2; +#else ULONG ComPort = COM1; +#endif //ULONG BaudRate = 19200; ULONG BaudRate = 115200; @@ -59,6 +66,10 @@ VOID DebugInit(VOID) { #if defined (DEBUG_ALL) memset(DbgChannels, MAX_LEVEL, DBG_CHANNELS_COUNT); +#elif defined (DEBUG_WARN) + memset(DbgChannels, WARN_LEVEL|FIXME_LEVEL|ERR_LEVEL, DBG_CHANNELS_COUNT); +#elif defined (DEBUG_ERR) + memset(DbgChannels, ERR_LEVEL, DBG_CHANNELS_COUNT); #else memset(DbgChannels, 0, DBG_CHANNELS_COUNT); #endif diff --git a/reactos/boot/freeldr/freeldr/include/mm.h b/reactos/boot/freeldr/freeldr/include/mm.h index bc7687a71ca..4be199c0fe0 100644 --- a/reactos/boot/freeldr/freeldr/include/mm.h +++ b/reactos/boot/freeldr/freeldr/include/mm.h @@ -23,8 +23,13 @@ extern char __ImageBase; #ifdef __GNUC__ #define FREELDR_SECTION_COUNT 3 #else +#ifdef _M_AMD64 +/* .text and .pdata */ +#define FREELDR_SECTION_COUNT 2 +#else #define FREELDR_SECTION_COUNT 1 #endif +#endif typedef struct _FREELDR_MEMORY_DESCRIPTOR { diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c index b9e8877c872..a36da8b42ca 100644 --- a/reactos/boot/freeldr/freeldr/mm/meminit.c +++ b/reactos/boot/freeldr/freeldr/mm/meminit.c @@ -174,7 +174,7 @@ MmCheckFreeldrImageFile() NtHeaders = RtlImageNtHeader(&__ImageBase); if (!NtHeaders) { - ERR("Coult not get NtHeaders!\n"); + ERR("Could not get NtHeaders!\n"); return FALSE; } @@ -184,8 +184,14 @@ MmCheckFreeldrImageFile() (FileHeader->NumberOfSections != FREELDR_SECTION_COUNT) || (FileHeader->PointerToSymbolTable != 0) || (FileHeader->NumberOfSymbols != 0) || - (FileHeader->SizeOfOptionalHeader != 0xE0)) + (FileHeader->SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER))) { + ERR("FreeLdr FileHeader is invalid.\n"); + BugCheckInfo[0] = FileHeader->Machine; + BugCheckInfo[1] = FileHeader->NumberOfSections; + BugCheckInfo[2] = FileHeader->PointerToSymbolTable; + BugCheckInfo[3] = FileHeader->NumberOfSymbols; + BugCheckInfo[4] = FileHeader->SizeOfOptionalHeader; return FALSE; } @@ -197,6 +203,12 @@ MmCheckFreeldrImageFile() (OptionalHeader->SizeOfImage > MAX_FREELDR_PE_SIZE) || (OptionalHeader->SectionAlignment != OptionalHeader->FileAlignment)) { + ERR("FreeLdr OptionalHeader is invalid.\n"); + BugCheckInfo[0] = 0x80000000 | (OptionalHeader->Subsystem << 16) | OptionalHeader->Magic; + BugCheckInfo[1] = OptionalHeader->ImageBase; + BugCheckInfo[2] = OptionalHeader->SizeOfImage; + BugCheckInfo[3] = OptionalHeader->SectionAlignment; + BugCheckInfo[4] = OptionalHeader->FileAlignment; return FALSE; }